JAL-2805 deleted old Aptx class for loading just Newick files
[jalview.git] / src / jalview / ext / archaeopteryx / ArchaeopteryxTreeConverter.java
1 package jalview.ext.archaeopteryx;
2
3 import jalview.analysis.TreeBuilder;
4 import jalview.datamodel.SequenceI;
5 import jalview.ext.forester.ForesterConversions;
6 import jalview.ext.forester.ForesterMatrix;
7 import jalview.util.MessageManager;
8
9 import java.util.HashMap;
10 import java.util.Map;
11
12 import org.forester.evoinference.matrix.distance.DistanceMatrix;
13 import org.forester.phylogeny.Phylogeny;
14 import org.forester.phylogeny.PhylogenyNode;
15 import org.forester.phylogeny.data.NodeData;
16 import org.forester.phylogeny.data.Sequence;
17
18 /**
19  * Class for converting trees made in Jalview (through TreeBuilder) to trees
20  * compatible with Forester (Phylogeny objects).
21  * 
22  * Note that this currently demands a 1:1 relationship between tree nodes and
23  * the sequences used for generating them.
24  * 
25  * @author kjvanderheide
26  *
27  */
28 public class ArchaeopteryxTreeConverter
29 {
30   protected final SequenceI[] sequences;
31
32   protected final DistanceMatrix distances;
33   
34   protected final TreeBuilder jalviewTree;
35   
36   public String treeTitle;
37
38   private final Phylogeny aptxTree;
39
40   private PhylogenyNode rootNode;
41
42   private final Map<SequenceI, PhylogenyNode> alignmentBoundNodes;
43
44   private final Map<PhylogenyNode, SequenceI> nodesBoundAlignment;
45
46   public ArchaeopteryxTreeConverter(final TreeBuilder calculatedTree)
47   {
48     jalviewTree = calculatedTree;
49     sequences = jalviewTree.getSequences();
50     distances = ForesterMatrix.convertJalviewToForester(
51             jalviewTree.getDistances(), sequences);
52     aptxTree = new Phylogeny();
53     rootNode = new PhylogenyNode();
54     alignmentBoundNodes = new HashMap<>(distances.getSize());
55     nodesBoundAlignment = new HashMap<>(distances.getSize());
56
57
58   }
59
60   public Phylogeny buildAptxTree(final PhylogenyNode treeRoot)
61   {
62
63     if (treeRoot != null)
64     {
65       rootNode = treeRoot;
66     }
67
68     buildAptxTree();
69
70     return aptxTree;
71
72   }
73
74
75   public Phylogeny buildAptxTree()
76   {
77
78     for (SequenceI sequence : sequences)
79     {
80       Sequence seq = ForesterConversions
81               .createForesterSequence(sequence, true);
82       PhylogenyNode sequenceNode = new PhylogenyNode(sequence.getName());
83       NodeData nodeData = sequenceNode.getNodeData();
84       nodeData.setSequence(seq);
85
86       nodesBoundAlignment.put(sequenceNode, sequence);
87       alignmentBoundNodes.put(sequence, sequenceNode);
88       rootNode.addAsChild(sequenceNode);
89     }
90
91
92     aptxTree.setRoot(rootNode);
93
94     treeTitle = generateTreeName();
95     aptxTree.setName(treeTitle);
96
97     return aptxTree;
98
99   }
100
101   public Map<SequenceI, PhylogenyNode> getAlignmentBoundNodes()
102   {
103     return alignmentBoundNodes;
104   }
105
106   public Map<PhylogenyNode, SequenceI> getNodesBoundAlignment()
107   {
108     return nodesBoundAlignment;
109   }
110
111   private Phylogeny clusterNodes()
112   {
113     return aptxTree;
114
115   }
116   /**
117    * Formats a localised title for the tree panel, like
118    * <p>
119    * Neighbour Joining Using BLOSUM62
120    * <p>
121    * For a tree loaded from file, just uses the file name
122    * 
123    * @return
124    */
125   public String generateTreeName() // Move this and add selection region to the
126                                    // title when applicable
127   {
128     if (treeTitle != null) // will currently never happen, loaded tree file will
129                            // take a different path
130     {
131       return treeTitle;
132     }
133     else
134     {
135       /*
136       * i18n description of Neighbour Joining or Average Distance method
137       */
138       String treecalcnm = MessageManager
139               .getString("label.tree_calc_" + jalviewTree.getClass()
140                       .getSimpleName().substring(0, 2).toLowerCase());
141       /*
142       * short score model name (long description can be too long)
143       */
144       String smn = jalviewTree.getScoreModel().getName();
145
146       /*
147       * put them together as <method> Using <model>
148       */
149       final String ttl = MessageManager
150               .formatMessage("label.treecalc_title", treecalcnm, smn);
151       return ttl;
152     }
153   }
154 }