b622d147b7dbac52dbf3ba26928cd18e02d42bd8
braney
Sat Feb 26 12:34:37 2022 -0800
add support for using a bigBed as the chromAlias file
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index f2f15d3..c4ea42a 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -4658,31 +4658,31 @@
/* Support setting to suppress display of empty subtracks.
* If multiBed is available, return hash with subtrack names as keys
*/
char *multiBedFile = NULL;
char *subtrackIdFile = NULL;
if (!compositeHideEmptySubtracks(cart, track->tdb, &multiBedFile, &subtrackIdFile))
return NULL;
if (!multiBedFile)
return NULL;
// load multiBed items in window
// TODO: filters here ?
// TODO: protect against temporary network error ? */
struct lm *lm = lmInit(0);
-struct bbiFile *bbi = bigBedFileOpenAlias(multiBedFile, chromAliasChromToAliasHash(database));
+struct bbiFile *bbi = bigBedFileOpenAlias(multiBedFile, chromAliasFindAliases);
struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chromName, winStart, winEnd, 0, lm);
char *row[bbi->fieldCount];
char startBuf[16], endBuf[16];
struct hash *nonEmptySubtracksHash = hashNew(0);
for (bb = bbList; bb != NULL; bb = bb->next)
{
bigBedIntervalToRow(bb, chromName, startBuf, endBuf, row, ArraySize(row));
// TODO: do this in bed3Sources.c
char *idList = row[4];
struct slName *ids = slNameListFromComma(idList);
struct slName *id = NULL;
for (id = ids; id != NULL; id = id->next)
hashStore(nonEmptySubtracksHash, id->name);
// TODO: free some stuff ?
}
@@ -10104,75 +10104,66 @@
printf("Total: %d", count);
cgiTableFieldEnd();
cgiTableFieldStartAlignRight();
printLongWithCommas(stdout, total);
puts(" ");
cgiTableFieldEnd();
if (hasAlias)
{
cgiSimpleTableFieldStart();
puts(" ");
cgiTableFieldEnd();
}
cgiTableRowEnd();
}
-static char *chrAliases(struct hash *aliasHash, char *sequenceName)
+static char *chrAliases(struct slName *names, char *sequenceName)
/* lookup the sequenceName in the aliasHash and return csv string
* of alias names
*/
{
-if (NULL == aliasHash)
+if (NULL == names)
return NULL;
struct dyString *returned = dyStringNew(512);
-struct hashEl *hel = hashLookup(aliasHash, sequenceName);
-if (hel)
- {
- dyStringPrintf(returned, "%s", ((struct chromAlias *)hel->val)->alias);
- hel = hashLookupNext(hel);
- while (hel != NULL)
- {
- dyStringPrintf(returned, ", %s",((struct chromAlias *)hel->val)->alias);
- hel = hashLookupNext(hel);
- }
- }
+dyStringPrintf(returned, "%s", names->name);
+for(names = names->next; names; names = names->next)
+ dyStringPrintf(returned, ", %s",names->name);
return dyStringCannibalize(&returned);
}
void chromInfoRowsChromExt(char *sortType)
/* Make table rows of chromosomal chromInfo name & size, sorted by name. */
{
struct slName *chromList = hAllChromNames(database);
struct slName *chromPtr = NULL;
long long total = 0;
boolean hasAlias = hTableExists(database, "chromAlias");
-struct hash *aliasHash = chromAliasMakeReverseLookupTable(database);
/* key is database sequence name, value is an alias name, can be multiple
* entries for the same sequence name. NULL if no chromAlias available
*/
if (sameString(sortType,"default"))
slSort(&chromList, chrSlNameCmp);
else if (sameString(sortType,"withAltRandom"))
slSort(&chromList, chrSlNameCmpWithAltRandom);
else
errAbort("unknown sort type in chromInfoRowsChromExt: %s", sortType);
for (chromPtr = chromList; chromPtr != NULL; chromPtr = chromPtr->next)
{
unsigned size = hChromSize(database, chromPtr->name);
- char *aliasNames = chrAliases(aliasHash, chromPtr->name);
+ char *aliasNames = chrAliases(chromAliasFindAliases(chromPtr->name), chromPtr->name);
cgiSimpleTableRowStart();
cgiSimpleTableFieldStart();
htmlPrintf("%s",
hgTracksName(), cartSessionVarName(), cartSessionId(cart),
chromPtr->name, chromPtr->name);
cgiTableFieldEnd();
cgiTableFieldStartAlignRight();
printLongWithCommas(stdout, size);
puts(" ");
cgiTableFieldEnd();
if (hasAlias)
{
cgiSimpleTableFieldStart();
if (aliasNames)
htmlPrintf("%s", aliasNames);
@@ -10190,54 +10181,50 @@
void chromInfoRowsChrom()
/* Make table rows of chromosomal chromInfo name & size, sorted by name. */
{
chromInfoRowsChromExt("default");
}
static int chromInfoCmpSize(const void *va, const void *vb)
/* Compare to sort based on chrom size */
{
const struct chromInfo *a = *((struct chromInfo **)va);
const struct chromInfo *b = *((struct chromInfo **)vb);
return b->size - a->size;
}
-void chromInfoRowsNonChromTrackHub(int limit)
+void chromInfoRowsNonChromTrackHub(boolean hasAlias, int limit)
/* Make table rows of non-chromosomal chromInfo name & size */
/* leaks chromInfo list */
{
struct chromInfo *chromInfo = trackHubAllChromInfo(database);
slSort(&chromInfo, chromInfoCmpSize);
int seqCount = slCount(chromInfo);
-struct hash *aliasHash = chromAliasMakeReverseLookupTable(database);
-boolean hasAlias = FALSE;
-if (aliasHash)
- hasAlias = TRUE;
long long total = 0;
char msg1[512], msg2[512];
boolean truncating;
int lineCount = 0;
truncating = (limit > 0) && (seqCount > limit);
for( ;lineCount < seqCount && (chromInfo != NULL); ++lineCount, chromInfo = chromInfo->next)
{
unsigned size = chromInfo->size;
if (lineCount < limit)
{
- char *aliasNames = chrAliases(aliasHash, chromInfo->chrom);
+ char *aliasNames = chrAliases(chromAliasFindAliases(chromInfo->chrom), chromInfo->chrom);
cgiSimpleTableRowStart();
cgiSimpleTableFieldStart();
htmlPrintf("%s",
hgTracksName(), cartSessionVarName(), cartSessionId(cart),
chromInfo->chrom,chromInfo->chrom);
cgiTableFieldEnd();
cgiTableFieldStartAlignRight();
printLongWithCommas(stdout, size);
puts(" ");
cgiTableFieldEnd();
if (hasAlias)
{
cgiSimpleTableFieldStart();
if (aliasNames)
htmlPrintf("%s", aliasNames);
@@ -10276,42 +10263,40 @@
cgiSimpleTableFieldStart();
puts(msg2);
cgiTableFieldEnd();
cgiTableRowEnd();
cgiSimpleTableRowStart();
cgiSimpleTableFieldStart();
printLongWithCommas(stdout, scafCount);
cgiTableFieldEnd();
cgiSimpleTableFieldStart();
printLongWithCommas(stdout, total);
cgiTableFieldEnd();
cgiTableRowEnd();
}
}
-void chromInfoRowsNonChrom(int limit)
+void chromInfoRowsNonChrom(boolean hasAlias, int limit)
/* Make table rows of non-chromosomal chromInfo name & size, sorted by size. */
{
if (trackHubDatabase(database))
{
- chromInfoRowsNonChromTrackHub(limit);
+ chromInfoRowsNonChromTrackHub(hasAlias, limit);
return;
}
struct sqlConnection *conn = hAllocConn(database);
-boolean hasAlias = hTableExists(database, "chromAlias");
-struct hash *aliasHash = chromAliasMakeReverseLookupTable(database);
/* key is database sequence name, value is an alias name, can be multiple
* entries for the same sequence name. NULL if no chromAlias available
*/
struct sqlResult *sr = NULL;
char **row = NULL;
long long total = 0;
char query[512];
char msg1[512], msg2[512];
int seqCount = 0;
boolean truncating;
seqCount = sqlQuickNum(conn, NOSQLINJ "select count(*) from chromInfo");
truncating = (limit > 0) && (seqCount > limit);
if (!truncating)
@@ -10321,31 +10306,31 @@
else
{
sqlSafef(query, sizeof(query), "select chrom,size from chromInfo order by size desc limit %d", limit);
sr = sqlGetResult(conn, query);
}
while ((row = sqlNextRow(sr)) != NULL)
{
unsigned size = sqlUnsigned(row[1]);
cgiSimpleTableRowStart();
cgiSimpleTableFieldStart();
htmlPrintf("%s",
hgTracksName(), cartSessionVarName(), cartSessionId(cart),
row[0], row[0]);
- char *aliasNames = chrAliases(aliasHash, row[0]);
+ char *aliasNames = chrAliases(chromAliasFindAliases(row[0]), row[0]);
cgiTableFieldEnd();
cgiTableFieldStartAlignRight();
printLongWithCommas(stdout, size);
puts(" ");
cgiTableFieldEnd();
if (hasAlias)
{
cgiSimpleTableFieldStart();
if (aliasNames)
htmlPrintf("%s", aliasNames);
else
htmlPrintf(" ");
cgiTableFieldEnd();
}
cgiTableRowEnd();
@@ -10504,36 +10489,36 @@
cgiSimpleTableFieldStart();
puts("alias sequence names ");
cgiTableFieldEnd();
}
else if (hasAlias)
{
cgiSimpleTableFieldStart();
puts("alias sequence names ");
cgiTableFieldEnd();
}
cgiTableRowEnd();
if (sameString(database,"hg38"))
chromInfoRowsChromExt("withAltRandom");
else if (trackHubDatabase(database))
- chromInfoRowsNonChrom(1000);
+ chromInfoRowsNonChrom(hasAlias, 1000);
else if ((startsWith("chr", defaultChrom) || startsWith("Group", defaultChrom)) &&
hChromCount(database) < 100)
chromInfoRowsChrom();
else
- chromInfoRowsNonChrom(1000);
+ chromInfoRowsNonChrom(hasAlias, 1000);
chromSizesDownloadRow(hasAlias, aliasFile, chromSizesFile);
hTableEnd();
cgiDown(0.9);
hgPositionsHelpHtml(organism, database);
puts("");
dyStringFree(&title);
webEndSectionTables();
} /* void chromInfoPage() */
void resetVars()
/* Reset vars except for position and database. */
{
static char *except[] = {"db", "position", NULL};
@@ -10745,31 +10730,35 @@
char *debugTmp = NULL;
/* Uncomment this to see parameters for debugging. */
/* struct dyString *state = NULL; */
/* Initialize layout and database. */
if (measureTiming)
measureTime("Get cart of %d for user:%s session:%s", theCart->hash->elCount,
theCart->userId, theCart->sessionId);
/* #if 1 this to see parameters for debugging. */
/* Be careful though, it breaks if custom track
* is more than 4k */
#if 0
printf("State: %s\n", cgiUrlString()->string);
#endif
getDbAndGenome(cart, &database, &organism, oldVars);
+if (measureTiming)
+ measureTime("before chromAliasSetup");
chromAliasSetup(database);
+if (measureTiming)
+ measureTime("after chromAliasSetup");
genomeIsRna = !isHubTrack(database) && hgPdbOk(database);
initGenbankTableNames(database);
protDbName = hPdbFromGdb(database);
debugTmp = cartUsualString(cart, "hgDebug", "off");
if(sameString(debugTmp, "on"))
hgDebug = TRUE;
else
hgDebug = FALSE;
int timeout = cartUsualInt(cart, "udcTimeout", 300);
if (udcCacheTimeout() < timeout)
udcSetCacheTimeout(timeout);