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