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.Map.Entry;
|
jpayne@68
|
6 import java.util.concurrent.ConcurrentHashMap;
|
jpayne@68
|
7
|
jpayne@68
|
8 import fileIO.TextStreamWriter;
|
jpayne@68
|
9 import json.JsonObject;
|
jpayne@68
|
10 import shared.Shared;
|
jpayne@68
|
11 import shared.Tools;
|
jpayne@68
|
12 import structures.ByteBuilder;
|
jpayne@68
|
13 import structures.IntHashMap;
|
jpayne@68
|
14 import tax.TaxTree;
|
jpayne@68
|
15
|
jpayne@68
|
16 public class SketchResults extends SketchObject {
|
jpayne@68
|
17
|
jpayne@68
|
18 SketchResults(Sketch s){
|
jpayne@68
|
19 sketch=s;
|
jpayne@68
|
20 }
|
jpayne@68
|
21
|
jpayne@68
|
22 SketchResults(Sketch s, ArrayList<Sketch> sketchList_, int[][] taxHits_){
|
jpayne@68
|
23 sketch=s;
|
jpayne@68
|
24 refSketchList=sketchList_;
|
jpayne@68
|
25 taxHits=taxHits_;
|
jpayne@68
|
26 }
|
jpayne@68
|
27
|
jpayne@68
|
28 /*--------------------------------------------------------------*/
|
jpayne@68
|
29 /*---------------- Methods ----------------*/
|
jpayne@68
|
30 /*--------------------------------------------------------------*/
|
jpayne@68
|
31
|
jpayne@68
|
32 public void addMap(ConcurrentHashMap<Integer, Comparison> map, DisplayParams params, CompareBuffer buffer) {
|
jpayne@68
|
33
|
jpayne@68
|
34 if(map.isEmpty()){return;}
|
jpayne@68
|
35 list=addToList(map, params, list);
|
jpayne@68
|
36
|
jpayne@68
|
37 if((true || params.needContamCounts())){
|
jpayne@68
|
38 recompare(buffer, params);
|
jpayne@68
|
39 }
|
jpayne@68
|
40 }
|
jpayne@68
|
41
|
jpayne@68
|
42 public void recompare(CompareBuffer buffer, DisplayParams params){
|
jpayne@68
|
43 // assert(makeIndex || !AUTOSIZE);
|
jpayne@68
|
44
|
jpayne@68
|
45 assert(!sketch.merged());
|
jpayne@68
|
46 sketch.mergeBitSets();
|
jpayne@68
|
47
|
jpayne@68
|
48 // System.err.println(sketch.compareBitSet());
|
jpayne@68
|
49 // assert(false) : sketch.compareBitSet().getClass();
|
jpayne@68
|
50
|
jpayne@68
|
51 for(Comparison c : list){
|
jpayne@68
|
52 c.recompare(buffer, taxHits, params.contamLevel());
|
jpayne@68
|
53 }
|
jpayne@68
|
54 Collections.sort(list, params.comparator);
|
jpayne@68
|
55 Collections.reverse(list);
|
jpayne@68
|
56 }
|
jpayne@68
|
57
|
jpayne@68
|
58 private static ArrayList<Comparison> addToList(ConcurrentHashMap<Integer, Comparison> map, DisplayParams params, ArrayList<Comparison> old){
|
jpayne@68
|
59
|
jpayne@68
|
60 // System.err.println(map.size());
|
jpayne@68
|
61 // System.err.println(map.keySet());
|
jpayne@68
|
62
|
jpayne@68
|
63 // final TaxFilter white=params.taxFilterWhite;
|
jpayne@68
|
64 // final TaxFilter black=params.taxFilterBlack;
|
jpayne@68
|
65 // final boolean noFilter=(white==null && black==null);
|
jpayne@68
|
66 final int size=map.size();
|
jpayne@68
|
67 ArrayList<Comparison> al=(old==null ? new ArrayList<Comparison>(size) : old);
|
jpayne@68
|
68 for(Entry<Integer, Comparison> e : map.entrySet()){
|
jpayne@68
|
69 final Comparison c=e.getValue();
|
jpayne@68
|
70 al.add(c);
|
jpayne@68
|
71 // if(noFilter || c.passesFilter(white, black)){
|
jpayne@68
|
72 // al.add(c);
|
jpayne@68
|
73 // }
|
jpayne@68
|
74 }
|
jpayne@68
|
75 Shared.sort(al, params.comparator);
|
jpayne@68
|
76 Collections.reverse(al);
|
jpayne@68
|
77
|
jpayne@68
|
78 //Apply records per level filter
|
jpayne@68
|
79 if(params.recordsPerLevel>0 && al.size()>params.recordsPerLevel && al.get(0).hasQueryTaxID()){
|
jpayne@68
|
80 int[] count=new int[TaxTree.numTaxLevelNamesExtended];
|
jpayne@68
|
81 int removed=0;
|
jpayne@68
|
82 for(int i=0; i<al.size(); i++){
|
jpayne@68
|
83 Comparison c=al.get(i);
|
jpayne@68
|
84 int calevel=c.commonAncestorLevelInt();
|
jpayne@68
|
85 count[calevel]++;
|
jpayne@68
|
86 if(count[calevel]>params.recordsPerLevel){
|
jpayne@68
|
87 al.set(i, null);
|
jpayne@68
|
88 removed++;
|
jpayne@68
|
89 }
|
jpayne@68
|
90 }
|
jpayne@68
|
91 if(removed>0){Tools.condenseStrict(al);}
|
jpayne@68
|
92 }
|
jpayne@68
|
93
|
jpayne@68
|
94 final long limit=(params.maxRecords*2+5);
|
jpayne@68
|
95 while(al.size()>limit){
|
jpayne@68
|
96 al.remove(al.size()-1);
|
jpayne@68
|
97 }
|
jpayne@68
|
98 return al;
|
jpayne@68
|
99 }
|
jpayne@68
|
100
|
jpayne@68
|
101 public boolean isEmpty(){
|
jpayne@68
|
102 return list==null || list.isEmpty();
|
jpayne@68
|
103 }
|
jpayne@68
|
104
|
jpayne@68
|
105 /*--------------------------------------------------------------*/
|
jpayne@68
|
106 /*---------------- Tax Methods ----------------*/
|
jpayne@68
|
107 /*--------------------------------------------------------------*/
|
jpayne@68
|
108
|
jpayne@68
|
109 public int primaryTax(int level){
|
jpayne@68
|
110 //I have no idea how to implement this...
|
jpayne@68
|
111 IntHashMap map=new IntHashMap();
|
jpayne@68
|
112 assert(false);
|
jpayne@68
|
113 return -1;
|
jpayne@68
|
114 }
|
jpayne@68
|
115
|
jpayne@68
|
116 /*--------------------------------------------------------------*/
|
jpayne@68
|
117 /*---------------- Print Methods ----------------*/
|
jpayne@68
|
118 /*--------------------------------------------------------------*/
|
jpayne@68
|
119
|
jpayne@68
|
120 private static String recordBreak="\n"; //"\n\n"
|
jpayne@68
|
121
|
jpayne@68
|
122 void writeResults(DisplayParams params, TextStreamWriter tsw){
|
jpayne@68
|
123 ByteBuilder sb=toText(params);
|
jpayne@68
|
124 tsw.print(sb);
|
jpayne@68
|
125 }
|
jpayne@68
|
126
|
jpayne@68
|
127 public ByteBuilder toText(DisplayParams params){
|
jpayne@68
|
128 assert(params.postParsed);
|
jpayne@68
|
129 if(sketch.hasSSU()){
|
jpayne@68
|
130 if(params.comparator==Comparison.SSUComparator){
|
jpayne@68
|
131 alignSSUs(params.maxRecords*4);//This should be enough...
|
jpayne@68
|
132 list.sort(params.comparator);
|
jpayne@68
|
133 Collections.reverse(list);
|
jpayne@68
|
134 }else if(params.printSSU()){
|
jpayne@68
|
135 alignSSUs(params.maxRecords);
|
jpayne@68
|
136 }
|
jpayne@68
|
137 }
|
jpayne@68
|
138 if(params.json()){
|
jpayne@68
|
139 JsonObject j=params.toJson(this);
|
jpayne@68
|
140 return j.toText();
|
jpayne@68
|
141 }
|
jpayne@68
|
142 final ByteBuilder sb=params.queryHeader(sketch);
|
jpayne@68
|
143 if(params.format==DisplayParams.FORMAT_QUERY_REF_ANI || params.format==DisplayParams.FORMAT_CONSTELLATION){
|
jpayne@68
|
144 if(list==null || list.isEmpty()){return sb;}
|
jpayne@68
|
145 int idx=0;
|
jpayne@68
|
146 int prevTaxID=0;
|
jpayne@68
|
147 for(Comparison c : list){
|
jpayne@68
|
148 assert(!params.printSSU() || !c.needsAlignment());
|
jpayne@68
|
149 params.formatComparison(c, sb, prevTaxID);
|
jpayne@68
|
150 prevTaxID=c.taxID();
|
jpayne@68
|
151 idx++;
|
jpayne@68
|
152 if(idx>=params.maxRecords){break;}
|
jpayne@68
|
153 }
|
jpayne@68
|
154 }else{
|
jpayne@68
|
155 sb.append(recordBreak);
|
jpayne@68
|
156
|
jpayne@68
|
157 if(list==null || list.isEmpty()){
|
jpayne@68
|
158 sb.append("No hits.\n");
|
jpayne@68
|
159 }else{
|
jpayne@68
|
160 if(params.format==DisplayParams.FORMAT_MULTICOLUMN){sb.append(params.header()).append('\n');}
|
jpayne@68
|
161 int idx=0;
|
jpayne@68
|
162 int prevTaxID=0;
|
jpayne@68
|
163 for(Comparison c : list){
|
jpayne@68
|
164 params.formatComparison(c, sb, prevTaxID);
|
jpayne@68
|
165 prevTaxID=c.taxID();
|
jpayne@68
|
166 idx++;
|
jpayne@68
|
167 if(idx>=params.maxRecords){break;}
|
jpayne@68
|
168 }
|
jpayne@68
|
169 }
|
jpayne@68
|
170 }
|
jpayne@68
|
171 return sb;
|
jpayne@68
|
172 }
|
jpayne@68
|
173
|
jpayne@68
|
174 /*--------------------------------------------------------------*/
|
jpayne@68
|
175 /*---------------- Alignment ----------------*/
|
jpayne@68
|
176 /*--------------------------------------------------------------*/
|
jpayne@68
|
177
|
jpayne@68
|
178 void alignSSUs(int maxRecords){
|
jpayne@68
|
179 if(!sketch.hasSSU()){return;}
|
jpayne@68
|
180 // if(list!=null && list.size()>0){
|
jpayne@68
|
181 // int idx=0;
|
jpayne@68
|
182 // for(Comparison c : list){
|
jpayne@68
|
183 // c.ssuIdentity();
|
jpayne@68
|
184 // idx++;
|
jpayne@68
|
185 // if(idx>=maxRecords){break;}
|
jpayne@68
|
186 // }
|
jpayne@68
|
187 // }
|
jpayne@68
|
188 assert(alignerPool!=null);
|
jpayne@68
|
189 alignerPool.addJobs(list, maxRecords);
|
jpayne@68
|
190 }
|
jpayne@68
|
191
|
jpayne@68
|
192 /*--------------------------------------------------------------*/
|
jpayne@68
|
193 /*---------------- Fields ----------------*/
|
jpayne@68
|
194 /*--------------------------------------------------------------*/
|
jpayne@68
|
195
|
jpayne@68
|
196 public final Sketch sketch;
|
jpayne@68
|
197 public ArrayList<Sketch> refSketchList;
|
jpayne@68
|
198 public int[][] taxHits;
|
jpayne@68
|
199 public ArrayList<Comparison> list;
|
jpayne@68
|
200 public int totalRecords=0;
|
jpayne@68
|
201
|
jpayne@68
|
202 }
|