1 package org.lcsim.recon.tracking.gtrbase;
2
3
4 import java.util.Set;
5 import java.util.SortedSet;
6 import java.util.TreeSet;
7 import java.util.Iterator;
8 import org.lcsim.recon.tracking.trfbase.Surface;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public class McTrack
31 {
32
33
34 private static McTrackState BadState = new McTrackState();
35
36
37 private int _version;
38
39
40 private SortedSet _states;
41
42
43
44 int _mctrackid;
45
46
47 int _pdgid;
48
49
50
51 int _parentword;
52
53
54
55
56
57 private int find( Surface srf)
58 {
59 int count = 0;
60 for ( Iterator ista=_states.iterator(); ista.hasNext(); )
61 if ( ((McTrackState)ista.next()).track().surface().pureEqual(srf) ) return count++;
62 return -1;
63
64 }
65
66
67
68
69
70
71
72 public McTrack()
73 {
74 }
75
76
77
78
79
80
81 public McTrack(McTrack mct)
82 {
83 _states = new TreeSet();
84 for(Iterator it = mct._states.iterator(); it.hasNext(); )
85 {
86 _states.add(it.next());
87 }
88 _mctrackid = mct._mctrackid;
89 _parentword = mct._parentword;
90 _pdgid = mct._pdgid;
91 }
92
93
94
95
96
97
98
99
100
101
102
103
104 public McTrack( Set states, int mcid, int parentword, int pdgid)
105 {
106 _states = new TreeSet();
107 for(Iterator it = states.iterator(); it.hasNext(); )
108 {
109 _states.add(it.next());
110 }
111 _mctrackid = mcid;
112 _parentword = parentword;
113 _pdgid = pdgid;
114
115 int ok_count = 0;
116 for ( Iterator ista=_states.iterator(); ista.hasNext(); )
117 {
118 if ( ! ((McTrackState)ista.next()).isValid() ) break;
119 ++ok_count;
120 }
121 if( ok_count != _states.size() ) throw new IllegalArgumentException("McTrackStates not valid!");
122 if ( ok_count != _states.size() )
123 _states.clear();
124
125 }
126
127
128
129
130
131
132 public boolean isValid()
133 {
134 if(_states == null) return false;
135 return _states.size()!=0;
136 }
137
138
139
140
141
142
143 public Set states()
144 {
145 TreeSet states = new TreeSet();
146 for(Iterator it = _states.iterator(); it.hasNext(); )
147 {
148 states.add(it.next());
149 }
150 return states;
151 }
152
153
154
155
156
157
158
159 public boolean hasSurface( Surface srf)
160 {
161 return find(srf) != -1;
162 }
163
164
165
166
167
168
169
170
171
172
173
174 public McTrackState state( Surface srf)
175 {
176 for ( Iterator ista=_states.iterator(); ista.hasNext(); )
177 {
178 McTrackState tmp = (McTrackState)ista.next();
179 if ( tmp.track().surface().pureEqual(srf) ) return new McTrackState(tmp);
180 }
181 return BadState;
182 }
183
184
185
186
187
188
189 public void addState(McTrackState state)
190 {
191 if(_states == null) _states = new TreeSet();
192 if(_states.contains(state)) throw new IllegalArgumentException("McTrack already contains this state!");
193 _states.add(new McTrackState(state));
194 }
195
196
197
198
199
200
201 public int mcTrackId()
202 {
203 return _mctrackid;
204 }
205
206
207
208
209
210
211 public void setMcTrackId( int mctrackid)
212 {
213 _mctrackid = mctrackid;
214 }
215
216
217
218
219
220
221
222 public int pdgId()
223 {
224 return _pdgid;
225 }
226
227
228
229
230
231
232 public void setPdgId( int pdgid)
233 {
234 _pdgid = pdgid;
235 }
236
237
238
239
240
241
242
243 public McParent parent()
244 {
245 return new McParent(_parentword);
246 }
247
248
249
250
251
252
253 public void setParent(McParent parent)
254 {
255 _parentword = parent.parentWord();
256 }
257
258
259
260
261
262
263 public void setParent(int parentword)
264 {
265 _parentword = parentword;
266 }
267
268
269
270
271
272
273 public String toString()
274 {
275 StringBuffer sb;
276 if(isValid())
277 {
278 sb = new StringBuffer("McTrack of type ");
279 sb.append(pdgId() + " and track ID " + mcTrackId()+"\n");
280 sb.append( "with " +_states.size() + " MC track states\n\n");
281 for(Iterator it = _states.iterator(); it.hasNext(); )
282 {
283 sb.append(it.next());
284 }
285 }
286 else
287 {
288 sb = new StringBuffer("Invalid McTrack");
289 }
290 return sb.toString();
291 }
292
293
294
295
296
297
298
299 public boolean equals(McTrack mct)
300 {
301 return _states.equals(mct._states);
302 }
303
304
305
306
307
308
309
310
311 public boolean notEquals(McTrack mct)
312 {
313 return !equals(mct);
314 }
315
316 }