package jalview.ext.archaeopteryx; import jalview.analysis.TreeBuilder; import jalview.datamodel.SequenceI; import jalview.ext.treeviewer.ExternalTreeBuilderI; import jalview.ext.treeviewer.ExternalTreeViewerBindingI; import jalview.gui.Desktop; import jalview.gui.JvOptionPane; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; import java.awt.Dimension; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import java.util.Map; import org.forester.archaeopteryx.AptxUtil; import org.forester.archaeopteryx.Archaeopteryx; import org.forester.archaeopteryx.Configuration; import org.forester.archaeopteryx.MainFrame; import org.forester.io.parsers.PhylogenyParser; import org.forester.io.parsers.nexus.NexusPhylogeniesParser; import org.forester.io.parsers.nhx.NHXParser; import org.forester.io.parsers.util.ParserUtils; import org.forester.phylogeny.Phylogeny; import org.forester.phylogeny.PhylogenyMethods; import org.forester.phylogeny.PhylogenyNode; import org.forester.util.ForesterUtil; /** * Static class for creating Archaeopteryx tree viewer instances from calculated * trees and letting them be bound to Jalview. * * @author kjvanderheide * */ public final class AptxInit { private final static Configuration APTX_CONFIG = new Configuration( "_aptx_jalview_configuration_file", false, false, false); private final static boolean VALIDATE_PHYLOXML_XSD = APTX_CONFIG .isValidatePhyloXmlAgainstSchema(); private final static boolean REPLACE_NHX_UNDERSCORES = APTX_CONFIG .isReplaceUnderscoresInNhParsing(); private final static boolean INTERNAL_NUMBERS_AS_CONFIDENCE = APTX_CONFIG .isInternalNumberAreConfidenceForNhParsing(); private final static boolean MIDPOINT_REROOT = APTX_CONFIG .isMidpointReroot(); private final static NHXParser.TAXONOMY_EXTRACTION TAXONOMY_EXTRACTION = APTX_CONFIG .getTaxonomyExtraction(); public static MainFrame createInstanceFromCalculation( final TreeBuilder calculatedTree) // very dense method, to be split up { ExternalTreeBuilderI aptxTreeBuilder = new AptxTreeBuilder( calculatedTree); Phylogeny aptxTree = aptxTreeBuilder.buildTree(); MainFrame aptxApp = createAptxFrame(aptxTree, calculatedTree.getAvport(), null); return aptxApp; } /** * Refactored from Archaeopteryx.main * * @param filePath * @param viewport * @return * @throws IOException * @throws FileNotFoundException */ public static MainFrame[] createInstancesFromFile(String filePath, AlignmentViewport viewport) throws FileNotFoundException, IOException { File treeFile = new File(filePath); final String err = ForesterUtil.isReadableFile(treeFile); if (!ForesterUtil.isEmpty(err)) { JvOptionPane.showMessageDialog(Desktop.desktop, err, MessageManager.getString("label.problem_reading_tree_file"), JvOptionPane.WARNING_MESSAGE); } boolean nhx_or_nexus = false; final PhylogenyParser p = ParserUtils.createParserDependingOnFileType( treeFile, VALIDATE_PHYLOXML_XSD); if (p instanceof NHXParser) { nhx_or_nexus = true; final NHXParser nhx = (NHXParser) p; nhx.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES); nhx.setIgnoreQuotes(false); nhx.setTaxonomyExtraction(TAXONOMY_EXTRACTION); } else if (p instanceof NexusPhylogeniesParser) { nhx_or_nexus = true; final NexusPhylogeniesParser nex = (NexusPhylogeniesParser) p; nex.setReplaceUnderscores(REPLACE_NHX_UNDERSCORES); nex.setIgnoreQuotes(false); } // else if (p instanceof PhyloXmlParser) // { // MainFrameApplication.warnIfNotPhyloXmlValidation(APTX_CONFIG); // } Phylogeny[] phylogenies = PhylogenyMethods.readPhylogenies(p, treeFile); MainFrame[] aptxFrames = new MainFrame[phylogenies.length]; String treeTitle = treeFile.getName(); for (int i = 0; i < phylogenies.length; i++) { Phylogeny tree = phylogenies[i]; if (nhx_or_nexus && INTERNAL_NUMBERS_AS_CONFIDENCE) { PhylogenyMethods.transferInternalNodeNamesToConfidence(tree, ""); } aptxFrames[i] = createAptxFrame(tree, viewport, treeTitle); } return aptxFrames; } public static MainFrame[] createInstancesFromUrl(URL treeUrl, AlignmentViewport viewport) throws FileNotFoundException, IOException, RuntimeException { String treeTitle = treeUrl.getFile(); Phylogeny[] trees = AptxUtil.readPhylogeniesFromUrl(treeUrl, VALIDATE_PHYLOXML_XSD, REPLACE_NHX_UNDERSCORES, INTERNAL_NUMBERS_AS_CONFIDENCE, TAXONOMY_EXTRACTION, MIDPOINT_REROOT); MainFrame[] aptxFrames = new MainFrame[trees.length]; for (int i = 0; i < trees.length; i++) { Phylogeny tree = trees[i]; aptxFrames[i] = createAptxFrame(tree, viewport, treeTitle); } return aptxFrames; } public static MainFrame createAptxFrame( final Phylogeny aptxTree, final AlignmentViewport jalviewAlignport, String treeTitle) { MainFrame aptxApp = Archaeopteryx.createApplication(aptxTree, APTX_CONFIG, treeTitle); LoadedTreeAssociation bindAptxNodes = new LoadedTreeAssociation( jalviewAlignport.getAlignment().getSequencesArray(), aptxTree); bindAptxNodes.associateLeavesToSequences(); bindNodesToJalviewSequences(aptxApp, jalviewAlignport, bindAptxNodes.getAlignmentWithNodes(), bindAptxNodes.getNodesWithAlignment()); bindFrameToJalview(aptxApp); return aptxApp; } public static ExternalTreeViewerBindingI bindNodesToJalviewSequences( final MainFrame aptxApp, final AlignmentViewport jalviewAlignViewport, final Map alignMappedToNodes, final Map nodesMappedToAlign) { return new JalviewBinding(aptxApp, jalviewAlignViewport, alignMappedToNodes, nodesMappedToAlign); } public static MainFrame bindFrameToJalview(final MainFrame aptxApp) { int width = 400; int height = 550; aptxApp.setMinimumSize(new Dimension(width, height)); // aptxApp.setFont(Desktop.instance.getFont()); // aptxApp.getMainPanel().setFont(Desktop.instance.getFont()); Desktop.addInternalFrame(aptxApp, "Archaeopteryx Tree View", true, width, height, true, true); return aptxApp; } }