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 }
|