142948ffb4e89b89443006817bb49990dd1a7924
hiram
  Tue Nov 15 10:32:50 2016 -0800
allow a halSnake track to declare database alias names refs #13553

diff --git src/hg/hgTracks/snakeTrack.c src/hg/hgTracks/snakeTrack.c
index 70405da..3d8c00a 100644
--- src/hg/hgTracks/snakeTrack.c
+++ src/hg/hgTracks/snakeTrack.c
@@ -1195,62 +1195,74 @@
 
 struct trixSearchResult *tsList = trixSearch(trix, trixWordCount, trixWords, tsmExact);
 if (tsList)
    name = tsList->itemId;  // FOUND
 return name;
 }
 
 void halSnakeLoadItems(struct track *tg)
 // load up a snake from a HAL file.   This code is called in threads
 // so *no* use of globals please. All but full snakes are read into a single
 // linked feature.
 {
 unsigned showSnpWidth = cartOrTdbInt(cart, tg->tdb, 
     SNAKE_SHOW_SNP_WIDTH, SNAKE_DEFAULT_SHOW_SNP_WIDTH);
 
-char * chromAlias = NULL;
+struct hash *dbAliasHash = NULL;  // create later when needed
+char * dbAliasList = trackDbSetting(tg->tdb, "dbAliasList");
+if (dbAliasList)
+    dbAliasHash = hashFromString(dbAliasList);
+
+char * chromAlias = NULL;	// create later when needed
 char * chromAliasFile = trackDbSetting(tg->tdb, "searchTrix");
 if (chromAliasFile)
    chromAlias = doChromIxSearch(chromAliasFile, chromName);
 
 char *aliasName = chromName;
 if (chromAlias)
    {
        if (differentWord(chromAlias, aliasName))
           aliasName = chromAlias;
    }
 
 // if we have a network error we want to put out a message about it
 struct errCatch *errCatch = errCatchNew();
 if (errCatchStart(errCatch))
     {
     char *fileName = trackDbSetting(tg->tdb, "bigDataUrl");
     char *otherSpecies = trackDbSetting(tg->tdb, "otherSpecies");
     char *errString;
     int handle = halOpenLOD(fileName, &errString);
     if (handle < 0)
 	warn("HAL open error: %s\n", errString);
     boolean isPackOrFull = (tg->visibility == tvFull) || 
 	(tg->visibility == tvPack);
     hal_dup_type_t dupMode =  (isPackOrFull) ? HAL_QUERY_AND_TARGET_DUPS :
 	HAL_QUERY_DUPS;
     hal_seqmode_type_t needSeq = isPackOrFull && (winBaseCount < showSnpWidth) ? HAL_LOD0_SEQUENCE : HAL_NO_SEQUENCE;
     int mapBackAdjacencies = (tg->visibility == tvFull);
     char codeVarName[1024];
     safef(codeVarName, sizeof codeVarName, "%s.coalescent", tg->tdb->track);
     char *coalescent = cartOptionalString(cart, codeVarName);
-    struct hal_block_results_t *head = halGetBlocksInTargetRange(handle, otherSpecies, trackHubSkipHubName(database), aliasName, winStart, winEnd, 0, needSeq, dupMode,mapBackAdjacencies, coalescent, &errString);
+    char *otherDbName = trackHubSkipHubName(database);
+    if (dbAliasHash)
+       {
+       struct hashEl* alias = hashLookup(dbAliasHash, otherDbName);
+       if (alias)
+          otherDbName = cloneString((char *)alias->val);
+       }
+    struct hal_block_results_t *head = halGetBlocksInTargetRange(handle, otherSpecies, otherDbName, aliasName, winStart, winEnd, 0, needSeq, dupMode,mapBackAdjacencies, coalescent, &errString);
 
     // did we get any blocks from HAL
     if (head == NULL)
 	{
 	warn("HAL get blocks error: %s\n", errString);
 	errCatchEnd(errCatch);
 	return;
 	}
     struct hal_block_t* cur = head->mappedBlocks;
     struct linkedFeatures *lf = NULL;
     struct hash *qChromHash = newHash(5);
     struct linkedFeatures *lfList = NULL;
     char buffer[4096];
 
 #ifdef NOTNOW