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;
19 import org.forester.archaeopteryx.AptxUtil;
20 import org.forester.archaeopteryx.Archaeopteryx;
21 import org.forester.archaeopteryx.Configuration;
22 import org.forester.archaeopteryx.MainFrame;
23 import org.forester.io.parsers.PhylogenyParser;
24 import org.forester.io.parsers.nexus.NexusPhylogeniesParser;
25 import org.forester.io.parsers.nhx.NHXParser;
26 import org.forester.io.parsers.util.ParserUtils;
27 import org.forester.phylogeny.Phylogeny;
28 import org.forester.phylogeny.PhylogenyMethods;
29 import org.forester.phylogeny.PhylogenyNode;
30 import org.forester.util.ForesterUtil;
33 * Static class for creating Archaeopteryx tree viewer instances from calculated
34 * trees and letting them be bound to Jalview.
36 * @author kjvanderheide
39 public final class AptxInit
42 private final static Configuration APTX_CONFIG = new Configuration(
43 "_aptx_jalview_configuration_file", false, false, false);
45 private final static boolean VALIDATE_PHYLOXML_XSD = APTX_CONFIG
46 .isValidatePhyloXmlAgainstSchema();
48 private final static boolean REPLACE_NHX_UNDERSCORES = APTX_CONFIG
49 .isReplaceUnderscoresInNhParsing();
51 private final static boolean INTERNAL_NUMBERS_AS_CONFIDENCE = APTX_CONFIG
52 .isInternalNumberAreConfidenceForNhParsing();
54 private final static boolean MIDPOINT_REROOT = APTX_CONFIG
57 private final static NHXParser.TAXONOMY_EXTRACTION TAXONOMY_EXTRACTION = APTX_CONFIG
58 .getTaxonomyExtraction();
61 * Test method, should generally not be used as it does not bind the tree to
67 public static MainFrame createUnboundInstance(final Phylogeny aptxTree)
69 return createAptxFrame(aptxTree);
72 // public static MainFrame createInstance(final Phylogeny[] aptxTrees,
73 // AlignmentViewport jalviewAlignmentView)
75 // return createAptxFrameInJalview(aptxTrees);
79 // public static MainFrame createInstance(final Phylogeny aptxTree,
80 // final AlignmentViewport jalviewAlignmentView)
82 // Phylogeny[] aptxTrees = { aptxTree }; // future possibility to load in
83 // // several trees simultaneously
84 // return createAptxFrameInJalview(aptxTrees);
88 public static MainFrame createInstance(
89 final TreeBuilder calculatedTree) // very dense method, to be split up
91 ExternalTreeBuilderI<Phylogeny, PhylogenyNode> aptxTreeBuilder = new AptxTreeBuilder(
94 Phylogeny aptxTree = aptxTreeBuilder.buildTree();
96 MainFrame aptxApp = createAptxFrame(aptxTree);
98 bindNodesToJalviewSequences(aptxApp, calculatedTree.getAvport(),
99 aptxTreeBuilder.getAlignmentBoundNodes(),
100 aptxTreeBuilder.getNodesBoundAlignment());
102 return bindFrameToJalview(aptxApp);
107 * Refactored from Archaeopteryx.main
112 * @throws IOException
113 * @throws FileNotFoundException
115 public static MainFrame[] createInstancesFromFile(String filePath,
116 AlignmentViewport viewport)
117 throws FileNotFoundException, IOException
119 File treeFile = new File(filePath);
120 final String err = ForesterUtil.isReadableFile(treeFile);
121 if (!ForesterUtil.isEmpty(err))
123 JvOptionPane.showMessageDialog(Desktop.desktop, err,
124 MessageManager.getString("label.problem_reading_tree_file"),
125 JvOptionPane.WARNING_MESSAGE);
127 boolean nhx_or_nexus = false;
128 final PhylogenyParser p = ParserUtils.createParserDependingOnFileType(
129 treeFile, VALIDATE_PHYLOXML_XSD);
130 if (p instanceof NHXParser)
133 final NHXParser nhx = (NHXParser) p;
134 nhx.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
135 nhx.setIgnoreQuotes(false);
136 nhx.setTaxonomyExtraction(TAXONOMY_EXTRACTION);
138 else if (p instanceof NexusPhylogeniesParser)
141 final NexusPhylogeniesParser nex = (NexusPhylogeniesParser) p;
142 nex.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES);
143 nex.setIgnoreQuotes(false);
145 // else if (p instanceof PhyloXmlParser)
147 // MainFrameApplication.warnIfNotPhyloXmlValidation(APTX_CONFIG);
149 Phylogeny[] phylogenies = PhylogenyMethods.readPhylogenies(p, treeFile);
150 MainFrame[] aptxFrames = new MainFrame[phylogenies.length];
151 String treeTitle = treeFile.getName();
153 for (int i = 0; i < phylogenies.length; i++)
155 Phylogeny tree = phylogenies[i];
156 if (nhx_or_nexus && INTERNAL_NUMBERS_AS_CONFIDENCE)
158 PhylogenyMethods.transferInternalNodeNamesToConfidence(tree, "");
161 MainFrame aptxApp = Archaeopteryx.createApplication(tree, APTX_CONFIG,
163 LoadedTreeAssociation bindAptxNodes = new LoadedTreeAssociation(
164 viewport.getAlignment().getSequencesArray(), tree);
166 bindAptxNodes.associateLeavesToSequences();
167 bindNodesToJalviewSequences(aptxApp, viewport,
168 bindAptxNodes.getAlignmentWithNodes(),
169 bindAptxNodes.getNodesWithAlignment());
170 bindFrameToJalview(aptxApp);
171 aptxFrames[i] = aptxApp;
178 public static MainFrame[] createInstancesFromUrl(URL treeUrl,
179 AlignmentViewport viewport)
180 throws FileNotFoundException, IOException, RuntimeException
183 String treeTitle = treeUrl.getFile();
184 Phylogeny[] trees = AptxUtil.readPhylogeniesFromUrl(treeUrl,
185 VALIDATE_PHYLOXML_XSD,
186 REPLACE_NHX_UNDERSCORES, INTERNAL_NUMBERS_AS_CONFIDENCE,
187 TAXONOMY_EXTRACTION, MIDPOINT_REROOT);
189 MainFrame[] aptxFrames = new MainFrame[trees.length];
190 for (int i = 0; i < trees.length; i++)
192 Phylogeny tree = trees[i];
193 MainFrame aptxApp = Archaeopteryx.createApplication(tree, APTX_CONFIG,
195 LoadedTreeAssociation bindAptxNodes = new LoadedTreeAssociation(
196 viewport.getAlignment().getSequencesArray(), tree);
198 bindAptxNodes.associateLeavesToSequences();
199 bindNodesToJalviewSequences(aptxApp, viewport,
200 bindAptxNodes.getAlignmentWithNodes(),
201 bindAptxNodes.getNodesWithAlignment());
202 bindFrameToJalview(aptxApp);
203 aptxFrames[i] = aptxApp;
213 public static MainFrame createAptxFrame(
214 final Phylogeny aptxTree)
216 MainFrame aptxApp = Archaeopteryx.createApplication(aptxTree,
222 public static ExternalTreeViewerBindingI<?> bindNodesToJalviewSequences(
223 final MainFrame aptxApp,
224 final AlignmentViewport jalviewAlignViewport,
225 final Map<SequenceI, PhylogenyNode> alignMappedToNodes,
226 final Map<PhylogenyNode, SequenceI> nodesMappedToAlign)
228 return new JalviewBinding(aptxApp, jalviewAlignViewport,
229 alignMappedToNodes, nodesMappedToAlign);
233 public static MainFrame bindFrameToJalview(final MainFrame aptxApp)
237 aptxApp.setMinimumSize(new Dimension(width, height));
238 // aptxApp.setFont(Desktop.instance.getFont());
239 // aptxApp.getMainPanel().setFont(Desktop.instance.getFont());
241 Desktop.addInternalFrame(aptxApp, "Archaeopteryx Tree View", true,
242 width, height, true, true);