dccdf29485000ddce07f65a431d52a51ffd158cf
braney
Wed Nov 16 18:41:22 2016 -0800
add support for protein psls in bigPsl
diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 513eb59..51dfe47 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -2971,48 +2971,53 @@
char *item, int start, int end)
/* Handle click in big psl track. */
{
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++;
}
+unsigned seqTypeField = bbExtraFieldIndex(bbi, "seqType");
struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, seqName, ivStart, ivEnd, 0, lm);
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);
+pslList = pslFromBigPsl(seqName, bb, seqTypeField, NULL, NULL);
printf("
%s/Genomic Alignments
", item);
-printAlignmentsExtra(pslList, start, "htcBigPslAli", "htcBigPslAliInWindow", tdb->table, item);
+if (pslIsProtein(pslList))
+ printAlignmentsSimple(pslList, start, "htcBigPslAli", tdb->table, item);
+else
+ 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))
{
@@ -7232,36 +7237,46 @@
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;
}
}
if (bb == NULL)
errAbort("item %s not found in range %s:%d-%d in bigBed %s (%s)",
acc, chrom, start, end, tdb->table, fileName);
-psl = pslFromBigPsl(seqName, bb, &seq, &cdsString);
+unsigned seqTypeField = bbExtraFieldIndex(bbi, "seqType");
+psl = pslFromBigPsl(seqName, bb, seqTypeField, &seq, &cdsString);
+if (cdsString)
genbankParseCds(cdsString, &cdsStart, &cdsEnd);
+if (seq == NULL)
+ {
+ printf("Sequence for %s not available.\n", psl->qName);
+ return;
+ }
struct dnaSeq *rnaSeq = newDnaSeq(seq, strlen(seq), acc);
-showSomeAlignment(psl, rnaSeq, gftRna, 0, rnaSeq->size, NULL, cdsStart, cdsEnd);
+enum gfType type = gftRna;
+if (pslIsProtein(psl))
+ type = gftProt;
+showSomeAlignment(psl, rnaSeq, type, 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))
@@ -7283,31 +7298,39 @@
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);
+unsigned seqTypeField = bbExtraFieldIndex(bbi, "seqType");
+wholePsl = pslFromBigPsl(seqName, bb, seqTypeField, &seq, &cdsString);
+
+if (seq == NULL)
+ {
+ printf("Sequence for %s not available.\n", wholePsl->qName);
+ return;
+ }
+if (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);