36650b61875fa047f2c9ebc3657d1a9d10ec77e6 braney Fri Nov 12 14:42:17 2021 -0800 Give developers a way to map sequence names to labels in maf display refs #28495 diff --git src/hg/hgTracks/wigMafTrack.c src/hg/hgTracks/wigMafTrack.c index b76564c..e822295 100644 --- src/hg/hgTracks/wigMafTrack.c +++ src/hg/hgTracks/wigMafTrack.c @@ -78,50 +78,59 @@ { struct wigMafItem *mi = (struct wigMafItem *)item; if (sameString(mi->name, GAP_ITEM_LABEL)) return getOrangeColor(); return (((struct wigMafItem *)item)->group % 2 ? tg->ixAltColor : tg->ixColor); } static struct mafAli *wigMafLoadInRegion(struct sqlConnection *conn, struct sqlConnection *conn2, char *table, char *chrom, int start, int end, char *file) /* Load mafs from region */ { return mafLoadInRegion2(conn, conn2, table, chrom, start, end, file); } -static struct wigMafItem *newMafItem(char *s, int g, boolean lowerFirstChar) +static struct wigMafItem *newMafItem(char *s, int g, boolean lowerFirstChar, struct hash *labelHash) /* Allocate and initialize a maf item. Species param can be a db or name */ { struct wigMafItem *mi; char *val; AllocVar(mi); +if (labelHash) + { + mi->db = cloneString(hubConnectSkipHubPrefix(s)); + mi->name = hashFindVal(labelHash, mi->db); + } + +if (mi->name == NULL) + { if ((val = hGenome(s)) != NULL) { /* it's a database name */ mi->db = cloneString(hubConnectSkipHubPrefix(s)); mi->name = val; } else { mi->db = cloneString(s); mi->name = cloneString(s); } + } mi->name = hgDirForOrg(mi->name); -if (lowerFirstChar) +if (lowerFirstChar && labelHash == NULL ) *mi->name = tolower(*mi->name); mi->height = tl.fontHeight; mi->group = g; return mi; } struct wigMafItem *getSpeciesFromMaf(struct track *track, int height) { struct wigMafItem *mi = NULL, *miList = NULL; struct hash *hash = newHash(8); /* keyed by database. */ struct mafPriv *mp = getMafPriv(track); struct mafAli *maf; char buf[64]; char *otherOrganism; @@ -160,41 +169,42 @@ char *species[MAX_SP_SIZE]; char *groups[20]; char *defaultOff[MAX_SP_SIZE]; char sGroup[MAX_SP_SIZE]; int group; int i; int speciesCt = 0, groupCt = 1; int speciesOffCt = 0; struct hash *speciesOffHash = newHash(0); char *speciesUseFile = trackDbSetting(track->tdb, SPECIES_USE_FILE); /* either speciesOrder or speciesGroup is specified in trackDb */ char *speciesOrder = trackDbSetting(track->tdb, SPECIES_ORDER_VAR); char *speciesGroup = trackDbSetting(track->tdb, SPECIES_GROUP_VAR); char *speciesOff = trackDbSetting(track->tdb, SPECIES_DEFAULT_OFF_VAR); +struct hash *labelHash = mafGetLabelHash(track->tdb); bool lowerFirstChar = TRUE; char *firstCase; firstCase = trackDbSetting(track->tdb, ITEM_FIRST_CHAR_CASE); if (firstCase != NULL) { if (sameWord(firstCase, "noChange")) lowerFirstChar = FALSE; } -if (speciesOrder == NULL && speciesGroup == NULL && speciesUseFile == NULL) +if (speciesOrder == NULL && speciesGroup == NULL && speciesUseFile == NULL && labelHash == NULL) return getSpeciesFromMaf(track, height); if (speciesGroup) groupCt = chopLine(cloneString(speciesGroup), groups); if (speciesUseFile) { if ((speciesGroup != NULL) || (speciesOrder != NULL)) errAbort("Can't specify speciesUseFile and speciesGroup or speciesOrder"); speciesOrder = cartGetOrderFromFile(database, cart, speciesUseFile); speciesOff = NULL; } /* keep track of species configured off initially for track */ if (speciesOff) @@ -210,31 +220,31 @@ for (group = 0; group < groupCt; group++) { if (groupCt != 1 || !speciesOrder) { safef(sGroup, sizeof sGroup, "%s%s", SPECIES_GROUP_PREFIX, groups[group]); speciesOrder = trackDbRequiredSetting(track->tdb, sGroup); } speciesCt = chopLine(cloneString(speciesOrder), species); for (i = 0; i < speciesCt; i++) { boolean defaultOn = (hashLookup(speciesOffHash, species[i]) == NULL); if (cartUsualBooleanClosestToHome(cart, track->tdb, FALSE, species[i],defaultOn)) { - mi = newMafItem(species[i], group, lowerFirstChar); + mi = newMafItem(species[i], group, lowerFirstChar, labelHash); mi->height = height; slAddHead(&miList, mi); } } } return miList; } static struct wigMafItem *scoreItem(int scoreHeight, char *label) /* Make up item that will show the score */ { struct wigMafItem *mi; AllocVar(mi); @@ -328,57 +338,59 @@ static struct wigMafItem *loadBaseByBaseItems(struct track *track) /* Make up base-by-base track items. */ { struct wigMafItem *miList = NULL, *speciesList = NULL, *mi; int scoreHeight = 0; bool lowerFirstChar = TRUE; char *firstCase; firstCase = trackDbSetting(track->tdb, ITEM_FIRST_CHAR_CASE); if (firstCase != NULL) { if (sameWord(firstCase, "noChange")) lowerFirstChar = FALSE; } +struct hash *labelHash = mafGetLabelHash(track->tdb); + loadMafsToTrack(track); /* NOTE: we are building up the item list backwards */ /* Add items for conservation wiggles */ struct track *wigTrack = track->subtracks; if (wigTrack) { enum trackVisibility wigVis = (wigTrack->limitedVis == tvDense ? tvDense : tvFull); while (wigTrack != NULL) { scoreHeight = wigTotalHeight(wigTrack, wigVis); mi = scoreItem(scoreHeight, wigTrack->shortLabel); slAddHead(&miList, mi); wigTrack = wigTrack->next; } } /* Make up item that will show gaps in this organism. */ AllocVar(mi); mi->name = GAP_ITEM_LABEL; mi->height = tl.fontHeight; slAddHead(&miList, mi); /* Make up item for this organism. */ -mi = newMafItem(database, 0, lowerFirstChar); +mi = newMafItem(database, 0, lowerFirstChar, labelHash); slAddHead(&miList, mi); speciesList = newSpeciesItems(track, tl.fontHeight); /* Make items for other species */ miList = slCat(speciesList, miList); slReverse(&miList); return miList; } static char *summarySetting(struct track *track) /* Return the setting for the MAF summary table * or NULL if none set */ { return trackDbSetting(track->tdb, SUMMARY_VAR); }