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