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