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)