f088470a9391f341dd21dfaa61228dd8d777eaf8 braney Thu Feb 18 17:47:48 2016 -0800 fix up the links on the ncbiRefSeq hgc page diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c index dd65dba..b1f8fb2 100644 --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@ -5676,31 +5676,31 @@ struct psl *psl = pslList; for (psl = pslList; psl != NULL; psl = psl->next) { if ( pslTrimToTargetRange(psl, winStart, winEnd) != NULL && !startsWith("xeno", tableName) && !(startsWith("user", tableName) && pslIsProtein(psl)) && psl->tStart == startFirst && sameString(psl->tName, seqName) ) { char otherString[512]; safef(otherString, sizeof(otherString), "%d&aliTable=%s", psl->tStart, tableName); - hgcAnchorSomewhere("htcCdnaAliInWindow", cgiEncode(psl->qName), + hgcAnchorSomewhere("htcCdnaAliInWindow", cgiEncode(itemIn), otherString, psl->tName); printf("<BR>View details of parts of alignment within browser window</A>.<BR>\n"); } } } struct psl *getAlignments(struct sqlConnection *conn, char *table, char *acc) /* get the list of alignments for the specified acc */ { struct sqlResult *sr = NULL; char **row; struct psl *psl, *pslList = NULL; boolean hasBin; char splitTable[64]; char query[256]; @@ -7019,30 +7019,45 @@ struct bed *bed = bedLoadN(bedRow, 12); if (sameString(bed->name, acc)) { bb->next = NULL; break; } } psl = pslFromBigPsl(seqName, bb, hChromSize(database, seqName), &seq, &cdsString); genbankParseCds(cdsString, &cdsStart, &cdsEnd); struct dnaSeq *rnaSeq = newDnaSeq(seq, strlen(seq), acc); showSomeAlignment(psl, rnaSeq, gftRna, 0, rnaSeq->size, NULL, cdsStart, cdsEnd); } +static struct dnaSeq *getBaseColorSequence(char *itemName, char *table) +/* Grab sequence using the sequence and extFile table names out of BASE_COLOR_USE_SEQUENCE. */ +{ +struct trackDb *tdb = hashMustFindVal(trackHash, table); +char *spec = trackDbRequiredSetting(tdb, BASE_COLOR_USE_SEQUENCE); +char *specCopy = cloneString(spec); + +// value is: extFile seqTbl extFileTbl +char *words[3]; +int nwords = chopByWhite(specCopy, words, ArraySize(words)); +if ((nwords != ArraySize(words)) || !sameString(words[0], "extFile")) + errAbort("invalid %s track setting: %s", BASE_COLOR_USE_SEQUENCE, spec); +return hDnaSeqGet(database, itemName, words[1], words[2]); +} + void htcCdnaAli(char *acc) /* Show alignment for accession. */ { char query[256]; char table[64]; char accTmp[64]; struct sqlConnection *conn; struct sqlResult *sr; char **row; struct psl *psl; struct dnaSeq *rnaSeq; char *aliTable; int start; unsigned int cdsStart = 0, cdsEnd = 0; boolean hasBin; @@ -7076,30 +7091,34 @@ if (sameString("mrnaBlastz", aliTable) || sameString("pseudoMrna", aliTable)) { struct sqlConnection *conn = hAllocConn(database); unsigned retId = 0; safef(accTmp, sizeof accTmp, "bz-%s", acc); if (hRnaSeqAndIdx(accTmp, &rnaSeq, &retId, conn) == -1) rnaSeq = hRnaSeq(database, acc); hFreeConn(&conn); } else if (sameString("HInvGeneMrna", aliTable)) { /* get RNA accession for the gene id in the alignment */ sqlSafef(query, sizeof query, "select mrnaAcc from HInv where geneId='%s'", acc); rnaSeq = hRnaSeq(database, sqlQuickString(conn, query)); } +else if (sameString("ncbiRefSeqPsl", aliTable)) + { + rnaSeq = getBaseColorSequence(acc, aliTable); + } else { char *cdnaTable = NULL; struct trackDb *tdb = hashFindVal(trackHash, aliTable); if (tdb != NULL) cdnaTable = trackDbSetting(tdb, "cdnaTable"); if (isNotEmpty(cdnaTable) && hTableExists(database, cdnaTable)) rnaSeq = hGenBankGetMrna(database, acc, cdnaTable); else rnaSeq = hRnaSeq(database, acc); } if (startsWith("xeno", aliTable)) showSomeAlignment(psl, rnaSeq, gftDnaX, 0, rnaSeq->size, NULL, cdsStart, cdsEnd); else @@ -7187,44 +7206,33 @@ rnaSeq = oSeq; } else { /* Look up alignments in database */ hFindSplitTable(database, seqName, aliTable, table, &hasBin); sqlSafef(query, sizeof(query), "select * from %s where qName = '%s' and tName=\"%s\" and tStart=%d", table, acc, seqName, start); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) == NULL) errAbort("Couldn't find alignment for %s at %d", acc, start); wholePsl = pslLoad(row+hasBin); sqlFreeResult(&sr); - if (startsWith("ucscRetroAli", aliTable) || startsWith("retroMrnaAli", aliTable) || sameString("pseudoMrna", aliTable) || startsWith("altSeqLiftOverPsl", aliTable)) + if (startsWith("ucscRetroAli", aliTable) || startsWith("retroMrnaAli", aliTable) || sameString("pseudoMrna", aliTable) || startsWith("altSeqLiftOverPsl", aliTable) || startsWith("ncbiRefSeqPsl", aliTable)) { - rnaSeq = NULL; - char *trackName = hGetTrackForTable(database, aliTable); - struct trackDb *tdb = hashMustFindVal(trackHash, trackName); - char *spec = trackDbRequiredSetting(tdb, BASE_COLOR_USE_SEQUENCE); - char *specCopy = cloneString(spec); - - // value is: extFile seqTbl extFileTbl - char *words[3]; - int nwords = chopByWhite(specCopy, words, ArraySize(words)); - if ((nwords != ArraySize(words)) || !sameString(words[0], "extFile")) - errAbort("invalid %s track setting: %s", BASE_COLOR_USE_SEQUENCE, spec); - rnaSeq = hDnaSeqGet(database, acc, words[1], words[2]); + rnaSeq = getBaseColorSequence(acc, aliTable); } else if (sameString("HInvGeneMrna", aliTable)) { /* get RNA accession for the gene id in the alignment */ sqlSafef(query, sizeof(query), "select mrnaAcc from HInv where geneId='%s'", acc); rnaSeq = hRnaSeq(database, sqlQuickString(conn, query)); } else { char *cdnaTable = NULL; struct trackDb *tdb = hashFindVal(trackHash, aliTable); if (tdb != NULL) cdnaTable = trackDbSetting(tdb, "cdnaTable"); if (isNotEmpty(cdnaTable) && hTableExists(database, cdnaTable)) @@ -8247,30 +8255,43 @@ else if (gp->strand[0] == '-' && gp->cdsEndStat != cdsComplete) offset = (3 - gp->exonFrames[gp->exonCount-1]) % 3; } /* NOTE: this fix will not handle the case in which frame is shifted * internally or at multiple exons, as when frame-shift gaps occur in * an alignment of an mRNA to the genome. Going to have to come back * and address that later... (acs) */ dnaTranslateSome(cdsDna->dna+offset, prot, protBufSize); dnaSeqFree(&cdsDna); return prot; } +void ncbiRefSeqSequence(char *itemName) +{ +char *table = cartString(cart, "o"); +struct dnaSeq *rnaSeq = getBaseColorSequence(itemName, table ); +cartHtmlStart("RefSeq mRNA Sequence"); + +printf("<PRE><TT>"); +printf(">%s\n", itemName); +faWriteNext(stdout, NULL, rnaSeq->dna, rnaSeq->size); +printf("</TT></PRE>"); +} + + void htcGeneMrna(char *geneName) /* Display cDNA predicted from genome */ { char *table = cartString(cart, "o"); cartHtmlStart("Predicted mRNA from Genome"); struct genePred *gp, *gpList = getGenePredForPosition(table, geneName), *next; int cdsStart, cdsEnd; struct dnaSeq *seq; for(gp = gpList; gp; gp = next) { next = gp->next; seq = getCdnaSeq(gp); getCdsInMrna(gp, &cdsStart, &cdsEnd); toUpperN(seq->dna + cdsStart, cdsEnd - cdsStart); @@ -11495,57 +11516,57 @@ htmlHorizontalLine(); if (differentWord("n/a", nrl->description)) { printf("Summary of <b>%s</b><br>\n%s<br>\n", nrl->name, nrl->description); htmlHorizontalLine(); } struct psl *pslList = getAlignments(conn, "ncbiRefSeqPsl", itemName); // if the itemName isn't found, it might be found as the nrl->mrnaAcc if (! pslList) pslList = getAlignments(conn, "ncbiRefSeqPsl", nrl->mrnaAcc); if (pslList) { int start = cartInt(cart, "o"); printf("<H3>mRNA/Genomic Alignments</H3>"); - printAlignments(pslList, start, "ncbiRefSeqPsl", "ncbiRefSeqPsl", itemName); + printAlignments(pslList, start, "htcCdnaAli", "ncbiRefSeqPsl", itemName); } else { printf ("<h4>there is NO alignment for %s</h4><br>\n", itemName); } htmlHorizontalLine(); +if (!sameString(tdb->track, "ncbiRefSeqPsl")) showGenePos(itemName, tdb); -printf("<h3>Links xyz to sequence:</h3>\n"); +printf("<h3>Links to sequence:</h3>\n"); printf("<ul>\n"); -printf("<li>need to figure out how to make these links, these don't work.\n"); - -// might need something like this: seq = hPepSeq(database, buffer); - puts("<li>\n"); -hgcAnchorSomewhere("htcTranslatedProtein", itemName, "seqNcbiRefSeq", - nrl->mrnaAcc); +hgcAnchorSomewhere("htcTranslatedProtein", nrl->protAcc, "ncbiRefSeqPepTable", seqName); printf("Predicted Protein</a> \n"); puts("</li>\n"); puts("<li>\n"); -hgcAnchorSomewhere("htcGeneMrna", itemName, tdb->track, nrl->mrnaAcc); +hgcAnchorSomewhere("ncbiRefSeqSequence", itemName, "ncbiRefSeqPsl", seqName); printf("%s</a> may be different from the genomic sequence.\n", "Predicted mRNA"); puts("</li>\n"); +puts("<LI>\n"); +hgcAnchorSomewhere("getDna", itemName, tdb->track, seqName); +printf("Genomic Sequence</A> from assembly\n"); +puts("</LI>\n"); printf("</ul>\n"); printTrackHtml(tdb); hFreeConn(&conn); } void doRefGene(struct trackDb *tdb, char *rnaName) /* Process click on a known RefSeq gene. */ { struct sqlConnection *conn = hAllocConn(database); int start = cartInt(cart, "o"); int left = cartInt(cart, "l"); int right = cartInt(cart, "r"); char *chrom = cartString(cart, "c"); @@ -24977,30 +24998,31 @@ doSuperfamily(tdb, item, NULL); } else if (sameWord(table, "ensGene") || sameWord (table, "ensGeneNonCoding")) { doEnsemblGene(tdb, item, NULL); } else if (sameWord(table, "xenoRefGene")) { doRefGene(tdb, item); } else if (sameWord(table, "knownGene")) { doKnownGene(tdb, item); } else if (sameWord(table, "ncbiRefSeq") || + sameWord(table, "ncbiRefSeqPsl") || sameWord(table, "ncbiRefSeqCurated") || sameWord(table, "ncbiRefSeqPredicted") || sameWord(table, "ncbiRefSeqOther") ) { doNcbiRefSeq(tdb, item); } else if (sameWord(table, "refGene") ) { doRefGene(tdb, item); } else if (sameWord(table, "ccdsGene")) { doCcdsGene(tdb, item); } else if (isNewGencodeGene(tdb)) @@ -25414,30 +25436,34 @@ { htcExtSeq(item); } else if (sameWord(table, "htcTranslatedProtein")) { htcTranslatedProtein(item); } else if (sameWord(table, "htcTranslatedPredMRna")) { htcTranslatedPredMRna(item); } else if (sameWord(table, "htcTranslatedMRna")) { htcTranslatedMRna(tdbForTableArg(), item); } +else if (sameWord(table, "ncbiRefSeqSequence")) + { + ncbiRefSeqSequence(item); + } else if (sameWord(table, "htcGeneMrna")) { htcGeneMrna(item); } else if (sameWord(table, "htcRefMrna")) { htcRefMrna(item); } else if (sameWord(table, "htcDisplayMrna")) { htcDisplayMrna(item); } else if (sameWord(table, "htcGeneInGenome")) { htcGeneInGenome(item);