Jalview Imported Sources
[jalview.git] / src / jalview / analysis / AlignmentSorter.java
1 package jalview.analysis;\r
2 \r
3 import jalview.datamodel.*;\r
4 import jalview.util.*;\r
5 import jalview.io.*;\r
6 \r
7 import java.util.*;\r
8 \r
9 /** Data structure to hold and manipulate a multiple sequence alignment\r
10  */\r
11 public class AlignmentSorter {\r
12 \r
13   private AlignmentSorter() {\r
14   }\r
15 \r
16   public static void sortGroups(AlignmentI align) {\r
17     Vector groups = align.getGroups();\r
18     int    nGroup = groups.size();\r
19 \r
20     float[]  arr = new float [nGroup];\r
21     Object[] s   = new Object[nGroup];\r
22 \r
23     for (int i=0; i < nGroup; i++) {\r
24       arr[i] = ((SequenceGroup)groups.elementAt(i)).getSize();\r
25       s[i]   = groups.elementAt(i);\r
26     }\r
27 \r
28     QuickSort.sort(arr,s);\r
29 \r
30     Vector newg = new Vector(nGroup);\r
31 \r
32     for (int i=nGroup-1; i >= 0; i--) {\r
33       newg.addElement(s[i]);\r
34     }\r
35 \r
36     //    align.setGroups(newg);\r
37   }\r
38 \r
39   /**    */\r
40   public static void sortByPID(AlignmentI align, SequenceI s) {\r
41     int nSeq = align.getHeight();\r
42 \r
43     float     scores[] = new float[nSeq];\r
44     SequenceI seqs[]   = new SequenceI[nSeq];\r
45 \r
46     for (int i = 0; i < nSeq; i++) {\r
47       scores[i] = Comparison.compare(align.getSequenceAt(i),s);\r
48       seqs[i]   = align.getSequenceAt(i);\r
49     }\r
50 \r
51     QuickSort.sort(scores,0,scores.length-1,seqs);\r
52 \r
53    setReverseOrder(align,seqs);\r
54   }\r
55 \r
56   private static void setReverseOrder(AlignmentI align, SequenceI [] seqs) {\r
57     int nSeq = seqs.length;\r
58 \r
59     int len = 0;\r
60     if (nSeq%2 == 0) {\r
61       len = nSeq/2;\r
62     } else {\r
63       len = (nSeq+1)/2;\r
64     }\r
65 \r
66 // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work\r
67     for (int i = 0; i < len; i++) {\r
68       //SequenceI tmp = seqs[i];\r
69       align.getSequences().setElementAt(seqs[nSeq-i-1],i);\r
70       align.getSequences().setElementAt(seqs[i],nSeq-i-1);\r
71     }\r
72   }\r
73 \r
74   private static void setOrder(AlignmentI align, Vector tmp) {\r
75     setOrder(align,vectorToArray(tmp));\r
76   }\r
77 \r
78   private static void setOrder(AlignmentI align, SequenceI [] seqs) {\r
79 // NOTE: DO NOT USE align.setSequenceAt() here - it will NOT work\r
80     for (int i = 0; i < seqs.length; i++) {\r
81       align.getSequences().setElementAt(seqs[i],i);\r
82     }\r
83   }\r
84 \r
85   /**    */\r
86   public static void sortByID(AlignmentI align) {\r
87     int nSeq = align.getHeight();\r
88 \r
89     String    ids[]   = new String[nSeq];\r
90     SequenceI seqs[]  = new SequenceI[nSeq];\r
91 \r
92     for (int i = 0; i < nSeq; i++) {\r
93       ids[i]  = align.getSequenceAt(i).getName();\r
94       seqs[i] = align.getSequenceAt(i);\r
95     }\r
96 \r
97     QuickSort.sort(ids,seqs);\r
98 \r
99     setReverseOrder(align,seqs);\r
100   }\r
101 \r
102   public static void sortByGroup(AlignmentI align) {\r
103     int    nSeq = align.getHeight();\r
104     Vector groups = align.getGroups();\r
105 \r
106     Vector seqs = new Vector();\r
107 \r
108     for (int i=0; i < groups.size(); i++) {\r
109       SequenceGroup sg = (SequenceGroup)groups.elementAt(i);\r
110 \r
111       for (int j = 0; j < sg.getSize(); j++) {\r
112         seqs.addElement(sg.getSequenceAt(j));\r
113       }\r
114     }\r
115 \r
116     if (seqs.size() != nSeq) {\r
117       System.err.println("ERROR: tmp.size() != nseq in sortByGroups");\r
118       if (seqs.size() < nSeq) {\r
119         addStrays(align,seqs);\r
120       }\r
121     }\r
122 \r
123     setOrder(align,seqs);\r
124   }\r
125 \r
126   private static SequenceI [] vectorToArray(Vector tmp) {\r
127     SequenceI[] seqs = new SequenceI[tmp.size()];\r
128 \r
129     for (int i=0; i < tmp.size(); i++) {\r
130       seqs[i] = (SequenceI)tmp.elementAt(i);\r
131     }\r
132     return seqs;\r
133   }\r
134 \r
135   public static void sortByTree(AlignmentI align, NJTree tree) {\r
136     int    nSeq = align.getHeight();\r
137 \r
138     Vector tmp = new Vector();\r
139 \r
140     tmp = _sortByTree(tree.getTopNode(),tmp);\r
141 \r
142     if (tmp.size() != nSeq) {\r
143       System.err.println("ERROR: tmp.size() != nseq in sortByTree");\r
144       if (tmp.size() < nSeq) {\r
145         addStrays(align,tmp);\r
146       }\r
147     }\r
148 \r
149     setOrder(align,tmp);\r
150   }\r
151 \r
152   private static void addStrays(AlignmentI align, Vector seqs) {\r
153     int    nSeq = align.getHeight();\r
154     for (int i=0;i<nSeq;i++) {\r
155       if (!seqs.contains(align.getSequenceAt(i))) {\r
156         seqs.addElement(align.getSequenceAt(i));\r
157       }\r
158     }\r
159     if (nSeq != seqs.size()) {\r
160       System.err.println("ERROR: Size still not right even after addStrays");\r
161     }\r
162   }\r
163 \r
164   public static Vector _sortByTree(SequenceNode node, Vector tmp) {\r
165     if (node == null) {return tmp;}\r
166 \r
167     SequenceNode left = (SequenceNode)node.left();\r
168     SequenceNode right = (SequenceNode)node.right();\r
169 \r
170     if (left == null && right == null) {\r
171       if (node.element() instanceof SequenceI) {\r
172         tmp.addElement((SequenceI)node.element());\r
173         return tmp;\r
174       }\r
175     } else {\r
176       _sortByTree(left,tmp);\r
177       _sortByTree(right,tmp);\r
178     }\r
179     return tmp;\r
180   }\r
181 }\r