31 #include <TParticle.h>
32 #include <TParticlePDG.h>
38 #include <TDatabasePDG.h>
41 #include <AliAnalysisDataSlot.h>
42 #include <AliAnalysisDataContainer.h>
44 #include "AliMCEvent.h"
45 #include "AliAnalysisManager.h"
46 #include "AliAODMCHeader.h"
47 #include "AliAODHandler.h"
49 #include "AliAODVertex.h"
50 #include "AliAODRecoDecay.h"
54 #include "AliESDtrack.h"
55 #include "AliAODTrack.h"
57 #include "AliAODMCParticle.h"
58 #include "AliAnalysisTaskSE.h"
62 #include "AliPIDResponse.h"
63 #include "AliPIDCombined.h"
64 #include "AliTOFPIDResponse.h"
65 #include "AliInputEventHandler.h"
67 #include "AliKFParticle.h"
68 #include "AliKFVertex.h"
69 #include "AliExternalTrackParam.h"
70 #include "AliESDtrack.h"
87 fIsK0sAnalysis(kFALSE),
93 fUseOnTheFlyV0(kFALSE),
94 fIsEventSelected(kFALSE),
97 fCandidateVariables(),
102 fFillOnlySgn(kFALSE),
103 fHistoLcBeforeCuts(0),
104 fHistoFiducialAcceptance(0),
107 fHistoLcpKpiBeforeCuts(0),
110 fHistoDistanceLcToPrimVtx(0),
111 fHistoDistanceV0ToPrimVtx(0),
112 fHistoDistanceV0ToLc(0),
114 fHistoDistanceLcToPrimVtxSgn(0),
115 fHistoDistanceV0ToPrimVtxSgn(0),
116 fHistoDistanceV0ToLcSgn(0),
118 fHistoVtxLcResidualToPrimVtx(0),
119 fHistoVtxV0ResidualToPrimVtx(0),
120 fHistoVtxV0ResidualToLc(0),
123 fHistoDecayLengthV0All(0),
124 fHistoLifeTimeV0All(0),
127 fHistoDecayLengthV0True(0),
128 fHistoLifeTimeV0True(0),
130 fHistoMassV0TrueFromAOD(0),
132 fHistoMassV0TrueK0S(0),
133 fHistoDecayLengthV0TrueK0S(0),
134 fHistoLifeTimeV0TrueK0S(0),
136 fHistoMassV0TrueK0SFromAOD(0),
139 fHistoDecayLengthLcAll(0),
140 fHistoLifeTimeLcAll(0),
143 fHistoDecayLengthLcTrue(0),
144 fHistoLifeTimeLcTrue(0),
146 fHistoMassLcTrueFromAOD(0),
148 fHistoMassV0fromLcAll(0),
149 fHistoDecayLengthV0fromLcAll(0),
150 fHistoLifeTimeV0fromLcAll(0),
152 fHistoMassV0fromLcTrue(0),
153 fHistoDecayLengthV0fromLcTrue(0),
154 fHistoLifeTimeV0fromLcTrue(0),
157 fHistoMassLcSgnFromAOD(0),
158 fHistoDecayLengthLcSgn(0),
159 fHistoLifeTimeLcSgn(0),
161 fHistoMassV0fromLcSgn(0),
162 fHistoDecayLengthV0fromLcSgn(0),
163 fHistoLifeTimeV0fromLcSgn(0),
170 fHistoDecayLengthKFV0(0),
171 fHistoLifeTimeKFV0(0),
174 fHistoDecayLengthKFLc(0),
175 fHistoLifeTimeKFLc(0),
177 fHistoArmenterosPodolanskiV0KF(0),
178 fHistoArmenterosPodolanskiV0KFSgn(0),
179 fHistoArmenterosPodolanskiV0AOD(0),
180 fHistoArmenterosPodolanskiV0AODSgn(0),
184 ftopoConstraint(kTRUE),
185 fCallKFVertexing(kFALSE),
186 fKeepingOnlyHIJINGBkg(kFALSE),
189 fCutKFChi2NDF(999999.),
190 fCutKFDeviationFromVtx(999999.),
191 fCutKFDeviationFromVtxV0(0.),
194 fKeepingOnlyPYTHIABkg(kFALSE),
195 fHistoMCLcK0SpGen(0x0),
196 fHistoMCLcK0SpGenAcc(0x0),
197 fHistoMCLcK0SpGenLimAcc(0x0),
199 fFuncWeightPythia(0),
200 fFuncWeightFONLL5overLHC13d3(0),
201 fFuncWeightFONLL5overLHC13d3Lc(0)
210 AliAnalysisTaskSE(name),
216 fIsK0sAnalysis(kFALSE),
222 fUseOnTheFlyV0(useOnTheFly),
223 fIsEventSelected(kFALSE),
224 fVariablesTreeSgn(0),
225 fVariablesTreeBkg(0),
226 fCandidateVariables(),
231 fFillOnlySgn(kFALSE),
232 fHistoLcBeforeCuts(0),
233 fHistoFiducialAcceptance(0),
236 fHistoLcpKpiBeforeCuts(0),
239 fHistoDistanceLcToPrimVtx(0),
240 fHistoDistanceV0ToPrimVtx(0),
241 fHistoDistanceV0ToLc(0),
243 fHistoDistanceLcToPrimVtxSgn(0),
244 fHistoDistanceV0ToPrimVtxSgn(0),
245 fHistoDistanceV0ToLcSgn(0),
247 fHistoVtxLcResidualToPrimVtx(0),
248 fHistoVtxV0ResidualToPrimVtx(0),
249 fHistoVtxV0ResidualToLc(0),
252 fHistoDecayLengthV0All(0),
253 fHistoLifeTimeV0All(0),
256 fHistoDecayLengthV0True(0),
257 fHistoLifeTimeV0True(0),
259 fHistoMassV0TrueFromAOD(0),
261 fHistoMassV0TrueK0S(0),
262 fHistoDecayLengthV0TrueK0S(0),
263 fHistoLifeTimeV0TrueK0S(0),
265 fHistoMassV0TrueK0SFromAOD(0),
268 fHistoDecayLengthLcAll(0),
269 fHistoLifeTimeLcAll(0),
272 fHistoDecayLengthLcTrue(0),
273 fHistoLifeTimeLcTrue(0),
275 fHistoMassLcTrueFromAOD(0),
277 fHistoMassV0fromLcAll(0),
278 fHistoDecayLengthV0fromLcAll(0),
279 fHistoLifeTimeV0fromLcAll(0),
281 fHistoMassV0fromLcTrue(0),
282 fHistoDecayLengthV0fromLcTrue(0),
283 fHistoLifeTimeV0fromLcTrue(0),
286 fHistoMassLcSgnFromAOD(0),
287 fHistoDecayLengthLcSgn(0),
288 fHistoLifeTimeLcSgn(0),
290 fHistoMassV0fromLcSgn(0),
291 fHistoDecayLengthV0fromLcSgn(0),
292 fHistoLifeTimeV0fromLcSgn(0),
299 fHistoDecayLengthKFV0(0),
300 fHistoLifeTimeKFV0(0),
303 fHistoDecayLengthKFLc(0),
304 fHistoLifeTimeKFLc(0),
306 fHistoArmenterosPodolanskiV0KF(0),
307 fHistoArmenterosPodolanskiV0KFSgn(0),
308 fHistoArmenterosPodolanskiV0AOD(0),
309 fHistoArmenterosPodolanskiV0AODSgn(0),
313 ftopoConstraint(kTRUE),
314 fCallKFVertexing(kFALSE),
315 fKeepingOnlyHIJINGBkg(kFALSE),
318 fCutKFChi2NDF(999999.),
319 fCutKFDeviationFromVtx(999999.),
320 fCutKFDeviationFromVtxV0(0.),
323 fKeepingOnlyPYTHIABkg(kFALSE),
324 fHistoMCLcK0SpGen(0x0),
325 fHistoMCLcK0SpGenAcc(0x0),
326 fHistoMCLcK0SpGenLimAcc(0x0),
329 fFuncWeightPythia(0),
330 fFuncWeightFONLL5overLHC13d3(0),
331 fFuncWeightFONLL5overLHC13d3Lc(0)
336 Info(
"AliAnalysisTaskSELc2V0bachelorTMVA",
"Calling Constructor");
338 DefineOutput(1, TList::Class());
339 DefineOutput(2, AliNormalizationCounter::Class());
340 DefineOutput(3, TList::Class());
341 DefineOutput(4, TTree::Class());
342 DefineOutput(5, TTree::Class());
343 DefineOutput(6, TList::Class());
344 DefineOutput(7, TList::Class());
352 Info(
"~AliAnalysisTaskSELc2V0bachelorTMVA",
"Calling Destructor");
416 if (fDebug > 1) AliInfo(
"Init");
440 AliInfo(
"Terminate");
441 AliAnalysisTaskSE::Terminate();
443 fOutput =
dynamic_cast<TList*
> (GetOutputData(1));
445 AliError(
"fOutput not available");
454 AliInfo(Form(
"At MC level, %f Lc --> K0S + p were found",
fHistoMCLcK0SpGen->GetEntries()));
456 AliInfo(
"fHistoMCLcK0SpGen not available");
459 AliInfo(Form(
"At MC level, %f Lc --> K0S + p were found in the acceptance",
fHistoMCLcK0SpGenAcc->GetEntries()));
461 AliInfo(
"fHistoMCLcK0SpGenAcc not available");
464 AliInfo(Form(
"At Reco level, %lld Lc --> K0S + p were found",
fVariablesTreeSgn->GetEntries()));
466 AliInfo(
"fVariablesTreeSgn not available");
469 fOutputKF =
dynamic_cast<TList*
> (GetOutputData(6));
471 AliError(
"fOutputKF not available");
481 AliInfo(Form(
"CreateOutputObjects of task %s\n", GetName()));
490 const char* nameoutput = GetOutputSlot(1)->GetContainer()->GetName();
491 fVariablesTreeSgn =
new TTree(Form(
"%s_Sgn", nameoutput),
"Candidates variables tree, Signal");
492 fVariablesTreeBkg =
new TTree(Form(
"%s_Bkg", nameoutput),
"Candidates variables tree, Background");
495 TString * fCandidateVariableNames =
new TString[
nVar];
496 fCandidateVariableNames[0]=
"massLc2K0Sp";
497 fCandidateVariableNames[1]=
"massLc2Lambdapi";
498 fCandidateVariableNames[2]=
"massK0S";
499 fCandidateVariableNames[3]=
"massLambda";
500 fCandidateVariableNames[4]=
"massLambdaBar";
501 fCandidateVariableNames[5]=
"cosPAK0S";
502 fCandidateVariableNames[6]=
"dcaV0";
503 fCandidateVariableNames[7]=
"tImpParBach";
504 fCandidateVariableNames[8]=
"tImpParV0";
505 fCandidateVariableNames[9]=
"nSigmaTPCpr";
506 fCandidateVariableNames[10]=
"nSigmaTPCpi";
507 fCandidateVariableNames[11]=
"nSigmaTPCka";
508 fCandidateVariableNames[12]=
"nSigmaTOFpr";
509 fCandidateVariableNames[13]=
"nSigmaTOFpi";
510 fCandidateVariableNames[14]=
"nSigmaTOFka";
511 fCandidateVariableNames[15]=
"bachelorPt";
512 fCandidateVariableNames[16]=
"V0positivePt";
513 fCandidateVariableNames[17]=
"V0negativePt";
514 fCandidateVariableNames[18]=
"dcaV0pos";
515 fCandidateVariableNames[19]=
"dcaV0neg";
516 fCandidateVariableNames[20]=
"v0Pt";
517 fCandidateVariableNames[21]=
"massGamma";
518 fCandidateVariableNames[22]=
"LcPt";
519 fCandidateVariableNames[23]=
"combinedProtonProb";
520 fCandidateVariableNames[24]=
"LcEta";
521 fCandidateVariableNames[25]=
"V0positiveEta";
522 fCandidateVariableNames[26]=
"V0negativeEta";
523 fCandidateVariableNames[27]=
"TPCProtonProb";
524 fCandidateVariableNames[28]=
"TOFProtonProb";
525 fCandidateVariableNames[29]=
"bachelorEta";
526 fCandidateVariableNames[30]=
"LcP";
527 fCandidateVariableNames[31]=
"bachelorP";
528 fCandidateVariableNames[32]=
"v0P";
529 fCandidateVariableNames[33]=
"V0positiveP";
530 fCandidateVariableNames[34]=
"V0negativeP";
531 fCandidateVariableNames[35]=
"LcY";
532 fCandidateVariableNames[36]=
"v0Y";
533 fCandidateVariableNames[37]=
"bachelorY";
534 fCandidateVariableNames[38]=
"V0positiveY";
535 fCandidateVariableNames[39]=
"V0negativeY";
536 fCandidateVariableNames[40]=
"v0Eta";
537 fCandidateVariableNames[41]=
"DecayLengthLc";
538 fCandidateVariableNames[42]=
"DecayLengthK0S";
539 fCandidateVariableNames[43]=
"CtLc";
540 fCandidateVariableNames[44]=
"CtK0S";
541 fCandidateVariableNames[45]=
"bachCode";
542 fCandidateVariableNames[46]=
"k0SCode";
544 fCandidateVariableNames[47]=
"V0KFmass";
545 fCandidateVariableNames[48]=
"V0KFdecayLength";
546 fCandidateVariableNames[49]=
"V0KFlifeTime";
548 fCandidateVariableNames[50]=
"V0KFmassErr";
549 fCandidateVariableNames[51]=
"V0KFdecayTimeErr";
550 fCandidateVariableNames[52]=
"V0KFlifeTimeErr";
552 fCandidateVariableNames[53]=
"LcKFmass";
553 fCandidateVariableNames[54]=
"LcKFdecayLength";
554 fCandidateVariableNames[55]=
"LcKFlifeTime";
556 fCandidateVariableNames[56]=
"LcKFmassErr";
557 fCandidateVariableNames[57]=
"LcKFdecayTimeErr";
558 fCandidateVariableNames[58]=
"LcKFlifeTimeErr";
560 fCandidateVariableNames[59]=
"LcKFDistToPrimVtx";
561 fCandidateVariableNames[60]=
"V0KFDistToPrimVtx";
562 fCandidateVariableNames[61]=
"V0KFDistToLc";
563 fCandidateVariableNames[62]=
"alphaArmKF";
564 fCandidateVariableNames[63]=
"ptArmKF";
565 fCandidateVariableNames[64]=
"alphaArm";
566 fCandidateVariableNames[65]=
"ptArm";
568 fCandidateVariableNames[66]=
"ITSrefitV0pos";
569 fCandidateVariableNames[67]=
"ITSrefitV0neg";
571 fCandidateVariableNames[68]=
"TPCClV0pos";
572 fCandidateVariableNames[69]=
"TPCClV0neg";
574 fCandidateVariableNames[70]=
"v0Xcoord";
575 fCandidateVariableNames[71]=
"v0Ycoord";
576 fCandidateVariableNames[72]=
"v0Zcoord";
577 fCandidateVariableNames[73]=
"primVtxX";
578 fCandidateVariableNames[74]=
"primVtxY";
579 fCandidateVariableNames[75]=
"primVtxZ";
581 fCandidateVariableNames[76]=
"ITSclBach";
582 fCandidateVariableNames[77]=
"SPDclBach";
584 fCandidateVariableNames[78]=
"ITSclV0pos";
585 fCandidateVariableNames[79]=
"SPDclV0pos";
586 fCandidateVariableNames[80]=
"ITSclV0neg";
587 fCandidateVariableNames[81]=
"SPDclV0neg";
589 fCandidateVariableNames[82]=
"alphaArmLc";
590 fCandidateVariableNames[83]=
"alphaArmLcCharge";
591 fCandidateVariableNames[84]=
"ptArmLc";
593 fCandidateVariableNames[85]=
"CosThetaStar";
595 fCandidateVariableNames[86]=
"weightPtFlat";
596 fCandidateVariableNames[87]=
"weightFONLL5overLHC13d3";
597 fCandidateVariableNames[88]=
"weightFONLL5overLHC13d3Lc";
598 fCandidateVariableNames[89]=
"weightNch";
601 for(Int_t ivar=0; ivar<
nVar; ivar++){
606 fHistoEvents =
new TH1F(
"fHistoEvents",
"fHistoEvents", 2, -0.5, 1.5);
607 TString labelEv[2] = {
"NotSelected",
"Selected"};
608 for (Int_t ibin = 1; ibin <=
fHistoEvents->GetNbinsX(); ibin++){
612 fHistoLc =
new TH1F(
"fHistoLc",
"fHistoLc", 2, -0.5, 1.5);
614 fHistoLcOnTheFly =
new TH1F(
"fHistoLcOnTheFly",
"fHistoLcOnTheFly", 4, -0.5, 3.5);
615 TString labelOnTheFly[4] = {
"OnTheFly-Bkg",
"OfflineBkg",
"OnTheFly-Sgn",
"OfflineSgn"};
620 fHistoLcBeforeCuts =
new TH1F(
"fHistoLcBeforeCuts",
"fHistoLcBeforeCuts", 2, -0.5, 1.5);
621 TString labelBeforeCuts[2] = {
"Bkg",
"Sgn"};
624 fHistoLc->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].
Data());
628 TString labelAcc[4] = {
"NotOk-Bkg",
"Ok-Bkg",
"NotOk-Sgn",
"Ok-Sgn"};
633 fHistoCodesSgn =
new TH2F(
"fHistoCodesSgn",
"fHistoCodes for Signal; bachelor; K0S", 7, -1.5, 5.5, 9, -1.5, 7.5);
634 fHistoCodesBkg =
new TH2F(
"fHistoCodesBkg",
"fHistoCodes for Background; bachelor; K0S", 7, -1.5, 5.5, 9, -1.5, 7.5);
636 TString labelx[7] = {
"kBachInvalid",
"kBachFake",
"kBachNoProton",
"kBachPrimary",
"kBachNoLambdaMother",
637 "kBachDifferentLambdaMother",
"kBachCorrectLambdaMother"};
638 TString labely[9] = {
"kK0SInvalid",
"kK0SFake",
"kK0SNoK0S",
"kK0SWithoutMother",
"kK0SNotFromK0",
639 "kK0Primary",
"kK0NoLambdaMother",
"kK0DifferentLambdaMother",
"kK0CorrectLambdaMother"};
641 for (Int_t ibin = 1; ibin <=
fHistoCodesSgn->GetNbinsX(); ibin++){
645 for (Int_t ibin = 1; ibin <=
fHistoCodesSgn->GetNbinsY(); ibin++){
655 fHistoBackground =
new TH1F(
"fHistoBackground",
"fHistoBackground", 4, -0.5, 3.5);
656 TString labelBkg[4] = {
"Injected",
"Non-injected",
"Non-PYTHIA",
"PYTHIA"};
664 const Float_t ptbins[15] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 12., 17., 25., 35.};
666 fHistoMCLcK0SpGen =
new TH1F(
"fHistoMCLcK0SpGen",
"fHistoMCLcK0SpGen", 14, ptbins);
686 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
687 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
705 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
715 fHistoDistanceLcToPrimVtx =
new TH1D(
"fHistoDistanceLcToPrimVtx",
"Lc distance to Prim Vertex from KF; distance [cm]", 1000, 0., 1);
716 fHistoDistanceV0ToPrimVtx =
new TH1D(
"fHistoDistanceV0ToPrimVtx",
"V0 distance to Prim Vertex from KF; distance [cm]", 1000, 0., 100.);
717 fHistoDistanceV0ToLc =
new TH1D(
"fHistoDistanceV0ToLc",
"V0 distance to Lc Vertex from KF; distance [cm]", 1000, 0., 100.);
719 fHistoDistanceLcToPrimVtxSgn =
new TH1D(
"fHistoDistanceLcToPrimVtxSgn",
"Lc Sgn distance to Prim Vertex from KF; distance [cm]", 1000, 0., 1);
720 fHistoDistanceV0ToPrimVtxSgn =
new TH1D(
"fHistoDistanceV0ToPrimVtxSgn",
"V0 Sgn distance to Prim Vertex from KF; distance [cm]", 1000, 0., 100.);
721 fHistoDistanceV0ToLcSgn =
new TH1D(
"fHistoDistanceV0ToLcSgn",
"V0 Sgn distance to Lc Vertex from KF; distance [cm]", 1000, 0., 100.);
723 fHistoVtxLcResidualToPrimVtx =
new TH1D(
"fHistoVtxLcResidualToPrimVtx",
"Residual between MC and KF (MC - KF): Lc to Prim Vtx; distance [cm]", 1000, -5., 5.);
724 fHistoVtxV0ResidualToPrimVtx =
new TH1D(
"fHistoVtxV0ResidualToPrimVtx",
"Residual between MC and KF (MC - KF): V0 to Prim Vtx; distance [cm]", 1000, -5., 5.);
725 fHistoVtxV0ResidualToLc =
new TH1D(
"fHistoVtxV0ResidualToLc",
"Residual between MC and KF: V0 to Lc (MC - KF); distance [cm]", 1000, -5., 5.);
727 fHistoMassV0All =
new TH1D(
"fHistoMassV0All",
"V0 Mass; mass", 500, 0.4, 0.6);
728 fHistoDecayLengthV0All =
new TH1D(
"fHistoDecayLengthV0All",
"V0 Decay Length; decayLength", 500, -10, 10.0);
729 fHistoLifeTimeV0All =
new TH1D(
"fHistoLifeTimeV0All",
"V0 Life Time; lifeTime", 500, -10.0, 10.0);
731 fHistoMassV0True =
new TH1D(
"fHistoMassV0True",
"True V0 Mass; mass", 500, 0.4, 0.6);
732 fHistoDecayLengthV0True =
new TH1D(
"fHistoDecayLengthV0True",
"True V0 Decay Length; decayLength", 500, -10, 10.0);
733 fHistoLifeTimeV0True =
new TH1D(
"fHistoLifeTimeV0True",
"True V0 Life Time; lifeTime", 500, -10.0, 10.0);
737 fHistoMassV0TrueK0S =
new TH1D(
"fHistoMassV0TrueK0S",
"True V0-K0S Mass; mass", 500, 0.4, 0.6);
739 fHistoLifeTimeV0TrueK0S =
new TH1D(
"fHistoLifeTimeV0TrueK0S",
"True V0-K0S Life Time; lifeTime", 500, -10.0, 10.0);
743 fHistoMassLcAll =
new TH1D(
"fHistoMassLcAll",
"Lc Mass; mass", 500, 2.0, 3.0);
744 fHistoDecayLengthLcAll =
new TH1D(
"fHistoDecayLengthLcAll",
"Lc Decay Length; decayLenght", 100000, -0.1, 0.1);
745 fHistoLifeTimeLcAll =
new TH1D(
"fHistoLifeTimeLcAll",
"Lc Life Time; lifeTime", 100000, -0.1, 0.1);
747 fHistoMassLcTrue =
new TH1D(
"fHistoMassLcTrue",
"True Lc Mass; mass", 500, 2.0, 3.0);
748 fHistoDecayLengthLcTrue =
new TH1D(
"fHistoDecayLengthLcTrue",
"True Lc Decay Length; decayLength", 100000, -0.1, 0.1);
749 fHistoLifeTimeLcTrue =
new TH1D(
"fHistoLifeTimeLcTrue",
"True Lc Life Time; lifeTime", 100000, -0.1, 0.1);
753 fHistoMassV0fromLcAll =
new TH1D(
"fHistoMassV0fromLcAll",
"V0 mass from Lc built in KF; mass", 500, 0.4, 0.6);
754 fHistoDecayLengthV0fromLcAll =
new TH1D(
"fHistoDecayLengthV0fromLcAll",
"V0 Decay Length from Lc built in KF; decayLength", 500, 0, 10.0);
755 fHistoLifeTimeV0fromLcAll =
new TH1D(
"fHistoLifeTimeV0fromLcAll",
"V0 Life Time from Lc built in KF; lifeTime", 500, 0.0, 3.0);
757 fHistoMassV0fromLcTrue =
new TH1D(
"fHistoMassV0fromLcTrue",
"V0 mass from true Lc built in KF; mass", 500, 0.4, 0.6);
758 fHistoDecayLengthV0fromLcTrue=
new TH1D(
"fHistoDecayLengthV0fromLcTrue",
"V0 Decay Length from true Lc built in KF; decayLength", 500, 0, 10.0);
759 fHistoLifeTimeV0fromLcTrue =
new TH1D(
"fHistoLifeTimeV0fromLcTrue",
"V0 Life Time from true Lc built in KF; lifeTime", 500, 0.0, 3.0);
761 fHistoMassLcSgn =
new TH1D(
"fHistoMassLcSgn",
"True Lc Signal Mass; mass", 500, 2.0, 3.0);
762 fHistoMassLcSgnFromAOD =
new TH1D(
"fHistoMassLcSgnFromAOD",
"True Lc Signal Mass (AOD); mass", 500, 2.0, 3.0);
763 fHistoDecayLengthLcSgn =
new TH1D(
"fHistoDecayLengthLcSgn",
"True Lc Signal Decay Length; decayLength", 100000, -0.1, 0.1);
764 fHistoLifeTimeLcSgn =
new TH1D(
"fHistoLifeTimeLcSgn",
"True Lc Signal Life Time; lifeTime", 100000, -0.1, 0.1);
766 fHistoMassV0fromLcSgn =
new TH1D(
"fHistoMassV0fromLcSgn",
"V0 from True Lc Signal Mass; mass", 500, 0.4, 0.6);
768 fHistoLifeTimeV0fromLcSgn =
new TH1D(
"fHistoLifeTimeV0fromLcSgn",
"V0 True Lc Signal Life Time; lifeTime", 500, 0.0, 3.0);
770 fHistoKF =
new TH2D(
"fHistoKF",
"Summary from KF; V0 KF; Lc KF", 16, -0.5, 15.5, 16, -0.5, 15.5);
771 fHistoKFV0 =
new TH1D(
"fHistoKFV0",
"Summary from KF; V0 KF", 16, -0.5, 15.5);
772 fHistoKFLc =
new TH1D(
"fHistoKFLc",
"Summary from KF; V0 KF", 16, -0.5, 15.5);
773 TString axisLabel[16] = {
"AllOk",
"M_NotOk",
"Sm_NotOk",
"Dl_NotOk",
774 "Lt_NotOk",
"M_Sm_NotOk",
"M_Dl_NotOk",
"M_Lt_NotOk",
775 "Dl_Sm_NotOk",
"Dl_Lt_NotOk",
"Sm_Lt_NotOk",
"M_Sm_Dl_NotOk",
776 "M_Sm_Lt_NotOk",
"Sm_Dl_Lt_NotOk",
"M_Dl_Lt_NotOk",
"All_NotOk"};
778 for (Int_t ibin = 1; ibin <=16; ibin++){
779 fHistoKF->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
780 fHistoKF->GetYaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
781 fHistoKFV0->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
782 fHistoKFLc->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
785 fHistoMassKFV0 =
new TH2D(
"fHistoMassKFV0",
"mass vs sigmaMass for V0; mass; sigmaMass", 500, 0.4, 0.6, 500, 0., 10);
786 fHistoDecayLengthKFV0 =
new TH2D(
"fHistoDecayLengthKFV0",
"decayLength vs sigmaDecayLength for V0; decayLength; sigmaDecayLength", 500, -10, 10, 500, 0., 10);
787 fHistoLifeTimeKFV0 =
new TH2D(
"fHistoLifeTimeKFV0",
"lifeTime vs sigmalifeTime for V0; lifeTime; sigmaLifeTime", 500, -10, 10, 500, 0., 10);
789 fHistoMassKFLc =
new TH2D(
"fHistoMassKFLc",
"mass vs sigmaMass for Lc; mass; sigmaMass", 500, 0.4, 0.6, 500, 0., 10);
790 fHistoDecayLengthKFLc =
new TH2D(
"fHistoDecayLengthKFLc",
"decayLength vs sigmaDecayLength for Lc; decayLength; sigmaDecayLength", 500, -10, 10, 500, 0., 10);
791 fHistoLifeTimeKFLc =
new TH2D(
"fHistoLifeTimeKFLc",
"lifeTime vs sigmalifeTime for Lc; lifeTime; sigmaLifeTime", 500, -10, 10, 500, 0., 10);
793 fHistoArmenterosPodolanskiV0KF =
new TH2D(
"fHistoArmenterosPodolanskiV0KF",
"V0 ArmenterosPodolanski from KF; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
794 fHistoArmenterosPodolanskiV0KFSgn =
new TH2D(
"fHistoArmenterosPodolanskiV0KFSgn",
"V0 (signal) ArmenterosPodolanski from KF; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
795 fHistoArmenterosPodolanskiV0AOD =
new TH2D(
"fHistoArmenterosPodolanskiV0AOD",
"V0 ArmenterosPodolanski from AOD; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
796 fHistoArmenterosPodolanskiV0AODSgn =
new TH2D(
"fHistoArmenterosPodolanskiV0AODSgn",
"V0 (signal) ArmenterosPodolanski from AOD; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
879 fFuncWeightPythia =
new TF1(
"funcWeightPythia",
"1./(30. *[0]*x/TMath::Power(1.+(TMath::Power((x/[1]),[3])),[2]))",0.15,30);
884 fFuncWeightFONLL5overLHC13d3 =
new TF1(
"funcWeightFONLL5overLHC13d3",
"([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,30.);
885 fFuncWeightFONLL5overLHC13d3->SetParameters(2.94999e+00,3.47032e+00,2.81278e+00,2.5,1.93370e-02,3.86865e+00,-1.54113e-01,8.86944e-02,2.56267e-02);
887 fFuncWeightFONLL5overLHC13d3Lc =
new TF1(
"funcWeightFONLL5overLHC13d3Lc",
"([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,20.);
888 fFuncWeightFONLL5overLHC13d3Lc->SetParameters(5.94428e+01,1.63585e+01,9.65555e+00,6.71944e+00,8.88338e-02,2.40477e+00,-4.88649e-02,-6.78599e-01,-2.10951e-01);
900 AliError(
"NO EVENT FOUND!");
906 AliAODEvent* aodEvent =
dynamic_cast<AliAODEvent*
>(fInputEvent);
907 TClonesArray *arrayLctopKos=0;
909 TClonesArray *array3Prong = 0;
911 if (!aodEvent && AODEvent() && IsStandardAOD()) {
914 aodEvent =
dynamic_cast<AliAODEvent*
> (AODEvent());
917 AliAODHandler* aodHandler = (AliAODHandler*)
918 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
920 if (aodHandler->GetExtensions()) {
921 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(
"AliAOD.VertexingHF.root");
922 AliAODEvent *aodFromExt = ext->GetAOD();
923 arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject(
"CascadesHF");
925 array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject(
"Charm3Prong");
928 arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject(
"CascadesHF");
930 array3Prong=(TClonesArray*)aodEvent->GetList()->FindObject(
"Charm3Prong");
938 Int_t runnumber = aodEvent->GetRunNumber();
939 if (aodEvent->GetTriggerMask() == 0 && (runnumber >= 195344 && runnumber <= 195677)){
940 AliDebug(3,
"Event rejected because of null trigger mask");
947 TClonesArray *mcArray = 0;
948 AliAODMCHeader *mcHeader=0;
952 mcArray =
dynamic_cast<TClonesArray*
>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
954 AliError(
"Could not find Monte-Carlo in AOD");
958 mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
960 AliError(
"AliAnalysisTaskSELc2V0bachelorTMVA::UserExec: MC header branch not found!\n");
964 Double_t zMCVertex = mcHeader->GetVtxZ();
976 fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
978 if (
fVtx1->GetNContributors()<1)
return;
989 fBField = aodEvent->GetMagneticField();
990 AliKFParticle::SetField(
fBField);
992 Int_t nSelectedAnal = 0;
996 array3Prong, mcHeader);
1011 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
1012 AliAODMCParticle* mcPart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iPart));
1014 AliError(
"Failed casting particle from MC array!, Skipping particle");
1017 Int_t
pdg = mcPart->GetPdgCode();
1018 if (TMath::Abs(pdg) != 4122){
1019 AliDebug(2, Form(
"MC particle %d is not a Lc: its pdg code is %d", iPart, pdg));
1022 AliDebug(2, Form(
"Step 0 ok: MC particle %d is a Lc: its pdg code is %d", iPart, pdg));
1023 Int_t labeldaugh0 = mcPart->GetDaughter(0);
1024 Int_t labeldaugh1 = mcPart->GetDaughter(1);
1025 if (labeldaugh0 <= 0 || labeldaugh1 <= 0){
1026 AliDebug(2, Form(
"The MC particle doesn't have correct daughters, skipping!!"));
1029 else if (labeldaugh1 - labeldaugh0 == 1){
1030 AliDebug(2, Form(
"Step 1 ok: The MC particle has correct daughters!!"));
1031 AliAODMCParticle* daugh0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labeldaugh0));
1032 AliAODMCParticle* daugh1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labeldaugh1));
1033 if(!daugh0 || !daugh1){
1034 AliDebug(2,
"Particle daughters not properly retrieved!");
1037 Int_t pdgCodeDaugh0 = TMath::Abs(daugh0->GetPdgCode());
1038 Int_t pdgCodeDaugh1 = TMath::Abs(daugh1->GetPdgCode());
1039 AliAODMCParticle* bachelorMC = daugh0;
1040 AliAODMCParticle* v0MC = daugh1;
1041 AliDebug(2, Form(
"pdgCodeDaugh0 = %d, pdgCodeDaugh1 = %d", pdgCodeDaugh0, pdgCodeDaugh1));
1042 if ((pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) || (pdgCodeDaugh0 == 2212 && pdgCodeDaugh1 == 311)){
1045 if (pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) {
1046 bachelorMC = daugh1;
1049 AliDebug(2, Form(
"Number of Daughters of v0 = %d", v0MC->GetNDaughters()));
1050 if (v0MC->GetNDaughters() != 1) {
1051 AliDebug(2,
"The K0 does not decay in 1 body only! Impossible... Continuing...");
1055 AliDebug(2,
"Step 2 ok: The K0 does decay in 1 body only! ");
1056 Int_t labelK0daugh = v0MC->GetDaughter(0);
1057 AliAODMCParticle* partK0S =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0daugh));
1059 AliError(
"Error while casting particle! returning a NULL array");
1063 if (partK0S->GetNDaughters() != 2 || TMath::Abs(partK0S->GetPdgCode() != 310)){
1064 AliDebug(2,
"The K0 daughter is not a K0S or does not decay in 2 bodies");
1068 AliDebug(2,
"Step 3 ok: The K0 daughter is a K0S and does decay in 2 bodies");
1069 Int_t labelK0Sdaugh0 = partK0S->GetDaughter(0);
1070 Int_t labelK0Sdaugh1 = partK0S->GetDaughter(1);
1071 AliAODMCParticle* daughK0S0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0Sdaugh0));
1072 AliAODMCParticle* daughK0S1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0Sdaugh1));
1073 if (!daughK0S0 || ! daughK0S1){
1074 AliDebug(2,
"Could not access K0S daughters, continuing...");
1078 AliDebug(2,
"Step 4 ok: Could access K0S daughters, continuing...");
1079 Int_t pdgK0Sdaugh0 = daughK0S0->GetPdgCode();
1080 Int_t pdgK0Sdaugh1 = daughK0S1->GetPdgCode();
1081 if (TMath::Abs(pdgK0Sdaugh0) != 211 || TMath::Abs(pdgK0Sdaugh1) != 211){
1082 AliDebug(2,
"The K0S does not decay in pi+pi-, continuing");
1087 AliDebug(2, Form(
"----> Filling histo with pt = %f", mcPart->Pt()));
1091 if(!(TMath::Abs(bachelorMC->Eta()) > 0.9 || bachelorMC->Pt() < 0.1 ||
1092 TMath::Abs(daughK0S0->Eta()) > 0.9 || daughK0S0->Pt() < 0.1 ||
1093 TMath::Abs(daughK0S1->Eta()) > 0.9 || daughK0S1->Pt() < 0.1)) {
1098 AliDebug(2,
"not in fiducial acceptance! Skipping");
1116 TClonesArray *mcArray,
1117 Int_t &nSelectedAnal,
1119 AliAODMCHeader* aodheader){
1122 Int_t pdgCand = 4122;
1123 Int_t pdgDgLctoV0bachelor[2]={2212, 310};
1124 Int_t pdgDgV0toDaughters[2]={211, 211};
1126 Int_t pdgDgLctopKpi[3]={2212, 321, 211};
1129 Int_t n3Prong = array3Prong->GetEntriesFast();
1130 Int_t nCascades= arrayLctopKos->GetEntriesFast();
1133 for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
1139 Int_t mcLabel = d->MatchToMC(4122, mcArray, 3, pdgDgLctopKpi);
1144 AliAODMCParticle *partLcpKpi =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(mcLabel));
1146 Int_t pdgCode = partLcpKpi->GetPdgCode();
1147 AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1163 for (Int_t iLctopK0s = 0; iLctopK0s < nCascades; iLctopK0s++) {
1168 AliDebug(2,Form(
"Cascade %d doens't exist, skipping",iLctopK0s));
1178 fmcLabelLc = lcK0spr->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1180 AliDebug(2, Form(
"----> cascade number %d (total cascade number = %d) is a Lc!", iLctopK0s, nCascades));
1182 AliAODMCParticle *partLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(
fmcLabelLc));
1184 pdgCode = partLc->GetPdgCode();
1185 if (pdgCode<0) AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d",
fmcLabelLc, pdgCode));
1186 pdgCode = TMath::Abs(pdgCode);
1201 if (lcK0spr->GetNDaughters()!=2) {
1202 AliDebug(2,Form(
"Cascade %d has not 2 daughters (nDaughters=%d)",iLctopK0s,lcK0spr->GetNDaughters()));
1206 AliAODv0 * v0part =
dynamic_cast<AliAODv0*
>(lcK0spr->
Getv0());
1207 AliAODTrack * bachPart =
dynamic_cast<AliAODTrack*
>(lcK0spr->
GetBachelor());
1208 if (!v0part || !bachPart) {
1209 AliDebug(2,Form(
"Cascade %d has no V0 or no bachelor object",iLctopK0s));
1214 if (!v0part->GetSecondaryVtx()) {
1215 AliDebug(2,Form(
"No secondary vertex for V0 by cascade %d",iLctopK0s));
1219 if (v0part->GetNDaughters()!=2) {
1220 AliDebug(2,Form(
"current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters()));
1226 if (!v0Neg || !v0Pos) {
1227 AliDebug(2,Form(
"V0 by cascade %d has no V0positive of V0negative object",iLctopK0s));
1232 if (v0Pos->Charge() == v0Neg->Charge()) {
1233 AliDebug(2,Form(
"V0 by cascade %d has daughters with the same sign: IMPOSSIBLE!",iLctopK0s));
1244 mcLabel = lcK0spr->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1246 AliDebug(2,Form(
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s, nCascades));
1248 AliAODMCParticle *partLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(mcLabel));
1250 pdgCode = partLc->GetPdgCode();
1251 if (pdgCode<0) AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1252 pdgCode = TMath::Abs(pdgCode);
1262 AliDebug(2, Form(
"\n\n\n Analysing candidate %d\n", iLctopK0s));
1263 AliDebug(2, Form(
">>>>>>>>>> Candidate is background, fFillOnlySgn = %d --> SKIPPING",
fFillOnlySgn));
1272 if (!isCandidateInjected){
1273 AliDebug(2,
"The candidate is from HIJING (i.e. not injected), keeping it to fill background");
1277 AliDebug(2,
"The candidate is NOT from HIJING, we skip it when filling background");
1284 AliAODTrack *bachelor = (AliAODTrack*)lcK0spr->
GetBachelor();
1287 if (!bachelor || !v0pos || !v0neg) {
1288 AliDebug(2,
"Cannot retrieve one of the tracks while checking origin, continuing");
1292 Int_t labelbachelor = TMath::Abs(bachelor->GetLabel());
1293 Int_t labelv0pos = TMath::Abs(v0pos->GetLabel());
1294 Int_t labelv0neg = TMath::Abs(v0neg->GetLabel());
1295 AliAODMCParticle* MCbachelor = (AliAODMCParticle*)mcArray->At(labelbachelor);
1296 AliAODMCParticle* MCv0pos = (AliAODMCParticle*)mcArray->At(labelv0pos);
1297 AliAODMCParticle* MCv0neg = (AliAODMCParticle*)mcArray->At(labelv0neg);
1298 if (!MCbachelor || !MCv0pos || !MCv0neg) {
1299 AliDebug(2,
"Cannot retrieve MC particle for one of the tracks while checking origin, continuing");
1306 if (isBachelorFromPythia != 0 && isv0posFromPythia != 0 && isv0negFromPythia != 0){
1307 AliDebug(2,
"The candidate is from PYTHIA (i.e. all daughters originate from a quark), keeping it to fill background");
1311 AliDebug(2,
"The candidate is NOT from PYTHIA, we skip it when filling background");
1332 Int_t &nSelectedAnal,
1334 TClonesArray *mcArray, Int_t iLctopK0s){
1350 AliAODv0 * v0part = part->
Getv0();
1351 Bool_t onFlyV0 = v0part->GetOnFlyStatus();
1369 Double_t dcaV0 = v0part->GetDCA();
1370 Double_t invmassK0s = v0part->MassK0Short();
1391 if (isInV0window == 0) {
1392 AliDebug(2,
"No: The candidate has NOT passed the V0 window cuts!");
1393 if (isLc) Printf(
"SIGNAL candidate rejected: V0 window cuts");
1396 else AliDebug(2,
"Yes: The candidate has passed the mass cuts!");
1400 if (!isInCascadeWindow) {
1401 AliDebug(2,
"No: The candidate has NOT passed the cascade window cuts!");
1402 if (isLc) Printf(
"SIGNAL candidate rejected: cascade window cuts");
1405 else AliDebug(2,
"Yes: The candidate has passed the cascade window cuts!");
1409 if (!isCandidateSelectedCuts){
1410 AliDebug(2,
"No: Analysis cuts kCandidate level NOT passed");
1411 if (isLc) Printf(
"SIGNAL candidate rejected");
1415 AliDebug(2,
"Yes: Analysis cuts kCandidate level passed");
1418 AliAODTrack *bachelor = (AliAODTrack*)part->
GetBachelor();
1420 AliDebug(2, Form(
"Very weird, the bachelor is not there... returning for this candidate"));
1425 Double_t probTPCTOF[AliPID::kSPECIES]={-1.};
1428 AliDebug(2, Form(
"detUsed (TPCTOF case) = %d", detUsed));
1429 Double_t probProton = -1.;
1432 if (detUsed == (UInt_t)
fPIDCombined->GetDetectorMask() ) {
1433 AliDebug(2, Form(
"We have found the detector mask for TOF + TPC: probProton will be set to %f", probTPCTOF[AliPID::kProton]));
1434 probProton = probTPCTOF[AliPID::kProton];
1439 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
1440 AliDebug(2,
"We did not find the detector mask for TOF + TPC, let's see only TPC");
1442 AliDebug(2,Form(
" detUsed (TPC case) = %d", detUsed));
1443 if (detUsed == (UInt_t)
fPIDCombined->GetDetectorMask()) {
1444 probProton = probTPCTOF[AliPID::kProton];
1447 AliDebug(2, Form(
"TPC only worked: probProton will be set to %f", probTPCTOF[AliPID::kProton]));
1450 AliDebug(2,
"Only TPC did not work...");
1453 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
1455 AliDebug(2, Form(
"probProton = %f", probProton));
1458 Double_t probProtonTPC = -1.;
1459 Double_t probProtonTOF = -1.;
1460 Double_t pidTPC[AliPID::kSPECIES]={-1.};
1461 Double_t pidTOF[AliPID::kSPECIES]={-1.};
1462 Int_t respTPC =
fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTPC, bachelor, AliPID::kSPECIES, pidTPC);
1463 Int_t respTOF =
fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTOF, bachelor, AliPID::kSPECIES, pidTOF);
1464 if (respTPC == AliPIDResponse::kDetPidOk) probProtonTPC = pidTPC[AliPID::kProton];
1465 if (respTOF == AliPIDResponse::kDetPidOk) probProtonTOF = pidTOF[AliPID::kProton];
1469 AliDebug(2,
"On-the-fly discarded");
1480 if (isLc) Printf(
"SIGNAL candidate rejected");
1481 AliDebug(2,
"No: Analysis cuts kTracks level NOT passed");
1485 AliDebug(2,
"Yes: Analysis cuts kTracks level passed");
1488 Int_t pdgCand = 4122;
1489 Int_t pdgDgLctoV0bachelor[2]={211, 3122};
1490 Int_t pdgDgV0toDaughters[2]={2212, 211};
1491 Int_t isLc2LBarpi=0, isLc2Lpi=0;
1492 Int_t currentLabel = part->GetLabel();
1495 mcLabel = part->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1497 if (bachelor->Charge()==-1) isLc2LBarpi=1;
1498 if (bachelor->Charge()==+1) isLc2Lpi=1;
1502 Int_t pdgDg2prong[2] = {211, 211};
1506 labelK0S = v0part->MatchToMC(310, mcArray, 2, pdgDg2prong);
1507 if (labelK0S>=0) isK0S = 1;
1510 pdgDg2prong[0] = 211;
1511 pdgDg2prong[1] = 2212;
1513 Int_t isLambdaBar = 0;
1514 Int_t lambdaLabel = 0;
1516 lambdaLabel = v0part->MatchToMC(3122, mcArray, 2, pdgDg2prong);
1517 if (lambdaLabel>=0) {
1518 AliAODMCParticle *lambdaTrack = (AliAODMCParticle*)mcArray->At(lambdaLabel);
1519 if (lambdaTrack->GetPdgCode()==3122) isLambda = 1;
1520 else if (lambdaTrack->GetPdgCode()==-3122) isLambdaBar = 1;
1524 pdgDg2prong[0] = 11;
1525 pdgDg2prong[1] = 11;
1527 Int_t gammaLabel = 0;
1529 gammaLabel = v0part->MatchToMC(22, mcArray, 2, pdgDg2prong);
1530 if (gammaLabel>=0) {
1531 AliAODMCParticle *gammaTrack = (AliAODMCParticle*)mcArray->At(gammaLabel);
1532 if (gammaTrack->GetPdgCode()==22) isGamma = 1;
1537 if (currentLabel != -1){
1538 AliAODMCParticle *tempPart = (AliAODMCParticle*)mcArray->At(currentLabel);
1539 pdgTemp = tempPart->GetPdgCode();
1541 if (isLc) AliDebug(2, Form(
"Signal: Candidate is a Lc in K0s+p"));
1542 else if (isLc2LBarpi) AliDebug(2, Form(
"Background: Candidate is a Lc in Lbar + pi"));
1543 else if (isLc2Lpi) AliDebug(2, Form(
"Background: Candidate is a Lc in L + pi"));
1544 else AliDebug(2, Form(
"Pure bkg: Candidate has pdg = %d", pdgTemp));
1545 if (isK0S) AliDebug(2, Form(
"V0 is a K0S"));
1546 else if (isLambda) AliDebug(2, Form(
"V0 is a Lambda"));
1547 else if (isLambdaBar) AliDebug(2, Form(
"V0 is a LambdaBar"));
1548 else if (isGamma) AliDebug(2, Form(
"V0 is a Gamma"));
1552 Double_t invmassLambda = v0part->MassLambda();
1553 Double_t invmassLambdaBar = v0part->MassAntiLambda();
1556 Double_t nSigmaTPCpr=-999.;
1557 Double_t nSigmaTOFpr=-999.;
1560 Double_t nSigmaTPCpi=-999.;
1561 Double_t nSigmaTOFpi=-999.;
1564 Double_t nSigmaTPCka=-999.;
1565 Double_t nSigmaTOFka=-999.;
1579 nSigmaTPCpi =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kPion));
1580 nSigmaTPCka =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kKaon));
1581 nSigmaTPCpr =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kProton));
1582 nSigmaTOFpi =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kPion));
1583 nSigmaTOFka =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kKaon));
1584 nSigmaTOFpr =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kProton));
1586 Double_t ptLcMC = -1;
1587 Double_t weightPythia = -1, weight5LHC13d3 = -1, weight5LHC13d3Lc = -1;
1590 if (iLctopK0s >= 0) {
1591 AliAODMCParticle *partLcMC = (AliAODMCParticle*)mcArray->At(iLctopK0s);
1592 ptLcMC = partLcMC->Pt();
1600 Double_t weightNch = 1;
1603 if(nChargedMCPhysicalPrimary > 0){
1604 if(!
fHistoMCNch) AliInfo(
"Input histos to evaluate Nch weights missing");
1611 if (!onFlyV0 && isInV0window && isInCascadeWindow && part->
CosV0PointingAngle()>0.99 && TMath::Abs(nSigmaTPCpr) <= 3 && v0part->Getd0Prong(0) < 20 && v0part->Getd0Prong(1) < 20) {
1669 k0SCode =
CheckK0S(part, v0part, mcArray);
1675 Double_t V0KF[3] = {-999999, -999999, -999999};
1676 Double_t errV0KF[3] = {-999999, -999999, -999999};
1677 Double_t LcKF[3] = {-999999, -999999, -999999};
1678 Double_t errLcKF[3] = {-999999, -999999, -999999};
1679 Double_t distances[3] = {-999999, -999999, -999999};
1680 Double_t armPolKF[2] = {-999999, -999999};
1683 Int_t kfResult =
CallKFVertexing(part, v0part, bachelor, mcArray, &V0KF[0], &errV0KF[0], &LcKF[0], &errLcKF[0], &distances[0], &armPolKF[0]);
1684 AliDebug(2, Form(
"Result from KF = %d", kfResult));
1717 AliDebug(2, Form(
"v0pos->GetStatus() & AliESDtrack::kITSrefit= %d, v0neg->GetStatus() & AliESDtrack::kITSrefit = %d, v0pos->GetTPCClusterInfo(2, 1)= %f, v0neg->GetTPCClusterInfo(2, 1) = %f", (Int_t)(v0pos->GetStatus() & AliESDtrack::kITSrefit), (Int_t)(v0pos->GetStatus() & AliESDtrack::kITSrefit), v0pos->GetTPCClusterInfo(2, 1), v0neg->GetTPCClusterInfo(2, 1)));
1732 fCandidateVariables[77] = bachelor->HasPointOnITSLayer(0) + bachelor->HasPointOnITSLayer(1);
1740 TVector3 mom1(bachelor->Px(), bachelor->Py(), bachelor->Pz());
1741 TVector3 mom2(v0part->Px(), v0part->Py(), v0part->Pz());
1742 TVector3 momTot(part->Px(), part->Py(), part->Pz());
1744 Double_t Ql1 = mom1.Dot(momTot)/momTot.Mag();
1745 Double_t Ql2 = mom2.Dot(momTot)/momTot.Mag();
1747 Double_t alphaArmLc = (Ql1 - Ql2)/(Ql1 + Ql2);
1748 Double_t alphaArmLcCharge = ( bachelor->Charge() > 0 ? (Ql1 - Ql2)/(Ql1 + Ql2) : (Ql2 - Ql1)/(Ql1 + Ql2) );
1749 Double_t ptArmLc = mom1.Perp(momTot);
1755 Double_t massK0SPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
1756 Double_t massPrPDG = TDatabasePDG::Instance()->GetParticle(2212)->Mass();
1757 Double_t massLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
1759 Double_t pStar = TMath::Sqrt((massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)*(massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)-4.*massPrPDG*massPrPDG*massK0SPDG*massK0SPDG)/(2.*massLcPDG);
1760 Double_t e = part->E(4122);
1761 Double_t beta = part->P()/e;
1762 Double_t gamma = e/massLcPDG;
1764 Double_t cts = (Ql1/gamma-beta*TMath::Sqrt(pStar*pStar+massPrPDG*massPrPDG))/pStar;
1776 AliDebug(2, Form(
"Reco particle %d --> Filling Sgn", iLctopK0s));
1782 AliDebug(2,
"Filling Bkg");
1799 Double_t* V0KF, Double_t* errV0KF, Double_t* LcKF, Double_t* errLcKF,
1800 Double_t* distances, Double_t* armPolKF) {
1807 Int_t codeKFV0 = -1, codeKFLc = -1;
1809 AliKFVertex primVtxCopy;
1810 Int_t nt = 0, ntcheck = 0;
1811 Double_t pos[3] = {0., 0., 0.};
1814 Int_t contr =
fVtx1->GetNContributors();
1815 Double_t covmatrix[6] = {0.};
1816 fVtx1->GetCovarianceMatrix(covmatrix);
1817 Double_t chi2 =
fVtx1->GetChi2();
1818 AliESDVertex primaryESDVtxCopy(pos, covmatrix, chi2, contr,
"Vertex");
1821 primVtxCopy = AliKFVertex(primaryESDVtxCopy);
1822 nt = primaryESDVtxCopy.GetNContributors();
1825 Int_t
pdg[2] = {211, -211};
1826 Int_t pdgLc[2] = {2212, 310};
1828 Int_t pdgDgV0toDaughters[2] = {211, 211};
1830 Int_t mcLabelV0 = v0part->MatchToMC(310, mcArray, 2, pdgDgV0toDaughters);
1833 Bool_t isMCokV0 = kTRUE, isBkgV0 = kFALSE;
1834 AliKFParticle V0, positiveV0KF, negativeV0KF;
1835 Int_t labelsv0daugh[2] = {-1, -1};
1836 Int_t idv0daugh[2] = {-1, -1};
1837 AliExternalTrackParam* esdv0Daugh1 = 0x0;
1838 AliExternalTrackParam* esdv0Daugh2 = 0x0;
1839 for(Int_t ipr= 0; ipr < 2; ipr++){
1840 AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1842 AliDebug(2,
"No V0 daughters available");
1845 Double_t xyz[3], pxpypz[3], cv[21];
1847 aodTrack->GetXYZ(xyz);
1848 aodTrack->PxPyPz(pxpypz);
1849 aodTrack->GetCovarianceXYZPxPyPz(cv);
1850 sign = aodTrack->Charge();
1851 AliExternalTrackParam tmp1( xyz, pxpypz, cv, sign);
1853 if (ipr == 0) esdv0Daugh1 =
new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1854 else esdv0Daugh2 =
new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1855 labelsv0daugh[ipr] = TMath::Abs(aodTrack->GetLabel());
1856 idv0daugh[ipr] = aodTrack->GetID();
1857 if (labelsv0daugh[ipr] == -1) isBkgV0 = kTRUE;
1861 AliKFParticle daughterKF(*aodTrack, pdg[ipr]);
1862 if (aodTrack->Charge() > 0) {
1863 positiveV0KF = daughterKF;
1866 negativeV0KF = daughterKF;
1870 Double_t xn=0., xp=0.;
1871 AliDebug(2, Form(
"bField = %f, esdv0Daugh1 = %p, esdv0Daugh2 = %p",
fBField, esdv0Daugh1, esdv0Daugh2));
1874 AliExternalTrackParam tr1(*esdv0Daugh1);
1875 AliExternalTrackParam tr2(*esdv0Daugh2);
1879 AliKFParticle daughterKF1(tr1, 211);
1880 AliKFParticle daughterKF2(tr2, 211);
1881 V0.AddDaughter(positiveV0KF);
1882 V0.AddDaughter(negativeV0KF);
1891 if( V0.GetNDF() < 1 ) {
1895 if( TMath::Sqrt(TMath::Abs(V0.GetChi2()/V0.GetNDF())) >
fCutKFChi2NDF ) {
1901 for(Int_t ipr = 0; ipr < 2; ipr++){
1902 AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1904 if(!aodTrack->GetUsedForPrimVtxFit()) {
1908 AliKFParticle daughterKF(*aodTrack, pdg[ipr]);
1909 primVtxCopy -= daughterKF;
1923 Double_t massV0 = 999999, sigmaMassV0 = 999999;
1924 Int_t retMV0 = V0.GetMass( massV0, sigmaMassV0 );
1928 if (sigmaMassV0 > 1e19) codeKFV0 = 5;
1930 else if (sigmaMassV0 > 1e19) codeKFV0 = 2;
1934 if (massV0 < 0.4) Printf(
"\n\n>>>>>>>>>> Found the Funny V0 (mass = %f, sigma = %f, AOD mass = %f): labels of the tracks = %d, %d, id = %d and %d", massV0, sigmaMassV0, v0part->MassK0Short(), labelsv0daugh[0], labelsv0daugh[1], idv0daugh[0], idv0daugh[1]);
1935 if (massV0 > 0.55) Printf(
"\n\n>>>>>>>>>> Found the Funny V0 (mass = %f, , sigma = %f, AOD mass = %f): labels of the tracks = %d, %d, id = %d and %d", massV0, sigmaMassV0, v0part->MassK0Short(), labelsv0daugh[0], labelsv0daugh[1], idv0daugh[0], idv0daugh[1]);
1937 Printf(
"Vertices: KF: x = %f, y = %f, z = %f", V0.GetX(), V0.GetY(), V0.GetZ());
1938 Printf(
"Vertices: AOD: x = %f, y = %f, z = %f", v0part->Xv(), v0part->Yv(), v0part->Zv());
1941 if (
fUseMCInfo && TMath::Abs(labelsv0daugh[0] - labelsv0daugh[1]) == 1) {
1942 AliAODMCParticle* tmpdaughv01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[0]));
1943 AliAODMCParticle* tmpdaughv02 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[1]));
1944 if (!tmpdaughv01 && labelsv0daugh[0] > 0){
1945 AliDebug(2,
"Could not access MC info for first daughter of V0, continuing");
1947 if (!tmpdaughv02 && labelsv0daugh[1] > 0){
1948 AliDebug(2,
"Could not access MC info for second daughter of V0, continuing");
1951 Double_t xPionMC = tmpdaughv01->Xv();
1952 Double_t yPionMC = tmpdaughv01->Yv();
1953 Double_t zPionMC = tmpdaughv01->Zv();
1955 Printf(
"Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
1959 Printf(
"Not a true V0");
1966 nt = primVtxCopy.GetNContributors();
1969 Bool_t isMCokLc = kTRUE, isBkgLc = kFALSE;
1971 Int_t labelsLcdaugh[2] = {-1, -1};
1972 labelsLcdaugh[0] = TMath::Abs(bach->GetLabel());
1973 labelsLcdaugh[1] = mcLabelV0;
1975 if (bach->Charge() < 0) pdgLc[0] = -pdgLc[0];
1976 AliKFParticle daughterKFLc(*bach, pdgLc[0]);
1977 Lc.AddDaughter(daughterKFLc);
1978 TParticlePDG* particlePDG = TDatabasePDG::Instance()->GetParticle(310);
1979 Double_t massPDGK0S = particlePDG->Mass();
1980 V0.SetMassConstraint(massPDGK0S);
1982 if( Lc.GetNDF() < 1 ) {
1983 AliDebug(2, Form(
"Lc: Number of degrees of freedom < 1 (%d), continuing", Lc.GetNDF()));
1986 if( TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) >
fCutKFChi2NDF) {
1987 AliDebug(2, Form(
"Lc: Chi2 per DOF too big, continuing (%f)", TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
1993 if(!bach->GetUsedForPrimVtxFit()) {
1994 AliDebug(3,
"Lc: Bachelor was not used for primary vertex, not subtracting it from primary vertex");
1997 primVtxCopy -= daughterKFLc;
2026 if( TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) >
fCutKFChi2NDF) {
2027 AliDebug(2, Form(
"Lc: Final Chi2 per DOF too big, continuing (%f)", TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
2032 V0.SetProductionVertex(Lc);
2038 Double_t decayLengthV0 = 999999, sigmaDecayLengthV0 = 999999;
2039 Int_t retDLV0 = V0.GetDecayLength( decayLengthV0, sigmaDecayLengthV0 );
2041 if (sigmaDecayLengthV0 > 1e19) {
2045 if (sigmaMassV0 > 1e19) codeKFV0 = 11;
2047 else if (sigmaMassV0 > 1e19) codeKFV0 = 8;
2053 Double_t lifeTimeV0 = 999999, sigmaLifeTimeV0 = 999999;
2054 Int_t retTLV0 = V0.GetLifeTime( lifeTimeV0, sigmaLifeTimeV0 );
2056 if (sigmaLifeTimeV0 > 1e19) {
2058 if (sigmaDecayLengthV0 > 1e19) {
2062 if (sigmaMassV0 > 1e19) codeKFV0 = 15;
2064 else if (sigmaMassV0 > 1e19) codeKFV0 = 13;
2066 else if (massV0 < 0) {
2068 if (sigmaMassV0 > 1e19) codeKFV0 = 12;
2070 else if (sigmaMassV0 > 1e19) codeKFV0 = 10;
2075 if (codeKFV0 == -1) codeKFV0 = 0;
2078 AliDebug(2, Form(
"V0: mass = %f, decay length = %f, life time = %f", massV0, decayLengthV0, lifeTimeV0 ));
2084 Double_t qtAlphaV0[2] = {0., 0.};
2085 Double_t vtxV0KF[3] = {V0.GetX(), V0.GetY(), V0.GetZ()};
2086 positiveV0KF.TransportToPoint(vtxV0KF);
2087 negativeV0KF.TransportToPoint(vtxV0KF);
2088 V0.GetArmenterosPodolanski(positiveV0KF, negativeV0KF, qtAlphaV0);
2089 AliDebug(2, Form(
"Armenteros-Podolanski variables: alpha = %f, qt = %f", qtAlphaV0[1], qtAlphaV0[0]));
2092 armPolKF[0] = qtAlphaV0[1];
2093 armPolKF[1] = qtAlphaV0[0];
2097 AliAODMCParticle *motherV0 = 0x0;
2098 AliAODMCParticle *daughv01 = 0x0;
2099 AliAODMCParticle *daughv02 = 0x0;
2102 daughv01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[0]));
2103 daughv02 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[1]));
2104 if (!daughv01 && labelsv0daugh[0] > 0){
2105 AliDebug(2,
"Could not access MC info for first daughter of V0, continuing");
2108 if (!daughv02 && labelsv0daugh[1] > 0){
2109 AliDebug(2,
"Could not access MC info for second daughter of V0, continuing");
2113 if( daughv01->GetMother() == daughv02->GetMother() && daughv01->GetMother()>=0 ){
2114 AliDebug(3, Form(
"The mother has label %d", daughv01->GetMother()));
2115 motherV0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughv01->GetMother()));
2116 if( motherV0 && TMath::Abs(motherV0->GetPdgCode()) != 21 ){
2117 if( motherV0->GetNDaughters() == 2 ){
2122 if (TMath::Abs(motherV0->GetPdgCode()) == 310){
2129 AliDebug(2, Form(
"PDG V0 = %d, pi = %d, pj = %d, ndaughters = %d, mc mass = %f, reco mass = %f, v0 mass = %f", motherV0->GetPdgCode(), daughv01->GetPdgCode(), daughv02->GetPdgCode(), motherV0->GetNDaughters(), motherV0->GetCalcMass(), massV0, v0part->MassK0Short()));
2131 else if (!motherV0){
2132 AliDebug(3,
"could not access MC info for mother, continuing");
2135 AliDebug(3,
"MC mother is a gluon, continuing");
2139 AliDebug(3,
"Background V0!");
2145 AliDebug(2, Form(
"isMCokV0 = %d, isBkgV0 = %d", (Int_t)isMCokV0, (Int_t)isBkgV0));
2150 Double_t massLc = 999999, sigmaMassLc= 999999;
2151 Int_t retMLc = Lc.GetMass( massLc, sigmaMassLc );
2153 AliDebug(3, Form(
"----> Could not get mass (%e), and sigma(%e) for Lc, continuing", massLc, sigmaMassLc));
2156 if (sigmaMassLc > 1e19) codeKFLc = 5;
2158 else if (sigmaMassLc > 1e19) codeKFLc = 2;
2163 Double_t decayLengthLc = 999999, sigmaDecayLengthLc = 999999;
2164 Int_t retDLLc = Lc.GetDecayLength( decayLengthLc, sigmaDecayLengthLc );
2166 AliDebug(3,
"----> Lc: Could not get decay length, and sigma");
2167 if (sigmaDecayLengthLc > 1e19) {
2171 if (sigmaMassLc > 1e19) codeKFLc = 11;
2173 else if (sigmaMassLc > 1e19) codeKFLc = 8;
2176 AliDebug(3, Form(
"retDLLc = %d, with decayLength = %f and error = %e", retDLLc, decayLengthLc, sigmaDecayLengthLc));
2181 Double_t lifeTimeLc = 999999, sigmaLifeTimeLc = 999999;
2182 Int_t retTLLc = Lc.GetLifeTime( lifeTimeLc, sigmaLifeTimeLc );
2184 AliDebug(3,
"----> Lc: Could not get lifeTime, and sigma");
2185 if (sigmaLifeTimeLc > 1e19) {
2187 if (sigmaDecayLengthLc > 1e19) {
2191 if (sigmaMassLc > 1e19) codeKFLc = 15;
2193 else if (sigmaMassLc > 1e19) codeKFLc = 13;
2195 else if (massLc < 0) {
2197 if (sigmaMassLc > 1e19) codeKFLc = 12;
2199 else if (sigmaMassLc > 1e19) codeKFLc = 10;
2205 AliDebug(2, Form(
"Lc: mass = %f (error = %e), decay length = %f (error = %e), life time = %f (error = %e) --> codeKFLc = %d", massLc, sigmaMassLc, decayLengthLc, sigmaDecayLengthLc, lifeTimeLc, sigmaLifeTimeLc, codeKFLc));
2207 if (codeKFLc == -1) codeKFLc = 0;
2210 fHistoKF->Fill(codeKFV0, codeKFLc);
2221 Double_t xV0 = V0.GetX();
2222 Double_t yV0 = V0.GetY();
2223 Double_t zV0 = V0.GetZ();
2225 Double_t xLc = Lc.GetX();
2226 Double_t yLc = Lc.GetY();
2227 Double_t zLc = Lc.GetZ();
2229 Double_t xPrimVtx = primVtxCopy.GetX();
2230 Double_t yPrimVtx = primVtxCopy.GetY();
2231 Double_t zPrimVtx = primVtxCopy.GetZ();
2233 Double_t distanceLcToPrimVtx = TMath::Sqrt((xPrimVtx - xLc) * (xPrimVtx - xLc) +
2234 (yPrimVtx - yLc) * (yPrimVtx - yLc) +
2235 (zPrimVtx - zLc) * (zPrimVtx - zLc));
2237 Double_t distanceV0ToPrimVtx = TMath::Sqrt((xPrimVtx - xV0) * (xPrimVtx - xV0) +
2238 (yPrimVtx - yV0) * (yPrimVtx - yV0) +
2239 (zPrimVtx - zV0) * (zPrimVtx - zV0));
2241 Double_t distanceV0ToLc = TMath::Sqrt((xLc - xV0)*(xLc - xV0) +
2242 (yLc - yV0)*(yLc - yV0) +
2243 (zLc - zV0)*(zLc - zV0));
2251 distances[0] = distanceLcToPrimVtx;
2252 distances[1] = distanceV0ToPrimVtx;
2253 distances[2] = distanceV0ToLc;
2257 AliAODMCParticle *daughv01Lc = 0x0;
2258 AliAODMCParticle *K0S = 0x0;
2259 AliAODMCParticle *daughv02Lc = 0x0;
2261 if (labelsLcdaugh[0] >= 0) {
2263 daughv01Lc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsLcdaugh[0]));
2265 AliDebug(3,
"Could not access MC info for first daughter of Lc");
2269 AliDebug(2, Form(
"The bachelor has label = %d", daughv01Lc->GetLabel()));
2270 if (TMath::Abs(daughv01Lc->GetPdgCode()) != 2212) isBkgLc = kTRUE;
2277 if (labelsLcdaugh[1] >= 0) {
2279 K0S =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsLcdaugh[1]));
2281 AliDebug(3,
"Could not access MC info for second daughter of Lc");
2285 if (TMath::Abs(K0S->GetPdgCode()) != 310) isBkgLc = kTRUE;
2289 AliDebug(2,
"The K0S is not true --> it does not have a label, continuing...");
2295 Int_t iK0 = K0S->GetMother();
2297 Printf(
"The K0S has no mother... IMPOSSIBLE");
2300 daughv02Lc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iK0));
2302 AliDebug(3,
"Could not access MC info for second daughter of Lc");
2305 if( daughv01Lc && (daughv01Lc->GetMother() == daughv02Lc->GetMother()) && (daughv01Lc->GetMother()>=0) ){
2307 AliAODMCParticle *motherLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughv01Lc->GetMother()));
2308 Int_t pdgMum = 0, pdgBach = 0, pdgV0 = 0;
2309 if (motherLc) pdgMum = motherLc->GetPdgCode();
2310 if (daughv01Lc) pdgBach = daughv01Lc->GetPdgCode();
2311 if (daughv02Lc) pdgV0 = daughv02Lc->GetPdgCode();
2312 AliDebug(2, Form(
"pdgMum = %d, pdgBach = %d, pdgV0 = %d", pdgMum, pdgBach, pdgV0));
2314 if( motherLc && TMath::Abs(motherLc->GetPdgCode()) != 21 ){
2324 if (TMath::Abs(motherLc->GetPdgCode()) == 4122 && TMath::Abs(motherV0->GetPdgCode()) == 310 && TMath::Abs(daughv01Lc->GetPdgCode()) == 2212){
2325 AliDebug(2, Form(
"IT IS SIGNAL!!! with label = %d", motherLc->GetLabel()));
2350 Double_t xLcMC = motherLc->Xv();
2351 Double_t yLcMC = motherLc->Yv();
2352 Double_t zLcMC = motherLc->Zv();
2354 Double_t xProtonMC = daughv01Lc->Xv();
2355 Double_t yProtonMC = daughv01Lc->Yv();
2356 Double_t zProtonMC = daughv01Lc->Zv();
2359 Double_t vtxLcResidualToPrimVtx = TMath::Sqrt((xLcMC - xProtonMC) * (xLcMC - xProtonMC) +
2360 (yLcMC - yProtonMC) * (yLcMC - yProtonMC) +
2361 (zLcMC - zProtonMC) * (zLcMC - zProtonMC)) - distanceLcToPrimVtx;
2364 Double_t xV0MC = motherV0->Xv();
2365 Double_t yV0MC = motherV0->Yv();
2366 Double_t zV0MC = motherV0->Zv();
2369 Double_t xPionMC = daughv01->Xv();
2370 Double_t yPionMC = daughv01->Yv();
2371 Double_t zPionMC = daughv01->Zv();
2373 Printf(
"Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
2375 Double_t vtxV0ResidualToLc = TMath::Sqrt((xV0MC - xPionMC) * (xV0MC - xPionMC) +
2376 (yV0MC - yPionMC) * (yV0MC - yPionMC) +
2377 (zV0MC - zPionMC) * (zV0MC - zPionMC)) - distanceV0ToLc;
2381 Double_t vtxV0ResidualToPrimVtx = TMath::Sqrt((xPionMC - xLcMC) * (xPionMC - xLcMC) +
2382 (yPionMC - yLcMC) * (yPionMC - yLcMC) +
2383 (zPionMC - zLcMC) * (zPionMC - zLcMC)) - distanceV0ToPrimVtx;
2390 else if (!motherLc){
2391 AliDebug(2,
"We could not access MC info for Lc mother, so we did nothing");
2394 AliDebug(2,
"MC Lc mother is a gluon, so we did nothing");
2407 if ( retMV0 == 0 && retMLc == 0){
2409 errV0KF[0] = sigmaMassV0;
2410 V0KF[1] = decayLengthV0;
2411 errV0KF[1] = sigmaDecayLengthV0;
2412 V0KF[2] = lifeTimeV0;
2413 errV0KF[2] = sigmaLifeTimeV0;
2415 errLcKF[0] = sigmaMassLc;
2416 LcKF[1] = decayLengthLc;
2417 errLcKF[1] = sigmaDecayLengthLc;
2418 LcKF[2] = lifeTimeLc;
2419 errLcKF[2] = sigmaLifeTimeLc;
2427 AliAODTrack* bachelor,
2428 TClonesArray *mcArray ){
2435 Int_t label = bachelor->GetLabel();
2440 AliAODMCParticle *mcpart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(TMath::Abs(label)));
2442 Int_t
pdg = mcpart->PdgCode();
2443 if (TMath::Abs(pdg) != 2212) {
2444 AliDebug(2, Form(
"Bachelor is not a p, but a particle with pdg code = %d", pdg));
2451 Int_t bachelorMotherLabel = mcpart->GetMother();
2453 if (bachelorMotherLabel == -1) {
2456 AliAODMCParticle *bachelorMother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(bachelorMotherLabel));
2458 Int_t pdgMother = bachelorMother->PdgCode();
2459 if (TMath::Abs(pdgMother) != 4122) {
2460 AliDebug(2, Form(
"The proton does not come from a Lc, but from a particle with pdgcode = %d", pdgMother));
2464 if (labelLc != bachelorMotherLabel){
2466 AliDebug(2, Form(
"The proton comes from a Lc, but it is not the candidate we are analyzing"));
2470 AliDebug(2, Form(
"The proton comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2484 TClonesArray *mcArray ){
2495 if (labelFind == -1) {
2499 AliAODMCParticle *mcpart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelFind));
2501 Int_t
pdg = mcpart->PdgCode();
2502 if (TMath::Abs(pdg) != 310) {
2503 AliDebug(2, Form(
"K0Spart is not a K0S, but a particle with pdg code = %d", pdg));
2510 Int_t K0SpartMotherLabel = mcpart->GetMother();
2511 if (K0SpartMotherLabel == -1) {
2514 AliAODMCParticle *K0SpartMother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(K0SpartMotherLabel));
2516 Int_t pdgMotherK0S = K0SpartMother->PdgCode();
2517 if (TMath::Abs(pdgMotherK0S) != 311) {
2518 AliDebug(2, Form(
"The K0S does not come from a K0, but from a particle with pdgcode = %d", pdgMotherK0S));
2523 Int_t K0MotherLabel = K0SpartMother->GetMother();
2524 if (K0MotherLabel == -1) {
2527 AliAODMCParticle *K0Mother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(K0MotherLabel));
2529 Int_t pdgK0Mother = K0Mother->PdgCode();
2530 if (TMath::Abs(pdgK0Mother) != 4122) {
2531 AliDebug(2, Form(
"The K0 does not come from a Lc, but from a particle with pdgcode = %d", pdgK0Mother));
2536 if (labelLc != K0MotherLabel){
2537 AliDebug(2, Form(
"The K0S comes from a Lc, but it is not the candidate we are analyzing"));
2542 AliDebug(2, Form(
"The K0S comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2562 Int_t labMother[2]={-1, -1};
2563 AliAODMCParticle *part=0;
2564 AliAODMCParticle *mother=0;
2565 Int_t dgLabels = -1;
2567 Int_t ndg = v0part->GetNDaughters();
2569 AliFatal(Form(
"IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2572 for(Int_t i = 0; i < 2; i++) {
2573 AliAODTrack *trk = (AliAODTrack*)v0part->GetDaughter(i);
2574 dgLabels = trk->GetLabel();
2575 if (dgLabels == -1) {
2579 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2584 labMother[i] = part->GetMother();
2585 if (labMother[i] != -1){
2586 mother = (AliAODMCParticle*)mcArray->At(labMother[i]);
2597 if (labMother[0] == labMother[1])
return labMother[0];
2611 AliAODMCParticle *part=0;
2612 AliAODMCParticle *mother=0;
2613 AliAODMCParticle *grandmother=0;
2614 Int_t dgLabels = -1;
2616 Int_t ndg = cascade->GetNDaughters();
2618 AliFatal(Form(
"IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2622 AliAODTrack *trk = (AliAODTrack*)cascade->GetDaughter(0);
2623 dgLabels = trk->GetLabel();
2624 if (dgLabels == -1 ) {
2628 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2633 Int_t labMotherBach = part->GetMother();
2634 if (labMotherBach == -1){
2637 mother = (AliAODMCParticle*)mcArray->At(labMotherBach);
2643 AliAODv0 *v0 = (AliAODv0*)cascade->GetDaughter(1);
2645 if (dgLabels == -1 ) {
2649 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2654 Int_t labMotherv0 = part->GetMother();
2655 if (labMotherv0 == -1){
2658 mother = (AliAODMCParticle*)mcArray->At(labMotherv0);
2663 Int_t labGrandMotherv0 = mother->GetMother();
2664 if (labGrandMotherv0 == -1){
2667 grandmother = (AliAODMCParticle*)mcArray->At(labGrandMotherv0);
2674 if (labGrandMotherv0 == labMotherBach)
return labMotherBach;
Int_t IsSelectedSingleCut(TObject *obj, Int_t selectionLevel, Int_t cutIndex)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
TH1D * fHistoDistanceV0ToLc
! KF: distance V0 vertex from Lc vertex
TH2D * fHistoArmenterosPodolanskiV0KFSgn
! KF: Armeteros-Podolanski plot for V0 from signal Lc from KF
void FillMCHisto(TClonesArray *mcArray)
TH1D * fHistoKFV0
! KF: V0 code from KF (mass, decaylength, lifetime considered)
TH1D * fHistoDecayLengthLcTrue
! KF: decay length for true cascades reconstructed with KF
void StoreCandidates(AliVEvent *, Int_t nCand=0, Bool_t flagFilter=kTRUE)
TH1F * fHistoLc
! histogram with number of Lc
Double_t Ct(UInt_t pdg) const
TTree * fVariablesTreeSgn
flag for event selected
Int_t MatchToMC(Int_t pdgabs, Int_t pdgabs2prong, Int_t *pdgDg, Int_t *pdgDg2prong, TClonesArray *mcArray, Bool_t isV0=kFALSE) const
AliAODTrack * Getv0NegativeTrack() const
TH2D * fHistoLifeTimeKFLc
! KF: life time vs life time error for Lc from KF
AliPIDCombined * fPIDCombined
! combined PID response object
TH2D * fHistoArmenterosPodolanskiV0AODSgn
! KF: AOD Armeteros-Podolanski plot for V0 from signal Lc from KF
TH1D * fHistoVtxV0ResidualToPrimVtx
! KF: residual wrt MC of distance V0 vertex from primary vertex (MC - KF)
TH1F * fHistoLcpKpiBeforeCuts
! histogram number of true Lc–>pKpi (3 prong) before any cut
Bool_t fKeepingOnlyPYTHIABkg
magnetic field of current event
Double_t InvMassLctoLambdaPi() const
TH1D * fHistoDecayLengthV0All
! KF: decay length for all V0 reconstructed with KF
virtual void UserCreateOutputObjects()
Implementation of interface methods.
virtual void Terminate(Option_t *option)
TH1D * fHistoDecayLengthLcAll
! KF: decay length for all Lc reconstructed with KF
Bool_t fKeepingOnlyHIJINGBkg
flag to decide whether to call or not KF
TH1D * fHistoLifeTimeV0All
! KF: life time for all V0 reconstructed with KF
AliRDHFCutsLctoV0 * fAnalCuts
Float_t * fCandidateVariables
! variables to be written to the tree
TH1D * fHistoMassV0TrueK0S
! KF: mass for true V0 which are really K0S reconstructed with KF
TH2D * fHistoDecayLengthKFLc
! KF: decay length vs decay length error for Lc from KF
TList * fOutputKF
! User output1: list of histograms from KF
TF1 * fFuncWeightFONLL5overLHC13d3
! weight function for FONLL vs pPb prod.
AliNormalizationCounter * fCounter
switch between Lpi and K0sp
Bool_t fIsEventSelected
flag to analyze also on-the-fly V0 candidates
static Int_t CheckOrigin(TClonesArray *arrayMC, AliAODMCParticle *mcPart, Bool_t searchUpToQuark=kTRUE)
Double_t GetMaxVtxZ() const
Bool_t ftopoConstraint
label of candidate
TF1 * fFuncWeightFONLL5overLHC13d3Lc
! weight function for FONLL vs pPb prod.
TH1D * fHistoDecayLengthV0fromLcAll
! KF: decay length of V0 for all cascades reconstructed with KF
Double_t InvMassLctoK0sP() const
TH1D * fHistoMassV0TrueK0SFromAOD
! KF: AOD mass for true V0 which are really K0S reconstructed with KF
TH1F * fHistoLcOnTheFly
! histogram with number of Lc with on-the-fly V0
TH1D * fHistoLifeTimeLcTrue
! KF: life time for true cascades reconstructed with KF
TH1D * fHistoKFLc
! KF: Lc code from KF (mass, decaylength, lifetime considered)
TH2D * fHistoKF
! KF: V0 code vs Lc code from KF (mass, decaylength, lifetime considered)
Int_t CallKFVertexing(AliAODRecoCascadeHF *cascade, AliAODv0 *v0part, AliAODTrack *bach, TClonesArray *mcArray, Double_t *V0KF, Double_t *errV0KF, Double_t *LcKF, Double_t *errLcKF, Double_t *distances, Double_t *armPolKF)
AliAODTrack * Getv0PositiveTrack() const
TH1D * fHistoLifeTimeLcSgn
! KF: life time of signal Lc reconstructed with KF
TH1D * fHistoDistanceV0ToPrimVtx
! KF: distance V0 vertex from primary vertex
TH1D * fHistoMassLcSgnFromAOD
! KF: AOD mass of signal Lc reconstructed with KF
Bool_t fUseOnTheFlyV0
list of weights
TH1D * fHistoMassLcAll
! KF: mass for all Lc reconstructed with KF
TH1D * fHistoDistanceV0ToLcSgn
! KF: distance for signal Lc of V0 vertex from Lc vertex
TH1D * fHistoMassV0fromLcAll
! KF: mass of V0 for all cascades reconstructed with KF
TH1D * fHistoDecayLengthLcSgn
! KF: decay length of signal Lc reconstructed with KF
TH1F * fHistoMCLcK0SpGenAcc
! histo with MC Lc –> K0S + p
virtual ~AliAnalysisTaskSELc2V0bachelorTMVA()
TH1D * fHistoMassLcTrueFromAOD
! KF: AOD mass for true cascades reconstructed with KF
TH1D * fHistoMassV0fromLcSgn
! KF: mass of V0 for signal Lc reconstructed with KF
AliAODTrack * GetBachelor() const
Int_t FindLcLabel(AliAODRecoCascadeHF *cascade, TClonesArray *mcArray) const
TList * fOutput
Use MC info.
TH1D * fHistoLifeTimeV0fromLcAll
! KF: life time of V0 for all cascades reconstructed with KF
virtual void UserExec(Option_t *option)
TH2D * fHistoLifeTimeKFV0
! KF: life time vs life time error for V0 from KF
TH1D * fHistoMassV0TrueFromAOD
! KF: AOD mass for true V0 reconstructed with KF
Double_t fBField
current event number - for debug purposes
TH2D * fHistoDecayLengthKFV0
! KF: decay length vs decay length error for V0 from KF
Bool_t HasCascadeCandidateAnyDaughInjected(AliAODRecoCascadeHF *cand, AliAODMCHeader *header, TClonesArray *arrayMC)
TH1D * fHistoDecayLengthV0True
! KF: decay length for true V0 reconstructed with KF
TH1F * fHistoFiducialAcceptance
! histogram to check FiducialAcceptance cut
TH2F * fHistoCodesBkg
! histogram with codes for bachelor and V0 for background
Double_t CosV0PointingAngle() const
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
TH1D * fHistoLifeTimeV0fromLcTrue
! KF: life time of V0 for true cascades reconstructed with KF
AliVertexingHFUtils * fUtils
flag to fill bkg with only candidates that have daughters generated by HIJING (to be used for enriche...
EBachelor CheckBachelor(AliAODRecoCascadeHF *part, AliAODTrack *bachelor, TClonesArray *mcArray)
TH1D * fHistoDecayLengthV0fromLcSgn
! KF: decay length of V0 for signal Lc reconstructed with KF
void MakeAnalysisForLc2prK0S(TClonesArray *arrayLctopK0s, TClonesArray *mcArray, Int_t &nSelectedAnal, AliRDHFCutsLctoV0 *cutsAnal, TClonesArray *array3Prong, AliAODMCHeader *aodheader)
Bool_t IsEventSelected(AliVEvent *event)
TH1F * fHistoLcBeforeCuts
flag to fill only signal (speeding up processing)
void StoreEvent(AliVEvent *, AliRDHFCuts *, Bool_t mc=kFALSE, Int_t multiplicity=-9999, Double_t spherocity=-99.)
TH1D * fHistoDecayLengthV0TrueK0S
! KF: decay length for true V0 which are really K0S reconstructed with KF
void SetUsePID(Bool_t flag=kTRUE)
TH1D * fHistoLifeTimeLcAll
! KF: life time for all Lc reconstructed with KF
TH1D * fHistoMassV0All
! KF: mass for all V0 reconstructed with KF
TH1D * fHistoMassLcTrue
! KF: mass for true cascades reconstructed with KF
TH1D * fHistoLifeTimeV0True
! KF: life time for true V0 reconstructed with KF
TH1F * fHistoMCLcK0SpGenLimAcc
! histo with MC Lc –> K0S + p
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
TH2D * fHistoArmenterosPodolanskiV0AOD
! KF: AOD Armeteros-Podolanski plot for all V0 from KF
TH1D * fHistoVtxV0ResidualToLc
! KF: residual wrt MC of distance V0 vertex from Lc vertex (MC - KF)
static Int_t GetGeneratedPhysicalPrimariesInEtaRange(TClonesArray *arrayMC, Double_t mineta, Double_t maxeta)
TH1D * fHistoDistanceV0ToPrimVtxSgn
! KF: distance for signal Lc of V0 vertex from primary vertex
TF1 * fFuncWeightPythia
mask to the trigger word returned by the physics selection
TH2D * fHistoArmenterosPodolanskiV0KF
! KF: Armeteros-Podolanski plot for all V0 from KF
TH1D * fHistoDecayLengthV0fromLcTrue
! KF: decay length of V0 for true cascades reconstructed with KF
Bool_t GetIsUsePID() const
TH1D * fHistoLifeTimeV0fromLcSgn
! KF: life time of V0 for signal Lc reconstructed with KF
TTree * fVariablesTreeBkg
! tree of the candidate variables after track selection (Background)
TH1D * fHistoDistanceLcToPrimVtx
primary vertex
Double_t DecayLengthV0() const
void SetTriggerClass(TString trclass0, TString trclass1="")
TH1D * fHistoDistanceLcToPrimVtxSgn
! KF: distance of signal Lc vertex from primary vertex
AliPIDResponse * fPIDResponse
! PID response object
virtual Bool_t IsInFiducialAcceptance(Double_t pt, Double_t y) const
TList * fListCuts
Cuts - sent to output slot 5.
EK0S CheckK0S(AliAODRecoCascadeHF *part, AliAODv0 *v0part, TClonesArray *mcArray)
TH1D * fHistoLifeTimeV0TrueK0S
! KF: life time for true V0 which are really K0S reconstructed with KF
TH1F * fHistoMCLcK0SpGen
flag to allow to use only PYTHIA tracks for background
Double_t DecayLength() const
AliAnalysisTaskSELc2V0bachelorTMVA()
TH2D * fHistoMassKFLc
! KF: mass vs mass error for Lc from KF
Bool_t fCallKFVertexing
flag to use topological constraints in KF
Int_t fCurrentEvent
cut for KF on distance to primary vtx for V0
void FillLc2pK0Sspectrum(AliAODRecoCascadeHF *part, Int_t isLc, Int_t &nSelectedAnal, AliRDHFCutsLctoV0 *cutsAnal, TClonesArray *mcArray, Int_t iLctopK0s)
histos
TH1F * fHistoEvents
flag for running on pA
TH1D * fHistoVtxLcResidualToPrimVtx
! KF: residual wrt MC of distance Lc vertex from primary vertex (MC - KF)
TList * fListWeight
list of cuts
void SetTriggerMask(ULong64_t mask=0)
TH1D * fHistoMassV0True
! KF: mass for true V0 reconstructed with KF
TH2D * fHistoMassKFV0
! KF: mass vs mass error for V0 from KF
Int_t FindV0Label(AliAODRecoDecay *v0part, TClonesArray *mcArray) const
TH1D * fHistoMassLcSgn
! KF: mass of signal Lc reconstructed with KF
TH2F * fHistoCodesSgn
! histogram with codes for bachelor and V0 for signal
TH1D * fHistoMassV0fromLcTrue
! KF: mass of V0 for true cascades reconstructed with KF
Class with functions useful for different D2H analyses //.
TH1F * fHistoBackground
AliVertexingHFUtils used to check the generator of a specific candidate.