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("
%s/Genomic Alignments
", 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("browser | ",
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",
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("");
}
-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("
View details of parts of alignment within browser window.
\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("");
+aliTable = cartString(cart, "aliTable");
+if (isCustomTrack(aliTable))
+ {
+ struct customTrack *ct = lookupCt(aliTable);
+ tdb = ct->tdb;
+ }
+else
+ tdb = hashFindVal(trackHash, aliTable);
+printf("\n%s vs Genomic [%s]\n\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"));