00d6b45fd33ab330efcf6d6b88b0d6e9a7880281
kent
  Thu Oct 28 14:54:35 2010 -0700
Redoing dataHub using new trackHub library routines.  Still pretty embryonic, but once again is displaying a couple of tracks for me, this time ones that are genuinely remote. Code is activated by having a 'tracksHub' variable in the cart, which currently is only possible by hacking with cartDump.
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 6b68dc9..23d5ac7 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -27,30 +27,31 @@
 #include "hgFind.h"
 #include "hgTracks.h"
 #include "trashDir.h"
 #include "grp.h"
 #include "versionInfo.h"
 #include "web.h"
 #include "cds.h"
 #include "cutterTrack.h"
 #include "wikiTrack.h"
 #include "ctgPos.h"
 #include "bed.h"
 #include "bigBed.h"
 #include "bigWig.h"
 #include "bedCart.h"
 #include "customTrack.h"
+#include "trackHub.h"
 #include "cytoBand.h"
 #include "ensFace.h"
 #include "liftOver.h"
 #include "pcrResult.h"
 #include "wikiLink.h"
 #include "jsHelper.h"
 #include "mafTrack.h"
 #include "hgConfig.h"
 #include "encode.h"
 #include "agpFrag.h"
 #include "imageV2.h"
 #include "suggest.h"
 #include "searchTracks.h"
 
 static char const rcsid[] = "$Id: doMiddle.c,v 1.1651 2010/06/11 17:53:06 larrym Exp $";
@@ -3311,71 +3312,83 @@
 	    {
 	    if (wordCount != 3)
 		errAbort("Expecting 3 words in pix line");
 	    trackLayoutSetPicWidth(&tl, words[2]);
 	    }
 	}
     }
 for (ct = ctList; ct != NULL; ct = ct->next)
     {
     hasCustomTracks = TRUE;
     tg = newCustomTrack(ct);
     slAddHead(pTrackList, tg);
     }
 }
 
-void addTracksFromDataHub(char *hubUrl, struct track **pTrackList)
+void addTracksFromTrackHub(char *hubName, char *hubUrl, struct track **pTrackList)
 /* Load up stuff from data hub and append to list. The hubUrl points to
  * a trackDb.ra format file.  */
 {
 /* Squirrel away hub directory for later. */
 char hubDir[PATH_LEN];
 splitPath(hubUrl, hubDir, NULL, NULL);
 
 /* Load trackDb.ra file and make it into proper trackDb tree */
-struct trackDb *tdb, *tdbList = trackDbFromRa(hubUrl);
-uglyf("Got %d tracks from %s<BR>\n", slCount(tdbList), hubUrl);
+struct trackHub *hub = trackHubOpen(hubUrl);
+struct trackHubGenome *hubGenome = trackHubFindGenome(hub, database);
+if (hubGenome != NULL)
+    {
+    struct trackDb *tdb, *tdbList = trackHubTracksForGenome(hub, hubGenome);
+    uglyf("Got %d tracks from %s@%s<BR>\n", slCount(tdbList), hubName, hubUrl);
+
+    trackDbAddTableField(tdbList);
+    trackHubAddNamePrefix(hubName, tdbList);
+    uglyf("added hub_%s_ prefix to track list<BR>\n", hubName);
+
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
      {
      trackDbFieldsFromSettings(tdb);
      trackDbPolish(tdb);
      }
-trackDbAddTableField(tdbList);
+    uglyf("polished tracks<BR>\n");
+
 trackDbLinkUpGenerations(tdbList);
 uglyf("About to addTdbListToTrackList<BR>\n");
 uglyOne = TRUE;
 addTdbListToTrackList(tdbList, NULL, pTrackList);
 uglyf("Used to crash by here<BR>\n");
+#ifdef SOON
+#endif /* SOON */
 }
 
-void loadDataHubs(struct track **pTrackList)
+}
+
+void loadTrackHubs(struct track **pTrackList)
 /* Load up stuff from data hubs and append to list. */
 {
-char *dataHubs = cloneString(cartUsualString(cart, "dataHubs", NULL));
-uglyf("<BR>dataHubs=%s\n<BR>\n", dataHubs);
-if (dataHubs == NULL)
+char *trackHubs = cloneString(cartUsualString(cart, "trackHubs", NULL));
+uglyf("trackHubs=%s\n<BR>\n", trackHubs);
+if (trackHubs == NULL)
     return;
-int hubCount = chopByWhite(dataHubs, NULL, 10);
-char *hubArrays[hubCount];
-chopByWhite(dataHubs, hubArrays, hubCount);
-uglyf("hubCount=%d, hubArrays[0]=%s\n<BR>\n", hubCount, hubArrays[0]);
-int i;
-for (i = 0; i<hubCount; ++i)
+struct slPair *hubList = slPairFromString(trackHubs);
+uglyf("Got %d hubs<BR>\n", slCount(hubList));
+struct slPair *hub;
+for (hub = hubList; hub != NULL; hub = hub->next)
     {
-    addTracksFromDataHub(hubArrays[i], pTrackList);
+    addTracksFromTrackHub(hub->name, hub->val, pTrackList);
     }
-uglyf("addTracksFromDataHub loop done<BR>\n");
+slPairFreeValsAndList(&hubList);
 }
 
 boolean restrictionEnzymesOk()
 /* Check to see if it's OK to do restriction enzymes. */
 {
 return (hTableExists("hgFixed", "cutters") &&
     hTableExists("hgFixed", "rebaseRefs") &&
     hTableExists("hgFixed", "rebaseCompanies"));
 }
 
 void fr2ScaffoldEnsemblLink(char *archive)
 /* print out Ensembl link to appropriate scaffold there */
 {
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr = NULL;
@@ -4031,31 +4044,31 @@
 struct track *track, *trackList = NULL;
 registerTrackHandlers();
 /* Load regular tracks, blatted tracks, and custom tracks.
  * Best to load custom last. */
 loadFromTrackDb(&trackList);
 if (pcrResultParseCart(database, cart, NULL, NULL, NULL))
     slSafeAddHead(&trackList, pcrResultTg());
 if (userSeqString != NULL) slSafeAddHead(&trackList, userPslTg());
 slSafeAddHead(&trackList, oligoMatchTg());
 if (restrictionEnzymesOk())
     {
     slSafeAddHead(&trackList, cuttersTg());
     }
 if (wikiTrackEnabled(database, NULL))
     addWikiTrack(&trackList);
-loadDataHubs(&trackList);
+loadTrackHubs(&trackList);
 #ifdef SOON
 #endif /* SOON */
 loadCustomTracks(&trackList);
 groupTracks(&trackList, pGroupList, vis);
 setSearchedTrackToPackOrFull(trackList);
 if (cgiOptionalString( "hideTracks"))
     changeTrackVis(groupList, NULL, tvHide);
 
 /* Get visibility values if any from ui. */
 for (track = trackList; track != NULL; track = track->next)
     {
     char *s = cartOptionalString(cart, track->track);
     if (cgiOptionalString("hideTracks"))
 	{
 	s = cgiOptionalString(track->track);