37e041c01906a631b4ad2b63433697061590b07f
[jabaws.git] / datamodel / compbio / data / sequence / ScoreManager.java
1 package compbio.data.sequence;\r
2 \r
3 import java.io.IOException;\r
4 import java.io.Writer;\r
5 import java.util.ArrayList;\r
6 import java.util.List;\r
7 import java.util.Map;\r
8 import java.util.Set;\r
9 import java.util.TreeMap;\r
10 import java.util.TreeSet;\r
11 \r
12 import javax.xml.bind.annotation.XmlAccessType;\r
13 import javax.xml.bind.annotation.XmlAccessorType;\r
14 import javax.xml.bind.annotation.XmlTransient;\r
15 \r
16 @XmlAccessorType(XmlAccessType.FIELD)\r
17 public class ScoreManager {\r
18 \r
19         @XmlTransient\r
20         public static final String SINGLE_ENTRY_KEY = "Alignment";\r
21 \r
22         private List<ScoreHolder> seqScores;\r
23 \r
24         private ScoreManager() {\r
25                 // Default JAXB constructor\r
26         }\r
27 \r
28         private ScoreManager(String id, Set<Score> data) {\r
29                 seqScores = new ArrayList<ScoreManager.ScoreHolder>();\r
30                 seqScores.add(new ScoreHolder(id, data));\r
31         }\r
32 \r
33         private ScoreManager(Map<String, Set<Score>> data) {\r
34                 List<ScoreHolder> seqScores = new ArrayList<ScoreHolder>();\r
35                 for (Map.Entry<String, Set<Score>> singleSeqScores : data.entrySet()) {\r
36                         seqScores.add(new ScoreHolder(singleSeqScores.getKey(),\r
37                                         singleSeqScores.getValue()));\r
38                 }\r
39                 this.seqScores = seqScores;\r
40         }\r
41 \r
42         public static ScoreManager newInstance(Map<String, Set<Score>> data) {\r
43                 return new ScoreManager(data);\r
44         }\r
45 \r
46         public static ScoreManager newInstanceSingleScore(\r
47                         Map<String, Score> seqScoresMap) {\r
48                 Map<String, Set<Score>> multipleScoresMap = new TreeMap<String, Set<Score>>();\r
49                 for (Map.Entry<String, Score> seqScore : seqScoresMap.entrySet()) {\r
50                         Set<Score> scores = new TreeSet<Score>();\r
51                         scores.add(seqScore.getValue());\r
52                         multipleScoresMap.put(seqScore.getKey(), scores);\r
53                 }\r
54                 return new ScoreManager(multipleScoresMap);\r
55         }\r
56 \r
57         public static ScoreManager newInstanceSingleSequence(Set<Score> data) {\r
58                 return new ScoreManager(ScoreManager.SINGLE_ENTRY_KEY,\r
59                                 new TreeSet(data));\r
60         }\r
61 \r
62         public Map<String, TreeSet<Score>> asMap() {\r
63                 Map<String, TreeSet<Score>> seqScoresMap = new TreeMap<String, TreeSet<Score>>();\r
64                 for (ScoreHolder sch : this.seqScores) {\r
65                         TreeSet<Score> oldValue = seqScoresMap.put(sch.id, new TreeSet(\r
66                                         sch.scores));\r
67                         if (oldValue != null) {\r
68                                 throw new IllegalStateException(\r
69                                                 "Cannot represent this ScoreManager instance "\r
70                                                                 + "as a Map as it contains duplicated keys: "\r
71                                                                 + sch.id);\r
72                         }\r
73                 }\r
74                 return seqScoresMap;\r
75         }\r
76 \r
77         public Set<Score> asSet() {\r
78                 if (seqScores.size() == 0 || seqScores.size() > 1) {\r
79                         throw new IllegalStateException(\r
80                                         "This ScoreManager has no or multiple sequence entries and thus "\r
81                                                         + "cannot be represented as a Set. Number of entries are: "\r
82                                                         + seqScores.size());\r
83                 }\r
84                 ScoreHolder sch = seqScores.get(0);\r
85                 return sch.scores;\r
86         }\r
87 \r
88         public int getNumberOfSeq() {\r
89                 return seqScores.size();\r
90         }\r
91 \r
92         public ScoreHolder getAnnotationForSequence(String seqId) {\r
93                 for (ScoreHolder sch : seqScores) {\r
94                         if (sch.id.equals(seqId)) {\r
95                                 return sch;\r
96                         }\r
97                 }\r
98                 return null;\r
99         }\r
100 \r
101         public void writeOut(Writer outStream) throws IOException {\r
102                 for (ScoreHolder oneSeqScores : seqScores) {\r
103                         oneSeqScores.writeOut(outStream);\r
104                 }\r
105         }\r
106 \r
107         @Override\r
108         public int hashCode() {\r
109                 final int prime = 31;\r
110                 int result = 1;\r
111                 result = prime * result\r
112                                 + ((seqScores == null) ? 0 : seqScores.hashCode());\r
113                 return result;\r
114         }\r
115 \r
116         @Override\r
117         public boolean equals(Object obj) {\r
118                 if (this == obj)\r
119                         return true;\r
120                 if (obj == null)\r
121                         return false;\r
122                 if (getClass() != obj.getClass())\r
123                         return false;\r
124                 ScoreManager other = (ScoreManager) obj;\r
125                 if (seqScores == null) {\r
126                         if (other.seqScores != null)\r
127                                 return false;\r
128                 } else if (!seqScores.equals(other.seqScores))\r
129                         return false;\r
130                 return true;\r
131         }\r
132 \r
133         @XmlAccessorType(XmlAccessType.FIELD)\r
134         public static class ScoreHolder {\r
135 \r
136                 public String id;\r
137                 public TreeSet<Score> scores;\r
138 \r
139                 private ScoreHolder() {\r
140                         // JAXB Default constructor should not be used otherwise\r
141                 }\r
142 \r
143                 ScoreHolder(String id, Set<Score> scores) {\r
144                         this.id = id;\r
145                         this.scores = new TreeSet<Score>(scores);\r
146                 }\r
147 \r
148                 public void writeOut(Writer writer) throws IOException {\r
149                         writer.write(">" + id + "\n");\r
150                         Score.write(scores, writer);\r
151                 }\r
152 \r
153                 public Score getScoreByMethod(Enum<?> method) {\r
154                         for (Score sc : scores) {\r
155                                 if (method.toString().equals(sc.getMethod())) {\r
156                                         return sc;\r
157                                 }\r
158                         }\r
159                         return null;\r
160                 }\r
161                 public Score getScoreByMethod(String method) {\r
162                         for (Score sc : scores) {\r
163                                 if (method.toString().equals(sc.getMethod())) {\r
164                                         return sc;\r
165                                 }\r
166                         }\r
167                         return null;\r
168                 }\r
169                 public int getNumberOfScores() {\r
170                         return scores.size();\r
171                 }\r
172 \r
173                 @Override\r
174                 public int hashCode() {\r
175                         final int prime = 17;\r
176                         int result = 1;\r
177                         result = prime * result + ((id == null) ? 0 : id.hashCode());\r
178                         result = prime * result\r
179                                         + ((scores == null) ? 0 : scores.hashCode());\r
180                         return result;\r
181                 }\r
182 \r
183                 @Override\r
184                 public boolean equals(Object obj) {\r
185                         if (this == obj)\r
186                                 return true;\r
187                         if (obj == null)\r
188                                 return false;\r
189                         if (getClass() != obj.getClass())\r
190                                 return false;\r
191                         ScoreHolder other = (ScoreHolder) obj;\r
192                         if (id == null) {\r
193                                 if (other.id != null)\r
194                                         return false;\r
195                         } else if (!id.equals(other.id))\r
196                                 return false;\r
197                         if (scores == null) {\r
198                                 if (other.scores != null)\r
199                                         return false;\r
200                         } else if (!scores.equals(other.scores))\r
201                                 return false;\r
202                         return true;\r
203                 }\r
204 \r
205         }\r
206 }\r