75540fb9566270848323a8cc647ddfe66aace1aa
max
  Fri Apr 13 18:11:29 2012 -0700
reverting previous 3 commits, cannot get it to work and fullfill hirams comments, added comments to explain why
diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index bdfffe2..2c405b8 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -12227,31 +12227,31 @@
 static void pubsAddExtra(struct track* tg, struct linkedFeatures* lf)
 /* add authorYear and title to linkedFeatures->extra */
 {
 char *articleTable = trackDbSettingClosestToHome(tg->tdb, "pubsArticleTable");
 if(isEmpty(articleTable))
     return;
 if (lf->extra != NULL)
     return;
 
 struct sqlConnection *conn = hAllocConn(database);
 struct pubsExtra* extra = pubsMakeExtra(articleTable, conn, lf);
 lf->extra = extra;
 hFreeConn(&conn);
 }
 
-static void pubsBlatLoadItems(struct track *tg)
+static void pubsLoadKeywordYearItems(struct track *tg)
 /* load items that fulfill keyword and year filter */
 {
 struct sqlConnection *conn = hAllocConn(database);
 char *keywords = cartOptionalStringClosestToHome(cart, tg->tdb, FALSE, "pubsKeywords");
 char *yearFilter = cartOptionalStringClosestToHome(cart, tg->tdb, FALSE, "pubsYear");
 char *articleTable = pubsArticleTable(tg);
 
 if(yearFilter == NULL || sameWord(yearFilter, "anytime"))
     yearFilter = NULL;
 
 if(isNotEmpty(keywords))
     keywords = makeMysqlMatchStr(sqlEscapeString(keywords));
 
 if(isEmpty(yearFilter) && isEmpty(keywords))
     {
@@ -12300,30 +12300,32 @@
     }
 hFreeConn(&conn);
 }
 
 #define PUBSFILTERNAME "pubsFilterArticleId"
 
 static void activatePslTrackIfCgi(struct track *tg)
 /* the publications hgc creates links back to the browser with 
  * the cgi param pubsFilterArticleId to show only a single type
  * of feature for the pubsBlatPsl track. 
  * If the parameter was supplied, we save this parameter here
  * into the cart and activate the track.
  */
 {
 char *articleId = cgiOptionalString(PUBSFILTERNAME);
+//if (articleId==NULL) 
+    //articleId = cartOptionalString(cart, PUBSFILTERNAME);
 
 if (articleId!=NULL) 
     {
     cartSetString(cart, PUBSFILTERNAME, articleId);
     tdbSetCartVisibility(tg->tdb, cart, hCarefulTrackOpenVis(database, tg->track));
     tg->visibility=tvPack;
     }
 }
 
 char *pubsItemName(struct track *tg, void *item)
 /* get author/year from extra field */
 {
 struct linkedFeatures *lf = item;
 pubsAddExtra(tg, lf);
 
@@ -12346,31 +12348,34 @@
     pubsAddExtra(tg, lf);
     struct pubsExtra* extra = lf->extra;
     char* mouseOver = NULL;
     if (extra != NULL) 
         mouseOver = extra->mouseOver;
     else
         mouseOver = itemName;
 
     mapBoxHc(hvg, start, end, x, y, width, height, tg->track, mapItemName, mouseOver); 
 }
 }
 
 static void pubsLoadMarkerItem (struct track *tg)
 /* copy item names into extra field */
 {
+//loadSimpleBed(tg);
 loadSimpleBedAsLinkedFeaturesPerBase(tg);
+//tg->items = simpleBedListToLinkedFeatures(tg->items, tg->bedSize, TRUE, FALSE);
+//if (! (hashFindVal(tdb->settingsHash, "pubsMarkerTable")))
 enum trackVisibility vis = tg->visibility;
 if (vis == tvDense || vis == tvSquish) 
     return;
 
 struct linkedFeatures *lf = NULL;
 for (lf = tg->items; lf != NULL; lf = lf->next)
     lf->extra = lf->name;
 }
 
 char *pubsMarkerItemName(struct track *tg, void *item)
 /* retrieve article count from score field and return.*/
 {
 struct linkedFeatures *lf = item;
 char newName[64];
 safef(newName, sizeof(newName), "%d articles", (int) lf->score);
@@ -12389,30 +12394,31 @@
 
 static struct hash* pubsLookupSequences(struct track *tg, struct sqlConnection* conn, char* articleId, bool getSnippet)
 /* create a hash with a mapping annotId -> snippet or annotId -> shortSeq for an articleId*/
 {
     char query[LARGEBUF];
     char *sequenceTable = trackDbRequiredSetting(tg->tdb, "pubsSequenceTable");
     char *selectValSql = NULL;
     if (getSnippet)
         selectValSql = "replace(replace(snippet, \"<B>\", \"\\n>>> \"), \"</B>\", \" <<<\\n\")";
     else
         selectValSql = "concat(substr(sequence,1,4),\"...\",substr(sequence,-4))";
 
     safef(query, sizeof(query), "SELECT annotId, %s  FROM %s WHERE articleId='%s' ", 
         selectValSql, sequenceTable, articleId);
     struct hash *seqIdHash = sqlQuickHash(conn, query);
+    //freeMem(sequenceTable); // XX Why does this crash??
     return seqIdHash;
 }
 
 static char *pubsArticleDispId(struct track *tg, struct sqlConnection *conn, char* articleId)
 /* given an articleId, lookup author and year and create <author><year> label for it */
 {
 char* dispLabel = NULL;
 char *articleTable = pubsArticleTable(tg);
 char query[LARGEBUF];
 safef(query, sizeof(query), "SELECT firstAuthor, year FROM %s WHERE articleId = '%s'", 
     articleTable, articleId);
 struct sqlResult *sr = sqlGetResult(conn, query);
 if (sr!=NULL)
     {
     char **row = NULL;
@@ -12475,31 +12481,31 @@
 }
 
 static void pubsBlatPslMethods(struct track *tg)
 /* a track that shows only the indiv matches for one single article */
 {
 activatePslTrackIfCgi(tg);
 tg->loadItems = pubsPslLoadItems;
 tg->itemName  = pubsItemName;
 tg->mapItem   = pubsMapItem;
 }
 
 static void pubsBlatMethods(struct track *tg)
 /* publication blat tracks are bed12+2 tracks of sequences in text, mapped with BLAT */
 {
 bedMethods(tg);
-tg->loadItems = pubsBlatLoadItems;
+tg->loadItems = pubsLoadKeywordYearItems;
 tg->itemName  = pubsItemName;
 tg->mapItem   = pubsMapItem;
 }
 
 static void pubsMarkerMethods(struct track *tg)
 /* publication marker tracks are bed5 tracks of genome marker occurences like rsXXXX found in text*/
 {
 bedMethods(tg);
 tg->bedSize   = 5;
 tg->loadItems = pubsLoadMarkerItem;
 tg->mapItem   = pubsMarkerMapItem;
 tg->itemName  = pubsMarkerItemName;
 }
 
 void fillInFromType(struct track *track, struct trackDb *tdb)
@@ -12511,32 +12517,32 @@
     return;
 wordCount = chopLine(cloneString(typeLine), words);
 if (wordCount <= 0)
     return;
 type = words[0];
 
 #ifndef GBROWSE
 if (sameWord(type, "bed"))
     {
     complexBedMethods(track, tdb, FALSE, wordCount, words);
     /* bed.h includes genePred.h so should be able to use these trackDb
        settings. */
     if (trackDbSetting(track->tdb, GENEPRED_CLASS_TBL) !=NULL)
         track->itemColor = genePredItemClassColor;
 
-    // FIXME: this is in the wrong function, but needs to stay as long as 
-    // registerTrackHandler does not accept wildcards
+    // FIXME: as long as registerTrackHandler doesn't accept wildcards, 
+    // this probably needs to stay here (it's in the wrong function)
     if (startsWith("pubs", track->track) && stringIn("Marker", track->track))
         pubsMarkerMethods(track);
     if (startsWith("pubs", track->track) && stringIn("Blat", track->track))
         pubsBlatMethods(track);
     }
 /*
 else if (sameWord(type, "bedLogR"))
     {
     wordCount++;
     words[1] = "9";
     complexBedMethods(track, tdb, FALSE, wordCount, words);
     //track->bedSize = 10;
     }
     */
 else if (sameWord(type, "bigBed"))
@@ -12576,30 +12582,34 @@
     track->loadItems = loadGenePred;
     track->colorShades = NULL;
     if (track->itemAttrTbl != NULL)
         track->itemColor = genePredItemAttrColor;
     else if (trackDbSetting(track->tdb, GENEPRED_CLASS_TBL) !=NULL)
         track->itemColor = genePredItemClassColor;
     }
 else if (sameWord(type, "logo"))
     {
     logoMethods(track, tdb, wordCount, words);
     }
 #endif /* GBROWSE */
 else if (sameWord(type, "psl"))
     {
     pslMethods(track, tdb, wordCount, words);
+
+    // FIXME: registerTrackHandler doesn't accept wildcards, so this might be the only
+    // way to get this done in a general way. If this was in loaded with registerTrackHandler
+    // pslMethods would need the tdb object, which we don't have for these callbacks
     if (startsWith("pubs", track->track))
         pubsBlatPslMethods(track);
     }
 else if (sameWord(type, "snake"))
     {
     snakeMethods(track, tdb, wordCount, words);
     }
 else if (sameWord(type, "chain"))
     {
     chainMethods(track, tdb, wordCount, words);
     }
 else if (sameWord(type, "netAlign"))
     {
     netMethods(track);
     }
@@ -13286,31 +13296,30 @@
 registerTrackHandler("encode_tba23EvoFold", rnaSecStrMethods);
 registerTrackHandler("encodeEvoFold", rnaSecStrMethods);
 registerTrackHandler("rnafold", rnaSecStrMethods);
 registerTrackHandler("mcFolds", rnaSecStrMethods);
 registerTrackHandler("rnaEditFolds", rnaSecStrMethods);
 registerTrackHandler("altSpliceFolds", rnaSecStrMethods);
 registerTrackHandler("chimpSimpleDiff", chimpSimpleDiffMethods);
 registerTrackHandler("tfbsCons", tfbsConsMethods);
 registerTrackHandler("tfbsConsSites", tfbsConsSitesMethods);
 registerTrackHandler("pscreen", simpleBedTriangleMethods);
 registerTrackHandler("dless", dlessMethods);
 registerTrackHandler("jaxAllele", jaxAlleleMethods);
 registerTrackHandler("jaxPhenotype", jaxPhenotypeMethods);
 registerTrackHandler("jaxAlleleLift", jaxAlleleMethods);
 registerTrackHandler("jaxPhenotypeLift", jaxPhenotypeMethods);
-
 /* ENCODE related */
 registerTrackHandlerOnFamily("wgEncodeGencode", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeSangerGencode", gencodeGeneMethods);
 // one per gencode version, after V7 when it was substantially changed
 // FIXME: this is hacky, need a way to register based on pattern
 registerTrackHandlerOnFamily("wgEncodeGencodeV3", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV4", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV7", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV8", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV9", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV10", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV11", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV12", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV13", gencodeGeneMethods);
 registerTrackHandlerOnFamily("wgEncodeGencodeV14", gencodeGeneMethods);