66 |
09 Feb 06 |
enell |
1 |
/* |
66 |
09 Feb 06 |
enell |
* Created on 07-Oct-2004 |
66 |
09 Feb 06 |
enell |
3 |
* |
66 |
09 Feb 06 |
enell |
* Qscore.java is a part of CalculateQ |
66 |
09 Feb 06 |
enell |
* Copyright (C) 2004 Johan Enell, Dept Oncology, Lund University |
66 |
09 Feb 06 |
enell |
6 |
* |
66 |
09 Feb 06 |
enell |
* This program is free software; you can redistribute it and/or |
66 |
09 Feb 06 |
enell |
* modify it under the terms of the GNU General Public License |
66 |
09 Feb 06 |
enell |
* as published by the Free Software Foundation; either version 2 |
66 |
09 Feb 06 |
enell |
* of the License, or (at your option) any later version. |
66 |
09 Feb 06 |
enell |
11 |
* |
66 |
09 Feb 06 |
enell |
* This program is distributed in the hope that it will be useful, |
66 |
09 Feb 06 |
enell |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
66 |
09 Feb 06 |
enell |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
66 |
09 Feb 06 |
enell |
* GNU General Public License for more details. |
66 |
09 Feb 06 |
enell |
16 |
* |
66 |
09 Feb 06 |
enell |
* You should have received a copy of the GNU General Public License |
66 |
09 Feb 06 |
enell |
* along with this program; if not, write toX the Free Software |
66 |
09 Feb 06 |
enell |
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
66 |
09 Feb 06 |
enell |
20 |
*/ |
67 |
10 Feb 06 |
enell |
21 |
package qpackage.qscore; |
66 |
09 Feb 06 |
enell |
22 |
|
66 |
09 Feb 06 |
enell |
23 |
import java.io.File; |
66 |
09 Feb 06 |
enell |
24 |
import java.io.FileNotFoundException; |
66 |
09 Feb 06 |
enell |
25 |
import java.io.IOException; |
66 |
09 Feb 06 |
enell |
26 |
import java.util.HashMap; |
66 |
09 Feb 06 |
enell |
27 |
import java.util.List; |
66 |
09 Feb 06 |
enell |
28 |
|
66 |
09 Feb 06 |
enell |
29 |
import basefile.BASEFileException; |
66 |
09 Feb 06 |
enell |
30 |
import basefile.BASEFileReader; |
66 |
09 Feb 06 |
enell |
31 |
import basefile.BASEFileSection; |
66 |
09 Feb 06 |
enell |
32 |
import basefile.MissingOptionException; |
66 |
09 Feb 06 |
enell |
33 |
|
67 |
10 Feb 06 |
enell |
34 |
import qpackage.calculator.Calculator; |
67 |
10 Feb 06 |
enell |
35 |
import qpackage.calculator.EquationException; |
67 |
10 Feb 06 |
enell |
36 |
import qpackage.calculator.Variable; |
66 |
09 Feb 06 |
enell |
37 |
|
66 |
09 Feb 06 |
enell |
38 |
/** |
66 |
09 Feb 06 |
enell |
39 |
* |
66 |
09 Feb 06 |
enell |
* @author Johan Enell, johan.enell@onk.lu.se, Dept Oncology, Lund University, S-221 85 Lund, Sweden |
66 |
09 Feb 06 |
enell |
41 |
*/ |
66 |
09 Feb 06 |
enell |
42 |
public class Qscore |
66 |
09 Feb 06 |
enell |
43 |
{ |
66 |
09 Feb 06 |
enell |
44 |
/** |
66 |
09 Feb 06 |
enell |
* The Calculator for the weight function. |
66 |
09 Feb 06 |
enell |
46 |
*/ |
66 |
09 Feb 06 |
enell |
47 |
private Calculator calc = null; |
66 |
09 Feb 06 |
enell |
48 |
|
66 |
09 Feb 06 |
enell |
49 |
private Qscore(BASEFileReader bfr) throws BASEFileException, IOException, EquationException |
66 |
09 Feb 06 |
enell |
50 |
{ |
66 |
09 Feb 06 |
enell |
51 |
BASEFileSection section = bfr.readSection(true); |
66 |
09 Feb 06 |
enell |
52 |
while (section != null) |
66 |
09 Feb 06 |
enell |
53 |
{ |
66 |
09 Feb 06 |
enell |
54 |
if (section.isType("settings")) |
66 |
09 Feb 06 |
enell |
55 |
{ |
66 |
09 Feb 06 |
enell |
56 |
extractSettings(section); |
66 |
09 Feb 06 |
enell |
57 |
} |
66 |
09 Feb 06 |
enell |
58 |
else if (section.isType("assays")) |
66 |
09 Feb 06 |
enell |
59 |
{ |
66 |
09 Feb 06 |
enell |
60 |
extractAssays(section, bfr); |
66 |
09 Feb 06 |
enell |
61 |
} |
66 |
09 Feb 06 |
enell |
62 |
else if (section.isType("spots")) |
66 |
09 Feb 06 |
enell |
63 |
{ |
66 |
09 Feb 06 |
enell |
64 |
extractSpots(section, bfr); |
66 |
09 Feb 06 |
enell |
65 |
} |
66 |
09 Feb 06 |
enell |
66 |
section = bfr.readSection(); |
66 |
09 Feb 06 |
enell |
67 |
} |
66 |
09 Feb 06 |
enell |
68 |
} |
66 |
09 Feb 06 |
enell |
69 |
|
66 |
09 Feb 06 |
enell |
70 |
private void extractSettings(BASEFileSection section) throws MissingOptionException, EquationException |
66 |
09 Feb 06 |
enell |
71 |
{ |
66 |
09 Feb 06 |
enell |
72 |
String equation = section.findStringOpt("equation"); |
66 |
09 Feb 06 |
enell |
73 |
calc = new Calculator(equation); |
66 |
09 Feb 06 |
enell |
74 |
|
66 |
09 Feb 06 |
enell |
75 |
} |
66 |
09 Feb 06 |
enell |
76 |
|
66 |
09 Feb 06 |
enell |
77 |
private void extractAssays(BASEFileSection section, BASEFileReader bfr) |
66 |
09 Feb 06 |
enell |
78 |
{ |
66 |
09 Feb 06 |
enell |
79 |
System.out.println("BASEfile"); |
66 |
09 Feb 06 |
enell |
80 |
} |
66 |
09 Feb 06 |
enell |
81 |
|
66 |
09 Feb 06 |
enell |
82 |
private void extractSpots(BASEFileSection section, BASEFileReader bfr) throws EquationException, BASEFileException, IOException |
66 |
09 Feb 06 |
enell |
83 |
{ |
66 |
09 Feb 06 |
enell |
84 |
List<String> assayFieldsMap; |
66 |
09 Feb 06 |
enell |
85 |
List<String> columnsMap; |
66 |
09 Feb 06 |
enell |
86 |
List<String> assaysMap; |
66 |
09 Feb 06 |
enell |
87 |
|
66 |
09 Feb 06 |
enell |
88 |
int positionPos = -1; |
66 |
09 Feb 06 |
enell |
89 |
int assayDataPos = -1; |
66 |
09 Feb 06 |
enell |
90 |
int reporterPos = -1; |
66 |
09 Feb 06 |
enell |
91 |
int intensity1Pos = -1; |
66 |
09 Feb 06 |
enell |
92 |
int intensity2Pos = -1; |
66 |
09 Feb 06 |
enell |
93 |
|
66 |
09 Feb 06 |
enell |
94 |
assaysMap = section.findFieldList("assays"); |
66 |
09 Feb 06 |
enell |
95 |
if (assaysMap == null) |
66 |
09 Feb 06 |
enell |
96 |
{ |
66 |
09 Feb 06 |
enell |
97 |
System.err.print("assaysMap row in spots section not found\n"); |
66 |
09 Feb 06 |
enell |
98 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
99 |
} |
66 |
09 Feb 06 |
enell |
100 |
if (assaysMap.size() > 1) |
66 |
09 Feb 06 |
enell |
101 |
{ |
66 |
09 Feb 06 |
enell |
102 |
throw new BASEFileException("Data must be exported to a serial BASEfile"); |
66 |
09 Feb 06 |
enell |
103 |
} |
66 |
09 Feb 06 |
enell |
104 |
|
66 |
09 Feb 06 |
enell |
105 |
columnsMap = section.findFieldList("columns"); |
66 |
09 Feb 06 |
enell |
106 |
if (columnsMap == null) |
66 |
09 Feb 06 |
enell |
107 |
{ |
66 |
09 Feb 06 |
enell |
108 |
System.err.print("Columns row in spots section not found\n"); |
66 |
09 Feb 06 |
enell |
109 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
110 |
} |
66 |
09 Feb 06 |
enell |
111 |
|
66 |
09 Feb 06 |
enell |
112 |
assayFieldsMap = section.findFieldList("assayFields"); |
66 |
09 Feb 06 |
enell |
113 |
if (assayFieldsMap == null) |
66 |
09 Feb 06 |
enell |
114 |
{ |
66 |
09 Feb 06 |
enell |
115 |
System.err.print("assayFields row in spots section not found\n"); |
66 |
09 Feb 06 |
enell |
116 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
117 |
} |
66 |
09 Feb 06 |
enell |
118 |
|
66 |
09 Feb 06 |
enell |
119 |
positionPos = columnsMap.indexOf("position"); |
66 |
09 Feb 06 |
enell |
120 |
if (positionPos == -1) |
66 |
09 Feb 06 |
enell |
121 |
{ |
66 |
09 Feb 06 |
enell |
122 |
System.err.print("position column in columns row missing\n"); |
66 |
09 Feb 06 |
enell |
123 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
124 |
} |
66 |
09 Feb 06 |
enell |
125 |
|
66 |
09 Feb 06 |
enell |
126 |
reporterPos = columnsMap.indexOf("reporter!"); |
66 |
09 Feb 06 |
enell |
127 |
if (reporterPos == -1) |
66 |
09 Feb 06 |
enell |
128 |
{ |
66 |
09 Feb 06 |
enell |
129 |
System.err.print("reporter column in columns row missing\n"); |
66 |
09 Feb 06 |
enell |
130 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
131 |
} |
66 |
09 Feb 06 |
enell |
132 |
|
66 |
09 Feb 06 |
enell |
133 |
assayDataPos = columnsMap.indexOf("assayData"); |
66 |
09 Feb 06 |
enell |
134 |
if (assayDataPos == -1) |
66 |
09 Feb 06 |
enell |
135 |
{ |
66 |
09 Feb 06 |
enell |
136 |
System.err.print("assayData column in columns row missing\n"); |
66 |
09 Feb 06 |
enell |
137 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
138 |
} |
66 |
09 Feb 06 |
enell |
139 |
|
66 |
09 Feb 06 |
enell |
140 |
intensity1Pos = assayFieldsMap.indexOf("intensity1"); |
66 |
09 Feb 06 |
enell |
141 |
if (intensity1Pos == -1) |
66 |
09 Feb 06 |
enell |
142 |
{ |
66 |
09 Feb 06 |
enell |
143 |
System.err.print("intensity1 field in assayFields row missing\n"); |
66 |
09 Feb 06 |
enell |
144 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
145 |
} |
66 |
09 Feb 06 |
enell |
146 |
intensity1Pos += assayDataPos; |
66 |
09 Feb 06 |
enell |
147 |
|
66 |
09 Feb 06 |
enell |
148 |
intensity2Pos = assayFieldsMap.indexOf("intensity2"); |
66 |
09 Feb 06 |
enell |
149 |
if (intensity2Pos == -1) |
66 |
09 Feb 06 |
enell |
150 |
{ |
66 |
09 Feb 06 |
enell |
151 |
System.err.print("intensity2 field in assayFields row missing\n"); |
66 |
09 Feb 06 |
enell |
152 |
System.exit(0); |
66 |
09 Feb 06 |
enell |
153 |
} |
66 |
09 Feb 06 |
enell |
154 |
intensity2Pos += assayDataPos; |
66 |
09 Feb 06 |
enell |
155 |
|
66 |
09 Feb 06 |
enell |
156 |
HashMap<Variable, Integer> variables = new HashMap<Variable, Integer>(); |
66 |
09 Feb 06 |
enell |
157 |
for (int i = 0; i < calc.getVariables().length; i++) |
66 |
09 Feb 06 |
enell |
158 |
{ |
66 |
09 Feb 06 |
enell |
159 |
Variable v = calc.getVariables()[i]; |
66 |
09 Feb 06 |
enell |
160 |
int col = assayFieldsMap.indexOf(v.getName()); |
66 |
09 Feb 06 |
enell |
161 |
if (col == -1) |
66 |
09 Feb 06 |
enell |
162 |
{ |
66 |
09 Feb 06 |
enell |
163 |
throw new EquationException(v + " field in assayFields row missing\n"); |
66 |
09 Feb 06 |
enell |
164 |
} |
66 |
09 Feb 06 |
enell |
165 |
col += assayDataPos; |
66 |
09 Feb 06 |
enell |
166 |
variables.put(v, new Integer(col)); |
66 |
09 Feb 06 |
enell |
167 |
} |
66 |
09 Feb 06 |
enell |
168 |
|
66 |
09 Feb 06 |
enell |
169 |
String assay = assaysMap.get(0); |
66 |
09 Feb 06 |
enell |
170 |
|
66 |
09 Feb 06 |
enell |
171 |
System.out.println("section\tspots"); |
66 |
09 Feb 06 |
enell |
172 |
System.out.println("columns\tposition\treporter\tassayData"); |
66 |
09 Feb 06 |
enell |
173 |
System.out.println("setExtraFloats\tonk_q"); |
66 |
09 Feb 06 |
enell |
174 |
System.out.println("assayFields\tintensity1\tintensity2\tonk_q"); |
66 |
09 Feb 06 |
enell |
175 |
System.out.println("assays\t" + assay); |
66 |
09 Feb 06 |
enell |
176 |
System.out.println("%"); |
66 |
09 Feb 06 |
enell |
177 |
|
66 |
09 Feb 06 |
enell |
178 |
String[] row = bfr.readDataRow(); |
66 |
09 Feb 06 |
enell |
179 |
while (row != null && row.length > 1) |
66 |
09 Feb 06 |
enell |
180 |
{ |
66 |
09 Feb 06 |
enell |
181 |
double product = 1; |
66 |
09 Feb 06 |
enell |
182 |
float value = 0; |
66 |
09 Feb 06 |
enell |
183 |
for (Variable v : variables.keySet()) |
66 |
09 Feb 06 |
enell |
184 |
{ |
66 |
09 Feb 06 |
enell |
185 |
try |
66 |
09 Feb 06 |
enell |
186 |
{ |
66 |
09 Feb 06 |
enell |
187 |
int col = variables.get(v); |
66 |
09 Feb 06 |
enell |
188 |
value = Float.parseFloat(row[col]); |
66 |
09 Feb 06 |
enell |
189 |
calc.setVariable(v, value); |
66 |
09 Feb 06 |
enell |
190 |
|
66 |
09 Feb 06 |
enell |
191 |
product *= value; |
66 |
09 Feb 06 |
enell |
192 |
} |
66 |
09 Feb 06 |
enell |
193 |
catch (NumberFormatException e) |
66 |
09 Feb 06 |
enell |
194 |
{ |
66 |
09 Feb 06 |
enell |
195 |
calc.setVariable(v, Float.NaN); |
66 |
09 Feb 06 |
enell |
196 |
} |
66 |
09 Feb 06 |
enell |
197 |
} |
66 |
09 Feb 06 |
enell |
198 |
|
66 |
09 Feb 06 |
enell |
199 |
System.out.println(row[positionPos] + "\t" + row[reporterPos] + "\t" + row[intensity1Pos] + "\t" + row[intensity2Pos] + "\t" + calc.getValue()); |
66 |
09 Feb 06 |
enell |
200 |
|
66 |
09 Feb 06 |
enell |
201 |
row = bfr.readDataRow(); |
66 |
09 Feb 06 |
enell |
202 |
} |
66 |
09 Feb 06 |
enell |
203 |
System.out.println(); |
66 |
09 Feb 06 |
enell |
204 |
} |
66 |
09 Feb 06 |
enell |
205 |
|
66 |
09 Feb 06 |
enell |
206 |
public static void main(String[] args) |
66 |
09 Feb 06 |
enell |
207 |
{ |
66 |
09 Feb 06 |
enell |
208 |
try |
66 |
09 Feb 06 |
enell |
209 |
{ |
66 |
09 Feb 06 |
enell |
210 |
BASEFileReader bfr = null; |
66 |
09 Feb 06 |
enell |
211 |
if (args.length == 1) |
66 |
09 Feb 06 |
enell |
212 |
{ |
66 |
09 Feb 06 |
enell |
213 |
bfr = new BASEFileReader(new File(args[0])); |
66 |
09 Feb 06 |
enell |
214 |
} |
66 |
09 Feb 06 |
enell |
215 |
else if (args.length == 0) |
66 |
09 Feb 06 |
enell |
216 |
{ |
66 |
09 Feb 06 |
enell |
217 |
bfr = new BASEFileReader(new File("stdin.txt")); |
66 |
09 Feb 06 |
enell |
218 |
} |
66 |
09 Feb 06 |
enell |
219 |
else |
66 |
09 Feb 06 |
enell |
220 |
{ |
66 |
09 Feb 06 |
enell |
221 |
System.err.println("Q Score: invalid input given"); |
66 |
09 Feb 06 |
enell |
222 |
System.exit(-1); |
66 |
09 Feb 06 |
enell |
223 |
} |
66 |
09 Feb 06 |
enell |
224 |
|
66 |
09 Feb 06 |
enell |
225 |
new Qscore(bfr); |
66 |
09 Feb 06 |
enell |
226 |
} |
66 |
09 Feb 06 |
enell |
227 |
catch (OutOfMemoryError e) |
66 |
09 Feb 06 |
enell |
228 |
{ |
66 |
09 Feb 06 |
enell |
229 |
System.err.println("No more memory in the java virtual machine. Try to start the application with the flag '-Xmx256m' or '-Xmx512m'. If you need even more memory choose a larger digit (max 1024)"); |
66 |
09 Feb 06 |
enell |
230 |
e.printStackTrace(); |
66 |
09 Feb 06 |
enell |
231 |
System.exit(-1); |
66 |
09 Feb 06 |
enell |
232 |
} |
66 |
09 Feb 06 |
enell |
233 |
catch (FileNotFoundException e) |
66 |
09 Feb 06 |
enell |
234 |
{ |
66 |
09 Feb 06 |
enell |
235 |
System.out.println("Q Score: Could not find the file " + args[0]); |
66 |
09 Feb 06 |
enell |
236 |
e.printStackTrace(); |
66 |
09 Feb 06 |
enell |
237 |
} |
66 |
09 Feb 06 |
enell |
238 |
catch (BASEFileException e) |
66 |
09 Feb 06 |
enell |
239 |
{ |
66 |
09 Feb 06 |
enell |
240 |
e.printStackTrace(); |
66 |
09 Feb 06 |
enell |
241 |
} |
66 |
09 Feb 06 |
enell |
242 |
catch (IOException e) |
66 |
09 Feb 06 |
enell |
243 |
{ |
66 |
09 Feb 06 |
enell |
244 |
e.printStackTrace(); |
66 |
09 Feb 06 |
enell |
245 |
} |
66 |
09 Feb 06 |
enell |
246 |
catch (EquationException e) |
66 |
09 Feb 06 |
enell |
247 |
{ |
66 |
09 Feb 06 |
enell |
248 |
e.printStackTrace(); |
66 |
09 Feb 06 |
enell |
249 |
} |
66 |
09 Feb 06 |
enell |
250 |
} |
66 |
09 Feb 06 |
enell |
251 |
} |