c13ed07bb8cf97ee53a45a91da18910edbc525d9
braney
  Fri May 13 13:46:20 2022 -0700
support chromAuthority with bigBed chromAlias files

diff --git src/hg/lib/chromAlias.c src/hg/lib/chromAlias.c
index 98f56e0..5cf7c0d 100644
--- src/hg/lib/chromAlias.c
+++ src/hg/lib/chromAlias.c
@@ -216,31 +216,31 @@
 }
 
 static void readFieldedTable(struct lineFile *lf)
 /* Use the fieldedTable library to read in fully populated chromAlias.txt file. */
 {
 struct fieldedTable *aliasTable = fieldedTableAttach(lf, NULL, 0); 
 chromAliasGlobals.fieldCount = aliasTable->fieldCount;
 chromAliasGlobals.fields = aliasTable->fields;
 
 struct fieldedRow *row;
 for(row = aliasTable->rowList; row; row = row->next)
     {
     char *native = row->row[0];
 
     unsigned field;
-    for(field=1; field< aliasTable->fieldCount; field++)
+    for(field=0; field < aliasTable->fieldCount; field++)
         {
         char *alias = row->row[field];
         char *source = aliasTable->fields[field];
 
         struct chromAlias *chromAlias;
         AllocVar(chromAlias);
         chromAlias->chrom = native;
         chromAlias->alias = alias;
         chromAlias->source = source;
         hashAdd(chromAliasGlobals.chromToAliasHash, native, chromAlias);
         hashAdd(chromAliasGlobals.aliasToChromHash, alias, chromAlias);
         }
     }
 }
 
@@ -249,30 +249,38 @@
 {
 // not supported at the moment
 /*
 char buffer[4096];
 safef(buffer, sizeof buffer, "/gbdb/%s/chromAlias.bb", database);
 if (fileExists(buffer))
     return cloneString(buffer);
     */
 return NULL;
 }
 
 static void chromAliasSetupBb(char *database, char *bbFile)
 /* Look for a chromAlias bigBed file and open it. */
 {
 chromAliasGlobals.bbi = bigBedFileOpen(bbFile);
+struct slName *fieldNames = bbFieldNames(chromAliasGlobals.bbi);
+chromAliasGlobals.fieldCount = slCount(fieldNames) - chromAliasGlobals.bbi->definedFieldCount;
+AllocArray(chromAliasGlobals.fields, chromAliasGlobals.fieldCount);
+int ii;
+for(ii=0; ii < chromAliasGlobals.bbi->definedFieldCount; ii++, fieldNames = fieldNames->next)
+    ;
+for(ii=0; ii < chromAliasGlobals.fieldCount; ii++, fieldNames = fieldNames->next)
+    chromAliasGlobals.fields[ii] = fieldNames->name;
 chromAliasGlobals.bptList = bbiAliasOpenExtra(chromAliasGlobals.bbi);
 chromAliasGlobals.lm = lmInit(0);
 }
 
 static void chromAliasSetupHub(char *database)
 /* Look for a chromAlias text table and load the hashes with its contents. */
 {
 char *aliasBbFile = trackHubAliasBbFile(database);
 if (aliasBbFile != NULL)
     {
     chromAliasSetupBb(database, aliasBbFile);
     return;
     }
 char *aliasFile = trackHubAliasFile(database);
 if (aliasFile == NULL)
@@ -440,42 +448,42 @@
 return aliases;
 }
 
 char *chromAliasFindSingleAlias(char *seqName, char *authority)
 /* Find the aliases for a given seqName from a given authority. */
 {
 if (authority == NULL)
     return cloneString(seqName);
 
 
 struct slName *aliases = chromAliasFindAliases(seqName);
 
 if (aliases == NULL)
     return cloneString(seqName);
 
-unsigned fieldNum = 1;
+unsigned fieldNum = 0;
 for(; fieldNum < chromAliasGlobals.fieldCount; fieldNum++)
     {
     if (sameString(authority, chromAliasGlobals.fields[fieldNum]))
         break;
     }
 
 if (fieldNum >= chromAliasGlobals.fieldCount)
     return cloneString(seqName);
 
 
-unsigned count = 1;
+unsigned count = 0;
 for(; aliases && count < fieldNum; count++,aliases = aliases->next)
     ;
 if (!isEmpty(aliases->name))
     return cloneString(aliases->name);
 
 return cloneString(seqName);
 }
 
 char *chromAliasGetDisplayChrom(char *db, struct cart *cart, char *seqName)
 /* Return the sequence name to display based on the database and cart. */
 {
 if (trackHubDatabase(db))
     {
     struct trackHubGenome *genome = trackHubGetGenome(db);