src/hg/overlapSelect/chromAnn.c 1.14
1.14 2009/07/22 07:01:28 markd
fixed bug when doing stranded overlap with psls
Index: src/hg/overlapSelect/chromAnn.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/overlapSelect/chromAnn.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -b -B -U 4 -r1.13 -r1.14
--- src/hg/overlapSelect/chromAnn.c 12 Aug 2008 01:04:34 -0000 1.13
+++ src/hg/overlapSelect/chromAnn.c 22 Jul 2009 07:01:28 -0000 1.14
@@ -278,23 +278,53 @@
static void addPslBlocks(struct chromAnn* ca, unsigned opts, struct psl* psl)
/* add blocks from a psl */
{
-boolean strand = (opts & chromAnnUseQSide) ? pslQStrand(psl) : pslTStrand(psl);
+boolean blkStrand = (opts & chromAnnUseQSide) ? pslQStrand(psl) : pslTStrand(psl);
int size = (opts & chromAnnUseQSide) ? psl->qSize : psl->tSize;
unsigned *blocks = (opts & chromAnnUseQSide) ? psl->qStarts : psl->tStarts;
boolean blkSizeMult = pslIsProtein(psl) ? 3 : 1;
int iBlk;
for (iBlk = 0; iBlk < psl->blockCount; iBlk++)
{
int start = blocks[iBlk];
int end = start + (blkSizeMult * psl->blockSizes[iBlk]);
- if (strand == '-')
+ if (blkStrand == '-')
reverseIntRange(&start, &end, size);
chromAnnBlkNew(ca, start, end);
}
}
+static char getPslTSideStrand(struct psl *psl)
+/* get the strand to use for a PSL when doing target side overlaps */
+{
+if (psl->strand[1] != '\0')
+ {
+ // translated
+ char strand = pslTStrand(psl);
+ if (pslQStrand(psl) == '-')
+ strand = (strand == '-') ? '+' : '-'; // query reverse complemented
+ return strand;
+ }
+else
+ return pslQStrand(psl); // untranslated
+}
+
+static char getPslQSideStrand(struct psl *psl)
+/* get the strand to use for a PSL when doing query side overlaps */
+{
+if (psl->strand[1] != '\0')
+ {
+ // translated
+ char strand = pslQStrand(psl);
+ if (pslTStrand(psl) == '-')
+ strand = (strand == '-') ? '+' : '-'; // query reverse complemented
+ return strand;
+ }
+else
+ return pslTStrand(psl); // untranslated
+}
+
static struct chromAnn* chromAnnPslReaderRead(struct chromAnnReader *car)
/* read next chromAnn from a PSL file */
{
struct rowReader *rr = car->data;
@@ -306,12 +336,12 @@
struct psl *psl = pslLoad(rr->row);
struct chromAnn* ca;
if (car->opts & chromAnnUseQSide)
- ca = chromAnnNew(psl->qName, pslQStrand(psl), psl->tName, rawCols,
+ ca = chromAnnNew(psl->qName, getPslQSideStrand(psl), psl->tName, rawCols,
strVectorWrite, strVectorFree);
else
- ca = chromAnnNew(psl->tName, pslTStrand(psl), psl->qName, rawCols,
+ ca = chromAnnNew(psl->tName, getPslTSideStrand(psl), psl->qName, rawCols,
strVectorWrite, strVectorFree);
if (car->opts & chromAnnRange)
{
@@ -402,13 +432,13 @@
return NULL;
struct chromAnn* ca;
if (car->opts & chromAnnUseQSide)
- ca = chromAnnNew(chain->qName, chain->qStrand, chain->tName,
+ ca = chromAnnNew(chain->qName, '+', chain->tName,
((car->opts & chromAnnSaveLines) ? chain : NULL),
chainRecWrite, chainRecFree);
else
- ca = chromAnnNew(chain->tName, '+', chain->qName,
+ ca = chromAnnNew(chain->tName, chain->qStrand, chain->qName,
((car->opts & chromAnnSaveLines) ? chain : NULL),
chainRecWrite, chainRecFree);
if (car->opts & chromAnnRange)