From 83759ef9a1cf4a9a47e9d655199bccf7e416eff7 Mon Sep 17 00:00:00 2001
From: tcarver <tjc>
Date: Mon, 22 Oct 2012 16:47:24 +0100
Subject: [PATCH] add option for creating features from reads on opposite
 strand - for single strand cDNA

---
 .../artemis/components/alignment/BamView.java | 15 ++++++---
 .../components/alignment/MappedReads.java     | 32 +++++++++++--------
 2 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java
index be26ccb51..ca938c72d 100644
--- a/uk/ac/sanger/artemis/components/alignment/BamView.java
+++ b/uk/ac/sanger/artemis/components/alignment/BamView.java
@@ -3916,17 +3916,17 @@ public class BamView extends JPanel
       if(groupsFrame.getNumberOfGroups() == 1)
         useGroup.setEnabled(false);
       
-      ButtonGroup group = new ButtonGroup();
+      final ButtonGroup group = new ButtonGroup();
       group.add(useAllBams);
       group.add(useGroup);
 
-      Box xBox = Box.createHorizontalBox();
+      final Box xBox = Box.createHorizontalBox();
       xBox.add(useAllBams);
       xBox.add(useGroup);
       xBox.add(Box.createHorizontalGlue());
       c.gridy++;
       gridPanel.add(xBox, c);
-      
+
       c.gridy++;
       gridPanel.add(new JSeparator(), c);
       c.gridy++;
@@ -3934,6 +3934,11 @@ public class BamView extends JPanel
       c.gridy++;
       gridPanel.add(minSize, c);
 
+      final JCheckBox cbOpposite = new JCheckBox("Assume reads on opposite strand", false);
+      cbOpposite.setToolTipText("for cDNA experiments when the reads are on the opposite strand");
+      c.gridy++;
+      gridPanel.add(cbOpposite, c);
+
       int status =
           JOptionPane.showConfirmDialog(feature_display, gridPanel, 
               "Options", JOptionPane.OK_CANCEL_OPTION);
@@ -3968,8 +3973,8 @@ public class BamView extends JPanel
 
       new MappedReads((String)combo.getSelectedItem(),BamView.this, samFileReaderHash,
           seqNames, offsetLengths, concatSequences, seqLengths, 
-          (useGroup.isSelected() ? groupsFrame : null),
-          threshold.getValue(), minSize.getValue(), minBams.getValue(), true);
+          (useGroup.isSelected() ? groupsFrame : null), threshold.getValue(), 
+          minSize.getValue(), minBams.getValue(), cbOpposite.isSelected(), true);
     }
   }
  
diff --git a/uk/ac/sanger/artemis/components/alignment/MappedReads.java b/uk/ac/sanger/artemis/components/alignment/MappedReads.java
index 83b75df54..145442b53 100644
--- a/uk/ac/sanger/artemis/components/alignment/MappedReads.java
+++ b/uk/ac/sanger/artemis/components/alignment/MappedReads.java
@@ -201,6 +201,7 @@ public class MappedReads
    * @param threshold
    * @param minSize
    * @param minBams
+   * @param readsOnOppositeStrand assume reads are on the opposite strand if true.
    * @param contained
    */
   public MappedReads(  
@@ -215,6 +216,7 @@ public class MappedReads
       final int threshold,
       final int minSize,
       final int minBams,
+      final boolean readsOnOppositeStrand,
       final boolean contained)
   {
     this.refName = refName;
@@ -247,7 +249,7 @@ public class MappedReads
     centerDialog();
     
     final CalculateNewFeatures cmr = new CalculateNewFeatures(
-        feature_display, refName, groupsFrame, threshold, minSize, minBams);
+        feature_display, refName, groupsFrame, threshold, minSize, minBams, readsOnOppositeStrand);
     cmr.start();
     dialog.setVisible(true);
   }
@@ -502,6 +504,7 @@ public class MappedReads
     private int threshold;
     private int minSize;
     private int minBams;
+    private boolean readsOnOppositeStrand;
     private GroupBamFrame groupsFrame;
     
     CalculateNewFeatures(final FeatureDisplay feature_display,
@@ -509,7 +512,8 @@ public class MappedReads
         final GroupBamFrame groupsFrame, 
         final int threshold,
         final int minSize,
-        final int minBams)
+        final int minBams,
+        final boolean readsOnOppositeStrand)
     {
       entryGroup = feature_display.getEntryGroup();
       bases = feature_display.getBases();
@@ -518,6 +522,7 @@ public class MappedReads
       this.threshold = threshold;
       this.minSize = minSize;
       this.minBams = minBams;
+      this.readsOnOppositeStrand = readsOnOppositeStrand;
     }
     
     class MarkerObj
@@ -583,7 +588,7 @@ public class MappedReads
                   int concatShift = 0;
                   if(offset > start)
                     concatShift = offset-start;
-                  
+
                   cnt =
                     BamUtils.countOverRange(bamList.get(i), samFileReaderHash, 
                         name, thisStart, thisEnd, concatShift, cnt,
@@ -592,26 +597,24 @@ public class MappedReads
               }
             }
             else
-            {
               cnt =
                 BamUtils.countOverRange(bamList.get(i), samFileReaderHash, 
                     refSeq, start, stop, 0, cnt,
                     samRecordFlagPredicate, samRecordMapQPredicate);
-            }
-            
+
             for(int k=0; k<cnt.length; k++)
             {
               final Range r = new Range(start+k, start+k+1);
-              
               // find forward strand potential features
-              fwdStart = findFeatures(cnt[k][0], true, fwdStart, j+k,
-                r, excluseKeys, fwdMarkers, entryGroup, i);
-            
+              fwdStart = findFeatures( 
+                  (!readsOnOppositeStrand ? cnt[k][0] : cnt[k][1]), true, 
+                  fwdStart, j+k, r, excluseKeys, fwdMarkers, entryGroup, i);
+
               // find reverse strand potential features
-              revStart = findFeatures(cnt[k][1], false, revStart, j+k,
-                r, excluseKeys, revMarkers, entryGroup, i);
+              revStart = findFeatures( 
+                  (!readsOnOppositeStrand ? cnt[k][1] : cnt[k][0]), false, 
+                  revStart, j+k, r, excluseKeys, revMarkers, entryGroup, i);
             }
-            
           }
           catch (OutOfRangeException e1)
           {
@@ -620,7 +623,8 @@ public class MappedReads
         }
       }
 
-      final Entry newEntry = entryGroup.createEntry ("align_"+threshold+"_"+minBams+"_"+minSize);
+      final Entry newEntry = entryGroup.createEntry (
+          "align_"+threshold+"_"+minBams+"_"+minSize+(!readsOnOppositeStrand ? "":"_opp"));
       createFeatures(fwdMarkers, true, newEntry);
       createFeatures(revMarkers, false, newEntry);
       return null;
-- 
GitLab