From: Ben Soares Date: Mon, 19 Dec 2022 18:18:40 +0000 (+0000) Subject: JAL-629 Add image output and quit X-Git-Tag: Release_2_11_4_0~503 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=a08e9842574394b84f2e79b060d55b6305afab33;p=jalview.git JAL-629 Add image output and quit --- diff --git a/src/jalview/bin/ArgParser.java b/src/jalview/bin/ArgParser.java index b18b088..0697193 100644 --- a/src/jalview/bin/ArgParser.java +++ b/src/jalview/bin/ArgParser.java @@ -59,7 +59,7 @@ public class ArgParser USAGESTATS, OPEN, OPEN2, PROPS, QUESTIONNAIRE, SETPROP, TREE, VDOC, VSESS, OUTPUT, OUTPUTTYPE, SSANNOTATION, NOTEMPFAC, TEMPFAC, TEMPFAC_LABEL, TEMPFAC_DESC, TEMPFAC_SHADING, TITLE, PAEMATRIX, WRAP, - NOSTRUCTURE, STRUCTURE; + NOSTRUCTURE, STRUCTURE, IMAGE, QUIT; static { @@ -109,6 +109,8 @@ public class ArgParser NOSTRUCTURE.setOptions(Opt.UNARY, Opt.LINKED); STRUCTURE.setOptions(Opt.STRING, Opt.LINKED, Opt.MULTI); WRAP.setOptions(Opt.BOOLEAN, Opt.LINKED); + IMAGE.setOptions(Opt.STRING, Opt.LINKED); + QUIT.setOptions(Opt.UNARY); } private final String[] argNames; @@ -667,9 +669,33 @@ public class ArgParser return sb.toString(); } - public static SubId getSubId(String item) + // Helper methods with safety checks + protected static ArgValues getArgValues(Map m, Arg a) { - return new SubId(item); + return m == null ? null : m.get(a); + } + + public static List getValues(Map m, Arg a) + { + ArgValues av = getArgValues(m, a); + return av == null ? null : av.getValues(); + } + + public static String getValue(Map m, Arg a) + { + List vals = getValues(m, a); + return (vals == null || vals.size() == 0) ? null : vals.get(0); + } + + public static boolean getBoolean(Map m, Arg a) + { + ArgValues av = getArgValues(m, a); + return av == null ? false : av.getBoolean(); + } + + public static SubVal getSubVal(String item) + { + return new SubVal(item); } /** @@ -678,7 +704,7 @@ public class ArgParser * the strings keyName and keyValue, and the content after the square brackets * (if present). Values not set `will be -1 or null. */ - public static class SubId + public static class SubVal { protected int index = 0; @@ -688,11 +714,7 @@ public class ArgParser protected String content = null; - public SubId() - { - } - - public SubId(String item) + public SubVal(String item) { this.parseVal(item); } @@ -719,9 +741,9 @@ public class ArgParser this.index = Integer.parseInt(indexString); } catch (NumberFormatException e) { - Console.warn("Failed to obtain sequenced id or index from '" - + item + "'. Setting index=0 and using content='" - + content + "'."); + Console.warn("Failed to obtain subvalue or index from '" + item + + "'. Setting index=0 and using content='" + content + + "'."); } } } diff --git a/src/jalview/bin/Commands.java b/src/jalview/bin/Commands.java index 1f904cd..2a71e74 100644 --- a/src/jalview/bin/Commands.java +++ b/src/jalview/bin/Commands.java @@ -14,7 +14,7 @@ import jalview.analysis.AlignmentUtils; import jalview.api.AlignmentViewPanel; import jalview.bin.ArgParser.Arg; import jalview.bin.ArgParser.ArgValues; -import jalview.bin.ArgParser.SubId; +import jalview.bin.ArgParser.SubVal; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; @@ -26,6 +26,7 @@ import jalview.io.DataSourceType; import jalview.io.FileFormatException; import jalview.io.FileFormatI; import jalview.io.FileLoader; +import jalview.io.HtmlSvgOutput; import jalview.io.IdentifyFile; import jalview.util.HttpUtils; import jalview.util.MessageManager; @@ -59,6 +60,12 @@ public class Commands { cmds.processLinked(id); } + cmds.processImages(id); + } + + if (argParser.getBool(Arg.QUIT)) + { + Jalview.getInstance().quit(); } } } @@ -94,13 +101,13 @@ public class Commands DataSourceType protocol = null; */ - if (m.get(Arg.OPEN) != null) + if (ArgParser.getArgValues(m, Arg.OPEN) != null) { long progress = -1; boolean first = true; AlignFrame af; - OPEN: for (String openFile : m.get(Arg.OPEN).getValues()) + OPEN: for (String openFile : ArgParser.getValues(m, Arg.OPEN)) { if (openFile == null) continue OPEN; @@ -181,19 +188,18 @@ public class Commands // get kind of temperature factor annotation AlignmentAnnotation.TFType tempfacType = null; - if ((m.get(Arg.NOTEMPFAC) == null - || !m.get(Arg.NOTEMPFAC).getBoolean()) - && m.get(Arg.TEMPFAC) != null) + if ((!ArgParser.getBoolean(m, Arg.NOTEMPFAC)) + && ArgParser.getArgValues(m, Arg.TEMPFAC) != null) { try { - tempfacType = AlignmentAnnotation.TFType - .valueOf(m.get(Arg.TEMPFAC).getValue() - .toUpperCase(Locale.ROOT)); + tempfacType = AlignmentAnnotation.TFType.valueOf(ArgParser + .getValue(m, Arg.TEMPFAC).toUpperCase(Locale.ROOT)); Console.debug("Obtained Temperature Factor type of '" + tempfacType + "'"); } catch (IllegalArgumentException e) { + // Just an error message! StringBuilder sb = new StringBuilder().append("Cannot set --") .append(Arg.TEMPFAC.getName()).append(" to '") .append(tempfacType) @@ -218,20 +224,19 @@ public class Commands tempfacType); // wrap alignment? - if (m.get(Arg.WRAP) != null && m.get(Arg.WRAP).getBoolean()) + if (ArgParser.getBoolean(m, Arg.WRAP)) { af.getCurrentView().setWrapAlignment(true); } // change alignment frame title - if (m.get(Arg.TITLE) != null) - af.setTitle(m.get(Arg.TITLE).getValue()); + if (ArgParser.getValue(m, Arg.TITLE) != null) + af.setTitle(ArgParser.getValue(m, Arg.TITLE)); /* hacky approach to hiding the annotations */ // show secondary structure annotations? - if (m.get(Arg.SSANNOTATION) != null) + if (ArgParser.getBoolean(m, Arg.SSANNOTATION)) { - boolean showSS = m.get(Arg.SSANNOTATION).getBoolean(); // do this better (annotation types?) AlignmentUtils.showOrHideSequenceAnnotations( af.getCurrentView().getAlignment(), @@ -240,8 +245,7 @@ public class Commands } // show temperature factor annotations? - if (m.get(Arg.NOTEMPFAC) != null - && m.get(Arg.NOTEMPFAC).getBoolean()) + if (ArgParser.getBoolean(m, Arg.NOTEMPFAC)) { // do this better (annotation types?) List hideThese = new ArrayList<>(); @@ -257,13 +261,13 @@ public class Commands if (showTemperatureFactor) */ { - if (m.get(Arg.TEMPFAC_LABEL) != null) + if (ArgParser.getValue(m, Arg.TEMPFAC_LABEL) != null) { AlignmentAnnotation aa = AlignmentUtils .getFirstSequenceAnnotationOfType( af.getCurrentView().getAlignment(), AlignmentAnnotation.LINE_GRAPH); - String label = m.get(Arg.TEMPFAC_LABEL).getValue(); + String label = ArgParser.getValue(m, Arg.TEMPFAC_LABEL); if (aa != null) { aa.label = label; @@ -309,18 +313,18 @@ public class Commands } // load a pAE file if given - if (m.get(Arg.PAEMATRIX) != null) + if (ArgParser.getValues(m, Arg.PAEMATRIX) != null) { AlignFrame af = afMap.get(id); if (af != null) { - for (String val : m.get(Arg.PAEMATRIX).getValues()) + for (String val : ArgParser.getValues(m, Arg.PAEMATRIX)) { - SubId subId = ArgParser.getSubId(val); - File paeFile = new File(subId.content); + SubVal subVal = ArgParser.getSubVal(val); + File paeFile = new File(subVal.content); EBIAlfaFold.addAlphaFoldPAE(af.getCurrentView().getAlignment(), - paeFile, subId.index, - "id".equals(subId.keyName) ? subId.keyValue : null); + paeFile, subVal.index, + "id".equals(subVal.keyName) ? subVal.keyValue : null); // required to readjust the height and position of the pAE // annotation for (AlignmentViewPanel ap : af.getAlignPanels()) @@ -332,15 +336,14 @@ public class Commands } // open the structure (from same PDB file or given PDBfile) - if (m.get(Arg.NOSTRUCTURE) == null - || !m.get(Arg.NOQUESTIONNAIRE).getBoolean()) + if (!ArgParser.getBoolean(m, Arg.NOSTRUCTURE)) { AlignFrame af = afMap.get(id); - if (m.get(Arg.STRUCTURE) != null) + if (ArgParser.getArgValues(m, Arg.STRUCTURE) != null) { - STRUCTURE: for (String val : m.get(Arg.STRUCTURE).getValues()) + STRUCTURE: for (String val : ArgParser.getValues(m, Arg.STRUCTURE)) { - SubId subId = new SubId(val); + SubVal subId = new SubVal(val); SequenceI seq = getSpecifiedSequence(af, subId); if (seq == null) { @@ -390,7 +393,57 @@ public class Commands } } - private SequenceI getSpecifiedSequence(AlignFrame af, SubId subId) + protected void processImages(String id) + { + Map m = argParser.linkedArgs(id); + AlignFrame af = afMap.get(id); + + if (af == null) + { + Console.warn("Did not have an alignment window for id=" + id); + return; + } + + if (ArgParser.getValues(m, Arg.IMAGE) != null) + { + for (String val : ArgParser.getValues(m, Arg.IMAGE)) + { + SubVal subVal = new SubVal(val); + String type = "png"; // default + String fileName = subVal.content; + File file = new File(fileName); + if ("type".equals(subVal.keyName)) + { + type = subVal.keyValue; + } + else if (fileName != null) + { + for (String ext : new String[] { "svg", "png", "html" }) + { + if (fileName.toLowerCase(Locale.ROOT).endsWith("." + ext)) + { + type = ext; + } + } + } + switch (type) + { + case "svg": + af.createSVG(file); + break; + case "png": + af.createPNG(file); + break; + case "html": + HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel); + htmlSVG.exportHTML(fileName); + break; + } + } + } + } + + private SequenceI getSpecifiedSequence(AlignFrame af, SubVal subId) { SequenceI seq = null; SequenceI[] sequences = af.getCurrentView().getAlignment()