X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fext%2Fedu%2Fucsf%2Frbvi%2Fstrucviz2%2FStructureManager.java;h=9078d1223d8c6a35e8ae50b88de4c3361d1fa417;hb=9bb5d32aaf6fae60f127761f780055d0eb119c3d;hp=09a971365e03d73bd9faea1742dfb0efd06ac7c3;hpb=d99f77c85d5694808788ec662d50427ab3770da2;p=jalview.git diff --git a/src/ext/edu/ucsf/rbvi/strucviz2/StructureManager.java b/src/ext/edu/ucsf/rbvi/strucviz2/StructureManager.java index 09a9713..9078d12 100644 --- a/src/ext/edu/ucsf/rbvi/strucviz2/StructureManager.java +++ b/src/ext/edu/ucsf/rbvi/strucviz2/StructureManager.java @@ -32,9 +32,6 @@ */ package ext.edu.ucsf.rbvi.strucviz2; -import jalview.bin.Cache; -import jalview.gui.Preferences; - import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -49,6 +46,9 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import jalview.bin.Cache; +import jalview.gui.Preferences; + /** * This object maintains the relationship between Chimera objects and Cytoscape * objects. @@ -56,6 +56,27 @@ import org.slf4j.LoggerFactory; public class StructureManager { + /* + * Version numbers to build Windows installation paths for + * Chimera https://www.cgl.ucsf.edu/chimera/download.html + * ChimeraX http://www.rbvi.ucsf.edu/chimerax/download.html#release + * https://www.rbvi.ucsf.edu/trac/ChimeraX/wiki/ChangeLog + * These are a fallback for Jalview users who don't save path in Preferences; + * these will need to be updated as new versions are released; + * deliberately not 'final' (so modifiable using Groovy). + * + * May 2020: 1.14 is Chimera latest, anticipating a few more... + * 0.93 is ChimeraX latest, 1.0 expected soon + */ + private static String[] CHIMERA_VERSIONS = new String[] { "1.16.2", + "1.16.1", "1.16", "1.15.2", "1.15.1", "1.15", "1.14.2", "1.14.1", + "1.14", "1.13.1", "1.13", "1.12.2", "1.12.1", "1.12", "1.11.2", + "1.11.2", "1.11.1", "1.11" }; + + // Missing 1.1 as this has known bug see JAL-2422 + private static String[] CHIMERAX_VERSIONS = new String[] { "1.2.5", "1.0", + "0.93", "0.92", "0.91", "0.9" }; + static final String[] defaultStructureKeys = { "Structure", "pdb", "pdbFileName", "PDB ID", "structure", "biopax.xref.PDB", "pdb_ids", "ModelName", "ModelNumber" }; @@ -121,8 +142,8 @@ public class StructureManager for (String chimObjName : names) { // get or open the corresponding models if they already exist - List currentModels = chimeraManager.getChimeraModels( - chimObjName, type); + List currentModels = chimeraManager + .getChimeraModels(chimObjName, type); if (currentModels.size() == 0) { // open and return models @@ -540,8 +561,8 @@ public class StructureManager /** * This is called by the selectionListener to let us know that the user has - * changed their selection in Chimera. We need to go back to Chimera to find - * out what is currently selected and update our list. + * changed their selection in Chimera. We need to go back to Chimera to find out + * what is currently selected and update our list. */ public void chimeraSelectionChanged() { @@ -562,11 +583,11 @@ public class StructureManager // Get the corresponding "real" model if (chimeraManager.hasChimeraModel(modelNumber, subModelNumber)) { - ChimeraModel dataModel = chimeraManager.getChimeraModel( - modelNumber, subModelNumber); - if (dataModel.getResidueCount() == selectedModel - .getResidueCount() - || dataModel.getModelType() == StructureManager.ModelType.SMILES) + ChimeraModel dataModel = chimeraManager + .getChimeraModel(modelNumber, subModelNumber); + if (dataModel.getResidueCount() == selectedModel.getResidueCount() + || dataModel + .getModelType() == StructureManager.ModelType.SMILES) { // Select the entire model addChimSelection(dataModel); @@ -576,8 +597,8 @@ public class StructureManager { for (ChimeraChain selectedChain : selectedModel.getChains()) { - ChimeraChain dataChain = dataModel.getChain(selectedChain - .getChainId()); + ChimeraChain dataChain = dataModel + .getChain(selectedChain.getChainId()); if (selectedChain.getResidueCount() == dataChain .getResidueCount()) { @@ -656,11 +677,11 @@ public class StructureManager } /** - * Add a selection to the selection list. This is called primarily by the - * Model Navigator Dialog to keep the selections in sync + * Add a selection to the selection list. This is called primarily by the Model + * Navigator Dialog to keep the selections in sync * * @param selectionToAdd - * the selection to add to our list + * the selection to add to our list */ public void addChimSelection(ChimeraStructuralObject selectionToAdd) { @@ -677,7 +698,7 @@ public class StructureManager * Model Navigator Dialog to keep the selections in sync * * @param selectionToRemove - * the selection to remove from our list + * the selection to remove from our list */ public void removeChimSelection(ChimeraStructuralObject selectionToRemove) { @@ -896,7 +917,7 @@ public class StructureManager StructureSettings defaultSettings = null; // TODO: [Optional] Change priority of Chimera paths - public static List getChimeraPaths() + public static List getChimeraPaths(boolean isChimeraX) { List pathList = new ArrayList<>(); @@ -915,22 +936,76 @@ public class StructureManager // } // } + String os = System.getProperty("os.name"); + String userPath = Cache + .getDefault(isChimeraX ? Preferences.CHIMERAX_PATH + : Preferences.CHIMERA_PATH, null); + + /* + * paths are based on getChimeraPaths() in + * Chimera: + * https://github.com/RBVI/structureViz2/blob/master/src/main/java/edu/ucsf/rbvi/structureViz2/internal/model/StructureManager.java + * ChimeraX: + * https://github.com/RBVI/structureVizX/blob/master/src/main/java/edu/ucsf/rbvi/structureVizX/internal/model/StructureManager.java + */ + String chimera = isChimeraX ? "ChimeraX" : "Chimera"; + String chimeraExe = isChimeraX ? "ChimeraX" : "chimera"; + /* - * Jalview addition: check if path set in user preferences. + * Jalview addition: check if path set in user preferences */ - String userPath = Cache.getDefault(Preferences.CHIMERA_PATH, null); if (userPath != null) { - pathList.add(0, userPath); + // in macos, deal with the user selecting the .app folder + boolean adjusted = false; + if (os.startsWith("Mac") && userPath.endsWith((".app"))) + { + String possiblePath = String.format("%s/Contents/MacOS/%s", + userPath, chimeraExe); + if (new File(possiblePath).exists()) + { + pathList.add(possiblePath); + adjusted = true; + } + } + if (!adjusted) + { + pathList.add(userPath); + } } // Add default installation paths - String os = System.getProperty("os.name"); if (os.startsWith("Linux")) { - pathList.add("/usr/local/chimera/bin/chimera"); - pathList.add("/usr/local/bin/chimera"); - pathList.add("/usr/bin/chimera"); + // ChimeraX .deb and .rpm packages put symbolic link from /usr/bin/chimerax + pathList.add(String.format("/usr/bin/%s", chimeraExe.toLowerCase())); + pathList.add(String.format("/usr/bin/%s", chimeraExe)); + + pathList.add( + String.format("/usr/local/bin/%s", chimeraExe.toLowerCase())); + pathList.add(String.format("/usr/local/bin/%s", chimeraExe)); + + // these paths also used by .deb and .rpm + pathList.add(String.format("/usr/lib/ucsf-%s/bin/%s", + chimera.toLowerCase(), chimeraExe)); + pathList.add(String.format("/usr/libexec/UCSF-%s/bin/%s", chimera, + chimeraExe)); + + pathList.add(String.format("/usr/local/chimera/bin/%s", chimeraExe)); + + // user home paths + pathList.add(String.format("%s/bin/%s", + System.getProperty("user.home"), chimeraExe.toLowerCase())); + pathList.add(String.format("%s/bin/%s", + System.getProperty("user.home"), chimeraExe)); + pathList.add(String.format("%s/opt/bin/%s", + System.getProperty("user.home"), chimeraExe.toLowerCase())); + pathList.add(String.format("%s/opt/bin/%s", + System.getProperty("user.home"), chimeraExe)); + pathList.add(String.format("%s/local/bin/%s", + System.getProperty("user.home"), chimeraExe.toLowerCase())); + pathList.add(String.format("%s/local/bin/%s", + System.getProperty("user.home"), chimeraExe)); } else if (os.startsWith("Windows")) { @@ -938,18 +1013,36 @@ public class StructureManager "C:\\Program Files", "\\Program Files (x86)", "C:\\Program Files (x86)" }) { - for (String version : new String[] { "1.11", "1.11.1", "1.11.2", - "1.12", "1.12.1", "1.12.2", "1.13" }) + String[] candidates = isChimeraX ? CHIMERAX_VERSIONS + : CHIMERA_VERSIONS; + for (String version : candidates) { - pathList.add(root + "\\Chimera " + version + "\\bin\\chimera"); - pathList.add( - root + "\\Chimera " + version + "\\bin\\chimera.exe"); + // TODO original code doesn't include version in path; which is right? + String path = String.format("%s\\%s %s\\bin\\%s", root, chimera, + version, chimeraExe); + pathList.add(path); + pathList.add(path + ".exe"); } + // try without a version number too + String path = String.format("%s\\%s\\bin\\%s", root, chimera, + chimeraExe); + pathList.add(path); + pathList.add(path + ".exe"); } } else if (os.startsWith("Mac")) { - pathList.add("/Applications/Chimera.app/Contents/MacOS/chimera"); + // check for installations with version numbers first + String[] candidates = isChimeraX ? CHIMERAX_VERSIONS + : CHIMERA_VERSIONS; + for (String version : candidates) + { + pathList.add( + String.format("/Applications/%s-%s.app/Contents/MacOS/%s", + chimera, version, chimeraExe)); + } + pathList.add(String.format("/Applications/%s.app/Contents/MacOS/%s", + chimera, chimeraExe)); } return pathList; }