1 package jalview.ext.archaeopteryx;
3 import jalview.analysis.TreeBuilder;
4 import jalview.ext.forester.io.UtilityMethods;
5 import jalview.ext.treeviewer.LoadedTreeAssociationI;
6 import jalview.ext.treeviewer.LoadedTreeSequenceAssociation;
7 import jalview.ext.treeviewer.TreeBuilderI;
8 import jalview.ext.treeviewer.TreeFrameI;
9 import jalview.ext.treeviewer.TreeI;
10 import jalview.ext.treeviewer.TreeViewerUtils;
11 import jalview.gui.Desktop;
12 import jalview.gui.JvOptionPane;
13 import jalview.util.MessageManager;
14 import jalview.viewmodel.AlignmentViewport;
17 import java.io.FileNotFoundException;
18 import java.io.IOException;
19 import java.net.MalformedURLException;
22 import org.forester.archaeopteryx.AptxUtil;
23 import org.forester.archaeopteryx.Configuration;
24 import org.forester.archaeopteryx.webservices.PhylogeniesWebserviceClient;
25 import org.forester.archaeopteryx.webservices.WebserviceUtil;
26 import org.forester.io.parsers.PhylogenyParser;
27 import org.forester.io.parsers.nexus.NexusPhylogeniesParser;
28 import org.forester.io.parsers.nhx.NHXParser;
29 import org.forester.io.parsers.phyloxml.PhyloXmlDataFormatException;
30 import org.forester.io.parsers.phyloxml.PhyloXmlParser;
31 import org.forester.io.parsers.tol.TolParser;
32 import org.forester.io.parsers.util.ParserUtils;
33 import org.forester.phylogeny.Phylogeny;
34 import org.forester.phylogeny.PhylogenyMethods;
35 import org.forester.phylogeny.data.Identifier;
36 import org.forester.util.ForesterUtil;
39 * Static class for creating Archaeopteryx tree viewer instances from calculated
40 * trees and letting them be bound to Jalview.
42 * @author kjvanderheide
45 public final class AptxInit
47 public final static Configuration APTX_CONFIG = new Configuration(
48 "resources/_aptx_jalview_configuration_file", false, false,
52 // APTX_CONFIG.setBaseFontFamilyName(
53 // Desktop.instance.getFont().getFamily().replaceAll(" ", "_"));
54 // APTX_CONFIG.setBaseFontSize(Desktop.instance.getFont().getSize());
57 private final static boolean VALIDATE_PHYLOXML_XSD = APTX_CONFIG
58 .isValidatePhyloXmlAgainstSchema();
60 private final static boolean REPLACE_NHX_UNDERSCORES = APTX_CONFIG
61 .isReplaceUnderscoresInNhParsing();
63 private final static boolean INTERNAL_NUMBERS_AS_CONFIDENCE = APTX_CONFIG
64 .isInternalNumberAreConfidenceForNhParsing();
66 private final static boolean MIDPOINT_REROOT = APTX_CONFIG
69 private final static NHXParser.TAXONOMY_EXTRACTION TAXONOMY_EXTRACTION = APTX_CONFIG
70 .getTaxonomyExtraction();
77 public static TreeFrameI createInstanceFromCalculation(
78 final TreeBuilder calculatedTree)
80 TreeBuilderI aptxTreeBuilder = new AptxTreeBuilder(
83 TreeI aptxTree = aptxTreeBuilder.buildTree();
85 TreeFrameI aptxApp = createAptxFrame(aptxTree,
86 calculatedTree.getAvport(), null);
93 * Refactored from Archaeopteryx.main
99 * @throws FileNotFoundException
101 public static TreeFrameI[] createInstancesFromFile(
103 AlignmentViewport viewport)
104 throws FileNotFoundException, IOException
106 File treeFile = new File(filePath);
107 TreeFrameI[] aptxFrames = null;
108 if (UtilityMethods.canForesterReadFile(treeFile))
111 if (Desktop.instance != null)
113 Desktop.instance.startLoading(filePath);
115 boolean nhx_or_nexus = false;
116 final PhylogenyParser parser = ParserUtils
117 .createParserDependingOnFileType(
118 treeFile, VALIDATE_PHYLOXML_XSD);
119 if (parser instanceof NHXParser)
122 final NHXParser nhx = (NHXParser) parser;
123 nhx.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
124 nhx.setIgnoreQuotes(false);
125 nhx.setTaxonomyExtraction(TAXONOMY_EXTRACTION);
127 else if (parser instanceof NexusPhylogeniesParser)
130 final NexusPhylogeniesParser nex = (NexusPhylogeniesParser) parser;
131 nex.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
132 nex.setIgnoreQuotes(false);
134 else if (parser instanceof PhyloXmlParser)
136 if (VALIDATE_PHYLOXML_XSD == false)
138 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
139 MessageManager.getString("error.phyloxml_validation"),
140 MessageManager.getString("label.file_open_error"),
141 JvOptionPane.WARNING_MESSAGE );
144 Phylogeny[] trees = PhylogenyMethods.readPhylogenies(parser,
146 aptxFrames = new TreeFrameI[trees.length];
149 for (int i = 0; i < trees.length; i++)
151 Phylogeny aptxPhylogeny = trees[i];
153 if (nhx_or_nexus && INTERNAL_NUMBERS_AS_CONFIDENCE)
155 PhylogenyMethods.transferInternalNodeNamesToConfidence(aptxPhylogeny,
158 String treeTitle = treeFile.getName() + "[" + i + "]";
159 aptxPhylogeny.setName(treeTitle);
160 aptxFrames[i] = createAptxFrame(aptxPhylogeny, viewport, treeTitle);
163 if (Desktop.instance != null)
165 Desktop.instance.stopLoading();
172 public static TreeFrameI[] createInstancesFromUrl(URL treeUrl,
173 AlignmentViewport viewport)
174 throws FileNotFoundException, IOException, RuntimeException
177 String treeTitle = treeUrl.getFile();
178 if (Desktop.instance != null)
180 Desktop.instance.startLoading(treeTitle);
182 Phylogeny[] trees = AptxUtil.readPhylogeniesFromUrl(treeUrl,
183 VALIDATE_PHYLOXML_XSD,
184 REPLACE_NHX_UNDERSCORES, INTERNAL_NUMBERS_AS_CONFIDENCE,
185 TAXONOMY_EXTRACTION, MIDPOINT_REROOT);
187 TreeFrameI[] aptxFrames = new TreeFrameI[trees.length];
188 for (int i = 0; i < trees.length; i++)
190 Phylogeny aptxTree = trees[i];
191 aptxFrames[i] = createAptxFrame(aptxTree, 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 TreeFrameI[] createInstancesFromDb(
211 PhylogeniesWebserviceClient treeDbClient, String identifier,
212 AlignmentViewport viewport)
216 Phylogeny[] trees = null;
217 TreeFrameI[] aptxFrames = null;
219 if ((identifier != null) && (identifier.trim().length() > 0))
221 if (Desktop.instance != null)
223 Desktop.instance.startLoading(identifier);
226 identifier = identifier.trim();
227 if (treeDbClient.isQueryInteger())
229 identifier = identifier.replaceAll("^\\D+", "");
234 id = Integer.parseInt(identifier);
235 } catch (final NumberFormatException e)
237 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
238 MessageManager.formatMessage(
239 "error.database_id_has_letters", new String[]
241 MessageManager.getString("label.invalid_url"),
242 JvOptionPane.ERROR_MESSAGE);
243 return new TreeFrameI[0];
245 identifier = id + "";
247 boolean exception = false;
250 String url_str = treeDbClient.getUrl();
251 url_str = url_str.replaceFirst(
252 PhylogeniesWebserviceClient.QUERY_PLACEHOLDER, identifier);
253 url = new URL(url_str);
254 PhylogenyParser parser = null;
255 switch (treeDbClient.getReturnFormat())
257 case TOL_XML_RESPONSE:
258 parser = new TolParser();
261 parser = new NexusPhylogeniesParser();
262 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
265 parser = new NexusPhylogeniesParser();
266 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
267 ((NexusPhylogeniesParser) parser)
268 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
271 parser = new NexusPhylogeniesParser();
272 ((NexusPhylogeniesParser) parser).setReplaceUnderscores(true);
273 ((NexusPhylogeniesParser) parser)
274 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
277 parser = new NHXParser();
279 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
280 ((NHXParser) parser).setReplaceUnderscores(true);
281 ((NHXParser) parser).setGuessRootedness(true);
283 case NH_EXTRACT_TAXONOMY:
284 parser = new NHXParser();
285 ((NHXParser) parser).setTaxonomyExtraction(
286 NHXParser.TAXONOMY_EXTRACTION.AGGRESSIVE);
287 ((NHXParser) parser).setReplaceUnderscores(false);
288 ((NHXParser) parser).setGuessRootedness(true);
291 parser = new NHXParser();
292 ((NHXParser) parser).setTaxonomyExtraction(
293 NHXParser.TAXONOMY_EXTRACTION.PFAM_STYLE_STRICT);
294 ((NHXParser) parser).setReplaceUnderscores(false);
295 ((NHXParser) parser).setGuessRootedness(true);
298 parser = new NHXParser();
300 .setTaxonomyExtraction(NHXParser.TAXONOMY_EXTRACTION.NO);
301 ((NHXParser) parser).setReplaceUnderscores(false);
302 ((NHXParser) parser).setGuessRootedness(true);
305 parser = PhyloXmlParser.createPhyloXmlParserXsdValidating();
308 throw new IllegalArgumentException(
309 "unknown format: " + treeDbClient.getReturnFormat());
312 // if (_main_frame.getMainPanel().getCurrentTreePanel() != null)
314 // _main_frame.getMainPanel().getCurrentTreePanel().setWaitCursor();
318 // _main_frame.getMainPanel().setWaitCursor();
320 trees = ForesterUtil.readPhylogeniesFromUrl(url, parser);
321 aptxFrames = new TreeFrameI[trees.length];
322 } catch (final MalformedURLException e)
325 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
326 MessageManager.formatMessage(
327 "exception.unable_to_launch_url", new String[]
329 MessageManager.getString("label.invalid_url"),
330 JvOptionPane.ERROR_MESSAGE);
331 System.err.println(e.getLocalizedMessage());
332 } catch (final IOException e)
335 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
336 "Could not read from " + url + "\n"
337 + e.getLocalizedMessage(),
338 "Failed to read tree from " + treeDbClient.getName() + " for "
340 JvOptionPane.ERROR_MESSAGE);
341 System.err.println(e.getLocalizedMessage());
342 } catch (final NumberFormatException e)
345 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
346 "Could not read from " + url + "\n"
347 + e.getLocalizedMessage(),
348 "Failed to read tree from " + treeDbClient.getName() + " for "
350 JvOptionPane.ERROR_MESSAGE);
351 System.err.println(e.getLocalizedMessage());
352 } catch (final Exception e)
356 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
357 e.getLocalizedMessage(), "Unexpected Exception",
358 JvOptionPane.ERROR_MESSAGE);
359 System.err.println(e.getLocalizedMessage());
361 if ((trees != null) && (trees.length > 0))
364 for (final Phylogeny aptxTree : trees)
366 if (!aptxTree.isEmpty())
368 if (treeDbClient.getName().equals(WebserviceUtil.TREE_FAM_NAME))
370 aptxTree.setRerootable(false);
371 aptxTree.setRooted(true);
373 if (treeDbClient.getProcessingInstructions() != null)
377 WebserviceUtil.processInstructions(treeDbClient,
379 } catch (final PhyloXmlDataFormatException e)
381 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
382 "Error:\n" + e.getLocalizedMessage(), "Error",
383 JvOptionPane.ERROR_MESSAGE);
386 if (treeDbClient.getNodeField() != null)
390 PhylogenyMethods.transferNodeNameToField(aptxTree,
391 treeDbClient.getNodeField(), false);
392 } catch (final PhyloXmlDataFormatException e)
394 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
395 "Error:\n" + e.getLocalizedMessage(), "Error",
396 JvOptionPane.ERROR_MESSAGE);
399 aptxTree.setIdentifier(
400 new Identifier(identifier, treeDbClient.getName()));
401 // _main_frame.getJMenuBar().remove(_main_frame.getHelpMenu());
402 // _main_frame.getMenuBarOfExternalTreeFrameI()
403 // .add(_main_frame.getHelpMenu());
404 // _main_frame.getMainPanel().addExternalTreeIInNewTab(ExternalTreeI,
405 // _main_frame.getConfiguration(),
406 // new File(url.getFile()).getName(), url.toString());
409 TreeFrameI aptxApp = createAptxFrame(aptxTree,
412 String my_name_for_file = "";
413 if (!ForesterUtil.isEmpty(aptxTree.getName()))
415 my_name_for_file = new String(aptxTree.getName())
416 .replaceAll(" ", "_");
418 else if (aptxTree.getIdentifier() != null)
420 final StringBuffer sb = new StringBuffer();
422 .isEmpty(aptxTree.getIdentifier().getProvider()))
424 sb.append(aptxTree.getIdentifier().getProvider());
427 sb.append(aptxTree.getIdentifier().getValue());
428 my_name_for_file = new String(
429 sb.toString().replaceAll(" ", "_"));
431 aptxApp.getTreePanel()
432 .setTreeFile(new File(my_name_for_file));
433 // AptxUtil.lookAtSomeTreePropertiesForAptxControlSettings(
434 // aptxTree, aptxApp.getMainPanel().getControlPanel(),
436 aptxApp.getTreeControls().displayEntireTree();
438 aptxApp.checkMultipleTrees();
439 aptxFrames[i++] = aptxApp;
443 else if (!exception) // ..what?
445 JvOptionPane.showMessageDialog(null,
446 ForesterUtil.wordWrap(
447 "Failed to read in tree(s) from [" + url + "]", 80),
448 "Error", JvOptionPane.ERROR_MESSAGE);
450 if ((trees != null) && (trees.length > 0))
454 JvOptionPane.showMessageDialog(null,
455 ForesterUtil.wordWrap("Successfully read in "
456 + trees.length + " tree(s) from [" + url + "]",
458 "Success", JvOptionPane.INFORMATION_MESSAGE);
459 } catch (final Exception e)
461 // Not important if this fails, do nothing.
463 // _main_frame.getContentPane().repaint();
470 if (Desktop.instance != null)
472 Desktop.instance.stopLoading();
481 public static TreeFrameI createAptxFrame(TreeI aptxTree,
482 AlignmentViewport jalviewAlignport, String treeTitle)
484 validateConfig(APTX_CONFIG);
485 TreeFrameI aptxApp = aptxTree
486 .createTreeViewerFromTree(treeTitle);
487 TreeI jalviewTree = aptxApp.getTree();
488 LoadedTreeAssociationI bindAptxNodes = new LoadedTreeSequenceAssociation(
489 jalviewAlignport.getAlignment().getSequencesArray(),
491 bindAptxNodes.associateLeavesToSequences();
493 TreeViewerUtils.associateNodesWithJalviewSequences(aptxApp, jalviewAlignport,
494 bindAptxNodes.getAlignmentWithNodes(),
495 bindAptxNodes.getNodesWithAlignment());
496 TreeViewerUtils.addTreeViewFrameToJalview(aptxApp);
498 // adaptAptxGui(aptxApp); //moved to AptxFrame
503 protected static TreeFrameI createAptxFrame(
504 final Phylogeny aptxTree,
505 final AlignmentViewport jalviewAlignport, String treeTitle)
507 validateConfig(APTX_CONFIG);
508 TreeFrameI aptxApp = new AptxFrame(aptxTree, APTX_CONFIG,
510 TreeI jalviewTree = aptxApp.getTree();
511 LoadedTreeAssociationI bindAptxNodes = new LoadedTreeSequenceAssociation(
512 jalviewAlignport.getAlignment().getSequencesArray(),
514 bindAptxNodes.associateLeavesToSequences();
516 TreeViewerUtils.associateNodesWithJalviewSequences(aptxApp, jalviewAlignport,
517 bindAptxNodes.getAlignmentWithNodes(),
518 bindAptxNodes.getNodesWithAlignment());
519 TreeViewerUtils.addTreeViewFrameToJalview(aptxApp);
521 // adaptAptxGui(aptxApp); //moved to AptxFrame
526 private static boolean validateConfig(Configuration aptxConfig)
528 if (aptxConfig == null || aptxConfig.isCouldReadConfigFile() == false)
530 int keepGoing = JvOptionPane.showConfirmDialog(Desktop.desktop,
531 MessageManager.getString("label.aptx_config_not_found"),
532 MessageManager.formatMessage("label.couldnt_locate",
534 { "_aptx_jalview_configuration_file" }),
535 JvOptionPane.YES_NO_CANCEL_OPTION);
537 if (keepGoing == JvOptionPane.CANCEL_OPTION
538 || keepGoing == JvOptionPane.CLOSED_OPTION
539 || keepGoing == JvOptionPane.NO_OPTION)