]>
Commit | Line | Data |
---|---|---|
1 | #include "AliAODMCParticle.h" | |
2 | #include "AliAODMCHeader.h" | |
3 | #include "AliAODConversionPhoton.h" | |
4 | #include "AliKFConversionPhoton.h" | |
5 | ||
6 | using namespace std; | |
7 | ||
8 | ClassImp(AliAODConversionPhoton) | |
9 | ||
10 | AliAODConversionPhoton::AliAODConversionPhoton() : | |
11 | AliAODConversionParticle(), | |
12 | AliConversionPhotonBase(), | |
13 | fDCArPrimVtx(0), | |
14 | fDCAzPrimVtx(0), | |
15 | fCaloPhoton(0), | |
16 | fCaloClusterRef(-1), | |
17 | fNCaloPhotonMCLabels(0), | |
18 | fNCaloPhotonMotherMCLabels(0), | |
19 | fCaloPhotonMCFlags(0) | |
20 | { | |
21 | // initialize calo photon MC labels | |
22 | for (Int_t i =0; i<20; i++){ | |
23 | fCaloPhotonMCLabels[i]=-1; | |
24 | } | |
25 | for (Int_t i =0; i<20; i++){ | |
26 | fCaloPhotonMotherMCLabels[i]=-1; | |
27 | } | |
28 | //Standard constructor | |
29 | } | |
30 | ||
31 | AliAODConversionPhoton::AliAODConversionPhoton(AliKFConversionPhoton *kfphoton) : | |
32 | AliAODConversionParticle(kfphoton), | |
33 | AliConversionPhotonBase(*((AliConversionPhotonBase*)kfphoton)), | |
34 | fDCArPrimVtx(0), | |
35 | fDCAzPrimVtx(0), | |
36 | fCaloPhoton(0), | |
37 | fCaloClusterRef(-1), | |
38 | fNCaloPhotonMCLabels(0), | |
39 | fNCaloPhotonMotherMCLabels(0), | |
40 | fCaloPhotonMCFlags(0) | |
41 | { | |
42 | //Constructor from kfphoton | |
43 | ||
44 | // puts the mass to zero and store dilepton mass | |
45 | SetMass(kfphoton->M()); | |
46 | ||
47 | //SetE(P()); | |
48 | ||
49 | // initialize calo photon MC labels | |
50 | for (Int_t i =0; i<20; i++){ | |
51 | fCaloPhotonMCLabels[i]=-1; | |
52 | } | |
53 | for (Int_t i =0; i<20; i++){ | |
54 | fCaloPhotonMotherMCLabels[i]=-1; | |
55 | } | |
56 | ||
57 | } | |
58 | ||
59 | AliAODConversionPhoton::AliAODConversionPhoton(TLorentzVector *vec) : | |
60 | AliAODConversionParticle(vec), | |
61 | AliConversionPhotonBase(), | |
62 | fDCArPrimVtx(0), | |
63 | fDCAzPrimVtx(0), | |
64 | fCaloPhoton(0), | |
65 | fCaloClusterRef(-1), | |
66 | fNCaloPhotonMCLabels(0), | |
67 | fNCaloPhotonMotherMCLabels(0), | |
68 | fCaloPhotonMCFlags(0) | |
69 | { | |
70 | //Constructor from TLorentzVector | |
71 | ||
72 | // initialize calo photon MC labels | |
73 | for (Int_t i =0; i<20; i++){ | |
74 | fCaloPhotonMCLabels[i]=-1; | |
75 | } | |
76 | for (Int_t i =0; i<20; i++){ | |
77 | fCaloPhotonMotherMCLabels[i]=-1; | |
78 | } | |
79 | } | |
80 | ||
81 | ||
82 | ||
83 | AliAODConversionPhoton::AliAODConversionPhoton(const AliAODConversionPhoton & original) : | |
84 | AliAODConversionParticle(original), | |
85 | AliConversionPhotonBase(original), | |
86 | fDCArPrimVtx(original.fDCArPrimVtx), | |
87 | fDCAzPrimVtx(original.fDCAzPrimVtx), | |
88 | fCaloPhoton(original.fCaloPhoton), | |
89 | fCaloClusterRef(original.fCaloClusterRef), | |
90 | fNCaloPhotonMCLabels(original.fNCaloPhotonMCLabels), | |
91 | fNCaloPhotonMotherMCLabels(original.fNCaloPhotonMotherMCLabels), | |
92 | fCaloPhotonMCFlags(original.fCaloPhotonMCFlags) | |
93 | { | |
94 | //Copy constructor | |
95 | ||
96 | // initialize calo photon MC labels | |
97 | for (Int_t i =0; i<20; i++){ | |
98 | fCaloPhotonMCLabels[i]=original.fCaloPhotonMCLabels[i]; | |
99 | } | |
100 | for (Int_t i =0; i<20; i++){ | |
101 | fCaloPhotonMotherMCLabels[i]=original.fCaloPhotonMotherMCLabels[i]; | |
102 | } | |
103 | } | |
104 | ||
105 | AliAODConversionPhoton::~AliAODConversionPhoton() | |
106 | { | |
107 | // empty standard destructor | |
108 | } | |
109 | ||
110 | AliAODConversionPhoton & AliAODConversionPhoton::operator = (const AliAODConversionPhoton & /*source*/) | |
111 | { | |
112 | // assignment operator | |
113 | return *this; | |
114 | } | |
115 | ||
116 | ///________________________________________________________________________ | |
117 | void AliAODConversionPhoton::CalculateDistanceOfClossetApproachToPrimVtx(const AliVVertex* primVertex ){ | |
118 | ||
119 | Double_t primCo[3] = {primVertex->GetX(),primVertex->GetY(),primVertex->GetZ()}; | |
120 | ||
121 | Double_t absoluteP = TMath::Sqrt(TMath::Power(GetPx(),2) + TMath::Power(GetPy(),2) + TMath::Power(GetPz(),2)); | |
122 | Double_t p[3] = {GetPx()/absoluteP,GetPy()/absoluteP,GetPz()/absoluteP}; | |
123 | Double_t CP[3]; | |
124 | ||
125 | CP[0] = fConversionPoint[0] - primCo[0]; | |
126 | CP[1] = fConversionPoint[1] - primCo[1]; | |
127 | CP[2] = fConversionPoint[2] - primCo[2]; | |
128 | ||
129 | Double_t Lambda = - (CP[0]*p[0]+CP[1]*p[1]+CP[2]*p[2])/(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]); | |
130 | ||
131 | Double_t S[3]; | |
132 | S[0] = fConversionPoint[0] + p[0]*Lambda; | |
133 | S[1] = fConversionPoint[1] + p[1]*Lambda; | |
134 | S[2] = fConversionPoint[2] + p[2]*Lambda; | |
135 | ||
136 | fDCArPrimVtx = TMath::Sqrt( TMath::Power(primCo[0]-S[0],2) + TMath::Power(primCo[1]-S[1],2)); | |
137 | fDCAzPrimVtx = primCo[2]-S[2]; | |
138 | ||
139 | return; | |
140 | } | |
141 | ||
142 | ||
143 | void AliAODConversionPhoton::SetCaloPhotonMCFlags(AliStack *MCStack){ | |
144 | ||
145 | Bool_t isPhoton = kFALSE; // largest contribution to cluster is photon | |
146 | Bool_t isElectron = kFALSE; // largest contribution to cluster is electron | |
147 | Bool_t isConversion = kFALSE; // largest contribution to cluster is converted electron | |
148 | Bool_t isConversionFullyContained = kFALSE; // largest contribution to cluster is converted electron, second electron has been found in same cluster | |
149 | Bool_t isMerged = kFALSE; // cluster contains more than one particle from the same decay | |
150 | Bool_t isMergedPartConv = kFALSE; // cluster contains more than one particle from the same decay and at least one of the particles came from a conversion | |
151 | Bool_t isDalitz = kFALSE; // this cluster was created by a particle stemming from a dalitz decay | |
152 | Bool_t isDalitzMerged = kFALSE; // this cluster was created by a particle stemming from a dalitz decay and more than one particle of the dalitz decay is contained in the cluster | |
153 | Bool_t isPhotonWithElecMother = kFALSE; // this cluster is from a photon with an electron as mother | |
154 | Bool_t isShower = kFALSE; // this cluster contains as a largest contribution a particle from a shower or radiative process | |
155 | Bool_t isSubLeadingEM = kFALSE; // cluster contains at least one electron or photon from a pi0, eta or eta_prime in subleading contribution | |
156 | ||
157 | TParticle* Photon; | |
158 | if (fNCaloPhotonMCLabels==0) return; | |
159 | Photon = MCStack->Particle(GetCaloPhotonMCLabel(0)); | |
160 | ||
161 | if(Photon == NULL){ | |
162 | return; | |
163 | } | |
164 | ||
165 | Int_t particleMotherLabel = Photon->GetMother(0); | |
166 | Int_t particleGrandMotherLabel = -1; | |
167 | Int_t particleMotherPDG = -1; | |
168 | Int_t particleGrandMotherPDG = -1; | |
169 | Int_t particleMotherNDaugthers = 0; | |
170 | Int_t particleGrandMotherNDaugthers = 0; | |
171 | if (particleMotherLabel > -1){ | |
172 | particleMotherNDaugthers = MCStack->Particle(Photon->GetMother(0))->GetNDaughters(); | |
173 | particleGrandMotherLabel = MCStack->Particle(Photon->GetMother(0))->GetMother(0); | |
174 | particleMotherPDG = MCStack->Particle(Photon->GetMother(0))->GetPdgCode(); | |
175 | if (particleGrandMotherLabel > -1){ | |
176 | particleGrandMotherPDG = MCStack->Particle(MCStack->Particle(Photon->GetMother(0))->GetMother(0))->GetPdgCode(); | |
177 | particleGrandMotherNDaugthers = MCStack->Particle(MCStack->Particle(Photon->GetMother(0))->GetMother(0))->GetNDaughters(); | |
178 | } | |
179 | } | |
180 | ||
181 | //determine mother/grandmother of leading particle and if it is pion/eta/eta_prime: fill array fCaloPhotonMotherMCLabels at position 0 | |
182 | if (particleMotherLabel > -1){ | |
183 | if( abs(particleMotherPDG) == 111 || abs(particleMotherPDG) == 221 || abs(particleMotherPDG) == 331 ){ | |
184 | fCaloPhotonMotherMCLabels[0] = particleMotherLabel; | |
185 | fNCaloPhotonMotherMCLabels++; | |
186 | } | |
187 | else if (particleGrandMotherLabel > -1){ | |
188 | if ( abs(particleMotherPDG) == 22 && (abs(particleGrandMotherPDG) == 111 || abs(particleGrandMotherPDG) == 221 || abs(particleGrandMotherPDG) == 331) ){ | |
189 | fCaloPhotonMotherMCLabels[0] = particleGrandMotherLabel; | |
190 | fNCaloPhotonMotherMCLabels++; | |
191 | } | |
192 | } | |
193 | } | |
194 | ||
195 | // Check whether the first contribution was photon | |
196 | if(abs(MCStack->Particle(GetCaloPhotonMCLabel(0))->GetPdgCode()) == 22){ | |
197 | isPhoton=kTRUE; | |
198 | // did it decay via the dalitz channel | |
199 | if (particleMotherLabel > -1 && particleMotherNDaugthers == 3) isDalitz = kTRUE; | |
200 | // Test whether particle stems from a shower or radiation | |
201 | if (abs(particleMotherPDG) == 11){ // check whether photon stems from electron | |
202 | isPhotonWithElecMother = kTRUE; | |
203 | if (particleGrandMotherLabel > -1){ // test whether first particle has a grandmother | |
204 | if (abs(particleGrandMotherPDG) == 22 ) isShower = kTRUE; // check whether grandmother is a photon (meaning this is most likely a shower) | |
205 | } | |
206 | } | |
207 | } | |
208 | // Check whether the first contribution was electron | |
209 | if( abs(MCStack->Particle(GetCaloPhotonMCLabel(0))->GetPdgCode()) == 11 ){ | |
210 | isElectron=kTRUE; | |
211 | if (particleMotherLabel > -1) { | |
212 | // was it a conversion | |
213 | if (abs(particleMotherPDG) == 22) isConversion = kTRUE; | |
214 | // did it decay via the dalitz channel | |
215 | if (particleGrandMotherLabel > -1 && particleGrandMotherNDaugthers == 3 ) isDalitz = kTRUE; | |
216 | } | |
217 | if (particleGrandMotherLabel > -1){ // check whether electron has a grandmother | |
218 | if (abs(particleGrandMotherPDG) == 11 || abs(particleGrandMotherPDG) == 22){ // test whether electron has photon or electron as grandmother (meaning will most likely be a shower) | |
219 | isShower = kTRUE; | |
220 | } | |
221 | } | |
222 | } | |
223 | ||
224 | ||
225 | // check whether there were other contributions to the cluster | |
226 | if (fNCaloPhotonMCLabels>1){ | |
227 | TParticle* dummyPart =NULL; | |
228 | for (Int_t i = 1; i< fNCaloPhotonMCLabels; i++){ | |
229 | if (i > 19) continue; // abort if more than 20 entries to the cluster have been checked (more are not stored in these objects) | |
230 | dummyPart = MCStack->Particle(GetCaloPhotonMCLabel(i)); | |
231 | Int_t dummyPartMotherLabel = dummyPart->GetMother(0); | |
232 | Int_t dummyPartGrandMotherLabel = -1; | |
233 | Int_t dummyPartMotherPDG = -1; | |
234 | Int_t dummyPartGrandMotherPDG = -1; | |
235 | // check whether this particle has a mother & obtain the pdg code | |
236 | if (dummyPartMotherLabel > -1){ | |
237 | dummyPartGrandMotherLabel = MCStack->Particle(dummyPart->GetMother(0))->GetMother(0); | |
238 | dummyPartMotherPDG = MCStack->Particle(dummyPart->GetMother(0))->GetPdgCode(); | |
239 | // check whether this particle has a grandmother & obtain its pdg code | |
240 | if (dummyPartGrandMotherLabel > -1){ | |
241 | dummyPartGrandMotherPDG = MCStack->Particle(MCStack->Particle(dummyPart->GetMother(0))->GetMother(0))->GetPdgCode(); | |
242 | } | |
243 | } | |
244 | // largest contribution was from photon and is not from shower or electron mother | |
245 | if (isPhoton && (!isShower || !isPhotonWithElecMother )){ | |
246 | if (dummyPartMotherLabel > -1 && particleMotherLabel > -1){ // test whether first particle has a mother | |
247 | if (dummyPartMotherLabel == particleMotherLabel) isMerged = kTRUE; // test whether current and first particle have the same mother => i.e. other gamma from decay or dalitz electron | |
248 | if (dummyPartGrandMotherLabel > -1){ // test whether first particle has a grandmother | |
249 | // check whether particle is an electron from a conversion of a photon from the original mother | |
250 | if (abs(dummyPart->GetPdgCode()) == 11 && dummyPartGrandMotherLabel == particleMotherLabel ) isMergedPartConv = kTRUE; | |
251 | // check whether particle is an electron from a dalitz decay from the original mother | |
252 | if (abs(dummyPart->GetPdgCode()) == 11 && dummyPartMotherLabel == particleMotherLabel ) isDalitzMerged = kTRUE; | |
253 | } | |
254 | } | |
255 | } | |
256 | ||
257 | // largest contribution was from electron & not a from a shower | |
258 | if (isElectron && !isShower){ | |
259 | if (dummyPartMotherLabel > -1 && particleMotherLabel > -1){ // test whether first particle has a mother | |
260 | if (isConversion && dummyPartMotherLabel == particleMotherLabel) isConversionFullyContained = kTRUE; // test whether conversion is fully contained in cluster | |
261 | ||
262 | if (dummyPartGrandMotherLabel > -1 && particleGrandMotherLabel > -1){ // test whether first particle has a grandmother | |
263 | if (abs(dummyPart->GetPdgCode()) == 22){ // test whether this particle is a photon | |
264 | // check whether orginal electron and this photon stem from the same particle and electron stems from conversion | |
265 | if( dummyPartMotherLabel == particleGrandMotherLabel && (abs(dummyPartMotherPDG) != 11 || abs(dummyPartMotherPDG) != 22 ) ) isMergedPartConv = kTRUE; | |
266 | // check whether orginal electron and this photon stem from the same particle and electron originated in dalitz | |
267 | if( dummyPartMotherLabel == particleMotherLabel && (abs(dummyPartMotherPDG) != 11 || abs(dummyPartMotherPDG) != 22 ) ) isDalitzMerged = kTRUE; | |
268 | } | |
269 | if (abs(dummyPart->GetPdgCode()) == 11) { | |
270 | // check whether orginal electron and this electron stem from the same particle and electron stems from conversion | |
271 | if( dummyPartGrandMotherLabel == particleGrandMotherLabel && (abs(dummyPartGrandMotherPDG) != 11 || abs(dummyPartGrandMotherPDG) != 22 ) ) isMergedPartConv = kTRUE; | |
272 | // check whether orginal electron and this electron stem from the same particle and electron originated in dalitz decay | |
273 | if( dummyPartMotherLabel == particleMotherLabel && abs(particleMotherPDG) != 22 && (abs(dummyPartGrandMotherPDG) != 11 || abs(dummyPartGrandMotherPDG) != 22 ) ) isDalitzMerged = kTRUE; | |
274 | } | |
275 | ||
276 | } | |
277 | } | |
278 | } | |
279 | ||
280 | if (dummyPartMotherLabel > -1){ // test whether particle has a mother | |
281 | if (abs(dummyPart->GetPdgCode()) == 22){ // test whether particle is a photon | |
282 | //check if photon directly comes from a pion/eta/eta_prime decay | |
283 | if ( abs(dummyPartMotherPDG) == 111 || abs(dummyPartMotherPDG) == 221 || abs(dummyPartMotherPDG) == 331){ | |
284 | fCaloPhotonMotherMCLabels[i] = dummyPartMotherLabel; | |
285 | Bool_t helpN=true; | |
286 | for(Int_t j=0; j<i; j++){ | |
287 | if (fCaloPhotonMotherMCLabels[j] == dummyPartMotherLabel){ //check if mother is already contained in fCaloPhotonMotherMCLabels | |
288 | helpN=false; | |
289 | } | |
290 | } | |
291 | if (helpN) fNCaloPhotonMotherMCLabels++; //only if particle label is not yet contained in array, count up fNCaloPhotonMotherMCLabels | |
292 | if (!isPhoton && !isElectron) isSubLeadingEM = kTRUE; | |
293 | } | |
294 | } | |
295 | ||
296 | if (abs(dummyPart->GetPdgCode()) == 11){ //test whether particle is an electron | |
297 | //check if electron comes from a pion decay | |
298 | if ( abs(dummyPartMotherPDG) == 111){ | |
299 | fCaloPhotonMotherMCLabels[i] = dummyPartMotherLabel; | |
300 | Bool_t helpN=true; | |
301 | for(Int_t j=0; j<i; j++){ | |
302 | if (fCaloPhotonMotherMCLabels[j] == dummyPartMotherLabel){ //check if mother is already contained in fCaloPhotonMotherMCLabels | |
303 | helpN=false; | |
304 | } | |
305 | } | |
306 | if (helpN) fNCaloPhotonMotherMCLabels++; //only if particle label is not yet contained in array, count up fNCaloPhotonMotherMCLabels | |
307 | if (!isPhoton && !isElectron) isSubLeadingEM = kTRUE; | |
308 | } | |
309 | else if (dummyPartGrandMotherLabel > -1){ //if it is not a dalitz decay, test whether particle has a grandmother | |
310 | //check if it is a conversion electron that has pion/eta/eta_prime as grandmother | |
311 | if ( abs(dummyPartMotherPDG) == 22 && (abs(dummyPartGrandMotherPDG) == 111 || abs(dummyPartGrandMotherPDG) == 221 || abs(dummyPartGrandMotherPDG) == 331)){ | |
312 | fCaloPhotonMotherMCLabels[i] = dummyPartGrandMotherLabel; | |
313 | Bool_t helpN=true; | |
314 | for(Int_t j=0; j<i; j++){ | |
315 | if (fCaloPhotonMotherMCLabels[j] == dummyPartGrandMotherLabel){ //check if grandmother is already contained in fCaloPhotonMotherMCLabels | |
316 | helpN=false; | |
317 | } | |
318 | } | |
319 | if (helpN) fNCaloPhotonMotherMCLabels++; //only if particle label is not yet contained in array, count up fNCaloPhotonMotherMCLabels | |
320 | if (!isPhoton && !isElectron) isSubLeadingEM = kTRUE; | |
321 | } | |
322 | } | |
323 | } | |
324 | ||
325 | } | |
326 | ||
327 | } | |
328 | } | |
329 | fCaloPhotonMCFlags = isPhoton *1 + isElectron *2 + isConversion*4+ isConversionFullyContained *8 + isMerged *16 + isMergedPartConv*32 + isDalitz *64 + isDalitzMerged *128 + isPhotonWithElecMother *256 + isShower * 512 + isSubLeadingEM * 1024; | |
330 | } | |
331 | ||
332 | void AliAODConversionPhoton::SetCaloPhotonMCFlagsAOD(AliVEvent* event){ | |
333 | ||
334 | TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName())); | |
335 | if (!AODMCTrackArray) return; | |
336 | ||
337 | Bool_t isPhoton = kFALSE; // largest contribution to cluster is photon | |
338 | Bool_t isElectron = kFALSE; // largest contribution to cluster is electron | |
339 | Bool_t isConversion = kFALSE; // largest contribution to cluster is converted electron | |
340 | Bool_t isConversionFullyContained = kFALSE; // largest contribution to cluster is converted electron, second electron has been found in same cluster | |
341 | Bool_t isMerged = kFALSE; // largest contribution to cluster is photon, second photon or electron from dalitz has been found in same cluster | |
342 | Bool_t isMergedPartConv = kFALSE; // cluster contains more than one particle from the same decay and at least one of the particles came from a conversion | |
343 | Bool_t isDalitz = kFALSE; // this cluster was created by a particle stemming from a dality decay | |
344 | Bool_t isDalitzMerged = kFALSE; // this cluster was created by a particle stemming from a dality decay and more than one particle of the dalitz decay is contained in the cluster | |
345 | Bool_t isPhotonWithElecMother = kFALSE; // this cluster is from a photon with an electron as mother | |
346 | Bool_t isShower = kFALSE; // this cluster contains as a largest contribution a particle from a shower or radiative process | |
347 | Bool_t isSubLeadingEM = kFALSE; // cluster contains at least one electron or photon from a pi0 or eta in subleading contribution | |
348 | ||
349 | AliAODMCParticle* Photon; | |
350 | AliAODMCParticle* PhotonMother; | |
351 | AliAODMCParticle* PhotonGrandMother; | |
352 | ||
353 | if (fNCaloPhotonMCLabels==0) return; | |
354 | Photon = (AliAODMCParticle*) AODMCTrackArray->At(GetCaloPhotonMCLabel(0)); | |
355 | ||
356 | if(Photon == NULL){ | |
357 | return; | |
358 | } | |
359 | ||
360 | Int_t particleMotherLabel = Photon->GetMother(); | |
361 | Int_t particleGrandMotherLabel = -1; | |
362 | Int_t particleMotherPDG = -1; | |
363 | Int_t particleGrandMotherPDG = -1; | |
364 | Int_t particleMotherNDaugthers = 0; | |
365 | Int_t particleGrandMotherNDaugthers = 0; | |
366 | if (particleMotherLabel > -1){ | |
367 | PhotonMother = (AliAODMCParticle*) AODMCTrackArray->At(Photon->GetMother()); | |
368 | particleMotherNDaugthers = PhotonMother->GetNDaughters(); | |
369 | particleGrandMotherLabel = PhotonMother->GetMother(); | |
370 | particleMotherPDG = PhotonMother->GetPdgCode(); | |
371 | if (particleGrandMotherLabel > -1){ | |
372 | PhotonGrandMother = (AliAODMCParticle*) AODMCTrackArray->At(PhotonMother->GetMother()); | |
373 | particleGrandMotherPDG = PhotonGrandMother->GetPdgCode(); | |
374 | particleGrandMotherNDaugthers = PhotonGrandMother->GetNDaughters(); | |
375 | } | |
376 | } | |
377 | ||
378 | //determine mother/grandmother of leading particle and if it is pion/eta/eta_prime: fill array fCaloPhotonMotherMCLabels at position 0 | |
379 | if (particleMotherLabel > -1){ | |
380 | if( abs(particleMotherPDG) == 111 || abs(particleMotherPDG) == 221 || abs(particleMotherPDG) == 331 ){ | |
381 | fCaloPhotonMotherMCLabels[0] = particleMotherLabel; | |
382 | fNCaloPhotonMotherMCLabels++; | |
383 | } | |
384 | else if (particleGrandMotherLabel > -1){ | |
385 | if ( abs(particleMotherPDG) == 22 && (abs(particleGrandMotherPDG) == 111 || abs(particleGrandMotherPDG) == 221 || abs(particleGrandMotherPDG) == 331) ){ | |
386 | fCaloPhotonMotherMCLabels[0] = particleGrandMotherLabel; | |
387 | fNCaloPhotonMotherMCLabels++; | |
388 | } | |
389 | } | |
390 | } | |
391 | ||
392 | // Check whether the first contribution was photon | |
393 | if(abs(Photon->GetPdgCode()) == 22){ | |
394 | isPhoton=kTRUE; | |
395 | // did it decay via the dalitz channel | |
396 | if (particleMotherLabel > -1 && particleMotherNDaugthers == 3) isDalitz = kTRUE; | |
397 | // Test whether particle stems from a shower or radiation | |
398 | if (abs(particleMotherPDG) == 11){ // check whether photon stems from electron | |
399 | isPhotonWithElecMother = kTRUE; | |
400 | if (particleGrandMotherLabel > -1){ // test whether first particle has a grandmother | |
401 | if (abs(particleGrandMotherPDG) == 22 ) isShower = kTRUE; // check whether grandmother is a photon (meaning this is most likely a shower) | |
402 | } | |
403 | } | |
404 | } | |
405 | // Check whether the first contribution was electron | |
406 | if(abs(Photon->GetPdgCode()) == 11 ){ | |
407 | isElectron=kTRUE; | |
408 | if (particleMotherLabel > -1) { | |
409 | // was it a conversion | |
410 | if (abs(particleMotherPDG) == 22) isConversion = kTRUE; | |
411 | // did it decay via the dalitz channel | |
412 | if (particleGrandMotherLabel > -1 && particleGrandMotherNDaugthers == 3 ) isDalitz = kTRUE; | |
413 | } | |
414 | if (particleGrandMotherLabel > -1){ // check whether electron has a grandmother | |
415 | if (abs(particleGrandMotherPDG) == 11 || abs(particleGrandMotherPDG) == 22){ // test whether electron has photon or electron as grandmother (meaning will most likely be a shower) | |
416 | isShower = kTRUE; | |
417 | } | |
418 | } | |
419 | } | |
420 | ||
421 | ||
422 | // check whether there were other contributions to the cluster | |
423 | if (fNCaloPhotonMCLabels>1){ | |
424 | AliAODMCParticle* dummyPart =NULL; | |
425 | AliAODMCParticle* dummyPartMother = NULL; | |
426 | AliAODMCParticle* dummyPartGrandMother = NULL; | |
427 | for (Int_t i = 1; i< fNCaloPhotonMCLabels; i++){ | |
428 | if (i > 19) continue; // abort if more than 20 entries to the cluster have been checked (more are not stored in these objects) | |
429 | dummyPart = (AliAODMCParticle*) AODMCTrackArray->At(GetCaloPhotonMCLabel(i)); | |
430 | Int_t dummyPartMotherLabel = dummyPart->GetMother(); | |
431 | Int_t dummyPartGrandMotherLabel = -1; | |
432 | Int_t dummyPartMotherPDG = -1; | |
433 | Int_t dummyPartGrandMotherPDG = -1; | |
434 | ||
435 | // check whether this particle has a mother & obtain the pdg code | |
436 | if (dummyPartMotherLabel > -1){ | |
437 | dummyPartMother = (AliAODMCParticle*) AODMCTrackArray->At(dummyPart->GetMother()); | |
438 | dummyPartGrandMotherLabel = dummyPartMother->GetMother(); | |
439 | dummyPartMotherPDG = dummyPartMother->GetPdgCode(); | |
440 | // check whether this particle has a grandmother & obtain its pdg code | |
441 | if (dummyPartGrandMotherLabel > -1){ | |
442 | dummyPartGrandMother = (AliAODMCParticle*) AODMCTrackArray->At(dummyPartMother->GetMother()); | |
443 | dummyPartGrandMotherPDG = dummyPartGrandMother->GetPdgCode(); | |
444 | } | |
445 | } | |
446 | ||
447 | // largest contribution was from photon and is not from shower or electron mother | |
448 | if (isPhoton && (!isShower || !isPhotonWithElecMother )){ | |
449 | if (dummyPartMotherLabel > -1 && particleMotherLabel > -1){ // test whether first particle has a mother | |
450 | if (dummyPartMotherLabel == particleMotherLabel) isMerged = kTRUE; // test whether current and first particle have the same mother => i.e. other gamma from decay or dalitz electron | |
451 | if (dummyPartGrandMotherLabel > -1){ // test whether first particle has a grandmother | |
452 | // check whether particle is an electron from a conversion of a photon from the original mother | |
453 | if (abs(dummyPart->GetPdgCode()) == 11 && dummyPartGrandMotherLabel == particleMotherLabel ) isMergedPartConv = kTRUE; | |
454 | // check whether particle is an electron from a dalitz decay from the original mother | |
455 | if (abs(dummyPart->GetPdgCode()) == 11 && dummyPartMotherLabel == particleMotherLabel ) isDalitzMerged = kTRUE; | |
456 | } | |
457 | } | |
458 | } | |
459 | ||
460 | // largest contribution was from electron & not a from a shower | |
461 | if (isElectron && !isShower){ | |
462 | if (dummyPartMotherLabel > -1 && particleMotherLabel > -1){ // test whether first particle has a mother | |
463 | if (isConversion && dummyPartMotherLabel == particleMotherLabel) isConversionFullyContained = kTRUE; // test whether conversion is fully contained in cluster | |
464 | ||
465 | if (dummyPartGrandMotherLabel > -1 && particleGrandMotherLabel > -1){ // test whether first particle has a grandmother | |
466 | if (abs(dummyPart->GetPdgCode()) == 22){ // test whether this particle is a photon | |
467 | // check whether orginal electron and this photon stem from the same particle and electron stems from conversion | |
468 | if( dummyPartMotherLabel == particleGrandMotherLabel && (abs(dummyPartMotherPDG) != 11 || abs(dummyPartMotherPDG) != 22 ) ) isMergedPartConv = kTRUE; | |
469 | // check whether orginal electron and this photon stem from the same particle and electron originated in dalitz | |
470 | if( dummyPartMotherLabel == particleMotherLabel && (abs(dummyPartMotherPDG) != 11 || abs(dummyPartMotherPDG) != 22 ) ) isDalitzMerged = kTRUE; | |
471 | } | |
472 | if (abs(dummyPart->GetPdgCode()) == 11) { | |
473 | // check whether orginal electron and this electron stem from the same particle and electron stems from conversion | |
474 | if( dummyPartGrandMotherLabel == particleGrandMotherLabel && (abs(dummyPartGrandMotherPDG) != 11 || abs(dummyPartGrandMotherPDG) != 22 ) ) isMergedPartConv = kTRUE; | |
475 | // check whether orginal electron and this electron stem from the same particle and electron originated in dalitz decay | |
476 | if( dummyPartMotherLabel == particleMotherLabel && abs(particleMotherPDG) != 22 && (abs(dummyPartGrandMotherPDG) != 11 || abs(dummyPartGrandMotherPDG) != 22 ) ) isDalitzMerged = kTRUE; | |
477 | } | |
478 | ||
479 | } | |
480 | } | |
481 | } | |
482 | ||
483 | if (dummyPartMotherLabel > -1){ // test whether particle has a mother | |
484 | if (abs(dummyPart->GetPdgCode()) == 22){ // test whether particle is a photon | |
485 | //check if photon directly comes from a pion/eta/eta_prime decay | |
486 | if ( abs(dummyPartMotherPDG) == 111 || abs(dummyPartMotherPDG) == 221 || abs(dummyPartMotherPDG) == 331){ | |
487 | fCaloPhotonMotherMCLabels[i] = dummyPartMotherLabel; | |
488 | Bool_t helpN=true; | |
489 | for(Int_t j=0; j<i; j++){ | |
490 | if (fCaloPhotonMotherMCLabels[j] == dummyPartMotherLabel){ //check if mother is already contained in fCaloPhotonMotherMCLabels | |
491 | helpN=false; | |
492 | } | |
493 | } | |
494 | if (helpN) fNCaloPhotonMotherMCLabels++; //only if particle label is not yet contained in array, count up fNCaloPhotonMotherMCLabels | |
495 | if (!isPhoton && !isElectron) isSubLeadingEM = kTRUE; | |
496 | } | |
497 | } | |
498 | ||
499 | if (abs(dummyPart->GetPdgCode()) == 11){ //test whether particle is an electron | |
500 | //check if electron comes from a pion decay | |
501 | if ( abs(dummyPartMotherPDG) == 111){ | |
502 | fCaloPhotonMotherMCLabels[i] = dummyPartMotherLabel; | |
503 | Bool_t helpN=true; | |
504 | for(Int_t j=0; j<i; j++){ | |
505 | if (fCaloPhotonMotherMCLabels[j] == dummyPartMotherLabel){ //check if mother is already contained in fCaloPhotonMotherMCLabels | |
506 | helpN=false; | |
507 | } | |
508 | } | |
509 | if (helpN) fNCaloPhotonMotherMCLabels++; //only if particle label is not yet contained in array, count up fNCaloPhotonMotherMCLabels | |
510 | if (!isPhoton && !isElectron) isSubLeadingEM = kTRUE; | |
511 | } | |
512 | else if (dummyPartGrandMotherLabel > -1){ //if it is not a dalitz decay, test whether particle has a grandmother | |
513 | //check if it is a conversion electron that has pion/eta/eta_prime as grandmother | |
514 | if ( abs(dummyPartMotherPDG) == 22 && (abs(dummyPartGrandMotherPDG) == 111 || abs(dummyPartGrandMotherPDG) == 221 || abs(dummyPartGrandMotherPDG) == 331)){ | |
515 | fCaloPhotonMotherMCLabels[i] = dummyPartGrandMotherLabel; | |
516 | Bool_t helpN=true; | |
517 | for(Int_t j=0; j<i; j++){ | |
518 | if (fCaloPhotonMotherMCLabels[j] == dummyPartGrandMotherLabel){ //check if grandmother is already contained in fCaloPhotonMotherMCLabels | |
519 | helpN=false; | |
520 | } | |
521 | } | |
522 | if (helpN) fNCaloPhotonMotherMCLabels++; //only if particle label is not yet contained in array, count up fNCaloPhotonMotherMCLabels | |
523 | if (!isPhoton && !isElectron) isSubLeadingEM = kTRUE; | |
524 | } | |
525 | } | |
526 | } | |
527 | ||
528 | } | |
529 | ||
530 | } | |
531 | } | |
532 | fCaloPhotonMCFlags = isPhoton *1 + isElectron *2 + isConversion*4+ isConversionFullyContained *8 + isMerged *16 + isMergedPartConv*32 + isDalitz *64 + isDalitzMerged *128 + isPhotonWithElecMother *256 + isShower * 512 + isSubLeadingEM * 1024; | |
533 | } |