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.viewmodel.AlignmentViewport;
10 import java.awt.Dimension;
11 import java.io.FileNotFoundException;
12 import java.io.IOException;
16 import org.forester.archaeopteryx.AptxUtil;
17 import org.forester.archaeopteryx.Archaeopteryx;
18 import org.forester.archaeopteryx.Configuration;
19 import org.forester.archaeopteryx.MainFrame;
20 import org.forester.io.parsers.nhx.NHXParser;
21 import org.forester.phylogeny.Phylogeny;
22 import org.forester.phylogeny.PhylogenyNode;
25 * Static class for creating Archaeopteryx tree viewer instances from calculated
26 * trees and letting them be bound to Jalview.
28 * @author kjvanderheide
31 public final class AptxInit
34 private final static Configuration APTX_CONFIG = new Configuration(
35 "_aptx_jalview_configuration_file", false, false, false);
37 private final static boolean VALIDATE_PHYLOXML_XSD = APTX_CONFIG
38 .isValidatePhyloXmlAgainstSchema();
40 private final static boolean REPLACE_NHX_UNDERSCORES = APTX_CONFIG
41 .isReplaceUnderscoresInNhParsing();
43 private final static boolean INTERNAL_NUMBERS_AS_CONFIDENCE = APTX_CONFIG
44 .isInternalNumberAreConfidenceForNhParsing();
46 private final static boolean MIDPOINT_REROOT = APTX_CONFIG
49 private final static NHXParser.TAXONOMY_EXTRACTION TAXONOMY_EXTRACTION = APTX_CONFIG
50 .getTaxonomyExtraction();
53 * Test method, should generally not be used as it does not bind the tree to
59 public static MainFrame createUnboundInstance(final Phylogeny aptxTree)
61 Phylogeny[] aptxTrees = { aptxTree };
62 return createAptxFrame(aptxTrees);
65 // public static MainFrame createInstance(final Phylogeny[] aptxTrees,
66 // AlignmentViewport jalviewAlignmentView)
68 // return createAptxFrameInJalview(aptxTrees);
72 // public static MainFrame createInstance(final Phylogeny aptxTree,
73 // final AlignmentViewport jalviewAlignmentView)
75 // Phylogeny[] aptxTrees = { aptxTree }; // future possibility to load in
76 // // several trees simultaneously
77 // return createAptxFrameInJalview(aptxTrees);
81 public static MainFrame createInstance(
82 final TreeBuilder calculatedTree) // very dense method, to be split up
84 ExternalTreeBuilderI<Phylogeny, PhylogenyNode> aptxTreeBuilder = new AptxTreeBuilder(
87 Phylogeny aptxTree = aptxTreeBuilder.buildTree();
88 Phylogeny[] aptxTrees = { aptxTree }; // future possibility to load in
89 // several trees simultaneously
91 MainFrame aptxApp = createAptxFrame(aptxTrees);
93 bindNodesToJalviewSequences(aptxApp, calculatedTree.getAvport(),
94 aptxTreeBuilder.getAlignmentBoundNodes(),
95 aptxTreeBuilder.getNodesBoundAlignment());
97 return bindFrameToJalview(aptxApp);
101 public static MainFrame createInstanceFromFile(String filePath,
102 AlignmentViewport viewport)
104 String[] AptxArgs = new String[] { "-c",
105 APTX_CONFIG.getConfigFilename(), filePath };
106 MainFrame aptxApp = Archaeopteryx.main(AptxArgs);
108 int tabCount = aptxApp.getMainPanel().getTabbedPane().getTabCount();
110 for (int i = 0; i < tabCount; i++)
112 // roundabout way to select each tree because getComponentAt(i) requires
113 // casting to TreePanel which doesn't work
114 aptxApp.getMainPanel().getTabbedPane().setSelectedIndex(i);
115 Phylogeny tree = aptxApp.getMainPanel().getCurrentTreePanel()
118 LoadedTreeAssociation bindAptxNodes = new LoadedTreeAssociation(
119 viewport.getAlignment().getSequencesArray(),
122 bindAptxNodes.associateLeavesToSequences();
124 bindNodesToJalviewSequences(aptxApp, viewport,
125 bindAptxNodes.getAlignmentWithNodes(),
126 bindAptxNodes.getNodesWithAlignment());
128 return bindFrameToJalview(aptxApp);
131 public static MainFrame createInstanceFromUrl(URL treeUrl,
132 AlignmentViewport viewport)
133 throws FileNotFoundException, IOException, RuntimeException
135 String treeTitle = treeUrl.getFile();
136 Phylogeny[] trees = AptxUtil.readPhylogeniesFromUrl(treeUrl,
137 VALIDATE_PHYLOXML_XSD,
138 REPLACE_NHX_UNDERSCORES, INTERNAL_NUMBERS_AS_CONFIDENCE,
139 TAXONOMY_EXTRACTION, MIDPOINT_REROOT);
140 MainFrame aptxApp = Archaeopteryx.createApplication(trees, APTX_CONFIG,
143 for (Phylogeny tree : trees)
145 LoadedTreeAssociation bindAptxNodes = new LoadedTreeAssociation(
146 viewport.getAlignment().getSequencesArray(), tree);
148 bindAptxNodes.associateLeavesToSequences();
149 bindNodesToJalviewSequences(aptxApp, viewport,
150 bindAptxNodes.getAlignmentWithNodes(),
151 bindAptxNodes.getNodesWithAlignment());
155 return bindFrameToJalview(aptxApp);
162 public static MainFrame createAptxFrame(
163 final Phylogeny[] aptxTrees)
165 MainFrame aptxApp = Archaeopteryx.createApplication(aptxTrees,
171 public static ExternalTreeViewerBindingI<?> bindNodesToJalviewSequences(
172 final MainFrame aptxApp,
173 final AlignmentViewport jalviewAlignViewport,
174 final Map<SequenceI, PhylogenyNode> alignMappedToNodes,
175 final Map<PhylogenyNode, SequenceI> nodesMappedToAlign)
177 return new JalviewBinding(aptxApp, jalviewAlignViewport,
178 alignMappedToNodes, nodesMappedToAlign);
182 public static MainFrame bindFrameToJalview(final MainFrame aptxApp)
186 aptxApp.setMinimumSize(new Dimension(width, height));
187 // aptxApp.setFont(Desktop.instance.getFont());
188 // aptxApp.getMainPanel().setFont(Desktop.instance.getFont());
190 Desktop.addInternalFrame(aptxApp, "Archaeopteryx Tree View", true,
191 width, height, true, true);