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;
20 import org.forester.archaeopteryx.AptxUtil;
21 import org.forester.archaeopteryx.Archaeopteryx;
22 import org.forester.archaeopteryx.Configuration;
23 import org.forester.archaeopteryx.MainFrame;
24 import org.forester.archaeopteryx.webservices.PhylogeniesWebserviceClient;
25 import org.forester.archaeopteryx.webservices.WebserviceUtil;
26 import org.forester.archaeopteryx.webservices.WebservicesManager;
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();
70 public static MainFrame createInstanceFromCalculation(
71 final TreeBuilder calculatedTree)
73 ExternalTreeBuilderI<Phylogeny, PhylogenyNode> aptxTreeBuilder = new AptxTreeBuilder(
76 Phylogeny aptxTree = aptxTreeBuilder.buildTree();
78 MainFrame aptxApp = createAptxFrame(aptxTree,
79 calculatedTree.getAvport(), null);
85 * Refactored from Archaeopteryx.main
91 * @throws FileNotFoundException
93 public static MainFrame[] createInstancesFromFile(String filePath,
94 AlignmentViewport viewport)
95 throws FileNotFoundException, IOException
97 File treeFile = new File(filePath);
98 final String err = ForesterUtil.isReadableFile(treeFile);
99 if (!ForesterUtil.isEmpty(err))
101 JvOptionPane.showMessageDialog(Desktop.desktop, err,
102 MessageManager.getString("label.problem_reading_tree_file"),
103 JvOptionPane.WARNING_MESSAGE);
106 if (Desktop.instance != null)
108 Desktop.instance.startLoading(filePath);
110 boolean nhx_or_nexus = false;
111 final PhylogenyParser p = ParserUtils.createParserDependingOnFileType(
112 treeFile, VALIDATE_PHYLOXML_XSD);
113 if (p instanceof NHXParser)
116 final NHXParser nhx = (NHXParser) p;
117 nhx.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
118 nhx.setIgnoreQuotes(false);
119 nhx.setTaxonomyExtraction(TAXONOMY_EXTRACTION);
121 else if (p instanceof NexusPhylogeniesParser)
124 final NexusPhylogeniesParser nex = (NexusPhylogeniesParser) p;
125 nex.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
126 nex.setIgnoreQuotes(false);
128 // else if (p instanceof PhyloXmlParser)
130 // MainFrameApplication.warnIfNotPhyloXmlValidation(APTX_CONFIG);
132 Phylogeny[] phylogenies = PhylogenyMethods.readPhylogenies(p, treeFile);
133 MainFrame[] aptxFrames = new MainFrame[phylogenies.length];
134 String treeTitle = treeFile.getName();
136 for (int i = 0; i < phylogenies.length; i++)
138 Phylogeny tree = phylogenies[i];
140 if (nhx_or_nexus && INTERNAL_NUMBERS_AS_CONFIDENCE)
142 PhylogenyMethods.transferInternalNodeNamesToConfidence(tree, "");
145 aptxFrames[i] = createAptxFrame(tree, viewport, treeTitle);
147 if (Desktop.instance != null)
149 Desktop.instance.stopLoading();
155 public static MainFrame[] createInstancesFromUrl(URL treeUrl,
156 AlignmentViewport viewport)
157 throws FileNotFoundException, IOException, RuntimeException
160 String treeTitle = treeUrl.getFile();
161 if (Desktop.instance != null)
163 Desktop.instance.startLoading(treeTitle);
165 Phylogeny[] trees = AptxUtil.readPhylogeniesFromUrl(treeUrl,
166 VALIDATE_PHYLOXML_XSD,
167 REPLACE_NHX_UNDERSCORES, INTERNAL_NUMBERS_AS_CONFIDENCE,
168 TAXONOMY_EXTRACTION, MIDPOINT_REROOT);
170 MainFrame[] aptxFrames = new MainFrame[trees.length];
171 for (int i = 0; i < trees.length; i++)
173 Phylogeny tree = trees[i];
174 aptxFrames[i] = createAptxFrame(tree, viewport, treeTitle);
177 if (Desktop.instance != null)
179 Desktop.instance.stopLoading();
187 * Refactored from Forester's UrlTreeReader
189 * @param databaseIndex
193 public static MainFrame[] createInstancesFromDb(int databaseIndex,
194 AlignmentViewport viewport)
196 if (Desktop.desktop != null)
198 // Desktop.desktop.startLoading(treeTitle);
202 Phylogeny[] trees = null;
203 final WebservicesManager webservices_manager = WebservicesManager
205 final PhylogeniesWebserviceClient client = webservices_manager
206 .getAvailablePhylogeniesWebserviceClient(databaseIndex);
207 String identifier = JvOptionPane.showInternalInputDialog(
209 client.getInstructions() + "\n(Reference: "
210 + client.getReference() + ")",
211 client.getDescription(), JvOptionPane.QUESTION_MESSAGE);
212 if ((identifier != null) && (identifier.trim().length() > 0))
214 identifier = identifier.trim();
215 if (client.isQueryInteger())
217 identifier = identifier.replaceAll("^\\D+", "");
221 id = Integer.parseInt(identifier);
222 } catch (final NumberFormatException e)
228 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
229 "Identifier is expected to be a number",
230 "Can not open URL", JvOptionPane.ERROR_MESSAGE);
231 return new MainFrame[0];
233 identifier = id + "";
235 boolean exception = false;
238 String url_str = client.getUrl();
239 url_str = url_str.replaceFirst(
240 PhylogeniesWebserviceClient.QUERY_PLACEHOLDER, identifier);
241 url = new URL(url_str);
242 PhylogenyParser parser = null;
243 switch (client.getReturnFormat())
245 case TOL_XML_RESPONSE:
246 parser = new TolParser();
249 parser = new NexusPhylogeniesParser();
250 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
253 parser = new NexusPhylogeniesParser();
254 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
255 ((NexusPhylogeniesParser) parser)
256 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
259 parser = new NexusPhylogeniesParser();
260 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
261 ((NexusPhylogeniesParser) parser)
262 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
265 parser = new NHXParser();
267 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
268 ((NHXParser) parser).setReplaceUnderscores(true);
269 ((NHXParser) parser).setGuessRootedness(true);
271 case NH_EXTRACT_TAXONOMY:
272 parser = new NHXParser();
273 ((NHXParser) parser).setTaxonomyExtraction(
274 NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE);
275 ((NHXParser) parser).setReplaceUnderscores(false);
276 ((NHXParser) parser).setGuessRootedness(true);
279 parser = new NHXParser();
280 ((NHXParser) parser).setTaxonomyExtraction(
281 NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_STRICT);
282 ((NHXParser) parser).setReplaceUnderscores(false);
283 ((NHXParser) parser).setGuessRootedness(true);
286 parser = new NHXParser();
288 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
289 ((NHXParser) parser).setReplaceUnderscores(false);
290 ((NHXParser) parser).setGuessRootedness(true);
293 parser = PhyloXmlParser.createPhyloXmlParserXsdValidating();
296 throw new IllegalArgumentException(
297 "unknown format: " + client.getReturnFormat());
300 // if (_main_frame.getMainPanel().getCurrentTreePanel() != null)
302 // _main_frame.getMainPanel().getCurrentTreePanel().setWaitCursor();
306 // _main_frame.getMainPanel().setWaitCursor();
308 trees = ForesterUtil.readPhylogeniesFromUrl(url, parser);
309 } catch (final MalformedURLException e)
312 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
313 "Malformed URL: " + url + "\n" + e.getLocalizedMessage(),
314 "Malformed URL", JvOptionPane.ERROR_MESSAGE);
315 } catch (final IOException e)
318 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
319 "Could not read from " + url + "\n"
320 + e.getLocalizedMessage(),
321 "Failed to read tree from " + client.getName() + " for "
323 JvOptionPane.ERROR_MESSAGE);
324 } catch (final NumberFormatException e)
327 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
328 "Could not read from " + url + "\n"
329 + e.getLocalizedMessage(),
330 "Failed to read tree from " + client.getName() + " for "
332 JvOptionPane.ERROR_MESSAGE);
333 } catch (final Exception e)
337 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
338 e.getLocalizedMessage(), "Unexpected Exception",
339 JvOptionPane.ERROR_MESSAGE);
342 // if (_main_frame.getCurrentTreePanel() != null)
344 // _main_frame.getCurrentTreePanel().setArrowCursor();
348 // _main_frame.getMainPanel().setArrowCursor();
351 if ((trees != null) && (trees.length > 0))
353 for (final Phylogeny phylogeny : trees)
355 if (!phylogeny.isEmpty())
357 if (client.getName().equals(WebserviceUtil.TREE_FAM_NAME))
359 phylogeny.setRerootable(false);
360 phylogeny.setRooted(true);
362 if (client.getProcessingInstructions() != null)
366 WebserviceUtil.processInstructions(client, phylogeny);
367 } catch (final PhyloXmlDataFormatException e)
369 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
370 "Error:\n" + e.getLocalizedMessage(), "Error",
371 JvOptionPane.ERROR_MESSAGE);
374 if (client.getNodeField() != null)
378 PhylogenyMethods.transferNodeNameToField(phylogeny,
379 client.getNodeField(), false);
380 } catch (final PhyloXmlDataFormatException e)
382 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
383 "Error:\n" + e.getLocalizedMessage(), "Error",
384 JvOptionPane.ERROR_MESSAGE);
387 phylogeny.setIdentifier(
388 new Identifier(identifier, client.getName()));
389 // _main_frame.getJMenuBar().remove(_main_frame.getHelpMenu());
390 // _main_frame.getMenuBarOfMainFrame()
391 // .add(_main_frame.getHelpMenu());
392 // _main_frame.getMainPanel().addPhylogenyInNewTab(phylogeny,
393 // _main_frame.getConfiguration(),
394 // new File(url.getFile()).getName(), url.toString());
396 MainFrame aptxApp = createAptxFrame(phylogeny, viewport,
398 String my_name_for_file = "";
399 if (!ForesterUtil.isEmpty(phylogeny.getName()))
401 my_name_for_file = new String(phylogeny.getName())
402 .replaceAll(" ", "_");
404 else if (phylogeny.getIdentifier() != null)
406 final StringBuffer sb = new StringBuffer();
408 .isEmpty(phylogeny.getIdentifier().getProvider()))
410 sb.append(phylogeny.getIdentifier().getProvider());
413 sb.append(phylogeny.getIdentifier().getValue());
414 my_name_for_file = new String(
415 sb.toString().replaceAll(" ", "_"));
417 // _main_frame.getMainPanel().getCurrentTreePanel()
418 // .setTreeFile(new File(my_name_for_file));
419 AptxUtil.lookAtSomeTreePropertiesForAptxControlSettings(
420 phylogeny, aptxApp.getMainPanel().getControlPanel(),
422 // _main_frame.getMainPanel().getControlPanel().showWhole();
424 aptxApp.activateSaveAllIfNeeded();
430 JvOptionPane.showMessageDialog(null,
431 ForesterUtil.wordWrap(
432 "Failed to read in tree(s) from [" + url + "]", 80),
433 "Error", JvOptionPane.ERROR_MESSAGE);
435 if ((trees != null) && (trees.length > 0))
439 JvOptionPane.showMessageDialog(null,
440 ForesterUtil.wordWrap("Successfully read in "
441 + trees.length + " tree(s) from [" + url + "]",
443 "Success", JvOptionPane.INFORMATION_MESSAGE);
444 } catch (final Exception e)
446 // Not important if this fails, do nothing.
448 // _main_frame.getContentPane().repaint();
455 if (Desktop.instance != null)
457 Desktop.instance.stopLoading();
468 public static MainFrame createAptxFrame(
469 final Phylogeny aptxTree,
470 final AlignmentViewport jalviewAlignport, String treeTitle)
472 MainFrame aptxApp = Archaeopteryx.createApplication(aptxTree,
473 APTX_CONFIG, treeTitle);
474 // addPartitioningSlider(aptxApp);
477 LoadedTreeAssociation bindAptxNodes = new LoadedTreeAssociation(
478 jalviewAlignport.getAlignment().getSequencesArray(), aptxTree);
480 bindAptxNodes.associateLeavesToSequences();
481 bindNodesToJalviewSequences(aptxApp, jalviewAlignport,
482 bindAptxNodes.getAlignmentWithNodes(),
483 bindAptxNodes.getNodesWithAlignment());
484 bindFrameToJalview(aptxApp);
488 // private static void addPartitioningSlider(MainFrame aptxFrame)
490 // JSlider slider = new JSlider();
495 public static ExternalTreeViewerBindingI<?> bindNodesToJalviewSequences(
496 final MainFrame aptxApp,
497 final AlignmentViewport jalviewAlignViewport,
498 final Map<SequenceI, PhylogenyNode> alignMappedToNodes,
499 final Map<PhylogenyNode, SequenceI> nodesMappedToAlign)
501 return new JalviewBinding(aptxApp, jalviewAlignViewport,
502 alignMappedToNodes, nodesMappedToAlign);
506 public static MainFrame bindFrameToJalview(final MainFrame aptxApp)
510 aptxApp.setMinimumSize(new Dimension(width, height));
511 // aptxApp.setFont(Desktop.instance.getFont());
512 // aptxApp.getMainPanel().setFont(Desktop.instance.getFont());
514 Desktop.addInternalFrame(aptxApp, "Archaeopteryx Tree View", true,
515 width, height, true, true);