diff --git a/uk/ac/sanger/artemis/components/variant/IOUtils.java b/uk/ac/sanger/artemis/components/variant/IOUtils.java index 660ab1ed599cedd9040e0682550db4d09b23195a..4cce0fcc55ddecb2034912f51b629595aab40467 100644 --- a/uk/ac/sanger/artemis/components/variant/IOUtils.java +++ b/uk/ac/sanger/artemis/components/variant/IOUtils.java @@ -52,6 +52,9 @@ import net.sf.samtools.util.BlockCompressedInputStream; class IOUtils { + + private static final int MAXIMUM_SELECTED_FEATURES = 25; + /** * Write filtered uncompressed VCF. Uses the filter in VCFview to * determine if variants are written. @@ -163,16 +166,26 @@ class IOUtils final FeatureVector features, final boolean view) { + if(view && features.size () > MAXIMUM_SELECTED_FEATURES) + new MessageDialog (null, + "warning: only viewing the sequences for " + + "the first " + MAXIMUM_SELECTED_FEATURES + + " selected features"); + String suffix = ".fasta"; if(features.size() == 1) suffix = "."+features.elementAt(0).getIDString()+suffix; + FileWriter writer = null; for (int i = 0; i < vcfReaders.length; i++) { - String vcfFileName = vcfReaders[i].getFileName(); try - { - for (int j = 0; j < features.size(); j++) + { + if(!view) + writer = new FileWriter( + getFile(vcfReaders[i].getFileName(), vcfReaders.length, suffix)); + + for (int j = 0; j < features.size() && (!view || j < MAXIMUM_SELECTED_FEATURES); j++) { Feature f = features.elementAt(j); FeatureSegmentVector segs = f.getSegments(); @@ -187,9 +200,13 @@ class IOUtils if (vcfReaders[i] instanceof BCFReader) { BCFReaderIterator it = ((BCFReader) vcfReaders[i]).query(chr, sbeg, send); - VCFRecord bcfRecord; - while ((bcfRecord = it.next()) != null) - segBases = getSeqsVariation(bcfRecord, segBases, sbeg, f.isForwardFeature(), vcf_v4); + VCFRecord record; + while ((record = it.next()) != null) + { + int basePosition = record.getPos() + vcfView.getSequenceOffset(record.getChrom()); + if(vcfView.showVariant(record, features, basePosition) ) + segBases = getSeqsVariation(record, segBases, sbeg, f.isForwardFeature(), vcf_v4); + } } buff.append(segBases); } @@ -199,6 +216,7 @@ class IOUtils final String product = f.getProductString(); header.append( (product == null ? "undefined product" : product) ); header.append(" ").append(f.getWriteRange()); + header.append(" (").append(vcfReaders[i].getName()).append(")"); if(view) // sequence viewer { @@ -208,13 +226,11 @@ class IOUtils viewer.setSequence(">"+header.toString(), buff.toString()); } else // write to file - { - File filterFile = getFile(vcfFileName, vcfReaders.length, suffix); - FileWriter writer = new FileWriter(filterFile); writeSequence(writer, header.toString(), buff.toString()); - writer.close(); - } } + + if(writer != null) + writer.close(); } catch (IOException e) { @@ -260,16 +276,24 @@ class IOUtils int ndel = vcfRecord.getAlt().getNumberOfDeletions(vcf_v4); if(isFwd) - position+=ndel; + position+=ndel-1; else - buff.delete(position-ndel+1, position); + { + if(position-ndel+1 < 0) + buff.delete(0, position); + else + buff.delete(position-ndel+1, position); + } for(int i=0; i<ndel; i++) buff.append("-"); } else if(vcfRecord.getAlt().isInsertion(vcf_v4)) { - + if(isFwd) + buff.append(vcfRecord.getAlt().toString()); + else + buff.append(Bases.reverseComplement(vcfRecord.getAlt().toString())); } else if(vcfRecord.getAlt().isMultiAllele()) {