34b850ae144d1c2156abe6ec230c2d2ae992cf6f braney Thu Aug 6 15:51:57 2015 -0700 more polish for bigPsl support. hgc alignments work now #14241 diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c index 7829e9d..86945e6 100644 --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@ -2865,48 +2865,32 @@ struct psl* pslList; char *fileName = bbiNameFromSettingOrTable(tdb, conn, tdb->table); struct bbiFile *bbi = bigBedFileOpen(fileName); struct lm *lm = lmInit(0); int ivStart = start, ivEnd = end; if (start == end) { // item is an insertion; expand the search range from 0 bases to 2 so we catch it: ivStart = max(0, start-1); ivEnd++; } struct bigBedInterval *bbList = bigBedIntervalQuery(bbi, seqName, ivStart, ivEnd, 0, lm); pslList = pslFromBigPsl(seqName, bbList, hChromSize(database, seqName), NULL, NULL); -/* check if there is an alignment available for this sequence. This checks - * both genbank sequences and other sequences in the seq table. If so, - * set it up so they can click through to the alignment. */ -if ( 1) //hGenBankHaveSeq(database, item, NULL)) - { printf("<H3>%s/Genomic Alignments</H3>", item); - /* - if (sameString("protein", subType)) - printAlignments(pslList, start, "htcProteinAli", tdb->table, item); - else - */ - printAlignments(pslList, start, "htcCdnaAli", tdb->table, item); - } -else - { - /* just dump the psls */ - pslDumpHtml(pslList); - } +printAlignments(pslList, start, "htcBigPslAli", tdb->table, item); pslFreeList(&pslList); printItemDetailsHtml(tdb, item); } void genericPslClick(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start, char *subType) /* Handle click in generic psl track. */ { struct psl* pslList = getAlignments(conn, tdb->table, item); /* check if there is an alignment available for this sequence. This checks * both genbank sequences and other sequences in the seq table. If so, * set it up so they can click through to the alignment. */ if (hGenBankHaveSeq(database, item, NULL)) { @@ -6982,30 +6966,76 @@ } else { struct trackDb *tdb = hashMustFindVal(trackHash, trackTable); char *cdsTable = trackDbSetting(tdb, "cdsTable"); if (isNotEmpty(cdsTable) && hTableExists(database, cdsTable)) { sqlSafef(query, sizeof(query), "select cds from %s where id = '%s'", cdsTable, acc); char *cdsString = sqlQuickString(conn, query); if (isNotEmpty(cdsString)) genbankParseCds(cdsString, retCdsStart, retCdsEnd); } } } +void htcBigPslAli(char *acc) +/* Show alignment for accession in bigPsl file. */ +{ +struct psl *psl; +char *aliTable; +int start; +unsigned int cdsStart = 0, cdsEnd = 0; + + +/* Print start of HTML. */ +writeFramesetType(); +puts("<HTML>"); +aliTable = cartString(cart, "aliTable"); +tdb = hashFindVal(trackHash, aliTable); +printf("<HEAD>\n<TITLE>%s vs Genomic [%s]</TITLE>\n</HEAD>\n\n", acc, aliTable); + +/* Get some environment vars. */ +start = cartInt(cart, "l"); +int end = cartInt(cart, "r"); +char *chrom = cartString(cart, "c"); + +char *seq, *cdsString = NULL; +struct lm *lm = lmInit(0); +char *fileName = bbiNameFromSettingOrTable(tdb, NULL, tdb->table); +struct bbiFile *bbi = bigBedFileOpen(fileName); +struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); +char *bedRow[32]; +char startBuf[16], endBuf[16]; +for (bb = bbList; bb != NULL; bb = bb->next) + { + bigBedIntervalToRow(bb, seqName, startBuf, endBuf, bedRow, ArraySize(bedRow)); + 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); +} + 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; @@ -24618,33 +24648,39 @@ } struct customTrack *ct = NULL; if (isCustomTrack(track)) { struct customTrack *ctList = getCtList(); for (ct = ctList; ct != NULL; ct = ct->next) if (sameString(track, ct->tdb->track)) break; } if ((!isCustomTrack(track) && dbIsFound) || ((ct!= NULL) && (ct->dbTrackType != NULL) && sameString(ct->dbTrackType, "maf"))) { trackHash = makeTrackHashWithComposites(database, seqName, TRUE); - if (isHubTrack(track)) + if (sameString("htcBigPslAli", track) ) + { + char *aliTable = cartString(cart, "aliTable"); + if (isHubTrack(aliTable)) + tdb = hubConnectAddHubForTrackAndFindTdb( database, aliTable, NULL, trackHash); + } + else if (isHubTrack(track)) { - hubConnectAddHubForTrackAndFindTdb( database, track, NULL, trackHash); + tdb = hubConnectAddHubForTrackAndFindTdb( database, track, NULL, trackHash); } if (parentWigMaf) { int wordCount, i; char *words[16]; char *typeLine; char *wigType = needMem(128); tdb = hashFindVal(trackHash, parentWigMaf); if (!tdb) errAbort("can not find trackDb entry for parentWigMaf track %s.", parentWigMaf); typeLine = cloneString(tdb->type); wordCount = chopLine(typeLine, words); if (wordCount < 1) errAbort("trackDb entry for parentWigMaf track %s has corrupt type line.", @@ -25304,30 +25340,34 @@ { doCgh(table, item, tdb); } else if (sameWord(table, "mcnBreakpoints")) { doMcnBreakpoints(table, item, tdb); } else if (sameWord(table, "htcChainAli")) { htcChainAli(item); } else if (sameWord(table, "htcChainTransAli")) { htcChainTransAli(item); } +else if (sameWord(table, "htcBigPslAli")) + { + htcBigPslAli(item); + } else if (sameWord(table, "htcCdnaAli")) { htcCdnaAli(item); } else if (sameWord(table, "htcUserAli")) { htcUserAli(item); } else if (sameWord(table, "htcGetBlastPep")) { doGetBlastPep(item, cartString(cart, "aliTable")); } else if (sameWord(table, "htcProteinAli")) { htcProteinAli(item, cartString(cart, "aliTable"));