c3b6a85687e7aaa31ac0f2724f5d656da8b7bc2c
[jabaws.git] / datamodel / compbio / data / sequence / ScoreManager.java
1 /* Copyright (c) 2011 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 package compbio.data.sequence;\r
19 \r
20 import java.io.IOException;\r
21 import java.io.Writer;\r
22 import java.util.ArrayList;\r
23 import java.util.List;\r
24 import java.util.Map;\r
25 import java.util.Set;\r
26 import java.util.TreeMap;\r
27 import java.util.TreeSet;\r
28 \r
29 import javax.xml.bind.annotation.XmlAccessType;\r
30 import javax.xml.bind.annotation.XmlAccessorType;\r
31 import javax.xml.bind.annotation.XmlTransient;\r
32 \r
33 @XmlAccessorType(XmlAccessType.FIELD)\r
34 public class ScoreManager {\r
35 \r
36         @XmlTransient\r
37         public static final String SINGLE_ENTRY_KEY = "Alignment";\r
38 \r
39         private List<ScoreHolder> seqScores;\r
40 \r
41         private ScoreManager() {\r
42                 // Default JAXB constructor\r
43         }\r
44 \r
45         private ScoreManager(String id, Set<Score> data) {\r
46                 seqScores = new ArrayList<ScoreManager.ScoreHolder>();\r
47                 seqScores.add(new ScoreHolder(id, data));\r
48         }\r
49 \r
50         private ScoreManager(Map<String, Set<Score>> data) {\r
51                 List<ScoreHolder> seqScores = new ArrayList<ScoreHolder>();\r
52                 for (Map.Entry<String, Set<Score>> singleSeqScores : data.entrySet()) {\r
53                         seqScores.add(new ScoreHolder(singleSeqScores.getKey(),\r
54                                         singleSeqScores.getValue()));\r
55                 }\r
56                 this.seqScores = seqScores;\r
57         }\r
58 \r
59         /*\r
60          *  Next constructor added by Daniel\r
61          *  a constructor for using ScoreManager to represent RNAalifold output\r
62             \r
63          */\r
64         \r
65         public ScoreManager(RNAStruct rnaStruct) {\r
66                 assert(rnaStruct.getStructs().size() == rnaStruct.getData().size());\r
67                 // This had better be used to create a RNAalifold output structure\r
68                 assert(java.util.regex.Pattern.matches(\r
69                                 "^[\\.)(]*$", rnaStruct.getStructs().get(1)));\r
70                 List<ScoreHolder> seqScores = new ArrayList<ScoreHolder>();\r
71                 \r
72                 for (int i = 0; i < rnaStruct.getStructs().size(); i++) {\r
73                         seqScores.add(new ScoreHolder(rnaStruct.getStructs().get(i),\r
74                                         rnaStruct.getData().get(i)));\r
75                 }\r
76                 this.seqScores = seqScores;\r
77         }\r
78         \r
79         \r
80         public static ScoreManager newInstance(Map<String, Set<Score>> data) {\r
81                 return new ScoreManager(data);\r
82         }\r
83 \r
84         public static ScoreManager newInstanceSingleScore(\r
85                         Map<String, Score> seqScoresMap) {\r
86                 Map<String, Set<Score>> multipleScoresMap = new TreeMap<String, Set<Score>>();\r
87                 for (Map.Entry<String, Score> seqScore : seqScoresMap.entrySet()) {\r
88                         Set<Score> scores = new TreeSet<Score>();\r
89                         scores.add(seqScore.getValue());\r
90                         multipleScoresMap.put(seqScore.getKey(), scores);\r
91                 }\r
92                 return new ScoreManager(multipleScoresMap);\r
93         }\r
94 \r
95         public static ScoreManager newInstanceSingleSequence(Set<Score> data) {\r
96                 return new ScoreManager(ScoreManager.SINGLE_ENTRY_KEY,\r
97                                 new TreeSet(data));\r
98         }\r
99 \r
100         // Also Daniel's. Check this with Jim to make sure that I am not compromising\r
101         // the security of this class\r
102                 public RNAStruct asRNAStruct() {\r
103                         List<String> structs = new ArrayList<String>();\r
104                         List<TreeSet<Score>> data = new ArrayList<TreeSet<Score>>();\r
105                         for (ScoreHolder sch : this.seqScores) {\r
106                                 structs.add(sch.id);\r
107                                 data.add(sch.scores);\r
108                         }\r
109                         return new RNAStruct(structs, data);\r
110                 }\r
111                  \r
112         \r
113         public Map<String, TreeSet<Score>> asMap() {\r
114                 Map<String, TreeSet<Score>> seqScoresMap = new TreeMap<String, TreeSet<Score>>();\r
115                 for (ScoreHolder sch : this.seqScores) {\r
116                         TreeSet<Score> oldValue = seqScoresMap.put(sch.id, new TreeSet(\r
117                                         sch.scores));\r
118                         if (oldValue != null) {\r
119                                 throw new IllegalStateException(\r
120                                                 "Cannot represent this ScoreManager instance "\r
121                                                                 + "as a Map as it contains duplicated keys: "\r
122                                                                 + sch.id);\r
123                         }\r
124                 }\r
125                 return seqScoresMap;\r
126         }\r
127 \r
128         public Set<Score> asSet() {\r
129                 if (seqScores.size() == 0 || seqScores.size() > 1) {\r
130                         throw new IllegalStateException(\r
131                                         "This ScoreManager has no or multiple sequence entries and thus "\r
132                                                         + "cannot be represented as a Set. Number of entries are: "\r
133                                                         + seqScores.size());\r
134                 }\r
135                 ScoreHolder sch = seqScores.get(0);\r
136                 return sch.scores;\r
137         }\r
138 \r
139         public int getNumberOfSeq() {\r
140                 return seqScores.size();\r
141         }\r
142 \r
143         public ScoreHolder getAnnotationForSequence(String seqId) {\r
144                 for (ScoreHolder sch : seqScores) {\r
145                         if (sch.id.equals(seqId)) {\r
146                                 return sch;\r
147                         }\r
148                 }\r
149                 return null;\r
150         }\r
151 \r
152         public void writeOut(Writer outStream) throws IOException {\r
153                 assert outStream != null : "Output steam is not defined!";\r
154                 if (seqScores == null) {\r
155                         return;\r
156                 }\r
157                 for (ScoreHolder oneSeqScores : seqScores) {\r
158                         if (oneSeqScores == null)\r
159                                 continue;\r
160                         oneSeqScores.writeOut(outStream);\r
161                 }\r
162         }\r
163 \r
164         @Override\r
165         public int hashCode() {\r
166                 final int prime = 31;\r
167                 int result = 1;\r
168                 result = prime * result\r
169                                 + ((seqScores == null) ? 0 : seqScores.hashCode());\r
170                 return result;\r
171         }\r
172 \r
173         @Override\r
174         public boolean equals(Object obj) {\r
175                 if (this == obj)\r
176                         return true;\r
177                 if (obj == null)\r
178                         return false;\r
179                 if (getClass() != obj.getClass())\r
180                         return false;\r
181                 ScoreManager other = (ScoreManager) obj;\r
182                 if (seqScores == null) {\r
183                         if (other.seqScores != null)\r
184                                 return false;\r
185                 } else if (!seqScores.equals(other.seqScores))\r
186                         return false;\r
187                 return true;\r
188         }\r
189 \r
190         @XmlAccessorType(XmlAccessType.FIELD)\r
191         public static class ScoreHolder {\r
192 \r
193                 public String id;\r
194                 public TreeSet<Score> scores;\r
195 \r
196                 private ScoreHolder() {\r
197                         // JAXB Default constructor should not be used otherwise\r
198                 }\r
199 \r
200                 ScoreHolder(String id, Set<Score> scores) {\r
201                         this.id = id;\r
202                         this.scores = new TreeSet<Score>(scores);\r
203                 }\r
204 \r
205                 public void writeOut(Writer writer) throws IOException {\r
206                         writer.write(">" + id + "\n");\r
207                         Score.write(scores, writer);\r
208                 }\r
209 \r
210                 public Score getScoreByMethod(Enum<?> method) {\r
211                         for (Score sc : scores) {\r
212                                 if (method.toString().equals(sc.getMethod())) {\r
213                                         return sc;\r
214                                 }\r
215                         }\r
216                         return null;\r
217                 }\r
218                 public Score getScoreByMethod(String method) {\r
219                         for (Score sc : scores) {\r
220                                 if (method.toString().equals(sc.getMethod())) {\r
221                                         return sc;\r
222                                 }\r
223                         }\r
224                         return null;\r
225                 }\r
226                 public int getNumberOfScores() {\r
227                         return scores.size();\r
228                 }\r
229 \r
230                 @Override\r
231                 public int hashCode() {\r
232                         final int prime = 17;\r
233                         int result = 1;\r
234                         result = prime * result + ((id == null) ? 0 : id.hashCode());\r
235                         result = prime * result\r
236                                         + ((scores == null) ? 0 : scores.hashCode());\r
237                         return result;\r
238                 }\r
239 \r
240                 @Override\r
241                 public boolean equals(Object obj) {\r
242                         if (this == obj)\r
243                                 return true;\r
244                         if (obj == null)\r
245                                 return false;\r
246                         if (getClass() != obj.getClass())\r
247                                 return false;\r
248                         ScoreHolder other = (ScoreHolder) obj;\r
249                         if (id == null) {\r
250                                 if (other.id != null)\r
251                                         return false;\r
252                         } else if (!id.equals(other.id))\r
253                                 return false;\r
254                         if (scores == null) {\r
255                                 if (other.scores != null)\r
256                                         return false;\r
257                         } else if (!scores.equals(other.scores))\r
258                                 return false;\r
259                         return true;\r
260                 }\r
261 \r
262         }\r
263 \r
264 }\r