jpayne@68
|
1 package prok;
|
jpayne@68
|
2
|
jpayne@68
|
3 import java.io.File;
|
jpayne@68
|
4 import java.io.PrintStream;
|
jpayne@68
|
5 import java.util.ArrayList;
|
jpayne@68
|
6
|
jpayne@68
|
7 import dna.Data;
|
jpayne@68
|
8 import fileIO.ByteStreamWriter;
|
jpayne@68
|
9 import fileIO.FileFormat;
|
jpayne@68
|
10 import fileIO.ReadWrite;
|
jpayne@68
|
11 import shared.Parse;
|
jpayne@68
|
12 import shared.Parser;
|
jpayne@68
|
13 import shared.PreParser;
|
jpayne@68
|
14 import shared.Shared;
|
jpayne@68
|
15 import shared.Timer;
|
jpayne@68
|
16 import shared.Tools;
|
jpayne@68
|
17 import structures.ByteBuilder;
|
jpayne@68
|
18
|
jpayne@68
|
19 /**
|
jpayne@68
|
20 * Static helpers for manipulating pgm files.
|
jpayne@68
|
21 * main() merges pgm files.
|
jpayne@68
|
22 * @author Brian Bushnell
|
jpayne@68
|
23 * @date Sep 24, 2018
|
jpayne@68
|
24 *
|
jpayne@68
|
25 */
|
jpayne@68
|
26 public class PGMTools extends ProkObject {
|
jpayne@68
|
27
|
jpayne@68
|
28 /*--------------------------------------------------------------*/
|
jpayne@68
|
29 /*---------------- Main ----------------*/
|
jpayne@68
|
30 /*--------------------------------------------------------------*/
|
jpayne@68
|
31
|
jpayne@68
|
32 /** Combines multiple pgm files into a single file */
|
jpayne@68
|
33 public static void main(String[] args){
|
jpayne@68
|
34
|
jpayne@68
|
35 //Start a timer immediately upon code entrance.
|
jpayne@68
|
36 Timer t=new Timer();
|
jpayne@68
|
37
|
jpayne@68
|
38 {//Preparse block for help, config files, and outstream
|
jpayne@68
|
39 PreParser pp=new PreParser(args, new Object() { }.getClass().getEnclosingClass(), false);
|
jpayne@68
|
40 args=pp.args;
|
jpayne@68
|
41 outstream=pp.outstream;
|
jpayne@68
|
42 }
|
jpayne@68
|
43
|
jpayne@68
|
44 ProkObject.call18S=true;
|
jpayne@68
|
45 boolean overwrite=true;
|
jpayne@68
|
46 boolean allowDupes=false;
|
jpayne@68
|
47 String out=null;
|
jpayne@68
|
48 ArrayList<String> in=new ArrayList<String>();
|
jpayne@68
|
49
|
jpayne@68
|
50 {
|
jpayne@68
|
51 Parser parser=new Parser();
|
jpayne@68
|
52 for(int i=0; i<args.length; i++){
|
jpayne@68
|
53 String arg=args[i];
|
jpayne@68
|
54 String[] split=arg.split("=");
|
jpayne@68
|
55 String a=split[0].toLowerCase();
|
jpayne@68
|
56 String b=split.length>1 ? split[1] : null;
|
jpayne@68
|
57 if(b!=null && b.equalsIgnoreCase("null")){b=null;}
|
jpayne@68
|
58
|
jpayne@68
|
59 if(a.equals("in")){
|
jpayne@68
|
60 assert(b!=null);
|
jpayne@68
|
61 Tools.addFiles(b, in);
|
jpayne@68
|
62 }else if(parseStatic(arg, a, b)){
|
jpayne@68
|
63 //do nothing
|
jpayne@68
|
64 }else if(a.equals("allowdupes") || a.equals("allowduplicates") || a.equals("dupes")){
|
jpayne@68
|
65 allowDupes=Parse.parseBoolean(b);
|
jpayne@68
|
66 }else if(a.equals("verbose")){
|
jpayne@68
|
67 verbose=Parse.parseBoolean(b);
|
jpayne@68
|
68 ReadWrite.verbose=verbose;
|
jpayne@68
|
69 }
|
jpayne@68
|
70
|
jpayne@68
|
71 else if(parser.parse(arg, a, b)){
|
jpayne@68
|
72 //do nothing
|
jpayne@68
|
73 }else if(b==null && new File(arg.split("@")[0]).exists()){
|
jpayne@68
|
74 in.add(arg);
|
jpayne@68
|
75 }else{
|
jpayne@68
|
76 outstream.println("Unknown parameter "+args[i]);
|
jpayne@68
|
77 assert(false) : "Unknown parameter "+args[i];
|
jpayne@68
|
78 // throw new RuntimeException("Unknown parameter "+args[i]);
|
jpayne@68
|
79 }
|
jpayne@68
|
80 }
|
jpayne@68
|
81 overwrite=parser.overwrite;
|
jpayne@68
|
82 out=parser.out1;
|
jpayne@68
|
83 }
|
jpayne@68
|
84
|
jpayne@68
|
85 checkFileExistence(in, out, overwrite, allowDupes);
|
jpayne@68
|
86
|
jpayne@68
|
87 ArrayList<GeneModel> models=loadModels(in);
|
jpayne@68
|
88 GeneModel gm=mergeModels(models);
|
jpayne@68
|
89 boolean errorState=writeModel(gm, out, overwrite);
|
jpayne@68
|
90
|
jpayne@68
|
91 //Close the print stream if it was redirected
|
jpayne@68
|
92 Shared.closeStream(outstream);
|
jpayne@68
|
93 }
|
jpayne@68
|
94
|
jpayne@68
|
95 public static boolean parseStatic(String arg, String a, String b){
|
jpayne@68
|
96 if(a.equals("kinnercds")){
|
jpayne@68
|
97 int k=Integer.parseInt(b);
|
jpayne@68
|
98 GeneModel.setInnerK(k);
|
jpayne@68
|
99 }else if(a.equals("kstartcds")){
|
jpayne@68
|
100 int k=Integer.parseInt(b);
|
jpayne@68
|
101 GeneModel.setStartK(k);
|
jpayne@68
|
102 }else if(a.equals("kstopcds")){
|
jpayne@68
|
103 int k=Integer.parseInt(b);
|
jpayne@68
|
104 GeneModel.setStopK(k);
|
jpayne@68
|
105 }else if(a.equals("kinnerrna")){
|
jpayne@68
|
106 int k=Integer.parseInt(b);
|
jpayne@68
|
107 kInnerRNA=k;
|
jpayne@68
|
108 }else if(a.equals("kstartrna")){
|
jpayne@68
|
109 int k=Integer.parseInt(b);
|
jpayne@68
|
110 kStartRNA=k;
|
jpayne@68
|
111 }else if(a.equals("kstoprna")){
|
jpayne@68
|
112 int k=Integer.parseInt(b);
|
jpayne@68
|
113 kStopRNA=k;
|
jpayne@68
|
114 }else if(a.equals("startleftoffset")){
|
jpayne@68
|
115 int x=Integer.parseInt(b);
|
jpayne@68
|
116 GeneModel.setStartLeftOffset(x);
|
jpayne@68
|
117 }else if(a.equals("startrightoffset")){
|
jpayne@68
|
118 int x=Integer.parseInt(b);
|
jpayne@68
|
119 GeneModel.setStartRightOffset(x);
|
jpayne@68
|
120 }else if(a.equals("stopleftoffset")){
|
jpayne@68
|
121 int x=Integer.parseInt(b);
|
jpayne@68
|
122 GeneModel.setStopLeftOffset(x);
|
jpayne@68
|
123 }else if(a.equals("stoprightoffset")){
|
jpayne@68
|
124 int x=Integer.parseInt(b);
|
jpayne@68
|
125 GeneModel.setStopRightOffset(x);
|
jpayne@68
|
126 }else if(a.equalsIgnoreCase("callcdsonly") || a.equalsIgnoreCase("cdsonly")){
|
jpayne@68
|
127 callCDS=Parse.parseBoolean(b);
|
jpayne@68
|
128 calltRNA=call16S=call23S=call5S=call18S=!callCDS;
|
jpayne@68
|
129 }else if(a.equalsIgnoreCase("call16sonly") || a.equalsIgnoreCase("16sonly")){
|
jpayne@68
|
130 call16S=Parse.parseBoolean(b);
|
jpayne@68
|
131 calltRNA=call23S=call5S=call18S=callCDS=!call16S;
|
jpayne@68
|
132 }else if(a.equalsIgnoreCase("call23sonly") || a.equalsIgnoreCase("23sonly")){
|
jpayne@68
|
133 call23S=Parse.parseBoolean(b);
|
jpayne@68
|
134 calltRNA=call16S=call5S=call18S=callCDS=!call23S;
|
jpayne@68
|
135 }else if(a.equalsIgnoreCase("call5sonly") || a.equalsIgnoreCase("5sonly")){
|
jpayne@68
|
136 call5S=Parse.parseBoolean(b);
|
jpayne@68
|
137 calltRNA=call16S=call23S=call18S=callCDS=!call5S;
|
jpayne@68
|
138 }else if(a.equalsIgnoreCase("calltrnaonly") || a.equalsIgnoreCase("trnaonly")){
|
jpayne@68
|
139 calltRNA=Parse.parseBoolean(b);
|
jpayne@68
|
140 call16S=call23S=call5S=call18S=callCDS=!calltRNA;
|
jpayne@68
|
141 }else if(a.equalsIgnoreCase("call18sonly") || a.equalsIgnoreCase("18sonly")){
|
jpayne@68
|
142 call18S=Parse.parseBoolean(b);
|
jpayne@68
|
143 calltRNA=call16S=call23S=call5S=callCDS=!call18S;
|
jpayne@68
|
144 }
|
jpayne@68
|
145
|
jpayne@68
|
146 else if(a.equalsIgnoreCase("callcds") || a.equalsIgnoreCase("cds")){
|
jpayne@68
|
147 callCDS=Parse.parseBoolean(b);
|
jpayne@68
|
148 }else if(a.equalsIgnoreCase("calltrna") || a.equalsIgnoreCase("trna")){
|
jpayne@68
|
149 calltRNA=Parse.parseBoolean(b);
|
jpayne@68
|
150 }else if(a.equalsIgnoreCase("call16s") || a.equalsIgnoreCase("16s")){
|
jpayne@68
|
151 call16S=Parse.parseBoolean(b);
|
jpayne@68
|
152 }else if(a.equalsIgnoreCase("call18s") || a.equalsIgnoreCase("18s")){
|
jpayne@68
|
153 call18S=Parse.parseBoolean(b);
|
jpayne@68
|
154 }else if(a.equalsIgnoreCase("call23s") || a.equalsIgnoreCase("23s")){
|
jpayne@68
|
155 call23S=Parse.parseBoolean(b);
|
jpayne@68
|
156 }else if(a.equalsIgnoreCase("call5s") || a.equalsIgnoreCase("5s")){
|
jpayne@68
|
157 call5S=Parse.parseBoolean(b);
|
jpayne@68
|
158 }else if(a.equalsIgnoreCase("callrna") || a.equalsIgnoreCase("rna")){
|
jpayne@68
|
159 calltRNA=call16S=call18S=call5S=call23S=Parse.parseBoolean(b);
|
jpayne@68
|
160 }
|
jpayne@68
|
161
|
jpayne@68
|
162 else if(a.equalsIgnoreCase("normalize")){
|
jpayne@68
|
163 normalize=Parse.parseBoolean(b);
|
jpayne@68
|
164 }
|
jpayne@68
|
165
|
jpayne@68
|
166 else{
|
jpayne@68
|
167 return false;
|
jpayne@68
|
168 }
|
jpayne@68
|
169 return true;
|
jpayne@68
|
170 }
|
jpayne@68
|
171
|
jpayne@68
|
172 public static ArrayList<GeneModel> loadModels(ArrayList<String> fnames){
|
jpayne@68
|
173 ArrayList<GeneModel> models=new ArrayList<GeneModel>(fnames.size());
|
jpayne@68
|
174 ArrayList<Double> mults=new ArrayList<Double>(fnames.size());
|
jpayne@68
|
175 for(String s : fnames){
|
jpayne@68
|
176 double mult=1;
|
jpayne@68
|
177 String fname=s;
|
jpayne@68
|
178 if(s.indexOf('@')>=0){
|
jpayne@68
|
179 String[] split=s.split("@");
|
jpayne@68
|
180 fname=split[0];
|
jpayne@68
|
181 mult=Double.parseDouble(split[1]);
|
jpayne@68
|
182 }
|
jpayne@68
|
183 GeneModel pgm=GeneModelParser.loadModel(fname);
|
jpayne@68
|
184 mults.add(mult);
|
jpayne@68
|
185 models.add(pgm);
|
jpayne@68
|
186 }
|
jpayne@68
|
187 if(normalize){
|
jpayne@68
|
188 long max=0;
|
jpayne@68
|
189 for(GeneModel gm : models){
|
jpayne@68
|
190 max=Tools.max(gm.basesProcessed, max);
|
jpayne@68
|
191 }
|
jpayne@68
|
192 for(GeneModel gm : models){
|
jpayne@68
|
193 if(max!=gm.basesProcessed){
|
jpayne@68
|
194 double mult=max/(double)(Tools.max(100, gm.basesProcessed));
|
jpayne@68
|
195 gm.multiplyBy(mult);
|
jpayne@68
|
196 }
|
jpayne@68
|
197 }
|
jpayne@68
|
198 }
|
jpayne@68
|
199 for(int i=0; i<models.size(); i++){
|
jpayne@68
|
200 double mult=mults.get(i);
|
jpayne@68
|
201 GeneModel gm=models.get(i);
|
jpayne@68
|
202 if(mult!=1){gm.multiplyBy(mult);}
|
jpayne@68
|
203 }
|
jpayne@68
|
204 return models;
|
jpayne@68
|
205 }
|
jpayne@68
|
206
|
jpayne@68
|
207 public static GeneModel mergeModels(ArrayList<GeneModel> models){
|
jpayne@68
|
208 if(models.size()==1){return models.get(0);}
|
jpayne@68
|
209 GeneModel pgmSum=new GeneModel(true);
|
jpayne@68
|
210 for(GeneModel pgm : models){
|
jpayne@68
|
211 pgmSum.add(pgm);
|
jpayne@68
|
212 }
|
jpayne@68
|
213 return pgmSum;
|
jpayne@68
|
214 }
|
jpayne@68
|
215
|
jpayne@68
|
216 public static GeneModel loadAndMerge(ArrayList<String> in) {
|
jpayne@68
|
217 ArrayList<GeneModel> models=loadModels(in);
|
jpayne@68
|
218 return mergeModels(models);
|
jpayne@68
|
219 }
|
jpayne@68
|
220
|
jpayne@68
|
221 public static boolean writeModel(GeneModel pgm, String out, boolean overwrite){
|
jpayne@68
|
222 FileFormat ffout=FileFormat.testOutput(out, FileFormat.PGM, null, true, overwrite, false, false);
|
jpayne@68
|
223 return writeModel(pgm, ffout);
|
jpayne@68
|
224 }
|
jpayne@68
|
225
|
jpayne@68
|
226 public static boolean writeModel(GeneModel pgm, FileFormat ffout){
|
jpayne@68
|
227 ByteStreamWriter bsw=ByteStreamWriter.makeBSW(ffout);
|
jpayne@68
|
228
|
jpayne@68
|
229 ByteBuilder bb=new ByteBuilder();
|
jpayne@68
|
230 pgm.appendTo(bb);
|
jpayne@68
|
231
|
jpayne@68
|
232 boolean errorState=false;
|
jpayne@68
|
233 if(bsw!=null){
|
jpayne@68
|
234 bsw.addJob(bb);
|
jpayne@68
|
235 errorState|=bsw.poisonAndWait();
|
jpayne@68
|
236 }
|
jpayne@68
|
237 return errorState;
|
jpayne@68
|
238 }
|
jpayne@68
|
239
|
jpayne@68
|
240 /** Ensure files can be read and written */
|
jpayne@68
|
241 private static void checkFileExistence(ArrayList<String> in, String out, boolean overwrite, boolean allowDupes){
|
jpayne@68
|
242 //Ensure output files can be written
|
jpayne@68
|
243 if(!Tools.testOutputFiles(overwrite, false, false, out)){
|
jpayne@68
|
244 outstream.println((out==null)+", "+out);
|
jpayne@68
|
245 throw new RuntimeException("\n\noverwrite="+overwrite+"; Can't write to output file "+out+"\n");
|
jpayne@68
|
246 }
|
jpayne@68
|
247 ArrayList<String> in2=new ArrayList<String>();
|
jpayne@68
|
248 for(String s : in){
|
jpayne@68
|
249 in2.add(s.split("@")[0]);
|
jpayne@68
|
250 }
|
jpayne@68
|
251 in=null;
|
jpayne@68
|
252
|
jpayne@68
|
253 for(int i=0; i<in2.size(); i++){
|
jpayne@68
|
254 String s=in2.get(i);
|
jpayne@68
|
255 if(s.equalsIgnoreCase("auto") || s.equalsIgnoreCase("default")){
|
jpayne@68
|
256 in2.set(i, Data.findPath("?model.pgm"));
|
jpayne@68
|
257 }
|
jpayne@68
|
258 }
|
jpayne@68
|
259
|
jpayne@68
|
260 //Ensure input files can be read
|
jpayne@68
|
261 ArrayList<String> foo=new ArrayList<String>();
|
jpayne@68
|
262 foo.addAll(in2);
|
jpayne@68
|
263 if(!Tools.testInputFiles(allowDupes, true, foo.toArray(new String[0]))){
|
jpayne@68
|
264 throw new RuntimeException("\nCan't read some input files.\n");
|
jpayne@68
|
265 }
|
jpayne@68
|
266
|
jpayne@68
|
267 //Ensure that no file was specified multiple times
|
jpayne@68
|
268 if(!allowDupes){
|
jpayne@68
|
269 foo.add(out);
|
jpayne@68
|
270 if(!Tools.testForDuplicateFiles(true, foo.toArray(new String[0]))){
|
jpayne@68
|
271 throw new RuntimeException("\nSome file names were specified multiple times.\n");
|
jpayne@68
|
272 }
|
jpayne@68
|
273 }
|
jpayne@68
|
274 }
|
jpayne@68
|
275
|
jpayne@68
|
276 /*--------------------------------------------------------------*/
|
jpayne@68
|
277
|
jpayne@68
|
278 private static PrintStream outstream=System.err;
|
jpayne@68
|
279 public static boolean verbose=false;
|
jpayne@68
|
280 /** Mix models equally */
|
jpayne@68
|
281 public static boolean normalize=false;
|
jpayne@68
|
282
|
jpayne@68
|
283 }
|