X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FStructureChooser.java;h=6fce9847e02af1843fdfa933bb9e0f93a38610b3;hb=e67a74ee1dac618d941fce0fc5ef4561f76380b1;hp=e2eaabdffb6a9d0f388a24bca7cc169679b972d4;hpb=7e3a6674abdd31bf48e7e249a74eff50fd2ce589;p=jalview.git diff --git a/src/jalview/gui/StructureChooser.java b/src/jalview/gui/StructureChooser.java index e2eaabd..6fce984 100644 --- a/src/jalview/gui/StructureChooser.java +++ b/src/jalview/gui/StructureChooser.java @@ -28,10 +28,11 @@ import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; -import java.util.concurrent.Callable; +import java.util.Map; import java.util.concurrent.Executors; import javax.swing.JCheckBox; @@ -45,11 +46,16 @@ import javax.swing.table.AbstractTableModel; import com.stevesoft.pat.Regex; +import jalview.analysis.AlignmentUtils; +import jalview.api.AlignmentViewPanel; import jalview.api.structures.JalviewStructureDisplayI; import jalview.bin.Cache; import jalview.bin.Console; import jalview.bin.Jalview; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentI; import jalview.datamodel.PDBEntry; +import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.ext.jmol.JmolParser; import jalview.fts.api.FTSData; @@ -60,10 +66,12 @@ import jalview.fts.core.FTSRestRequest; import jalview.fts.core.FTSRestResponse; import jalview.fts.service.pdb.PDBFTSRestClient; import jalview.fts.service.threedbeacons.TDB_FTSData; +import jalview.gui.StructureViewer.ViewerType; import jalview.gui.structurechooser.PDBStructureChooserQuerySource; import jalview.gui.structurechooser.StructureChooserQuerySource; import jalview.gui.structurechooser.ThreeDBStructureChooserQuerySource; import jalview.io.DataSourceType; +import jalview.io.FileFormatException; import jalview.io.JalviewFileChooser; import jalview.io.JalviewFileView; import jalview.jbgui.FilterOption; @@ -76,6 +84,8 @@ import jalview.util.Platform; import jalview.util.StringUtils; import jalview.ws.DBRefFetcher; import jalview.ws.DBRefFetcher.FetchFinishedListenerI; +import jalview.ws.datamodel.alphafold.PAEContactMatrix; +import jalview.ws.dbsources.EBIAlfaFold; import jalview.ws.seqfetcher.DbSourceProxy; import jalview.ws.sifts.SiftsSettings; @@ -339,7 +349,7 @@ public class StructureChooser extends GStructureChooser }; // fetch db refs if OK pressed - final Callable discoverCanonicalDBrefs = () -> { + final Runnable discoverCanonicalDBrefs = () -> { btn_queryTDB.setEnabled(false); populateSeqsWithoutSourceDBRef(); @@ -361,14 +371,12 @@ public class StructureChooser extends GStructureChooser // call finished action directly afterDbRefFetch.finished(); } - return null; }; - final Callable revertview = () -> { + final Runnable revertview = () -> { if (lastSelected != null) { cmb_filterOption.setSelectedItem(lastSelected); } - return null; }; int threshold = Cache.getDefault("UNIPROT_AUTOFETCH_THRESHOLD", THRESHOLD_WARN_UNIPROT_FETCH_NEEDED); @@ -699,7 +707,7 @@ public class StructureChooser extends GStructureChooser } /** - * Handles action event for btn_pdbFromFile + * Handles action event for btn_paeMatrixFile */ @Override protected void paeMatrixFile_actionPerformed() @@ -728,10 +736,26 @@ public class StructureChooser extends GStructureChooser "label.load_pae_matrix_file_associate_with_structure", pdbFile.getName())); + // TODO convert to Callable/Promise int value = chooser.showOpenDialog(null); if (value == JalviewFileChooser.APPROVE_OPTION) { - localPdbPaeMatrixFileName = chooser.getSelectedFile().getPath(); + String fileName = chooser.getSelectedFile().getPath(); + try + { + PAEContactMatrix.validateContactMatrixFile(fileName); + } catch (Exception thr) + { + JvOptionPane.showInternalMessageDialog(this, MessageManager + .formatMessage("label.couldnt_load_file", new Object[] + { fileName }) + "
" + thr.getLocalizedMessage(), + MessageManager.getString("label.error_loading_file"), + JvOptionPane.WARNING_MESSAGE); + Console.error("Couldn't import " + fileName + " as a PAE matrix", + thr); + return; + } + localPdbPaeMatrixFileName = fileName; Cache.setProperty("LAST_DIRECTORY", localPdbPaeMatrixFileName); } validateAssociationFromFile(); @@ -1053,11 +1077,13 @@ public class StructureChooser extends GStructureChooser { pdbFileString = MessageManager.getString("label.none"); pdbFileTooltip = MessageManager.getString("label.nothing_selected"); + setPdbOptionsEnabled(false); } } else { btn_pdbFromFile.setEnabled(false); + setPdbOptionsEnabled(false); // lbl_fromFileStatus.setIcon(errorImage); pdbFileString = MessageManager.getString("label.none"); pdbFileTooltip = MessageManager.getString("label.nothing_selected"); @@ -1182,7 +1208,14 @@ public class StructureChooser extends GStructureChooser final StructureSelectionManager ssm = ap.getStructureSelectionManager(); final int preferredHeight = pnl_filter.getHeight(); + btn_add.setEnabled(false); + btn_newView.setEnabled(false); + btn_cancel.setEnabled(false); + actionsPanel.setEnabled(false); + final String progress = MessageManager + .getString("label.working_ellipsis"); + setProgressBar(progress, progress.hashCode()); Runnable viewStruc = new Runnable() { @Override @@ -1266,53 +1299,28 @@ public class StructureChooser extends GStructureChooser } else if (currentView == VIEWS_FROM_FILE) { - TFType tft = (TFType) StructureChooser.this.combo_tempFacAs - .getSelectedItem(); - String paeFilename = StructureChooser.this.localPdbPaeMatrixFileName; + StructureChooser sc = StructureChooser.this; + TFType tft = (TFType) sc.combo_tempFacAs.getSelectedItem(); + String paeFilename = sc.localPdbPaeMatrixFileName; AssociateSeqOptions assSeqOpt = (AssociateSeqOptions) fileChooserAssSeqPanel .getCmb_assSeq().getSelectedItem(); SequenceI userSelectedSeq = assSeqOpt.getSequence(); if (userSelectedSeq != null) + { selectedSequence = userSelectedSeq; + } String pdbFilename = selectedPdbFileName; - PDBEntry fileEntry = new AssociatePdbFileWithSeq() - .associatePdbWithSeq(pdbFilename, DataSourceType.FILE, - selectedSequence, true, Desktop.instance, tft, - paeFilename); - - /* - SequenceI[] seqArray = new SequenceI[] { selectedSequence }; - - StructureFile sf = ssm.computeMapping(true, seqArray, null, - selectedPdbFileName, DataSourceType.FILE, null, tft, - paeFilename); - StructureMapping[] sm = ssm.getMapping(fileEntry.getFile()); - // DO SOMETHING WITH - File paeFile = paeFilename == null ? null : new File(paeFilename); - if (paeFilename != null && paeFile.exists()) - { - AlignmentI al = StructureChooser.this.ap.getAlignment(); - try - { - EBIAlfaFold.importPaeJSONAsContactMatrixToSequence(al, - paeFile, selectedSequence); - } catch (IOException | ParseException e) - { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - */ - sViewer = launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, - ap, new SequenceI[] - { selectedSequence }); + StructureChooser.openStructureFileForSequence(ssm, sc, ap, + selectedSequence, true, pdbFilename, tft, paeFilename, + true); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { + setProgressBar("Complete.", progress.hashCode()); closeAction(preferredHeight); mainFrame.dispose(); } @@ -1365,6 +1373,15 @@ public class StructureChooser extends GStructureChooser StructureSelectionManager ssm, final PDBEntry[] pdbEntriesToView, final AlignmentPanel alignPanel, SequenceI[] sequences) { + return launchStructureViewer(ssm, pdbEntriesToView, alignPanel, + sequences, null); + } + + private StructureViewer launchStructureViewer( + StructureSelectionManager ssm, final PDBEntry[] pdbEntriesToView, + final AlignmentPanel alignPanel, SequenceI[] sequences, + ViewerType viewerType) + { long progressId = sequences.hashCode(); setProgressBar(MessageManager .getString("status.launching_3d_structure_viewer"), progressId); @@ -1389,10 +1406,6 @@ public class StructureChooser extends GStructureChooser for (SequenceI seq : sequences) { PDBEntry pdbe = pdbEntriesToView[p++]; - Console.debug( - "##### pdbe=" + pdbe == null ? null : pdbe.toString()); - Console.debug("##### pdbe.getFile()=" + pdbe == null ? null - : pdbe.getFile()); if (pdbe != null && pdbe.getFile() != null) { StructureMapping[] smm = ssm.getMapping(pdbe.getFile()); @@ -1433,7 +1446,8 @@ public class StructureChooser extends GStructureChooser MessageManager.getString( "status.fetching_3d_structures_for_selected_entries"), progressId); - theViewer.viewStructures(pdbEntriesToView, sequences, alignPanel); + theViewer.viewStructures(pdbEntriesToView, sequences, alignPanel, + viewerType); } else { @@ -1441,7 +1455,8 @@ public class StructureChooser extends GStructureChooser "status.fetching_3d_structures_for", pdbEntriesToView[0].getId()), progressId); // Can we pass a pre-computeMappinged pdbFile? - theViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel); + theViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel, + viewerType); } setProgressBar(null, progressId); // remember the last viewer we used... @@ -1682,20 +1697,21 @@ public class StructureChooser extends GStructureChooser @Override public void setProgressBar(String message, long id) { - if (!Platform.isHeadless()) + if (!Platform.isHeadless() && progressBar != null) progressBar.setProgressBar(message, id); } @Override public void registerHandler(long id, IProgressIndicatorHandler handler) { - progressBar.registerHandler(id, handler); + if (progressBar != null) + progressBar.registerHandler(id, handler); } @Override public boolean operationInProgress() { - return progressBar.operationInProgress(); + return progressBar == null ? false : progressBar.operationInProgress(); } public JalviewStructureDisplayI getOpenedStructureViewer() @@ -1739,30 +1755,76 @@ public class StructureChooser extends GStructureChooser /** * Open a single structure file for a given sequence */ - public static void openStructureFileForSequence(AlignmentPanel ap, - SequenceI seq, File sFile) + public static void openStructureFileForSequence( + StructureSelectionManager ssm, StructureChooser sc, + AlignmentPanel ap, SequenceI seq, boolean prompt, + String sFilename, TFType tft, String paeFilename, + boolean doXferSettings) { - // Open the chooser headlessly. Not sure this is actually needed ? - StructureChooser sc = new StructureChooser(new SequenceI[] { seq }, seq, - ap, false); - StructureSelectionManager ssm = ap.getStructureSelectionManager(); - PDBEntry fileEntry = null; - try - { - fileEntry = new AssociatePdbFileWithSeq().associatePdbWithSeq( - sFile.getAbsolutePath(), DataSourceType.FILE, seq, true, - Desktop.instance); - } catch (Exception e) - { - Console.error("Could not open structure file '" - + sFile.getAbsolutePath() + "'"); - return; + openStructureFileForSequence(ssm, sc, ap, seq, prompt, sFilename, tft, + paeFilename, false, true, doXferSettings, null); + } + + public static StructureViewer openStructureFileForSequence( + StructureSelectionManager ssm, StructureChooser sc, + AlignmentPanel ap, SequenceI seq, boolean prompt, + String sFilename, TFType tft, String paeFilename, + boolean forceHeadless, boolean showRefAnnotations, + boolean doXferSettings, ViewerType viewerType) + { + StructureViewer sv = null; + boolean headless = forceHeadless; + if (sc == null) + { + // headless = true; + prompt = false; + sc = new StructureChooser(new SequenceI[] { seq }, seq, ap, false); + } + if (ssm == null) + { + ssm = ap.getStructureSelectionManager(); } - StructureViewer sViewer = sc.launchStructureViewer(ssm, - new PDBEntry[] - { fileEntry }, ap, new SequenceI[] { seq }); + PDBEntry fileEntry = new AssociatePdbFileWithSeq().associatePdbWithSeq( + sFilename, DataSourceType.FILE, seq, prompt, Desktop.instance, + tft, paeFilename, doXferSettings); + + // if headless, "false" in the sc constructor above will avoid GUI behaviour + // in sc.launchStructureViewer() + if (!headless && !(viewerType == null)) + { + sv = sc.launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap, + new SequenceI[] + { seq }, viewerType); + } sc.mainFrame.dispose(); + + if (showRefAnnotations) + showReferenceAnnotationsForSequence(ap.alignFrame, seq); + + return sv; + } + + public static void showReferenceAnnotationsForSequence(AlignFrame af, + SequenceI sequence) + { + AlignViewport av = af.getCurrentView(); + AlignmentI al = av.getAlignment(); + + List forSequences = new ArrayList<>(); + forSequences.add(sequence); + final Map> candidates = new LinkedHashMap<>(); + AlignmentUtils.findAddableReferenceAnnotations(forSequences, null, + candidates, al); + final SequenceGroup selectionGroup = av.getSelectionGroup(); + AlignmentUtils.addReferenceAnnotations(candidates, al, selectionGroup); + for (AlignmentViewPanel ap : af.getAlignPanels()) + { + // required to readjust the height and position of the PAE + // annotation + ap.adjustAnnotationHeight(); + } + } }