1 package jalview.ext.archaeopteryx;
3 import jalview.analysis.TreeBuilder;
4 import jalview.datamodel.SequenceI;
5 import jalview.ext.treeviewer.ExternalTreeBuilderI;
6 import jalview.ext.treeviewer.ExternalTreeViewerBindingI;
7 import jalview.gui.Desktop;
8 import jalview.gui.JvOptionPane;
9 import jalview.util.MessageManager;
10 import jalview.viewmodel.AlignmentViewport;
12 import java.awt.Dimension;
14 import java.io.FileNotFoundException;
15 import java.io.IOException;
16 import java.net.MalformedURLException;
18 import java.util.HashMap;
21 import org.forester.archaeopteryx.AptxUtil;
22 import org.forester.archaeopteryx.Archaeopteryx;
23 import org.forester.archaeopteryx.Configuration;
24 import org.forester.archaeopteryx.MainFrame;
25 import org.forester.archaeopteryx.webservices.PhylogeniesWebserviceClient;
26 import org.forester.archaeopteryx.webservices.WebserviceUtil;
27 import org.forester.io.parsers.PhylogenyParser;
28 import org.forester.io.parsers.nexus.NexusPhylogeniesParser;
29 import org.forester.io.parsers.nhx.NHXParser;
30 import org.forester.io.parsers.phyloxml.PhyloXmlDataFormatException;
31 import org.forester.io.parsers.phyloxml.PhyloXmlParser;
32 import org.forester.io.parsers.tol.TolParser;
33 import org.forester.io.parsers.util.ParserUtils;
34 import org.forester.phylogeny.Phylogeny;
35 import org.forester.phylogeny.PhylogenyMethods;
36 import org.forester.phylogeny.PhylogenyNode;
37 import org.forester.phylogeny.data.Identifier;
38 import org.forester.util.ForesterUtil;
41 * Static class for creating Archaeopteryx tree viewer instances from calculated
42 * trees and letting them be bound to Jalview.
44 * @author kjvanderheide
47 public final class AptxInit
50 private final static Configuration APTX_CONFIG = new Configuration(
51 "_aptx_jalview_configuration_file", false, false, false);
53 private final static boolean VALIDATE_PHYLOXML_XSD = APTX_CONFIG
54 .isValidatePhyloXmlAgainstSchema();
56 private final static boolean REPLACE_NHX_UNDERSCORES = APTX_CONFIG
57 .isReplaceUnderscoresInNhParsing();
59 private final static boolean INTERNAL_NUMBERS_AS_CONFIDENCE = APTX_CONFIG
60 .isInternalNumberAreConfidenceForNhParsing();
62 private final static boolean MIDPOINT_REROOT = APTX_CONFIG
65 private final static NHXParser.TAXONOMY_EXTRACTION TAXONOMY_EXTRACTION = APTX_CONFIG
66 .getTaxonomyExtraction();
68 private static Map<MainFrame, JalviewBinding> activeAptx = new HashMap<>();
72 public static MainFrame createInstanceFromCalculation(
73 final TreeBuilder calculatedTree)
75 ExternalTreeBuilderI<Phylogeny, PhylogenyNode> aptxTreeBuilder = new AptxTreeBuilder(
78 Phylogeny aptxTree = aptxTreeBuilder.buildTree();
80 MainFrame aptxApp = createAptxFrame(aptxTree,
81 calculatedTree.getAvport(), null);
87 * Refactored from Archaeopteryx.main
93 * @throws FileNotFoundException
95 public static MainFrame[] createInstancesFromFile(String filePath,
96 AlignmentViewport viewport)
97 throws FileNotFoundException, IOException
99 File treeFile = new File(filePath);
100 final String err = ForesterUtil.isReadableFile(treeFile);
101 if (!ForesterUtil.isEmpty(err))
103 JvOptionPane.showMessageDialog(Desktop.desktop, err,
104 MessageManager.getString("label.problem_reading_tree_file"),
105 JvOptionPane.WARNING_MESSAGE);
108 if (Desktop.instance != null)
110 Desktop.instance.startLoading(filePath);
112 boolean nhx_or_nexus = false;
113 final PhylogenyParser parser = ParserUtils.createParserDependingOnFileType(
114 treeFile, VALIDATE_PHYLOXML_XSD);
115 if (parser instanceof NHXParser)
118 final NHXParser nhx = (NHXParser) parser;
119 nhx.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
120 nhx.setIgnoreQuotes(false);
121 nhx.setTaxonomyExtraction(TAXONOMY_EXTRACTION);
123 else if (parser instanceof NexusPhylogeniesParser)
126 final NexusPhylogeniesParser nex = (NexusPhylogeniesParser) parser;
127 nex.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
128 nex.setIgnoreQuotes(false);
130 else if (parser instanceof PhyloXmlParser)
132 if (VALIDATE_PHYLOXML_XSD == false)
134 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
135 MessageManager.getString("error.phyloxml_validation"),
136 MessageManager.getString("label.file_open_error"),
137 JvOptionPane.WARNING_MESSAGE );
140 Phylogeny[] trees = PhylogenyMethods.readPhylogenies(parser, treeFile);
141 MainFrame[] aptxFrames = new MainFrame[trees.length];
144 for (int i = 0; i < trees.length; i++)
146 Phylogeny tree = trees[i];
148 if (nhx_or_nexus && INTERNAL_NUMBERS_AS_CONFIDENCE)
150 PhylogenyMethods.transferInternalNodeNamesToConfidence(tree, "");
152 String treeTitle = treeFile.getName() + "[" + i + "]";
153 tree.setName(treeTitle);
154 aptxFrames[i] = createAptxFrame(tree, viewport, treeTitle);
157 if (Desktop.instance != null)
159 Desktop.instance.stopLoading();
165 public static MainFrame[] createInstancesFromUrl(URL treeUrl,
166 AlignmentViewport viewport)
167 throws FileNotFoundException, IOException, RuntimeException
170 String treeTitle = treeUrl.getFile();
171 if (Desktop.instance != null)
173 Desktop.instance.startLoading(treeTitle);
175 Phylogeny[] trees = AptxUtil.readPhylogeniesFromUrl(treeUrl,
176 VALIDATE_PHYLOXML_XSD,
177 REPLACE_NHX_UNDERSCORES, INTERNAL_NUMBERS_AS_CONFIDENCE,
178 TAXONOMY_EXTRACTION, MIDPOINT_REROOT);
180 MainFrame[] aptxFrames = new MainFrame[trees.length];
181 for (int i = 0; i < trees.length; i++)
183 Phylogeny tree = trees[i];
184 aptxFrames[i] = createAptxFrame(tree, viewport, treeTitle);
187 if (Desktop.instance != null)
189 Desktop.instance.stopLoading();
197 * Refactored from Forester's UrlTreeReader, this can be more efficient
199 * @param databaseIndex
203 public static MainFrame[] createInstancesFromDb(
204 PhylogeniesWebserviceClient treeDbClient, String identifier,
205 AlignmentViewport viewport)
209 Phylogeny[] trees = null;
211 if ((identifier != null) && (identifier.trim().length() > 0))
213 if (Desktop.instance != null)
215 Desktop.instance.startLoading(identifier);
218 identifier = identifier.trim();
219 if (treeDbClient.isQueryInteger())
221 identifier = identifier.replaceAll("^\\D+", "");
226 id = Integer.parseInt(identifier);
227 } catch (final NumberFormatException e)
229 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
230 MessageManager.formatMessage(
231 "error.database_id_has_letters", new String[]
233 MessageManager.getString("label.invalid_url"),
234 JvOptionPane.ERROR_MESSAGE);
235 return new MainFrame[0];
237 identifier = id + "";
239 boolean exception = false;
242 String url_str = treeDbClient.getUrl();
243 url_str = url_str.replaceFirst(
244 PhylogeniesWebserviceClient.QUERY_PLACEHOLDER, identifier);
245 url = new URL(url_str);
246 PhylogenyParser parser = null;
247 switch (treeDbClient.getReturnFormat())
249 case TOL_XML_RESPONSE:
250 parser = new TolParser();
253 parser = new NexusPhylogeniesParser();
254 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
257 parser = new NexusPhylogeniesParser();
258 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
259 ((NexusPhylogeniesParser) parser)
260 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
263 parser = new NexusPhylogeniesParser();
264 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
265 ((NexusPhylogeniesParser) parser)
266 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
269 parser = new NHXParser();
271 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
272 ((NHXParser) parser).setReplaceUnderscores(true);
273 ((NHXParser) parser).setGuessRootedness(true);
275 case NH_EXTRACT_TAXONOMY:
276 parser = new NHXParser();
277 ((NHXParser) parser).setTaxonomyExtraction(
278 NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE);
279 ((NHXParser) parser).setReplaceUnderscores(false);
280 ((NHXParser) parser).setGuessRootedness(true);
283 parser = new NHXParser();
284 ((NHXParser) parser).setTaxonomyExtraction(
285 NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_STRICT);
286 ((NHXParser) parser).setReplaceUnderscores(false);
287 ((NHXParser) parser).setGuessRootedness(true);
290 parser = new NHXParser();
292 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
293 ((NHXParser) parser).setReplaceUnderscores(false);
294 ((NHXParser) parser).setGuessRootedness(true);
297 parser = PhyloXmlParser.createPhyloXmlParserXsdValidating();
300 throw new IllegalArgumentException(
301 "unknown format: " + treeDbClient.getReturnFormat());
304 // if (_main_frame.getMainPanel().getCurrentTreePanel() != null)
306 // _main_frame.getMainPanel().getCurrentTreePanel().setWaitCursor();
310 // _main_frame.getMainPanel().setWaitCursor();
312 trees = ForesterUtil.readPhylogeniesFromUrl(url, parser);
313 } catch (final MalformedURLException e)
316 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
317 MessageManager.formatMessage(
318 "exception.unable_to_launch_url", new String[]
320 MessageManager.getString("label.invalid_url"),
321 JvOptionPane.ERROR_MESSAGE);
322 System.err.println(e.getLocalizedMessage());
323 } catch (final IOException e)
326 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
327 "Could not read from " + url + "\n"
328 + e.getLocalizedMessage(),
329 "Failed to read tree from " + treeDbClient.getName() + " for "
331 JvOptionPane.ERROR_MESSAGE);
332 System.err.println(e.getLocalizedMessage());
333 } catch (final NumberFormatException e)
336 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
337 "Could not read from " + url + "\n"
338 + e.getLocalizedMessage(),
339 "Failed to read tree from " + treeDbClient.getName() + " for "
341 JvOptionPane.ERROR_MESSAGE);
342 System.err.println(e.getLocalizedMessage());
343 } catch (final Exception e)
347 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
348 e.getLocalizedMessage(), "Unexpected Exception",
349 JvOptionPane.ERROR_MESSAGE);
350 System.err.println(e.getLocalizedMessage());
352 if ((trees != null) && (trees.length > 0))
354 for (final Phylogeny phylogeny : trees)
356 if (!phylogeny.isEmpty())
358 if (treeDbClient.getName().equals(WebserviceUtil.TREE_FAM_NAME))
360 phylogeny.setRerootable(false);
361 phylogeny.setRooted(true);
363 if (treeDbClient.getProcessingInstructions() != null)
367 WebserviceUtil.processInstructions(treeDbClient, phylogeny);
368 } catch (final PhyloXmlDataFormatException e)
370 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
371 "Error:\n" + e.getLocalizedMessage(), "Error",
372 JvOptionPane.ERROR_MESSAGE);
375 if (treeDbClient.getNodeField() != null)
379 PhylogenyMethods.transferNodeNameToField(phylogeny,
380 treeDbClient.getNodeField(), false);
381 } catch (final PhyloXmlDataFormatException e)
383 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
384 "Error:\n" + e.getLocalizedMessage(), "Error",
385 JvOptionPane.ERROR_MESSAGE);
388 phylogeny.setIdentifier(
389 new Identifier(identifier, treeDbClient.getName()));
390 // _main_frame.getJMenuBar().remove(_main_frame.getHelpMenu());
391 // _main_frame.getMenuBarOfMainFrame()
392 // .add(_main_frame.getHelpMenu());
393 // _main_frame.getMainPanel().addPhylogenyInNewTab(phylogeny,
394 // _main_frame.getConfiguration(),
395 // new File(url.getFile()).getName(), url.toString());
397 MainFrame aptxApp = createAptxFrame(phylogeny, viewport,
399 String my_name_for_file = "";
400 if (!ForesterUtil.isEmpty(phylogeny.getName()))
402 my_name_for_file = new String(phylogeny.getName())
403 .replaceAll(" ", "_");
405 else if (phylogeny.getIdentifier() != null)
407 final StringBuffer sb = new StringBuffer();
409 .isEmpty(phylogeny.getIdentifier().getProvider()))
411 sb.append(phylogeny.getIdentifier().getProvider());
414 sb.append(phylogeny.getIdentifier().getValue());
415 my_name_for_file = new String(
416 sb.toString().replaceAll(" ", "_"));
418 aptxApp.getMainPanel().getCurrentTreePanel()
419 .setTreeFile(new File(my_name_for_file));
420 AptxUtil.lookAtSomeTreePropertiesForAptxControlSettings(
421 phylogeny, aptxApp.getMainPanel().getControlPanel(),
423 // _main_frame.getMainPanel().getControlPanel().showWhole();
425 aptxApp.activateSaveAllIfNeeded();
429 else if (!exception) // ..what?
431 JvOptionPane.showMessageDialog(null,
432 ForesterUtil.wordWrap(
433 "Failed to read in tree(s) from [" + url + "]", 80),
434 "Error", JvOptionPane.ERROR_MESSAGE);
436 if ((trees != null) && (trees.length > 0))
440 JvOptionPane.showMessageDialog(null,
441 ForesterUtil.wordWrap("Successfully read in "
442 + trees.length + " tree(s) from [" + url + "]",
444 "Success", JvOptionPane.INFORMATION_MESSAGE);
445 } catch (final Exception e)
447 // Not important if this fails, do nothing.
449 // _main_frame.getContentPane().repaint();
456 if (Desktop.instance != null)
458 Desktop.instance.stopLoading();
469 public static MainFrame createAptxFrame(
470 final Phylogeny aptxTree,
471 final AlignmentViewport jalviewAlignport, String treeTitle)
473 MainFrame aptxApp = Archaeopteryx.createApplication(aptxTree,
474 APTX_CONFIG, treeTitle);
476 LoadedTreeSequenceAssociation bindAptxNodes = new LoadedTreeSequenceAssociation(
477 jalviewAlignport.getAlignment().getSequencesArray(), aptxTree);
478 bindAptxNodes.associateLeavesToSequences();
480 bindNodesToJalviewSequences(aptxApp, jalviewAlignport,
481 bindAptxNodes.getAlignmentWithNodes(),
482 bindAptxNodes.getNodesWithAlignment());
483 bindTreeViewFrameToJalview(aptxApp);
489 public static ExternalTreeViewerBindingI<?> bindNodesToJalviewSequences(
490 final MainFrame aptxApp,
491 final AlignmentViewport jalviewAlignViewport,
492 final Map<SequenceI, PhylogenyNode> alignMappedToNodes,
493 final Map<PhylogenyNode, SequenceI> nodesMappedToAlign)
495 JalviewBinding treeBinding = new JalviewBinding(aptxApp,
496 jalviewAlignViewport,
497 alignMappedToNodes, nodesMappedToAlign);
498 activeAptx.put(aptxApp, treeBinding);
503 public static MainFrame bindTreeViewFrameToJalview(
504 final MainFrame aptxApp)
508 aptxApp.setMinimumSize(new Dimension(width, height));
509 // aptxApp.setFont(Desktop.instance.getFont());
510 // aptxApp.getMainPanel().setFont(Desktop.instance.getFont());
511 String frameTitle = MessageManager.getString("label.aptx_title");
512 File treeFile = aptxApp.getMainPanel().getCurrentTreePanel()
514 if (treeFile != null)
516 frameTitle += MessageManager.formatMessage("label.aptx_title_append",
518 { treeFile.getAbsolutePath() });
520 Desktop.addInternalFrame(aptxApp, frameTitle, true, width, height, true,
526 public static Map<MainFrame, JalviewBinding> getAllAptxFrames()