X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FStructureChooser.java;h=11e50dbf2ff6ffcfce7734918a8e68b923d07687;hb=2ec1365eda085f8e21a8faa384c67c136774b599;hp=d38f39f7685456bac494680036207e10bfff3cc2;hpb=b64d494eebb7f9cf14c61e50568f41887fca5c26;p=jalview.git diff --git a/src/jalview/gui/StructureChooser.java b/src/jalview/gui/StructureChooser.java index d38f39f..11e50db 100644 --- a/src/jalview/gui/StructureChooser.java +++ b/src/jalview/gui/StructureChooser.java @@ -31,6 +31,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; +import java.util.concurrent.Callable; import java.util.concurrent.Executors; import javax.swing.JCheckBox; @@ -60,11 +61,16 @@ import jalview.gui.structurechooser.PDBStructureChooserQuerySource; import jalview.gui.structurechooser.StructureChooserQuerySource; import jalview.gui.structurechooser.ThreeDBStructureChooserQuerySource; import jalview.io.DataSourceType; +import jalview.io.JalviewFileChooser; +import jalview.io.JalviewFileView; import jalview.jbgui.FilterOption; import jalview.jbgui.GStructureChooser; +import jalview.structure.StructureImportSettings.TFType; import jalview.structure.StructureMapping; import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; +import jalview.util.Platform; +import jalview.util.StringUtils; import jalview.ws.DBRefFetcher; import jalview.ws.DBRefFetcher.FetchFinishedListenerI; import jalview.ws.seqfetcher.DbSourceProxy; @@ -105,6 +111,10 @@ public class StructureChooser extends GStructureChooser private String selectedPdbFileName; + private TFType localPdbTempfacType; + + private String localPdbPaeMatrixFileName; + private boolean isValidPBDEntry; private boolean cachedPDBExists; @@ -117,18 +127,18 @@ public class StructureChooser extends GStructureChooser List seqsWithoutSourceDBRef = null; - private boolean noChooserGUI = false; + private boolean showChooserGUI = true; private static StructureViewer lastTargetedView = null; public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq, AlignmentPanel ap) { - this(selectedSeqs, selectedSeq, ap, false); + this(selectedSeqs, selectedSeq, ap, true); } public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq, - AlignmentPanel ap, boolean noChooserGUI) + AlignmentPanel ap, boolean showGUI) { // which FTS engine to use data = StructureChooserQuerySource.getQuerySourceFor(selectedSeqs); @@ -138,7 +148,7 @@ public class StructureChooser extends GStructureChooser this.selectedSequence = selectedSeq; this.selectedSequences = selectedSeqs; this.progressIndicator = (ap == null) ? null : ap.alignFrame; - this.noChooserGUI = noChooserGUI; + this.showChooserGUI = showGUI; init(); } @@ -254,7 +264,7 @@ public class StructureChooser extends GStructureChooser populateFilterComboBox(isStructuresDiscovered(), cachedPDBExists); discoverStructureViews(); updateProgressIndicator(null, startTime); - mainFrame.setVisible(noChooserGUI); + mainFrame.setVisible(showChooserGUI); updateCurrentView(); } @@ -326,53 +336,43 @@ public class StructureChooser extends GStructureChooser }; // fetch db refs if OK pressed - final Runnable discoverCanonicalDBrefs = new Runnable() - { - @Override - public void run() + final Callable discoverCanonicalDBrefs = () -> { + btn_queryTDB.setEnabled(false); + populateSeqsWithoutSourceDBRef(); + + final int y = seqsWithoutSourceDBRef.size(); + if (y > 0) { - btn_queryTDB.setEnabled(false); - populateSeqsWithoutSourceDBRef(); + final SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef + .toArray(new SequenceI[y]); + DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef, + progressBar, new DbSourceProxy[] + { new jalview.ws.dbsources.Uniprot() }, null, false); + dbRefFetcher.addListener(afterDbRefFetch); + // ideally this would also gracefully run with callbacks - final int y = seqsWithoutSourceDBRef.size(); - if (y > 0) - { - final SequenceI[] seqWithoutSrcDBRef = seqsWithoutSourceDBRef - .toArray(new SequenceI[y]); - DBRefFetcher dbRefFetcher = new DBRefFetcher(seqWithoutSrcDBRef, - progressBar, new DbSourceProxy[] - { new jalview.ws.dbsources.Uniprot() }, null, false); - dbRefFetcher.addListener(afterDbRefFetch); - // ideally this would also gracefully run with callbacks - - dbRefFetcher.fetchDBRefs(true); - } - else - { - // call finished action directly - afterDbRefFetch.finished(); - } + dbRefFetcher.fetchDBRefs(true); } - + else + { + // call finished action directly + afterDbRefFetch.finished(); + } + return null; }; - final Runnable revertview = new Runnable() - { - @Override - public void run() + final Callable revertview = () -> { + if (lastSelected != null) { - if (lastSelected != null) - { - cmb_filterOption.setSelectedItem(lastSelected); - } - }; + cmb_filterOption.setSelectedItem(lastSelected); + } + return null; }; int threshold = Cache.getDefault("UNIPROT_AUTOFETCH_THRESHOLD", THRESHOLD_WARN_UNIPROT_FETCH_NEEDED); Console.debug("Using Uniprot fetch threshold of " + threshold); if (ignoreGui || seqsWithoutSourceDBRef.size() < threshold) { - Executors.defaultThreadFactory().newThread(discoverCanonicalDBrefs) - .start(); + Executors.newSingleThreadExecutor().submit(discoverCanonicalDBrefs); return; } // need cancel and no to result in the discoverPDB action - mocked is @@ -664,9 +664,9 @@ public class StructureChooser extends GStructureChooser // TODO: JAL-3048 not needed for Jalview-JS until JSmol dep and // StructureChooser // works - jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser( + JalviewFileChooser chooser = new JalviewFileChooser( Cache.getProperty("LAST_DIRECTORY")); - chooser.setFileView(new jalview.io.JalviewFileView()); + chooser.setFileView(new JalviewFileView()); chooser.setDialogTitle( MessageManager.formatMessage("label.select_pdb_file_for", selectedSequence.getDisplayId(false))); @@ -675,15 +675,85 @@ public class StructureChooser extends GStructureChooser selectedSequence.getDisplayId(false))); int value = chooser.showOpenDialog(null); - if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION) + if (value == JalviewFileChooser.APPROVE_OPTION) { selectedPdbFileName = chooser.getSelectedFile().getPath(); Cache.setProperty("LAST_DIRECTORY", selectedPdbFileName); + localPdbPaeMatrixFileName = guessPAEFilename(); validateSelections(); } } /** + * Handles action event for btn_pdbFromFile + */ + @Override + protected void paeMatrixFile_actionPerformed() + { + File pdbFile = new File(selectedPdbFileName); + String setFile = Cache.getProperty("LAST_DIRECTORY"); + if (localPdbPaeMatrixFileName != null) + { + File paeFile = new File(localPdbPaeMatrixFileName); + if (paeFile.exists()) + setFile = paeFile.getAbsolutePath(); + else if (paeFile.getParentFile().exists()) + setFile = paeFile.getParentFile().getAbsolutePath(); + } + else + { + String guess = guessPAEFilename(); + if (guess != null) + setFile = guess; + } + JalviewFileChooser chooser = new JalviewFileChooser(setFile); + chooser.setFileView(new JalviewFileView()); + chooser.setDialogTitle(MessageManager.formatMessage( + "label.select_pae_matrix_file_for", pdbFile.getName())); + chooser.setToolTipText(MessageManager.formatMessage( + "label.load_pae_matrix_file_associate_with_structure", + pdbFile.getName())); + + int value = chooser.showOpenDialog(null); + if (value == JalviewFileChooser.APPROVE_OPTION) + { + localPdbPaeMatrixFileName = chooser.getSelectedFile().getPath(); + Cache.setProperty("LAST_DIRECTORY", localPdbPaeMatrixFileName); + } + validateAssociationFromFile(); + } + + private String guessPAEFilename() + { + if (selectedPdbFileName.toLowerCase(Locale.ROOT).endsWith(".pdb") + || selectedPdbFileName.toLowerCase(Locale.ROOT) + .endsWith(".cif")) + { + String jsonExt = selectedPdbFileName.substring(0, + selectedPdbFileName.length() - 4) + ".json"; + // AlphaFold naming scheme + String guessFile1 = StringUtils.replaceLast(jsonExt, "model", + "predicted_aligned_error"); + // nf-core mode naming scheme + String guessFile2 = StringUtils.replaceLast(jsonExt, ".json", + "_scores.json"); + if (new File(guessFile1).exists()) + { + return guessFile1; + } + else if (new File(jsonExt).exists()) + { + return jsonExt; + } + else if (new File(guessFile2).exists()) + { + return guessFile2; + } + } + return null; + } + + /** * Populates the filter combo-box options dynamically depending on discovered * structures */ @@ -950,7 +1020,9 @@ public class StructureChooser extends GStructureChooser { AssociateSeqOptions assSeqOpt = (AssociateSeqOptions) fileChooserAssSeqPanel .getCmb_assSeq().getSelectedItem(); - lbl_fromFileStatus.setIcon(errorImage); + // lbl_fromFileStatus.setIcon(errorImage); + String pdbFileString = ""; + String pdbFileTooltip = ""; if (selectedSequences.length == 1 || (assSeqOpt != null && !assSeqOpt .getName().equalsIgnoreCase("-Select Associated Seq-"))) { @@ -958,14 +1030,44 @@ public class StructureChooser extends GStructureChooser if (selectedPdbFileName != null && selectedPdbFileName.length() > 0) { btn_add.setEnabled(true); - lbl_fromFileStatus.setIcon(goodImage); + // lbl_fromFileStatus.setIcon(goodImage); + pdbFileString = new File(selectedPdbFileName).getName(); + pdbFileTooltip = new File(selectedPdbFileName).getAbsolutePath(); + setPdbOptionsEnabled(true); + } + else + { + pdbFileString = MessageManager.getString("label.none"); + pdbFileTooltip = MessageManager.getString("label.nothing_selected"); } } else { btn_pdbFromFile.setEnabled(false); - lbl_fromFileStatus.setIcon(errorImage); + // lbl_fromFileStatus.setIcon(errorImage); + pdbFileString = MessageManager.getString("label.none"); + pdbFileTooltip = MessageManager.getString("label.nothing_selected"); + } + lbl_pdbFile.setText(pdbFileString); + lbl_pdbFile.setToolTipText(pdbFileTooltip); + + // PAE file choice + String paeFileString = ""; + String paeFileTooltip = ""; + if (localPdbPaeMatrixFileName != null + && localPdbPaeMatrixFileName.length() > 0) + { + paeFileString = new File(localPdbPaeMatrixFileName).getName(); + paeFileTooltip = new File(localPdbPaeMatrixFileName) + .getAbsolutePath(); + } + else + { + paeFileString = MessageManager.getString("label.none"); + paeFileTooltip = MessageManager.getString("label.nothing_selected"); } + lbl_paeFile.setText(paeFileString); + lbl_paeFile.setToolTipText(paeFileTooltip); } @Override @@ -1160,6 +1262,22 @@ public class StructureChooser extends GStructureChooser .associatePdbWithSeq(selectedPdbFileName, DataSourceType.FILE, selectedSequence, true, Desktop.instance); + /* LOOK AT + public PDBEntry associatePdbWithSeq(String choice, DataSourceType file, + SequenceI sequence, boolean prompt, + StructureSelectionManagerProvider ssmp) + IN AssociatePdbFileWithSeq */ + + // DO SOMETHING WITH + if (StructureChooser.this.localPdbPaeMatrixFileName != null) + { + + } + if (StructureChooser.this.combo_tempFacAs + .getSelectedItem() != null) + { + + } sViewer = launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap, new SequenceI[] @@ -1534,7 +1652,8 @@ public class StructureChooser extends GStructureChooser @Override public void setProgressBar(String message, long id) { - progressBar.setProgressBar(message, id); + if (!Platform.isHeadless()) + progressBar.setProgressBar(message, id); } @Override @@ -1593,8 +1712,9 @@ public class StructureChooser extends GStructureChooser public static void openStructureFileForSequence(AlignmentPanel ap, SequenceI seq, File sFile) { + // Open the chooser headlessly. Not sure this is actually needed ? StructureChooser sc = new StructureChooser(new SequenceI[] { seq }, seq, - ap, true); + ap, false); StructureSelectionManager ssm = ap.getStructureSelectionManager(); PDBEntry fileEntry = null; try @@ -1614,6 +1734,5 @@ public class StructureChooser extends GStructureChooser { fileEntry }, ap, new SequenceI[] { seq }); sc.mainFrame.dispose(); - sc.noChooserGUI = false; } }