JAL-629 fixing test EBIAlphaFoldTest.checkImportPAEToStructure(). not fixed yet
[jalview.git] / src / jalview / bin / Commands.java
index 679fbf4..30fdc30 100644 (file)
@@ -14,11 +14,11 @@ import java.util.Locale;
 import java.util.Map;
 
 import jalview.analysis.AlignmentUtils;
+import jalview.api.structures.JalviewStructureDisplayI;
 import jalview.bin.argparser.Arg;
 import jalview.bin.argparser.ArgParser;
 import jalview.bin.argparser.ArgParser.Position;
 import jalview.bin.argparser.ArgValue;
-import jalview.bin.argparser.ArgValues;
 import jalview.bin.argparser.ArgValuesMap;
 import jalview.bin.argparser.SubVals;
 import jalview.datamodel.AlignmentI;
@@ -26,6 +26,7 @@ import jalview.datamodel.SequenceI;
 import jalview.datamodel.annotations.AlphaFoldAnnotationRowBuilder;
 import jalview.gui.AlignFrame;
 import jalview.gui.AlignmentPanel;
+import jalview.gui.AppJmol;
 import jalview.gui.Desktop;
 import jalview.gui.Preferences;
 import jalview.gui.StructureChooser;
@@ -45,9 +46,13 @@ import jalview.io.IdentifyFile;
 import jalview.io.NewickFile;
 import jalview.structure.StructureImportSettings.TFType;
 import jalview.structure.StructureSelectionManager;
+import jalview.util.FileUtils;
 import jalview.util.HttpUtils;
