diff --git a/uk/ac/sanger/artemis/components/alignment/BamView.java b/uk/ac/sanger/artemis/components/alignment/BamView.java
index 88d5f9a0319fc642fa3605ef71bdc85348345f29..d25eef57338849721b9a9710ff5acbdc0360c05c 100644
--- a/uk/ac/sanger/artemis/components/alignment/BamView.java
+++ b/uk/ac/sanger/artemis/components/alignment/BamView.java
@@ -58,11 +58,14 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
+import java.lang.reflect.Field;
import java.net.URL;
import java.util.Collections;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
+import java.util.Map;
import java.util.Vector;
import javax.swing.BorderFactory;
@@ -92,6 +95,7 @@ import javax.swing.text.JTextComponent;
import org.apache.log4j.Level;
+import net.sf.picard.reference.ReferenceSequenceFile;
import net.sf.picard.sam.BuildBamIndex;
import net.sf.samtools.AlignmentBlock;
import net.sf.samtools.SAMException;
@@ -140,8 +144,8 @@ public class BamView extends JPanel
private List<SAMRecord> readsInView;
private Hashtable<String, SAMFileReader> samFileReaderHash = new Hashtable<String, SAMFileReader>();
- private Hashtable<String, Integer> seqLengths = new Hashtable<String, Integer>();
- private Hashtable<String, Integer> offsetLengths;
+ private HashMap<String, Integer> seqLengths = new HashMap<String, Integer>();
+ private HashMap<String, Integer> offsetLengths;
private Vector<String> seqNames = new Vector<String>();
protected List<String> bamList;
private List<Integer> hideBamList = new Vector<Integer>();
@@ -266,6 +270,7 @@ public class BamView extends JPanel
if(reference != null)
{
+ System.setProperty("reference", reference); // for CRAM
EntryGroup entryGroup = new SimpleEntryGroup();
try
{
@@ -395,7 +400,11 @@ public class BamView extends JPanel
logger4j.debug("create... " + bamIndexFile.getAbsolutePath());
}
else
+ {
bamIndexFile = new File(bam + ".bai");
+ if(!bamIndexFile.exists())
+ bamIndexFile = new File(bam + ".crai");
+ }
return bamIndexFile;
}
@@ -437,6 +446,46 @@ public class BamView extends JPanel
final SAMFileReader samFileReader;
+ if(feature_display != null && bam.endsWith("cram"))
+ {
+ final CRAMReferenceSequenceFile ref = new CRAMReferenceSequenceFile(
+ feature_display.getEntryGroup().getSequenceEntry(), this);
+
+ final Map<Object, ReferenceSequenceFile> referenceFactory =
+ new HashMap<Object, ReferenceSequenceFile>();
+ referenceFactory.put(bamIndexFile, ref);
+
+ try
+ {
+ Class cls = getClass().getClassLoader().loadClass("net.sf.samtools.ReferenceDiscovery");
+ Field f = cls.getDeclaredField("referenceFactory");
+ f.set(null, referenceFactory);
+ }
+ catch (ClassNotFoundException e)
+ {
+ System.err.println("Check cramtools.jar is in the CLASSPATH. "+e.getMessage());
+ }
+ catch (SecurityException e)
+ {
+ e.printStackTrace();
+ }
+ catch (NoSuchFieldException e)
+ {
+ e.printStackTrace();
+ }
+ catch (IllegalArgumentException e)
+ {
+ e.printStackTrace();
+ }
+ catch (IllegalAccessException e)
+ {
+ e.printStackTrace();
+ }
+
+
+ //net.sf.samtools.ReferenceDiscovery.referenceFactory.put(bamIndexFile, ref);
+ }
+
if(bam.startsWith("ftp"))
{
FTPSeekableStream fss = new FTPSeekableStream(new URL(bam));
@@ -492,7 +541,7 @@ public class BamView extends JPanel
//final SAMFileReader inputSam = new SAMFileReader(bamFile, indexFile);
- if(concatSequences)
+ if(isConcatSequences())
{
int len = 0;
int lastLen = 1;
@@ -514,7 +563,7 @@ public class BamView extends JPanel
if(thisEnd > thisLength)
thisEnd = thisLength;
- //System.out.println("READ "+seqNames.get(i)+" "+thisStart+".."+thisEnd);
+ //System.out.println("READ "+seqNames.get(i)+" "+thisStart+".."+thisEnd+" "+start+" --- "+offset);
iterateOverBam(inputSam, seqNames.get(i), thisStart, thisEnd, bamIndex, pixPerBase, bam);
}
lastLen = len;
@@ -561,6 +610,7 @@ public class BamView extends JPanel
{
cnt++;
SAMRecord samRecord = it.next();
+
if( samRecordFlagPredicate == null ||
!samRecordFlagPredicate.testPredicate(samRecord))
{
@@ -619,7 +669,7 @@ public class BamView extends JPanel
private int getSequenceLength()
{
- if(concatSequences)
+ if(isConcatSequences())
{
int len = 0;
for(int i=0; i<seqNames.size(); i++)
@@ -639,7 +689,7 @@ public class BamView extends JPanel
*/
protected int getSequenceOffset(String refName)
{
- if(!concatSequences)
+ if(!isConcatSequences())
return 0;
if(offsetLengths == null)
@@ -653,11 +703,19 @@ public class BamView extends JPanel
offset += seqLengths.get(combo.getItemAt(i));
}*/
- FeatureVector features = feature_display.getEntryGroup().getAllFeatures();
- offsetLengths = new Hashtable<String, Integer>(seqNames.size());
+ final FeatureVector features = feature_display.getEntryGroup().getAllFeatures();
+ final HashMap<String, Integer> lookup = new HashMap<String, Integer>();
+ for(int i=0; i<features.size(); i++)
+ lookup.put(features.elementAt(i).getIDString(), features.elementAt(i).getFirstBase());
+
+ offsetLengths = new HashMap<String, Integer>(seqNames.size());
for(int i=0; i<seqNames.size(); i++)
{
- FeatureContigPredicate predicate = new FeatureContigPredicate(seqNames.get(i).trim());
+ final Integer pos = lookup.get(seqNames.get(i));
+ if(pos != null)
+ offsetLengths.put(seqNames.get(i), pos-1);
+
+ /*final FeatureContigPredicate predicate = new FeatureContigPredicate(seqNames.get(i).trim());
for(int j=0; j<features.size(); j++)
{
if(predicate.testPredicate(features.elementAt(j)))
@@ -665,7 +723,7 @@ public class BamView extends JPanel
offsetLengths.put(seqNames.get(i), features.elementAt(j).getFirstBase()-1);
break;
}
- }
+ }*/
}
if(offsetLengths.size() != seqNames.size())
@@ -677,8 +735,16 @@ public class BamView extends JPanel
"on the reference features do not match those in the in\n"+
"the BAM file.",
"Problem Found", JOptionPane.WARNING_MESSAGE);
- concatSequences = false;
- return 0;
+ //concatSequences = false;
+
+ int offset = 0;
+ for(int i=0; i<combo.getItemCount(); i++)
+ {
+ String thisSeqName = (String) combo.getItemAt(i);
+ offsetLengths.put(thisSeqName, offset);
+ offset += seqLengths.get(combo.getItemAt(i));
+ }
+ //return 0;
}
}
return offsetLengths.get(refName);
@@ -1291,7 +1357,7 @@ public class BamView extends JPanel
else
g2.setColor(Color.blue);
- if(maxEnd < recordStart)
+ if(maxEnd < recordStart || ypos < 0)
{
ypos = (getHeight() - scaleHeight)-ydiff;
maxEnd = recordEnd+2;
@@ -1359,7 +1425,8 @@ public class BamView extends JPanel
float pixPerBase,
Stroke stroke)
{
- int ypos = (getHeight() - scaleHeight);
+ int hgt = getHeight();
+ int ypos = (hgt - scaleHeight);
int maxEnd = 0;
int lstStart = 0;
int lstEnd = 0;
@@ -1388,7 +1455,7 @@ public class BamView extends JPanel
else
g2.setColor(Color.blue);
- if(maxEnd < recordStart)
+ if(maxEnd < recordStart || ypos < 0 || ypos > hgt)
{
ypos = ymid + ystep;
maxEnd = recordEnd+2;
@@ -2008,7 +2075,7 @@ public class BamView extends JPanel
}
else
{
- if(!concatSequences)
+ if(!isConcatSequences())
{
int seqLen = seqLengths.get((String) combo.getSelectedItem());
int artemisSeqLen = feature_display.getSequenceLength();
@@ -2081,10 +2148,10 @@ public class BamView extends JPanel
{
FileSelectionDialog bamFileSelection = new FileSelectionDialog(
null, false, "BamView", "BAM");
- List<String> bamFiles = bamFileSelection.getFiles(".*\\.bam$");
+ List<String> bamFiles = bamFileSelection.getFiles(".*\\.(bam|cram)$");
int count = bamList.size();
- bamList.addAll(bamFileSelection.getFiles(".*\\.bam$"));
+ bamList.addAll(bamFileSelection.getFiles(".*\\.(bam|cram)$"));
for(int i=0; i<bamFiles.size(); i++)
addToViewMenu(i+count);
@@ -3387,6 +3454,14 @@ public class BamView extends JPanel
this.samRecordMapQPredicate = samRecordMapQPredicate;
}
+ /**
+ * @return the concatSequences
+ */
+ protected boolean isConcatSequences()
+ {
+ return concatSequences;
+ }
+
class PairedRead
{
SAMRecord sam1;
@@ -3414,7 +3489,7 @@ public class BamView extends JPanel
System.setProperty("default_directory", System.getProperty("user.dir"));
FileSelectionDialog fileSelection = new FileSelectionDialog(
null, true, "BamView", "BAM");
- bam = fileSelection.getFiles(".*\\.bam$");
+ bam = fileSelection.getFiles(".*\\.(bam|cram)$");
reference = fileSelection.getReferenceFile();
if(reference == null || reference.equals(""))
reference = null;