diff --git a/uk/ac/sanger/artemis/components/variant/IOUtils.java b/uk/ac/sanger/artemis/components/variant/IOUtils.java index 344350998bb9aad68fc9898889bfa1385cb900cd..660ab1ed599cedd9040e0682550db4d09b23195a 100644 --- a/uk/ac/sanger/artemis/components/variant/IOUtils.java +++ b/uk/ac/sanger/artemis/components/variant/IOUtils.java @@ -42,6 +42,7 @@ import uk.ac.sanger.artemis.FeatureSegment; import uk.ac.sanger.artemis.FeatureSegmentVector; import uk.ac.sanger.artemis.FeatureVector; import uk.ac.sanger.artemis.components.MessageDialog; +import uk.ac.sanger.artemis.components.SequenceViewer; import uk.ac.sanger.artemis.components.StickyFileChooser; import uk.ac.sanger.artemis.components.variant.BCFReader.BCFReaderIterator; import uk.ac.sanger.artemis.io.Key; @@ -150,7 +151,7 @@ class IOUtils // get all CDS features that do not have the /pseudo qualifier final FeatureVector features = getFeatures( new FeatureKeyQualifierPredicate(Key.CDS, "pseudo", false), entryGroup); - exportFasta(entryGroup, vcfReaders, chr, vcfView, vcf_v4, features); + exportFasta(entryGroup, vcfReaders, chr, vcfView, vcf_v4, features, false); } @@ -159,7 +160,8 @@ class IOUtils final String chr, final VCFview vcfView, final boolean vcf_v4, - final FeatureVector features) + final FeatureVector features, + final boolean view) { String suffix = ".fasta"; if(features.size() == 1) @@ -169,9 +171,7 @@ class IOUtils { String vcfFileName = vcfReaders[i].getFileName(); try - { - File filterFile = getFile(vcfFileName, vcfReaders.length, suffix); - FileWriter writer = new FileWriter(filterFile); + { for (int j = 0; j < features.size(); j++) { Feature f = features.elementAt(j); @@ -193,17 +193,28 @@ class IOUtils } buff.append(segBases); } - + StringBuffer header = new StringBuffer(f.getSystematicName()); header.append(" "+f.getIDString()+" "); final String product = f.getProductString(); header.append( (product == null ? "undefined product" : product) ); header.append(" ").append(f.getWriteRange()); - writeSequence(writer, header.toString(), buff.toString()); + if(view) // sequence viewer + { + SequenceViewer viewer = + new SequenceViewer ("Feature base viewer for feature:" + + f.getIDString (), false); + 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(); + } } - - writer.close(); } catch (IOException e) { @@ -262,7 +273,11 @@ class IOUtils } else if(vcfRecord.getAlt().isMultiAllele()) { - + String base = MultipleAlleleVariant.getIUBCode(vcfRecord); + if(base != null) + buff.append(base); + else + buff.append(bases.charAt(position)); } else if(vcfRecord.getAlt().isNonVariant()) // non-variant { diff --git a/uk/ac/sanger/artemis/components/variant/MultipleAlleleVariant.java b/uk/ac/sanger/artemis/components/variant/MultipleAlleleVariant.java new file mode 100644 index 0000000000000000000000000000000000000000..756eb4cdfec276e06a9e4fe3573ed73de7d55c7f --- /dev/null +++ b/uk/ac/sanger/artemis/components/variant/MultipleAlleleVariant.java @@ -0,0 +1,65 @@ + +package uk.ac.sanger.artemis.components.variant; + +public class MultipleAlleleVariant +{ + + private static String IUB[][] = + { + {"m", "a", "c"}, + {"r", "a", "g"}, + {"w", "a", "t"}, + {"w", "a", "u"}, + {"s", "c", "g"}, + {"y", "c", "t"}, + {"y", "c", "u"}, + {"k", "g", "t"}, + {"k", "g", "u"} + }; + + /** + * M (A or C) + * R (A or G) + * W (A or T/U) + * S (C or G) + * Y (C or T/U) + * K (G or T/U) + * @param base + * @return + */ + protected static String getIUBCode(VCFRecord record) + { + String alt = record.getAlt().toString(); + String alleles[] = alt.split(","); + String pl; + if ((pl = record.getFormatValue("PL")) != null && pl.split(",").length == 3 && + pl.split(",")[1].equals("0")) + { + // include ref + String[] temp = new String[alleles.length+1]; + System.arraycopy(alleles, 0, temp, 0, alleles.length); + alleles = temp; + alleles[alleles.length-1] = record.getRef(); + } + + boolean isSNP = true; + for(int i=0; i<alleles.length; i++) + { + alleles[i] = alleles[i].toLowerCase(); + if(alleles[i].length() > 1) + isSNP = false; + } + + if(isSNP && alleles.length == 2) + { + for(int i=0; i<IUB.length; i++) + { + if(IUB[i][1].equals(alleles[0]) && IUB[i][2].equals(alleles[1]) || + IUB[i][1].equals(alleles[1]) && IUB[i][2].equals(alleles[0])) + return IUB[i][0]; + } + } + return null; + } + +} \ No newline at end of file