]>
Commit | Line | Data |
---|---|---|
0ca57c2f | 1 | #ifndef _TauolaParticle_h_included_ |
2 | #define _TauolaParticle_h_included_ | |
3 | ||
4 | /** | |
5 | * @class TauolaParticle | |
6 | * | |
7 | * @brief Abstract base class for particle in the event. This class also | |
8 | * handles boosting. | |
9 | * | |
10 | * TauolaParticle is a Tauola representation of a particle. It has virtual | |
11 | * getter and setter methods that need to be implemented by a derived class. | |
12 | * An example of this is TauolaHepMCParticle. In this way it provides an | |
13 | * interface to the information in the Event Record. | |
14 | * | |
15 | * The class is also responsible for decays and contains the polarimetric | |
16 | * vector returned from tauola. All boosting is also done here. | |
17 | * | |
18 | * @author Nadia Davidson | |
19 | * @date 16 June 2008 | |
20 | */ | |
21 | ||
22 | #include <iostream> | |
23 | #include <math.h> | |
24 | #include <vector> | |
25 | ||
26 | #include "DecayList.h" | |
27 | #include "Tauola.h" | |
28 | #include "f_Decay.h" | |
29 | ||
30 | namespace Tauolapp | |
31 | { | |
32 | ||
33 | class TauolaParticle{ | |
34 | ||
35 | public: | |
36 | ||
37 | virtual ~TauolaParticle(){}; | |
38 | ||
39 | /** The same sign as decaying particle pdg ID code | |
40 | given to Tauola object (only meaningful for taus). */ | |
41 | static const int SAME_SIGN=1; | |
42 | ||
43 | /** The opposite sign to decaying particle pdg ID code | |
44 | given to Tauola object (only meaningful for taus). */ | |
45 | static const int OPPOSITE_SIGN=2; | |
46 | ||
47 | /** Sign type is not applicable for this particle | |
48 | (probably it's not a tau). */ | |
49 | static const int NA_SIGN=3; | |
50 | ||
51 | /** Stable particle status */ | |
52 | static const int STABLE=1; | |
53 | ||
54 | /** Decayed particle status */ | |
55 | static const int DECAYED=2; | |
56 | ||
57 | /** History particle status */ | |
58 | static const int HISTORY=3; | |
59 | ||
60 | /** X Axis */ | |
61 | static const int X_AXIS=1; | |
62 | ||
63 | /** Y Axis */ | |
64 | static const int Y_AXIS=2; | |
65 | ||
66 | /** Z Axis */ | |
67 | static const int Z_AXIS=3; | |
68 | ||
69 | /** Z0 particle */ | |
70 | static const int Z0 = 23; | |
71 | ||
72 | /** H particle */ | |
73 | static const int HIGGS = 25; | |
74 | ||
75 | /** A0 particle */ | |
76 | static const int HIGGS_A = 36; | |
77 | ||
78 | /** H+ particle */ | |
79 | static const int HIGGS_PLUS = 37; | |
80 | ||
81 | /** H- particle */ | |
82 | static const int HIGGS_MINUS = -37; | |
83 | ||
84 | ||
85 | /** W+ particle */ | |
86 | static const int W_PLUS = 24; | |
87 | ||
88 | /** W- particle */ | |
89 | static const int W_MINUS = -24; | |
90 | ||
91 | /** photon */ | |
92 | static const int GAMMA = 22; | |
93 | ||
94 | /** tau+ particle */ | |
95 | static const int TAU_PLUS = -15; | |
96 | ||
97 | /** tau- particle */ | |
98 | static const int TAU_MINUS = 15; | |
99 | ||
100 | /** tau neutrino particle */ | |
101 | static const int TAU_NEUTRINO = 16; | |
102 | ||
103 | /** tau antineutrino particle */ | |
104 | static const int TAU_ANTINEUTRINO = -16; | |
105 | ||
106 | ||
107 | /** muon+ particle */ | |
108 | static const int MUON_PLUS = -13; | |
109 | ||
110 | /** muon- particle */ | |
111 | static const int MUON_MINUS = 13; | |
112 | ||
113 | /** muon neutrino particle */ | |
114 | static const int MUON_NEUTRINO = 14; | |
115 | ||
116 | /** muon antineutrino particle */ | |
117 | static const int MUON_ANTINEUTRINO = -14; | |
118 | ||
119 | ||
120 | /** e+ particle */ | |
121 | static const int POSITRON = -11; | |
122 | ||
123 | /** e- particle */ | |
124 | static const int ELECTRON = 11; | |
125 | ||
126 | /** e neutrino particle */ | |
127 | static const int ELECTRON_NEUTRINO = 12; | |
128 | ||
129 | /** e antineutrino particle */ | |
130 | static const int ELECTRON_ANTINEUTRINO = -12; | |
131 | ||
132 | /** up quark */ | |
133 | static const int UP = 2; | |
134 | ||
135 | /** anti-up quark */ | |
136 | static const int ANTIUP = -2; | |
137 | ||
138 | /** down quark */ | |
139 | static const int DOWN = 1; | |
140 | ||
141 | /** anti-down quark */ | |
142 | static const int ANTIDOWN = -1; | |
143 | ||
144 | static const int GLUON = 21; | |
145 | static const int CHARM = 4; | |
146 | static const int TOP = 6; | |
147 | static const int STRANGE = 3; | |
148 | static const int BOTTOM = 5; | |
149 | ||
150 | /** All other particle types*/ | |
151 | static const int OTHER = 0; | |
152 | ||
153 | /** Create a new particle with the same properties as this one. | |
154 | Mothers and daughters will not be linked. */ | |
155 | TauolaParticle * clone(); | |
156 | ||
157 | /** Get the angle between this particle and another particle */ | |
158 | double getAngle(TauolaParticle *); | |
159 | ||
160 | /** Add the 4 momentum of another particle to this particle */ | |
161 | void add(TauolaParticle *); | |
162 | ||
163 | /** Subtract the 4 momentum of another particle from this particle */ | |
164 | void subtract(TauolaParticle *); | |
165 | ||
166 | /** Decay the particle. This calls the decay methods in the | |
167 | interface to (FORTRAN) tauola. */ | |
168 | void decay(); | |
169 | ||
170 | /** Invokes TAUOLA FORTRAN routine DEKAY retrieving the daughters of | |
171 | decayed tau. */ | |
172 | void addDecayToEventRecord(); | |
173 | ||
174 | /** Get whether this particle has the same or opposite sign | |
175 | to the pdg code given to the Tauola object. (Only relevant | |
176 | for tau particles).*/ | |
177 | int getSign(); | |
178 | ||
179 | /** Get the polarimetric vector of this particle in the direction X. | |
180 | (Only relevant for tau particles).*/ | |
181 | double getPolarimetricX(); | |
182 | ||
183 | /** Get the polarimetric vector of this particle in the direction Y. | |
184 | (Only relevant for tau particles).*/ | |
185 | double getPolarimetricY(); | |
186 | ||
187 | /** Get the polarimetric vector of this particle in the direction Z. | |
188 | (Only relevant for tau particles).*/ | |
189 | double getPolarimetricZ(); | |
190 | ||
191 | /** Return whether the particle has any chidren */ | |
192 | bool hasDaughters(); | |
193 | ||
194 | /** Traverse the event structure and find the final version | |
195 | of this particle which does not have a particle of it's own type | |
196 | as it's daughter. eg. Generally the final stable copy */ | |
197 | TauolaParticle * findLastSelf(); | |
198 | ||
199 | /** Traverse the event structure and find the first set of mothers | |
200 | which are not of the same type as this particle. */ | |
201 | std::vector<TauolaParticle *> findProductionMothers(); | |
202 | ||
203 | /** Transform this particles four momentum from the lab frome | |
204 | into the rest frame of the paramter TauolaParticle. **/ | |
205 | void boostToRestFrame(TauolaParticle * boost); | |
206 | ||
207 | /** Transform the four momentum of all the daughters recursively | |
208 | into the frame of the "particle" TauolaParticle. **/ | |
209 | void boostDaughtersToRestFrame(TauolaParticle * boost); | |
210 | ||
211 | ||
212 | /** Transform this particles four momentum from the rest frame of | |
213 | the paramter TauolaParticle, back into the lab frame. **/ | |
214 | void boostFromRestFrame(TauolaParticle * boost); | |
215 | ||
216 | void boostDaughtersFromRestFrame(TauolaParticle * boost); | |
217 | ||
218 | /** Do a Lorenz transformation along the Z axis. */ | |
219 | void boostAlongZ(double pz, double e); | |
220 | ||
221 | /** rotate this particles 4-momentum by an angle phi from | |
222 | the axisis "axis" towards the axis "second_axis". */ | |
223 | void rotate(int axis, double phi, int second_axis=Z_AXIS); | |
224 | ||
225 | void rotateDaughters(int axis, double phi, int second_axis=Z_AXIS); | |
226 | ||
227 | /** Returns the angle around the axis "axis" needed to rotate | |
228 | the four momenum is such a way that the non-Z component | |
229 | disappears and Z>0. This is used to rotating the coordinate | |
230 | system into a frame with only a Z component before calling | |
231 | boostAlongZ().*/ | |
232 | double getRotationAngle(int axis, int second_axis=Z_AXIS); | |
233 | ||
234 | /** Get scalar momentum */ | |
235 | double getP(); | |
236 | ||
237 | /** Get momentum component in the direction of "axis" (x,y,z) */ | |
238 | double getP(int axis); | |
239 | ||
240 | /** Set momentum component in the direction of "axis" (x,y,z) */ | |
241 | void setP(int axis, double p_component); | |
242 | ||
243 | /** Get the invariant mass from the four momentum*/ | |
244 | double getMass(); | |
245 | ||
246 | ||
247 | ||
248 | /********************************************** | |
249 | Beginning of virtual methods | |
250 | ||
251 | ********************************************/ | |
252 | ||
253 | /** remove the ougoing branch from this particles and reset its status to stable */ | |
254 | virtual void undecay(){}; | |
255 | ||
256 | /** check that the 4 momentum in conserved at the vertices producing | |
257 | and ending this particle */ | |
258 | virtual void checkMomentumConservation(){}; | |
259 | ||
260 | /** Optional. Modify particle or decay tree if needed. */ | |
261 | virtual void decayEndgame(){}; | |
262 | ||
263 | /** Returns the px component of the four vector*/ | |
264 | virtual double getPx()=0; | |
265 | ||
266 | /** Returns the py component of the four vector */ | |
267 | virtual double getPy()=0; | |
268 | ||
269 | /** Returns the pz component of the four vector */ | |
270 | virtual double getPz()=0; | |
271 | ||
272 | /** Returns the energy component of the four vector */ | |
273 | virtual double getE()=0; | |
274 | ||
275 | /** Set the px component of the four vector */ | |
276 | virtual void setPx( double px )=0; | |
277 | ||
278 | /** Set the px component of the four vector */ | |
279 | virtual void setPy( double py )=0; | |
280 | ||
281 | /** Set the pz component of the four vector */ | |
282 | virtual void setPz( double pz )=0; | |
283 | ||
284 | /** Set the energy component of the four vector */ | |
285 | virtual void setE( double e )=0; | |
286 | ||
287 | /** Set the mothers of this particle via a vector of TauolaParticle */ | |
288 | virtual void setMothers(std::vector<TauolaParticle*> mothers)=0; | |
289 | ||
290 | /** Set the daughters of this particle via a vector of TauolaParticle */ | |
291 | virtual void setDaughters(std::vector<TauolaParticle*> daughters)=0; | |
292 | ||
293 | /** Returns the mothers of this particle via a vector of TauolaParticle */ | |
294 | virtual std::vector<TauolaParticle*> getMothers()=0; | |
295 | ||
296 | /** Returns the daughters of this particle via a vector of TauolaParticle */ | |
297 | virtual std::vector<TauolaParticle*> getDaughters()=0; | |
298 | ||
299 | /** Set the PDG ID code of this particle */ | |
300 | virtual void setPdgID(int pdg_id)=0; | |
301 | ||
302 | /** Set the mass of this particle */ | |
303 | virtual void setMass(double mass)=0; | |
304 | ||
305 | /** Set the status of this particle */ | |
306 | virtual void setStatus(int status)=0; | |
307 | ||
308 | /** Get the PDG ID code of this particle */ | |
309 | virtual int getPdgID()=0; | |
310 | ||
311 | /** Get the status of this particle */ | |
312 | virtual int getStatus()=0; | |
313 | ||
314 | /** Get the barcode of this particle */ | |
315 | virtual int getBarcode()=0; | |
316 | ||
317 | /** Create a new particle of the same type, with the given | |
318 | properties. The new particle bares no relations to this | |
319 | particle, but it provides a way of creating a intance of | |
320 | the derived class. eg. createNewParticle() is used inside | |
321 | filhep_() so that an eg. TauolaHepMCParticle is created without | |
322 | the method having explicit knowledge of the TauolaHepMCParticle | |
323 | class */ | |
324 | virtual TauolaParticle * createNewParticle(int pdg_id, int status, | |
325 | double mass, double px, | |
326 | double py, double pz, | |
327 | double e)=0; | |
328 | ||
329 | /** Print some information about this particle to standard output */ | |
330 | virtual void print()=0; | |
331 | ||
332 | private: | |
333 | ||
334 | /** The polarimetric vector of this particle in the direction X. | |
335 | (Only relevant for tau particles). */ | |
336 | double m_pol_x; | |
337 | ||
338 | /** The polarimetric vector of this particle in the direction Y. | |
339 | (Only relevant for tau particles). */ | |
340 | double m_pol_y; | |
341 | ||
342 | /** The polarimetric vector of this particle in the direction Z. | |
343 | (Only relevant for tau particles). */ | |
344 | double m_pol_z; | |
345 | ||
346 | /** Fourth component of the polarimetric vector. Should be the | |
347 | normalisation (1). (Only relevant for tau particles). */ | |
348 | double m_pol_n; | |
349 | }; | |
350 | ||
351 | } // namespace Tauolapp | |
352 | #endif | |
353 |