+import jalview.util.ImageMaker;
+import jalview.util.ImageMaker.TYPE;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
+import jalview.util.imagemaker.BitmapImageSizing;
 
 public class Commands
 {
@@ -73,7 +78,7 @@ public class Commands
     argParser = argparser;
     headless = h;
     desktop = d;
-    afMap = new HashMap<String, AlignFrame>();
+    afMap = new HashMap<>();
     if (argparser != null)
     {
       processArgs(argparser, headless);
@@ -447,14 +452,6 @@ public class Commands
           Console.debug("Using structure file "
                   + structureFile.getAbsolutePath());
 
-          // ##### Does this need to happen? Follow
-          // openStructureFileForSequence() below
-          /*
-          PDBEntry fileEntry = new AssociatePdbFileWithSeq()
-                  .associatePdbWithSeq(structureFile.getAbsolutePath(),
-                          DataSourceType.FILE, seq, true, Desktop.instance);
-                          */
-
           // open structure view
           AlignmentPanel ap = af.alignPanel;
           if (headless)
@@ -496,18 +493,10 @@ public class Commands
                   .getFromSubValArgOrPrefWithSubstitutions(argParser, avm,
                           Arg.TEMPFAC, Position.AFTER, av, subVals, null,
                           null, null);
-          boolean notempfac = ArgParser.getBoolFromSubValOrArg(avm,
-                  Arg.NOTEMPFAC, subVals);
+          boolean notempfac = ArgParser.getFromSubValArgOrPref(avm,
+                  Arg.NOTEMPFAC, subVals, null, "ADD_TEMPFACT_ANN", false,
+                  true);
           TFType tft = notempfac ? null : TFType.DEFAULT;
-          /*
-          String tftString = subVals.get("tempfac");
-          ArgValue tftAv = getArgAssociatedWithStructure(Arg.TEMPFAC, avm,
-                  af, structureFilepath);
-          if (tftString == null && tftAv != null)
-          {
-            tftString = tftAv.getSubVals().getContent();
-          }
-          */
           if (tftString != null && !notempfac)
           {
             // get kind of temperature factor annotation
@@ -553,14 +542,82 @@ public class Commands
             }
           }
 
-          boolean addTempFac = notempfac ? false
-                  : ((tft != null)
-                          || Cache.getDefault("ADD_TEMPFACT_ANN", false));
-
           // TODO use ssFromStructure
-          StructureChooser.openStructureFileForSequence(null, null, ap, seq,
-                  false, structureFilepath, tft, paeFilepath, false,
-                  ssFromStructure, false, viewerType);
+          StructureViewer sv = StructureChooser
+                  .openStructureFileForSequence(null, null, ap, seq, false,
+                          structureFilepath, tft, paeFilepath, false,
+                          ssFromStructure, false, viewerType);
+
+          if (headless)
+          {
+            sv.setAsync(false);
+          }
+
+          String structureImageFilename = ArgParser.getValueFromSubValOrArg(
+                  avm, av, Arg.STRUCTUREIMAGE, subVals);
+          if (sv != null && structureImageFilename != null)
+          {
+            ArgValue siAv = avm.getClosestNextArgValueOfArg(av,
+                    Arg.STRUCTUREIMAGE);
+            SubVals sisv = null;
+            if (structureImageFilename.equals(siAv.getValue()))
+            {
+              sisv = siAv.getSubVals();
+            }
+            File structureImageFile = new File(structureImageFilename);
+            String width = ArgParser.getValueFromSubValOrArg(avm, av,
+                    Arg.STRUCTUREIMAGEWIDTH, sisv);
+            String height = ArgParser.getValueFromSubValOrArg(avm, av,
+                    Arg.STRUCTUREIMAGEHEIGHT, sisv);
+            String scale = ArgParser.getValueFromSubValOrArg(avm, av,
+                    Arg.STRUCTUREIMAGESCALE, sisv);
+            String renderer = ArgParser.getValueFromSubValOrArg(avm, av,
+                    Arg.STRUCTUREIMAGETEXTRENDERER, sisv);
+            String typeS = ArgParser.getValueFromSubValOrArg(avm, av,
+                    Arg.STRUCTUREIMAGETYPE, sisv);
+            if (typeS == null || typeS.length() == 0)
+            {
+              typeS = FileUtils.getExtension(structureImageFile);
+            }
+            TYPE imageType;
+            try
+            {
+              imageType = Enum.valueOf(TYPE.class,
+                      typeS.toUpperCase(Locale.ROOT));
+            } catch (IllegalArgumentException e)
+            {
+              Console.warn("Do not know image format '" + typeS
+                      + "', using PNG");
+              imageType = TYPE.PNG;
+            }
+            BitmapImageSizing userBis = ImageMaker
+                    .parseScaleWidthHeightStrings(scale, width, height);
+            switch (StructureViewer.getViewerType())
+            {
+            case JMOL:
+              try
+              {
+                Thread.sleep(1000);
+              } catch (InterruptedException e)
+              {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+              }
+              JalviewStructureDisplayI sview = sv
+                      .getJalviewStructureDisplay();
+              if (sview instanceof AppJmol)
+              {
+                AppJmol jmol = (AppJmol) sview;
+                jmol.makePDBImage(structureImageFile, imageType, renderer,
+                        userBis);
+              }
+              break;
+            default:
+              Console.warn("Cannot export image for structure viewer "
+                      + sv.getViewerType() + " yet");
+              break;
+            }
+          }
         }
       }
     }
@@ -635,48 +692,14 @@ public class Commands
           renderer = "text";
         String type = "png"; // default
 
-        float bitmapscale = 0.0f;
-        int bitmapwidth = 0;
-        int bitmapheight = 0;
         String scale = ArgParser.getValueFromSubValOrArg(avm, av, Arg.SCALE,
                 subVal);
-        if (scale != null)
-        {
-          try
-          {
-            bitmapscale = Float.parseFloat(scale);
-          } catch (NumberFormatException e)
-          {
-            Console.warn("Did not understand scale '" + scale
-                    + "', won't be used.");
-          }
-        }
         String width = ArgParser.getValueFromSubValOrArg(avm, av, Arg.WIDTH,
                 subVal);
