0952cf02dd761d0eae415da7af3914c2b88852af fanhsu Thu Jul 21 14:11:05 2011 -0700 Added functions for COSMIC and updated functions for OMIM. diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c index 6dd87f2..6fe09b4 100644 --- src/hg/hgTracks/simpleTracks.c +++ src/hg/hgTracks/simpleTracks.c @@ -10842,71 +10842,78 @@ if (isNotEmpty(ret)) dyStringAppend(dy, ret); safef(query,sizeof(query), "select distinct description from omimPhenotype, omimGene2 where name='%s' and name=cast(omimId as char) order by description", name); char *disorders = collapseRowsFromQuery(query, "; ", 20); if (isNotEmpty(disorders)) { dyStringAppend(dy, "; disorder(s): "); dyStringAppend(dy, disorders); } hFreeConn(&conn); return(dy->string); } +// old name to be changed later +#define omimPhenotypeClassColName "phenotypeClass" +// new name to be used later +//#define omimPhenotypeClassColName "omimPhenoMapKey" + boolean isOmimOtherClass(char *omimId) /* check if this omimId belongs to the "Others" phenotype class */ /* NOTE: The definition of Others class is kind of tricky. The Other class is defined as: 1. does not have class 1 or 2 or 3, or 4; some may have class '-1'. 2. for an entry of omimId that the omimPhenotype table does not even have a row with omimId */ { boolean result; char answer[255]; struct sqlConnection *conn = hAllocConn(database); char query[256]; safef(query,sizeof(query), - "select phenotypeClass from omimPhenotype where omimId =%s and (phenotypeClass=1 or phenotypeClass=2 or phenotypeClass=3 or phenotypeClass=4)", omimId); + "select %s from omimPhenotype where omimId =%s and (%s=1 or %s=2 or %s=3 or %s=4)", + omimPhenotypeClassColName, omimId, omimPhenotypeClassColName, omimPhenotypeClassColName, omimPhenotypeClassColName, + omimPhenotypeClassColName); char *ret = sqlQuickQuery(conn, query, answer, sizeof(answer)); if (ret == NULL) { result = TRUE; } else { result = FALSE; } hFreeConn(&conn); return(result); } int hasOmimPhenotypeClass(char *omimId, int targetClass) /* Look up phenotypeClass for omimId, for filtering items. Don't free result! */ { int result; char answer[255]; struct sqlConnection *conn = hAllocConn(database); char query[256]; safef(query,sizeof(query), - "select phenotypeClass from omimPhenotype where omimId =%s and phenotypeClass=%d", omimId, - targetClass); + "select %s from omimPhenotype where omimId =%s and %s=%d", omimPhenotypeClassColName,omimId,omimPhenotypeClassColName,targetClass); + char *ret = sqlQuickQuery(conn, query, answer, sizeof(answer)); if (ret == NULL) { if (targetClass == -1) { result = -1; } else { result = 0; } } else result = targetClass; @@ -11040,31 +11047,33 @@ lightest.r = (1*normal->r + 2*255) / 3; lightest.g = (1*normal->g + 2*255) / 3; lightest.b = (1*normal->b + 2*255) / 3; struct sqlConnection *conn = hAllocConn(database); class1Clr = hvGfxFindColorIx(hvg, lightest.r, lightest.g, lightest.b); class2Clr = hvGfxFindColorIx(hvg, lighter.r, lighter.g, lighter.b); class3Clr = hvGfxFindColorIx(hvg, normal->r, normal->g, normal->b); class4Clr = hvGfxFindColorIx(hvg, 105,50,155); classOtherClr = hvGfxFindColorIx(hvg, 190, 190, 190); // light gray safef(query, sizeof(query), - "select omimId, phenotypeClass from omimPhenotype where omimId=%s order by phenotypeClass desc", el->name); + "select omimId, %s from omimPhenotype where omimId=%s order by %s desc", + omimPhenotypeClassColName, el->name, omimPhenotypeClassColName); + sr = sqlMustGetResult(conn, query); row = sqlNextRow(sr); hFreeConn(&conn); if (row == NULL) { // set to gray if this entry does not have any disorder info sqlFreeResult(&sr); return classOtherClr; } else { omimId = row[0]; phenClass = row[1]; @@ -11144,43 +11153,143 @@ { omimId = strdup(el->name); if (omimId != NULL) { dyStringAppend(name, omimId); } labelStarted = TRUE; } if (useGeneSymbol) { if (labelStarted) dyStringAppendC(name, '/'); else labelStarted = TRUE; - // get gene symbol(s) from omimGeneMap table. - // Note: some entries are not in omimGeneMap and/or does not have gene symbol(s) + // get appoved gene symbol from omim2gene table first, if not available then get it from omimGeneMap table. char query[256]; + safef(query, sizeof(query), "select approvedGeneSymbol from omim2gene where omimId = %s", el->name); + geneSymbol = sqlQuickString(conn, query); + if (geneSymbol && differentString(geneSymbol, "-")) + dyStringAppend(name, geneSymbol); + else + { + char *chp; safef(query, sizeof(query), "select geneSymbol from omimGeneMap where omimId = %s", el->name); geneSymbol = sqlQuickString(conn, query); if (geneSymbol && differentString(geneSymbol, "0")) + { + // pick the first one, if multiple gene symbols exist + chp = strstr(geneSymbol, ","); + if (chp != NULL) *chp = '\0'; dyStringAppend(name, geneSymbol); } + } + } hFreeConn(&conn); return(name->string); } +static char *cosmicTissueList(char *name) +/* Return list of tumor tissues associated with a COSMIC entry. Do not free result! */ +{ +static struct dyString *dy = NULL; +struct sqlConnection *conn = hAllocConn(database); + +if (dy == NULL) + dy = dyStringNew(0); +dyStringClear(dy); + +char query[256]; +safef(query,sizeof(query), + "select concat(gene_name,' ',mut_syntax_aa) from cosmicRaw where cosmic_mutation_id ='%s'", name); +char buf[256]; +char *ret = sqlQuickQuery(conn, query, buf, sizeof(buf)); + +if (isNotEmpty(ret)) + dyStringAppend(dy, ret); + +safef(query, sizeof(query), + "select sum(mutated_samples) from cosmicRaw where cosmic_mutation_id='%s'", + name); +ret = sqlQuickQuery(conn, query, buf, sizeof(buf)); +if (isNotEmpty(ret)) + { + dyStringAppend(dy, " "); + dyStringAppend(dy, ret); + } + +safef(query, sizeof(query), + "select sum(examined_samples) from cosmicRaw where cosmic_mutation_id='%s'", + name); +ret = sqlQuickQuery(conn, query, buf, sizeof(buf)); + { + dyStringAppend(dy, "/"); + dyStringAppend(dy, ret); + } + +safef(query, sizeof(query), + "select sum(mutated_samples)*100/sum(examined_samples) from cosmicRaw where cosmic_mutation_id='%s'", + name); +ret = sqlQuickQuery(conn, query, buf, sizeof(buf)); + +char *chp = strstr(ret, "."); + +if (isNotEmpty(ret)) + { + // cut off digits after .xxx + if ((chp != NULL) && (strlen(chp) > 3)) + { + chp++; + chp++; + chp++; + chp++; + *chp = '\0'; + } + dyStringAppend(dy, " ("); + dyStringAppend(dy, ret); + dyStringAppend(dy, "\%)"); + } + +safef(query,sizeof(query), + "select tumour_site from cosmicRaw where cosmic_mutation_id ='%s' order by tumour_site", name); +char *disorders = collapseRowsFromQuery(query, ",", 4); +if (isNotEmpty(disorders)) + { + dyStringAppend(dy, " "); + dyStringAppend(dy, disorders); + } +hFreeConn(&conn); +return(dy->string); +} + +static void cosmicLoad(struct track *tg) +/* Load COSMIC items, storing long label from cosmicTissueList */ +{ +bedPlusLabelLoad(tg, cosmicTissueList); +} + +void cosmicMethods (struct track *tg) +/* Methods for COSMIC track. */ +{ +tg->loadItems = cosmicLoad; +tg->drawItemAt = bedPlusLabelDrawAt; +tg->mapItem = bedPlusLabelMapItem; +tg->nextPrevExon = simpleBedNextPrevEdge; +} + void omimGene2Methods (struct track *tg) /* Methods for version 2 of OMIM Genes track. */ { tg->loadItems = omimGene2Load; tg->itemColor = omimGene2Color; tg->itemName = omimGene2Name; tg->itemNameColor = omimGene2Color; tg->drawItemAt = bedPlusLabelDrawAt; tg->mapItem = bedPlusLabelMapItem; tg->nextPrevExon = simpleBedNextPrevEdge; } static char *omimAvSnpAaReplacement(char *name) /* Return replacement string associated with a OMIM AV (Allelic Variant) entry */ { @@ -11276,31 +11385,31 @@ lighter.b = (6*normal->b + 4*255) / 10; lightest.r = (1*normal->r + 2*255) / 3; lightest.g = (1*normal->g + 2*255) / 3; lightest.b = (1*normal->b + 2*255) / 3; class1Clr = hvGfxFindColorIx(hvg, lightest.r, lightest.g, lightest.b); class2Clr = hvGfxFindColorIx(hvg, lighter.r, lighter.g, lighter.b); class3Clr = hvGfxFindColorIx(hvg, normal->r, normal->g, normal->b); class4Clr = hvGfxFindColorIx(hvg, 105,50,155); classOtherClr = hvGfxFindColorIx(hvg, 190, 190, 190); // light gray struct sqlConnection *conn = hAllocConn(database); safef(query, sizeof(query), - "select omimId, phenotypeClass from omimPhenotype where omimId=%s", el->name); + "select omimId, %s from omimPhenotype where omimId=%s", omimPhenotypeClassColName, el->name); sr = sqlMustGetResult(conn, query); row = sqlNextRow(sr); hFreeConn(&conn); if (row == NULL) { // set to gray if this entry does not have any disorder info sqlFreeResult(&sr); return classOtherClr; } else { omimId = row[0]; phenClass = row[1]; @@ -12813,30 +12922,31 @@ transMapRegisterTrackHandlers(); retroRegisterTrackHandlers(); registerTrackHandler("retroposons", dbRIPMethods); registerTrackHandlerOnFamily("kiddEichlerDisc", kiddEichlerMethods); registerTrackHandlerOnFamily("kiddEichlerValid", kiddEichlerMethods); registerTrackHandler("dgv", dgvMethods); registerTrackHandlerOnFamily("hapmapSnps", hapmapMethods); registerTrackHandlerOnFamily("hapmapSnpsPhaseII", hapmapMethods); registerTrackHandlerOnFamily("omicia", omiciaMethods); registerTrackHandler("omimGene", omimGeneMethods); registerTrackHandler("omimGene2", omimGene2Methods); registerTrackHandler("omimAvSnp", omimAvSnpMethods); registerTrackHandler("omimLocation", omimLocationMethods); registerTrackHandler("omimComposite", omimGene2Methods); +registerTrackHandler("cosmic", cosmicMethods); registerTrackHandler("rest", restMethods); #endif /* GBROWSE */ } void createHgFindMatchHash() /* Read from the cart the string assocated with matches and put the matching items into a hash for highlighting later. */ { char *matchLine = NULL; struct slName *nameList = NULL, *name = NULL; matchLine = cartOptionalString(cart, "hgFind.matches"); if(matchLine == NULL) return; nameList = slNameListFromString(matchLine,','); hgFindMatches = newHash(5);