1f6843501878c47ccba47c897077d2b5022f3e01 braney Sun Aug 14 15:55:17 2016 -0700 get bigPsl "alignment in window" to work diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c index 97cb8fb..8c21f75 100644 --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@ -2944,31 +2944,31 @@ char *bedRow[32]; char startBuf[16], endBuf[16]; for (bb = bbList; bb != NULL; bb = bb->next) { bigBedIntervalToRow(bb, seqName, startBuf, endBuf, bedRow, 4); struct bed *bed = bedLoadN(bedRow, 4); if (sameString(bed->name, item)) { bb->next = NULL; break; } } pslList = pslFromBigPsl(seqName, bb, NULL, NULL); printf("<H3>%s/Genomic Alignments</H3>", item); -printAlignments(pslList, start, "htcBigPslAli", tdb->table, item); +printAlignmentsExtra(pslList, start, "htcBigPslAli", "htcBigPslAliInWindow", 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)) { @@ -5816,59 +5816,66 @@ printf("<A HREF=\"%s&db=%s&position=%s%%3A%d-%d\">browser</A> | ", hgTracksPathAndSettings(), database, psl->tName, psl->tStart+1, psl->tEnd); hgcAnchorSomewhere(hgcCommand, itemIn, otherString, psl->tName); printf("%5d %5.1f%% %9s %s %9d %9d %20s %5d %5d %5d</A>", psl->match + psl->misMatch + psl->repMatch, 100.0 - pslCalcMilliBad(psl, TRUE) * 0.1, skipChr(psl->tName), psl->strand, psl->tStart + 1, psl->tEnd, psl->qName, psl->qStart+1, psl->qEnd, psl->qSize); printf("\n"); } } } printf("</TT></PRE>"); } -void printAlignments(struct psl *pslList, int startFirst, char *hgcCommand, +void printAlignmentsExtra(struct psl *pslList, int startFirst, char *hgcCommand, char *hgcCommandInWindow, char *tableName, char *itemIn) -/* Print list of mRNA alignments. */ +/* Print list of mRNA alignments with special "in window" alignment function. */ { if (pslList == NULL || tableName == NULL) return; printAlignmentsSimple(pslList, startFirst, hgcCommand, tableName, itemIn); 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(itemIn), + hgcAnchorSomewhere(hgcCommandInWindow, cgiEncode(itemIn), otherString, psl->tName); printf("<BR>View details of parts of alignment within browser window</A>.<BR>\n"); } } } +void printAlignments(struct psl *pslList, int startFirst, char *hgcCommand, + char *tableName, char *itemIn) +/* Print list of mRNA alignments. */ +{ +printAlignmentsExtra(pslList, startFirst, hgcCommand, "htcCdnaAliInWindow", tableName, itemIn); +} + 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]; if (!hFindSplitTable(database, seqName, table, splitTable, &hasBin)) errAbort("can't find table %s or %s_%s", table, seqName, table); sqlSafef(query, sizeof(query), "select * from %s where qName = '%s'", splitTable, acc); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) @@ -7188,30 +7195,85 @@ struct bed *bed = bedLoadN(bedRow, 12); if (sameString(bed->name, acc)) { bb->next = NULL; break; } } psl = pslFromBigPsl(seqName, bb, &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 htcBigPslAliInWindow(char *acc) +/* Show alignment in window for accession in bigPsl file. */ +{ +struct psl *partPsl, *wholePsl; +char *aliTable; +int start; +unsigned int cdsStart = 0, cdsEnd = 0; + +/* Print start of HTML. */ +writeFramesetType(); +puts("<HTML>"); +aliTable = cartString(cart, "aliTable"); +if (isCustomTrack(aliTable)) + { + struct customTrack *ct = lookupCt(aliTable); + tdb = ct->tdb; + } +else + 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; + } + } +wholePsl = pslFromBigPsl(seqName, bb, &seq, &cdsString); +genbankParseCds(cdsString, &cdsStart, &cdsEnd); + +if (wholePsl->tStart >= winStart && wholePsl->tEnd <= winEnd) + partPsl = wholePsl; +else + partPsl = pslTrimToTargetRange(wholePsl, winStart, winEnd); +struct dnaSeq *rnaSeq = newDnaSeq(seq, strlen(seq), acc); +showSomePartialDnaAlignment(partPsl, wholePsl, rnaSeq, + 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]); } @@ -24963,31 +25025,31 @@ } 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"))|| sameString(ct->tdb->type, "bigMaf")))) { trackHash = makeTrackHashWithComposites(database, seqName, TRUE); - if (sameString("htcBigPslAli", track) ) + if (sameString("htcBigPslAli", track) || sameString("htcBigPslAliInWindow", track) ) { char *aliTable = cartString(cart, "aliTable"); if (isHubTrack(aliTable)) tdb = hubConnectAddHubForTrackAndFindTdb( database, aliTable, NULL, trackHash); } else if (isHubTrack(track)) { tdb = hubConnectAddHubForTrackAndFindTdb( database, track, NULL, trackHash); } if (parentWigMaf) { int wordCount, i; char *words[16]; char *typeLine; char *wigType = needMem(128); @@ -25659,30 +25721,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, "htcBigPslAliInWindow")) + { + htcBigPslAliInWindow(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"));