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