View Javadoc

1   package org.lcsim.event.base;
2   
3   import static java.lang.Math.abs;
4   
5   /**
6    * 
7    * This class provides static utility methods for determining the type of a particle based on the PDGID.  It based 
8    * on the primary document on PDGIDs issued by the Particle Data Group and also on some code from the ATLAS LXR.
9    * 
10   * <h2>References</h2>
11   * <ul> 
12   * <li><a href="http://pdg.lbl.gov/2007/mcdata/mc_particle_id_contents.html">PDG Numbering Scheme</a></li>
13   * <li><a href="http://alxr.usatlas.bnl.gov/lxr/source/atlas/PhysicsAnalysis/MuonID/MuonIDValidation/MuonIDValidation/pdg.h">pdg.h</a></li>
14   * <li><a href="http://alxr.usatlas.bnl.gov/lxr/source/atlas/PhysicsAnalysis/MuonID/MuonIDValidation/src/pdg.cxx">pdg.cxx</a></li>
15   * </ul>
16   * 
17   * @author Jeremy McCormick <jeremym@slac.stanford.edu>
18   * @version $Id: ParticleTypeClassifier.java,v 1.3 2011/08/24 18:51:17 jeremy Exp $
19   *
20   */
21  public final class ParticleTypeClassifier 
22  {
23  	/**
24  	 * Class is 100% static utility methods
25  	 * so it should not be instantiated.
26  	 */
27  	private ParticleTypeClassifier()
28  	{}
29  
30  	/**
31  	 * True if <code>p</code> is a lepton.
32  	 * Checks that <code>p</code> is between 11 and 18.
33  	 * @param p The PDGID.
34  	 * @return True if <code>p</code> is a lepton.
35  	 */
36  	public static boolean isLepton(int p)
37  	{
38  		return p > 10 && p < 19;
39  	}
40  	
41  	/**
42  	 * True if <code>p</code> is a charged lepton.
43  	 * @param p The PDGID.
44  	 * @return True if <code>p</code> is a charged lepton.
45  	 */
46  	public static boolean isChargedLepton(int p)
47  	{
48  		int pp = abs(p);
49  		return pp == 11 || pp == 13 || pp == 15 || pp == 17;
50  	}
51  	
52  	/**
53  	 * True if <code>p</code> is a neutrino.
54  	 * Checks that <code>p</code> is odd. 
55  	 * @param p
56  	 * @return
57  	 */
58  	public static boolean isNeutrino(int p)
59  	{
60  		int pp = abs(p);
61  		return pp == 12 || pp == 14 || pp == 16 || pp == 18;
62  	}
63  	
64  	/**
65  	 * True if <code>p</code> is an electron.
66  	 * @param p
67  	 * @return
68  	 */
69  	public static boolean isElectron(int p)
70  	{
71  		return p == 11;
72  	}
73  			
74  	/**
75  	 * True if <code>p</code> is a positron.
76  	 * @param p The PDGID.
77  	 * @return True if <code>p</code> is a postitron.
78  	 */
79  	public static boolean isPositron(int p)
80  	{
81  		return p == -11;
82  	}
83  	
84  	/**
85  	 * True if <code>p</code> is a muon.
86  	 * @param p The PDGID.
87  	 * @return True if <code>p</code> is a muon.
88  	 */
89  	public static boolean isMuon(int p)
90  	{
91  		return abs(p) == 13;
92  	}
93  	
94  	/**
95  	 * True if <code>p</code> is a tau.
96  	 * @param p The PDGID.
97  	 * @return True if <code>p</code> is a tau.
98  	 */
99  	public static boolean isTau(int p)
100 	{
101 		return abs(p) == 15;
102 	}
103 	
104 	/**
105 	 * True if <code>p</code> is a photon.
106 	 * @param p The PDGID.
107 	 * @return True if <code>p</code> is a photon.
108 	 */
109 	public static boolean isPhoton(int p)
110 	{
111 		return p == 22;
112 	}
113 	 		
114 	/**
115 	 * True if <code>p</code> is an electron or photon.
116 	 * @param p The PDGID.
117 	 * @return True if <code>p</code> is an electron or photon.
118 	 */
119 	public static boolean isEM(int p)
120 	{
121 		return isElectron(p) || isPhoton(p);
122 	}
123 	
124 	/**
125 	 * True if <code>p</code> is a boson.
126 	 * @param p The PDGID.
127 	 * @return True if <code>p</code> is a boson.
128 	 */
129 	public static boolean isBoson(int p)
130 	{
131 		int pp = abs(p);
132 		return pp > 20 && pp < 38;
133 	}
134 			
135 	/**
136 	 * True if <code>p</code> is a quark.
137 	 * @param p
138 	 * @return
139 	 */
140 	public static boolean isQuark(int p)
141 	{
142 		int pp = abs(p);
143 		return pp > 0 && pp < 9;
144 	}
145 	
146 	/**
147 	 * True if <code>p</code> is a hadron.
148 	 * @param p The PDGID.
149 	 * @return True if <code>p</code> is a hadron.
150 	 * FIXME: This may be incorrect.  Needs to be checked.
151 	 */
152 	public static boolean isHadron(int p)
153 	{
154 		int pp = abs(p);
155 		return pp > 100 && (pp < 1000000 || pp > 9000000) && (pp % 10 != 0);
156 	}
157 	
158 	/**
159 	 * True if <code>p</code> is a proton.
160 	 * @param p The PDGID.
161 	 * @return True if <code>p</code> is a proton.
162 	 */
163 	public static boolean isProton(int p)
164 	{
165 		return p == 2212;		
166 	}
167 
168 	/**
169 	 * True if <code>p</code> is an antiproton.
170 	 * @param p The PDGID.
171 	 * @return True if <code>p</code> is a antiproton.
172 	 */
173 	public static boolean isAntiProton(int p)
174 	{
175 		return p == -2212;
176 	}
177 	
178 	/**
179 	 * True if <code>p</code> is a neutron.
180 	 * @param p The PDGID.
181 	 * @return True if <code>p</code> is a neutron.
182 	 */
183 	public static boolean isNeutron(int p)
184 	{
185 		return p == 2112;
186 	}
187 	
188 	/**
189 	 * True if <code>p</code> is an antineutron.
190 	 * @param p The PDGID.
191 	 * @return True if <code>p</code> is an antineutron.
192 	 */
193 	public static boolean isAntiNeutron(int p)
194 	{
195 		return p == -2112;
196 	}
197 
198 	/**
199 	 * True if <code>p</code> is a kaon.
200 	 * @param p The PDGID.
201 	 * @return True if <code>p</code> is an antineutron.
202 	 */
203 	public static boolean isKaon(int p)
204 	{
205 		return p == 130 || p == 310 || p == 311 || abs(p) == 321;
206 	}
207 	
208 	/**
209 	 * True if <code>p</code> is a charged kaon.
210 	 * @param p The PDGID.
211 	 * @return True if particle is a charged kaon.
212 	 */
213 	public static boolean isChargedKaon(int p)
214 	{
215 		return abs(p) == 321;
216 	}
217 			
218 	/**
219 	 * True if <code>p</code> is an UD hadron.
220 	 * @param p The PDGID.
221 	 * @return True if <code>p</code> is an UD hadron.
222 	 */
223 	public static boolean isUDHadron(int p)
224 	{
225 		int flavor = flavor(p);
226 		return isHadron(p) && (flavor == 1 || flavor == 2);
227 	}
228 	
229 	/**
230 	 * True if <code>p</code> is an S hadron.
231 	 * @param p The PDGID.
232 	 * @return True if <code>p</code> is an S hadron.
233 	 */
234 	public static boolean isSHadron(int p)
235 	{
236 		return isHadron(p) && flavor(p) == 3;
237 	}
238 	
239 	/**
240 	 * True if <code>p</code> is a C hadron.
241 	 * @param p The PDGID.
242 	 * @return True if <code>p</code> is a C hadron.
243 	 */
244 	public static boolean isCHadron(int p)
245 	{
246 		return isHadron(p) && flavor(p) == 4;
247 	}
248 	
249 	/**
250 	 * True if <code>p</code> is a B hadron.
251 	 * @param p The PDGID.
252 	 * @return True if <code>p</code> is a B hadron.
253 	 */
254 	public static boolean isBHadron(int p)
255 	{
256 		return isHadron(p) && flavor(p) == 5;
257 	}
258 	
259 	/**
260 	 * True if <code>p</code> is a down quark.
261 	 * @param p The PDGID.
262 	 * @return True if <code>p</code> is a down quark.
263 	 */
264 	public static boolean isDownQuark(int p)
265 	{
266 		return abs(p) == 1;
267 	}
268 	
269 	/**
270 	 * True if <code>p</code> is an up quark.
271 	 * @param p The PDGID.
272 	 * @return True if <code>p</code> is a up quark.
273 	 */
274 	public static boolean isUpQuark(int p)
275 	{
276 		return abs(p) == 2;
277 	}
278 	
279 	/**
280 	 * True if <code>p</code> is a strange quark.
281 	 * @param p The PDGID.
282 	 * @return True if <code>p</code> is a strange quark.
283 	 */
284 	public static boolean isStrangeQuark(int p)
285 	{
286 		return abs(p) == 3;
287 	}
288 	
289 	/**
290 	 * True if <code>p</code> is a charm quark.
291 	 * @param p The PDGID.
292 	 * @return True if <code>p</code> is a charm quark.
293 	 */
294 	public static boolean isCharmQuark(int p)
295 	{
296 		return abs(p) == 4;
297 	}
298 	
299 	/**
300 	 * True if <code>p</code> is a bottom quark.
301 	 * @param p The PDGID.
302 	 * @return True if <code>p</code> is a bottom quark.
303 	 */
304 	public static boolean isBottomQuark(int p)
305 	{
306 		return abs(p) == 5;
307 	}
308 		
309 	/**
310 	 * True if <code>p</code> is a top quark.
311 	 * @param p The PDGID.
312 	 * @return True if <code>p</code> is a top quark.
313 	 */
314 	public static boolean isTopQuark(int p)
315 	{
316 		return abs(p) == 6;
317 	}		
318 	
319 	/**
320 	 * True if particle is a K0L or a K0S.
321 	 * @param p
322 	 * @return
323 	 */
324 	public static boolean isNeutralKaon(int p)
325 	{
326 		return p == 130 || p == 310;
327 	}
328 	
329 	/**
330 	 * True if <code>p</code> is an ion or nucleus.
331 	 * @param p The PDGID.
332 	 * @return True if <code>p</code> is an ion or nucleus.
333 	 * FIXME: This relies on the PDGID of ions and nuclei being 0, which may 
334 	 *        not be completely accurate.  For instance, geantinos have a PDGID
335 	 *        of 0 also, so it may not be correct for all cases.
336 	 */
337 	public static boolean isIon(int p)
338 	{
339 		return p == 0;
340 	}		
341 	
342 	/**
343 	 * True if <code>p</code> is a Z boson.
344 	 * @param p The PDGID.
345 	 * @return True if <code>p</code> is a Z boson.
346 	 */
347 	public static boolean isZBoson(int p)
348 	{
349 		return p == 23;
350 	}
351 	
352 	/**
353 	 * True if <code>p</code> is a W boson.
354 	 * @param p The PDGID.
355 	 * @return True if <code>p</code> is a W boson.
356 	 */
357 	public static boolean isWBoson(int p)
358 	{
359 		return abs(p) == 24;
360 	}	
361 	
362 	/**
363 	 * True if <code>p</code> is any type of Higgs boson.
364 	 * @param p The PDGID.
365 	 * @return True if <code>p</code> is a Higgs boson.
366 	 */
367 	public static boolean isHiggs(int p)
368 	{
369 		int pp = abs(p);
370 		return pp == 25 || pp == 35 || pp == 36 || pp == 37; 
371 	}
372 	
373 	/**
374 	 * True if <code>p</code> is a SUSY particle.
375 	 * @param p The PDGID.
376 	 * @return True if <code>p</code> is a SUSY particle.
377 	 */
378 	public static boolean isSUSY(int p)
379 	{
380 		return p > 1000000 && p < 2000015;
381 	}
382 	
383 	/**
384 	 * True if <code>p</code> is a Technicolor particle.
385 	 * @param p The PDGID.
386 	 * @return True if <code>p</code> is a Technicolor particle.
387 	 */
388 	public static boolean isTechnicolor(int p)
389 	{
390 		int pp = abs(p);
391 		return pp > 3000110 && pp < 3000224;
392 	}
393 	
394 	/**
395 	 * Get the flavor of a hadron indicating its quark content.
396 	 * This method is only used internally.
397 	 * @param p The PDGID.
398 	 * @return The flavor of the particle.
399 	 */
400 	static int flavor(int p)
401 	{
402 		int rid = abs(p) % 10000;
403 		int flavor = 0;
404 		if (rid > 999)
405 		{
406 			flavor = rid / 1000;
407 		}
408 		else
409 		{
410 			int flavor1 = rid / 100;
411 			int flavor2 = (rid % 100) / 10;
412 			flavor = flavor1;
413 			if (flavor1 == flavor2 && flavor1 < 4)
414 			{
415 				flavor = 1;
416 			}
417 			if (p == 130) flavor = 3;
418 		}
419 		return flavor;
420 	}	
421 }