1 package jalview.ext.archaeopteryx;
3 import jalview.analysis.TreeBuilder;
4 import jalview.datamodel.SequenceI;
5 import jalview.ext.treeviewer.ExternalLoadedTreeAssociationI;
6 import jalview.ext.treeviewer.ExternalTreeBuilderI;
7 import jalview.ext.treeviewer.ExternalTreeFrame;
8 import jalview.ext.treeviewer.ExternalTreeI;
9 import jalview.ext.treeviewer.ExternalTreeNodeI;
10 import jalview.ext.treeviewer.ExternalTreeViewerBindingI;
11 import jalview.gui.Desktop;
12 import jalview.gui.JvOptionPane;
13 import jalview.util.MessageManager;
14 import jalview.viewmodel.AlignmentViewport;
16 import java.awt.Dimension;
18 import java.io.FileNotFoundException;
19 import java.io.IOException;
20 import java.net.MalformedURLException;
22 import java.util.HashMap;
25 import org.forester.archaeopteryx.AptxUtil;
26 import org.forester.archaeopteryx.Configuration;
27 import org.forester.archaeopteryx.webservices.PhylogeniesWebserviceClient;
28 import org.forester.archaeopteryx.webservices.WebserviceUtil;
29 import org.forester.io.parsers.PhylogenyParser;
30 import org.forester.io.parsers.nexus.NexusPhylogeniesParser;
31 import org.forester.io.parsers.nhx.NHXParser;
32 import org.forester.io.parsers.phyloxml.PhyloXmlDataFormatException;
33 import org.forester.io.parsers.phyloxml.PhyloXmlParser;
34 import org.forester.io.parsers.tol.TolParser;
35 import org.forester.io.parsers.util.ParserUtils;
36 import org.forester.phylogeny.Phylogeny;
37 import org.forester.phylogeny.PhylogenyMethods;
38 import org.forester.phylogeny.data.Identifier;
39 import org.forester.util.ForesterUtil;
42 * Static class for creating Archaeopteryx tree viewer instances from calculated
43 * trees and letting them be bound to Jalview.
45 * @author kjvanderheide
48 public final class AptxInit
50 public final static Configuration APTX_CONFIG = new Configuration(
51 "_aptx_jalview_configuration_file",
54 private final static boolean VALIDATE_PHYLOXML_XSD = APTX_CONFIG
55 .isValidatePhyloXmlAgainstSchema();
57 private final static boolean REPLACE_NHX_UNDERSCORES = APTX_CONFIG
58 .isReplaceUnderscoresInNhParsing();
60 private final static boolean INTERNAL_NUMBERS_AS_CONFIDENCE = APTX_CONFIG
61 .isInternalNumberAreConfidenceForNhParsing();
63 private final static boolean MIDPOINT_REROOT = APTX_CONFIG
66 private final static NHXParser.TAXONOMY_EXTRACTION TAXONOMY_EXTRACTION = APTX_CONFIG
67 .getTaxonomyExtraction();
69 private static Map<ExternalTreeFrame, ExternalTreeViewerBindingI> activeAptx = new HashMap<>();
73 public static ExternalTreeFrame createInstanceFromCalculation(
74 final TreeBuilder calculatedTree)
76 ExternalTreeBuilderI aptxTreeBuilder = new AptxTreeBuilder(
79 ExternalTreeI aptxTree = aptxTreeBuilder.buildTree();
81 ExternalTreeFrame aptxApp = createAptxFrame(aptxTree,
82 calculatedTree.getAvport(), null);
88 * Refactored from Archaeopteryx.main
94 * @throws FileNotFoundException
96 public static ExternalTreeFrame[] createInstancesFromFile(
98 AlignmentViewport viewport)
99 throws FileNotFoundException, IOException
101 File treeFile = new File(filePath);
102 final String err = ForesterUtil.isReadableFile(treeFile);
103 if (!ForesterUtil.isEmpty(err))
105 JvOptionPane.showMessageDialog(Desktop.desktop, err,
106 MessageManager.getString("label.problem_reading_tree_file"),
107 JvOptionPane.WARNING_MESSAGE);
110 if (Desktop.instance != null)
112 Desktop.instance.startLoading(filePath);
114 boolean nhx_or_nexus = false;
115 final PhylogenyParser parser = ParserUtils
116 .createParserDependingOnFileType(
117 treeFile, VALIDATE_PHYLOXML_XSD);
118 if (parser instanceof NHXParser)
121 final NHXParser nhx = (NHXParser) parser;
122 nhx.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
123 nhx.setIgnoreQuotes(false);
124 nhx.setTaxonomyExtraction(TAXONOMY_EXTRACTION);
126 else if (parser instanceof NexusPhylogeniesParser)
129 final NexusPhylogeniesParser nex = (NexusPhylogeniesParser) parser;
130 nex.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
131 nex.setIgnoreQuotes(false);
133 else if (parser instanceof PhyloXmlParser)
135 if (VALIDATE_PHYLOXML_XSD == false)
137 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
138 MessageManager.getString("error.phyloxml_validation"),
139 MessageManager.getString("label.file_open_error"),
140 JvOptionPane.WARNING_MESSAGE );
143 Phylogeny[] trees = PhylogenyMethods.readPhylogenies(parser,
145 ExternalTreeFrame[] aptxFrames = new ExternalTreeFrame[trees.length];
148 for (int i = 0; i < trees.length; i++)
150 Phylogeny aptxPhylogeny = trees[i];
152 if (nhx_or_nexus && INTERNAL_NUMBERS_AS_CONFIDENCE)
154 PhylogenyMethods.transferInternalNodeNamesToConfidence(aptxPhylogeny,
157 String treeTitle = treeFile.getName() + "[" + i + "]";
158 aptxPhylogeny.setName(treeTitle);
159 Tree aptxTree = new Tree(aptxPhylogeny);
160 aptxFrames[i] = createAptxFrame(aptxTree, viewport, treeTitle);
163 if (Desktop.instance != null)
165 Desktop.instance.stopLoading();
171 public static ExternalTreeFrame[] createInstancesFromUrl(URL treeUrl,
172 AlignmentViewport viewport)
173 throws FileNotFoundException, IOException, RuntimeException
176 String treeTitle = treeUrl.getFile();
177 if (Desktop.instance != null)
179 Desktop.instance.startLoading(treeTitle);
181 Phylogeny[] trees = AptxUtil.readPhylogeniesFromUrl(treeUrl,
182 VALIDATE_PHYLOXML_XSD,
183 REPLACE_NHX_UNDERSCORES, INTERNAL_NUMBERS_AS_CONFIDENCE,
184 TAXONOMY_EXTRACTION, MIDPOINT_REROOT);
186 ExternalTreeFrame[] aptxFrames = new ExternalTreeFrame[trees.length];
187 for (int i = 0; i < trees.length; i++)
189 Phylogeny aptxTree = trees[i];
190 Tree jalviewTree = new Tree(aptxTree);
191 aptxFrames[i] = createAptxFrame(jalviewTree, viewport, treeTitle);
194 if (Desktop.instance != null)
196 Desktop.instance.stopLoading();
204 * Refactored from Forester's UrlTreeReader, this can be more efficient
206 * @param databaseIndex
210 public static ExternalTreeFrame[] createInstancesFromDb(
211 PhylogeniesWebserviceClient treeDbClient, String identifier,
212 AlignmentViewport viewport)
216 Phylogeny[] trees = null;
218 if ((identifier != null) && (identifier.trim().length() > 0))
220 if (Desktop.instance != null)
222 Desktop.instance.startLoading(identifier);
225 identifier = identifier.trim();
226 if (treeDbClient.isQueryInteger())
228 identifier = identifier.replaceAll("^\\D+", "");
233 id = Integer.parseInt(identifier);
234 } catch (final NumberFormatException e)
236 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
237 MessageManager.formatMessage(
238 "error.database_id_has_letters", new String[]
240 MessageManager.getString("label.invalid_url"),
241 JvOptionPane.ERROR_MESSAGE);
242 return new ExternalTreeFrame[0];
244 identifier = id + "";
246 boolean exception = false;
249 String url_str = treeDbClient.getUrl();
250 url_str = url_str.replaceFirst(
251 PhylogeniesWebserviceClient.QUERY_PLACEHOLDER, identifier);
252 url = new URL(url_str);
253 PhylogenyParser parser = null;
254 switch (treeDbClient.getReturnFormat())
256 case TOL_XML_RESPONSE:
257 parser = new TolParser();
260 parser = new NexusPhylogeniesParser();
261 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
264 parser = new NexusPhylogeniesParser();
265 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
266 ((NexusPhylogeniesParser) parser)
267 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
270 parser = new NexusPhylogeniesParser();
271 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
272 ((NexusPhylogeniesParser) parser)
273 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
276 parser = new NHXParser();
278 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
279 ((NHXParser) parser).setReplaceUnderscores(true);
280 ((NHXParser) parser).setGuessRootedness(true);
282 case NH_EXTRACT_TAXONOMY:
283 parser = new NHXParser();
284 ((NHXParser) parser).setTaxonomyExtraction(
285 NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE);
286 ((NHXParser) parser).setReplaceUnderscores(false);
287 ((NHXParser) parser).setGuessRootedness(true);
290 parser = new NHXParser();
291 ((NHXParser) parser).setTaxonomyExtraction(
292 NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_STRICT);
293 ((NHXParser) parser).setReplaceUnderscores(false);
294 ((NHXParser) parser).setGuessRootedness(true);
297 parser = new NHXParser();
299 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
300 ((NHXParser) parser).setReplaceUnderscores(false);
301 ((NHXParser) parser).setGuessRootedness(true);
304 parser = PhyloXmlParser.createPhyloXmlParserXsdValidating();
307 throw new IllegalArgumentException(
308 "unknown format: " + treeDbClient.getReturnFormat());
311 // if (_main_frame.getMainPanel().getCurrentTreePanel() != null)
313 // _main_frame.getMainPanel().getCurrentTreePanel().setWaitCursor();
317 // _main_frame.getMainPanel().setWaitCursor();
319 trees = ForesterUtil.readPhylogeniesFromUrl(url, parser);
320 } catch (final MalformedURLException e)
323 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
324 MessageManager.formatMessage(
325 "exception.unable_to_launch_url", new String[]
327 MessageManager.getString("label.invalid_url"),
328 JvOptionPane.ERROR_MESSAGE);
329 System.err.println(e.getLocalizedMessage());
330 } catch (final IOException e)
333 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
334 "Could not read from " + url + "\n"
335 + e.getLocalizedMessage(),
336 "Failed to read tree from " + treeDbClient.getName() + " for "
338 JvOptionPane.ERROR_MESSAGE);
339 System.err.println(e.getLocalizedMessage());
340 } catch (final NumberFormatException e)
343 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
344 "Could not read from " + url + "\n"
345 + e.getLocalizedMessage(),
346 "Failed to read tree from " + treeDbClient.getName() + " for "
348 JvOptionPane.ERROR_MESSAGE);
349 System.err.println(e.getLocalizedMessage());
350 } catch (final Exception e)
354 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
355 e.getLocalizedMessage(), "Unexpected Exception",
356 JvOptionPane.ERROR_MESSAGE);
357 System.err.println(e.getLocalizedMessage());
359 if ((trees != null) && (trees.length > 0))
361 for (final Phylogeny aptxTree : trees)
363 if (!aptxTree.isEmpty())
365 if (treeDbClient.getName().equals(WebserviceUtil.TREE_FAM_NAME))
367 aptxTree.setRerootable(false);
368 aptxTree.setRooted(true);
370 if (treeDbClient.getProcessingInstructions() != null)
374 WebserviceUtil.processInstructions(treeDbClient,
376 } catch (final PhyloXmlDataFormatException e)
378 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
379 "Error:\n" + e.getLocalizedMessage(), "Error",
380 JvOptionPane.ERROR_MESSAGE);
383 if (treeDbClient.getNodeField() != null)
387 PhylogenyMethods.transferNodeNameToField(aptxTree,
388 treeDbClient.getNodeField(), false);
389 } catch (final PhyloXmlDataFormatException e)
391 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
392 "Error:\n" + e.getLocalizedMessage(), "Error",
393 JvOptionPane.ERROR_MESSAGE);
396 aptxTree.setIdentifier(
397 new Identifier(identifier, treeDbClient.getName()));
398 // _main_frame.getJMenuBar().remove(_main_frame.getHelpMenu());
399 // _main_frame.getMenuBarOfExternalTreeFrameI()
400 // .add(_main_frame.getHelpMenu());
401 // _main_frame.getMainPanel().addExternalTreeIInNewTab(ExternalTreeI,
402 // _main_frame.getConfiguration(),
403 // new File(url.getFile()).getName(), url.toString());
405 Tree jalviewTree = new Tree(aptxTree);
407 ExternalTreeFrame aptxApp = createAptxFrame(jalviewTree,
410 String my_name_for_file = "";
411 if (!ForesterUtil.isEmpty(jalviewTree.getTreeName()))
413 my_name_for_file = new String(jalviewTree.getTreeName())
414 .replaceAll(" ", "_");
416 else if (aptxTree.getIdentifier() != null)
418 final StringBuffer sb = new StringBuffer();
420 .isEmpty(aptxTree.getIdentifier().getProvider()))
422 sb.append(aptxTree.getIdentifier().getProvider());
425 sb.append(aptxTree.getIdentifier().getValue());
426 my_name_for_file = new String(
427 sb.toString().replaceAll(" ", "_"));
429 aptxApp.getTreePanel()
430 .setTreeFile(new File(my_name_for_file));
431 // AptxUtil.lookAtSomeTreePropertiesForAptxControlSettings(
432 // aptxTree, aptxApp.getMainPanel().getControlPanel(),
434 aptxApp.getTreeControls().displayEntireTree();
436 aptxApp.checkMultipleTrees();
440 else if (!exception) // ..what?
442 JvOptionPane.showMessageDialog(null,
443 ForesterUtil.wordWrap(
444 "Failed to read in tree(s) from [" + url + "]", 80),
445 "Error", JvOptionPane.ERROR_MESSAGE);
447 if ((trees != null) && (trees.length > 0))
451 JvOptionPane.showMessageDialog(null,
452 ForesterUtil.wordWrap("Successfully read in "
453 + trees.length + " tree(s) from [" + url + "]",
455 "Success", JvOptionPane.INFORMATION_MESSAGE);
456 } catch (final Exception e)
458 // Not important if this fails, do nothing.
460 // _main_frame.getContentPane().repaint();
467 if (Desktop.instance != null)
469 Desktop.instance.stopLoading();
480 public static ExternalTreeFrame createAptxFrame(
481 final ExternalTreeI aptxTree,
482 final AlignmentViewport jalviewAlignport, String treeTitle)
484 if (APTX_CONFIG == null || APTX_CONFIG.isCouldReadConfigFile() == false)
486 int keepGoing = JvOptionPane.showConfirmDialog(Desktop.desktop,
487 MessageManager.getString("label.aptx_config_not_found"),
488 MessageManager.formatMessage("label.couldnt_locate",
490 { "_aptx_jalview_configuration_file" }),
491 JvOptionPane.YES_NO_CANCEL_OPTION);
493 if (keepGoing == JvOptionPane.CANCEL_OPTION
494 || keepGoing == JvOptionPane.CLOSED_OPTION
495 || keepGoing == JvOptionPane.NO_OPTION)
501 ExternalTreeFrame aptxApp = aptxTree.createInstanceFromTree(treeTitle);
503 ExternalLoadedTreeAssociationI bindAptxNodes = new LoadedTreeSequenceAssociation(
504 jalviewAlignport.getAlignment().getSequencesArray(), aptxTree);
505 bindAptxNodes.associateLeavesToSequences();
507 bindNodesToJalviewSequences(aptxApp, jalviewAlignport,
508 bindAptxNodes.getAlignmentWithNodes(),
509 bindAptxNodes.getNodesWithAlignment());
510 bindTreeViewFrameToJalview(aptxApp);
512 // adaptAptxGui(aptxApp); //moved to AptxFrame
517 public static ExternalTreeViewerBindingI bindNodesToJalviewSequences(
518 final ExternalTreeFrame aptxApp,
519 final AlignmentViewport jalviewAlignViewport,
520 final Map<SequenceI, ExternalTreeNodeI> alignMappedToNodes,
521 final Map<ExternalTreeNodeI, SequenceI> nodesMappedToAlign)
523 JalviewBinding treeBinding = new JalviewBinding(aptxApp,
524 jalviewAlignViewport,
525 alignMappedToNodes, nodesMappedToAlign);
526 activeAptx.put(aptxApp, treeBinding);
531 public static ExternalTreeFrame bindTreeViewFrameToJalview(
532 final ExternalTreeFrame aptxApp)
536 aptxApp.setMinimumSize(new Dimension(width, height));
537 // aptxApp.setFont(Desktop.instance.getFont());
538 // aptxApp.getMainPanel().setFont(Desktop.instance.getFont());
539 String frameTitle = MessageManager.getString("label.aptx_title");
540 File treeFile = aptxApp.getTreePanel().getTreeFile();
541 if (treeFile != null)
543 frameTitle += MessageManager.formatMessage("label.aptx_title_append",
545 { treeFile.getAbsolutePath() });
547 Desktop.addInternalFrame(aptxApp, frameTitle, true, width, height, true,
555 public static Map<ExternalTreeFrame, ExternalTreeViewerBindingI> getAllAptxFrames()