]>
Commit | Line | Data |
---|---|---|
5cd139bc | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-2011, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | /* $Id$ */ | |
17 | ||
18 | //----------------------------------------------------------------------- | |
19 | // Class for HF corrections as a function of many variables and steps | |
20 | // For Lc->V0+bachelor | |
21 | // | |
22 | // - Based on AliCFVertexingHFCascade - | |
23 | // | |
24 | // Contact : A.De Caro - decaro@sa.infn.it | |
25 | // Centro 'E.Fermi' - Rome (Italy) | |
26 | // INFN and University of Salerno (Italy) | |
27 | // | |
28 | //----------------------------------------------------------------------- | |
29 | ||
5cd139bc | 30 | #include "TDatabasePDG.h" |
a578b2da | 31 | #include "TClonesArray.h" |
5cd139bc | 32 | #include "AliAODv0.h" |
a578b2da | 33 | #include "AliAODMCParticle.h" |
34 | #include "AliAODRecoDecayHF.h" | |
35 | #include "AliAODRecoCascadeHF.h" | |
5cd139bc | 36 | #include "AliCFTaskVertexingHF.h" |
a578b2da | 37 | #include "AliCFContainer.h" |
38 | #include "AliCFVertexingHF.h" | |
39 | #include "AliCFVertexingHFLctoV0bachelor.h" | |
5cd139bc | 40 | |
41 | #include <Riostream.h> | |
42 | ||
43 | using std::cout; | |
44 | using std::endl; | |
45 | ||
46 | ClassImp(AliCFVertexingHFLctoV0bachelor) | |
47 | ||
48 | //_________________________________________ | |
49 | AliCFVertexingHFLctoV0bachelor::AliCFVertexingHFLctoV0bachelor(): | |
50 | fGenLcOption(0) | |
51 | { | |
52 | // standard constructor | |
53 | } | |
54 | ||
55 | //_____________________________________ | |
56 | AliCFVertexingHFLctoV0bachelor::AliCFVertexingHFLctoV0bachelor(TClonesArray *mcArray, UShort_t originDselection, Int_t lcDecay): | |
57 | AliCFVertexingHF(mcArray, originDselection), | |
58 | fGenLcOption(lcDecay) | |
59 | { | |
60 | // standard constructor | |
61 | ||
62 | SetNProngs(3); | |
63 | fPtAccCut=new Float_t[fProngs]; | |
64 | fEtaAccCut=new Float_t[fProngs]; | |
65 | for(Int_t iP=0; iP<fProngs; iP++){ | |
66 | fPtAccCut[iP]=0.1; | |
67 | fEtaAccCut[iP]=0.9; | |
68 | } | |
69 | ||
70 | } | |
71 | ||
72 | ||
73 | //_____________________________________ | |
74 | AliCFVertexingHFLctoV0bachelor& AliCFVertexingHFLctoV0bachelor::operator=(const AliCFVertexingHFLctoV0bachelor& c) | |
75 | { | |
76 | // operator = | |
77 | ||
78 | if (this != &c) { | |
79 | AliCFVertexingHF::operator=(c); | |
80 | } | |
81 | ||
82 | return *this; | |
83 | ||
84 | } | |
85 | ||
86 | //__________________________________________ | |
87 | Bool_t AliCFVertexingHFLctoV0bachelor::SetRecoCandidateParam(AliAODRecoDecayHF *recoCand) | |
88 | { | |
89 | // set the AliAODRecoDecay candidate | |
90 | ||
91 | Bool_t bSignAssoc = kFALSE; | |
92 | ||
93 | fRecoCandidate = recoCand; | |
94 | if (!fRecoCandidate) { | |
95 | AliError("fRecoCandidate not found, problem in assignement\n"); | |
96 | return bSignAssoc; | |
97 | } | |
98 | ||
a578b2da | 99 | if (fRecoCandidate->GetPrimaryVtx()) AliDebug(4,"fReco Candidate has a pointer to PrimVtx\n"); |
5cd139bc | 100 | |
ff12b981 | 101 | AliAODRecoCascadeHF* lcV0bachelor = dynamic_cast<AliAODRecoCascadeHF*>(fRecoCandidate); |
102 | if (!lcV0bachelor) { | |
103 | AliDebug(2,"cascade doesn't exist, skipped!"); | |
104 | return bSignAssoc; | |
105 | } | |
106 | ||
107 | if (!lcV0bachelor->GetSecondaryVtx()) { | |
108 | AliDebug(2,"No secondary vertex for cascade"); | |
109 | return bSignAssoc; | |
110 | } | |
111 | ||
112 | if (lcV0bachelor->GetNDaughters()!=2) { | |
113 | AliDebug(2,Form("No 2 daughters for current cascade (nDaughters=%d)",lcV0bachelor->GetNDaughters())); | |
114 | return bSignAssoc; | |
115 | } | |
116 | ||
117 | AliVTrack *cascTrk0 = dynamic_cast<AliVTrack*>(lcV0bachelor->GetDaughter(0)); | |
118 | AliVTrack *cascTrk1 = dynamic_cast<AliVTrack*>(lcV0bachelor->GetDaughter(1)); | |
119 | if (!cascTrk0 || !cascTrk1) { | |
120 | AliDebug(2,"At least one of V0daughters doesn't exist"); | |
121 | return bSignAssoc; | |
122 | } | |
123 | ||
124 | AliAODv0 * v0part = dynamic_cast<AliAODv0*>(lcV0bachelor->Getv0()); | |
125 | AliAODTrack * bachPart = dynamic_cast<AliAODTrack*>(lcV0bachelor->GetBachelor()); | |
126 | if (!v0part || !bachPart) { | |
127 | AliDebug(2,"No V0 or no bachelor for current cascade"); | |
128 | return bSignAssoc; | |
129 | } | |
130 | ||
131 | if (bachPart->GetID()<0) { | |
132 | AliDebug(2,Form("Bachelor has negative ID %d",bachPart->GetID())); | |
133 | return bSignAssoc; | |
134 | } | |
135 | ||
136 | if (!v0part->GetSecondaryVtx()) { | |
137 | AliDebug(2,"No secondary vertex for V0 by cascade"); | |
138 | return bSignAssoc; | |
139 | } | |
140 | ||
141 | if (v0part->GetNDaughters()!=2) { | |
142 | AliDebug(2,Form("No 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters())); | |
143 | return bSignAssoc; | |
144 | } | |
145 | ||
146 | AliVTrack *trk0 = dynamic_cast<AliVTrack*>(v0part->GetDaughter(0)); | |
147 | AliVTrack *trk1 = dynamic_cast<AliVTrack*>(v0part->GetDaughter(1)); | |
148 | if (!trk0 || !trk1) { | |
149 | AliDebug(2,"At least one of V0daughters doesn't exist"); | |
150 | return bSignAssoc; | |
151 | } | |
152 | ||
126b0255 | 153 | //if (trk0->GetLabel()<0 || trk1->GetLabel()<0) { |
154 | //AliDebug(2,Form("At least one of V0daughters has label negative (%d %d)",trk0->GetLabel(),trk1->GetLabel())); | |
155 | //return bSignAssoc; | |
156 | //} | |
ff12b981 | 157 | |
158 | if (trk0->GetID()<0 || trk1->GetID()<0) { | |
159 | AliDebug(2,Form("At least one of V0 daughters has negative ID %d %d",trk0->GetID(),trk1->GetID())); | |
a578b2da | 160 | return bSignAssoc; |
161 | } | |
5cd139bc | 162 | |
5cd139bc | 163 | Int_t pdgCand = 4122; |
164 | Int_t mcLabel = -1; | |
165 | Int_t mcLabelK0S = -1; | |
166 | Int_t mcLabelLambda = -1; | |
167 | ||
168 | // Lc->K0S+p and cc | |
a578b2da | 169 | Int_t pdgDgLctoV0bachelor[2]={2212,310}; // first bachelor, second V0 |
5cd139bc | 170 | Int_t pdgDgV0toDaughters[2]={211,211}; |
a578b2da | 171 | mcLabelK0S = lcV0bachelor->MatchToMC(pdgCand,pdgDgLctoV0bachelor[1],pdgDgLctoV0bachelor,pdgDgV0toDaughters,fmcArray,kTRUE); |
172 | ||
5cd139bc | 173 | // Lc->Lambda+pi and cc |
a578b2da | 174 | pdgDgLctoV0bachelor[0]=211, pdgDgLctoV0bachelor[1]=3122; // first bachelor, second V0 |
5cd139bc | 175 | pdgDgV0toDaughters[0]=2212, pdgDgV0toDaughters[1]=211; |
a578b2da | 176 | mcLabelLambda = lcV0bachelor->MatchToMC(pdgCand,pdgDgLctoV0bachelor[1],pdgDgLctoV0bachelor,pdgDgV0toDaughters,fmcArray,kTRUE); |
5cd139bc | 177 | |
178 | if (mcLabelK0S!=-1 && mcLabelLambda!=-1) | |
a578b2da | 179 | AliDebug(2,"Strange: current Lc->V0+bachelor candidate has two MC different labels!"); |
5cd139bc | 180 | |
ff12b981 | 181 | if (fGenLcOption==kCountK0Sp) { |
5cd139bc | 182 | if (mcLabelK0S!=-1) mcLabel=mcLabelK0S; |
183 | if (mcLabelLambda!=-1) { | |
184 | mcLabel=-1; | |
185 | fFake = 0; // fake candidate | |
186 | if (fFakeSelection==1) return bSignAssoc; | |
187 | } | |
188 | } | |
189 | else if (fGenLcOption==kCountLambdapi) { | |
190 | if (mcLabelLambda!=-1) mcLabel=mcLabelLambda; | |
191 | if (mcLabelK0S!=-1) { | |
192 | mcLabel=-1; | |
193 | fFake = 0; // fake candidate | |
194 | if (fFakeSelection==1) return bSignAssoc; | |
195 | } | |
196 | } | |
197 | ||
a578b2da | 198 | if (mcLabel==-1) { |
199 | AliDebug(4,"No mcLabel found for current candidate"); | |
200 | return bSignAssoc; | |
201 | } | |
126b0255 | 202 | AliDebug(1,Form("Found mcLabel (%d) for current candidate (onTheFly=%1d)",mcLabel,v0part->GetOnFlyStatus())); |
5cd139bc | 203 | |
204 | if (fRecoCandidate->NumberOfFakeDaughters()>0){ | |
205 | fFake = 0; // fake candidate | |
206 | if (fFakeSelection==1) return bSignAssoc; | |
207 | } | |
208 | if (fRecoCandidate->NumberOfFakeDaughters()==0){ | |
209 | fFake = 2; // non-fake candidate | |
210 | if (fFakeSelection==2) return bSignAssoc; | |
211 | } | |
212 | ||
a578b2da | 213 | SetMCLabel(mcLabel); // fmcLabel=mcLabel |
5cd139bc | 214 | fmcPartCandidate = dynamic_cast<AliAODMCParticle*>(fmcArray->At(fmcLabel)); |
5cd139bc | 215 | if (!fmcPartCandidate){ |
a578b2da | 216 | AliDebug(3,"No MC object for current candidate"); |
5cd139bc | 217 | return bSignAssoc; |
218 | } | |
219 | ||
220 | bSignAssoc = kTRUE; | |
221 | return bSignAssoc; | |
a578b2da | 222 | |
5cd139bc | 223 | } |
224 | ||
225 | //______________________________________________ | |
226 | Bool_t AliCFVertexingHFLctoV0bachelor::GetGeneratedValuesFromMCParticle(Double_t* vectorMC) | |
227 | { | |
228 | // | |
229 | // collecting all the necessary info (pt, y, invMassV0, cosPAwrtPVxV0, onTheFlyStatusV0) from MC particle | |
230 | // (additional infos: pTbachelor, pTV0pos, pTV0neg, phi, dcaV0, cTV0, cT, cosPA) | |
231 | // | |
232 | ||
233 | Bool_t bGenValues = kFALSE; | |
234 | ||
a578b2da | 235 | if (fmcPartCandidate->GetNDaughters()!=2) { |
236 | AliDebug(2,"Lc MC particle doesn't decay in 2 daughters"); | |
237 | return bGenValues; | |
238 | } | |
5cd139bc | 239 | |
240 | Int_t daughter0lc = fmcPartCandidate->GetDaughter(0); | |
241 | Int_t daughter1lc = fmcPartCandidate->GetDaughter(1); | |
ff12b981 | 242 | if (daughter0lc<=0 || daughter1lc<=0) { |
a578b2da | 243 | AliDebug(2,"Lc daughters are not in MC array"); |
5cd139bc | 244 | return bGenValues; |
245 | } | |
246 | ||
a578b2da | 247 | AliAODMCParticle* mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0lc)); |
248 | AliAODMCParticle* mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1lc)); | |
249 | if (!mcPartDaughter0 || !mcPartDaughter1) { | |
250 | AliDebug(2,"Problems in the MC Daughters\n"); | |
5cd139bc | 251 | return bGenValues; |
252 | } | |
5cd139bc | 253 | |
a578b2da | 254 | if ( fGenLcOption==kCountLambdapi && |
255 | !(TMath::Abs(mcPartDaughter0->GetPdgCode())==3122 && | |
256 | TMath::Abs(mcPartDaughter1->GetPdgCode())==211) && | |
257 | !(TMath::Abs(mcPartDaughter1->GetPdgCode())==3122 && | |
258 | TMath::Abs(mcPartDaughter0->GetPdgCode())==211) ) return bGenValues; | |
259 | if ( fGenLcOption==kCountK0Sp && | |
260 | !(TMath::Abs(mcPartDaughter0->GetPdgCode())==2212 && | |
261 | TMath::Abs(mcPartDaughter1->GetPdgCode())==311) && | |
262 | !(TMath::Abs(mcPartDaughter1->GetPdgCode())==2212 && | |
263 | TMath::Abs(mcPartDaughter0->GetPdgCode())==311) ) return bGenValues; | |
264 | ||
265 | if ( (TMath::Abs(mcPartDaughter0->GetPdgCode())==311 && | |
266 | TMath::Abs(mcPartDaughter1->GetPdgCode())==2212) || | |
267 | (TMath::Abs(mcPartDaughter0->GetPdgCode())==3122 && | |
268 | TMath::Abs(mcPartDaughter1->GetPdgCode())==211) ) | |
269 | bGenValues = FillVectorFromMCarray(mcPartDaughter1,mcPartDaughter0,vectorMC); | |
270 | else if ( (TMath::Abs(mcPartDaughter1->GetPdgCode())==311 && | |
271 | TMath::Abs(mcPartDaughter0->GetPdgCode())==2212) || | |
272 | (TMath::Abs(mcPartDaughter1->GetPdgCode())==3122 && | |
273 | TMath::Abs(mcPartDaughter0->GetPdgCode())==211) ) | |
274 | bGenValues = FillVectorFromMCarray(mcPartDaughter0,mcPartDaughter1,vectorMC); | |
275 | ||
276 | if (!bGenValues) | |
277 | AliDebug(2,"There is something wrong in filling MC vector"); | |
5cd139bc | 278 | |
5cd139bc | 279 | return bGenValues; |
280 | ||
281 | } | |
a578b2da | 282 | |
5cd139bc | 283 | //____________________________________________ |
284 | Bool_t AliCFVertexingHFLctoV0bachelor::GetRecoValuesFromCandidate(Double_t *vectorReco) const | |
285 | { | |
286 | // read the variables for the container | |
287 | ||
288 | Bool_t bFillRecoValues = kFALSE; | |
289 | ||
290 | //Get the Lc and the V0 from Lc | |
ff12b981 | 291 | AliAODRecoCascadeHF* lcV0bachelor = dynamic_cast<AliAODRecoCascadeHF*>(fRecoCandidate); |
5cd139bc | 292 | |
ff12b981 | 293 | if (!lcV0bachelor) { |
294 | AliDebug(2,"Current cascade doesn't exist, skipped"); | |
295 | return bFillRecoValues; | |
296 | } | |
297 | ||
298 | if (!lcV0bachelor->GetSecondaryVtx()) { | |
299 | AliDebug(2,"No secondary vertex for cascade"); | |
300 | return bFillRecoValues; | |
301 | } | |
302 | ||
303 | if (lcV0bachelor->GetNDaughters()!=2) { | |
304 | AliDebug(2,Form("No 2 daughters for current cascade (nDaughters=%d)",lcV0bachelor->GetNDaughters())); | |
305 | return bFillRecoValues; | |
306 | } | |
307 | ||
308 | AliAODTrack* bachelor = dynamic_cast<AliAODTrack*>(lcV0bachelor->GetBachelor()); | |
309 | AliAODv0* v0toDaughters = dynamic_cast<AliAODv0*>(lcV0bachelor->Getv0()); | |
310 | if (!bachelor || !v0toDaughters) { | |
a578b2da | 311 | AliDebug(2,"No V0 or bachelor in this reco candidate, skipping!"); |
312 | return bFillRecoValues; | |
313 | } | |
314 | ||
ff12b981 | 315 | if (!v0toDaughters->GetSecondaryVtx()) { |
316 | AliDebug(2,"No secondary vertex for V0 by cascade"); | |
317 | return bFillRecoValues; | |
318 | } | |
319 | ||
320 | if (v0toDaughters->GetNDaughters()!=2) { | |
321 | AliDebug(2,Form("current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0toDaughters->GetOnFlyStatus(),v0toDaughters->GetNDaughters())); | |
322 | return bFillRecoValues; | |
323 | } | |
324 | ||
5cd139bc | 325 | Bool_t onTheFlyStatus = v0toDaughters->GetOnFlyStatus(); |
ff12b981 | 326 | AliAODTrack* v0positiveTrack; |
327 | AliAODTrack* v0negativeTrack; | |
328 | if (onTheFlyStatus) { | |
329 | v0positiveTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0NegativeTrack()); | |
330 | v0negativeTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0PositiveTrack()); | |
331 | } else { | |
332 | v0positiveTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0PositiveTrack()); | |
333 | v0negativeTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0NegativeTrack()); | |
334 | } | |
335 | ||
a578b2da | 336 | if (!v0positiveTrack || !v0negativeTrack) { |
337 | AliDebug(2,"No V0daughters in this reco candidate, skipping!"); | |
338 | return bFillRecoValues; | |
339 | } | |
5cd139bc | 340 | |
341 | Double_t pt = lcV0bachelor->Pt(); | |
342 | Double_t rapidity = lcV0bachelor->Y(4122); | |
a578b2da | 343 | |
344 | Double_t cosPAwrtPrimVtxV0 = lcV0bachelor->CosV0PointingAngle(); | |
5cd139bc | 345 | |
53c91ed7 | 346 | //Double_t pTbachelor = bachelor->Pt(); |
347 | Double_t pbachelor = bachelor->P(); | |
348 | //Double_t pTV0pos = v0positiveTrack->Pt(); | |
349 | //Double_t pTV0neg = v0negativeTrack->Pt(); | |
5cd139bc | 350 | Double_t phi = lcV0bachelor->Phi(); |
351 | Double_t dcaV0 = v0toDaughters->GetDCA(); | |
53c91ed7 | 352 | //Double_t cTLc = lcV0bachelor->Ct(4122); // wrt PrimVtx |
5cd139bc | 353 | //Double_t dcaLc = lcV0bachelor->GetDCA(); |
354 | Double_t cosPointingAngleLc = lcV0bachelor->CosPointingAngle(); | |
355 | ||
53c91ed7 | 356 | /* |
a578b2da | 357 | Double_t cTV0 = 0.; |
358 | AliAODVertex *vtx0 = (AliAODVertex*)lcV0bachelor->GetPrimaryVtx(); | |
359 | if (!vtx0) { | |
360 | AliDebug(2,"Candidate has not primary vtx"); | |
361 | } else { | |
362 | Double_t primVtxPos[3] = {0.,0.,0.}; vtx0->GetXYZ(primVtxPos); | |
363 | if (fGenLcOption==kCountK0Sp) { | |
364 | cTV0 = v0toDaughters->Ct(310,primVtxPos); | |
365 | } else if (fGenLcOption==kCountLambdapi) { | |
366 | cTV0 = v0toDaughters->Ct(3122,primVtxPos); | |
367 | } | |
5cd139bc | 368 | } |
53c91ed7 | 369 | */ |
5cd139bc | 370 | |
a578b2da | 371 | Double_t invMassV0 = 0.; |
5cd139bc | 372 | if (fGenLcOption==kCountLambdapi) { |
a578b2da | 373 | |
374 | Short_t bachelorCharge = bachelor->Charge(); | |
5cd139bc | 375 | if (bachelorCharge==1) { |
376 | invMassV0 = v0toDaughters->MassLambda(); | |
377 | } else if (bachelorCharge==-1) { | |
378 | invMassV0 = v0toDaughters->MassAntiLambda(); | |
379 | } | |
380 | ||
381 | } else if (fGenLcOption==kCountK0Sp) { | |
a578b2da | 382 | |
5cd139bc | 383 | invMassV0 = v0toDaughters->MassK0Short(); |
a578b2da | 384 | |
5cd139bc | 385 | } |
386 | ||
a578b2da | 387 | vectorReco[0] = pt; |
388 | vectorReco[1] = rapidity; | |
389 | vectorReco[2] = phi; | |
53c91ed7 | 390 | vectorReco[3] = onTheFlyStatus; |
391 | vectorReco[4] = fzPrimVertex; | |
a578b2da | 392 | vectorReco[5] = fCentValue; |
393 | vectorReco[6] = fFake; // whether the reconstructed candidate was a fake (fFake = 0) or not (fFake = 2) | |
394 | vectorReco[7] = fMultiplicity; | |
5cd139bc | 395 | |
a578b2da | 396 | if (fConfiguration==AliCFTaskVertexingHF::kSnail) { |
53c91ed7 | 397 | //vectorReco[8] = pTbachelor; |
398 | vectorReco[8] = pbachelor; | |
399 | vectorReco[9] = v0toDaughters->Pt(); | |
400 | if (fGenLcOption==kCountLambdapi) { | |
401 | vectorReco[10] = v0toDaughters->Y(3122); | |
402 | } else if (fGenLcOption==kCountK0Sp) { | |
403 | vectorReco[10] = v0toDaughters->Y(310); | |
404 | } | |
405 | vectorReco[11] = v0toDaughters->Phi(); | |
406 | vectorReco[12] = invMassV0; | |
407 | vectorReco[13] = dcaV0; | |
408 | vectorReco[14] = cosPAwrtPrimVtxV0; | |
5cd139bc | 409 | vectorReco[15] = cosPointingAngleLc; |
53c91ed7 | 410 | //vectorReco[16] = cTV0*1.E4; // in micron |
411 | //vectorReco[17] = cTLc*1.E4; // in micron | |
5cd139bc | 412 | } |
413 | ||
414 | bFillRecoValues = kTRUE; | |
415 | ||
416 | return bFillRecoValues; | |
417 | } | |
418 | ||
419 | //_____________________________________________________________ | |
420 | Bool_t AliCFVertexingHFLctoV0bachelor::CheckMCChannelDecay() const | |
421 | { | |
422 | // check the required decay channel | |
423 | ||
424 | Bool_t checkCD = kFALSE; | |
425 | ||
a578b2da | 426 | if (fmcPartCandidate->GetNDaughters()!=2) { |
427 | AliDebug(2, Form("The MC particle doesn't decay in 2 particles, skipping!!")); | |
428 | return checkCD; | |
429 | } | |
5cd139bc | 430 | |
431 | Int_t daughter0 = fmcPartCandidate->GetDaughter(0); | |
432 | Int_t daughter1 = fmcPartCandidate->GetDaughter(1); | |
ff12b981 | 433 | if (daughter0<=0 || daughter1<=0){ |
a578b2da | 434 | AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!")); |
435 | return checkCD; | |
436 | } | |
5cd139bc | 437 | AliAODMCParticle* mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); |
438 | AliAODMCParticle* mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); | |
5cd139bc | 439 | if (!mcPartDaughter0 || !mcPartDaughter1) { |
a578b2da | 440 | AliDebug(2,"Problems in the MC Daughters\n"); |
5cd139bc | 441 | return checkCD; |
442 | } | |
443 | ||
444 | // Lc -> Lambda + pion AND cc | |
445 | if (fGenLcOption==kCountLambdapi) { | |
446 | ||
447 | if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==3122 && | |
448 | TMath::Abs(mcPartDaughter1->GetPdgCode())==211) && | |
a578b2da | 449 | !(TMath::Abs(mcPartDaughter0->GetPdgCode())==211 && |
5cd139bc | 450 | TMath::Abs(mcPartDaughter1->GetPdgCode())==3122)) { |
451 | AliDebug(2, "The Lc MC doesn't decay in Lambda+pion (or cc), skipping!!"); | |
452 | return checkCD; | |
5cd139bc | 453 | } |
454 | ||
a578b2da | 455 | if (TMath::Abs(mcPartDaughter0->GetPdgCode())==3122) { |
456 | mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor | |
457 | mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0 | |
458 | } | |
9e4f1968 | 459 | if (!mcPartDaughter0 || !mcPartDaughter1) { |
460 | AliDebug(2,"Problems in the MC Daughters\n"); | |
461 | return checkCD; | |
462 | } | |
a578b2da | 463 | |
464 | if (mcPartDaughter1->GetNDaughters()!=2) { | |
465 | AliDebug(2, "The Lambda MC particle doesn't decay in 2 particles, skipping!!"); | |
466 | return checkCD; | |
467 | } | |
468 | ||
469 | Int_t daughter1D0 = mcPartDaughter1->GetDaughter(0); | |
470 | Int_t daughter1D1 = mcPartDaughter1->GetDaughter(1); | |
ff12b981 | 471 | if (daughter1D0<=0 || daughter1D1<=0) { |
a578b2da | 472 | AliDebug(2, Form("The Lambda MC particle doesn't have correct daughters, skipping!!")); |
473 | return checkCD; | |
474 | } | |
5cd139bc | 475 | |
a578b2da | 476 | AliAODMCParticle* mcPartDaughter1D0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1D0)); |
477 | AliAODMCParticle* mcPartDaughter1D1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1D1)); | |
478 | if(!mcPartDaughter1D0 || !mcPartDaughter1D1) { | |
479 | AliError("The Lambda daughter particle not found in MC array"); | |
480 | return checkCD; | |
481 | } | |
482 | ||
483 | if (!(TMath::Abs(mcPartDaughter1D0->GetPdgCode())==211 && | |
484 | TMath::Abs(mcPartDaughter1D1->GetPdgCode())==2212) && | |
485 | !(TMath::Abs(mcPartDaughter1D0->GetPdgCode())==2212 && | |
486 | TMath::Abs(mcPartDaughter1D1->GetPdgCode())==211)) { | |
487 | AliDebug(2, "The Lambda MC doesn't decay in pi+proton (or cc), skipping!!"); | |
488 | return checkCD; | |
489 | } | |
490 | ||
491 | } else if (fGenLcOption==kCountK0Sp) { // Lc -> K0bar + proton AND cc | |
492 | ||
493 | if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==311 && | |
5cd139bc | 494 | TMath::Abs(mcPartDaughter1->GetPdgCode())==2212) && |
a578b2da | 495 | !(TMath::Abs(mcPartDaughter0->GetPdgCode())==2212 && |
5cd139bc | 496 | TMath::Abs(mcPartDaughter1->GetPdgCode())==311)) { |
497 | AliDebug(2, "The Lc MC doesn't decay in K0+proton (or cc), skipping!!"); | |
498 | return checkCD; | |
499 | } | |
500 | ||
501 | if (TMath::Abs(mcPartDaughter0->GetPdgCode())==311) { | |
a578b2da | 502 | mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor |
503 | mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0 | |
5cd139bc | 504 | } |
e1603c28 | 505 | if (!mcPartDaughter0 || !mcPartDaughter1) { |
506 | AliDebug(2,"Problems in the MC Daughters after swapping V0 and bachelor\n"); | |
507 | return checkCD; | |
508 | } | |
5cd139bc | 509 | |
53c91ed7 | 510 | if (mcPartDaughter1->GetNDaughters()!=1) { |
511 | AliDebug(2, "The K0/K0bar MC particle doesn't decay in 1 particles, skipping!!"); | |
512 | return checkCD; | |
513 | } | |
514 | ||
a578b2da | 515 | Int_t daughter = mcPartDaughter1->GetDaughter(0); |
ff12b981 | 516 | if (daughter<=0) { |
a578b2da | 517 | AliDebug(2, Form("The K0/K0bar MC particle doesn't have correct daughter, skipping!!")); |
518 | return checkCD; | |
5cd139bc | 519 | } |
520 | ||
a578b2da | 521 | AliAODMCParticle* mcPartDaughter = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter)); |
522 | if(!mcPartDaughter){ | |
523 | AliError("The K0/K0bar daughter particle not found in MC array"); | |
524 | return checkCD; | |
5cd139bc | 525 | } |
5cd139bc | 526 | |
a578b2da | 527 | if (!(TMath::Abs(mcPartDaughter->GetPdgCode())==310)) { |
528 | AliDebug(2, "The K0/K0bar MC doesn't go in K0S, skipping!!"); | |
529 | return checkCD; | |
5cd139bc | 530 | } |
5cd139bc | 531 | |
a578b2da | 532 | if (mcPartDaughter->GetNDaughters()!=2) { |
533 | AliDebug(2, "The K0S MC doesn't decay in 2 particles, skipping!!"); | |
534 | return checkCD; | |
5cd139bc | 535 | } |
5cd139bc | 536 | |
a578b2da | 537 | Int_t daughterD0 = mcPartDaughter->GetDaughter(0); |
538 | Int_t daughterD1 = mcPartDaughter->GetDaughter(1); | |
ff12b981 | 539 | if (daughterD0<=0 || daughterD1<=0) { |
a578b2da | 540 | AliDebug(2, Form("The K0S MC particle doesn't have correct daughters, skipping!!")); |
541 | return checkCD; | |
542 | } | |
5cd139bc | 543 | |
a578b2da | 544 | AliAODMCParticle* mcPartDaughterD0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD0)); |
545 | AliAODMCParticle* mcPartDaughterD1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD1)); | |
546 | if (!mcPartDaughterD0 || !mcPartDaughterD1) { | |
547 | AliError("Daughter particle not found in MC array"); | |
548 | return checkCD; | |
5cd139bc | 549 | } |
5cd139bc | 550 | |
a578b2da | 551 | if (! ( TMath::Abs(mcPartDaughterD0->GetPdgCode())==211 && |
552 | TMath::Abs(mcPartDaughterD1->GetPdgCode())==211 ) ) { | |
553 | AliDebug(2, "The K0S MC doesn't decay in pi+ pi-, skipping!!"); | |
554 | return checkCD; | |
555 | } | |
5cd139bc | 556 | |
a578b2da | 557 | } |
558 | ||
559 | checkCD = kTRUE; | |
560 | return checkCD; | |
561 | ||
562 | } | |
5cd139bc | 563 | |
564 | //_____________________________________________________________ | |
565 | Double_t AliCFVertexingHFLctoV0bachelor::GetEtaProng(Int_t iProng) const | |
566 | { | |
567 | // | |
568 | // getting eta of the prong - overload the mother class method | |
569 | // | |
570 | ||
a578b2da | 571 | Double_t etaProng =-9999; |
5cd139bc | 572 | |
a578b2da | 573 | if (!fRecoCandidate) { |
574 | AliDebug(2,"No reco candidate selected"); | |
575 | return etaProng; | |
576 | } | |
5cd139bc | 577 | |
a578b2da | 578 | AliAODRecoCascadeHF* lcV0bachelor = (AliAODRecoCascadeHF*)fRecoCandidate; |
579 | AliAODTrack* bachelor = (AliAODTrack*)lcV0bachelor->GetBachelor(); | |
580 | AliAODTrack* v0Pos = (AliAODTrack*)lcV0bachelor->Getv0PositiveTrack(); | |
581 | AliAODTrack* v0Neg = (AliAODTrack*)lcV0bachelor->Getv0NegativeTrack(); | |
582 | if (!(lcV0bachelor->Getv0()) || !bachelor || !v0Pos || !v0Neg) { | |
583 | AliDebug(2,"No V0 for this reco candidate selected"); | |
5cd139bc | 584 | return etaProng; |
5cd139bc | 585 | } |
a578b2da | 586 | |
587 | if (iProng==0) etaProng = bachelor->Eta(); | |
588 | else if (iProng==1) etaProng = v0Pos->Eta(); | |
589 | else if (iProng==2) etaProng = v0Neg->Eta(); | |
590 | ||
591 | AliDebug(4,Form("Eta value for prong number %1d = %f",iProng,etaProng)); | |
592 | ||
593 | return etaProng; | |
594 | ||
5cd139bc | 595 | } |
596 | ||
597 | //_____________________________________________________________ | |
598 | ||
599 | Double_t AliCFVertexingHFLctoV0bachelor::GetPtProng(Int_t iProng) const | |
600 | { | |
601 | // | |
602 | // getting pt of the prong | |
603 | // | |
604 | ||
605 | Double_t ptProng=-9999.; | |
606 | ||
a578b2da | 607 | if (!fRecoCandidate) { |
608 | AliDebug(2,"No reco candidate selected"); | |
609 | return ptProng; | |
610 | } | |
5cd139bc | 611 | |
612 | AliAODRecoCascadeHF* lcV0bachelor = (AliAODRecoCascadeHF*)fRecoCandidate; | |
a578b2da | 613 | AliAODTrack* bachelor = (AliAODTrack*)lcV0bachelor->GetBachelor(); |
614 | AliAODTrack* v0Pos = (AliAODTrack*)lcV0bachelor->Getv0PositiveTrack(); | |
615 | AliAODTrack* v0Neg = (AliAODTrack*)lcV0bachelor->Getv0NegativeTrack(); | |
616 | if (!(lcV0bachelor->Getv0()) || !bachelor || !v0Pos || !v0Neg) { | |
617 | AliDebug(2,"No V0 for this reco candidate selected"); | |
618 | return ptProng; | |
619 | } | |
5cd139bc | 620 | |
a578b2da | 621 | if (iProng==0) ptProng = bachelor->Pt(); |
622 | else if (iProng==1) ptProng = v0Pos->Pt(); | |
623 | else if (iProng==2) ptProng = v0Neg->Pt(); | |
5cd139bc | 624 | |
a578b2da | 625 | AliDebug(4,Form("Pt value for prong number %1d = %f",iProng,ptProng)); |
626 | ||
5cd139bc | 627 | return ptProng; |
628 | ||
629 | } | |
630 | ||
631 | //_____________________________________________________________ | |
632 | ||
633 | Double_t AliCFVertexingHFLctoV0bachelor::Ctau(AliAODMCParticle *mcPartCandidate) | |
634 | { | |
635 | ||
636 | Double_t cTau = 999999.; | |
637 | ||
a578b2da | 638 | Int_t daughterD0 = mcPartCandidate->GetDaughter(0); |
639 | Int_t daughterD1 = mcPartCandidate->GetDaughter(1); | |
ff12b981 | 640 | if (daughterD0<=0 || daughterD1<=0) { |
a578b2da | 641 | AliDebug(2, Form("The Lc MC particle doesn't have correct daughters, skipping!!")); |
642 | return cTau; | |
643 | } | |
5cd139bc | 644 | |
ff12b981 | 645 | AliAODMCParticle *mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD0)); |
646 | AliAODMCParticle *mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD1)); | |
a578b2da | 647 | if (!mcPartDaughter0 || !mcPartDaughter1) { |
648 | AliDebug(2,"The candidate daughter particles not found in MC array"); | |
649 | return cTau; | |
650 | } | |
651 | ||
652 | Double_t vtx1[3] = {0,0,0}; // primary vertex | |
653 | Bool_t hasProdVertex = mcPartCandidate->XvYvZv(vtx1); // cm | |
654 | ||
5cd139bc | 655 | Double_t vtx1daughter[3] = {0,0,0}; // secondary vertex |
a578b2da | 656 | Bool_t v0Vertex = mcPartDaughter0->XvYvZv(vtx1daughter); //cm |
657 | Double_t vtx2daughter[3] = {0,0,0}; // secondary vertex | |
658 | Bool_t bachVertex = hasProdVertex && mcPartDaughter1->XvYvZv(vtx2daughter); //cm | |
5cd139bc | 659 | |
a578b2da | 660 | if (!hasProdVertex || !v0Vertex || !bachVertex) { |
661 | AliDebug(2,"At least one of Prim.vtx, V0vtx, BachelorVtx doesn't exist!"); | |
662 | return cTau; | |
663 | } | |
664 | ||
665 | if (TMath::Abs(vtx1daughter[0]-vtx2daughter[0])>1E-5 || | |
666 | TMath::Abs(vtx1daughter[1]-vtx2daughter[1])>1E-5 || | |
667 | TMath::Abs(vtx1daughter[2]-vtx2daughter[2])>1E-5) { | |
668 | AliDebug(2,"Bachelor and V0 haven't common vtx!"); | |
669 | return cTau; | |
670 | } | |
5cd139bc | 671 | |
672 | Double_t decayLength = 0.; | |
673 | for (Int_t ii=0; ii<3; ii++) decayLength += (vtx1daughter[ii]-vtx1[ii])*(vtx1daughter[ii]-vtx1[ii]); | |
674 | decayLength = TMath::Sqrt(decayLength); | |
675 | ||
676 | cTau = decayLength * mcPartCandidate->M()/mcPartCandidate->P(); | |
a578b2da | 677 | |
5cd139bc | 678 | AliDebug(2,Form(" cTau(4122)=%f",cTau)); |
a578b2da | 679 | |
5cd139bc | 680 | return cTau; |
681 | ||
682 | } | |
a578b2da | 683 | |
684 | //------------ | |
685 | Bool_t AliCFVertexingHFLctoV0bachelor::SetLabelArray() | |
686 | { | |
687 | // | |
688 | // setting the label arrays | |
689 | // | |
690 | ||
691 | Bool_t checkCD = kFALSE; | |
692 | ||
693 | if (fmcPartCandidate->GetNDaughters()!=2) { | |
ff12b981 | 694 | AliDebug(2, Form("The MC particle have %d daughters (not 2), skipping!!",fmcPartCandidate->GetNDaughters())); |
695 | fmcPartCandidate->Print(); | |
a578b2da | 696 | return checkCD; |
697 | } | |
698 | ||
699 | Int_t daughter0 = fmcPartCandidate->GetDaughter(0); | |
700 | Int_t daughter1 = fmcPartCandidate->GetDaughter(1); | |
ff12b981 | 701 | if (daughter0<=0 || daughter1<=0){ |
a578b2da | 702 | AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!")); |
703 | return checkCD; | |
704 | } | |
705 | ||
706 | AliAODMCParticle* mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); | |
707 | AliAODMCParticle* mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); | |
708 | if (!mcPartDaughter0 || !mcPartDaughter1) { | |
709 | AliDebug(2,"Problems in the MC Daughters\n"); | |
710 | return checkCD; | |
711 | } | |
712 | ||
713 | ||
714 | fLabelArray = new Int_t[fProngs]; | |
715 | ||
716 | if (fGenLcOption==kCountLambdapi) { // Lc -> Lambda + pion OR cc | |
717 | ||
718 | if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==3122 && | |
719 | TMath::Abs(mcPartDaughter1->GetPdgCode())==211) && | |
720 | !(TMath::Abs(mcPartDaughter0->GetPdgCode())==211 && | |
721 | TMath::Abs(mcPartDaughter1->GetPdgCode())==3122)) { | |
722 | AliDebug(2, "The Lc MC doesn't decay in Lambda+pion (or cc), skipping!!"); | |
723 | delete [] fLabelArray; | |
724 | fLabelArray = 0x0; | |
725 | return checkCD; | |
726 | } | |
727 | ||
728 | // it is Lc -> Lambda + pion OR cc | |
729 | if (TMath::Abs(mcPartDaughter0->GetPdgCode())==3122) { | |
730 | mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor | |
731 | mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0 | |
732 | Int_t daughterTemp = daughter0; | |
733 | daughter0 = daughter1; // the bachelor label | |
734 | daughter1 = daughterTemp; // the V0 label | |
735 | } | |
736 | ||
737 | if (mcPartDaughter1->GetNDaughters()!=2) { | |
738 | AliDebug(2, "The Lambda MC particle doesn't decay in 2 particles, skipping!!"); | |
739 | delete [] fLabelArray; | |
740 | fLabelArray = 0x0; | |
741 | return checkCD; | |
742 | } | |
743 | ||
744 | Int_t daughter1D0 = mcPartDaughter1->GetDaughter(0); | |
745 | Int_t daughter1D1 = mcPartDaughter1->GetDaughter(1); | |
ff12b981 | 746 | if (daughter1D0<=0 || daughter1D1<=0) { |
a578b2da | 747 | AliDebug(2, Form("The Lambda MC particle doesn't have correct daughters, skipping!!")); |
748 | delete [] fLabelArray; | |
749 | fLabelArray = 0x0; | |
750 | return checkCD; | |
751 | } | |
752 | ||
753 | AliAODMCParticle* mcPartDaughter1D0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1D0)); | |
754 | AliAODMCParticle* mcPartDaughter1D1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1D1)); | |
755 | if (!mcPartDaughter1D0 || !mcPartDaughter1D1) { | |
756 | AliError("The Lambda daughter particles not found in MC array"); | |
757 | delete [] fLabelArray; | |
758 | fLabelArray = 0x0; | |
759 | return checkCD; | |
760 | } | |
761 | ||
762 | if (!(TMath::Abs(mcPartDaughter1D0->GetPdgCode())==211 && | |
763 | TMath::Abs(mcPartDaughter1D1->GetPdgCode())==2212) && | |
764 | !(TMath::Abs(mcPartDaughter1D0->GetPdgCode())==2212 && | |
765 | TMath::Abs(mcPartDaughter1D1->GetPdgCode())==211)) { | |
766 | AliDebug(2, "The Lambda MC doesn't decay in pi+proton (or cc), skipping!!"); | |
767 | delete [] fLabelArray; | |
768 | fLabelArray = 0x0; | |
769 | return checkCD; | |
770 | } | |
771 | ||
772 | // Lambda -> p+pi OR cc | |
773 | ||
774 | fLabelArray[0] = daughter0;//mcPartDaughter0->GetLabel(); // bachelor | |
775 | ||
776 | if (fmcPartCandidate->Charge()>0) { | |
777 | ||
778 | if (mcPartDaughter1D0->GetPdgCode()==2212) { | |
779 | fLabelArray[1] = daughter1D0;//mcPartDaughter1D0->GetLabel(); // proton | |
780 | fLabelArray[2] = daughter1D1;//mcPartDaughter1D1->GetLabel(); // pion | |
781 | } else if (mcPartDaughter1D1->GetPdgCode()==2212) { | |
782 | fLabelArray[1] = daughter1D1;//mcPartDaughter1D1->GetLabel(); // proton | |
783 | fLabelArray[2] = daughter1D0;//mcPartDaughter1D0->GetLabel(); // pion | |
784 | } | |
785 | ||
786 | } else if (fmcPartCandidate->Charge()<0) { | |
787 | ||
788 | if (mcPartDaughter1D0->GetPdgCode()==211) { | |
789 | fLabelArray[1] = daughter1D0;//mcPartDaughter1D0->GetLabel(); // pion | |
790 | fLabelArray[2] = daughter1D1;//mcPartDaughter1D1->GetLabel(); // proton | |
791 | } else if (mcPartDaughter1D1->GetPdgCode()==211) { | |
792 | fLabelArray[1] = daughter1D1;//mcPartDaughter1D1->GetLabel(); // pion | |
793 | fLabelArray[2] = daughter1D0;//mcPartDaughter1D0->GetLabel(); // proton | |
794 | } | |
795 | ||
796 | } | |
797 | ||
798 | } else if (fGenLcOption==kCountK0Sp) { // Lc -> K0bar + proton OR cc | |
799 | ||
800 | if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==311 && | |
801 | TMath::Abs(mcPartDaughter1->GetPdgCode())==2212) && | |
802 | !(TMath::Abs(mcPartDaughter0->GetPdgCode())==2212 && | |
803 | TMath::Abs(mcPartDaughter1->GetPdgCode())==311)) { | |
804 | AliDebug(2, "The Lc MC doesn't decay in K0bar+proton (or cc), skipping!!"); | |
805 | delete [] fLabelArray; | |
806 | fLabelArray = 0x0; | |
807 | return checkCD; | |
808 | } | |
809 | ||
810 | if (TMath::Abs(mcPartDaughter0->GetPdgCode())==311) { | |
811 | mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor | |
812 | mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0 | |
813 | Int_t daughterTemp = daughter0; | |
814 | daughter0 = daughter1; // the bachelor label | |
815 | daughter1 = daughterTemp; // the V0 label | |
816 | } | |
817 | ||
ff12b981 | 818 | if (mcPartDaughter1->GetNDaughters()!=1) { |
819 | AliDebug(2, "The K0/K0bar MC particle doesn't decay in 1 particles, skipping!!"); | |
820 | delete [] fLabelArray; | |
821 | fLabelArray = 0x0; | |
822 | return checkCD; | |
823 | } | |
824 | ||
a578b2da | 825 | Int_t daughter = mcPartDaughter1->GetDaughter(0); |
ff12b981 | 826 | if (daughter<=0) { |
a578b2da | 827 | AliDebug(2, Form("The K0/K0bar MC particle doesn't have correct daughter, skipping!!")); |
828 | delete [] fLabelArray; | |
829 | fLabelArray = 0x0; | |
830 | return checkCD; | |
831 | } | |
832 | ||
833 | AliAODMCParticle* mcPartDaughter = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter)); | |
834 | if (!mcPartDaughter) { | |
835 | AliError("The K0/K0bar daughter particle not found in MC array"); | |
836 | delete [] fLabelArray; | |
837 | fLabelArray = 0x0; | |
838 | return checkCD; | |
839 | } | |
840 | ||
841 | if (!(TMath::Abs(mcPartDaughter->GetPdgCode())==310)) { | |
842 | AliDebug(2, "The K0/K0bar MC doesn't go in K0S, skipping!!"); | |
843 | delete [] fLabelArray; | |
844 | fLabelArray = 0x0; | |
845 | return checkCD; | |
846 | } | |
847 | ||
848 | if (mcPartDaughter->GetNDaughters()!=2) { | |
849 | AliDebug(2, "The K0S MC doesn't decay in 2 particles, skipping!!"); | |
850 | delete [] fLabelArray; | |
851 | fLabelArray = 0x0; | |
852 | return checkCD; | |
853 | } | |
854 | ||
855 | Int_t daughterD0 = mcPartDaughter->GetDaughter(0); | |
856 | Int_t daughterD1 = mcPartDaughter->GetDaughter(1); | |
ff12b981 | 857 | if (daughterD0<=0 || daughterD1<=0) { |
a578b2da | 858 | AliDebug(2, Form("The K0S MC particle doesn't have correct daughters, skipping!!")); |
859 | delete [] fLabelArray; | |
860 | fLabelArray = 0x0; | |
861 | return checkCD; | |
862 | } | |
863 | ||
864 | AliAODMCParticle* mcPartDaughterD0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD0)); | |
865 | AliAODMCParticle* mcPartDaughterD1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD1)); | |
866 | if (!mcPartDaughterD0 || !mcPartDaughterD1) { | |
867 | AliError("The K0S daughter particles not found in MC array"); | |
868 | delete [] fLabelArray; | |
869 | fLabelArray = 0x0; | |
870 | return checkCD; | |
871 | } | |
872 | ||
873 | if (! ( TMath::Abs(mcPartDaughterD0->GetPdgCode())==211 && | |
874 | TMath::Abs(mcPartDaughterD1->GetPdgCode())==211 ) ) { | |
875 | AliDebug(2, "The K0S MC doesn't decay in pi+ pi-, skipping!!"); | |
876 | delete [] fLabelArray; | |
877 | fLabelArray = 0x0; | |
878 | return checkCD; | |
879 | } | |
880 | ||
881 | // K0S -> pi+ pi- | |
882 | ||
883 | fLabelArray[0] = daughter0;//mcPartDaughter0->GetLabel(); // bachelor | |
884 | ||
885 | if (mcPartDaughterD0->GetPdgCode()==211) { | |
886 | fLabelArray[1] = daughterD0;//mcPartDaughterD0->GetLabel(); // pi+ | |
887 | fLabelArray[2] = daughterD1;//mcPartDaughterD1->GetLabel(); // pi- | |
888 | AliDebug(2,Form(" daughter0=%d ------ daughter1=%d ------ dg0->GetLabel()=%d ------ dg1->GetLabel()=%d ",daughterD0,daughterD1,mcPartDaughterD0->GetLabel(),mcPartDaughterD1->GetLabel())); | |
889 | } else if (mcPartDaughterD1->GetPdgCode()==211) { | |
890 | fLabelArray[1] = daughterD1;//mcPartDaughterD1->GetLabel(); // pi+ | |
891 | fLabelArray[2] = daughterD0;//mcPartDaughterD0->GetLabel(); // pi- | |
892 | AliDebug(2,Form(" daughter0=%d ------ daughter1=%d ------ dg0->GetLabel()=%d ------ dg1->GetLabel()=%d ",daughterD1,daughterD0,mcPartDaughterD1->GetLabel(),mcPartDaughterD0->GetLabel())); | |
893 | } | |
894 | } | |
895 | ||
896 | AliDebug(2,Form(" label0=%d, label1=%d, label2=%d",fLabelArray[0],fLabelArray[1],fLabelArray[2])); | |
897 | ||
898 | SetAccCut(); // setting the pt and eta acceptance cuts | |
899 | ||
900 | checkCD = kTRUE; | |
901 | return checkCD; | |
902 | ||
903 | } | |
904 | //____________________________________________ | |
905 | Bool_t AliCFVertexingHFLctoV0bachelor::FillVectorFromMCarray(AliAODMCParticle *mcPartDaughterBachelor, | |
906 | AliAODMCParticle *mcPartDaughterK0, | |
907 | Double_t *vectorMC) | |
908 | { | |
909 | // fill the vector | |
910 | ||
911 | Bool_t bGenValues = kFALSE; | |
912 | ||
913 | AliAODMCParticle *mcPartV0DaughterPos = dynamic_cast<AliAODMCParticle*>(fmcArray->At(fLabelArray[1])); | |
914 | AliAODMCParticle *mcPartV0DaughterNeg = dynamic_cast<AliAODMCParticle*>(fmcArray->At(fLabelArray[2])); | |
915 | AliAODMCParticle *mcPartDaughterV0 = 0x0; | |
916 | ||
2db138e0 | 917 | if(!mcPartV0DaughterPos || !mcPartV0DaughterNeg) return bGenValues; |
a578b2da | 918 | |
919 | if (TMath::Abs(mcPartDaughterK0->GetPdgCode())==311) { | |
920 | Int_t daughterK0 = mcPartDaughterK0->GetDaughter(0); | |
ff12b981 | 921 | if (daughterK0<=0) { |
a578b2da | 922 | AliDebug(2, Form("The K0/K0bar particle doesn't have correct daughter, skipping!!")); |
923 | return bGenValues; | |
924 | } | |
925 | mcPartDaughterV0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterK0)); | |
926 | if (!mcPartDaughterV0) { | |
927 | AliDebug(2,"The K0/K0bar daughter particle not found in MC array"); | |
928 | return bGenValues; | |
929 | } | |
930 | if (TMath::Abs(mcPartDaughterV0->GetPdgCode())!=310) { | |
931 | AliDebug(2,"The K0/K0bar daughter particle is not a K0S"); | |
932 | return bGenValues; | |
933 | } | |
934 | } else if (TMath::Abs(mcPartDaughterK0->GetPdgCode())==3122) { | |
935 | mcPartDaughterV0 = dynamic_cast<AliAODMCParticle*>(mcPartDaughterK0); | |
936 | if (!mcPartDaughterV0) { | |
937 | AliDebug(2,"The Lambda particle not found in MC array"); | |
938 | return bGenValues; | |
939 | } | |
940 | } | |
941 | ||
9e4f1968 | 942 | if (!mcPartDaughterV0) { |
943 | AliDebug(2,"V0 particle not found in MC array"); | |
944 | return bGenValues; | |
945 | } | |
a578b2da | 946 | |
53c91ed7 | 947 | //Double_t cTLc = Ctau(fmcPartCandidate); // by default wrt Primary Vtx |
948 | //Double_t pTbach = mcPartDaughterBachelor->Pt(); // get the bachelor pT | |
949 | Double_t pbach = mcPartDaughterBachelor->P(); // get the bachelor p | |
a578b2da | 950 | |
951 | Double_t vtx1[3] = {0,0,0}; // primary vertex | |
952 | Bool_t hasPrimVtx = fmcPartCandidate->XvYvZv(vtx1); // cm | |
953 | ||
954 | // getting vertex from daughters | |
955 | Double_t vtx1daughter0[3] = {0,0,0}; // secondary vertex from daughter 0 | |
956 | Bool_t hasSecVtx1 = mcPartDaughterBachelor->XvYvZv(vtx1daughter0); //cm | |
957 | Double_t vtx1daughter1[3] = {0,0,0}; // secondary vertex from daughter 1 | |
958 | Bool_t hasSecVtx2 = mcPartDaughterV0->XvYvZv(vtx1daughter1); //cm | |
959 | if (!hasPrimVtx || !hasSecVtx1 || !hasSecVtx2) { | |
960 | AliDebug(2,"At least one of Prim.vtx, V0vtx, BachelorVtx doesn't exist!"); | |
961 | //return bGenValues; | |
962 | } | |
963 | ||
964 | if (TMath::Abs(vtx1daughter0[0]-vtx1daughter1[0])>1E-5 || | |
965 | TMath::Abs(vtx1daughter0[1]-vtx1daughter1[1])>1E-5 || | |
966 | TMath::Abs(vtx1daughter0[2]-vtx1daughter1[2])>1E-5) { | |
967 | AliError("Daughters have different secondary vertex, skipping the track"); | |
968 | //return bGenValues; | |
969 | } | |
970 | ||
971 | // getting the momentum from the daughters | |
972 | Double_t px1[2] = {mcPartDaughterBachelor->Px(), mcPartDaughterV0->Px()}; | |
973 | Double_t py1[2] = {mcPartDaughterBachelor->Py(), mcPartDaughterV0->Py()}; | |
974 | Double_t pz1[2] = {mcPartDaughterBachelor->Pz(), mcPartDaughterV0->Pz()}; | |
975 | ||
976 | Int_t nprongs = 2; | |
977 | Short_t charge = mcPartDaughterBachelor->Charge(); | |
978 | Double_t d0[2] = {0.,0.}; | |
979 | AliAODRecoDecayHF* decayLc = new AliAODRecoDecayHF(vtx1,vtx1daughter0,nprongs,charge,px1,py1,pz1,d0); | |
980 | Double_t cosPAwrtPrimVtxLc = decayLc->CosPointingAngle(); | |
981 | delete decayLc; | |
982 | ||
983 | // getting vertex from daughters | |
984 | Double_t vtx2daughter0[3] = {0,0,0}; // secondary vertex from daughter 0 | |
985 | Bool_t hasSecVtx3 = mcPartV0DaughterPos->XvYvZv(vtx2daughter0); //cm | |
986 | Double_t vtx2daughter1[3] = {0,0,0}; // secondary vertex from daughter 1 | |
987 | Bool_t hasSecVtx4 = mcPartV0DaughterNeg->XvYvZv(vtx2daughter1); //cm | |
988 | if (!hasSecVtx3 || !hasSecVtx4) { | |
989 | AliDebug(2,"At least one of V0Posvtx, V0Negtx doesn't exist!"); | |
990 | //return bGenValues; | |
991 | } | |
992 | ||
993 | if (TMath::Abs(vtx2daughter0[0]-vtx2daughter1[0])>1E-5 || | |
994 | TMath::Abs(vtx2daughter0[1]-vtx2daughter1[1])>1E-5 || | |
995 | TMath::Abs(vtx2daughter0[2]-vtx2daughter1[2])>1E-5) { | |
996 | AliError("Daughters have different secondary vertex, skipping the track"); | |
997 | //return bGenValues; | |
998 | } | |
999 | ||
1000 | // getting the momentum from the daughters | |
1001 | Double_t px[2] = {mcPartV0DaughterPos->Px(), mcPartV0DaughterNeg->Px()}; | |
1002 | Double_t py[2] = {mcPartV0DaughterPos->Py(), mcPartV0DaughterNeg->Py()}; | |
1003 | Double_t pz[2] = {mcPartV0DaughterPos->Pz(), mcPartV0DaughterNeg->Pz()}; | |
1004 | ||
1005 | nprongs = 2; | |
1006 | charge = 0; | |
1007 | AliAODRecoDecayHF* decay = new AliAODRecoDecayHF(vtx1,vtx2daughter0,nprongs,charge,px,py,pz,d0); | |
1008 | Double_t cosPAwrtPrimVtxV0 = decay->CosPointingAngle(); | |
53c91ed7 | 1009 | /* |
a578b2da | 1010 | Double_t cTV0 = 0.; //ct |
1011 | if (fGenLcOption==kCountK0Sp) { | |
1012 | cTV0 = decay->Ct(310); // by default wrt Primary Vtx | |
1013 | } else if (fGenLcOption==kCountLambdapi) { | |
1014 | cTV0 = decay->Ct(3122); // by default wrt Primary Vtx | |
1015 | } | |
53c91ed7 | 1016 | */ |
a578b2da | 1017 | |
1018 | Double_t invMass = 0.; //invMass | |
1019 | if (fGenLcOption==kCountK0Sp) { | |
1020 | invMass = decay->InvMass2Prongs(0,1,211,211); | |
1021 | } else if (fGenLcOption==kCountLambdapi) { | |
1022 | if (fmcPartCandidate->GetPdgCode() == 4122) | |
1023 | invMass = decay->InvMass2Prongs(0,1,2212,211); | |
1024 | else if (fmcPartCandidate->GetPdgCode() ==-4122) | |
1025 | invMass = decay->InvMass2Prongs(0,1,211,2212); | |
1026 | } | |
1027 | delete decay; | |
1028 | ||
1029 | vectorMC[0] = fmcPartCandidate->Pt(); | |
1030 | vectorMC[1] = fmcPartCandidate->Y() ; | |
1031 | vectorMC[2] = fmcPartCandidate->Phi(); | |
53c91ed7 | 1032 | vectorMC[3] = 0; // dummy value x MC, onTheFlyStatus |
1033 | vectorMC[4] = fzMCVertex; | |
a578b2da | 1034 | vectorMC[5] = fCentValue; // reconstructed centrality |
1035 | vectorMC[6] = 1; // dummy value x MC, fFake | |
1036 | vectorMC[7] = fMultiplicity; // reconstructed multiplicity | |
1037 | ||
1038 | if (fConfiguration==AliCFTaskVertexingHF::kSnail) { | |
53c91ed7 | 1039 | //vectorMC[8] = pTbach; |
1040 | vectorMC[8] = pbach; | |
1041 | vectorMC[9] = mcPartDaughterV0->Pt(); | |
1042 | vectorMC[10] = mcPartDaughterV0->Y(); | |
1043 | vectorMC[11] = mcPartDaughterV0->Phi(); | |
1044 | vectorMC[12] = invMass; | |
1045 | vectorMC[13] = 0; // dummy value x MC, V0 DCA | |
1046 | vectorMC[14] = cosPAwrtPrimVtxV0; | |
a578b2da | 1047 | vectorMC[15] = cosPAwrtPrimVtxLc; |
53c91ed7 | 1048 | //vectorMC[16] = cTV0*1.E4; // in micron |
1049 | //vectorMC[17] = cTLc*1.E4; // in micron | |
a578b2da | 1050 | } |
1051 | ||
1052 | bGenValues = kTRUE; | |
1053 | return bGenValues; | |
1054 | ||
1055 | } |