fb5dd6895e55739175ff3bd28373c91af375e5d7
braney
  Wed Jul 16 15:53:03 2014 -0700
impose sorting on orderKey in trackHub assemblies
diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index f123b0d..c0c9b0a 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -196,32 +196,32 @@
 	if ((clade != NULL) && differentString(clade, trackHub->name))
 	    continue;
 
 	struct trackHubGenome *hubGenome = trackHub->genomeList;
 	for(; hubGenome; hubGenome = hubGenome->next)
 	    {
 	    if (hubGenome->twoBitPath != NULL)
 		{
 		db = makeDbDbFromAssemblyGenome(hubGenome);
 		slAddHead(&dbList, db);
 		}
 	    }
 	}
     }
 
-slSort(&dbList, hDbDbCmpOrderKey);
 slReverse(&dbList);
+slSort(&dbList, hDbDbCmpOrderKey);
 return dbList;
 }
 
 struct slName *trackHubAllChromNames(char *database)
 /* Return a list of all the chrom names in this assembly hub database. */
 /* Free with slFreeList. */
 {
 struct trackHubGenome *genome = trackHubGetGenome(database);
 if (genome == NULL)
     return NULL;
 
 struct slName *chromList = twoBitSeqNames(genome->twoBitPath);
 
 return chromList;
 }
@@ -422,30 +422,41 @@
     hashAdd(hubAssemblyHash, genome->name, genome);
 }
 
 static char *addHubName(char *base, char *hubName)
 {
 if (base == NULL)
     return NULL;
 
 char buffer[4096];
 
 safef(buffer, sizeof(buffer), "%s_%s", hubName, base);
 
 return cloneString(buffer);
 }
 
+static int genomeOrderKeyCmp(const void *va, const void *vb)
+/* Compare to sort based on order key */
+{
+const struct trackHubGenome *a = *((struct trackHubGenome **)va);
+const struct trackHubGenome *b = *((struct trackHubGenome **)vb);
+
+if (b->orderKey > a->orderKey) return -1;
+else if (b->orderKey < a->orderKey) return 1;
+else return 0;
+}
+
 static struct trackHubGenome *trackHubGenomeReadRa(char *url, struct trackHub *hub)
 /* Read in a genome.ra format url and return it as a list of trackHubGenomes. 
  * Also add it to hash, which is keyed by genome. */
 {
 struct lineFile *lf = udcWrapShortLineFile(url, NULL, 64*1024*1024);
 struct trackHubGenome *list = NULL, *el;
 struct hash *hash = hub->genomeHash;
 
 struct hash *ra;
 while ((ra = raNextRecord(lf)) != NULL)
     {
     char *twoBitPath = hashFindVal(ra, "twoBitPath");
     char *genome;
     if (twoBitPath != NULL)
 	genome = addHubName(hashFindVal(ra, "genome"), hub->name);
@@ -455,30 +466,34 @@
 	hub->defaultDb = genome;
     if (genome == NULL)
         badGenomeStanza(lf);
     if (hashLookup(hash, genome) != NULL)
         errAbort("Duplicate genome %s in stanza ending line %d of %s",
 		genome, lf->lineIx, lf->fileName);
     char *trackDb = hashFindVal(ra, "trackDb");
     if (trackDb == NULL)
         badGenomeStanza(lf);
     AllocVar(el);
     el->name = cloneString(genome);
     el->trackDbFile = trackHubRelativeUrl(url, trackDb);
     el->trackHub = hub;
     hashAdd(hash, el->name, el);
     slAddHead(&list, el);
+    char *orderKey = hashFindVal(ra, "orderKey");
+    if (orderKey != NULL)
+	el->orderKey = sqlUnsigned(orderKey);
+
     char *groups = hashFindVal(ra, "groups");
     if (twoBitPath != NULL)
 	{
 	//printf("reading genome %s twoBitPath %s\n", genome, el->twoBitPath);
 	el->description  = hashFindVal(ra, "description");
 	char *organism = hashFindVal(ra, "organism");
 	if (organism == NULL)
 	    errAbort("must have 'organism' set in assembly hub in stanza ending line %d of %s",
 		     lf->lineIx, lf->fileName);
 	el->organism  = addHubName(organism, hub->name);
 	hashReplace(ra, "organism", el->organism);
 	el->defaultPos  = hashFindVal(ra, "defaultPos");
 	if (el->defaultPos == NULL)
 	    errAbort("must have 'defaultPos' set in assembly hub in stanza ending line %d of %s",
 		     lf->lineIx, lf->fileName);
@@ -486,30 +501,31 @@
 
 	char *htmlPath = hashFindVal(ra, "htmlPath");
 	if (htmlPath != NULL)
 	    hashReplace(ra, "htmlPath",trackHubRelativeUrl(url, htmlPath));
 	if (groups != NULL)
 	    el->groups = trackHubRelativeUrl(url, groups);
 	addAssembly(genome, el, hub);
 	}
     el->settingsHash = ra;
     hashAdd(ra, "hubName", hub->shortLabel);
     }
 
 /* Clean up and go home. */
 lineFileClose(&lf);
 slReverse(&list);
+slSort(&list, genomeOrderKeyCmp);
 return list;
 }
 
 char *trackHubSetting(struct trackHub *hub, char *name)
 /* Return setting if it exists, otherwise NULL. */
 {
 return hashFindVal(hub->settings, name);
 }
 
 char *trackHubRequiredSetting(struct trackHub *hub, char *name)
 /* Return named setting.  Abort with error message if not found. */
 {
 char *val = trackHubSetting(hub, name);
 if (val == NULL)
     errAbort("Missing required setting '%s' from %s", name, hub->url);