Alifold results are now parsed and stored in a ScoreManager object
[jabaws.git] / datamodel / compbio / data / sequence / RNAStruct.java
1 package compbio.data.sequence;
2
3 import java.util.List;
4 import java.util.Iterator;
5 import java.util.Set;
6 import java.util.TreeSet;
7 import java.util.List;
8 import java.util.ArrayList;
9
10 import javax.xml.bind.annotation.XmlAccessType;
11 import javax.xml.bind.annotation.XmlAccessorType;
12
13 import compbio.util.annotation.Immutable;
14 import compbio.util.SysPrefs;
15 import compbio.data.sequence.Score;
16
17 /*
18  * RNA secondary structure
19  * A class which is essentially just a Pair(List<String>, List<Set<Score>>)
20  * For the purpose of creating and retrieving data from ScoreManager Objects
21  * which are being used to store RNA folding output
22  */
23
24 @XmlAccessorType(XmlAccessType.FIELD)
25 public final class RNAStruct {
26         
27         private List<String> structs = new ArrayList<String>();
28         private List<TreeSet<Score>> data = new ArrayList<TreeSet<Score>>();
29         
30         
31         public RNAStruct() {
32                 // default JaxB Constructor
33         }
34         
35         public RNAStruct(List<String> structs, List<TreeSet<Score>> data) {
36                 assert(structs.size() == data.size());
37                 this.structs = structs;
38                 this.data = data;
39         }
40         
41         public List<String> getStructs() {
42                 return structs;
43         }
44         
45         public List<TreeSet<Score>> getData() {
46                 return data;
47         }
48         
49         // Send this data Structure back to something approximating the stdoutFile
50         // with extra information from alifold.out
51         @Override
52         public String toString() {
53                 String out = "";
54                 // The first objects hold the Consensus Alignment and the alifold.out info
55                 out += structs.get(0) + SysPrefs.newlinechar;
56                 
57                 // Now the rest of the structures with energies/frequencies
58                 for (int i = 1; i < structs.size(); i++) {
59                         out = out + structs.get(i).toString();
60                         
61                         if (data.get(i).first().getScores().size() > 0) {
62                                 List<Float> scores = data.get(i).first().getScores();
63                                 if (scores.size() >= 3) {
64                                         out = out + " (" + scores.get(0).toString() + " = " 
65                                                         + scores.get(1).toString() + " + " + scores.get(2).toString()
66                                                         + ")" + SysPrefs.newlinechar;
67                                 }
68                                 else if (data.get(i).first().getMethod().equals("alifoldMEA")) {
69                                         out = out + " { " + scores.get(0).toString() + " MEA=" 
70                                                         + scores.get(1).toString() + "}" + SysPrefs.newlinechar;
71                                 }
72                                 else if (scores.size() >= 2) {
73                                         out = out + " [" + scores.get(0).toString() + ", " 
74                                                         + scores.get(1).toString() + "]" + SysPrefs.newlinechar;
75                                         
76                                 }
77                         } else out += SysPrefs.newlinechar; 
78                 }
79                 if (data.get(0).first().getScores().size() > 0) {
80                         Iterator<Score> iScores = data.get(0).iterator();
81                         out += "Base Pairings followed by probability" + SysPrefs.newlinechar;
82                         for (int i = 0; i < data.get(0).size(); i++) {
83                                 Score s = iScores.next();
84                                 Range r = s.getRanges().first();
85                                 Float score = s.getScores().get(0);
86                                 out += String.format("%4d  %4d    %.1f%n", r.getFrom(), r.getTo(),
87                                                 score);
88                         }
89                 }
90                 
91                 return out;
92         }
93         
94         @Override 
95         public boolean equals(Object obj) {
96                 if (obj == null) {
97                         return false;
98                 }
99                 if (!(obj instanceof RNAStruct)) {
100                         return false;
101                 }
102                 RNAStruct other = (RNAStruct) obj;
103                 if (structs == null) {
104                         if (other.structs != null) {
105                                 return false;
106                         }
107                 } else if (!structs.equals(other.structs))
108                         return false;
109                 if (data == null) {
110                         if (other.data != null)
111                                 return false;
112                 } else if (!data.equals(other.data))
113                         return false;
114
115                 return true;
116         }
117 }
118
119