Formatted source
[jalview.git] / src / jalview / analysis / CompareAlignments.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4 *\r
5 * This program is free software; you can redistribute it and/or\r
6 * modify it under the terms of the GNU General Public License\r
7 * as published by the Free Software Foundation; either version 2\r
8 * of the License, or (at your option) any later version.\r
9 *\r
10 * This program is distributed in the hope that it will be useful,\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 * GNU General Public License for more details.\r
14 *\r
15 * You should have received a copy of the GNU General Public License\r
16 * along with this program; if not, write to the Free Software\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18 */\r
19 package jalview.analysis;\r
20 \r
21 import jalview.datamodel.*;\r
22 \r
23 import jalview.io.*;\r
24 \r
25 import java.util.*;\r
26 \r
27 \r
28 public class CompareAlignments {\r
29     Vector align;\r
30     String refId;\r
31     Vector ids;\r
32 \r
33     public CompareAlignments(Vector align) {\r
34         this.align = align;\r
35 \r
36         ids = new Vector();\r
37 \r
38         Alignment al0 = (Alignment) align.elementAt(0);\r
39 \r
40         for (int i = 0; i < al0.getHeight(); i++) {\r
41             SequenceI seq = al0.getSequenceAt(i);\r
42 \r
43             ids.addElement(seq.getName());\r
44 \r
45             if (i == 0) {\r
46                 setReferenceId(seq.getName());\r
47             }\r
48         }\r
49     }\r
50 \r
51     public void compare() {\r
52         Hashtable positions = new Hashtable();\r
53 \r
54         for (int k = 0; k < ids.size(); k++) {\r
55             String id = (String) ids.elementAt(k);\r
56 \r
57             System.out.println("Ids " + id + " " + refId);\r
58 \r
59             if (!id.equals(refId)) {\r
60                 Hashtable fullhash = new Hashtable();\r
61 \r
62                 for (int i = 0; i < align.size(); i++) {\r
63                     System.out.println("Alignment " + i);\r
64 \r
65                     Alignment al = (Alignment) align.elementAt(i);\r
66 \r
67                     SequenceI refseq = null;\r
68 \r
69                     for (int j = 0; j < al.getHeight(); j++) {\r
70                         if (((SequenceI) al.getSequenceAt(j)).getName().equals(refId)) {\r
71                             refseq = (SequenceI) al.getSequenceAt(j);\r
72                         }\r
73                     }\r
74 \r
75                     if (refseq != null) {\r
76                         System.out.println("Refseq " + refseq.getName());\r
77 \r
78                         for (int jj = 0; jj < al.getHeight(); jj++) {\r
79                             SequenceI seq = (SequenceI) al.getSequenceAt(jj);\r
80 \r
81                             if (seq.getName().equals(id)) {\r
82                                 Hashtable hash = getAlignPositions(seq, refseq);\r
83 \r
84                                 Enumeration keys = hash.keys();\r
85 \r
86                                 while (keys.hasMoreElements()) {\r
87                                     Integer key = (Integer) keys.nextElement();\r
88 \r
89                                     //                          System.out.println(key + " " + hash.get(key));\r
90                                     if (fullhash.get(key) == null) {\r
91                                         fullhash.put(key, new Vector());\r
92                                     }\r
93 \r
94                                     Vector tmp = (Vector) fullhash.get(key);\r
95 \r
96                                     tmp.addElement(hash.get(key));\r
97                                 }\r
98                             }\r
99                         }\r
100                     }\r
101                 }\r
102 \r
103                 System.out.println("\nId " + id);\r
104 \r
105                 Enumeration keys = fullhash.keys();\r
106 \r
107                 int totdiff = 0;\r
108 \r
109                 while (keys.hasMoreElements()) {\r
110                     Integer key = (Integer) keys.nextElement();\r
111 \r
112                     Vector tmp = (Vector) fullhash.get(key);\r
113 \r
114                     int diff0 = ((Integer) tmp.elementAt(0)).intValue();\r
115                     ;\r
116 \r
117                     int diff = 0;\r
118 \r
119                     for (int l = 1; l < tmp.size(); l++) {\r
120                         diff += Math.abs(diff0 -\r
121                             ((Integer) tmp.elementAt(l)).intValue());\r
122                     }\r
123 \r
124                     if (diff > 0) {\r
125                         totdiff++;\r
126                         System.out.print(id + " Ref pos " + key + " : " +\r
127                             diff0 + " " + diff + " : ");\r
128 \r
129                         for (int l = 1; l < tmp.size(); l++) {\r
130                             System.out.print(diff0 -\r
131                                 ((Integer) tmp.elementAt(l)).intValue() + " ");\r
132                         }\r
133 \r
134                         System.out.println();\r
135                     }\r
136                 }\r
137 \r
138                 System.out.println("Total " + id + " " + totdiff);\r
139             }\r
140         }\r
141     }\r
142 \r
143     public void setReferenceId(String id) {\r
144         this.refId = id;\r
145     }\r
146 \r
147     public Hashtable getAlignPositions(SequenceI seq1, SequenceI seq2) {\r
148         Hashtable hash = new Hashtable();\r
149 \r
150         int i = 0;\r
151 \r
152         int pos1 = 0;\r
153         int pos2 = 0;\r
154 \r
155         while (i < seq1.getLength()) {\r
156             char c1 = seq1.getCharAt(i);\r
157             char c2 = seq2.getCharAt(i);\r
158 \r
159             if (c1 != '-') {\r
160                 pos1++;\r
161             }\r
162 \r
163             if (c2 != '-') {\r
164                 pos2++;\r
165             }\r
166 \r
167             if (c1 != '-') {\r
168                 hash.put(new Integer(pos1), new Integer(pos2));\r
169             }\r
170 \r
171             i++;\r
172         }\r
173 \r
174         return hash;\r
175     }\r
176 }\r