Mercurial > repos > rliterman > csp2
comparison CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/tax/TaxNode.java @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
67:0e9998148a16 | 68:5028fdace37b |
---|---|
1 package tax; | |
2 | |
3 import java.io.Serializable; | |
4 import java.util.Comparator; | |
5 | |
6 import shared.Tools; | |
7 | |
8 /** | |
9 * Represents a taxonomic identifier, such as a specific genus. | |
10 * Includes the name, NCBI numeric id, parent id, and taxonomic level. | |
11 * @author Brian Bushnell | |
12 * @date Mar 6, 2015 | |
13 * | |
14 */ | |
15 public class TaxNode implements Serializable{ | |
16 | |
17 /** | |
18 * | |
19 */ | |
20 private static final long serialVersionUID = -4618526038942239246L; | |
21 | |
22 /*--------------------------------------------------------------*/ | |
23 /*---------------- Initialization ----------------*/ | |
24 /*--------------------------------------------------------------*/ | |
25 | |
26 public TaxNode(int id_, String name_){ | |
27 this(id_, -1, -1, -1, name_); | |
28 } | |
29 | |
30 public TaxNode(int id_, int parent_, int level_, int levelExtended_, String name_){ | |
31 id=id_; | |
32 pid=parent_; | |
33 level=level_; | |
34 levelExtended=levelExtended_; | |
35 setOriginalLevel(levelExtended); | |
36 name=name_; | |
37 } | |
38 | |
39 /*--------------------------------------------------------------*/ | |
40 /*---------------- Methods ----------------*/ | |
41 /*--------------------------------------------------------------*/ | |
42 | |
43 /** | |
44 * @param split | |
45 * @param idx | |
46 * @return True if the node's name matches the | |
47 */ | |
48 public boolean matchesName(String[] split, int idx, TaxTree tree) { | |
49 if(idx<0){return true;} | |
50 if(!split[idx].equalsIgnoreCase(name)){return false;} | |
51 return tree.getNode(pid).matchesName(split, idx-1, tree); | |
52 } | |
53 | |
54 @Override | |
55 public String toString(){ | |
56 return "("+id+","+pid+","+countRaw+","+countSum+",'"+levelStringExtended(false)+"',"+(canonical() ? "T" : "F")+",'"+name+"')"; | |
57 } | |
58 | |
59 public boolean equals(TaxNode b){ | |
60 if(id!=b.id || pid!=b.pid || levelExtended!=b.levelExtended || flag!=b.flag){return false;} | |
61 if(name==b.name){return true;} | |
62 if((name==null) != (b.name==null)){return false;} | |
63 return name.equals(b.name); | |
64 } | |
65 | |
66 public long incrementRaw(long amt){ | |
67 if(amt==0){return countRaw;} | |
68 if(verbose){System.err.println("incrementRaw("+amt+") node: "+this);} | |
69 countRaw+=amt; | |
70 assert(countRaw>=0) : "Overflow! "+countRaw+", "+amt; | |
71 return countRaw; | |
72 } | |
73 | |
74 public long incrementSum(long amt){ | |
75 if(amt==0){return countSum;} | |
76 if(verbose){System.err.println("incrementSum("+amt+") node: "+this);} | |
77 countSum+=amt; | |
78 assert(countSum>=0 || amt<0) : "Overflow! "+countSum+", "+amt; | |
79 return countSum; | |
80 } | |
81 | |
82 public boolean isSimple(){ | |
83 return TaxTree.isSimple(levelExtended); | |
84 } | |
85 | |
86 public boolean isSimple2(){ | |
87 return TaxTree.isSimple2(levelExtended); | |
88 } | |
89 | |
90 // public String levelString(){return level<0 ? "unknown" : TaxTree.levelToString(level);} | |
91 | |
92 public String levelStringExtended(boolean original){ | |
93 int x=(original ? originalLevel() : levelExtended); | |
94 return x<0 ? "unknown" : TaxTree.levelToStringExtended(x); | |
95 } | |
96 | |
97 public String levelToStringShort() {return level<0 ? "x" : TaxTree.levelToStringShort(level);} | |
98 | |
99 | |
100 | |
101 public boolean isUnclassified(){ | |
102 return name.startsWith("unclassified"); | |
103 } | |
104 | |
105 public boolean isEnvironmentalSample(){ | |
106 return name.startsWith("environmental"); | |
107 } | |
108 | |
109 /*--------------------------------------------------------------*/ | |
110 /*---------------- Nested Classes ----------------*/ | |
111 /*--------------------------------------------------------------*/ | |
112 | |
113 public static class CountComparator implements Comparator<TaxNode>{ | |
114 | |
115 @Override | |
116 public int compare(TaxNode a, TaxNode b) { | |
117 long x=b.countSum-a.countSum; | |
118 // System.err.println("x="+x+" -> "+Tools.longToInt(x)); | |
119 if(x!=0){return Tools.longToInt(x);} | |
120 return a.levelExtended==b.levelExtended ? a.id-b.id : a.levelExtended-b.levelExtended; | |
121 } | |
122 | |
123 } | |
124 | |
125 /*--------------------------------------------------------------*/ | |
126 /*---------------- Getters ----------------*/ | |
127 /*--------------------------------------------------------------*/ | |
128 | |
129 @Override | |
130 public final int hashCode(){return id;} | |
131 | |
132 /*--------------------------------------------------------------*/ | |
133 | |
134 public boolean canonical(){ | |
135 return (flag&CANON_MASK)==CANON_MASK; | |
136 } | |
137 | |
138 public boolean levelChanged(){ | |
139 return originalLevel()!=levelExtended; | |
140 } | |
141 | |
142 public int originalLevel(){ | |
143 int x=(int)(flag&ORIGINAL_LEVEL_MASK); | |
144 return x==ORIGINAL_LEVEL_MASK ? -1 : x; | |
145 } | |
146 | |
147 public boolean cellularOrganisms(){ | |
148 return id==TaxTree.CELLULAR_ORGANISMS_ID; | |
149 } | |
150 | |
151 // public int numChildren(){ | |
152 // return numChildren; | |
153 // } | |
154 // | |
155 // public int minParentLevelExtended(){ | |
156 // return minParentLevelExtended; | |
157 // } | |
158 // | |
159 // public int maxChildLevelExtended(){ | |
160 // return maxChildLevelExtended; | |
161 // } | |
162 | |
163 int minAncestorLevelIncludingSelf(){ | |
164 return levelExtended<1 ? minParentLevelExtended : levelExtended; | |
165 } | |
166 | |
167 int maxDescendantLevelIncludingSelf(){ | |
168 return levelExtended<1 ? maxChildLevelExtended : levelExtended; | |
169 } | |
170 | |
171 public String simpleName(){ | |
172 if(name==null){return null;} | |
173 StringBuilder sb=new StringBuilder(); | |
174 char last='?'; | |
175 for(int i=0; i<name.length(); i++){ | |
176 char c=name.charAt(i); | |
177 if((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='1' && c<='0')){ | |
178 sb.append(c); | |
179 last=c; | |
180 }else{ | |
181 if(sb.length()>0 && last!=' '){sb.append(' ');} | |
182 last=' '; | |
183 } | |
184 } | |
185 String s=sb.toString().trim(); | |
186 return s.replace(' ', '_'); | |
187 } | |
188 | |
189 public boolean isRanked() {return levelExtended!=TaxTree.NO_RANK_E;} | |
190 | |
191 /*--------------------------------------------------------------*/ | |
192 /*---------------- Setters ----------------*/ | |
193 /*--------------------------------------------------------------*/ | |
194 | |
195 public void setCanonical(boolean b){ | |
196 if(b){flag=flag|CANON_MASK;} | |
197 else{flag=flag&~CANON_MASK;} | |
198 } | |
199 | |
200 public void setOriginalLevel(int x){ | |
201 flag=(flag&~ORIGINAL_LEVEL_MASK)|(x&ORIGINAL_LEVEL_MASK); | |
202 } | |
203 | |
204 /** Return true if changed */ | |
205 boolean discussWithParent(TaxNode parent){ | |
206 final int oldChildLevel=parent.maxChildLevelExtended; | |
207 final int oldParentLevel=minParentLevelExtended; | |
208 parent.maxChildLevelExtended=Tools.max(parent.maxChildLevelExtended, maxDescendantLevelIncludingSelf()); | |
209 minParentLevelExtended=Tools.min(parent.minAncestorLevelIncludingSelf(), minParentLevelExtended); | |
210 return oldChildLevel!=parent.maxChildLevelExtended || oldParentLevel!=minParentLevelExtended; | |
211 } | |
212 | |
213 /*--------------------------------------------------------------*/ | |
214 /*---------------- Fields ----------------*/ | |
215 /*--------------------------------------------------------------*/ | |
216 | |
217 public final int id; | |
218 public final String name; | |
219 public int pid; | |
220 public int level; | |
221 public int levelExtended; | |
222 | |
223 public int numChildren=0; | |
224 public int minParentLevelExtended=TaxTree.LIFE_E; | |
225 public int maxChildLevelExtended=TaxTree.NO_RANK_E; | |
226 | |
227 private long flag=0; | |
228 | |
229 public long countRaw=0; | |
230 public long countSum=0; | |
231 | |
232 /*--------------------------------------------------------------*/ | |
233 /*---------------- Constants ----------------*/ | |
234 /*--------------------------------------------------------------*/ | |
235 | |
236 private static final long ORIGINAL_LEVEL_MASK=63; //bits 0-5 | |
237 private static final long CANON_MASK=64; //bit 6 | |
238 | |
239 /*--------------------------------------------------------------*/ | |
240 /*---------------- Statics ----------------*/ | |
241 /*--------------------------------------------------------------*/ | |
242 | |
243 public static final boolean verbose=false; | |
244 public static final CountComparator countComparator=new CountComparator(); | |
245 | |
246 | |
247 } |