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