Change header template for a new version
[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         public static ScoreManager newInstance(Map<String, Set<Score>> data) {\r
60                 return new ScoreManager(data);\r
61         }\r
62 \r
63         public static ScoreManager newInstanceSingleScore(\r
64                         Map<String, Score> seqScoresMap) {\r
65                 Map<String, Set<Score>> multipleScoresMap = new TreeMap<String, Set<Score>>();\r
66                 for (Map.Entry<String, Score> seqScore : seqScoresMap.entrySet()) {\r
67                         Set<Score> scores = new TreeSet<Score>();\r
68                         scores.add(seqScore.getValue());\r
69                         multipleScoresMap.put(seqScore.getKey(), scores);\r
70                 }\r
71                 return new ScoreManager(multipleScoresMap);\r
72         }\r
73 \r
74         public static ScoreManager newInstanceSingleSequence(Set<Score> data) {\r
75                 return new ScoreManager(ScoreManager.SINGLE_ENTRY_KEY,\r
76                                 new TreeSet(data));\r
77         }\r
78 \r
79         public Map<String, TreeSet<Score>> asMap() {\r
80                 Map<String, TreeSet<Score>> seqScoresMap = new TreeMap<String, TreeSet<Score>>();\r
81                 for (ScoreHolder sch : this.seqScores) {\r
82                         TreeSet<Score> oldValue = seqScoresMap.put(sch.id, new TreeSet(\r
83                                         sch.scores));\r
84                         if (oldValue != null) {\r
85                                 throw new IllegalStateException(\r
86                                                 "Cannot represent this ScoreManager instance "\r
87                                                                 + "as a Map as it contains duplicated keys: "\r
88                                                                 + sch.id);\r
89                         }\r
90                 }\r
91                 return seqScoresMap;\r
92         }\r
93 \r
94         public Set<Score> asSet() {\r
95                 if (seqScores.size() == 0 || seqScores.size() > 1) {\r
96                         throw new IllegalStateException(\r
97                                         "This ScoreManager has no or multiple sequence entries and thus "\r
98                                                         + "cannot be represented as a Set. Number of entries are: "\r
99                                                         + seqScores.size());\r
100                 }\r
101                 ScoreHolder sch = seqScores.get(0);\r
102                 return sch.scores;\r
103         }\r
104 \r
105         public int getNumberOfSeq() {\r
106                 return seqScores.size();\r
107         }\r
108 \r
109         public ScoreHolder getAnnotationForSequence(String seqId) {\r
110                 for (ScoreHolder sch : seqScores) {\r
111                         if (sch.id.equals(seqId)) {\r
112                                 return sch;\r
113                         }\r
114                 }\r
115                 return null;\r
116         }\r
117 \r
118         public void writeOut(Writer outStream) throws IOException {\r
119                 for (ScoreHolder oneSeqScores : seqScores) {\r
120                         oneSeqScores.writeOut(outStream);\r
121                 }\r
122         }\r
123 \r
124         @Override\r
125         public int hashCode() {\r
126                 final int prime = 31;\r
127                 int result = 1;\r
128                 result = prime * result\r
129                                 + ((seqScores == null) ? 0 : seqScores.hashCode());\r
130                 return result;\r
131         }\r
132 \r
133         @Override\r
134         public boolean equals(Object obj) {\r
135                 if (this == obj)\r
136                         return true;\r
137                 if (obj == null)\r
138                         return false;\r
139                 if (getClass() != obj.getClass())\r
140                         return false;\r
141                 ScoreManager other = (ScoreManager) obj;\r
142                 if (seqScores == null) {\r
143                         if (other.seqScores != null)\r
144                                 return false;\r
145                 } else if (!seqScores.equals(other.seqScores))\r
146                         return false;\r
147                 return true;\r
148         }\r
149 \r
150         @XmlAccessorType(XmlAccessType.FIELD)\r
151         public static class ScoreHolder {\r
152 \r
153                 public String id;\r
154                 public TreeSet<Score> scores;\r
155 \r
156                 private ScoreHolder() {\r
157                         // JAXB Default constructor should not be used otherwise\r
158                 }\r
159 \r
160                 ScoreHolder(String id, Set<Score> scores) {\r
161                         this.id = id;\r
162                         this.scores = new TreeSet<Score>(scores);\r
163                 }\r
164 \r
165                 public void writeOut(Writer writer) throws IOException {\r
166                         writer.write(">" + id + "\n");\r
167                         Score.write(scores, writer);\r
168                 }\r
169 \r
170                 public Score getScoreByMethod(Enum<?> method) {\r
171                         for (Score sc : scores) {\r
172                                 if (method.toString().equals(sc.getMethod())) {\r
173                                         return sc;\r
174                                 }\r
175                         }\r
176                         return null;\r
177                 }\r
178                 public Score getScoreByMethod(String method) {\r
179                         for (Score sc : scores) {\r
180                                 if (method.toString().equals(sc.getMethod())) {\r
181                                         return sc;\r
182                                 }\r
183                         }\r
184                         return null;\r
185                 }\r
186                 public int getNumberOfScores() {\r
187                         return scores.size();\r
188                 }\r
189 \r
190                 @Override\r
191                 public int hashCode() {\r
192                         final int prime = 17;\r
193                         int result = 1;\r
194                         result = prime * result + ((id == null) ? 0 : id.hashCode());\r
195                         result = prime * result\r
196                                         + ((scores == null) ? 0 : scores.hashCode());\r
197                         return result;\r
198                 }\r
199 \r
200                 @Override\r
201                 public boolean equals(Object obj) {\r
202                         if (this == obj)\r
203                                 return true;\r
204                         if (obj == null)\r
205                                 return false;\r
206                         if (getClass() != obj.getClass())\r
207                                 return false;\r
208                         ScoreHolder other = (ScoreHolder) obj;\r
209                         if (id == null) {\r
210                                 if (other.id != null)\r
211                                         return false;\r
212                         } else if (!id.equals(other.id))\r
213                                 return false;\r
214                         if (scores == null) {\r
215                                 if (other.scores != null)\r
216                                         return false;\r
217                         } else if (!scores.equals(other.scores))\r
218                                 return false;\r
219                         return true;\r
220                 }\r
221 \r
222         }\r
223 }\r