X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fapplications%2FVARNAcmd.java;fp=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fapplications%2FVARNAcmd.java;h=7b16c6183361c9c0b0a1443a75f89fec8dc6b8c4;hb=8a43b8353b89a47002ef17c959ed61281fc4d826;hp=0000000000000000000000000000000000000000;hpb=55bfdb07355198ae1a1a8b5e14933b4669113ca6;p=jalview.git diff --git a/srcjar/fr/orsay/lri/varna/applications/VARNAcmd.java b/srcjar/fr/orsay/lri/varna/applications/VARNAcmd.java new file mode 100644 index 0000000..7b16c61 --- /dev/null +++ b/srcjar/fr/orsay/lri/varna/applications/VARNAcmd.java @@ -0,0 +1,529 @@ +/* + VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases. + Copyright (C) 2008 Kevin Darty, Alain Denise and Yann Ponty. + electronic mail : Yann.Ponty@lri.fr + paper mail : LRI, bat 490 Université Paris-Sud 91405 Orsay Cedex France + + This file is part of VARNA version 3.1. + VARNA version 3.1 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. + + VARNA version 3.1 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 VARNA version 3.1. + If not, see http://www.gnu.org/licenses. + */ +package fr.orsay.lri.varna.applications; + + +import java.awt.Graphics2D; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Hashtable; +import java.util.Vector; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.FileImageOutputStream; +import javax.swing.JFrame; + +import fr.orsay.lri.varna.VARNAPanel; +import fr.orsay.lri.varna.exceptions.ExceptionExportFailed; +import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax; +import fr.orsay.lri.varna.exceptions.ExceptionJPEGEncoding; +import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed; +import fr.orsay.lri.varna.exceptions.ExceptionModeleStyleBaseSyntaxError; +import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength; +import fr.orsay.lri.varna.exceptions.ExceptionParameterError; +import fr.orsay.lri.varna.exceptions.ExceptionPermissionDenied; +import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses; +import fr.orsay.lri.varna.exceptions.ExceptionWritingForbidden; +import fr.orsay.lri.varna.factories.RNAFactory; +import fr.orsay.lri.varna.interfaces.InterfaceParameterLoader; +import fr.orsay.lri.varna.models.FullBackup; +import fr.orsay.lri.varna.models.VARNAConfig; +import fr.orsay.lri.varna.models.VARNAConfigLoader; +import fr.orsay.lri.varna.models.rna.RNA; + +public class VARNAcmd implements InterfaceParameterLoader { + + public class ExitCode extends Exception{ + /** + * + */ + private static final long serialVersionUID = -3011196062868355584L; + private int _c; + private String _msg; + public ExitCode(int c,String msg){ + _c = c; + _msg = msg; + } + public int getExitCode(){ + return _c; + } + public String getExitMessage(){ + return _msg; + } + } + + + private Hashtable _optsValues = new Hashtable(); + private Hashtable _basicOptsInv = new Hashtable(); + private String _inFile = ""; + private String _outFile = ""; + int _baseWidth = 400; + double _scale = 1.0; + float _quality = 0.9f; + + private String[] _basicOptions = { VARNAConfigLoader.algoOpt, + VARNAConfigLoader.bpStyleOpt, VARNAConfigLoader.bondColorOpt, + VARNAConfigLoader.backboneColorOpt, VARNAConfigLoader.periodNumOpt, + VARNAConfigLoader.baseInnerColorOpt, + VARNAConfigLoader.baseOutlineColorOpt, + + }; + + public VARNAcmd(Vector args) throws ExitCode { + for (int j = 0; j < _basicOptions.length; j++) { + _basicOptsInv.put(_basicOptions[j], _basicOptions[j]); + } + int i = 0; + while (i < args.size()) { + String opt = args.elementAt(i); + if (opt.charAt(0) != '-') { + errorExit("Missing or unknown option \"" + opt + "\""); + } + if (opt.equals("-h")) { + displayLightHelpExit(); + } + if (opt.equals("-x")) { + displayDetailledHelpExit(); + } else { + if (i + 1 >= args.size()) { + errorExit("Missing argument for option \"" + opt + "\""); + } + String val = args.get(i + 1); + if (opt.equals("-i")) { + _inFile = val; + } else if (opt.equals("-o")) { + _outFile = val; + } else if (opt.equals("-quality")) { + _quality = Float.parseFloat(val); + } else if (opt.equals("-resolution")) { + _scale = Float.parseFloat(val); + } else { + addOption(opt, val); + } + } + i += 2; + } + } + + public void addOption(String key, String value) { + if (key.equals("-i")) { + _inFile = value; + } else if (key.equals("-o")) { + _outFile = value; + } else { + _optsValues.put(key.substring(1), value); + } + } + + private String getDescription() { + return "VARNA v" + + VARNAConfig.MAJOR_VERSION + + "." + + VARNAConfig.MINOR_VERSION + + " Assisted drawing of RNA secondary structure (Command Line version)"; + } + + private String indent(int k) { + String result = ""; + for (int i = 0; i < k; i++) { + result += " "; + } + return result; + } + + private String complete(String s, int k) { + String result = s; + while (result.length() < k) { + result += " "; + } + return result; + } + + Vector matrix = new Vector(); + + private void addLine(String opt, String val) { + String[] line = { opt, val }; + matrix.add(line); + } + + private static int MAX_WIDTH = 100; + + @SuppressWarnings("unchecked") + private void printMatrix(int ind) { + String[][] values = new String[matrix.size()][]; + matrix.toArray(values); + Arrays.sort(values, new Comparator() { + public int compare(Object o1, Object o2) { + String[] tab1 = (String[]) o1; + String[] tab2 = (String[]) o2; + return tab1[0].compareTo(tab2[0]); + } + }); + + int maxSize = 0; + for (int i = 0; i < values.length; i++) { + String[] elem = values[i]; + maxSize = Math.max(maxSize, elem[0].length()); + } + maxSize += ind + 2; + for (int i = 0; i < values.length; i++) { + String[] elem = values[i]; + String opt = elem[0]; + String msg = elem[1]; + opt = complete("", ind) + "-" + complete(opt, maxSize - ind); + System.out.println(opt + msg.substring(0, Math.min(MAX_WIDTH - opt.length(), msg.length()))); + if (opt.length() + msg.length() >= MAX_WIDTH) { + int off = MAX_WIDTH - opt.length(); + while (off < msg.length()) { + String nmsg = msg.substring(off, Math.min(off + MAX_WIDTH + - opt.length(), msg.length())); + System.out.println(complete("", opt.length())+nmsg); + off += MAX_WIDTH - opt.length(); + } + } + } + matrix = new Vector(); + } + + private void printUsage() { + System.out + .println("Usage: java -cp . [-i InFile|-sequenceDBN XXX -structureDBN YYY] -o OutFile [Options]"); + System.out.println("Where:"); + System.out.println(indent(1) + + "OutFile\tSupported formats: {JPEG,PNG,EPS,XFIG,SVG}"); + System.out + .println(indent(1) + + "InFile\tSecondary structure file: Supported formats: {BPSEQ,CT,RNAML,DBN}"); + + } + + private void printHelpOptions() { + System.out.println("\nMain options:"); + addLine("h", "Displays a short description of main options and exits"); + addLine("x", "Displays a detailled description of all options"); + printMatrix(2); + } + + private void printMainOptions(String[][] info) { + System.out.println("\nMain options:"); + addLine("h", "Displays a short description of main options and exits"); + addLine("x", "Displays a detailled description of all options"); + for (int i = 0; i < info.length; i++) { + String key = info[i][0]; + if (_basicOptsInv.containsKey(key)) { + addLine(key, info[i][2]); + } + } + printMatrix(2); + } + + private void printAdvancedOptions(String[][] info) { + System.out.println("\nAdvanced options:"); + for (int i = 0; i < info.length; i++) { + String key = info[i][0]; + if (!_basicOptsInv.containsKey(key)) { + addLine(key, info[i][2]); + } + } + addLine("quality", "Sets quality (non-vector file formats only)"); + addLine("resolution", "Sets resolution (non-vector file formats only)"); + printMatrix(2); + } + + private void displayLightHelpExit() throws ExitCode { + String[][] info = VARNAConfigLoader.getParameterInfo(); + System.out.println(getDescription()); + printUsage(); + printMainOptions(info); + throw(new ExitCode(1,"")); + } + + private void displayDetailledHelpExit() throws ExitCode { + String[][] info = VARNAConfigLoader.getParameterInfo(); + System.out.println(getDescription()); + printUsage(); + printMainOptions(info); + printAdvancedOptions(info); + throw(new ExitCode(1,"")); + } + + private void errorExit(String msg) throws ExitCode { + System.out.println(getDescription()); + System.out.println("Error: " + msg + "\n"); + printUsage(); + printHelpOptions(); + throw(new ExitCode(1,"")); + } + + public String getParameterValue(String key, String def) { + if (_optsValues.containsKey(key)) { + return _optsValues.get(key); + } + return def; + } + + public String formatOutputPath(String base,int index, int total) + { + String result = base; + + if (total>1) + { + int indexDot = base.lastIndexOf('.'); + String pref; + String ext; + if (indexDot!=-1) + { + pref = base.substring(0,indexDot); + ext = base.substring(indexDot); + } + else{ + pref=base; + ext=""; + } + result = pref+"-"+index+ext; + } + System.err.println("Output file: "+result); + return result; + } + + public void run() throws IOException, ExitCode { + VARNAConfigLoader VARNAcfg = new VARNAConfigLoader(this); + ArrayList vpl; + ArrayList confs = new ArrayList(); + try { + if (!_inFile.equals("")) { + if (!_inFile.toLowerCase().endsWith(".varna")) { + Collection rnas = RNAFactory.loadSecStr(_inFile); + if (rnas.isEmpty()) + { + FullBackup f = null; + try{ + f = VARNAPanel.importSession(new FileInputStream(_inFile), _inFile); + confs.add(f); + } + catch(Exception e) + { + e.printStackTrace(); + } + if (f==null) + { + throw new ExceptionFileFormatOrSyntax("No RNA could be parsed from file '"+_inFile+"'."); + } + } + else{ + for (RNA r: rnas) + { + confs.add(new FullBackup(r,_inFile)); + } + } + } + else{ + confs.add(VARNAPanel.importSession(_inFile)); + } + } else { + RNA r = new RNA(); + r.setRNA(this.getParameterValue("sequenceDBN", + ""), this.getParameterValue( + "structureDBN", "")); + confs.add(new FullBackup(r,"From Params")); + } + if (!_outFile.equals("")) + { + int index = 1; + for (FullBackup r: confs) + { + VARNAcfg.setRNA(r.rna); + vpl = VARNAcfg.createVARNAPanels(); + if (vpl.size() > 0) { + VARNAPanel _vp = vpl.get(0); + if (r.hasConfig()) + { + _vp.setConfig(r.config); + } + RNA _rna = _vp.getRNA(); + Rectangle2D.Double bbox = _vp.getRNA().getBBox(); + //System.out.println(_vp.getRNA().getBBox()); + + if (_outFile.toLowerCase().endsWith(".jpeg") + || _outFile.toLowerCase().endsWith(".jpg") + || _outFile.toLowerCase().endsWith(".png")) + { + _vp.setTitleFontSize((int)(_scale*_vp.getTitleFont().getSize())); + _vp.setSize((int)(_baseWidth*_scale), (int)((_scale*_baseWidth*bbox.height)/((double)bbox.width))); + } + + if (_outFile.toLowerCase().endsWith(".eps")) { + _rna.saveRNAEPS(formatOutputPath(_outFile,index, confs.size()), _vp.getConfig()); + } else if (_outFile.toLowerCase().endsWith(".xfig") + || _outFile.toLowerCase().endsWith(".fig")) { + _rna.saveRNAXFIG(formatOutputPath(_outFile,index, confs.size()), _vp.getConfig()); + } else if (_outFile.toLowerCase().endsWith(".svg")) { + _rna.saveRNASVG(formatOutputPath(_outFile,index, confs.size()), _vp.getConfig()); + } else if (_outFile.toLowerCase().endsWith(".jpeg") + || _outFile.toLowerCase().endsWith(".jpg")) { + this.saveToJPEG(formatOutputPath(_outFile,index, confs.size()), _vp); + } else if (_outFile.toLowerCase().endsWith(".png")) { + this.saveToPNG(formatOutputPath(_outFile,index, confs.size()), _vp); + } else if (_outFile.toLowerCase().endsWith(".varna")) { + _vp.saveSession(formatOutputPath(_outFile,index, confs.size())); + } else { + errorExit("Unknown extension for output file \"" + _outFile + + "\""); + } + } + index++; + } + } + // No output file => Open GUI + else + { + VARNAGUI d = new VARNAGUI(); + d.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + d.pack(); + d.setVisible(true); + for (FullBackup b: confs) + { + RNA r = b.rna; + VARNAcfg.setRNA(r); + vpl = VARNAcfg.createVARNAPanels(); + if (vpl.size() > 0) { + VARNAPanel _vp = vpl.get(0); + VARNAConfig cfg = _vp.getConfig(); + if (b.hasConfig()) + { + cfg = b.config; + } + RNA rna = _vp.getRNA(); + d.addRNA(rna, cfg); + + } + } + } + } catch (ExceptionWritingForbidden e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionJPEGEncoding e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionParameterError e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionModeleStyleBaseSyntaxError e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionNonEqualLength e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionUnmatchedClosingParentheses e) { + e.printStackTrace(); + System.exit(1); + } catch (ExceptionExportFailed e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionPermissionDenied e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionLoadingFailed e) { + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (ExceptionFileFormatOrSyntax e) { + e.setPath(_inFile); + e.printStackTrace(); + throw(new ExitCode(1,"")); + } catch (FileNotFoundException e) { + throw(new ExitCode(1,"Error: Missing input file \""+_inFile+"\".")); + } + + if (!_outFile.equals("")) + throw(new ExitCode(0,"")); + + + + } + + public void saveToJPEG(String filename, VARNAPanel vp) + throws ExceptionJPEGEncoding, ExceptionExportFailed { + + BufferedImage myImage = new BufferedImage((int) Math.round(vp + .getWidth() + ), (int) Math.round(vp.getHeight() ), + BufferedImage.TYPE_INT_RGB); + Graphics2D g2 = myImage.createGraphics(); + vp.paintComponent(g2); + try { + FileImageOutputStream out = new FileImageOutputStream(new File(filename)); + ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); + ImageWriteParam params = writer.getDefaultWriteParam(); + params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + params.setCompressionQuality(_quality); + writer.setOutput(out); + IIOImage myIIOImage = new IIOImage(myImage, null, null); + writer.write(null, myIIOImage, params); + out.close(); + } catch (IOException e) { + throw new ExceptionExportFailed(e.getMessage(), filename); + } + + } + + public void saveToPNG(String filename, VARNAPanel vp) + throws ExceptionExportFailed { + BufferedImage myImage = new BufferedImage((int) Math.round(vp + .getWidth()), (int) Math.round(vp.getHeight() ), + BufferedImage.TYPE_INT_RGB); + Graphics2D g2 = myImage.createGraphics(); + vp.paintComponent(g2); + g2.dispose(); + try { + ImageIO.write(myImage, "PNG", new File(filename)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] argv) { + Vector opts = new Vector(); + for (int i = 0; i < argv.length; i++) { + opts.add(argv[i]); + } + try { + VARNAcmd app = new VARNAcmd(opts); + app.run(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ExitCode e) { + System.err.println(e.getExitMessage()); + System.exit(e.getExitCode()); + } + } + +}