GPL license added
[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 \r
20 package jalview.analysis;\r
21 \r
22 import jalview.datamodel.*;\r
23 import jalview.io.*;\r
24 \r
25 import java.util.*;\r
26 \r
27 public class CompareAlignments {\r
28 \r
29     Vector align;\r
30     String refId;\r
31     Vector ids;\r
32 \r
33     public CompareAlignments(Vector align) {\r
34 \r
35         this.align = align;\r
36 \r
37         ids = new Vector();\r
38 \r
39         Alignment al0 = (Alignment)align.elementAt(0);\r
40 \r
41         for (int i = 0; i < al0.getHeight(); i++) {\r
42             SequenceI seq = al0.getSequenceAt(i);\r
43 \r
44             ids.addElement(seq.getName());\r
45 \r
46             if (i == 0) {\r
47                 setReferenceId(seq.getName());\r
48             }\r
49         }\r
50 \r
51     }\r
52 \r
53     public void compare() {\r
54 \r
55         Hashtable positions = new Hashtable();\r
56 \r
57         for (int k = 0; k < ids.size(); k++) {\r
58 \r
59             String id = (String)ids.elementAt(k);\r
60 \r
61             System.out.println("Ids " + id + " " + refId);\r
62 \r
63             if (!id.equals(refId)) {\r
64 \r
65                 Hashtable fullhash = new Hashtable();\r
66 \r
67                 for (int i = 0; i < align.size(); i++) {\r
68                     System.out.println("Alignment " + i);\r
69 \r
70                     Alignment al = (Alignment)align.elementAt(i);\r
71 \r
72                     SequenceI refseq = null;\r
73 \r
74                     for (int j = 0; j < al.getHeight(); j++) {\r
75                         if (((SequenceI)al.getSequenceAt(j)).getName().equals(refId)) {\r
76                             refseq = (SequenceI)al.getSequenceAt(j);\r
77                         }\r
78                     }\r
79 \r
80                     if (refseq != null) {\r
81 \r
82                         System.out.println("Refseq " + refseq.getName());\r
83 \r
84                         for (int jj = 0; jj < al.getHeight(); jj++) {\r
85                             SequenceI seq = (SequenceI)al.getSequenceAt(jj);\r
86 \r
87                             if (seq.getName().equals(id)) {\r
88                                 Hashtable hash = getAlignPositions(seq,refseq);\r
89 \r
90                                 Enumeration keys = hash.keys();\r
91 \r
92                                 while (keys.hasMoreElements()) {\r
93                                     Integer key = (Integer)keys.nextElement();\r
94                                     //                          System.out.println(key + " " + hash.get(key));\r
95                                     if (fullhash.get(key) == null) {\r
96                                         fullhash.put(key,new Vector());\r
97                                     }\r
98 \r
99                                     Vector tmp = (Vector)fullhash.get(key);\r
100 \r
101                                     tmp.addElement(hash.get(key));\r
102                                 }\r
103                             }\r
104 \r
105                         }\r
106                     }\r
107                 }\r
108 \r
109                 System.out.println ("\nId " + id);\r
110 \r
111                 Enumeration keys = fullhash.keys();\r
112 \r
113 \r
114                 int totdiff = 0;\r
115                 while (keys.hasMoreElements()) {\r
116                     Integer key = (Integer)keys.nextElement();\r
117 \r
118                     Vector tmp = (Vector)fullhash.get(key);\r
119 \r
120 \r
121 \r
122                     int diff0 = ((Integer)tmp.elementAt(0)).intValue();;\r
123                     int diff = 0;\r
124 \r
125                     for (int l = 1; l < tmp.size(); l++) {\r
126                         diff += Math.abs(diff0 - ((Integer)tmp.elementAt(l)).intValue());\r
127 \r
128                     }\r
129 \r
130                     if (diff > 0) {\r
131                         totdiff++;\r
132                         System.out.print(id + " Ref pos " + key + " : " + diff0 + " " + diff + " : ");\r
133 \r
134                         for (int l = 1; l < tmp.size(); l++) {\r
135                             System.out.print(diff0 - ((Integer)tmp.elementAt(l)).intValue() + " ");\r
136                         }\r
137                         System.out.println();\r
138                     }\r
139                 }\r
140 \r
141                 System.out.println("Total " + id + " " + totdiff);\r
142 \r
143             }\r
144         }\r
145     }\r
146 \r
147 \r
148     public void setReferenceId(String id) {\r
149         this.refId = id;\r
150     }\r
151 \r
152     public Hashtable getAlignPositions(SequenceI seq1, SequenceI seq2) {\r
153 \r
154         Hashtable hash = new Hashtable();\r
155 \r
156         int i = 0;\r
157 \r
158         int pos1 = 0;\r
159         int pos2 = 0;\r
160 \r
161         while (i < seq1.getLength()) {\r
162 \r
163             char c1 = seq1.getCharAt(i);\r
164             char c2 = seq2.getCharAt(i);\r
165 \r
166             if (c1 != '-') {\r
167                 pos1++;\r
168             }\r
169 \r
170             if (c2 != '-') {\r
171                 pos2++;\r
172             }\r
173 \r
174             if (c1 != '-') {\r
175                 hash.put(new Integer(pos1),new Integer(pos2));\r
176             }\r
177 \r
178             i++;\r
179         }\r
180         return hash;\r
181     }\r
182 \r
183 \r
184 \r
185 }\r