X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FRnamlFile.java;h=4d3ddc17241ba7cdd0b60123fd438e363efcc4a2;hb=f96e6a945e2df8a844f428c08cfc08210d937fc0;hp=f108994245433ec0c4d33d39760302403ec412b3;hpb=1d4403dfba9413411408708a2d84d1b2b3f5b782;p=jalview.git diff --git a/src/jalview/io/RnamlFile.java b/src/jalview/io/RnamlFile.java index f108994..4d3ddc1 100644 --- a/src/jalview/io/RnamlFile.java +++ b/src/jalview/io/RnamlFile.java @@ -1,32 +1,40 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along with Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.io; +import jalview.analysis.Rna; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; +import jalview.util.MessageManager; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.List; + +import com.stevesoft.pat.Regex; import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; @@ -46,7 +54,7 @@ public class RnamlFile extends AlignFile } - public RnamlFile(String inFile, String type) throws IOException + public RnamlFile(String inFile, DataSourceType type) throws IOException { super(inFile, type); @@ -58,20 +66,6 @@ public class RnamlFile extends AlignFile } - // public RnamlFile(BufferedReader r) throws IOException, - // ExceptionFileFormatOrSyntax, ParserConfigurationException, SAXException, - // ExceptionPermissionDenied, ExceptionLoadingFailed - // { - // super(); - // parse(r); - // // sets the index of each sequence in the alignment - // for( int i=0,c=seqs.size(); i-1 || System.getProperty("java.version").indexOf("1.5")>-1) + if (System.getProperty("java.version").indexOf("1.6") > -1 + || System.getProperty("java.version").indexOf("1.5") > -1) { - // patch for 'This parser does not support specification "null" version "null"' error - // this hack ensures we get a properly updated SAXParserFactory on older JVMs + // patch for 'This parser does not support specification "null" version + // "null"' error + // this hack ensures we get a properly updated SAXParserFactory on older + // JVMs // thanks to Stefan Birkner over at https://coderwall.com/p/kqsrrw - System.setProperty("javax.xml.parsers.SAXParserFactory", "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); + System.setProperty("javax.xml.parsers.SAXParserFactory", + "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl"); } - result = null; + // rather than lose exception semantics whilst parsing RNAML with VARNA we + // wrap the routine and catch all exceptions before passing them up the + // chain as an IOException try { - result = RNAFactory.loadSecStrRNAML(getReader()); - + _parse(); } catch (ExceptionPermissionDenied pdx) { - errormessage = "Couldn't access datasource (" + pdx.getMessage() - + ")"; + errormessage = MessageManager.formatMessage( + "exception.rnaml_couldnt_access_datasource", new String[] + { pdx.getMessage() }); throw new IOException(pdx); } catch (ExceptionLoadingFailed lf) { - errormessage = "Couldn't process data as RNAML file (" - + lf.getMessage() + ")"; + errormessage = MessageManager.formatMessage( + "exception.ranml_couldnt_process_data", new String[] + { lf.getMessage() }); throw new IOException(lf); } catch (ExceptionFileFormatOrSyntax iff) { - errormessage = "Invalid RNAML file (" + iff.getMessage() + ")"; + errormessage = MessageManager + .formatMessage("exception.ranml_invalid_file", new String[] + { iff.getMessage() }); throw new IOException(iff); + } catch (Exception x) + { + error = true; + errormessage = MessageManager.formatMessage( + "exception.ranml_problem_parsing_data", new String[] + { x.getMessage() }); + throw new IOException(errormessage, x); } + } + + @SuppressWarnings("unchecked") + public void _parse() + throws FileNotFoundException, ExceptionPermissionDenied, + ExceptionLoadingFailed, ExceptionFileFormatOrSyntax + { + + result = RNAFactory.loadSecStrRNAML(getReader()); - SequenceI[] seqs = new SequenceI[result.size()]; + // ArrayList allarray = new ArrayList(); + // ArrayList> BP = new ArrayList(); + // ArrayList strucinarray = new ArrayList(); + SequenceI[] sqs = new SequenceI[result.size()]; for (int i = 0; i < result.size(); i++) { - // DEBUG System.err.println("RNAML entry "+i); + RNA current = result.get(i); - String seq = current.getSeq(); - // DEBUG System.err.println(seq); String rna = current.getStructDBN(true); - // DEBUG System.err.println(rna); - + String seq = current.getSeq(); int begin = 1; - int end = seq.length(); // TODO: compute non-gapped length for sequence + int end = seq.length(); id = current.getName(); - seqs[i] = new Sequence(id, seq, begin, end); + if (id == null || id.trim().length() == 0) + { + id = safeName(getDataName()); + if (result.size() > 1) + { + id += "." + i; + } + } + sqs[i] = new Sequence(id, seq, begin, end); + sqs[i].setEnd(sqs[i].findPosition(sqs[i].getLength())); String[] annot = new String[rna.length()]; Annotation[] ann = new Annotation[rna.length()]; for (int j = 0; j < rna.length(); j++) { - annot[j] = rna.substring(j, j + 1); + annot[j] = "" + rna.charAt(j); } - for (int k = 0; k < rna.length(); k++) { ann[k] = new Annotation(annot[k], "", - jalview.schemes.ResidueProperties.getRNASecStrucState( - annot[k]).charAt(0), 0f); - + Rna.getRNASecStrucState(annot[k]).charAt(0), 0f); } - AlignmentAnnotation align = new AlignmentAnnotation("Sec. str.", - current.getID(), ann); - seqs[i].addAlignmentAnnotation(align); - seqs[i].setRNA(result.get(i)); + AlignmentAnnotation align = new AlignmentAnnotation( + "Secondary Structure", + current.getID().trim().length() > 0 + ? "Secondary Structure for " + current.getID() + : "", + ann); + + sqs[i].addAlignmentAnnotation(align); + sqs[i].setRNA(result.get(i)); + + // allarray.add(strucinarray); + annotations.addElement(align); + // BP.add(align.bps); + } - setSeqs(seqs); + + setSeqs(sqs); } - public static String print(SequenceI[] s) + @Override + public String print(SequenceI[] s, boolean jvSuffix) { - // TODO: implement RNAML export option return "not yet implemented"; } - public String print() + public List getRNA() { - return print(getSeqsAsArray()); + return result; } + // public static void main(String[] args) { + // Pattern p= Pattern.compile("(.+)[.][^.]+"); + // Matcher m = p.matcher("toto.xml.zip"); + // System.out.println(m.matches()); + // System.out.println(m.group(1)); + // } /** * make a friendly ID string. * @@ -174,13 +222,18 @@ public class RnamlFile extends AlignFile private String safeName(String dataName) { int b = 0; - while ((b = dataName.indexOf("/")) > -1 && b < dataName.length()) + if ((b = dataName.lastIndexOf(".")) > 0) { - dataName = dataName.substring(b + 1).trim(); - + dataName = dataName.substring(0, b - 1); + } + b = 0; + Regex m = new Regex("[\\/]?([-A-Za-z0-9]+)\\.?"); + String mm = dataName; + while (m.searchFrom(dataName, b)) + { + mm = m.stringMatched(); + b = m.matchedTo(); } - int e = (dataName.length() - dataName.indexOf(".")) + 1; - dataName = dataName.substring(1, e).trim(); - return dataName; + return mm; } }