-        if (width != null)
-        {
-          try
-          {
-            bitmapwidth = Integer.parseInt(width);
-          } catch (NumberFormatException e)
-          {
-            Console.warn("Did not understand width '" + width
-                    + "', won't be used.");
-          }
-        }
         String height = ArgParser.getValueFromSubValOrArg(avm, av,
                 Arg.HEIGHT, subVal);
-        if (height != null)
-        {
-          try
-          {
-            bitmapheight = Integer.parseInt(height);
-          } catch (NumberFormatException e)
-          {
-            Console.warn("Did not understand height '" + height
-                    + "', won't be used.");
-          }
-        }
+        BitmapImageSizing userBis = ImageMaker
+                .parseScaleWidthHeightStrings(scale, width, height);
 
         type = ArgParser.getValueFromSubValOrArg(avm, av, Arg.TYPE, subVal);
         if (type == null && fileName != null)
@@ -693,6 +716,8 @@ public class Commands
         Cache.setPropsAreReadOnly(true);
         Cache.setProperty("EXPORT_EMBBED_BIOJSON", "false");
 
+        Console.info("Writing " + file);
+
         switch (type)
         {
 
@@ -703,7 +728,7 @@ public class Commands
 
         case "png":
           Console.debug("Outputting type '" + type + "' to " + fileName);
-          af.createPNG(file, null, bitmapscale, bitmapwidth, bitmapheight);
+          af.createPNG(file, null, userBis);
           break;
 
         case "html":
@@ -838,6 +863,9 @@ public class Commands
         Console.debug("Setting backups to " + backups);
         Cache.applicationProperties.put(BackupFiles.ENABLED,
                 Boolean.toString(backups));
+
+        Console.info("Writing " + fileName);
+
         af.saveAlignment(fileName, ff);
         Console.debug("Returning backups to " + savedBackupsPreference);
         if (savedBackupsPreference != null)
@@ -867,9 +895,15 @@ public class Commands
     SequenceI seq = null;
     if (subVals == null && idAv == null)
       return null;
+    if (af == null || af.getCurrentView() == null)
+    {
+      return null;
+    }
     AlignmentI al = af.getCurrentView().getAlignment();
     if (al == null)
+    {
       return null;
+    }
     if (subVals != null)
     {
       if (subVals.has(Arg.SEQID.getName()))
@@ -888,54 +922,4 @@ public class Commands
     }
     return seq;
   }
-
-  // returns the first Arg value intended for the structure structFilename
-  // (in the given AlignFrame from the ArgValuesMap)
-  private ArgValue getArgAssociatedWithStructure(Arg arg, ArgValuesMap avm,
-          AlignFrame af, String structFilename)
-  {
-    if (af != null)
-    {
-      for (ArgValue av : avm.getArgValueList(arg))
-      {
-        SubVals subVals = av.getSubVals();
-        String structid = subVals.get("structid");
-        String structfile = subVals.get("structfile");
-
-        // let's find a structure
-        if (structfile == null && structid == null)
-        {
-          ArgValue likelyStructure = avm.getClosestPreviousArgValueOfArg(av,
-                  Arg.STRUCTURE);
-          if (likelyStructure != null)
-          {
-            SubVals sv = likelyStructure.getSubVals();
-            if (sv != null && sv.has(ArgValues.ID))
-            {
-              structid = sv.get(ArgValues.ID);
-            }
-            else
-            {
-              structfile = likelyStructure.getValue();
-            }
-          }
-        }
-
-        if (structfile == null && structid != null)
-        {
-          StructureSelectionManager ssm = StructureSelectionManager
-                  .getStructureSelectionManager(Desktop.instance);
-          if (ssm != null)
-          {
-            structfile = ssm.findFileForPDBId(structid);
-          }
-        }
-        if (structfile != null && structfile.equals(structFilename))
-        {
-          return av;
-        }
-      }
-    }
-    return null;
-  }
 }