From d79e3747b8ce78b1ac7aa83402e31b7e5dccfe1b Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Tue, 19 Sep 2023 10:48:29 +0100 Subject: [PATCH] JAL-629 Allow multiple structure images for multiple structure files for the one alignment. Add a {structurebasename} etc and {m} substitution which must be handled differently (on the fly) to other substitutions. --- src/jalview/bin/Commands.java | 36 +++++++------ src/jalview/bin/argparser/ArgParser.java | 83 ++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 17 deletions(-) diff --git a/src/jalview/bin/Commands.java b/src/jalview/bin/Commands.java index 9a85f1e..737c9eb 100644 --- a/src/jalview/bin/Commands.java +++ b/src/jalview/bin/Commands.java @@ -456,35 +456,31 @@ public class Commands + Arg.STRUCTURE.argString() + "=" + val); continue; } + String structureFilename = null; File structureFile = null; if (subVals.getContent() != null && subVals.getContent().length() != 0) { - structureFile = new File(subVals.getContent()); + structureFilename = subVals.getContent(); Console.debug("Using structure file (from argument) '" - + structureFile.getAbsolutePath() + "'"); + + structureFilename + "'"); + structureFile = new File(structureFilename); } - // TRY THIS - /* - * PDBEntry fileEntry = new AssociatePdbFileWithSeq() - * .associatePdbWithSeq(selectedPdbFileName, DataSourceType.FILE, - * selectedSequence, true, Desktop.instance); - * - * sViewer = launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap, new - * SequenceI[] { selectedSequence }); - * - */ /* THIS DOESN'T WORK */ else if (seq.getAllPDBEntries() != null && seq.getAllPDBEntries().size() > 0) { structureFile = new File( seq.getAllPDBEntries().elementAt(0).getFile()); - Console.debug("Using structure file (from sequence) '" - + structureFile.getAbsolutePath() + "'"); + if (structureFile != null) + { + Console.debug("Using structure file (from sequence) '" + + structureFile.getAbsolutePath() + "'"); + } + structureFilename = structureFile.getAbsolutePath(); } - if (structureFile == null) + if (structureFilename == null || structureFile == null) { addWarn("Not provided structure file with '" + val + "'"); continue; @@ -500,6 +496,8 @@ public class Commands Console.debug("Using structure file " + structureFile.getAbsolutePath()); + argParser.setStructureFilename(structureFilename); + // open structure view AlignmentPanel ap = af.alignPanel; if (headless) @@ -634,8 +632,8 @@ public class Commands for (ArgValue structureImageArgValue : avm .getArgValueList(Arg.STRUCTUREIMAGE)) { - String structureImageFilename = structureImageArgValue - .getValue(); + String structureImageFilename = argParser.makeSubstitutions( + structureImageArgValue.getValue(), id, true); if (structureViewer != null && structureImageFilename != null) { SubVals structureImageSubVals = null; @@ -682,6 +680,10 @@ public class Commands this.colourAlignFrame(af, imageColour); List extraCommands = new ArrayList<>(); + // these don't actually do anything to the output image since we + // renderScreenImage + // extraCommands.add("set antialiasImages on"); + // extraCommands.add("set antialiasTranslucent on"); String bgcolour = avm.getValueFromSubValOrArg( structureImageArgValue, Arg.BGCOLOUR, diff --git a/src/jalview/bin/argparser/ArgParser.java b/src/jalview/bin/argparser/ArgParser.java index fd42bb2..1b8e6ad 100644 --- a/src/jalview/bin/argparser/ArgParser.java +++ b/src/jalview/bin/argparser/ArgParser.java @@ -119,6 +119,46 @@ public class ArgParser private static final String LINKEDIDDIRNAME = "{dirname}"; /** + * On-the-fly substitution (not made at argument parsing time)! the current + * structure filename extension + */ + private static final String STRUCTUREEXTENSION = "{structureextension}"; + + /** + * On-the-fly substitution (not made at argument parsing time)! the current + * structure filename base + */ + private static final String STRUCTUREBASENAME = "{structurebasename}"; + + /** + * On-the-fly substitution (not made at argument parsing time)! the current + * structure filename dir path + */ + private static final String STRUCTUREDIRNAME = "{structuredirname}"; + + /** + * On-the-fly substitution (not made at argument parsing time)! increment the + * on-the-fly counter and substitute the incremented value + */ + private static final String INCREMENTONTHEFLYCOUNTER = "{++m}"; + + /** + * On-the-fly substitution (not made at argument parsing time)! the current + * substitute with the on-the-fly counter + */ + private static final String ONTHEFLYCOUNTER = "{m}"; + + /** + * the string used for on-the-fly structure filename substitutions + */ + private String currentStructureFilename = null; + + /** + * the counter used for on-the-fly {m} substitutions + */ + private int ontheflyCounter = 0; + + /** * the current argfile */ private String argFile = null; @@ -724,6 +764,12 @@ public class ArgParser public String makeSubstitutions(String val, String linkedId) { + return makeSubstitutions(val, linkedId, false); + } + + public String makeSubstitutions(String val, String linkedId, + boolean onthefly) + { if (!this.substitutions || val == null) return val; @@ -743,14 +789,20 @@ public class ArgParser rest = val; } if (rest.contains(LINKEDIDAUTOCOUNTER)) + { rest = rest.replace(LINKEDIDAUTOCOUNTER, String.valueOf(linkedIdAutoCounter)); + } if (rest.contains(INCREMENTLINKEDIDAUTOCOUNTER)) + { rest = rest.replace(INCREMENTLINKEDIDAUTOCOUNTER, String.valueOf(++linkedIdAutoCounter)); + } if (rest.contains(DEFAULTLINKEDIDCOUNTER)) + { rest = rest.replace(DEFAULTLINKEDIDCOUNTER, String.valueOf(defaultLinkedIdCounter)); + } ArgValuesMap avm = linkedArgs.get(linkedId); if (avm != null) { @@ -780,6 +832,32 @@ public class ArgParser FileUtils.getDirname(new File(argFile))); } } + if (onthefly) + { + if (rest.contains(ONTHEFLYCOUNTER)) + { + rest = rest.replace(ONTHEFLYCOUNTER, + String.valueOf(ontheflyCounter)); + } + if (rest.contains(INCREMENTONTHEFLYCOUNTER)) + { + rest = rest.replace(INCREMENTONTHEFLYCOUNTER, + String.valueOf(++ontheflyCounter)); + } + if (currentStructureFilename != null) + { + if (rest.contains(STRUCTUREBASENAME)) + { + rest = rest.replace(STRUCTUREBASENAME, FileUtils + .getBasename(new File(currentStructureFilename))); + } + if (rest.contains(STRUCTUREDIRNAME)) + { + rest = rest.replace(STRUCTUREDIRNAME, + FileUtils.getDirname(new File(currentStructureFilename))); + } + } + } return new StringBuilder(subvals).append(rest).toString(); } @@ -1203,4 +1281,9 @@ public class ArgParser return mixedExamples; } + public void setStructureFilename(String s) + { + this.currentStructureFilename = s; + } + } \ No newline at end of file -- 1.7.10.2