annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/prok/PGMTools.java @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
rev   line source
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 }