/* * 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 * * 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. * * 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 . */ package jalview.io; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; import fr.orsay.lri.varna.factories.RNAFactory; import fr.orsay.lri.varna.models.rna.RNA; public class RnamlFile extends AlignFile { public String id; protected ArrayList result; public RnamlFile() { super(); } public RnamlFile(String inFile, String type) throws IOException { super(inFile, type); } public RnamlFile(FileParse source) throws IOException { super(source); } // 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) { // 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"); } result = null; try { result = RNAFactory.loadSecStrRNAML(getReader()); } catch (ExceptionPermissionDenied pdx) { errormessage = "Couldn't access datasource (" + pdx.getMessage() + ")"; throw new IOException(pdx); } catch (ExceptionLoadingFailed lf) { errormessage = "Couldn't process data as RNAML file (" + lf.getMessage() + ")"; throw new IOException(lf); } catch (ExceptionFileFormatOrSyntax iff) { errormessage = "Invalid RNAML file (" + iff.getMessage() + ")"; throw new IOException(iff); } SequenceI[] seqs = 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); int begin = 1; int end = seq.length(); // TODO: compute non-gapped length for sequence id = current.getName(); seqs[i] = new Sequence(id, seq, begin, end); 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); } for (int k = 0; k < rna.length(); k++) { ann[k] = new Annotation(annot[k], "", jalview.schemes.ResidueProperties.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)); annotations.addElement(align); } setSeqs(seqs); } public static String print(SequenceI[] s) { // TODO: implement RNAML export option return "not yet implemented"; } public String print() { return print(getSeqsAsArray()); } /** * make a friendly ID string. * * @param dataName * @return truncated dataName to after last '/' */ private String safeName(String dataName) { int b = 0; while ((b = dataName.indexOf("/")) > -1 && b < dataName.length()) { dataName = dataName.substring(b + 1).trim(); } int e = (dataName.length() - dataName.indexOf(".")) + 1; dataName = dataName.substring(1, e).trim(); return dataName; } }