7ada5bd6ec329c0f5540573f11ae809ad1c33db0 hiram Thu Mar 20 14:59:29 2014 -0700 allow selection of gene name to display on ensGene tracks refs #12870 diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index 2271ac5..01bd7c2 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -10073,30 +10073,100 @@ void dgvMethods(struct track *tg) /* Database of Genomic Variants. */ { linkedFeaturesMethods(tg); tg->loadItems = loadDgv; } void loadGenePred(struct track *tg) /* Convert gene pred in window to linked feature. */ { tg->items = lfFromGenePredInRange(tg, tg->table, chromName, winStart, winEnd); /* filter items on selected criteria if filter is available */ filterItems(tg, genePredClassFilter, "include"); } +static char *ensGeneName(struct track *tg, void *item) +{ +static char cat[128]; +struct linkedFeatures *lf = item; +if (lf->extra != NULL) + { + safef(cat, sizeof(cat), "%s", (char *)lf->extra); + return cat; + } +else + return lf->name; +} + +static void ensGeneAssignConfiguredName(struct track *tg) +/* Set name on genePred in "extra" field to gene name, accession, or both, + * depending, on UI on all items in track */ +{ +char *geneLabel = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, "label","accession"); +boolean otherGeneName = sameString(geneLabel, "gene"); +boolean useGeneName = sameString(geneLabel, "ensembl"); +boolean useAcc = sameString(geneLabel, "accession"); +struct sqlConnection *conn = NULL; +if (otherGeneName) + conn = hAllocConn(database); + +struct linkedFeatures *lf; +for (lf = tg->items; lf != NULL; lf = lf->next) + { + struct dyString *name = dyStringNew(SMALLDYBUF); + if (otherGeneName) + { + char buf[256]; + char query[256]; + sqlSafef(query, sizeof(query), + "select value from ensemblToGeneName where name = \"%s\"", lf->name); + char *ret = sqlQuickQuery(conn, query, buf, sizeof(buf)); + if (isNotEmpty(ret)) + dyStringAppend(name, ret); + else + dyStringAppend(name, lf->name); + } + else if (useGeneName) + { + if (isNotEmpty((char*)lf->extra)) + dyStringAppend(name, lf->extra); + else + dyStringAppend(name, lf->name); + } + else if (useAcc) + { + dyStringAppend(name, lf->name); + } + else + lf->extra = NULL; + if (dyStringLen(name)) + lf->extra = dyStringCannibalize(&name); + dyStringFree(&name); + } +if (otherGeneName) + hFreeConn(&conn); +} + +static void loadGenePredEnsGene(struct track *tg) +/* Convert gene pred in window to linked feature. */ +{ +loadGenePredWithName2(tg); +ensGeneAssignConfiguredName(tg); +tg->itemName = ensGeneName; +} + void genePredAssignConfiguredName(struct track *tg) /* Set name on genePred in "extra" field to gene name, accession, or both, * depending, on UI on all items in track */ { char *geneLabel = cartUsualStringClosestToHome(cart, tg->tdb, FALSE, "label","gene"); boolean useGeneName = sameString(geneLabel, "gene") || sameString(geneLabel, "name") || sameString(geneLabel, "both"); boolean useAcc = sameString(geneLabel, "accession") || sameString(geneLabel, "both"); struct linkedFeatures *lf; for (lf = tg->items; lf != NULL; lf = lf->next) { struct dyString *name = dyStringNew(SMALLDYBUF); if (useGeneName && !isEmpty((char*)lf->extra)) @@ -12144,30 +12214,33 @@ { wigMethods(track, tdb, wordCount, words); } else if (startsWith("wigMaf", type)) { wigMafMethods(track, tdb, wordCount, words); } #ifndef GBROWSE else if (sameWord(type, "sample")) { sampleMethods(track, tdb, wordCount, words); } else if (sameWord(type, "genePred")) { linkedFeaturesMethods(track); + if (startsWith("ensGene", track->track)) + track->loadItems = loadGenePredEnsGene; + else track->loadItems = loadGenePred; track->colorShades = NULL; if (track->itemAttrTbl != NULL) track->itemColor = genePredItemAttrColor; else if (trackDbSetting(track->tdb, GENEPRED_CLASS_TBL) !=NULL) track->itemColor = genePredItemClassColor; } else if (sameWord(type, "logo")) { logoMethods(track, tdb, wordCount, words); } #endif /* GBROWSE */ else if (sameWord(type, "psl")) { pslMethods(track, tdb, wordCount, words);