annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/sketch/DisplayParams.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 sketch;
jpayne@68 2
jpayne@68 3 import java.util.ArrayList;
jpayne@68 4 import java.util.Collections;
jpayne@68 5 import java.util.Comparator;
jpayne@68 6 import java.util.Locale;
jpayne@68 7 import java.util.Map.Entry;
jpayne@68 8
jpayne@68 9 import json.JsonObject;
jpayne@68 10 import shared.Colors;
jpayne@68 11 import shared.Parse;
jpayne@68 12 import shared.Tools;
jpayne@68 13 import structures.ByteBuilder;
jpayne@68 14 import tax.PrintTaxonomy;
jpayne@68 15 import tax.TaxFilter;
jpayne@68 16 import tax.TaxNode;
jpayne@68 17 import tax.TaxTree;
jpayne@68 18
jpayne@68 19 public class DisplayParams implements Cloneable {
jpayne@68 20
jpayne@68 21 @Override
jpayne@68 22 public DisplayParams clone(){
jpayne@68 23 try {
jpayne@68 24 DisplayParams copy=(DisplayParams)super.clone();
jpayne@68 25 if(taxFilterWhite!=null){
jpayne@68 26 copy.taxFilterWhite=taxFilterWhite.deepCopy();
jpayne@68 27 }
jpayne@68 28 if(taxFilterBlack!=null){
jpayne@68 29 copy.taxFilterBlack=taxFilterBlack.deepCopy();
jpayne@68 30 }
jpayne@68 31 copy.postParsed=false;
jpayne@68 32 return copy;
jpayne@68 33 } catch (CloneNotSupportedException e) {
jpayne@68 34 // TODO Auto-generated catch block
jpayne@68 35 e.printStackTrace();
jpayne@68 36 throw new RuntimeException();
jpayne@68 37 }
jpayne@68 38 }
jpayne@68 39
jpayne@68 40 public DisplayParams parseDoubleHeader(String s){
jpayne@68 41 if(!s.startsWith("##")){return this;}
jpayne@68 42 // if(!s.startsWith("##")){return this.clone();}
jpayne@68 43 StringBuilder sb=new StringBuilder();
jpayne@68 44 for(int i=2; i<s.length(); i++){
jpayne@68 45 char c=s.charAt(i);
jpayne@68 46 if(c=='\n'){break;}
jpayne@68 47 sb.append(c);
jpayne@68 48 }
jpayne@68 49 return parseDoubleHeaderLine(sb.toString());
jpayne@68 50 }
jpayne@68 51
jpayne@68 52 public DisplayParams parseDoubleHeaderLine(String line) {
jpayne@68 53 if(line.startsWith("##")){line=line.substring(2);}
jpayne@68 54 else{assert(!line.startsWith("#")) : line;}
jpayne@68 55 if(line.length()<1){return this;}
jpayne@68 56
jpayne@68 57 DisplayParams params=this.clone();
jpayne@68 58
jpayne@68 59 String[] args=line.split(" ");
jpayne@68 60 for(String arg : args){
jpayne@68 61 String[] split=arg.split("=");
jpayne@68 62 String a=split[0].toLowerCase();
jpayne@68 63 String b=split.length>1 ? split[1] : null;
jpayne@68 64 if(b==null || b.equalsIgnoreCase("null")){b=null;} //Normally handled by PreParser, but not in this case.
jpayne@68 65 while(a.startsWith("-")){a=a.substring(1);} //Strip leading hyphens
jpayne@68 66
jpayne@68 67 boolean x=params.parse(arg, a, b);
jpayne@68 68 // assert(x) : "Unknown parameter "+arg+"\n"+line;
jpayne@68 69 if(!x){System.err.println("Warning: Unknown parameter "+arg);}
jpayne@68 70 }
jpayne@68 71 if(SketchObject.verbose2){System.err.println("Made it to post-parse. taxFilterWhite="+params.taxFilterWhite);}
jpayne@68 72 params.postParse(true, true);
jpayne@68 73 if(SketchObject.verbose2){System.err.println("Passed post-parse. taxFilterWhite="+params.taxFilterWhite);}
jpayne@68 74
jpayne@68 75 return params;
jpayne@68 76 }
jpayne@68 77
jpayne@68 78 public boolean parse(String arg, String a, String b){
jpayne@68 79
jpayne@68 80 if(a.equals("chunk")){
jpayne@68 81 chunkNum=Integer.parseInt(b);
jpayne@68 82 }else if(a.equals("minhits") || a.equals("hits")){
jpayne@68 83 minHits=Integer.parseInt(b);
jpayne@68 84 }else if(a.equalsIgnoreCase("minwkid") || a.equalsIgnoreCase("wkid")){
jpayne@68 85 minWKID=Float.parseFloat(b);
jpayne@68 86 if(minWKID>1){minWKID/=100;}
jpayne@68 87 assert(minWKID<=1) : "minWKID should between 0 and 1";
jpayne@68 88 }else if(a.equalsIgnoreCase("minid") || a.equalsIgnoreCase("id") || a.equalsIgnoreCase("minani") || a.equalsIgnoreCase("ani")){
jpayne@68 89 minANI=Float.parseFloat(b);
jpayne@68 90 if(minANI>1){minANI/=100;}
jpayne@68 91 assert(minANI<=1) : "minANI should between 0 and 1";
jpayne@68 92 if(minANI>0){
jpayne@68 93 minWKID=(float)Tools.max(minWKID, Comparison.aniToWkid(minANI, 32));//Lowest possible minWKID for this ANI
jpayne@68 94 }
jpayne@68 95 }else if(a.equals("minbases")){
jpayne@68 96 minBases=Integer.parseInt(b);
jpayne@68 97 }else if(a.equals("minsizeratio")){
jpayne@68 98 minSizeRatio=Float.parseFloat(b);
jpayne@68 99 // assert(minSizeRatio>=0f && minSizeRatio<=1.0f) : "\nminSizeRatio must be between 0 and 1, inclusive.\n";
jpayne@68 100 if(minSizeRatio>1){minSizeRatio=1f/minSizeRatio;}
jpayne@68 101 }else if(a.equals("records") || a.equals("maxrecords") || a.equals("results")){
jpayne@68 102 maxRecords=Integer.parseInt(b);
jpayne@68 103 assert(maxRecords>=1) : "Max records must be at least 1.";
jpayne@68 104 }else if(a.equals("recordsperlevel")){
jpayne@68 105 recordsPerLevel=Integer.parseInt(b);
jpayne@68 106 }else if(a.equals("format")){
jpayne@68 107 assert(b!=null) : "Invalid format: "+arg;
jpayne@68 108 if(b.equalsIgnoreCase("json")){
jpayne@68 109 format=FORMAT_JSON;
jpayne@68 110 }else if(b.equalsIgnoreCase("jsonarray")){
jpayne@68 111 format=FORMAT_JSON;
jpayne@68 112 jsonArray=true;
jpayne@68 113 }else if(b.equalsIgnoreCase("d3")){
jpayne@68 114 format=FORMAT_JSON;
jpayne@68 115 printD3=true;
jpayne@68 116 }else if(b.equalsIgnoreCase("constellation")){
jpayne@68 117 format=FORMAT_CONSTELLATION;
jpayne@68 118 }else if(b.equalsIgnoreCase("3column") || b.equalsIgnoreCase("queryrefani")){
jpayne@68 119 format=FORMAT_QUERY_REF_ANI;
jpayne@68 120 }else if(Tools.isDigit(b.charAt(0))){
jpayne@68 121 format=Integer.parseInt(b);
jpayne@68 122 }else{
jpayne@68 123 assert(false) : "Invalid format: "+arg;
jpayne@68 124 }
jpayne@68 125 }else if(a.equalsIgnoreCase("json")){
jpayne@68 126 if(Parse.parseBoolean(b)){
jpayne@68 127 format=FORMAT_JSON;
jpayne@68 128 }else{
jpayne@68 129 if(format==FORMAT_JSON){format=default_format;}
jpayne@68 130 }
jpayne@68 131 }else if(a.equalsIgnoreCase("jsonarray") || a.equalsIgnoreCase("jsonarrays")){
jpayne@68 132 if(Parse.parseBoolean(b)){
jpayne@68 133 format=FORMAT_JSON;
jpayne@68 134 jsonArray=true;
jpayne@68 135 }else{
jpayne@68 136 jsonArray=false;
jpayne@68 137 }
jpayne@68 138 }else if(a.equalsIgnoreCase("d3") || a.equalsIgnoreCase("printd3")){
jpayne@68 139 if(Parse.parseBoolean(b)){
jpayne@68 140 format=FORMAT_JSON;
jpayne@68 141 printD3=true;
jpayne@68 142 }else{
jpayne@68 143 printD3=false;
jpayne@68 144 }
jpayne@68 145 }else if(a.equalsIgnoreCase("jsonarray") || a.equalsIgnoreCase("jsonarrays")){
jpayne@68 146 if(Parse.parseBoolean(b)){
jpayne@68 147 jsonArray=true;
jpayne@68 148 }else{
jpayne@68 149 jsonArray=false;
jpayne@68 150 }
jpayne@68 151 }else if(a.equalsIgnoreCase("d3levelnodes")){
jpayne@68 152 D3LevelNodes=Parse.parseBoolean(b);
jpayne@68 153 }else if(a.equalsIgnoreCase("d3hitsize")){
jpayne@68 154 if(Parse.parseBoolean(b)){D3sizeMode=D3_HIT_SIZE;}
jpayne@68 155 }else if(a.equalsIgnoreCase("d3anisize")){
jpayne@68 156 if(Parse.parseBoolean(b)){D3sizeMode=D3_ANI_SIZE;}
jpayne@68 157 }else if(a.equalsIgnoreCase("d3wkidsize")){
jpayne@68 158 if(Parse.parseBoolean(b)){D3sizeMode=D3_WKID_SIZE;}
jpayne@68 159 }else if(a.equalsIgnoreCase("d3depthsize")){
jpayne@68 160 if(Parse.parseBoolean(b)){
jpayne@68 161 D3sizeMode=D3_DEPTH_SIZE;
jpayne@68 162 printDepth=true;
jpayne@68 163 }
jpayne@68 164 }else if(a.equalsIgnoreCase("d3kidsize")){
jpayne@68 165 if(Parse.parseBoolean(b)){D3sizeMode=D3_KID_SIZE;}
jpayne@68 166 }else if(a.equalsIgnoreCase("D3sizeMode")){
jpayne@68 167 D3sizeMode=Integer.parseInt(b);
jpayne@68 168 }else if(a.equals("level") || a.equals("lv") || a.equals("taxlevel") || a.equals("tl") || a.equals("minlevel")){
jpayne@68 169 taxLevel=TaxTree.parseLevel(b);//TODO: Change to extended
jpayne@68 170 }
jpayne@68 171
jpayne@68 172 else if(a.equalsIgnoreCase("requireSSU")){
jpayne@68 173 requireSSU=Parse.parseBoolean(b);
jpayne@68 174 }
jpayne@68 175
jpayne@68 176 else if(a.equalsIgnoreCase("minRefSizeEstimate") || a.equalsIgnoreCase("minRefSize")){
jpayne@68 177 minRefSizeEstimate=Long.parseLong(b);
jpayne@68 178 }else if(a.equalsIgnoreCase("minRefSizeBases")){
jpayne@68 179 minRefSizeBases=Long.parseLong(b);
jpayne@68 180 }
jpayne@68 181
jpayne@68 182 else if(a.equalsIgnoreCase("printtax") || a.equalsIgnoreCase("printtaxa")){
jpayne@68 183 printTax=Parse.parseBoolean(b);
jpayne@68 184 }else if(a.equalsIgnoreCase("printssu") || a.equalsIgnoreCase("print16s") || a.equalsIgnoreCase("ssu")){
jpayne@68 185 printSSU=Parse.parseBoolean(b);
jpayne@68 186 }else if(a.equalsIgnoreCase("printSSULen") || a.equalsIgnoreCase("print16slen") || a.equalsIgnoreCase("ssulen")){
jpayne@68 187 printSSULen=Parse.parseBoolean(b);
jpayne@68 188 }else if(a.equalsIgnoreCase("printssusequence") || a.equalsIgnoreCase("print16ssequence")){
jpayne@68 189 printSSUSequence=Parse.parseBoolean(b);
jpayne@68 190 }else if(a.equalsIgnoreCase("printqueryfilename") || a.equalsIgnoreCase("printqfname") || a.equalsIgnoreCase("printqfile") || a.equalsIgnoreCase("qfname")){
jpayne@68 191 printQueryFileName=Parse.parseBoolean(b);
jpayne@68 192 }else if(a.equalsIgnoreCase("printreffilename") || a.equalsIgnoreCase("printrfname") || a.equalsIgnoreCase("printrfile") || a.equalsIgnoreCase("rfname")){
jpayne@68 193 printRefFileName=Parse.parseBoolean(b);
jpayne@68 194 }else if(a.equalsIgnoreCase("printfilename") || a.equalsIgnoreCase("printfname") || a.equalsIgnoreCase("printfile")){
jpayne@68 195 printQueryFileName=printRefFileName=Parse.parseBoolean(b);
jpayne@68 196 }else if(a.equalsIgnoreCase("printoriginalname") || a.equalsIgnoreCase("printseqname") || a.equalsIgnoreCase("printname0") || a.equals("pn0")){
jpayne@68 197 printOriginalName=Parse.parseBoolean(b);
jpayne@68 198 }else if(a.equalsIgnoreCase("printimg")){
jpayne@68 199 printImg=Parse.parseBoolean(b);
jpayne@68 200 }else if(a.equalsIgnoreCase("printcompleteness") || a.equalsIgnoreCase("completeness") || a.equalsIgnoreCase("printcomplt")){
jpayne@68 201 printCompleteness=Parse.parseBoolean(b);
jpayne@68 202 }else if(a.equalsIgnoreCase("printani") || a.equalsIgnoreCase("ani")){
jpayne@68 203 printAni=Parse.parseBoolean(b);
jpayne@68 204 }else if(a.equalsIgnoreCase("printkid") || a.equalsIgnoreCase("kid")){
jpayne@68 205 printKID=Parse.parseBoolean(b);
jpayne@68 206 }else if(a.equalsIgnoreCase("printwkid") || a.equalsIgnoreCase("wkid")){
jpayne@68 207 printWKID=Parse.parseBoolean(b);
jpayne@68 208 }else if(a.equalsIgnoreCase("printscore") || a.equalsIgnoreCase("score")){
jpayne@68 209 printScore=Parse.parseBoolean(b);
jpayne@68 210 }else if(a.equalsIgnoreCase("printevalue") || a.equalsIgnoreCase("evalue")){
jpayne@68 211 printEValue=Parse.parseBoolean(b);
jpayne@68 212 }
jpayne@68 213
jpayne@68 214 else if(a.equalsIgnoreCase("trackcounts")){
jpayne@68 215 trackCounts=Parse.parseBoolean(b);
jpayne@68 216 }else if(a.equalsIgnoreCase("printdepth") || a.equalsIgnoreCase("depth")){
jpayne@68 217 printDepth=Parse.parseBoolean(b);
jpayne@68 218 }else if(a.equalsIgnoreCase("printdepth2") || a.equalsIgnoreCase("depth2")){
jpayne@68 219 printDepth2=Parse.parseBoolean(b);
jpayne@68 220 }else if(a.equalsIgnoreCase("actualdepth") || a.equalsIgnoreCase("printactualdepth")){
jpayne@68 221 printActualDepth=Parse.parseBoolean(b);
jpayne@68 222 }else if(a.equalsIgnoreCase("printvolume") || a.equalsIgnoreCase("volume")){
jpayne@68 223 printVolume=Parse.parseBoolean(b);
jpayne@68 224 }else if(a.equalsIgnoreCase("printavgrefhits") || a.equalsIgnoreCase("printrefhits") || a.equalsIgnoreCase("avgrefhits") || a.equalsIgnoreCase("refhits")){
jpayne@68 225 printRefHits=Parse.parseBoolean(b);
jpayne@68 226 }
jpayne@68 227
jpayne@68 228 else if(a.equalsIgnoreCase("sortByDepth")){
jpayne@68 229 boolean x=Parse.parseBoolean(b);
jpayne@68 230 if(x){comparator=Comparison.depthComparator;}
jpayne@68 231 }else if(a.equalsIgnoreCase("sortByDepth2")){
jpayne@68 232 boolean x=Parse.parseBoolean(b);
jpayne@68 233 if(x){comparator=Comparison.depth2Comparator;}
jpayne@68 234 }else if(a.equalsIgnoreCase("sortByVolume")){
jpayne@68 235 boolean x=Parse.parseBoolean(b);
jpayne@68 236 if(x){comparator=Comparison.volumeComparator;}
jpayne@68 237 }else if(a.equalsIgnoreCase("sortByScore")){
jpayne@68 238 boolean x=Parse.parseBoolean(b);
jpayne@68 239 if(x){comparator=Comparison.scoreComparator;}
jpayne@68 240 }
jpayne@68 241 else if(a.equalsIgnoreCase("sortByKID")){
jpayne@68 242 boolean x=Parse.parseBoolean(b);
jpayne@68 243 if(x){comparator=Comparison.KIDComparator;}
jpayne@68 244 }else if(a.equalsIgnoreCase("sortByWKID") || a.equalsIgnoreCase("sortByANI")){
jpayne@68 245 boolean x=Parse.parseBoolean(b);
jpayne@68 246 if(x){comparator=Comparison.WKIDComparator;}
jpayne@68 247 }else if(a.equalsIgnoreCase("sortBySSU") || a.equalsIgnoreCase("sortBy16S")){
jpayne@68 248 boolean x=Parse.parseBoolean(b);
jpayne@68 249 if(x){comparator=Comparison.SSUComparator;}
jpayne@68 250 }else if(a.equalsIgnoreCase("sortByHits") || a.equalsIgnoreCase("sortByMatches")){
jpayne@68 251 boolean x=Parse.parseBoolean(b);
jpayne@68 252 if(x){comparator=Comparison.HitsComparator;}
jpayne@68 253 }
jpayne@68 254
jpayne@68 255 else if(a.equalsIgnoreCase("printUMatches") || a.equalsIgnoreCase("printUHits") || a.equalsIgnoreCase("printUnique")){
jpayne@68 256 printUnique=Parse.parseBoolean(b);
jpayne@68 257 }else if(a.equalsIgnoreCase("printUMatches2") || a.equalsIgnoreCase("printUnique2") || a.equalsIgnoreCase("unique2")){
jpayne@68 258 printUnique2=Parse.parseBoolean(b);
jpayne@68 259 }else if(a.equalsIgnoreCase("printUMatches3") || a.equalsIgnoreCase("printUnique3") || a.equalsIgnoreCase("unique3")){
jpayne@68 260 printUnique3=Parse.parseBoolean(b);
jpayne@68 261 }else if(a.equalsIgnoreCase("printUContam")){
jpayne@68 262 printUContam=Parse.parseBoolean(b);
jpayne@68 263 }else if(a.equalsIgnoreCase("printNoHit")){
jpayne@68 264 printNoHit=Parse.parseBoolean(b);
jpayne@68 265 }else if(a.equalsIgnoreCase("contamhits") || a.equalsIgnoreCase("contam") || a.equalsIgnoreCase("printcontam")){
jpayne@68 266 printContam=Parse.parseBoolean(b);
jpayne@68 267 }else if(a.equalsIgnoreCase("contamhits2") || a.equalsIgnoreCase("contam2") || a.equalsIgnoreCase("printcontam2")){
jpayne@68 268 if(b==null || b.length()<1){
jpayne@68 269 printContam2=true;
jpayne@68 270 }else if(Tools.isDigit(b.charAt(0)) || b.charAt(0)=='-'){
jpayne@68 271 contamLevel=Tools.max(0, TaxTree.levelToExtended(Integer.parseInt(b)));
jpayne@68 272 printContam2=true;
jpayne@68 273 }else if(TaxTree.levelMapExtendedContains(b)){
jpayne@68 274 contamLevel=TaxTree.stringToLevelExtended(b);
jpayne@68 275 printContam2=true;
jpayne@68 276 }else{
jpayne@68 277 printContam2=Parse.parseBoolean(b);
jpayne@68 278 }
jpayne@68 279 }else if(a.equalsIgnoreCase("contamLevel")){
jpayne@68 280 if(Tools.isDigit(b.charAt(0)) || b.charAt(0)=='-'){
jpayne@68 281 contamLevel=Tools.max(0, TaxTree.levelToExtended(Integer.parseInt(b)));
jpayne@68 282 printContam2=true;
jpayne@68 283 }else if(TaxTree.levelMapExtendedContains(b)){
jpayne@68 284 contamLevel=TaxTree.stringToLevelExtended(b);
jpayne@68 285 printContam2=true;
jpayne@68 286 }
jpayne@68 287 }
jpayne@68 288
jpayne@68 289 else if(a.equalsIgnoreCase("reportAniOnly") || a.equalsIgnoreCase("AniOnly")){
jpayne@68 290 reportAniOnly=Parse.parseBoolean(b);
jpayne@68 291 }
jpayne@68 292
jpayne@68 293 else if(a.equalsIgnoreCase("printMatches")){
jpayne@68 294 printMatches=Parse.parseBoolean(b);
jpayne@68 295 }else if(a.equalsIgnoreCase("printLength")){
jpayne@68 296 printLength=Parse.parseBoolean(b);
jpayne@68 297 }else if(a.equalsIgnoreCase("printTaxID")){
jpayne@68 298 printTaxID=Parse.parseBoolean(b);
jpayne@68 299 }else if(a.equalsIgnoreCase("printGSize")){
jpayne@68 300 printGSize=Parse.parseBoolean(b);
jpayne@68 301 }else if(a.equalsIgnoreCase("gSizeKMG")){
jpayne@68 302 gSizeKMG=Parse.parseBoolean(b);
jpayne@68 303 }else if(a.equalsIgnoreCase("printGC")){
jpayne@68 304 printGC=Parse.parseBoolean(b);
jpayne@68 305 }else if(a.equalsIgnoreCase("printGKmers")){
jpayne@68 306 printGKmers=Parse.parseBoolean(b);
jpayne@68 307 }else if(a.equalsIgnoreCase("printCommonAncestor") || a.equalsIgnoreCase("printCA")){
jpayne@68 308 printCommonAncestor=Parse.parseBoolean(b);
jpayne@68 309 }else if(a.equalsIgnoreCase("printCommonAncestorLevel") || a.equalsIgnoreCase("printCAL")){
jpayne@68 310 printCommonAncestorLevel=Parse.parseBoolean(b);
jpayne@68 311 }else if(a.equalsIgnoreCase("printTaxName")){
jpayne@68 312 printTaxName=Parse.parseBoolean(b);
jpayne@68 313 }else if(a.equalsIgnoreCase("printGSeqs")){
jpayne@68 314 printGSeqs=Parse.parseBoolean(b);
jpayne@68 315 }else if(a.equalsIgnoreCase("printGBases")){
jpayne@68 316 printGBases=Parse.parseBoolean(b);
jpayne@68 317 }
jpayne@68 318
jpayne@68 319 else if(a.equalsIgnoreCase("minEntropy") || a.equalsIgnoreCase("entropy") || a.equalsIgnoreCase("efilter")){
jpayne@68 320 minEntropy=Float.parseFloat(b);
jpayne@68 321 }else if(a.equalsIgnoreCase("minprob") || a.equalsIgnoreCase("pfilter")){
jpayne@68 322 minProb=(float)Double.parseDouble(b);
jpayne@68 323 }else if(a.equalsIgnoreCase("minQual") || a.equalsIgnoreCase("minq")){
jpayne@68 324 minQual=Byte.parseByte(b);
jpayne@68 325 }
jpayne@68 326
jpayne@68 327 else if(a.equalsIgnoreCase("printColors") || a.equalsIgnoreCase("colors") || a.equalsIgnoreCase("color")){
jpayne@68 328 // System.err.println("Parsing '"+arg+"'"); //123
jpayne@68 329 if(b==null || b.length()<1){
jpayne@68 330 printColors=true;
jpayne@68 331 }else if(b.equalsIgnoreCase("t") || b.equalsIgnoreCase("true")){
jpayne@68 332 printColors=true;
jpayne@68 333 }else if(b.equalsIgnoreCase("f") || b.equalsIgnoreCase("false")){
jpayne@68 334 printColors=false;
jpayne@68 335 }else{
jpayne@68 336 printColors=true;
jpayne@68 337 if(Tools.isDigit(b.charAt(0)) || b.charAt(0)=='-'){
jpayne@68 338 colorLevel=Tools.max(0, TaxTree.levelToExtended(Integer.parseInt(b)));
jpayne@68 339 }else{
jpayne@68 340 colorLevel=TaxTree.stringToLevelExtended(b);
jpayne@68 341 }
jpayne@68 342 }
jpayne@68 343 setColors=true;
jpayne@68 344 // System.err.println("Parsed "+arg); //123
jpayne@68 345 }else if(a.equalsIgnoreCase("colorLevel")){
jpayne@68 346 // System.err.println("Parsing '"+arg+"'"); //123
jpayne@68 347 if(Tools.isDigit(b.charAt(0)) || b.charAt(0)=='-'){
jpayne@68 348 colorLevel=Tools.max(0, TaxTree.levelToExtended(Integer.parseInt(b)));
jpayne@68 349 }else{
jpayne@68 350 colorLevel=TaxTree.stringToLevelExtended(b);
jpayne@68 351 }
jpayne@68 352 // System.err.println("Parsed "+arg); //123
jpayne@68 353 }
jpayne@68 354
jpayne@68 355 else if(a.equalsIgnoreCase("printRefDivisor") || a.equalsIgnoreCase("printRDiv")){
jpayne@68 356 printRefDivisor=Parse.parseBoolean(b);
jpayne@68 357 }else if(a.equalsIgnoreCase("printQueryDivisor") || a.equalsIgnoreCase("printQDiv")){
jpayne@68 358 printQueryDivisor=Parse.parseBoolean(b);
jpayne@68 359 }else if(a.equalsIgnoreCase("printRefSize") || a.equalsIgnoreCase("printRSize")){
jpayne@68 360 printRefSize=Parse.parseBoolean(b);
jpayne@68 361 }else if(a.equalsIgnoreCase("printQuerySize") || a.equalsIgnoreCase("printQSize")){
jpayne@68 362 printQuerySize=Parse.parseBoolean(b);
jpayne@68 363 }else if(a.equalsIgnoreCase("printContamHits") || a.equalsIgnoreCase("printCHits")){
jpayne@68 364 printContamHits=Parse.parseBoolean(b);
jpayne@68 365 }
jpayne@68 366
jpayne@68 367 else if(a.equalsIgnoreCase("printIntersection") || a.equalsIgnoreCase("intersection") || a.equalsIgnoreCase("intersect")){
jpayne@68 368 printIntersection=Parse.parseBoolean(b);
jpayne@68 369 }else if(a.equalsIgnoreCase("mergePairs") || a.equalsIgnoreCase("merge")){
jpayne@68 370 mergePairs=Parse.parseBoolean(b);
jpayne@68 371 }
jpayne@68 372
jpayne@68 373 else if(a.equalsIgnoreCase("printAll")){
jpayne@68 374 if(Parse.parseBoolean(b)){
jpayne@68 375 setPrintAll();
jpayne@68 376 }
jpayne@68 377 }
jpayne@68 378
jpayne@68 379 else if(a.equals("samplerate")){
jpayne@68 380 samplerate=Float.parseFloat(b);
jpayne@68 381 }else if(a.equals("reads")){
jpayne@68 382 maxReads=Parse.parseKMG(b);
jpayne@68 383 }else if(a.equals("mode") || a.equalsIgnoreCase("single") || a.equalsIgnoreCase("singlesketch") || a.equalsIgnoreCase("onesketch")
jpayne@68 384 || a.equalsIgnoreCase("persequence") || a.equalsIgnoreCase("sequence") || a.equalsIgnoreCase("pertaxa")
jpayne@68 385 || a.equalsIgnoreCase("perheader") || a.equalsIgnoreCase("perfile")){
jpayne@68 386 mode=SketchObject.parseMode(arg, a, b);
jpayne@68 387 }
jpayne@68 388
jpayne@68 389 //For format 3
jpayne@68 390 else if(a.equalsIgnoreCase("useTaxidName") || a.equalsIgnoreCase("useTaxidAsName")){
jpayne@68 391 useTaxidName=Parse.parseBoolean(b);
jpayne@68 392 }else if(a.equalsIgnoreCase("useImgName") || a.equalsIgnoreCase("useImgAsName")){
jpayne@68 393 useImgName=Parse.parseBoolean(b);
jpayne@68 394 }else if(a.equalsIgnoreCase("useTaxName") || a.equalsIgnoreCase("useTaxAsName")){
jpayne@68 395 useTaxName=Parse.parseBoolean(b);
jpayne@68 396 }else if(a.equalsIgnoreCase("useFilePrefixName") || a.equalsIgnoreCase("useFilePrefixAsName")){
jpayne@68 397 useFilePrefixName=Parse.parseBoolean(b);
jpayne@68 398 }
jpayne@68 399
jpayne@68 400 else if(a.equalsIgnoreCase("taxfilterincludelevel") || a.equalsIgnoreCase("includelevel")
jpayne@68 401 || a.equalsIgnoreCase("taxlevelwhite") || a.equalsIgnoreCase("ilevel") || a.equalsIgnoreCase("whitelevel")){
jpayne@68 402 taxLevelWhite=TaxTree.parseLevel(b);//TODO: Change to extended
jpayne@68 403 }else if(a.equalsIgnoreCase("taxfilterinclude") || a.equalsIgnoreCase("include") || a.equalsIgnoreCase("taxfilterwhitelist")){
jpayne@68 404 taxFilterWhiteList=b;
jpayne@68 405 }else if(a.equalsIgnoreCase("taxfilterincludestring") || a.equalsIgnoreCase("includestring")
jpayne@68 406 || a.equalsIgnoreCase("taxfilterwhitestring") || a.equalsIgnoreCase("istring")){
jpayne@68 407 taxFilterWhiteString=b;
jpayne@68 408 }else if(a.equalsIgnoreCase("banUnclassified") || a.equalsIgnoreCase("noUnclassified")){
jpayne@68 409 banUnclassified=Parse.parseBoolean(b);
jpayne@68 410 }else if(a.equalsIgnoreCase("banVirus") || a.equalsIgnoreCase("noVirus") || a.equalsIgnoreCase("banViruses") || a.equalsIgnoreCase("noViruses")){
jpayne@68 411 banVirus=Parse.parseBoolean(b);
jpayne@68 412 }
jpayne@68 413
jpayne@68 414 else if(a.equalsIgnoreCase("taxfilterexcludelevel") || a.equalsIgnoreCase("excludelevel")
jpayne@68 415 || a.equalsIgnoreCase("taxlevelblack") || a.equalsIgnoreCase("elevel") || a.equalsIgnoreCase("blacklevel")){
jpayne@68 416 taxLevelBlack=TaxTree.parseLevel(b);//TODO: Change to extended
jpayne@68 417 }else if(a.equalsIgnoreCase("taxfilterexclude") || a.equalsIgnoreCase("exclude") || a.equalsIgnoreCase("taxfilterblacklist")){
jpayne@68 418 taxFilterBlackList=b;
jpayne@68 419 }else if(a.equalsIgnoreCase("taxfilterexcludestring") || a.equalsIgnoreCase("excludestring")
jpayne@68 420 || a.equalsIgnoreCase("taxfilterblackstring") || a.equalsIgnoreCase("estring")){
jpayne@68 421 taxFilterBlackString=b;
jpayne@68 422 }
jpayne@68 423
jpayne@68 424 else if(a.equalsIgnoreCase("minkmercount") || a.equalsIgnoreCase("minkeycount") || a.equalsIgnoreCase("mincount") || a.equalsIgnoreCase("minKeyOccuranceCount")){
jpayne@68 425 minKeyOccuranceCount=Tools.max(1, Integer.parseInt(b));
jpayne@68 426 }
jpayne@68 427
jpayne@68 428 //TODO: Eventually remove support for "amino" and "k" and just support "hamino" and "hk"
jpayne@68 429 //This stands for "header amino" and "header k".
jpayne@68 430
jpayne@68 431 //Parameters for compatibility verification
jpayne@68 432 else if(a.equalsIgnoreCase("k") || a.equalsIgnoreCase("hk")){
jpayne@68 433 // System.err.println("A: k="+k+", k2="+k2+", arg="+arg);
jpayne@68 434 if(b.indexOf(',')>=0){
jpayne@68 435 String[] split=b.split(",");
jpayne@68 436 assert(split.length==2) : "\nBad argument "+arg+"\n"+b+"\n";
jpayne@68 437 int x=Integer.parseInt(split[0]);
jpayne@68 438 int y=Integer.parseInt(split[1]);
jpayne@68 439 k=Tools.max(x, y);
jpayne@68 440 k2=Tools.min(x, y);
jpayne@68 441 if(k==k2){k2=0;}
jpayne@68 442 // System.err.println("B: k="+k+", k2="+k2+", split="+Arrays.toString(split));
jpayne@68 443 }else{
jpayne@68 444 k=Integer.parseInt(b);
jpayne@68 445 // System.err.println("C: k="+k+", k2="+k2);
jpayne@68 446 }
jpayne@68 447 }else if(a.equalsIgnoreCase("hashversion") || a.equalsIgnoreCase("hv")){
jpayne@68 448 hashVersion=Integer.parseInt(b);
jpayne@68 449 }else if(a.equalsIgnoreCase("amino") || a.equalsIgnoreCase("hamino")){
jpayne@68 450 amino=Parse.parseBoolean(b);
jpayne@68 451 if(amino){translate=false;}
jpayne@68 452 }else if(a.equalsIgnoreCase("translate")){
jpayne@68 453 translate=Parse.parseBoolean(b);
jpayne@68 454 if(translate){amino=false;}
jpayne@68 455 }else if(a.equalsIgnoreCase("sixframes")){
jpayne@68 456 sixframes=Parse.parseBoolean(b);
jpayne@68 457 if(sixframes){amino=false; translate=true;}
jpayne@68 458 }
jpayne@68 459
jpayne@68 460 else if(a.equalsIgnoreCase("requiredmeta") || a.equalsIgnoreCase("rmeta")){
jpayne@68 461 if(b==null){requiredMeta=null;}
jpayne@68 462 else{
jpayne@68 463 String[] split2=b.split(",");
jpayne@68 464 requiredMeta=new ArrayList<String>(split2.length);
jpayne@68 465 for(String mt : split2){
jpayne@68 466 assert(mt.indexOf(':')>=0) : "Metadata tags must contain ':' symbol: "+mt;
jpayne@68 467 requiredMeta.add(mt);
jpayne@68 468 }
jpayne@68 469 }
jpayne@68 470 }else if(a.equalsIgnoreCase("bannedmeta") || a.equalsIgnoreCase("bmeta")){
jpayne@68 471 if(b==null){bannedMeta=null;}
jpayne@68 472 else{
jpayne@68 473 String[] split2=b.split(",");
jpayne@68 474 bannedMeta=new ArrayList<String>(split2.length);
jpayne@68 475 for(String mt : split2){
jpayne@68 476 assert(mt.indexOf(':')>=0) : "Metadata tags must contain ':' symbol: "+mt;
jpayne@68 477 bannedMeta.add(mt);
jpayne@68 478 }
jpayne@68 479 }
jpayne@68 480 }
jpayne@68 481
jpayne@68 482 // else if(a.equalsIgnoreCase("requiredtaxid") || a.equalsIgnoreCase("rtaxid")){
jpayne@68 483 // if(b==null){requiredTaxid=null;}
jpayne@68 484 // else{
jpayne@68 485 // String[] split2=b.split(",");
jpayne@68 486 // requiredTaxid=new IntList(split2.length);
jpayne@68 487 // for(String mt : split2){
jpayne@68 488 // requiredTaxid.add(Integer.parseInt(mt));
jpayne@68 489 // }
jpayne@68 490 // if(requiredTaxid.isEmpty()){requiredTaxid=null;}
jpayne@68 491 // }
jpayne@68 492 // }else if(a.equalsIgnoreCase("bannedtaxid") || a.equalsIgnoreCase("btaxid")){
jpayne@68 493 // if(b==null){bannedTaxid=null;}
jpayne@68 494 // else{
jpayne@68 495 // String[] split2=b.split(",");
jpayne@68 496 // bannedTaxid=new IntList(split2.length);
jpayne@68 497 // for(String mt : split2){
jpayne@68 498 // bannedTaxid.add(Integer.parseInt(mt));
jpayne@68 499 // }
jpayne@68 500 // if(bannedTaxid.isEmpty()){bannedTaxid=null;}
jpayne@68 501 // }
jpayne@68 502 // }
jpayne@68 503
jpayne@68 504 else if(a.equalsIgnoreCase("requiredmetaand") || a.equalsIgnoreCase("rmetaand")){
jpayne@68 505 requiredMetaAnd=Parse.parseBoolean(b);
jpayne@68 506 }else if(a.equalsIgnoreCase("requiredmetaor") || a.equalsIgnoreCase("rmetaor")){
jpayne@68 507 requiredMetaAnd=!Parse.parseBoolean(b);
jpayne@68 508 }
jpayne@68 509
jpayne@68 510 else if(a.equalsIgnoreCase("bbversion")){
jpayne@68 511 inputVersion=b;
jpayne@68 512 }
jpayne@68 513
jpayne@68 514 else{
jpayne@68 515 return false;
jpayne@68 516 }
jpayne@68 517 return true;
jpayne@68 518 }
jpayne@68 519
jpayne@68 520 public void postParse(boolean requireTree, boolean makeTaxFilters){
jpayne@68 521 assert(!postParsed);
jpayne@68 522 synchronized(this){
jpayne@68 523 if(postParsed){return;}
jpayne@68 524
jpayne@68 525 if(makeTaxFilters){
jpayne@68 526 if(taxFilterWhiteList!=null || taxFilterWhiteString!=null){
jpayne@68 527 taxFilterWhite=new TaxFilter(SketchObject.taxtree, true);
jpayne@68 528 taxFilterWhite.setLevel(taxLevelWhite, false);
jpayne@68 529 taxFilterWhite.makeSet();
jpayne@68 530 taxFilterWhite.addNamesOrNumbers(taxFilterWhiteList, false);
jpayne@68 531 taxFilterWhite.setContainsString(taxFilterWhiteString);
jpayne@68 532 if(requireTree){
jpayne@68 533 assert(SketchObject.taxtree!=null) : "No taxtree loaded.";
jpayne@68 534 taxFilterWhite.setTree(SketchObject.taxtree);
jpayne@68 535 taxFilterWhite.promote();
jpayne@68 536 }
jpayne@68 537 }
jpayne@68 538
jpayne@68 539 if(taxFilterBlackList!=null || taxFilterBlackString!=null){
jpayne@68 540 taxFilterBlack=new TaxFilter(SketchObject.taxtree, false);
jpayne@68 541 taxFilterBlack.setLevel(taxLevelBlack, false);
jpayne@68 542 taxFilterBlack.makeSet();
jpayne@68 543 taxFilterBlack.addNamesOrNumbers(taxFilterBlackList, false);
jpayne@68 544 taxFilterBlack.setContainsString(taxFilterBlackString);
jpayne@68 545 if(requireTree){
jpayne@68 546 assert(SketchObject.taxtree!=null) : "No taxtree loaded.";
jpayne@68 547 taxFilterBlack.setTree(SketchObject.taxtree);
jpayne@68 548 taxFilterBlack.promote();
jpayne@68 549 }
jpayne@68 550 }
jpayne@68 551 }
jpayne@68 552
jpayne@68 553 noFilters=(!hasMetaFilters() && !hasTaxFilters() && !requireSSU && minRefSizeEstimate<1 && minRefSizeBases<1);
jpayne@68 554 postParsed=true;
jpayne@68 555 }
jpayne@68 556 }
jpayne@68 557
jpayne@68 558 public boolean postParsed(){return postParsed;}
jpayne@68 559
jpayne@68 560 @Override
jpayne@68 561 public String toString(){
jpayne@68 562 return toString(-1);
jpayne@68 563 }
jpayne@68 564
jpayne@68 565 public String toString(int chunkNum){
jpayne@68 566 StringBuilder sb=new StringBuilder();
jpayne@68 567 sb.append("##");
jpayne@68 568 sb.append("hits=").append(minHits);
jpayne@68 569 if(chunkNum>=0){sb.append(" chunk=").append(chunkNum);}
jpayne@68 570 sb.append(" wkid=").append(String.format(Locale.ROOT, "%.5f",minWKID));
jpayne@68 571 if(minANI>0){sb.append(" id=").append(String.format(Locale.ROOT, "%.5f",minANI));}
jpayne@68 572 if(minBases>0){sb.append(" minbases=").append(minBases);}
jpayne@68 573 if(minSizeRatio>0){sb.append(" minsizeratio=").append(String.format(Locale.ROOT, "%.5f",minSizeRatio));}
jpayne@68 574 sb.append(" records=").append(maxRecords);
jpayne@68 575 if(recordsPerLevel>0){sb.append(" recordsperlevel=").append(recordsPerLevel);}
jpayne@68 576 sb.append(" format=").append(format);
jpayne@68 577 sb.append(" level=").append(taxLevel);
jpayne@68 578 if(inputVersion!=null){sb.append(" bbversion=").append(inputVersion);}
jpayne@68 579
jpayne@68 580 if(k!=SketchObject.defaultK || k2!=0 || k!=SketchObject.k || k2!=SketchObject.k2){
jpayne@68 581 assert(k>0 && k2>=0 && k2<k) : "Bad values for k: "+k+", "+k2+", "+SketchObject.k+", "+SketchObject.k2;
jpayne@68 582 assert(SketchObject.k>0 && SketchObject.k2>=0 && SketchObject.k2<SketchObject.k) : "Bad values for k: "+k+", "+k2+", "+SketchObject.k+", "+SketchObject.k2;
jpayne@68 583 sb.append(" hk=").append(SketchObject.k).append(',').append(SketchObject.k2);
jpayne@68 584 }
jpayne@68 585 if(SketchObject.amino){sb.append(" hamino=").append(SketchObject.amino);} //TODO: This conflicts with Parser flag
jpayne@68 586 if(SketchObject.translate){sb.append(" translate=").append(SketchObject.translate);}
jpayne@68 587 if(SketchObject.sixframes){sb.append(" sixframes=").append(SketchObject.sixframes);}
jpayne@68 588 if(SketchObject.HASH_VERSION>1){sb.append(" hashversion=").append(SketchObject.HASH_VERSION);}
jpayne@68 589
jpayne@68 590 if(true){sb.append(" printSSU=").append(printSSU());}
jpayne@68 591 if(requireSSU){sb.append(" requireSSU=").append(requireSSU);}
jpayne@68 592 if(minRefSizeEstimate>0){sb.append(" minRefSizeEstimate=").append(minRefSizeEstimate);}
jpayne@68 593 if(minRefSizeBases>0){sb.append(" minRefSizeBases=").append(minRefSizeBases);}
jpayne@68 594
jpayne@68 595 if(json()){sb.append(" printSSUSequence=").append(printSSUSequence);}
jpayne@68 596 if(printSSULen){sb.append(" printSSULen=").append(printSSULen);}
jpayne@68 597 if(true || printTax!=default_printTax){sb.append(" printTax=").append(printTax);}
jpayne@68 598 // if(true || printFileName!=default_printFileName){sb.append(" printfname=").append(printFileName);}
jpayne@68 599 if(true || printQueryFileName!=default_printQueryFileName){sb.append(" printqfname=").append(printQueryFileName);}
jpayne@68 600 if(true || printRefFileName!=default_printRefFileName){sb.append(" printrfname=").append(printRefFileName);}
jpayne@68 601 if(true || printOriginalName!=default_printOriginalName){sb.append(" pn0=").append(printOriginalName);}
jpayne@68 602 if(true || printImg!=default_printImg){sb.append(" printImg=").append(printImg);}
jpayne@68 603 if(true || printAni!=default_printAni){sb.append(" printAni=").append(printAni);}
jpayne@68 604 if(!printKID){sb.append(" printKID=").append(printKID);}
jpayne@68 605 if(!printWKID){sb.append(" printWKID=").append(printWKID);}
jpayne@68 606 if(true || printCompleteness!=default_printCompleteness){sb.append(" printCompleteness=").append(printCompleteness);}
jpayne@68 607
jpayne@68 608 if(true || printUnique!=default_printUnique){sb.append(" printUMatches=").append(printUnique);}
jpayne@68 609 if(true || printUnique2!=default_printUnique2){sb.append(" printUnique2=").append(printUnique2);}
jpayne@68 610 if(true || printUnique3!=default_printUnique3){sb.append(" printUnique3=").append(printUnique3);}
jpayne@68 611 if(true || printUContam!=default_printUContam){sb.append(" printUContam=").append(printUContam);}
jpayne@68 612 if(true || printNoHit!=default_printNoHit){sb.append(" printNoHit=").append(printNoHit);}
jpayne@68 613 if(true || printContam!=default_printContam){sb.append(" contam=").append(printContam);}
jpayne@68 614 if(true){sb.append(" contam2=").append(printContam2 ? TaxTree.extendedToLevel(contamLevel)+"" : "f");}
jpayne@68 615
jpayne@68 616 if(true || printScore!=default_printScore){sb.append(" printScore=").append(printScore);}
jpayne@68 617 if(true || printEValue!=default_printEValue){sb.append(" printEValue=").append(printEValue);}
jpayne@68 618
jpayne@68 619 if(true || printDepth!=default_printDepth){sb.append(" printDepth=").append(printDepth);}
jpayne@68 620 if(true || printDepth2!=default_printDepth2){sb.append(" printDepth2=").append(printDepth2);}
jpayne@68 621 if(true || printActualDepth!=default_printActualDepth){sb.append(" printActualDepth=").append(printActualDepth);}
jpayne@68 622 if(true || printVolume!=default_printVolume){sb.append(" printVolume=").append(printVolume);}
jpayne@68 623 if(true || printRefHits!=default_printRefHits){sb.append(" printRefHits=").append(printRefHits);}
jpayne@68 624
jpayne@68 625 if(true || printMatches!=default_printMatches){sb.append(" printMatches=").append(printMatches);}
jpayne@68 626 if(true || printLength!=default_printLength){sb.append(" printLength=").append(printLength);}
jpayne@68 627 if(true || printTaxID!=default_printTaxID){sb.append(" printTaxID=").append(printTaxID);}
jpayne@68 628 if(true || printGSize!=default_printGSize){sb.append(" printGSize=").append(printGSize);}
jpayne@68 629 if(true || gSizeKMG!=default_gSizeKMG){sb.append(" gSizeKMG=").append(gSizeKMG);}
jpayne@68 630 if(true || printGC!=default_printGC){sb.append(" printGC=").append(printGC);}
jpayne@68 631 if(true || printGKmers!=default_printGKmers){sb.append(" printGKmers=").append(printGKmers);}
jpayne@68 632
jpayne@68 633 if(printCommonAncestor){sb.append(" printCommonAncestor=").append(printCommonAncestor);}
jpayne@68 634 if(printCommonAncestorLevel){sb.append(" printCommonAncestorLevel=").append(printCommonAncestorLevel);}
jpayne@68 635
jpayne@68 636 if(true || printTaxName!=default_printTaxName){sb.append(" printTaxName=").append(printTaxName);}
jpayne@68 637 if(true || printGSeqs!=default_printGSeqs){sb.append(" printGSeqs=").append(printGSeqs);}
jpayne@68 638 if(true || printGBases!=default_printGBases){sb.append(" printGBases=").append(printGBases);}
jpayne@68 639 if(true || minEntropy!=default_minEntropy){sb.append(" minEntropy=").append(String.format(Locale.ROOT, "%.4f", minEntropy));}
jpayne@68 640 if(true || minProb!=default_minProb){sb.append(" minProb=").append(String.format(Locale.ROOT, "%.4f", minProb));}
jpayne@68 641 if(true || minQual!=default_minQual){sb.append(" minQual=").append((int)minQual);}
jpayne@68 642 if(jsonArray!=default_jsonArray){sb.append(" jsonArray=").append(jsonArray);}
jpayne@68 643 if(printD3!=default_printD3){sb.append(" d3=").append(printD3);}
jpayne@68 644 if(printD3){
jpayne@68 645 sb.append(" D3sizeMode=").append(D3sizeMode);
jpayne@68 646 sb.append(" D3LevelNodes=").append(D3LevelNodes);
jpayne@68 647 }
jpayne@68 648 if(comparator!=Comparison.scoreComparator){sb.append(" ").append(comparator.toString());}
jpayne@68 649
jpayne@68 650 if(taxFilterWhiteList!=null || taxFilterWhiteString!=null){
jpayne@68 651 if(taxFilterWhiteList!=null){sb.append(" taxfilterwhitelist=").append(taxFilterWhiteList);}
jpayne@68 652 if(taxFilterWhiteString!=null){sb.append(" taxfilterwhitestring=").append(taxFilterWhiteString);}
jpayne@68 653 sb.append(" taxlevelwhite=").append(taxLevelWhite);
jpayne@68 654 }
jpayne@68 655 if(taxFilterBlackList!=null || taxFilterBlackString!=null){
jpayne@68 656 if(taxFilterBlackList!=null){sb.append(" taxfilterblacklist=").append(taxFilterBlackList);}
jpayne@68 657 if(taxFilterBlackString!=null){sb.append(" taxfilterblackstring=").append(taxFilterBlackString);}
jpayne@68 658 sb.append(" taxlevelblack=").append(taxLevelBlack);
jpayne@68 659 }
jpayne@68 660 if(banUnclassified){sb.append(" banunclassified");}
jpayne@68 661 if(banVirus){sb.append(" banvirus");}
jpayne@68 662
jpayne@68 663 if(useTaxidName){sb.append(" useTaxidName=").append(useTaxidName);}
jpayne@68 664 if(useImgName){sb.append(" useImgName=").append(useImgName);}
jpayne@68 665 if(useTaxName){sb.append(" useTaxName=").append(useTaxName);}
jpayne@68 666
jpayne@68 667 if(true){sb.append(" colors=").append(printColors ? TaxTree.extendedToLevel(colorLevel)+"" : "f");}
jpayne@68 668
jpayne@68 669 if(minKeyOccuranceCount!=default_minKeyOccuranceCount){sb.append(" minKeyOccuranceCount=").append(minKeyOccuranceCount);}
jpayne@68 670
jpayne@68 671 // if(printColors && colorLevel!=default_colorLevel){sb.append(" colorLevel=").append(TaxTree.extendedToLevel(colorLevel));}
jpayne@68 672
jpayne@68 673
jpayne@68 674 if(printRefDivisor){sb.append(" printRefDivisor=").append(printRefDivisor);}
jpayne@68 675 if(printQueryDivisor){sb.append(" printQueryDivisor=").append(printQueryDivisor);}
jpayne@68 676 if(printRefSize){sb.append(" printRefSize=").append(printRefSize);}
jpayne@68 677 if(printQuerySize){sb.append(" printQuerySize=").append(printQuerySize);}
jpayne@68 678 if(printContamHits){sb.append(" printContamHits=").append(printContamHits);}
jpayne@68 679 if(printIntersection){sb.append(" printIntersection=").append(printIntersection);}
jpayne@68 680 if(mergePairs){sb.append(" mergePairs=").append(mergePairs);}
jpayne@68 681
jpayne@68 682 if(maxReads>-1){sb.append(" reads=").append(maxReads);}
jpayne@68 683 if(mode!=default_mode){sb.append(" mode=").append(mode);}
jpayne@68 684 if(samplerate!=default_samplerate){sb.append(" samplerate=").append(String.format(Locale.ROOT, "%.4f",samplerate));}
jpayne@68 685
jpayne@68 686 if(!requiredMetaAnd){sb.append(" requiredmetaand="+requiredMetaAnd);}
jpayne@68 687 if(requiredMeta!=null && !requiredMeta.isEmpty()){
jpayne@68 688 sb.append(" rmeta=");
jpayne@68 689 for(String s : requiredMeta){
jpayne@68 690 sb.append(s);
jpayne@68 691 sb.append(',');
jpayne@68 692 }
jpayne@68 693 sb.setLength(sb.length()-1);
jpayne@68 694 }
jpayne@68 695 if(bannedMeta!=null && !bannedMeta.isEmpty()){
jpayne@68 696 sb.append(" bmeta=");
jpayne@68 697 for(String s : bannedMeta){
jpayne@68 698 sb.append(s);
jpayne@68 699 sb.append(',');
jpayne@68 700 }
jpayne@68 701 sb.setLength(sb.length()-1);
jpayne@68 702 }
jpayne@68 703 // if(requiredTaxid!=null && !requiredTaxid.isEmpty()){
jpayne@68 704 // sb.append(" rtaxid=");
jpayne@68 705 // for(int i=0; i<requiredTaxid.size; i++){
jpayne@68 706 // sb.append(requiredTaxid.get(i));
jpayne@68 707 // sb.append(',');
jpayne@68 708 // }
jpayne@68 709 // sb.setLength(sb.length()-1);
jpayne@68 710 // }
jpayne@68 711 // if(bannedTaxid!=null && !bannedTaxid.isEmpty()){
jpayne@68 712 // sb.append(" btaxid=");
jpayne@68 713 // for(int i=0; i<bannedTaxid.size; i++){
jpayne@68 714 // sb.append(bannedTaxid.get(i));
jpayne@68 715 // sb.append(',');
jpayne@68 716 // }
jpayne@68 717 // sb.setLength(sb.length()-1);
jpayne@68 718 // }
jpayne@68 719
jpayne@68 720 sb.append('\n');
jpayne@68 721 return sb.toString();
jpayne@68 722 }
jpayne@68 723
jpayne@68 724 public boolean compatible(){
jpayne@68 725 return SketchObject.k==k && SketchObject.k2==k2 && SketchObject.aminoOrTranslate()==aminoOrTranslate() && hashVersion==SketchObject.HASH_VERSION;
jpayne@68 726 }
jpayne@68 727
jpayne@68 728 public void setPrintAll(){
jpayne@68 729 printSSU=true;
jpayne@68 730 printSSULen=true;
jpayne@68 731 printSSUSequence=true;
jpayne@68 732 printTax=true;
jpayne@68 733 printQueryFileName=true;
jpayne@68 734 printRefFileName=true;
jpayne@68 735 printOriginalName=true;
jpayne@68 736 printImg=true;
jpayne@68 737 printAni=true;
jpayne@68 738 printKID=true;
jpayne@68 739 printWKID=true;
jpayne@68 740 printCompleteness=true;
jpayne@68 741 printScore=true;
jpayne@68 742 printEValue=true;
jpayne@68 743 printDepth=true;
jpayne@68 744 printDepth2=true;
jpayne@68 745 printVolume=true;
jpayne@68 746 printRefHits=true;
jpayne@68 747
jpayne@68 748 printMatches=true;
jpayne@68 749 printLength=true;
jpayne@68 750 printTaxID=true;
jpayne@68 751 printGSize=true;
jpayne@68 752 printGC=true;
jpayne@68 753 printGKmers=true;
jpayne@68 754 printTaxName=true;
jpayne@68 755 printGSeqs=true;
jpayne@68 756 printGBases=true;
jpayne@68 757
jpayne@68 758 // printColors=true;
jpayne@68 759
jpayne@68 760 printUnique=true;
jpayne@68 761 printUnique2=true;
jpayne@68 762 printUnique3=true;
jpayne@68 763 printUContam=true;
jpayne@68 764 printNoHit=true;
jpayne@68 765 printContam=true;
jpayne@68 766 printContam2=true;
jpayne@68 767
jpayne@68 768 printRefDivisor=true;
jpayne@68 769 printQueryDivisor=true;
jpayne@68 770 printRefSize=true;
jpayne@68 771 printQuerySize=true;
jpayne@68 772 printContamHits=true;
jpayne@68 773 }
jpayne@68 774
jpayne@68 775 /*--------------------------------------------------------------*/
jpayne@68 776 /*---------------- JSON ----------------*/
jpayne@68 777 /*--------------------------------------------------------------*/
jpayne@68 778
jpayne@68 779 public JsonObject toJson(SketchResults sr){
jpayne@68 780 JsonObject j=toJson(sr.sketch);
jpayne@68 781 if(sr.list!=null){
jpayne@68 782 int i=0;
jpayne@68 783 for(Comparison c : sr.list){
jpayne@68 784 JsonObject jc=toJson(c);
jpayne@68 785 j.add(c.name(), jc);
jpayne@68 786 i++;
jpayne@68 787 if(i>=maxRecords){break;}
jpayne@68 788 }
jpayne@68 789 }
jpayne@68 790
jpayne@68 791 if(jsonArray){
jpayne@68 792 toJsonArrayForm(j);
jpayne@68 793 }
jpayne@68 794
jpayne@68 795 if(printD3){
jpayne@68 796 j.add("D3", toD3(sr));
jpayne@68 797 }
jpayne@68 798
jpayne@68 799 return j;
jpayne@68 800 }
jpayne@68 801
jpayne@68 802 public void toJsonArrayForm(JsonObject j0){
jpayne@68 803 if(j0.jmapSize()<1){return;}
jpayne@68 804 ArrayList<Object> list1=new ArrayList<Object>(j0.jmapSize());
jpayne@68 805 Object[] keys=null;
jpayne@68 806 for(Entry<String, JsonObject> e1 : j0.jmap.entrySet()){
jpayne@68 807 JsonObject j1=e1.getValue();
jpayne@68 808 ArrayList<Object> list2=new ArrayList<Object>(j1.omapSize());
jpayne@68 809 for(Entry<String, Object> e2 : j1.omap.entrySet()){
jpayne@68 810 Object o2=e2.getValue();
jpayne@68 811 list2.add(o2);
jpayne@68 812 }
jpayne@68 813 list1.add(list2.toArray());
jpayne@68 814 if(keys==null){
jpayne@68 815 ArrayList<Object> keyList=new ArrayList<Object>(j1.omapSize());
jpayne@68 816 for(Entry<String, Object> e2 : j1.omap.entrySet()){
jpayne@68 817 Object o2=e2.getKey();
jpayne@68 818 keyList.add(o2);
jpayne@68 819 }
jpayne@68 820 keys=keyList.toArray();
jpayne@68 821 }
jpayne@68 822 }
jpayne@68 823
jpayne@68 824 JsonObject title=new JsonObject();
jpayne@68 825 for(Entry<String, Object> e : j0.omap.entrySet()){
jpayne@68 826 title.add(e.getKey(), e.getValue());
jpayne@68 827 }
jpayne@68 828
jpayne@68 829 j0.clearJson();
jpayne@68 830 j0.clearOmap();
jpayne@68 831
jpayne@68 832 j0.add("title", title);
jpayne@68 833 j0.add("header", keys);
jpayne@68 834 j0.add("rows", list1.toArray());
jpayne@68 835 }
jpayne@68 836
jpayne@68 837 public JsonObject toJson(Sketch sk){
jpayne@68 838 assert(format==FORMAT_JSON);
jpayne@68 839
jpayne@68 840 JsonObject j=new JsonObject();
jpayne@68 841 j.add("Name", sk.name());
jpayne@68 842 if(dbName!=null){j.add("DB", dbName);}
jpayne@68 843 j.add("SketchLen", sk.length());
jpayne@68 844
jpayne@68 845 j.add("Seqs", sk.genomeSequences);
jpayne@68 846 j.add("Bases", sk.genomeSizeBases);
jpayne@68 847 j.add("gSize", sk.genomeSizeEstimate());
jpayne@68 848 if(sk.baseCounts!=null){j.addLiteral("GC", sk.gc(), 3);}
jpayne@68 849 if(sk.probCorrect<1 && sk.probCorrect>0){j.add("Quality", sk.probCorrect);}
jpayne@68 850 if(sk.keyCounts!=null){
jpayne@68 851 double d=Tools.averageDouble(sk.keyCounts);
jpayne@68 852 j.add("AvgCount", d);
jpayne@68 853 j.add("Depth", Tools.observedToActualCoverage(d));
jpayne@68 854 }
jpayne@68 855
jpayne@68 856 if(sk.imgID>0){j.add("IMG", sk.imgID);}
jpayne@68 857 if(sk.spid>0){j.add("spid", sk.spid);}
jpayne@68 858 if(sk.taxID>0 && sk.taxID<SketchObject.minFakeID){j.add("TaxID", sk.taxID);}
jpayne@68 859
jpayne@68 860 if((printRefFileName) && sk.fname()!=null){j.add("file", sk.fname());}
jpayne@68 861 if(printOriginalName && sk.name0()!=null){j.add("SeqName", sk.name0());}
jpayne@68 862
jpayne@68 863 if(sk.meta!=null){
jpayne@68 864 for(String st : sk.meta){
jpayne@68 865 int colon=st.indexOf(':');
jpayne@68 866 j.add(st.substring(0, colon), st.substring(colon+1));
jpayne@68 867 }
jpayne@68 868 }
jpayne@68 869
jpayne@68 870 if(printSSULen){
jpayne@68 871 if(sk.r16SLen()>0){j.add("16SLen", sk.r16SLen());}
jpayne@68 872 if(sk.r18SLen()>0){j.add("18SLen", sk.r18SLen());}
jpayne@68 873 }
jpayne@68 874 if(printSSUSequence){
jpayne@68 875 if(sk.r16S()!=null){j.add("16SSequence", new String(sk.r16S()));}
jpayne@68 876 if(sk.r18S()!=null){j.add("18SSequence", new String(sk.r18S()));}
jpayne@68 877 }
jpayne@68 878
jpayne@68 879 return j;
jpayne@68 880 }
jpayne@68 881
jpayne@68 882 public JsonObject toJson(Comparison c){
jpayne@68 883 final int tid=c.taxID;
jpayne@68 884
jpayne@68 885 JsonObject j=new JsonObject();
jpayne@68 886
jpayne@68 887 //Text fields
jpayne@68 888 if(printTaxName){j.add("taxName", c.taxName()==null ? "." : c.taxName());}
jpayne@68 889
jpayne@68 890 if(printCommonAncestor){j.add("commonAncestor", c.commonAncestor());}
jpayne@68 891 if(printCommonAncestorLevel){j.add("commonAncestorLevel", c.commonAncestorLevel());}
jpayne@68 892
jpayne@68 893 if(printRefFileName){j.add("file", c.fname()==null ? "." : c.fname());}
jpayne@68 894 if(printOriginalName){j.add("seqName", c.name0()==null ? "." : c.name0());}
jpayne@68 895 if(printTax && SketchObject.taxtree!=null){
jpayne@68 896 TaxNode tn=null;
jpayne@68 897 if(tid>0 && tid<SketchObject.minFakeID){
jpayne@68 898 tn=SketchObject.taxtree.getNode(tid);
jpayne@68 899 }
jpayne@68 900
jpayne@68 901 if(tn!=null){
jpayne@68 902 j.add("taxonomy", SketchObject.taxtree.toSemicolon(tn, SketchObject.skipNonCanonical, false));
jpayne@68 903 }else{
jpayne@68 904 j.add("taxonomy", (Object)null);
jpayne@68 905 }
jpayne@68 906 }
jpayne@68 907
jpayne@68 908 if(printWKID){j.addLiteral("WKID", 100*c.wkid(), 4);}
jpayne@68 909 if(printKID){j.addLiteral("KID", 100*c.kid(), 4);}
jpayne@68 910 // if(printSSU() && c.ssuIdentity()>0){j.addLiteral("SSU", 100*c.ssuIdentity(), 3);} //Old
jpayne@68 911 if(printSSU() && c.ssuIdentity()>0){
jpayne@68 912 j.addLiteral(c.ssuType()==18 ? "18S" : "16S", 100*c.ssuIdentity(), 3);
jpayne@68 913 }
jpayne@68 914
jpayne@68 915 //Primary fields
jpayne@68 916 if(printAni){j.addLiteral((aminoOrTranslate() ? "AAI" : "ANI"), 100*c.ani(), 3);}
jpayne@68 917 if(printCompleteness){j.addLiteral("Complt", 100*c.completeness(), 3);}
jpayne@68 918 if(printContam){j.addLiteral("Contam", 100*c.contamFraction(), 3);}
jpayne@68 919 if(printContam2){j.addLiteral("Contam2", 100*c.contam2Fraction(), 3);}
jpayne@68 920 if(printUContam){j.addLiteral("uContam", 100*c.uContamFraction(), 3);}
jpayne@68 921 if(printScore){j.add("Score", c.score());}
jpayne@68 922 if(printEValue){j.add("E-Val", String.format(Locale.ROOT, "%5.2e", c.eValue()));}
jpayne@68 923
jpayne@68 924 if(printDepth){j.add("Depth", c.depth(printActualDepth));}
jpayne@68 925 if(printDepth2){j.add("Depth2", c.depth2(printActualDepth));}
jpayne@68 926 if(printVolume){j.add("Volume", c.volume()+0.001);}
jpayne@68 927 if(printRefHits){j.add("RefHits", c.avgRefHits());}
jpayne@68 928
jpayne@68 929 if(printMatches){j.add("Matches", c.hits());}
jpayne@68 930 if(printUnique){j.add("Unique", c.uHits());}
jpayne@68 931 if(printUnique2){j.add("Unique2", c.unique2());}
jpayne@68 932 if(printUnique3){j.add("Unique3", c.unique3());}
jpayne@68 933 if(printNoHit){j.add("noHit", c.noHits());}
jpayne@68 934 if(printLength){j.add("Length", c.maxDivisor());}
jpayne@68 935 if(printTaxID){j.add("TaxID", tid>=SketchObject.minFakeID ? -1 : tid);}
jpayne@68 936 if(printImg){j.add("ImgID", c.imgID());}
jpayne@68 937 if(printGBases){j.add("gBases", c.genomeSizeBases());}
jpayne@68 938 if(printGKmers){j.add("gKmers", c.genomeSizeKmers());}
jpayne@68 939 if(printGSize){j.add("gSize", c.genomeSizeEstimate());}
jpayne@68 940 if(printGSeqs){j.add("gSeqs", c.genomeSequences());}
jpayne@68 941 if(c.hasGC()){j.addLiteral("GC", c.gc(), 3);}
jpayne@68 942
jpayne@68 943 //Raw fields
jpayne@68 944 if(printRefDivisor){j.add("rDiv", c.refDivisor());}
jpayne@68 945 if(printQueryDivisor){j.add("qDiv", c.queryDivisor());}
jpayne@68 946 if(printRefSize){j.add("rSize", c.refSize());}
jpayne@68 947 if(printQuerySize){j.add("qSize", c.querySize());}
jpayne@68 948 if(printContamHits){j.add("cHits", c.contamHits());}
jpayne@68 949
jpayne@68 950
jpayne@68 951
jpayne@68 952 if(printSSULen){
jpayne@68 953 if(c.has18S()){j.add("18SLen", c.b.r18SLen());}
jpayne@68 954 /*else*/ if(c.has16S()){j.add("16SLen", c.b.r16SLen());}
jpayne@68 955 }
jpayne@68 956 if(printSSUSequence){
jpayne@68 957 if(c.has18S()){j.add("18SSequence", new String(c.b.r18S()));}
jpayne@68 958 /*else*/ if(c.has16S()){j.add("16SSequence", new String(c.b.r16S()));}
jpayne@68 959 }
jpayne@68 960
jpayne@68 961 if(printIntersection){
jpayne@68 962 Sketch intersection=Sketch.intersection(c.a, c.b);
jpayne@68 963 j.add("intersection", intersection.toString());
jpayne@68 964 }
jpayne@68 965
jpayne@68 966 return j;
jpayne@68 967 }
jpayne@68 968
jpayne@68 969 public boolean json(){return format==FORMAT_JSON;}
jpayne@68 970
jpayne@68 971 /*--------------------------------------------------------------*/
jpayne@68 972 /*---------------- D3 ----------------*/
jpayne@68 973 /*--------------------------------------------------------------*/
jpayne@68 974
jpayne@68 975 public JsonObject toD3(SketchResults sr){
jpayne@68 976 if(sr==null || sr.isEmpty()){return new JsonObject("name", "no hits");}
jpayne@68 977 JsonObject root=new JsonObject("name", "life");
jpayne@68 978 root.add("level", TaxTree.LIFE_E);
jpayne@68 979 if(sr.list!=null){
jpayne@68 980 int i=0;
jpayne@68 981 for(Comparison c : sr.list){
jpayne@68 982 ArrayList<JsonObject> tax=toD3List(c);
jpayne@68 983 addToLevel(root, tax, 0);
jpayne@68 984 i++;
jpayne@68 985 if(i>=maxRecords){break;}
jpayne@68 986 }
jpayne@68 987 }
jpayne@68 988 if(D3LevelNodes){
jpayne@68 989 root=converToD3ArrayFormat_LevelNode(root);
jpayne@68 990 }else{
jpayne@68 991 root=converToD3ArrayFormat_SingleNodeRoot(root);
jpayne@68 992 }
jpayne@68 993 return root;
jpayne@68 994 }
jpayne@68 995
jpayne@68 996 private JsonObject converToD3ArrayFormat_SingleNodeRoot(JsonObject root){
jpayne@68 997 JsonObject children=root.removeJson("children");
jpayne@68 998 if(children==null){return root;}
jpayne@68 999 Object[] array=children.toJmapArray();
jpayne@68 1000 root=(JsonObject)array[0];//Life node
jpayne@68 1001
jpayne@68 1002 assert(root.getString("name").equalsIgnoreCase("Life")) : root;
jpayne@68 1003 return converToD3ArrayFormat_SingleNode(root);
jpayne@68 1004 }
jpayne@68 1005
jpayne@68 1006 private JsonObject converToD3ArrayFormat_SingleNode(JsonObject nameNode){
jpayne@68 1007 Object[] levelNodes=nameNode.toJmapArray();
jpayne@68 1008 if(levelNodes==null){return nameNode;}
jpayne@68 1009 nameNode.clearJson();
jpayne@68 1010
jpayne@68 1011 ArrayList<JsonObject> fixed=new ArrayList<JsonObject>();
jpayne@68 1012 for(Object o : levelNodes){
jpayne@68 1013 JsonObject levelNode=(JsonObject)o;
jpayne@68 1014 String level=levelNode.getString("name");
jpayne@68 1015 JsonObject children=levelNode.removeJson("children");
jpayne@68 1016 if(children!=null){
jpayne@68 1017 Object[] childArray=children.toJmapArray();
jpayne@68 1018 for(Object o2 : childArray){
jpayne@68 1019 JsonObject child=(JsonObject)o2;//Now a name node
jpayne@68 1020 String name=(String)child.removeObject("name");
jpayne@68 1021 child.add("name", level+": "+name);
jpayne@68 1022 converToD3ArrayFormat_SingleNode(child);
jpayne@68 1023 fixed.add(child);
jpayne@68 1024 }
jpayne@68 1025 }
jpayne@68 1026 }
jpayne@68 1027 Object[] children=fixed.toArray();
jpayne@68 1028 nameNode.add("children", children);
jpayne@68 1029 return nameNode;
jpayne@68 1030 }
jpayne@68 1031
jpayne@68 1032 private JsonObject converToD3ArrayFormat_LevelNode(JsonObject levelNode){
jpayne@68 1033 JsonObject children=levelNode.removeJson("children");
jpayne@68 1034 if(children==null){return levelNode;}
jpayne@68 1035
jpayne@68 1036 Object[] array=children.toJmapArray();
jpayne@68 1037 levelNode.add("children", array);
jpayne@68 1038 for(Object o : array){
jpayne@68 1039 converToD3ArrayFormat_NameNode((JsonObject)o);
jpayne@68 1040 }
jpayne@68 1041 return levelNode;
jpayne@68 1042 }
jpayne@68 1043
jpayne@68 1044 private JsonObject converToD3ArrayFormat_NameNode(JsonObject nameNode){
jpayne@68 1045 Object[] array=nameNode.toJmapArray();
jpayne@68 1046 if(array==null){return nameNode;}
jpayne@68 1047
jpayne@68 1048 nameNode.clearJson();
jpayne@68 1049 nameNode.add("children", array);
jpayne@68 1050 for(Object o : array){
jpayne@68 1051 converToD3ArrayFormat_LevelNode((JsonObject)o);
jpayne@68 1052 }
jpayne@68 1053 return nameNode;
jpayne@68 1054 }
jpayne@68 1055
jpayne@68 1056 void addToLevel(JsonObject levelNode, ArrayList<JsonObject> list, int pos){
jpayne@68 1057 JsonObject jo=list.get(pos);
jpayne@68 1058 int rootLevel=levelNode.getInt("level");
jpayne@68 1059 int joLevel=jo.getInt("level");
jpayne@68 1060 if(rootLevel==joLevel){
jpayne@68 1061 assert(levelNode.getString("name").equalsIgnoreCase(jo.getString("levelname"))) : levelNode+"\n"+jo;
jpayne@68 1062 addAsChild(levelNode, list, pos);
jpayne@68 1063 }else{
jpayne@68 1064 assert(joLevel<rootLevel) : levelNode+"\n"+jo;
jpayne@68 1065 assert(false) : levelNode+"\n"+jo;
jpayne@68 1066 }
jpayne@68 1067 }
jpayne@68 1068
jpayne@68 1069 void addAsChild(JsonObject levelNode, ArrayList<JsonObject> list, int pos){
jpayne@68 1070 JsonObject children=levelNode.getJson("children");
jpayne@68 1071 if(children==null){
jpayne@68 1072 children=new JsonObject();
jpayne@68 1073 levelNode.add("children", children);
jpayne@68 1074 }
jpayne@68 1075 JsonObject jo=list.get(pos);
jpayne@68 1076 String taxName=jo.getString("name");
jpayne@68 1077 JsonObject nameNode=children.getJson(taxName);
jpayne@68 1078 if(nameNode==null){
jpayne@68 1079 nameNode=new JsonObject("name", taxName);
jpayne@68 1080 children.add(taxName, nameNode);
jpayne@68 1081 }
jpayne@68 1082 Number size=jo.getNumber("size");
jpayne@68 1083 Number oldSize=nameNode.getNumber("size");
jpayne@68 1084 if(size!=null && (oldSize==null || oldSize.doubleValue()<size.doubleValue())){
jpayne@68 1085 nameNode.add("size", jo.getNumber("size"));
jpayne@68 1086 nameNode.add("kid", jo.getNumber("kid"));
jpayne@68 1087 nameNode.add("wkid", jo.getNumber("wkid"));
jpayne@68 1088 nameNode.add("ani", jo.getNumber("ani"));
jpayne@68 1089 nameNode.add("hits", jo.getNumber("hits"));
jpayne@68 1090 nameNode.add("depth", jo.getNumber("depth"));
jpayne@68 1091 }
jpayne@68 1092
jpayne@68 1093 if(pos<list.size()-1){//recur
jpayne@68 1094 jo=list.get(pos+1);
jpayne@68 1095 String levelName=jo.getString("levelname");
jpayne@68 1096 int level=jo.getInt("level");
jpayne@68 1097 JsonObject nextLevelNode=nameNode.getJson(levelName);
jpayne@68 1098 if(nextLevelNode==null){
jpayne@68 1099 nextLevelNode=new JsonObject("name", levelName);
jpayne@68 1100 nextLevelNode.add("level", level);
jpayne@68 1101 nameNode.add(levelName, nextLevelNode);
jpayne@68 1102 }
jpayne@68 1103 addAsChild(nextLevelNode, list, pos+1);
jpayne@68 1104 }
jpayne@68 1105 }
jpayne@68 1106
jpayne@68 1107 int promote(int levelE) {
jpayne@68 1108 if(levelE<0){return levelE;}
jpayne@68 1109 while(!TaxTree.isSimple2(levelE) && levelE<TaxTree.LIFE){
jpayne@68 1110 levelE++;
jpayne@68 1111 }
jpayne@68 1112 return levelE;
jpayne@68 1113 }
jpayne@68 1114
jpayne@68 1115 public ArrayList<JsonObject> toD3List(Comparison c){
jpayne@68 1116 final ArrayList<TaxNode> nodes=toTNList(c.taxID);
jpayne@68 1117 ArrayList<JsonObject> list=new ArrayList<JsonObject>(nodes.size());
jpayne@68 1118 for(TaxNode tn : nodes){
jpayne@68 1119 JsonObject jo=new JsonObject("name", tn.name);
jpayne@68 1120 int levelE=promote(tn.levelExtended);
jpayne@68 1121 jo.add("level", levelE);
jpayne@68 1122 jo.add("levelname", TaxTree.levelToStringExtended(levelE));
jpayne@68 1123 list.add(jo);
jpayne@68 1124 }
jpayne@68 1125 if(list.size()>0){
jpayne@68 1126 JsonObject tail=list.get(list.size()-1);
jpayne@68 1127 tail.add("size", toD3Size(c));
jpayne@68 1128 tail.add("kid", c.kid());
jpayne@68 1129 tail.add("wkid", c.wkid());
jpayne@68 1130 tail.add("ani", c.ani());
jpayne@68 1131 tail.add("hits", c.hits());
jpayne@68 1132 tail.add("depth", c.depth(printActualDepth));
jpayne@68 1133 }
jpayne@68 1134 return list;
jpayne@68 1135 }
jpayne@68 1136
jpayne@68 1137 private Number toD3Size(Comparison c){
jpayne@68 1138 if(D3sizeMode==D3_ANI_SIZE){
jpayne@68 1139 return c.ani();
jpayne@68 1140 }else if(D3sizeMode==D3_KID_SIZE){
jpayne@68 1141 return c.kid();
jpayne@68 1142 }else if(D3sizeMode==D3_WKID_SIZE){
jpayne@68 1143 return c.wkid();
jpayne@68 1144 }else if(D3sizeMode==D3_HIT_SIZE){
jpayne@68 1145 return c.hits();
jpayne@68 1146 }else if(D3sizeMode==D3_DEPTH_SIZE){
jpayne@68 1147 return c.depth(printActualDepth);
jpayne@68 1148 }
jpayne@68 1149 assert(false) : "Invalid D3sizeMode "+D3sizeMode;
jpayne@68 1150 return c.hits();
jpayne@68 1151 }
jpayne@68 1152
jpayne@68 1153 public ArrayList<TaxNode> toTNList(final int tid){
jpayne@68 1154 final TaxTree tree=TaxTree.getTree();
jpayne@68 1155
jpayne@68 1156 final ArrayList<TaxNode> list=new ArrayList<TaxNode>();
jpayne@68 1157 int nulls=0;
jpayne@68 1158 {
jpayne@68 1159 TaxNode tn=tree.getNode(tid);
jpayne@68 1160 if(tn.isRanked() && !tn.cellularOrganisms()){list.add(tn);}
jpayne@68 1161 while(tn.pid!=tn.id){
jpayne@68 1162 tn=tree.getNode(tn.pid);
jpayne@68 1163 if(tn.isRanked() && !tn.cellularOrganisms()){list.add(tn);}
jpayne@68 1164 }
jpayne@68 1165 }
jpayne@68 1166 Collections.reverse(list);
jpayne@68 1167 int prevLevelE=TaxTree.LIFE;
jpayne@68 1168 for(int i=0; i<list.size(); i++){
jpayne@68 1169 TaxNode tn=list.get(i);
jpayne@68 1170 int levelE=promote(tn.levelExtended);
jpayne@68 1171
jpayne@68 1172 if(!TaxTree.isSimple2(levelE) || (i>0 && levelE>=prevLevelE)){
jpayne@68 1173 list.set(i, null);
jpayne@68 1174 nulls++;
jpayne@68 1175 }else{prevLevelE=levelE;}
jpayne@68 1176 }
jpayne@68 1177 if(nulls>0){Tools.condenseStrict(list);}
jpayne@68 1178 return list;
jpayne@68 1179 }
jpayne@68 1180
jpayne@68 1181 /*--------------------------------------------------------------*/
jpayne@68 1182 /*---------------- Formatting ----------------*/
jpayne@68 1183 /*--------------------------------------------------------------*/
jpayne@68 1184
jpayne@68 1185 ByteBuilder queryHeader(Sketch sk){
jpayne@68 1186 ByteBuilder bb=new ByteBuilder();
jpayne@68 1187 if(format>2){return bb;}
jpayne@68 1188
jpayne@68 1189 String color=toColor(sk.taxID);
jpayne@68 1190 if(color!=null){bb.append(color);}
jpayne@68 1191
jpayne@68 1192 bb.append("\nQuery: ").append(sk.name()==null ? "." : sk.name());
jpayne@68 1193 if(dbName!=null){bb.append("\tDB: ").append(dbName);}
jpayne@68 1194 bb.append("\tSketchLen: ").append(sk.length());
jpayne@68 1195 bb.append("\tSeqs: ").append(sk.genomeSequences).append(' ');
jpayne@68 1196 bb.append("\t"+(aminoOrTranslate() ? "SeqLen" : "Bases")+": ").append(sk.genomeSizeBases);
jpayne@68 1197 bb.append("\tgSize: ").append(sk.genomeSizeEstimate());
jpayne@68 1198 if(sk.baseCounts!=null){bb.append("\tGC: ").append(sk.gc(), 3);}
jpayne@68 1199 if(sk.probCorrect<1 && sk.probCorrect>0){bb.append("\tQuality: ").append(sk.probCorrect, 4);}
jpayne@68 1200 if(sk.keyCounts!=null){
jpayne@68 1201 double d=Tools.averageDouble(sk.keyCounts);
jpayne@68 1202 bb.append("\tAvgCount: ").append(d, 3);
jpayne@68 1203 bb.append("\tDepth: ").append(Tools.observedToActualCoverage(d), 3);
jpayne@68 1204 }
jpayne@68 1205
jpayne@68 1206 if(sk.imgID>0){bb.append("\tIMG: ").append(sk.imgID);}
jpayne@68 1207 if(sk.spid>0){bb.append("\tspid: ").append(sk.spid);}
jpayne@68 1208 if(sk.taxID>0 && sk.taxID<SketchObject.minFakeID){bb.append("\tTaxID: ").append(sk.taxID);}
jpayne@68 1209
jpayne@68 1210 if(printQueryFileName && sk.fname()!=null){bb.append("\tFile: "+sk.fname());}
jpayne@68 1211 if(printOriginalName && sk.name0()!=null && !sk.name0().equals(sk.name())){bb.append("\tSeqName: "+sk.name0());}
jpayne@68 1212
jpayne@68 1213 if(sk.meta!=null){
jpayne@68 1214 for(String st : sk.meta){
jpayne@68 1215 bb.append("\t").append(st.replaceFirst(":", ": "));
jpayne@68 1216 }
jpayne@68 1217 }
jpayne@68 1218
jpayne@68 1219 if(color!=null){bb.append(Colors.RESET);}
jpayne@68 1220
jpayne@68 1221 return bb;
jpayne@68 1222 }
jpayne@68 1223
jpayne@68 1224 int toColorTid(final int taxID){
jpayne@68 1225 if(!printColors || SketchObject.taxtree==null || taxID<=0 || taxID>=SketchObject.minFakeID){return 0;}
jpayne@68 1226 TaxNode tn=SketchObject.taxtree.getNode(taxID);
jpayne@68 1227 while(tn!=null && tn.id!=tn.pid && tn.levelExtended<colorLevel){
jpayne@68 1228 tn=SketchObject.taxtree.getNode(tn.pid);
jpayne@68 1229 // System.err.println(tn);
jpayne@68 1230 }
jpayne@68 1231 return tn==null || tn.levelExtended>=TaxTree.LIFE_E || (tn.levelExtended>colorLevel && tn.levelExtended>TaxTree.PHYLUM_E) ? 0 : tn.id;
jpayne@68 1232 }
jpayne@68 1233
jpayne@68 1234 String toColor(final int taxID){
jpayne@68 1235 if(!printColors || SketchObject.taxtree==null || taxID<=0 || taxID>=SketchObject.minFakeID){return null;}
jpayne@68 1236 TaxNode tn=SketchObject.taxtree.getNode(taxID);
jpayne@68 1237 while(tn!=null && tn.id!=tn.pid && tn.levelExtended<colorLevel){
jpayne@68 1238 tn=SketchObject.taxtree.getNode(tn.pid);
jpayne@68 1239 // System.err.println(tn);
jpayne@68 1240 }
jpayne@68 1241 if(tn==null){
jpayne@68 1242 return null;
jpayne@68 1243 }else{
jpayne@68 1244 if(tn.levelExtended>=TaxTree.LIFE_E || (tn.levelExtended>colorLevel && tn.levelExtended>TaxTree.PHYLUM_E)){return Colors.WHITE;}
jpayne@68 1245 else{
jpayne@68 1246 // System.err.println("*"+tn.id+", "+tn.id%Colors.colorArray.length);
jpayne@68 1247 return Colors.colorArray[tn.id%Colors.colorArray.length];
jpayne@68 1248 }
jpayne@68 1249 }
jpayne@68 1250 }
jpayne@68 1251
jpayne@68 1252 String header(){
jpayne@68 1253 if(format==FORMAT_JSON){return null;}
jpayne@68 1254 final String ani=(aminoOrTranslate() ? "AAI" : "ANI");
jpayne@68 1255 if(format==FORMAT_QUERY_REF_ANI || format==FORMAT_CONSTELLATION){
jpayne@68 1256 if(reportAniOnly){return "#Query\tRef\t"+ani;}
jpayne@68 1257 if(format==FORMAT_QUERY_REF_ANI){
jpayne@68 1258 return "#Query\tRef\t"+ani+
jpayne@68 1259 "\tQSize\tRefSize\tQBases\tRBases"+
jpayne@68 1260 (printTaxID ? "\tQTaxID\tRTaxID" : "")+(printKID ? "\tKID" : "")+(printWKID ? "\tWKID" : "")+
jpayne@68 1261 (printSSU() ? "\tSSU" : "")+(printCommonAncestorLevel ? "\tCALevel" : "");
jpayne@68 1262 }
jpayne@68 1263 if(format==FORMAT_CONSTELLATION){return "#Query\tRef\tKID\tWKID\t"+ani+"\tCmplt\tQSize\tRefSize\tQBases\tRefBases";}
jpayne@68 1264 }
jpayne@68 1265 return columnwiseHeader();
jpayne@68 1266 }
jpayne@68 1267
jpayne@68 1268 String columnwiseHeader(){
jpayne@68 1269 final String ani=(aminoOrTranslate() ? "AAI" : "ANI");
jpayne@68 1270
jpayne@68 1271 StringBuilder sb=new StringBuilder();
jpayne@68 1272
jpayne@68 1273 //Numeric fields
jpayne@68 1274 if(printKID){sb.append("WKID\t");}
jpayne@68 1275 if(printWKID){sb.append("KID\t");}
jpayne@68 1276 if(printAni){sb.append(ani+"\t");}
jpayne@68 1277 if(printSSU()){sb.append("SSU\t");}
jpayne@68 1278 if(printSSULen){sb.append("SSULen\t");}
jpayne@68 1279 if(printCompleteness){sb.append("Complt\t");}
jpayne@68 1280 if(printContam){sb.append("Contam\t");}
jpayne@68 1281 if(printContam2){sb.append("Contam2\t");}
jpayne@68 1282 if(printUContam){sb.append("uContam\t");}
jpayne@68 1283 if(printScore){sb.append("Score\t");}
jpayne@68 1284 if(printEValue){sb.append("E-Val\t");}
jpayne@68 1285
jpayne@68 1286 if(printDepth){sb.append("Depth\t");}
jpayne@68 1287 if(printDepth2){sb.append("Depth2\t");}
jpayne@68 1288 if(printVolume){sb.append("Volume\t");}
jpayne@68 1289 if(printRefHits){sb.append("RefHits\t");}
jpayne@68 1290 if(printMatches){sb.append("Matches\t");}
jpayne@68 1291 if(printUnique){sb.append("Unique\t");}
jpayne@68 1292 if(printUnique2){sb.append("Unique2\t");}
jpayne@68 1293 if(printUnique3){sb.append("Unique3\t");}
jpayne@68 1294 if(printNoHit){sb.append("noHit\t");}
jpayne@68 1295 if(printLength){sb.append("Length\t");}
jpayne@68 1296 if(printTaxID){sb.append("TaxID\t");}
jpayne@68 1297 if(printImg){sb.append("ImgID \t");}
jpayne@68 1298 if(printGBases){sb.append("gBases\t");}
jpayne@68 1299 if(printGKmers){sb.append("gKmers\t");}
jpayne@68 1300 if(printGSize){sb.append("gSize\t");}
jpayne@68 1301 if(printGSeqs){sb.append("gSeqs\t");}
jpayne@68 1302 if(printGC){sb.append("GC\t");}
jpayne@68 1303
jpayne@68 1304
jpayne@68 1305 //Raw fields
jpayne@68 1306 if(printRefDivisor){sb.append("rDiv\t");}
jpayne@68 1307 if(printQueryDivisor){sb.append("qDiv\t");}
jpayne@68 1308 if(printRefSize){sb.append("rSize\t");}
jpayne@68 1309 if(printQuerySize){sb.append("qSize\t");}
jpayne@68 1310 if(printContamHits){sb.append("cHits\t");}
jpayne@68 1311
jpayne@68 1312 //Text fields
jpayne@68 1313 if(printCommonAncestor){sb.append("CA\t");}
jpayne@68 1314 if(printCommonAncestorLevel){sb.append("CALevel\t");}
jpayne@68 1315 if(printTaxName){sb.append("taxName\t");}
jpayne@68 1316 if(printRefFileName){sb.append("file\t");}
jpayne@68 1317 if(printOriginalName){sb.append("seqName\t");}
jpayne@68 1318 if(printTax && SketchObject.taxtree!=null){sb.append("taxonomy\t");}
jpayne@68 1319
jpayne@68 1320 if(sb.length()>1){sb.setLength(sb.length()-1);}//trim trailing tab
jpayne@68 1321
jpayne@68 1322 return sb.toString();
jpayne@68 1323 }
jpayne@68 1324
jpayne@68 1325 void formatComparisonColumnwise(Comparison c, ByteBuilder bb, int prevTid){
jpayne@68 1326 final int tid=c.taxID;
jpayne@68 1327 boolean reset=false;
jpayne@68 1328
jpayne@68 1329 if(printColors){
jpayne@68 1330 final int ctid=toColorTid(tid);
jpayne@68 1331 final int prevCtid=toColorTid(prevTid);
jpayne@68 1332
jpayne@68 1333 final int cnum=ctid%Colors.colorArray.length;
jpayne@68 1334 final int prevCnum=prevCtid%Colors.colorArray.length;
jpayne@68 1335
jpayne@68 1336 String color=toColor(tid);
jpayne@68 1337 String underline=(printColors && cnum==prevCnum && ctid!=prevCtid && (ctid>1 && prevCtid>1) ? Colors.UNDERLINE : null);
jpayne@68 1338
jpayne@68 1339 if(color!=null){bb.append(color);}
jpayne@68 1340 if(underline!=null){bb.append(underline);}
jpayne@68 1341 reset=(color!=null || underline!=null);
jpayne@68 1342
jpayne@68 1343 // System.err.println((color==null ? "" : color)+(underline==null ? "" : underline)+
jpayne@68 1344 // tid+", "+prevTid+"; \t"+ctid+", "+prevCtid+"; \t"+cnum+", "+prevCnum+"; \t"+((underline!=null)+"")+Colors.RESET);
jpayne@68 1345 // System.err.println(color==null ? "null" : color.substring(1));
jpayne@68 1346 }
jpayne@68 1347
jpayne@68 1348 // sb.append(String.format(Locale.ROOT, "%.2f%%\t%.2f%%", 100*c.idMinDivisor(), 100*c.idMaxDivisor()));
jpayne@68 1349 if(printWKID){bb.append(100*c.wkid(), 2).append('%').tab();}
jpayne@68 1350 if(printKID){bb.append(100*c.kid(), 2).append('%');}
jpayne@68 1351
jpayne@68 1352 // if(printAni){sb.append(String.format(Locale.ROOT, "\t%.2f%%", 100*c.ani()));}
jpayne@68 1353 // if(printCompleteness){sb.append(String.format(Locale.ROOT, "\t%.2f%%", 100*c.completeness()));}
jpayne@68 1354 // if(printContam){sb.append(String.format(Locale.ROOT, "\t%.2f%%", 100*c.contamFraction()));}
jpayne@68 1355 // if(printContam2){sb.append(String.format(Locale.ROOT, "\t%.2f%%", 100*c.contam2Fraction()));}
jpayne@68 1356 // if(printUContam){sb.append(String.format(Locale.ROOT, "\t%.2f%%", 100*c.uContamFraction()));}
jpayne@68 1357
jpayne@68 1358 if(printAni){bb.tab().append(100*c.ani(), 2).append('%');}
jpayne@68 1359 if(printSSU()){
jpayne@68 1360 float id=100*c.ssuIdentity();
jpayne@68 1361 if(id>0){
jpayne@68 1362 bb.tab().append(id, 2).append(c.ssuType()==16 ? '%' : '*'); //This is where 16S and 18S are differentiated
jpayne@68 1363 }else{
jpayne@68 1364 bb.tab().append('.');
jpayne@68 1365 }
jpayne@68 1366 }
jpayne@68 1367 if(printSSULen){
jpayne@68 1368 bb.tab().append(c.ssuLen());
jpayne@68 1369 }
jpayne@68 1370 if(printCompleteness){bb.tab().append(100*c.completeness(), 2).append('%');}
jpayne@68 1371 if(printContam){bb.tab().append(100*c.contamFraction(), 2).append('%');}
jpayne@68 1372 if(printContam2){bb.tab().append(100*c.contam2Fraction(), 2).append('%');}
jpayne@68 1373 if(printUContam){bb.tab().append(100*c.uContamFraction(), 2).append('%');}
jpayne@68 1374 if(printScore){bb.tab().append(c.scoreS());}
jpayne@68 1375 if(printEValue){bb.tab().append(String.format(Locale.ROOT, "%5.2e", c.eValue()));}
jpayne@68 1376
jpayne@68 1377 if(printDepth){bb.tab().append(c.depthS(printActualDepth));}
jpayne@68 1378 if(printDepth2){bb.tab().append(c.depth2S(printActualDepth));}
jpayne@68 1379 if(printVolume){bb.tab().append(c.volumeS());}
jpayne@68 1380 if(printRefHits){bb.tab().append(c.avgRefHitsS());}
jpayne@68 1381
jpayne@68 1382 if(printMatches){bb.tab().append(c.hits());}
jpayne@68 1383 if(printUnique){bb.tab().append(c.uHits());}
jpayne@68 1384 if(printUnique2){bb.tab().append(c.unique2());}
jpayne@68 1385 if(printUnique3){bb.tab().append(c.unique3());}
jpayne@68 1386 if(printNoHit){bb.tab().append(c.noHits());}
jpayne@68 1387 if(printLength){bb.tab().append( c.maxDivisor());}
jpayne@68 1388 if(printTaxID){bb.tab().append(tid>=SketchObject.minFakeID ? -1 : tid);}
jpayne@68 1389 if(printImg){bb.tab().append(c.imgID());}
jpayne@68 1390 if(printGBases){appendKMG(c.genomeSizeBases(), bb);}
jpayne@68 1391 if(printGKmers){appendKMG(c.genomeSizeKmers(), bb);}
jpayne@68 1392 if(printGSize){appendKMG(c.genomeSizeEstimate(), bb);}
jpayne@68 1393 if(printGSeqs){appendKMG(c.genomeSequences(), bb);}
jpayne@68 1394 if(printGC){bb.tab().append(c.gc(),3);}
jpayne@68 1395
jpayne@68 1396 //Raw fields
jpayne@68 1397 if(printRefDivisor){bb.tab().append(c.refDivisor());}
jpayne@68 1398 if(printQueryDivisor){bb.tab().append(c.queryDivisor());}
jpayne@68 1399 if(printRefSize){bb.tab().append(c.refSize());}
jpayne@68 1400 if(printQuerySize){bb.tab().append(c.querySize());}
jpayne@68 1401 if(printContamHits){bb.tab().append(c.contamHits());}
jpayne@68 1402
jpayne@68 1403 //Text fields
jpayne@68 1404 if(printCommonAncestor){bb.tab().append(c.commonAncestor());}
jpayne@68 1405 if(printCommonAncestorLevel){bb.tab().append(c.commonAncestorLevel());}
jpayne@68 1406 if(printTaxName){bb.tab().append(c.taxName()==null ? "." : c.taxName());}
jpayne@68 1407 if(printRefFileName){bb.tab().append(c.fname()==null ? "." : c.fname());}
jpayne@68 1408 if(printOriginalName){bb.tab().append(c.name0()==null ? "." : c.name0());}
jpayne@68 1409 if(printTax && SketchObject.taxtree!=null){
jpayne@68 1410 bb.tab();
jpayne@68 1411 TaxNode tn=null;
jpayne@68 1412 if(tid>0 && tid<SketchObject.minFakeID){
jpayne@68 1413 tn=SketchObject.taxtree.getNode(tid);
jpayne@68 1414 }
jpayne@68 1415
jpayne@68 1416 if(tn!=null){
jpayne@68 1417 bb.append(SketchObject.taxtree.toSemicolon(tn, SketchObject.skipNonCanonical, false));
jpayne@68 1418 }else{
jpayne@68 1419 bb.append('.');
jpayne@68 1420 }
jpayne@68 1421 }
jpayne@68 1422 if(printTaxName && !printOriginalName && !printRefFileName && c.taxName()==null && c.name0()!=null){bb.tab().append(c.name0());} //Extra column
jpayne@68 1423
jpayne@68 1424 if(reset){bb.append(Colors.RESET);}
jpayne@68 1425
jpayne@68 1426 bb.append('\n');
jpayne@68 1427
jpayne@68 1428 if(printIntersection){
jpayne@68 1429 Sketch intersection=Sketch.intersection(c.a, c.b);
jpayne@68 1430 bb.append(intersection.toString());
jpayne@68 1431 bb.append('\n');
jpayne@68 1432 }
jpayne@68 1433
jpayne@68 1434 }
jpayne@68 1435
jpayne@68 1436 void appendKMG(long value, ByteBuilder bb){
jpayne@68 1437 if(gSizeKMG){
jpayne@68 1438 bb.tab().append(toKMG(value));
jpayne@68 1439 }else{
jpayne@68 1440 bb.tab().append(value);
jpayne@68 1441 }
jpayne@68 1442 }
jpayne@68 1443
jpayne@68 1444 String toKMG(long value){
jpayne@68 1445 if(value<10000000L){return Long.toString(value);}
jpayne@68 1446 value+=5;
jpayne@68 1447 if(value<1000000000L){return value/1000L+"K";}
jpayne@68 1448 if(value<1000000000000L){return value/1000000L+"M";}
jpayne@68 1449 if(value<1000000000000000L){return value/1000000000L+"G";}
jpayne@68 1450 return value/1000000000000L+"T";
jpayne@68 1451 }
jpayne@68 1452
jpayne@68 1453 void formatComparison3Column(Comparison c, ByteBuilder sb, int prevTid){
jpayne@68 1454 Sketch query=c.a;
jpayne@68 1455 final long sea=Tools.max(1, c.a.genomeSizeEstimate());
jpayne@68 1456 final long seb=Tools.max(1, c.b.genomeSizeEstimate());
jpayne@68 1457 final long ba=Tools.max(1, c.a.genomeSizeBases);
jpayne@68 1458 final long bb=Tools.max(1, c.b.genomeSizeBases);
jpayne@68 1459 final String qName=format==FORMAT_CONSTELLATION ? (useFilePrefixName ? query.filePrefix() : ""+query.sketchID) : useTaxidName ? ""+query.taxID :
jpayne@68 1460 useImgName ? ""+query.imgID : useTaxName ? query.taxName() : query.name();
jpayne@68 1461 final String rName=format==FORMAT_CONSTELLATION ? (useFilePrefixName ? c.b.filePrefix() : ""+c.b.sketchID) : useTaxidName ? ""+c.taxID() :
jpayne@68 1462 useImgName ? ""+c.imgID() : useTaxName ? c.taxName() : c.name();
jpayne@68 1463 final int tid=c.taxID;
jpayne@68 1464 boolean reset=false;
jpayne@68 1465
jpayne@68 1466 sb.append(qName).append('\t');
jpayne@68 1467 if(printColors){
jpayne@68 1468 final int ctid=toColorTid(tid);
jpayne@68 1469 final int prevCtid=toColorTid(prevTid);
jpayne@68 1470
jpayne@68 1471 final int cnum=ctid%Colors.colorArray.length;
jpayne@68 1472 final int prevCnum=prevCtid%Colors.colorArray.length;
jpayne@68 1473
jpayne@68 1474 String color=toColor(tid);
jpayne@68 1475 String underline=(printColors && cnum==prevCnum && ctid!=prevCtid && (ctid>1 && prevCtid>1) ? Colors.UNDERLINE : null);
jpayne@68 1476
jpayne@68 1477 if(color!=null){sb.append(color);}
jpayne@68 1478 if(underline!=null){sb.append(underline);}
jpayne@68 1479 reset=(color!=null || underline!=null);
jpayne@68 1480
jpayne@68 1481 // System.err.println((color==null ? "" : color)+(underline==null ? "" : underline)+
jpayne@68 1482 // tid+", "+prevTid+"; \t"+ctid+", "+prevCtid+"; \t"+cnum+", "+prevCnum+"; \t"+((underline!=null)+"")+Colors.RESET);
jpayne@68 1483 // System.err.println(color==null ? "null" : color.substring(1));
jpayne@68 1484 }
jpayne@68 1485
jpayne@68 1486 // sb.append(rName).append(String.format(Locale.ROOT, "\t%.2f\t%.3f", 100*c.ani(), sea/(float)seb));
jpayne@68 1487 // sb.append(rName).append(String.format(Locale.ROOT, "\t%.2f\t%d\t%d\t%d", 100*c.ani(), sea, seb, ba));
jpayne@68 1488
jpayne@68 1489 //"#Query\tRef\tKID\tWKID\tANI\tCmplt\tQSize\tRefSize\tQBases\tRefBases";
jpayne@68 1490
jpayne@68 1491 float kid=100*c.kid();
jpayne@68 1492 float wkid=100*c.wkid();
jpayne@68 1493 float ani=100*c.ani();
jpayne@68 1494 float complt=100*c.completeness();
jpayne@68 1495 float ssu=printSSU() ? 100*c.ssuIdentity() : 0;
jpayne@68 1496
jpayne@68 1497 sb.append(rName).append('\t');
jpayne@68 1498 if(reportAniOnly){
jpayne@68 1499 sb.append(ani, 3).append('\t');
jpayne@68 1500 }else if(format==FORMAT_CONSTELLATION){
jpayne@68 1501 sb.append(kid, 3).append('\t');
jpayne@68 1502 sb.append(wkid, 3).append('\t');
jpayne@68 1503 sb.append(ani, 3).append('\t');
jpayne@68 1504 sb.append(complt, 3).append('\t');
jpayne@68 1505 sb.append(sea).append('\t');
jpayne@68 1506 sb.append(seb).append('\t');
jpayne@68 1507 // sb.append(ba).append('\t');
jpayne@68 1508 // sb.append(bb).append('\t');
jpayne@68 1509 }else{
jpayne@68 1510 sb.append(ani, 3).append('\t');
jpayne@68 1511 sb.append(sea).append('\t');
jpayne@68 1512 sb.append(seb).append('\t');
jpayne@68 1513 sb.append(ba).append('\t');
jpayne@68 1514 sb.append(bb).append('\t');
jpayne@68 1515 if(printTaxID){sb.append(c.a.taxID).append('\t');}
jpayne@68 1516 if(printTaxID){sb.append(c.b.taxID).append('\t');}
jpayne@68 1517 if(printKID){sb.append(kid, 3).append('\t');}
jpayne@68 1518 if(printWKID){sb.append(wkid, 3).append('\t');}
jpayne@68 1519 if(printSSU()){
jpayne@68 1520 if(ssu>0){
jpayne@68 1521 sb.append(ssu, 3).append('\t');
jpayne@68 1522 }else{
jpayne@68 1523 sb.append('.').append('\t');
jpayne@68 1524 }
jpayne@68 1525 }
jpayne@68 1526 if(printCommonAncestorLevel){sb.append(c.commonAncestorLevel()).append('\t');}
jpayne@68 1527 }
jpayne@68 1528 sb.setLength(sb.length()-1);
jpayne@68 1529 if(reset){sb.append(Colors.RESET);}
jpayne@68 1530
jpayne@68 1531 sb.append('\n');
jpayne@68 1532
jpayne@68 1533 // System.err.println(sb);
jpayne@68 1534 }
jpayne@68 1535
jpayne@68 1536 void formatComparison(Comparison c, ByteBuilder sb, int prevTaxID){
jpayne@68 1537 if(format==FORMAT_MULTICOLUMN){
jpayne@68 1538 formatComparisonColumnwise(c, sb, prevTaxID);
jpayne@68 1539 return;
jpayne@68 1540 }else if(format==FORMAT_QUERY_REF_ANI || format==FORMAT_CONSTELLATION){
jpayne@68 1541 formatComparison3Column(c, sb, prevTaxID);
jpayne@68 1542 return;
jpayne@68 1543 }
jpayne@68 1544 String complt=(printCompleteness ? String.format(Locale.ROOT, "\tcomplt %.2f%%%%", 100*c.completeness()) : "");
jpayne@68 1545 String contam=(printContam ? String.format(Locale.ROOT, "\tcontam %.2f%%%%", 100*c.contamFraction()) : "");
jpayne@68 1546 // String score=(printScore ? String.format(Locale.ROOT, "\tscore %.2f", c.score2()) : "");
jpayne@68 1547 String score=(printScore ? "\tscore "+c.scoreS() : "");
jpayne@68 1548 String depth=(printDepth ? "\tdepth "+c.depthS(printActualDepth) : "");
jpayne@68 1549 String depth2=(printDepth2 ? "\tdepth2 "+c.depth2S(printActualDepth) : "");
jpayne@68 1550 String volume=(printVolume ? "\tvolume "+c.volumeS() : "");
jpayne@68 1551 String ccs=complt+contam+score;
jpayne@68 1552
jpayne@68 1553 if(format==FORMAT_OLD){
jpayne@68 1554 sb.append(String.format(Locale.ROOT, "WKID %.2f%%\tKID %.2f%%"+ccs+"\tmatches %d\tcompared %d",
jpayne@68 1555 100*c.wkid(), 100*c.kid(), c.hits(), c.minDivisor())+"\ttaxID "+c.taxID()+
jpayne@68 1556 (printImg ? "\timgID "+c.imgID() : "")+"\tgKmers "+c.genomeSizeKmers()+"\t"+
jpayne@68 1557 (c.taxName()==null ? "." : c.taxName())+
jpayne@68 1558 ((printOriginalName || (c.taxName()==null && c.name0()!=null)) ? "\t"+(c.name0()==null ? "." : c.name0()) : "")+"\n");
jpayne@68 1559 if(printTax && SketchObject.taxtree!=null){
jpayne@68 1560 if(c.taxID()>=0 && c.taxID()<SketchObject.minFakeID){
jpayne@68 1561 TaxNode tn=SketchObject.taxtree.getNode(c.taxID());
jpayne@68 1562 if(tn!=null){
jpayne@68 1563 PrintTaxonomy.printTaxonomy(tn, sb, SketchObject.taxtree, TaxTree.DOMAIN, SketchObject.skipNonCanonical);
jpayne@68 1564 }
jpayne@68 1565 }
jpayne@68 1566 sb.append('\n');
jpayne@68 1567 }
jpayne@68 1568 }else{
jpayne@68 1569 ArrayList<TaxNode> tnl=new ArrayList<TaxNode>();
jpayne@68 1570 if(SketchObject.taxtree!=null && c.taxID()>=0 && c.taxID()<SketchObject.minFakeID){
jpayne@68 1571 TaxNode tn=SketchObject.taxtree.getNode(c.taxID());
jpayne@68 1572 while(tn!=null && tn.pid!=tn.id && tn.level<=TaxTree.DOMAIN){
jpayne@68 1573 tnl.add(tn);
jpayne@68 1574 tn=SketchObject.taxtree.getNode(tn.pid);
jpayne@68 1575 }
jpayne@68 1576 }
jpayne@68 1577
jpayne@68 1578 sb.append(String.format(Locale.ROOT, "WKID %.2f%%\tKID %.2f%%"+ccs+"\tmatches %d\tcompared %d\t",
jpayne@68 1579 100*c.wkid(), 100*c.kid(), c.hits(), c.minDivisor()));
jpayne@68 1580 sb.append("\ttaxID ").append(c.taxID()).append('\t');
jpayne@68 1581 if(printImg){sb.append("\timgID ").append(c.imgID()).append('\t');}
jpayne@68 1582 sb.append(c.taxName()).append('\t');
jpayne@68 1583 if(printRefFileName){sb.append(c.fname()).append('\t');}
jpayne@68 1584 if(printOriginalName || (c.taxName()==null && c.name0()!=null && !printRefFileName)){sb.append(c.name0()).append('\t');}
jpayne@68 1585
jpayne@68 1586 if(printTax){
jpayne@68 1587 for(int i=tnl.size()-1; i>=0; i--){
jpayne@68 1588 TaxNode tn=tnl.get(i);
jpayne@68 1589 sb.append(tn.name);
jpayne@68 1590 if(i>0){sb.append(';');}
jpayne@68 1591 }
jpayne@68 1592 }
jpayne@68 1593 sb.append('\n');
jpayne@68 1594
jpayne@68 1595 tnl.clear();
jpayne@68 1596 }
jpayne@68 1597 }
jpayne@68 1598
jpayne@68 1599 /*--------------------------------------------------------------*/
jpayne@68 1600 /*---------------- Filtering ----------------*/
jpayne@68 1601 /*--------------------------------------------------------------*/
jpayne@68 1602
jpayne@68 1603 public boolean passesFilter(Sketch sk){
jpayne@68 1604 assert(postParsed);
jpayne@68 1605 if(noFilters){return true;}
jpayne@68 1606 return passesSSUFilter(sk) && passesSizeFilter(sk) && passesTaxFilter(sk) && passesMetaFilter(sk);
jpayne@68 1607 }
jpayne@68 1608
jpayne@68 1609 private boolean passesTaxFilter(Sketch sk){
jpayne@68 1610 if(taxFilterWhite==null && taxFilterBlack==null){return true;}
jpayne@68 1611 int id=sk.taxID;
jpayne@68 1612 if(id>0){
jpayne@68 1613 if(banUnclassified && SketchObject.taxtree.isUnclassified(id)){return false;}
jpayne@68 1614 if(banVirus && SketchObject.taxtree.isVirus(id)){return false;}
jpayne@68 1615 }
jpayne@68 1616 String s=sk.name();
jpayne@68 1617 return passesTaxFilter(taxFilterWhite, id, s) && passesTaxFilter(taxFilterBlack, id, s);
jpayne@68 1618 }
jpayne@68 1619
jpayne@68 1620 private boolean passesTaxFilter(TaxFilter filter, int id, String s){
jpayne@68 1621 if(filter==null){return true;}
jpayne@68 1622 if(id>0 && !filter.passesFilter(id)){return false;}
jpayne@68 1623 // if(id>0 && !filter.passesFilterFast(id)){return false;}
jpayne@68 1624 if(s!=null && !filter.passesFilterByNameOnly(s)){return false;}
jpayne@68 1625 return true;
jpayne@68 1626 }
jpayne@68 1627
jpayne@68 1628 private boolean passesMetaFilter(Sketch sk){
jpayne@68 1629 if(requiredMeta==null && bannedMeta==null){return true;}
jpayne@68 1630 return sk.passesMeta(requiredMeta, bannedMeta, requiredMetaAnd);
jpayne@68 1631 }
jpayne@68 1632
jpayne@68 1633 private boolean passesSSUFilter(Sketch sk){
jpayne@68 1634 return !requireSSU || sk.hasSSU();
jpayne@68 1635 }
jpayne@68 1636
jpayne@68 1637 private boolean passesSizeFilter(Sketch sk){
jpayne@68 1638 if(minRefSizeEstimate>0 && sk.genomeSizeEstimate()<minRefSizeEstimate){return false;}
jpayne@68 1639 return sk.genomeSizeBases>=minRefSizeBases;
jpayne@68 1640 }
jpayne@68 1641
jpayne@68 1642 /*--------------------------------------------------------------*/
jpayne@68 1643 /*---------------- Fields ----------------*/
jpayne@68 1644 /*--------------------------------------------------------------*/
jpayne@68 1645
jpayne@68 1646 //These are shared with SketchObject
jpayne@68 1647 //They do not affect anything and are just for the server to validate remote settings.
jpayne@68 1648 private int hashVersion=SketchObject.HASH_VERSION;
jpayne@68 1649 private int k=SketchObject.k;
jpayne@68 1650 private int k2=SketchObject.k2;
jpayne@68 1651 boolean amino=SketchObject.amino;
jpayne@68 1652 boolean translate=SketchObject.translate;
jpayne@68 1653 boolean sixframes=SketchObject.sixframes;
jpayne@68 1654 private boolean aminoOrTranslate(){return amino | translate;}
jpayne@68 1655
jpayne@68 1656 boolean noFilters=false;
jpayne@68 1657 boolean postParsed=false;
jpayne@68 1658
jpayne@68 1659 boolean amino(){return amino;}
jpayne@68 1660
jpayne@68 1661 //These are unique
jpayne@68 1662 public int maxRecords=default_maxRecords;
jpayne@68 1663 public int recordsPerLevel=0;
jpayne@68 1664 public float minANI=0;
jpayne@68 1665 public int minBases=0;
jpayne@68 1666 public float minSizeRatio=0;
jpayne@68 1667 public float minWKID=default_minWKID;
jpayne@68 1668 public int format=default_format;
jpayne@68 1669
jpayne@68 1670 /** For tracking unique SendSketch queries */
jpayne@68 1671 public int chunkNum=-1;
jpayne@68 1672 public int minHits=default_minHits;
jpayne@68 1673 public int taxLevel=default_taxLevel;
jpayne@68 1674 public int mode=default_mode;
jpayne@68 1675 public float samplerate=default_samplerate;
jpayne@68 1676 public long maxReads=default_maxReads;
jpayne@68 1677 public int minKeyOccuranceCount=default_minKeyOccuranceCount;
jpayne@68 1678 public String inputVersion=null;
jpayne@68 1679
jpayne@68 1680 public String dbName=null;
jpayne@68 1681
jpayne@68 1682 boolean hasMetaFilters(){return requiredMeta!=null || bannedMeta!=null/* || requiredTaxid!=null || bannedTaxid!=null*/;}
jpayne@68 1683 boolean hasTaxFilters(){return taxFilterWhite!=null || taxFilterBlack!=null || banUnclassified || banVirus;}
jpayne@68 1684 boolean requireSSU=false;
jpayne@68 1685 long minRefSizeEstimate=-1;
jpayne@68 1686 long minRefSizeBases=-1;
jpayne@68 1687
jpayne@68 1688 boolean requiredMetaAnd=true;
jpayne@68 1689 ArrayList<String> requiredMeta=null;
jpayne@68 1690 ArrayList<String> bannedMeta=null;
jpayne@68 1691
jpayne@68 1692 /*--------------------------------------------------------------*/
jpayne@68 1693 /*---------------- Print Columns ----------------*/
jpayne@68 1694 /*--------------------------------------------------------------*/
jpayne@68 1695
jpayne@68 1696 public boolean printKID=true;
jpayne@68 1697 public boolean printWKID=true;
jpayne@68 1698 public boolean printSSU=true;
jpayne@68 1699 public boolean printSSULen=false;
jpayne@68 1700 public boolean printSSU(){return SketchObject.processSSU && printSSU;}
jpayne@68 1701 public boolean printSSUSequence=default_printSSUSequence;
jpayne@68 1702
jpayne@68 1703 //For format 2
jpayne@68 1704 public boolean printTax=default_printTax;
jpayne@68 1705 public boolean printOriginalName=default_printOriginalName;
jpayne@68 1706 public boolean printQueryFileName=default_printQueryFileName;
jpayne@68 1707 public boolean printRefFileName=default_printRefFileName;
jpayne@68 1708 public boolean printImg=default_printImg;
jpayne@68 1709 public boolean printAni=default_printAni;
jpayne@68 1710 public boolean printCompleteness=default_printCompleteness;
jpayne@68 1711 public boolean printScore=default_printScore;
jpayne@68 1712 public boolean printEValue=default_printEValue;
jpayne@68 1713
jpayne@68 1714 private boolean trackCounts=default_trackCounts;
jpayne@68 1715 public boolean printDepth=default_printDepth;
jpayne@68 1716 public boolean printDepth2=default_printDepth2;
jpayne@68 1717 public boolean printActualDepth=default_printActualDepth;
jpayne@68 1718 public boolean printVolume=default_printVolume;
jpayne@68 1719 public boolean printRefHits=default_printRefHits;
jpayne@68 1720
jpayne@68 1721 public boolean printLength=default_printLength;
jpayne@68 1722 public boolean printTaxID=default_printTaxID;
jpayne@68 1723 public boolean printGSize=default_printGSize;
jpayne@68 1724 public boolean printGC=default_printGC;
jpayne@68 1725 public boolean gSizeKMG=default_gSizeKMG;
jpayne@68 1726 public boolean printGKmers=default_printGKmers;
jpayne@68 1727 public boolean printCommonAncestor=default_printCommonAncestor;
jpayne@68 1728 public boolean printCommonAncestorLevel=default_printCommonAncestorLevel;
jpayne@68 1729 public boolean printTaxName=default_printTaxName;
jpayne@68 1730 public boolean printGSeqs=default_printGSeqs;
jpayne@68 1731 public boolean printGBases=default_printGBases;
jpayne@68 1732
jpayne@68 1733 public boolean jsonArray=default_jsonArray;
jpayne@68 1734 public boolean printD3=default_printD3;
jpayne@68 1735 public boolean D3LevelNodes=false;
jpayne@68 1736 public int D3sizeMode=D3_HIT_SIZE;
jpayne@68 1737 public static final int D3_HIT_SIZE=0, D3_ANI_SIZE=1, D3_KID_SIZE=2, D3_WKID_SIZE=3, D3_DEPTH_SIZE=4;
jpayne@68 1738
jpayne@68 1739 public float minEntropy=default_minEntropy;
jpayne@68 1740
jpayne@68 1741 //For k=32:
jpayne@68 1742 //0.000095f is >=Q6 (75%); 0.0008 is >=Q7 (80%); 0.0039 is >=Q8 (84%).
jpayne@68 1743 //0.002f is >=Q7.53 (82.3%)
jpayne@68 1744 //0.0017f is >=Q7.44 (82.0%)
jpayne@68 1745 //0.6f works better for Illumina reads but this is more robust for PacBio.
jpayne@68 1746 public float minProb=0.0008f;
jpayne@68 1747 public byte minQual=0;
jpayne@68 1748
jpayne@68 1749 public boolean printUnique=default_printUnique;
jpayne@68 1750 public boolean printUnique2=default_printUnique2;
jpayne@68 1751 public boolean printUnique3=default_printUnique3;
jpayne@68 1752 public boolean printUContam=default_printUContam;
jpayne@68 1753 public boolean printNoHit=default_printNoHit;
jpayne@68 1754
jpayne@68 1755 public boolean printColors=default_printColors;
jpayne@68 1756 public boolean setColors=false;
jpayne@68 1757 public int colorLevel=default_colorLevel;
jpayne@68 1758
jpayne@68 1759 /** TODO: Note this is conflated between printing %contam and calculating things based on contam hits. */
jpayne@68 1760 public boolean printContam=default_printContam;
jpayne@68 1761 public boolean printContam2=default_printContam2;
jpayne@68 1762 private int contamLevel=default_contamLevel;
jpayne@68 1763
jpayne@68 1764 /** Raw fields */
jpayne@68 1765 public boolean printMatches=default_printMatches;
jpayne@68 1766
jpayne@68 1767 public boolean printRefDivisor=false;
jpayne@68 1768 public boolean printQueryDivisor=false;
jpayne@68 1769 public boolean printRefSize=false;
jpayne@68 1770 public boolean printQuerySize=false;
jpayne@68 1771 public boolean printContamHits=false;
jpayne@68 1772
jpayne@68 1773 public boolean mergePairs=false;
jpayne@68 1774 public boolean printIntersection=false;
jpayne@68 1775
jpayne@68 1776 //For format 3 or 5
jpayne@68 1777 public boolean useTaxidName=false;
jpayne@68 1778 public boolean useImgName=false;
jpayne@68 1779 public boolean useTaxName=false;
jpayne@68 1780 public boolean useFilePrefixName=false;
jpayne@68 1781 public boolean reportAniOnly=false;
jpayne@68 1782
jpayne@68 1783 public int taxLevelWhite=0;
jpayne@68 1784 public int taxLevelBlack=0;
jpayne@68 1785
jpayne@68 1786 public String taxFilterWhiteList=null;
jpayne@68 1787 public String taxFilterBlackList=null;
jpayne@68 1788
jpayne@68 1789 public String taxFilterWhiteString=null;
jpayne@68 1790 public String taxFilterBlackString=null;
jpayne@68 1791
jpayne@68 1792 public TaxFilter taxFilterWhite=null;
jpayne@68 1793 public TaxFilter taxFilterBlack=null;
jpayne@68 1794
jpayne@68 1795 public boolean banUnclassified=false;
jpayne@68 1796 public boolean banVirus=false;
jpayne@68 1797
jpayne@68 1798 /** Make sure the settings are consistent, for CompareSketch.
jpayne@68 1799 * This is not yet complete. */
jpayne@68 1800 public boolean checkValid(){
jpayne@68 1801 if(printUnique2 || printUnique3){
jpayne@68 1802 assert(contamLevel()>=TaxTree.SUBSPECIES_E);
jpayne@68 1803 assert(needContamCounts());
jpayne@68 1804 assert(SketchObject.makeIndex);
jpayne@68 1805 assert(SketchObject.taxtree!=null);
jpayne@68 1806 }
jpayne@68 1807 if(printContam2){
jpayne@68 1808 assert(contamLevel()>=TaxTree.SUBSPECIES_E);
jpayne@68 1809 assert(needContamCounts());
jpayne@68 1810 assert(SketchObject.makeIndex);
jpayne@68 1811 assert(SketchObject.taxtree!=null);
jpayne@68 1812 }
jpayne@68 1813 return true;
jpayne@68 1814 }
jpayne@68 1815
jpayne@68 1816 public boolean trackCounts() {
jpayne@68 1817 return trackCounts || printDepth || printDepth2 || printVolume
jpayne@68 1818 || comparator!=Comparison.scoreComparator || printD3; //|| minKeyOccuranceCount>1;
jpayne@68 1819 }
jpayne@68 1820
jpayne@68 1821 public boolean needContamCounts() {
jpayne@68 1822 return printContam || printContam2 || printContamHits || printUnique || printUnique2 || printUnique3 || printUContam || printNoHit; // || true
jpayne@68 1823 }
jpayne@68 1824
jpayne@68 1825 public boolean needIndex(){
jpayne@68 1826 return printContam2 || printUnique2 || printUnique3;
jpayne@68 1827 }
jpayne@68 1828
jpayne@68 1829 public int contamLevel() {
jpayne@68 1830 return needIndex() ? contamLevel : -1;
jpayne@68 1831 }
jpayne@68 1832
jpayne@68 1833 public int compare(Comparison a, Comparison b){
jpayne@68 1834 return comparator.compare(a, b);
jpayne@68 1835 }
jpayne@68 1836
jpayne@68 1837 public Comparator<Comparison> comparator=Comparison.scoreComparator;
jpayne@68 1838
jpayne@68 1839 /*--------------------------------------------------------------*/
jpayne@68 1840 /*---------------- Constants ----------------*/
jpayne@68 1841 /*--------------------------------------------------------------*/
jpayne@68 1842
jpayne@68 1843 public static final int FORMAT_OLD=0, FORMAT_MULTICOLUMN=2, FORMAT_QUERY_REF_ANI=3, FORMAT_JSON=4, FORMAT_CONSTELLATION=5;
jpayne@68 1844 public static final boolean default_printD3=false;
jpayne@68 1845 public static final boolean default_jsonArray=false;
jpayne@68 1846
jpayne@68 1847 public static final int default_maxRecords=20;
jpayne@68 1848 public static final float default_minWKID=0.0001f;
jpayne@68 1849 public static final int default_format=FORMAT_MULTICOLUMN;
jpayne@68 1850 public static final boolean default_printSSUSequence=false;
jpayne@68 1851 public static final boolean default_printTax=false;
jpayne@68 1852 public static final boolean default_printOriginalName=false;
jpayne@68 1853 public static final boolean default_printQueryFileName=true;
jpayne@68 1854 public static final boolean default_printRefFileName=false;
jpayne@68 1855 public static final boolean default_printImg=false;
jpayne@68 1856 public static final boolean default_printAni=true;
jpayne@68 1857 public static final boolean default_printCompleteness=true;
jpayne@68 1858 public static final boolean default_printScore=false;
jpayne@68 1859 public static final boolean default_printEValue=false;
jpayne@68 1860
jpayne@68 1861 public static final boolean default_trackCounts=false;
jpayne@68 1862 public static final boolean default_printDepth=false;
jpayne@68 1863 public static final boolean default_printDepth2=false;
jpayne@68 1864 public static final boolean default_printActualDepth=true;
jpayne@68 1865 public static final boolean default_printVolume=false;
jpayne@68 1866 public static final boolean default_printRefHits=false;
jpayne@68 1867
jpayne@68 1868 public static final boolean default_printContam=true;
jpayne@68 1869 public static final boolean default_printContam2=false;
jpayne@68 1870
jpayne@68 1871 public static final boolean default_printMatches=true;
jpayne@68 1872 public static final boolean default_printLength=false;
jpayne@68 1873 public static final boolean default_printTaxID=true;
jpayne@68 1874 public static final boolean default_printGSize=true;
jpayne@68 1875 public static final boolean default_printGC=false;
jpayne@68 1876 public static final boolean default_gSizeKMG=true;
jpayne@68 1877 public static final boolean default_printGKmers=false;
jpayne@68 1878 public static final boolean default_printCommonAncestor=false;
jpayne@68 1879 public static final boolean default_printCommonAncestorLevel=false;
jpayne@68 1880 public static final boolean default_printTaxName=true;
jpayne@68 1881 public static final boolean default_printGSeqs=true;
jpayne@68 1882 public static final boolean default_printGBases=false;
jpayne@68 1883
jpayne@68 1884 public static final float default_minEntropy=0.66f;
jpayne@68 1885 public static final float default_minEntropy_amino=0.70f;
jpayne@68 1886 public static final float default_minProb=0.0008f;
jpayne@68 1887 public static final byte default_minQual=0;
jpayne@68 1888
jpayne@68 1889 public static final boolean default_printUnique=true;
jpayne@68 1890 public static final boolean default_printUnique2=false;
jpayne@68 1891 public static final boolean default_printUnique3=false;
jpayne@68 1892 public static final boolean default_printUContam=false;
jpayne@68 1893 public static final boolean default_printNoHit=false;
jpayne@68 1894
jpayne@68 1895 public static final boolean default_printColors=true;
jpayne@68 1896 public static final int default_colorLevel=TaxTree.FAMILY_E;
jpayne@68 1897
jpayne@68 1898 public static final int default_taxLevel=TaxTree.SPECIES;
jpayne@68 1899 public static final int default_contamLevel=TaxTree.GENUS_E;
jpayne@68 1900
jpayne@68 1901 public static final int default_mode=SketchObject.ONE_SKETCH;
jpayne@68 1902
jpayne@68 1903 public static final int default_minHits=3;
jpayne@68 1904 public static final float default_samplerate=1;
jpayne@68 1905 public static final long default_maxReads=-1;
jpayne@68 1906 public static final int default_minKeyOccuranceCount=1;
jpayne@68 1907
jpayne@68 1908 }