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),
211 AliAnalysisTaskSE(name),
217 fIsK0sAnalysis(kFALSE),
223 fUseOnTheFlyV0(useOnTheFly),
224 fIsEventSelected(kFALSE),
225 fVariablesTreeSgn(0),
226 fVariablesTreeBkg(0),
227 fCandidateVariables(),
232 fFillOnlySgn(kFALSE),
233 fHistoLcBeforeCuts(0),
234 fHistoFiducialAcceptance(0),
237 fHistoLcpKpiBeforeCuts(0),
240 fHistoDistanceLcToPrimVtx(0),
241 fHistoDistanceV0ToPrimVtx(0),
242 fHistoDistanceV0ToLc(0),
244 fHistoDistanceLcToPrimVtxSgn(0),
245 fHistoDistanceV0ToPrimVtxSgn(0),
246 fHistoDistanceV0ToLcSgn(0),
248 fHistoVtxLcResidualToPrimVtx(0),
249 fHistoVtxV0ResidualToPrimVtx(0),
250 fHistoVtxV0ResidualToLc(0),
253 fHistoDecayLengthV0All(0),
254 fHistoLifeTimeV0All(0),
257 fHistoDecayLengthV0True(0),
258 fHistoLifeTimeV0True(0),
260 fHistoMassV0TrueFromAOD(0),
262 fHistoMassV0TrueK0S(0),
263 fHistoDecayLengthV0TrueK0S(0),
264 fHistoLifeTimeV0TrueK0S(0),
266 fHistoMassV0TrueK0SFromAOD(0),
269 fHistoDecayLengthLcAll(0),
270 fHistoLifeTimeLcAll(0),
273 fHistoDecayLengthLcTrue(0),
274 fHistoLifeTimeLcTrue(0),
276 fHistoMassLcTrueFromAOD(0),
278 fHistoMassV0fromLcAll(0),
279 fHistoDecayLengthV0fromLcAll(0),
280 fHistoLifeTimeV0fromLcAll(0),
282 fHistoMassV0fromLcTrue(0),
283 fHistoDecayLengthV0fromLcTrue(0),
284 fHistoLifeTimeV0fromLcTrue(0),
287 fHistoMassLcSgnFromAOD(0),
288 fHistoDecayLengthLcSgn(0),
289 fHistoLifeTimeLcSgn(0),
291 fHistoMassV0fromLcSgn(0),
292 fHistoDecayLengthV0fromLcSgn(0),
293 fHistoLifeTimeV0fromLcSgn(0),
300 fHistoDecayLengthKFV0(0),
301 fHistoLifeTimeKFV0(0),
304 fHistoDecayLengthKFLc(0),
305 fHistoLifeTimeKFLc(0),
307 fHistoArmenterosPodolanskiV0KF(0),
308 fHistoArmenterosPodolanskiV0KFSgn(0),
309 fHistoArmenterosPodolanskiV0AOD(0),
310 fHistoArmenterosPodolanskiV0AODSgn(0),
314 ftopoConstraint(kTRUE),
315 fCallKFVertexing(kFALSE),
316 fKeepingOnlyHIJINGBkg(kFALSE),
319 fCutKFChi2NDF(999999.),
320 fCutKFDeviationFromVtx(999999.),
321 fCutKFDeviationFromVtxV0(0.),
324 fKeepingOnlyPYTHIABkg(kFALSE),
325 fHistoMCLcK0SpGen(0x0),
326 fHistoMCLcK0SpGenAcc(0x0),
327 fHistoMCLcK0SpGenLimAcc(0x0),
330 fFuncWeightPythia(0),
331 fFuncWeightFONLL5overLHC13d3(0),
332 fFuncWeightFONLL5overLHC13d3Lc(0),
338 Info(
"AliAnalysisTaskSELc2V0bachelorTMVA",
"Calling Constructor");
340 DefineOutput(1, TList::Class());
341 DefineOutput(2, AliNormalizationCounter::Class());
342 DefineOutput(3, TList::Class());
343 DefineOutput(4, TTree::Class());
344 DefineOutput(5, TTree::Class());
345 DefineOutput(6, TList::Class());
346 DefineOutput(7, TList::Class());
354 Info(
"~AliAnalysisTaskSELc2V0bachelorTMVA",
"Calling Destructor");
418 if (fDebug > 1) AliInfo(
"Init");
442 AliInfo(
"Terminate");
443 AliAnalysisTaskSE::Terminate();
445 fOutput =
dynamic_cast<TList*
> (GetOutputData(1));
447 AliError(
"fOutput not available");
456 AliInfo(Form(
"At MC level, %f Lc --> K0S + p were found",
fHistoMCLcK0SpGen->GetEntries()));
458 AliInfo(
"fHistoMCLcK0SpGen not available");
461 AliInfo(Form(
"At MC level, %f Lc --> K0S + p were found in the acceptance",
fHistoMCLcK0SpGenAcc->GetEntries()));
463 AliInfo(
"fHistoMCLcK0SpGenAcc not available");
466 AliInfo(Form(
"At Reco level, %lld Lc --> K0S + p were found",
fVariablesTreeSgn->GetEntries()));
468 AliInfo(
"fVariablesTreeSgn not available");
471 fOutputKF =
dynamic_cast<TList*
> (GetOutputData(6));
473 AliError(
"fOutputKF not available");
483 AliInfo(Form(
"CreateOutputObjects of task %s\n", GetName()));
492 const char* nameoutput = GetOutputSlot(1)->GetContainer()->GetName();
493 fVariablesTreeSgn =
new TTree(Form(
"%s_Sgn", nameoutput),
"Candidates variables tree, Signal");
494 fVariablesTreeBkg =
new TTree(Form(
"%s_Bkg", nameoutput),
"Candidates variables tree, Background");
497 TString * fCandidateVariableNames =
new TString[
nVar];
498 fCandidateVariableNames[0]=
"massLc2K0Sp";
499 fCandidateVariableNames[1]=
"massLc2Lambdapi";
500 fCandidateVariableNames[2]=
"massK0S";
501 fCandidateVariableNames[3]=
"massLambda";
502 fCandidateVariableNames[4]=
"massLambdaBar";
503 fCandidateVariableNames[5]=
"cosPAK0S";
504 fCandidateVariableNames[6]=
"dcaV0";
505 fCandidateVariableNames[7]=
"tImpParBach";
506 fCandidateVariableNames[8]=
"tImpParV0";
507 fCandidateVariableNames[9]=
"nSigmaTPCpr";
508 fCandidateVariableNames[10]=
"nSigmaTPCpi";
509 fCandidateVariableNames[11]=
"nSigmaTPCka";
510 fCandidateVariableNames[12]=
"nSigmaTOFpr";
511 fCandidateVariableNames[13]=
"nSigmaTOFpi";
512 fCandidateVariableNames[14]=
"nSigmaTOFka";
513 fCandidateVariableNames[15]=
"bachelorPt";
514 fCandidateVariableNames[16]=
"V0positivePt";
515 fCandidateVariableNames[17]=
"V0negativePt";
516 fCandidateVariableNames[18]=
"dcaV0pos";
517 fCandidateVariableNames[19]=
"dcaV0neg";
518 fCandidateVariableNames[20]=
"v0Pt";
519 fCandidateVariableNames[21]=
"massGamma";
520 fCandidateVariableNames[22]=
"LcPt";
521 fCandidateVariableNames[23]=
"combinedProtonProb";
522 fCandidateVariableNames[24]=
"LcEta";
523 fCandidateVariableNames[25]=
"V0positiveEta";
524 fCandidateVariableNames[26]=
"V0negativeEta";
525 fCandidateVariableNames[27]=
"TPCProtonProb";
526 fCandidateVariableNames[28]=
"TOFProtonProb";
527 fCandidateVariableNames[29]=
"bachelorEta";
528 fCandidateVariableNames[30]=
"LcP";
529 fCandidateVariableNames[31]=
"bachelorP";
530 fCandidateVariableNames[32]=
"v0P";
531 fCandidateVariableNames[33]=
"V0positiveP";
532 fCandidateVariableNames[34]=
"V0negativeP";
533 fCandidateVariableNames[35]=
"LcY";
534 fCandidateVariableNames[36]=
"v0Y";
535 fCandidateVariableNames[37]=
"bachelorY";
536 fCandidateVariableNames[38]=
"V0positiveY";
537 fCandidateVariableNames[39]=
"V0negativeY";
538 fCandidateVariableNames[40]=
"v0Eta";
539 fCandidateVariableNames[41]=
"DecayLengthLc";
540 fCandidateVariableNames[42]=
"DecayLengthK0S";
541 fCandidateVariableNames[43]=
"CtLc";
542 fCandidateVariableNames[44]=
"CtK0S";
543 fCandidateVariableNames[45]=
"bachCode";
544 fCandidateVariableNames[46]=
"k0SCode";
546 fCandidateVariableNames[47]=
"V0KFmass";
547 fCandidateVariableNames[48]=
"V0KFdecayLength";
548 fCandidateVariableNames[49]=
"V0KFlifeTime";
550 fCandidateVariableNames[50]=
"V0KFmassErr";
551 fCandidateVariableNames[51]=
"V0KFdecayTimeErr";
552 fCandidateVariableNames[52]=
"V0KFlifeTimeErr";
554 fCandidateVariableNames[53]=
"LcKFmass";
555 fCandidateVariableNames[54]=
"LcKFdecayLength";
556 fCandidateVariableNames[55]=
"LcKFlifeTime";
558 fCandidateVariableNames[56]=
"LcKFmassErr";
559 fCandidateVariableNames[57]=
"LcKFdecayTimeErr";
560 fCandidateVariableNames[58]=
"LcKFlifeTimeErr";
562 fCandidateVariableNames[59]=
"LcKFDistToPrimVtx";
563 fCandidateVariableNames[60]=
"V0KFDistToPrimVtx";
564 fCandidateVariableNames[61]=
"V0KFDistToLc";
565 fCandidateVariableNames[62]=
"alphaArmKF";
566 fCandidateVariableNames[63]=
"ptArmKF";
567 fCandidateVariableNames[64]=
"alphaArm";
568 fCandidateVariableNames[65]=
"ptArm";
570 fCandidateVariableNames[66]=
"ITSrefitV0pos";
571 fCandidateVariableNames[67]=
"ITSrefitV0neg";
573 fCandidateVariableNames[68]=
"TPCClV0pos";
574 fCandidateVariableNames[69]=
"TPCClV0neg";
576 fCandidateVariableNames[70]=
"v0Xcoord";
577 fCandidateVariableNames[71]=
"v0Ycoord";
578 fCandidateVariableNames[72]=
"v0Zcoord";
579 fCandidateVariableNames[73]=
"primVtxX";
580 fCandidateVariableNames[74]=
"primVtxY";
581 fCandidateVariableNames[75]=
"primVtxZ";
583 fCandidateVariableNames[76]=
"ITSclBach";
584 fCandidateVariableNames[77]=
"SPDclBach";
586 fCandidateVariableNames[78]=
"ITSclV0pos";
587 fCandidateVariableNames[79]=
"SPDclV0pos";
588 fCandidateVariableNames[80]=
"ITSclV0neg";
589 fCandidateVariableNames[81]=
"SPDclV0neg";
591 fCandidateVariableNames[82]=
"alphaArmLc";
592 fCandidateVariableNames[83]=
"alphaArmLcCharge";
593 fCandidateVariableNames[84]=
"ptArmLc";
595 fCandidateVariableNames[85]=
"CosThetaStar";
597 fCandidateVariableNames[86]=
"weightPtFlat";
598 fCandidateVariableNames[87]=
"weightFONLL5overLHC13d3";
599 fCandidateVariableNames[88]=
"weightFONLL5overLHC13d3Lc";
600 fCandidateVariableNames[89]=
"weightNch";
603 for(Int_t ivar=0; ivar<
nVar; ivar++){
608 fHistoEvents =
new TH1F(
"fHistoEvents",
"fHistoEvents", 2, -0.5, 1.5);
609 TString labelEv[2] = {
"NotSelected",
"Selected"};
610 for (Int_t ibin = 1; ibin <=
fHistoEvents->GetNbinsX(); ibin++){
614 fHistoLc =
new TH1F(
"fHistoLc",
"fHistoLc", 2, -0.5, 1.5);
616 fHistoLcOnTheFly =
new TH1F(
"fHistoLcOnTheFly",
"fHistoLcOnTheFly", 4, -0.5, 3.5);
617 TString labelOnTheFly[4] = {
"OnTheFly-Bkg",
"OfflineBkg",
"OnTheFly-Sgn",
"OfflineSgn"};
622 fHistoLcBeforeCuts =
new TH1F(
"fHistoLcBeforeCuts",
"fHistoLcBeforeCuts", 2, -0.5, 1.5);
623 TString labelBeforeCuts[2] = {
"Bkg",
"Sgn"};
626 fHistoLc->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].
Data());
630 TString labelAcc[4] = {
"NotOk-Bkg",
"Ok-Bkg",
"NotOk-Sgn",
"Ok-Sgn"};
635 fHistoCodesSgn =
new TH2F(
"fHistoCodesSgn",
"fHistoCodes for Signal; bachelor; K0S", 7, -1.5, 5.5, 9, -1.5, 7.5);
636 fHistoCodesBkg =
new TH2F(
"fHistoCodesBkg",
"fHistoCodes for Background; bachelor; K0S", 7, -1.5, 5.5, 9, -1.5, 7.5);
638 TString labelx[7] = {
"kBachInvalid",
"kBachFake",
"kBachNoProton",
"kBachPrimary",
"kBachNoLambdaMother",
639 "kBachDifferentLambdaMother",
"kBachCorrectLambdaMother"};
640 TString labely[9] = {
"kK0SInvalid",
"kK0SFake",
"kK0SNoK0S",
"kK0SWithoutMother",
"kK0SNotFromK0",
641 "kK0Primary",
"kK0NoLambdaMother",
"kK0DifferentLambdaMother",
"kK0CorrectLambdaMother"};
643 for (Int_t ibin = 1; ibin <=
fHistoCodesSgn->GetNbinsX(); ibin++){
647 for (Int_t ibin = 1; ibin <=
fHistoCodesSgn->GetNbinsY(); ibin++){
657 fHistoBackground =
new TH1F(
"fHistoBackground",
"fHistoBackground", 4, -0.5, 3.5);
658 TString labelBkg[4] = {
"Injected",
"Non-injected",
"Non-PYTHIA",
"PYTHIA"};
666 const Float_t ptbins[15] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 12., 17., 25., 35.};
668 fHistoMCLcK0SpGen =
new TH1F(
"fHistoMCLcK0SpGen",
"fHistoMCLcK0SpGen", 14, ptbins);
688 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
689 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
707 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
717 fHistoDistanceLcToPrimVtx =
new TH1D(
"fHistoDistanceLcToPrimVtx",
"Lc distance to Prim Vertex from KF; distance [cm]", 1000, 0., 1);
718 fHistoDistanceV0ToPrimVtx =
new TH1D(
"fHistoDistanceV0ToPrimVtx",
"V0 distance to Prim Vertex from KF; distance [cm]", 1000, 0., 100.);
719 fHistoDistanceV0ToLc =
new TH1D(
"fHistoDistanceV0ToLc",
"V0 distance to Lc Vertex from KF; distance [cm]", 1000, 0., 100.);
721 fHistoDistanceLcToPrimVtxSgn =
new TH1D(
"fHistoDistanceLcToPrimVtxSgn",
"Lc Sgn distance to Prim Vertex from KF; distance [cm]", 1000, 0., 1);
722 fHistoDistanceV0ToPrimVtxSgn =
new TH1D(
"fHistoDistanceV0ToPrimVtxSgn",
"V0 Sgn distance to Prim Vertex from KF; distance [cm]", 1000, 0., 100.);
723 fHistoDistanceV0ToLcSgn =
new TH1D(
"fHistoDistanceV0ToLcSgn",
"V0 Sgn distance to Lc Vertex from KF; distance [cm]", 1000, 0., 100.);
725 fHistoVtxLcResidualToPrimVtx =
new TH1D(
"fHistoVtxLcResidualToPrimVtx",
"Residual between MC and KF (MC - KF): Lc to Prim Vtx; distance [cm]", 1000, -5., 5.);
726 fHistoVtxV0ResidualToPrimVtx =
new TH1D(
"fHistoVtxV0ResidualToPrimVtx",
"Residual between MC and KF (MC - KF): V0 to Prim Vtx; distance [cm]", 1000, -5., 5.);
727 fHistoVtxV0ResidualToLc =
new TH1D(
"fHistoVtxV0ResidualToLc",
"Residual between MC and KF: V0 to Lc (MC - KF); distance [cm]", 1000, -5., 5.);
729 fHistoMassV0All =
new TH1D(
"fHistoMassV0All",
"V0 Mass; mass", 500, 0.4, 0.6);
730 fHistoDecayLengthV0All =
new TH1D(
"fHistoDecayLengthV0All",
"V0 Decay Length; decayLength", 500, -10, 10.0);
731 fHistoLifeTimeV0All =
new TH1D(
"fHistoLifeTimeV0All",
"V0 Life Time; lifeTime", 500, -10.0, 10.0);
733 fHistoMassV0True =
new TH1D(
"fHistoMassV0True",
"True V0 Mass; mass", 500, 0.4, 0.6);
734 fHistoDecayLengthV0True =
new TH1D(
"fHistoDecayLengthV0True",
"True V0 Decay Length; decayLength", 500, -10, 10.0);
735 fHistoLifeTimeV0True =
new TH1D(
"fHistoLifeTimeV0True",
"True V0 Life Time; lifeTime", 500, -10.0, 10.0);
739 fHistoMassV0TrueK0S =
new TH1D(
"fHistoMassV0TrueK0S",
"True V0-K0S Mass; mass", 500, 0.4, 0.6);
741 fHistoLifeTimeV0TrueK0S =
new TH1D(
"fHistoLifeTimeV0TrueK0S",
"True V0-K0S Life Time; lifeTime", 500, -10.0, 10.0);
745 fHistoMassLcAll =
new TH1D(
"fHistoMassLcAll",
"Lc Mass; mass", 500, 2.0, 3.0);
746 fHistoDecayLengthLcAll =
new TH1D(
"fHistoDecayLengthLcAll",
"Lc Decay Length; decayLenght", 100000, -0.1, 0.1);
747 fHistoLifeTimeLcAll =
new TH1D(
"fHistoLifeTimeLcAll",
"Lc Life Time; lifeTime", 100000, -0.1, 0.1);
749 fHistoMassLcTrue =
new TH1D(
"fHistoMassLcTrue",
"True Lc Mass; mass", 500, 2.0, 3.0);
750 fHistoDecayLengthLcTrue =
new TH1D(
"fHistoDecayLengthLcTrue",
"True Lc Decay Length; decayLength", 100000, -0.1, 0.1);
751 fHistoLifeTimeLcTrue =
new TH1D(
"fHistoLifeTimeLcTrue",
"True Lc Life Time; lifeTime", 100000, -0.1, 0.1);
755 fHistoMassV0fromLcAll =
new TH1D(
"fHistoMassV0fromLcAll",
"V0 mass from Lc built in KF; mass", 500, 0.4, 0.6);
756 fHistoDecayLengthV0fromLcAll =
new TH1D(
"fHistoDecayLengthV0fromLcAll",
"V0 Decay Length from Lc built in KF; decayLength", 500, 0, 10.0);
757 fHistoLifeTimeV0fromLcAll =
new TH1D(
"fHistoLifeTimeV0fromLcAll",
"V0 Life Time from Lc built in KF; lifeTime", 500, 0.0, 3.0);
759 fHistoMassV0fromLcTrue =
new TH1D(
"fHistoMassV0fromLcTrue",
"V0 mass from true Lc built in KF; mass", 500, 0.4, 0.6);
760 fHistoDecayLengthV0fromLcTrue=
new TH1D(
"fHistoDecayLengthV0fromLcTrue",
"V0 Decay Length from true Lc built in KF; decayLength", 500, 0, 10.0);
761 fHistoLifeTimeV0fromLcTrue =
new TH1D(
"fHistoLifeTimeV0fromLcTrue",
"V0 Life Time from true Lc built in KF; lifeTime", 500, 0.0, 3.0);
763 fHistoMassLcSgn =
new TH1D(
"fHistoMassLcSgn",
"True Lc Signal Mass; mass", 500, 2.0, 3.0);
764 fHistoMassLcSgnFromAOD =
new TH1D(
"fHistoMassLcSgnFromAOD",
"True Lc Signal Mass (AOD); mass", 500, 2.0, 3.0);
765 fHistoDecayLengthLcSgn =
new TH1D(
"fHistoDecayLengthLcSgn",
"True Lc Signal Decay Length; decayLength", 100000, -0.1, 0.1);
766 fHistoLifeTimeLcSgn =
new TH1D(
"fHistoLifeTimeLcSgn",
"True Lc Signal Life Time; lifeTime", 100000, -0.1, 0.1);
768 fHistoMassV0fromLcSgn =
new TH1D(
"fHistoMassV0fromLcSgn",
"V0 from True Lc Signal Mass; mass", 500, 0.4, 0.6);
770 fHistoLifeTimeV0fromLcSgn =
new TH1D(
"fHistoLifeTimeV0fromLcSgn",
"V0 True Lc Signal Life Time; lifeTime", 500, 0.0, 3.0);
772 fHistoKF =
new TH2D(
"fHistoKF",
"Summary from KF; V0 KF; Lc KF", 16, -0.5, 15.5, 16, -0.5, 15.5);
773 fHistoKFV0 =
new TH1D(
"fHistoKFV0",
"Summary from KF; V0 KF", 16, -0.5, 15.5);
774 fHistoKFLc =
new TH1D(
"fHistoKFLc",
"Summary from KF; V0 KF", 16, -0.5, 15.5);
775 TString axisLabel[16] = {
"AllOk",
"M_NotOk",
"Sm_NotOk",
"Dl_NotOk",
776 "Lt_NotOk",
"M_Sm_NotOk",
"M_Dl_NotOk",
"M_Lt_NotOk",
777 "Dl_Sm_NotOk",
"Dl_Lt_NotOk",
"Sm_Lt_NotOk",
"M_Sm_Dl_NotOk",
778 "M_Sm_Lt_NotOk",
"Sm_Dl_Lt_NotOk",
"M_Dl_Lt_NotOk",
"All_NotOk"};
780 for (Int_t ibin = 1; ibin <=16; ibin++){
781 fHistoKF->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
782 fHistoKF->GetYaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
783 fHistoKFV0->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
784 fHistoKFLc->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].
Data());
787 fHistoMassKFV0 =
new TH2D(
"fHistoMassKFV0",
"mass vs sigmaMass for V0; mass; sigmaMass", 500, 0.4, 0.6, 500, 0., 10);
788 fHistoDecayLengthKFV0 =
new TH2D(
"fHistoDecayLengthKFV0",
"decayLength vs sigmaDecayLength for V0; decayLength; sigmaDecayLength", 500, -10, 10, 500, 0., 10);
789 fHistoLifeTimeKFV0 =
new TH2D(
"fHistoLifeTimeKFV0",
"lifeTime vs sigmalifeTime for V0; lifeTime; sigmaLifeTime", 500, -10, 10, 500, 0., 10);
791 fHistoMassKFLc =
new TH2D(
"fHistoMassKFLc",
"mass vs sigmaMass for Lc; mass; sigmaMass", 500, 0.4, 0.6, 500, 0., 10);
792 fHistoDecayLengthKFLc =
new TH2D(
"fHistoDecayLengthKFLc",
"decayLength vs sigmaDecayLength for Lc; decayLength; sigmaDecayLength", 500, -10, 10, 500, 0., 10);
793 fHistoLifeTimeKFLc =
new TH2D(
"fHistoLifeTimeKFLc",
"lifeTime vs sigmalifeTime for Lc; lifeTime; sigmaLifeTime", 500, -10, 10, 500, 0., 10);
795 fHistoArmenterosPodolanskiV0KF =
new TH2D(
"fHistoArmenterosPodolanskiV0KF",
"V0 ArmenterosPodolanski from KF; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
796 fHistoArmenterosPodolanskiV0KFSgn =
new TH2D(
"fHistoArmenterosPodolanskiV0KFSgn",
"V0 (signal) ArmenterosPodolanski from KF; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
797 fHistoArmenterosPodolanskiV0AOD =
new TH2D(
"fHistoArmenterosPodolanskiV0AOD",
"V0 ArmenterosPodolanski from AOD; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
798 fHistoArmenterosPodolanskiV0AODSgn =
new TH2D(
"fHistoArmenterosPodolanskiV0AODSgn",
"V0 (signal) ArmenterosPodolanski from AOD; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
881 fFuncWeightPythia =
new TF1(
"funcWeightPythia",
"1./(30. *[0]*x/TMath::Power(1.+(TMath::Power((x/[1]),[3])),[2]))",0.15,30);
886 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.);
887 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);
889 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.);
890 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);
902 AliError(
"NO EVENT FOUND!");
908 AliAODEvent* aodEvent =
dynamic_cast<AliAODEvent*
>(fInputEvent);
909 TClonesArray *arrayLctopKos=0;
911 TClonesArray *array3Prong = 0;
913 if (!aodEvent && AODEvent() && IsStandardAOD()) {
916 aodEvent =
dynamic_cast<AliAODEvent*
> (AODEvent());
919 AliAODHandler* aodHandler = (AliAODHandler*)
920 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
922 if (aodHandler->GetExtensions()) {
923 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject(
"AliAOD.VertexingHF.root");
924 AliAODEvent *aodFromExt = ext->GetAOD();
925 arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject(
"CascadesHF");
927 array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject(
"Charm3Prong");
930 arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject(
"CascadesHF");
932 array3Prong=(TClonesArray*)aodEvent->GetList()->FindObject(
"Charm3Prong");
940 Int_t runnumber = aodEvent->GetRunNumber();
941 if (aodEvent->GetTriggerMask() == 0 && (runnumber >= 195344 && runnumber <= 195677)){
942 AliDebug(3,
"Event rejected because of null trigger mask");
949 TClonesArray *mcArray = 0;
950 AliAODMCHeader *mcHeader=0;
954 mcArray =
dynamic_cast<TClonesArray*
>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
956 AliError(
"Could not find Monte-Carlo in AOD");
960 mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
962 AliError(
"AliAnalysisTaskSELc2V0bachelorTMVA::UserExec: MC header branch not found!\n");
966 Double_t zMCVertex = mcHeader->GetVtxZ();
981 fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
983 if (
fVtx1->GetNContributors()<1)
return;
994 fBField = aodEvent->GetMagneticField();
995 AliKFParticle::SetField(
fBField);
997 Int_t nSelectedAnal = 0;
1001 array3Prong, mcHeader);
1016 for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
1017 AliAODMCParticle* mcPart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iPart));
1019 AliError(
"Failed casting particle from MC array!, Skipping particle");
1022 Int_t
pdg = mcPart->GetPdgCode();
1023 if (TMath::Abs(pdg) != 4122){
1024 AliDebug(2, Form(
"MC particle %d is not a Lc: its pdg code is %d", iPart, pdg));
1027 AliDebug(2, Form(
"Step 0 ok: MC particle %d is a Lc: its pdg code is %d", iPart, pdg));
1028 Int_t labeldaugh0 = mcPart->GetDaughter(0);
1029 Int_t labeldaugh1 = mcPart->GetDaughter(1);
1030 if (labeldaugh0 <= 0 || labeldaugh1 <= 0){
1031 AliDebug(2, Form(
"The MC particle doesn't have correct daughters, skipping!!"));
1034 else if (labeldaugh1 - labeldaugh0 == 1){
1035 AliDebug(2, Form(
"Step 1 ok: The MC particle has correct daughters!!"));
1036 AliAODMCParticle* daugh0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labeldaugh0));
1037 AliAODMCParticle* daugh1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labeldaugh1));
1038 if(!daugh0 || !daugh1){
1039 AliDebug(2,
"Particle daughters not properly retrieved!");
1042 Int_t pdgCodeDaugh0 = TMath::Abs(daugh0->GetPdgCode());
1043 Int_t pdgCodeDaugh1 = TMath::Abs(daugh1->GetPdgCode());
1044 AliAODMCParticle* bachelorMC = daugh0;
1045 AliAODMCParticle* v0MC = daugh1;
1046 AliDebug(2, Form(
"pdgCodeDaugh0 = %d, pdgCodeDaugh1 = %d", pdgCodeDaugh0, pdgCodeDaugh1));
1047 if ((pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) || (pdgCodeDaugh0 == 2212 && pdgCodeDaugh1 == 311)){
1050 if (pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) {
1051 bachelorMC = daugh1;
1054 AliDebug(2, Form(
"Number of Daughters of v0 = %d", v0MC->GetNDaughters()));
1055 if (v0MC->GetNDaughters() != 1) {
1056 AliDebug(2,
"The K0 does not decay in 1 body only! Impossible... Continuing...");
1060 AliDebug(2,
"Step 2 ok: The K0 does decay in 1 body only! ");
1061 Int_t labelK0daugh = v0MC->GetDaughter(0);
1062 AliAODMCParticle* partK0S =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0daugh));
1064 AliError(
"Error while casting particle! returning a NULL array");
1068 if (partK0S->GetNDaughters() != 2 || TMath::Abs(partK0S->GetPdgCode() != 310)){
1069 AliDebug(2,
"The K0 daughter is not a K0S or does not decay in 2 bodies");
1073 AliDebug(2,
"Step 3 ok: The K0 daughter is a K0S and does decay in 2 bodies");
1074 Int_t labelK0Sdaugh0 = partK0S->GetDaughter(0);
1075 Int_t labelK0Sdaugh1 = partK0S->GetDaughter(1);
1076 AliAODMCParticle* daughK0S0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0Sdaugh0));
1077 AliAODMCParticle* daughK0S1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0Sdaugh1));
1078 if (!daughK0S0 || ! daughK0S1){
1079 AliDebug(2,
"Could not access K0S daughters, continuing...");
1083 AliDebug(2,
"Step 4 ok: Could access K0S daughters, continuing...");
1084 Int_t pdgK0Sdaugh0 = daughK0S0->GetPdgCode();
1085 Int_t pdgK0Sdaugh1 = daughK0S1->GetPdgCode();
1086 if (TMath::Abs(pdgK0Sdaugh0) != 211 || TMath::Abs(pdgK0Sdaugh1) != 211){
1087 AliDebug(2,
"The K0S does not decay in pi+pi-, continuing");
1092 AliDebug(2, Form(
"----> Filling histo with pt = %f", mcPart->Pt()));
1096 if(!(TMath::Abs(bachelorMC->Eta()) > 0.9 || bachelorMC->Pt() < 0.1 ||
1097 TMath::Abs(daughK0S0->Eta()) > 0.9 || daughK0S0->Pt() < 0.1 ||
1098 TMath::Abs(daughK0S1->Eta()) > 0.9 || daughK0S1->Pt() < 0.1)) {
1103 AliDebug(2,
"not in fiducial acceptance! Skipping");
1121 TClonesArray *mcArray,
1122 Int_t &nSelectedAnal,
1124 AliAODMCHeader* aodheader){
1127 Int_t pdgCand = 4122;
1128 Int_t pdgDgLctoV0bachelor[2]={2212, 310};
1129 Int_t pdgDgV0toDaughters[2]={211, 211};
1131 Int_t pdgDgLctopKpi[3]={2212, 321, 211};
1134 Int_t n3Prong = array3Prong->GetEntriesFast();
1135 Int_t nCascades= arrayLctopKos->GetEntriesFast();
1138 for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
1144 Int_t mcLabel = d->MatchToMC(4122, mcArray, 3, pdgDgLctopKpi);
1149 AliAODMCParticle *partLcpKpi =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(mcLabel));
1151 Int_t pdgCode = partLcpKpi->GetPdgCode();
1152 AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1168 for (Int_t iLctopK0s = 0; iLctopK0s < nCascades; iLctopK0s++) {
1173 AliDebug(2,Form(
"Cascade %d doens't exist, skipping",iLctopK0s));
1183 fmcLabelLc = lcK0spr->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1185 AliDebug(2, Form(
"----> cascade number %d (total cascade number = %d) is a Lc!", iLctopK0s, nCascades));
1187 AliAODMCParticle *partLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(
fmcLabelLc));
1189 pdgCode = partLc->GetPdgCode();
1190 if (pdgCode<0) AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d",
fmcLabelLc, pdgCode));
1191 pdgCode = TMath::Abs(pdgCode);
1206 if (lcK0spr->GetNDaughters()!=2) {
1207 AliDebug(2,Form(
"Cascade %d has not 2 daughters (nDaughters=%d)",iLctopK0s,lcK0spr->GetNDaughters()));
1211 AliAODv0 * v0part =
dynamic_cast<AliAODv0*
>(lcK0spr->
Getv0());
1212 AliAODTrack * bachPart =
dynamic_cast<AliAODTrack*
>(lcK0spr->
GetBachelor());
1213 if (!v0part || !bachPart) {
1214 AliDebug(2,Form(
"Cascade %d has no V0 or no bachelor object",iLctopK0s));
1219 if (!v0part->GetSecondaryVtx()) {
1220 AliDebug(2,Form(
"No secondary vertex for V0 by cascade %d",iLctopK0s));
1224 if (v0part->GetNDaughters()!=2) {
1225 AliDebug(2,Form(
"current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters()));
1231 if (!v0Neg || !v0Pos) {
1232 AliDebug(2,Form(
"V0 by cascade %d has no V0positive of V0negative object",iLctopK0s));
1237 if (v0Pos->Charge() == v0Neg->Charge()) {
1238 AliDebug(2,Form(
"V0 by cascade %d has daughters with the same sign: IMPOSSIBLE!",iLctopK0s));
1249 mcLabel = lcK0spr->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1251 AliDebug(2,Form(
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s, nCascades));
1253 AliAODMCParticle *partLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(mcLabel));
1255 pdgCode = partLc->GetPdgCode();
1256 if (pdgCode<0) AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1257 pdgCode = TMath::Abs(pdgCode);
1267 AliDebug(2, Form(
"\n\n\n Analysing candidate %d\n", iLctopK0s));
1268 AliDebug(2, Form(
">>>>>>>>>> Candidate is background, fFillOnlySgn = %d --> SKIPPING",
fFillOnlySgn));
1277 if (!isCandidateInjected){
1278 AliDebug(2,
"The candidate is from HIJING (i.e. not injected), keeping it to fill background");
1282 AliDebug(2,
"The candidate is NOT from HIJING, we skip it when filling background");
1289 AliAODTrack *bachelor = (AliAODTrack*)lcK0spr->
GetBachelor();
1292 if (!bachelor || !v0pos || !v0neg) {
1293 AliDebug(2,
"Cannot retrieve one of the tracks while checking origin, continuing");
1297 Int_t labelbachelor = TMath::Abs(bachelor->GetLabel());
1298 Int_t labelv0pos = TMath::Abs(v0pos->GetLabel());
1299 Int_t labelv0neg = TMath::Abs(v0neg->GetLabel());
1300 AliAODMCParticle* MCbachelor = (AliAODMCParticle*)mcArray->At(labelbachelor);
1301 AliAODMCParticle* MCv0pos = (AliAODMCParticle*)mcArray->At(labelv0pos);
1302 AliAODMCParticle* MCv0neg = (AliAODMCParticle*)mcArray->At(labelv0neg);
1303 if (!MCbachelor || !MCv0pos || !MCv0neg) {
1304 AliDebug(2,
"Cannot retrieve MC particle for one of the tracks while checking origin, continuing");
1311 if (isBachelorFromPythia != 0 && isv0posFromPythia != 0 && isv0negFromPythia != 0){
1312 AliDebug(2,
"The candidate is from PYTHIA (i.e. all daughters originate from a quark), keeping it to fill background");
1316 AliDebug(2,
"The candidate is NOT from PYTHIA, we skip it when filling background");
1337 Int_t &nSelectedAnal,
1339 TClonesArray *mcArray, Int_t iLctopK0s){
1355 AliAODv0 * v0part = part->
Getv0();
1356 Bool_t onFlyV0 = v0part->GetOnFlyStatus();
1374 Double_t dcaV0 = v0part->GetDCA();
1375 Double_t invmassK0s = v0part->MassK0Short();
1396 if (isInV0window == 0) {
1397 AliDebug(2,
"No: The candidate has NOT passed the V0 window cuts!");
1398 if (isLc) Printf(
"SIGNAL candidate rejected: V0 window cuts");
1401 else AliDebug(2,
"Yes: The candidate has passed the mass cuts!");
1405 if (!isInCascadeWindow) {
1406 AliDebug(2,
"No: The candidate has NOT passed the cascade window cuts!");
1407 if (isLc) Printf(
"SIGNAL candidate rejected: cascade window cuts");
1410 else AliDebug(2,
"Yes: The candidate has passed the cascade window cuts!");
1414 if (!isCandidateSelectedCuts){
1415 AliDebug(2,
"No: Analysis cuts kCandidate level NOT passed");
1416 if (isLc) Printf(
"SIGNAL candidate rejected");
1420 AliDebug(2,
"Yes: Analysis cuts kCandidate level passed");
1423 AliAODTrack *bachelor = (AliAODTrack*)part->
GetBachelor();
1425 AliDebug(2, Form(
"Very weird, the bachelor is not there... returning for this candidate"));
1430 Double_t probTPCTOF[AliPID::kSPECIES]={-1.};
1433 AliDebug(2, Form(
"detUsed (TPCTOF case) = %d", detUsed));
1434 Double_t probProton = -1.;
1437 if (detUsed == (UInt_t)
fPIDCombined->GetDetectorMask() ) {
1438 AliDebug(2, Form(
"We have found the detector mask for TOF + TPC: probProton will be set to %f", probTPCTOF[AliPID::kProton]));
1439 probProton = probTPCTOF[AliPID::kProton];
1444 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
1445 AliDebug(2,
"We did not find the detector mask for TOF + TPC, let's see only TPC");
1447 AliDebug(2,Form(
" detUsed (TPC case) = %d", detUsed));
1448 if (detUsed == (UInt_t)
fPIDCombined->GetDetectorMask()) {
1449 probProton = probTPCTOF[AliPID::kProton];
1452 AliDebug(2, Form(
"TPC only worked: probProton will be set to %f", probTPCTOF[AliPID::kProton]));
1455 AliDebug(2,
"Only TPC did not work...");
1458 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
1460 AliDebug(2, Form(
"probProton = %f", probProton));
1463 Double_t probProtonTPC = -1.;
1464 Double_t probProtonTOF = -1.;
1465 Double_t pidTPC[AliPID::kSPECIES]={-1.};
1466 Double_t pidTOF[AliPID::kSPECIES]={-1.};
1467 Int_t respTPC =
fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTPC, bachelor, AliPID::kSPECIES, pidTPC);
1468 Int_t respTOF =
fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTOF, bachelor, AliPID::kSPECIES, pidTOF);
1469 if (respTPC == AliPIDResponse::kDetPidOk) probProtonTPC = pidTPC[AliPID::kProton];
1470 if (respTOF == AliPIDResponse::kDetPidOk) probProtonTOF = pidTOF[AliPID::kProton];
1474 AliDebug(2,
"On-the-fly discarded");
1485 if (isLc) Printf(
"SIGNAL candidate rejected");
1486 AliDebug(2,
"No: Analysis cuts kTracks level NOT passed");
1490 AliDebug(2,
"Yes: Analysis cuts kTracks level passed");
1493 Int_t pdgCand = 4122;
1494 Int_t pdgDgLctoV0bachelor[2]={211, 3122};
1495 Int_t pdgDgV0toDaughters[2]={2212, 211};
1496 Int_t isLc2LBarpi=0, isLc2Lpi=0;
1497 Int_t currentLabel = part->GetLabel();
1500 mcLabel = part->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1502 if (bachelor->Charge()==-1) isLc2LBarpi=1;
1503 if (bachelor->Charge()==+1) isLc2Lpi=1;
1507 Int_t pdgDg2prong[2] = {211, 211};
1511 labelK0S = v0part->MatchToMC(310, mcArray, 2, pdgDg2prong);
1512 if (labelK0S>=0) isK0S = 1;
1515 pdgDg2prong[0] = 211;
1516 pdgDg2prong[1] = 2212;
1518 Int_t isLambdaBar = 0;
1519 Int_t lambdaLabel = 0;
1521 lambdaLabel = v0part->MatchToMC(3122, mcArray, 2, pdgDg2prong);
1522 if (lambdaLabel>=0) {
1523 AliAODMCParticle *lambdaTrack = (AliAODMCParticle*)mcArray->At(lambdaLabel);
1524 if (lambdaTrack->GetPdgCode()==3122) isLambda = 1;
1525 else if (lambdaTrack->GetPdgCode()==-3122) isLambdaBar = 1;
1529 pdgDg2prong[0] = 11;
1530 pdgDg2prong[1] = 11;
1532 Int_t gammaLabel = 0;
1534 gammaLabel = v0part->MatchToMC(22, mcArray, 2, pdgDg2prong);
1535 if (gammaLabel>=0) {
1536 AliAODMCParticle *gammaTrack = (AliAODMCParticle*)mcArray->At(gammaLabel);
1537 if (gammaTrack->GetPdgCode()==22) isGamma = 1;
1542 if (currentLabel != -1){
1543 AliAODMCParticle *tempPart = (AliAODMCParticle*)mcArray->At(currentLabel);
1544 pdgTemp = tempPart->GetPdgCode();
1546 if (isLc) AliDebug(2, Form(
"Signal: Candidate is a Lc in K0s+p"));
1547 else if (isLc2LBarpi) AliDebug(2, Form(
"Background: Candidate is a Lc in Lbar + pi"));
1548 else if (isLc2Lpi) AliDebug(2, Form(
"Background: Candidate is a Lc in L + pi"));
1549 else AliDebug(2, Form(
"Pure bkg: Candidate has pdg = %d", pdgTemp));
1550 if (isK0S) AliDebug(2, Form(
"V0 is a K0S"));
1551 else if (isLambda) AliDebug(2, Form(
"V0 is a Lambda"));
1552 else if (isLambdaBar) AliDebug(2, Form(
"V0 is a LambdaBar"));
1553 else if (isGamma) AliDebug(2, Form(
"V0 is a Gamma"));
1557 Double_t invmassLambda = v0part->MassLambda();
1558 Double_t invmassLambdaBar = v0part->MassAntiLambda();
1561 Double_t nSigmaTPCpr=-999.;
1562 Double_t nSigmaTOFpr=-999.;
1565 Double_t nSigmaTPCpi=-999.;
1566 Double_t nSigmaTOFpi=-999.;
1569 Double_t nSigmaTPCka=-999.;
1570 Double_t nSigmaTOFka=-999.;
1584 nSigmaTPCpi =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kPion));
1585 nSigmaTPCka =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kKaon));
1586 nSigmaTPCpr =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kProton));
1587 nSigmaTOFpi =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kPion));
1588 nSigmaTOFka =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kKaon));
1589 nSigmaTOFpr =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kProton));
1591 Double_t ptLcMC = -1;
1592 Double_t weightPythia = -1, weight5LHC13d3 = -1, weight5LHC13d3Lc = -1;
1595 if (iLctopK0s >= 0) {
1596 AliAODMCParticle *partLcMC = (AliAODMCParticle*)mcArray->At(iLctopK0s);
1597 ptLcMC = partLcMC->Pt();
1605 Double_t weightNch = 1;
1610 if(!
fHistoMCNch) AliInfo(
"Input histos to evaluate Nch weights missing");
1617 if (!onFlyV0 && isInV0window && isInCascadeWindow && part->
CosV0PointingAngle()>0.99 && TMath::Abs(nSigmaTPCpr) <= 3 && v0part->Getd0Prong(0) < 20 && v0part->Getd0Prong(1) < 20) {
1675 k0SCode =
CheckK0S(part, v0part, mcArray);
1681 Double_t V0KF[3] = {-999999, -999999, -999999};
1682 Double_t errV0KF[3] = {-999999, -999999, -999999};
1683 Double_t LcKF[3] = {-999999, -999999, -999999};
1684 Double_t errLcKF[3] = {-999999, -999999, -999999};
1685 Double_t distances[3] = {-999999, -999999, -999999};
1686 Double_t armPolKF[2] = {-999999, -999999};
1689 Int_t kfResult =
CallKFVertexing(part, v0part, bachelor, mcArray, &V0KF[0], &errV0KF[0], &LcKF[0], &errLcKF[0], &distances[0], &armPolKF[0]);
1690 AliDebug(2, Form(
"Result from KF = %d", kfResult));
1723 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)));
1738 fCandidateVariables[77] = bachelor->HasPointOnITSLayer(0) + bachelor->HasPointOnITSLayer(1);
1746 TVector3 mom1(bachelor->Px(), bachelor->Py(), bachelor->Pz());
1747 TVector3 mom2(v0part->Px(), v0part->Py(), v0part->Pz());
1748 TVector3 momTot(part->Px(), part->Py(), part->Pz());
1750 Double_t Ql1 = mom1.Dot(momTot)/momTot.Mag();
1751 Double_t Ql2 = mom2.Dot(momTot)/momTot.Mag();
1753 Double_t alphaArmLc = (Ql1 - Ql2)/(Ql1 + Ql2);
1754 Double_t alphaArmLcCharge = ( bachelor->Charge() > 0 ? (Ql1 - Ql2)/(Ql1 + Ql2) : (Ql2 - Ql1)/(Ql1 + Ql2) );
1755 Double_t ptArmLc = mom1.Perp(momTot);
1761 Double_t massK0SPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
1762 Double_t massPrPDG = TDatabasePDG::Instance()->GetParticle(2212)->Mass();
1763 Double_t massLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
1765 Double_t pStar = TMath::Sqrt((massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)*(massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)-4.*massPrPDG*massPrPDG*massK0SPDG*massK0SPDG)/(2.*massLcPDG);
1766 Double_t e = part->E(4122);
1767 Double_t beta = part->P()/e;
1768 Double_t gamma = e/massLcPDG;
1770 Double_t cts = (Ql1/gamma-beta*TMath::Sqrt(pStar*pStar+massPrPDG*massPrPDG))/pStar;
1782 AliDebug(2, Form(
"Reco particle %d --> Filling Sgn", iLctopK0s));
1788 AliDebug(2,
"Filling Bkg");
1805 Double_t* V0KF, Double_t* errV0KF, Double_t* LcKF, Double_t* errLcKF,
1806 Double_t* distances, Double_t* armPolKF) {
1813 Int_t codeKFV0 = -1, codeKFLc = -1;
1815 AliKFVertex primVtxCopy;
1816 Int_t nt = 0, ntcheck = 0;
1817 Double_t pos[3] = {0., 0., 0.};
1820 Int_t contr =
fVtx1->GetNContributors();
1821 Double_t covmatrix[6] = {0.};
1822 fVtx1->GetCovarianceMatrix(covmatrix);
1823 Double_t chi2 =
fVtx1->GetChi2();
1824 AliESDVertex primaryESDVtxCopy(pos, covmatrix, chi2, contr,
"Vertex");
1827 primVtxCopy = AliKFVertex(primaryESDVtxCopy);
1828 nt = primaryESDVtxCopy.GetNContributors();
1831 Int_t
pdg[2] = {211, -211};
1832 Int_t pdgLc[2] = {2212, 310};
1834 Int_t pdgDgV0toDaughters[2] = {211, 211};
1836 Int_t mcLabelV0 = v0part->MatchToMC(310, mcArray, 2, pdgDgV0toDaughters);
1839 Bool_t isMCokV0 = kTRUE, isBkgV0 = kFALSE;
1840 AliKFParticle V0, positiveV0KF, negativeV0KF;
1841 Int_t labelsv0daugh[2] = {-1, -1};
1842 Int_t idv0daugh[2] = {-1, -1};
1843 AliExternalTrackParam* esdv0Daugh1 = 0x0;
1844 AliExternalTrackParam* esdv0Daugh2 = 0x0;
1845 for(Int_t ipr= 0; ipr < 2; ipr++){
1846 AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1848 AliDebug(2,
"No V0 daughters available");
1851 Double_t xyz[3], pxpypz[3], cv[21];
1853 aodTrack->GetXYZ(xyz);
1854 aodTrack->PxPyPz(pxpypz);
1855 aodTrack->GetCovarianceXYZPxPyPz(cv);
1856 sign = aodTrack->Charge();
1857 AliExternalTrackParam tmp1( xyz, pxpypz, cv, sign);
1859 if (ipr == 0) esdv0Daugh1 =
new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1860 else esdv0Daugh2 =
new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1861 labelsv0daugh[ipr] = TMath::Abs(aodTrack->GetLabel());
1862 idv0daugh[ipr] = aodTrack->GetID();
1863 if (labelsv0daugh[ipr] == -1) isBkgV0 = kTRUE;
1867 AliKFParticle daughterKF(*aodTrack, pdg[ipr]);
1868 if (aodTrack->Charge() > 0) {
1869 positiveV0KF = daughterKF;
1872 negativeV0KF = daughterKF;
1876 Double_t xn=0., xp=0.;
1877 AliDebug(2, Form(
"bField = %f, esdv0Daugh1 = %p, esdv0Daugh2 = %p",
fBField, esdv0Daugh1, esdv0Daugh2));
1880 AliExternalTrackParam tr1(*esdv0Daugh1);
1881 AliExternalTrackParam tr2(*esdv0Daugh2);
1885 AliKFParticle daughterKF1(tr1, 211);
1886 AliKFParticle daughterKF2(tr2, 211);
1887 V0.AddDaughter(positiveV0KF);
1888 V0.AddDaughter(negativeV0KF);
1897 if( V0.GetNDF() < 1 ) {
1901 if( TMath::Sqrt(TMath::Abs(V0.GetChi2()/V0.GetNDF())) >
fCutKFChi2NDF ) {
1907 for(Int_t ipr = 0; ipr < 2; ipr++){
1908 AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1910 if(!aodTrack->GetUsedForPrimVtxFit()) {
1914 AliKFParticle daughterKF(*aodTrack, pdg[ipr]);
1915 primVtxCopy -= daughterKF;
1929 Double_t massV0 = 999999, sigmaMassV0 = 999999;
1930 Int_t retMV0 = V0.GetMass( massV0, sigmaMassV0 );
1934 if (sigmaMassV0 > 1e19) codeKFV0 = 5;
1936 else if (sigmaMassV0 > 1e19) codeKFV0 = 2;
1940 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]);
1941 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]);
1943 Printf(
"Vertices: KF: x = %f, y = %f, z = %f", V0.GetX(), V0.GetY(), V0.GetZ());
1944 Printf(
"Vertices: AOD: x = %f, y = %f, z = %f", v0part->Xv(), v0part->Yv(), v0part->Zv());
1947 if (
fUseMCInfo && TMath::Abs(labelsv0daugh[0] - labelsv0daugh[1]) == 1) {
1948 AliAODMCParticle* tmpdaughv01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[0]));
1949 AliAODMCParticle* tmpdaughv02 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[1]));
1950 if (!tmpdaughv01 && labelsv0daugh[0] > 0){
1951 AliDebug(2,
"Could not access MC info for first daughter of V0, continuing");
1953 if (!tmpdaughv02 && labelsv0daugh[1] > 0){
1954 AliDebug(2,
"Could not access MC info for second daughter of V0, continuing");
1957 Double_t xPionMC = tmpdaughv01->Xv();
1958 Double_t yPionMC = tmpdaughv01->Yv();
1959 Double_t zPionMC = tmpdaughv01->Zv();
1961 Printf(
"Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
1965 Printf(
"Not a true V0");
1972 nt = primVtxCopy.GetNContributors();
1975 Bool_t isMCokLc = kTRUE, isBkgLc = kFALSE;
1977 Int_t labelsLcdaugh[2] = {-1, -1};
1978 labelsLcdaugh[0] = TMath::Abs(bach->GetLabel());
1979 labelsLcdaugh[1] = mcLabelV0;
1981 if (bach->Charge() < 0) pdgLc[0] = -pdgLc[0];
1982 AliKFParticle daughterKFLc(*bach, pdgLc[0]);
1983 Lc.AddDaughter(daughterKFLc);
1984 TParticlePDG* particlePDG = TDatabasePDG::Instance()->GetParticle(310);
1985 Double_t massPDGK0S = particlePDG->Mass();
1986 V0.SetMassConstraint(massPDGK0S);
1988 if( Lc.GetNDF() < 1 ) {
1989 AliDebug(2, Form(
"Lc: Number of degrees of freedom < 1 (%d), continuing", Lc.GetNDF()));
1992 if( TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) >
fCutKFChi2NDF) {
1993 AliDebug(2, Form(
"Lc: Chi2 per DOF too big, continuing (%f)", TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
1999 if(!bach->GetUsedForPrimVtxFit()) {
2000 AliDebug(3,
"Lc: Bachelor was not used for primary vertex, not subtracting it from primary vertex");
2003 primVtxCopy -= daughterKFLc;
2032 if( TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) >
fCutKFChi2NDF) {
2033 AliDebug(2, Form(
"Lc: Final Chi2 per DOF too big, continuing (%f)", TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
2038 V0.SetProductionVertex(Lc);
2044 Double_t decayLengthV0 = 999999, sigmaDecayLengthV0 = 999999;
2045 Int_t retDLV0 = V0.GetDecayLength( decayLengthV0, sigmaDecayLengthV0 );
2047 if (sigmaDecayLengthV0 > 1e19) {
2051 if (sigmaMassV0 > 1e19) codeKFV0 = 11;
2053 else if (sigmaMassV0 > 1e19) codeKFV0 = 8;
2059 Double_t lifeTimeV0 = 999999, sigmaLifeTimeV0 = 999999;
2060 Int_t retTLV0 = V0.GetLifeTime( lifeTimeV0, sigmaLifeTimeV0 );
2062 if (sigmaLifeTimeV0 > 1e19) {
2064 if (sigmaDecayLengthV0 > 1e19) {
2068 if (sigmaMassV0 > 1e19) codeKFV0 = 15;
2070 else if (sigmaMassV0 > 1e19) codeKFV0 = 13;
2072 else if (massV0 < 0) {
2074 if (sigmaMassV0 > 1e19) codeKFV0 = 12;
2076 else if (sigmaMassV0 > 1e19) codeKFV0 = 10;
2081 if (codeKFV0 == -1) codeKFV0 = 0;
2084 AliDebug(2, Form(
"V0: mass = %f, decay length = %f, life time = %f", massV0, decayLengthV0, lifeTimeV0 ));
2090 Double_t qtAlphaV0[2] = {0., 0.};
2091 Double_t vtxV0KF[3] = {V0.GetX(), V0.GetY(), V0.GetZ()};
2092 positiveV0KF.TransportToPoint(vtxV0KF);
2093 negativeV0KF.TransportToPoint(vtxV0KF);
2094 V0.GetArmenterosPodolanski(positiveV0KF, negativeV0KF, qtAlphaV0);
2095 AliDebug(2, Form(
"Armenteros-Podolanski variables: alpha = %f, qt = %f", qtAlphaV0[1], qtAlphaV0[0]));
2098 armPolKF[0] = qtAlphaV0[1];
2099 armPolKF[1] = qtAlphaV0[0];
2103 AliAODMCParticle *motherV0 = 0x0;
2104 AliAODMCParticle *daughv01 = 0x0;
2105 AliAODMCParticle *daughv02 = 0x0;
2108 daughv01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[0]));
2109 daughv02 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[1]));
2110 if (!daughv01 && labelsv0daugh[0] > 0){
2111 AliDebug(2,
"Could not access MC info for first daughter of V0, continuing");
2114 if (!daughv02 && labelsv0daugh[1] > 0){
2115 AliDebug(2,
"Could not access MC info for second daughter of V0, continuing");
2119 if( daughv01->GetMother() == daughv02->GetMother() && daughv01->GetMother()>=0 ){
2120 AliDebug(3, Form(
"The mother has label %d", daughv01->GetMother()));
2121 motherV0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughv01->GetMother()));
2122 if( motherV0 && TMath::Abs(motherV0->GetPdgCode()) != 21 ){
2123 if( motherV0->GetNDaughters() == 2 ){
2128 if (TMath::Abs(motherV0->GetPdgCode()) == 310){
2135 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()));
2137 else if (!motherV0){
2138 AliDebug(3,
"could not access MC info for mother, continuing");
2141 AliDebug(3,
"MC mother is a gluon, continuing");
2145 AliDebug(3,
"Background V0!");
2151 AliDebug(2, Form(
"isMCokV0 = %d, isBkgV0 = %d", (Int_t)isMCokV0, (Int_t)isBkgV0));
2156 Double_t massLc = 999999, sigmaMassLc= 999999;
2157 Int_t retMLc = Lc.GetMass( massLc, sigmaMassLc );
2159 AliDebug(3, Form(
"----> Could not get mass (%e), and sigma(%e) for Lc, continuing", massLc, sigmaMassLc));
2162 if (sigmaMassLc > 1e19) codeKFLc = 5;
2164 else if (sigmaMassLc > 1e19) codeKFLc = 2;
2169 Double_t decayLengthLc = 999999, sigmaDecayLengthLc = 999999;
2170 Int_t retDLLc = Lc.GetDecayLength( decayLengthLc, sigmaDecayLengthLc );
2172 AliDebug(3,
"----> Lc: Could not get decay length, and sigma");
2173 if (sigmaDecayLengthLc > 1e19) {
2177 if (sigmaMassLc > 1e19) codeKFLc = 11;
2179 else if (sigmaMassLc > 1e19) codeKFLc = 8;
2182 AliDebug(3, Form(
"retDLLc = %d, with decayLength = %f and error = %e", retDLLc, decayLengthLc, sigmaDecayLengthLc));
2187 Double_t lifeTimeLc = 999999, sigmaLifeTimeLc = 999999;
2188 Int_t retTLLc = Lc.GetLifeTime( lifeTimeLc, sigmaLifeTimeLc );
2190 AliDebug(3,
"----> Lc: Could not get lifeTime, and sigma");
2191 if (sigmaLifeTimeLc > 1e19) {
2193 if (sigmaDecayLengthLc > 1e19) {
2197 if (sigmaMassLc > 1e19) codeKFLc = 15;
2199 else if (sigmaMassLc > 1e19) codeKFLc = 13;
2201 else if (massLc < 0) {
2203 if (sigmaMassLc > 1e19) codeKFLc = 12;
2205 else if (sigmaMassLc > 1e19) codeKFLc = 10;
2211 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));
2213 if (codeKFLc == -1) codeKFLc = 0;
2216 fHistoKF->Fill(codeKFV0, codeKFLc);
2227 Double_t xV0 = V0.GetX();
2228 Double_t yV0 = V0.GetY();
2229 Double_t zV0 = V0.GetZ();
2231 Double_t xLc = Lc.GetX();
2232 Double_t yLc = Lc.GetY();
2233 Double_t zLc = Lc.GetZ();
2235 Double_t xPrimVtx = primVtxCopy.GetX();
2236 Double_t yPrimVtx = primVtxCopy.GetY();
2237 Double_t zPrimVtx = primVtxCopy.GetZ();
2239 Double_t distanceLcToPrimVtx = TMath::Sqrt((xPrimVtx - xLc) * (xPrimVtx - xLc) +
2240 (yPrimVtx - yLc) * (yPrimVtx - yLc) +
2241 (zPrimVtx - zLc) * (zPrimVtx - zLc));
2243 Double_t distanceV0ToPrimVtx = TMath::Sqrt((xPrimVtx - xV0) * (xPrimVtx - xV0) +
2244 (yPrimVtx - yV0) * (yPrimVtx - yV0) +
2245 (zPrimVtx - zV0) * (zPrimVtx - zV0));
2247 Double_t distanceV0ToLc = TMath::Sqrt((xLc - xV0)*(xLc - xV0) +
2248 (yLc - yV0)*(yLc - yV0) +
2249 (zLc - zV0)*(zLc - zV0));
2257 distances[0] = distanceLcToPrimVtx;
2258 distances[1] = distanceV0ToPrimVtx;
2259 distances[2] = distanceV0ToLc;
2263 AliAODMCParticle *daughv01Lc = 0x0;
2264 AliAODMCParticle *K0S = 0x0;
2265 AliAODMCParticle *daughv02Lc = 0x0;
2267 if (labelsLcdaugh[0] >= 0) {
2269 daughv01Lc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsLcdaugh[0]));
2271 AliDebug(3,
"Could not access MC info for first daughter of Lc");
2275 AliDebug(2, Form(
"The bachelor has label = %d", daughv01Lc->GetLabel()));
2276 if (TMath::Abs(daughv01Lc->GetPdgCode()) != 2212) isBkgLc = kTRUE;
2283 if (labelsLcdaugh[1] >= 0) {
2285 K0S =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsLcdaugh[1]));
2287 AliDebug(3,
"Could not access MC info for second daughter of Lc");
2291 if (TMath::Abs(K0S->GetPdgCode()) != 310) isBkgLc = kTRUE;
2295 AliDebug(2,
"The K0S is not true --> it does not have a label, continuing...");
2301 Int_t iK0 = K0S->GetMother();
2303 Printf(
"The K0S has no mother... IMPOSSIBLE");
2306 daughv02Lc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iK0));
2308 AliDebug(3,
"Could not access MC info for second daughter of Lc");
2311 if( daughv01Lc && (daughv01Lc->GetMother() == daughv02Lc->GetMother()) && (daughv01Lc->GetMother()>=0) ){
2313 AliAODMCParticle *motherLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughv01Lc->GetMother()));
2314 Int_t pdgMum = 0, pdgBach = 0, pdgV0 = 0;
2315 if (motherLc) pdgMum = motherLc->GetPdgCode();
2316 if (daughv01Lc) pdgBach = daughv01Lc->GetPdgCode();
2317 if (daughv02Lc) pdgV0 = daughv02Lc->GetPdgCode();
2318 AliDebug(2, Form(
"pdgMum = %d, pdgBach = %d, pdgV0 = %d", pdgMum, pdgBach, pdgV0));
2320 if( motherLc && TMath::Abs(motherLc->GetPdgCode()) != 21 ){
2330 if (TMath::Abs(motherLc->GetPdgCode()) == 4122 && TMath::Abs(motherV0->GetPdgCode()) == 310 && TMath::Abs(daughv01Lc->GetPdgCode()) == 2212){
2331 AliDebug(2, Form(
"IT IS SIGNAL!!! with label = %d", motherLc->GetLabel()));
2356 Double_t xLcMC = motherLc->Xv();
2357 Double_t yLcMC = motherLc->Yv();
2358 Double_t zLcMC = motherLc->Zv();
2360 Double_t xProtonMC = daughv01Lc->Xv();
2361 Double_t yProtonMC = daughv01Lc->Yv();
2362 Double_t zProtonMC = daughv01Lc->Zv();
2365 Double_t vtxLcResidualToPrimVtx = TMath::Sqrt((xLcMC - xProtonMC) * (xLcMC - xProtonMC) +
2366 (yLcMC - yProtonMC) * (yLcMC - yProtonMC) +
2367 (zLcMC - zProtonMC) * (zLcMC - zProtonMC)) - distanceLcToPrimVtx;
2370 Double_t xV0MC = motherV0->Xv();
2371 Double_t yV0MC = motherV0->Yv();
2372 Double_t zV0MC = motherV0->Zv();
2375 Double_t xPionMC = daughv01->Xv();
2376 Double_t yPionMC = daughv01->Yv();
2377 Double_t zPionMC = daughv01->Zv();
2379 Printf(
"Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
2381 Double_t vtxV0ResidualToLc = TMath::Sqrt((xV0MC - xPionMC) * (xV0MC - xPionMC) +
2382 (yV0MC - yPionMC) * (yV0MC - yPionMC) +
2383 (zV0MC - zPionMC) * (zV0MC - zPionMC)) - distanceV0ToLc;
2387 Double_t vtxV0ResidualToPrimVtx = TMath::Sqrt((xPionMC - xLcMC) * (xPionMC - xLcMC) +
2388 (yPionMC - yLcMC) * (yPionMC - yLcMC) +
2389 (zPionMC - zLcMC) * (zPionMC - zLcMC)) - distanceV0ToPrimVtx;
2396 else if (!motherLc){
2397 AliDebug(2,
"We could not access MC info for Lc mother, so we did nothing");
2400 AliDebug(2,
"MC Lc mother is a gluon, so we did nothing");
2413 if ( retMV0 == 0 && retMLc == 0){
2415 errV0KF[0] = sigmaMassV0;
2416 V0KF[1] = decayLengthV0;
2417 errV0KF[1] = sigmaDecayLengthV0;
2418 V0KF[2] = lifeTimeV0;
2419 errV0KF[2] = sigmaLifeTimeV0;
2421 errLcKF[0] = sigmaMassLc;
2422 LcKF[1] = decayLengthLc;
2423 errLcKF[1] = sigmaDecayLengthLc;
2424 LcKF[2] = lifeTimeLc;
2425 errLcKF[2] = sigmaLifeTimeLc;
2433 AliAODTrack* bachelor,
2434 TClonesArray *mcArray ){
2441 Int_t label = bachelor->GetLabel();
2446 AliAODMCParticle *mcpart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(TMath::Abs(label)));
2448 Int_t
pdg = mcpart->PdgCode();
2449 if (TMath::Abs(pdg) != 2212) {
2450 AliDebug(2, Form(
"Bachelor is not a p, but a particle with pdg code = %d", pdg));
2457 Int_t bachelorMotherLabel = mcpart->GetMother();
2459 if (bachelorMotherLabel == -1) {
2462 AliAODMCParticle *bachelorMother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(bachelorMotherLabel));
2464 Int_t pdgMother = bachelorMother->PdgCode();
2465 if (TMath::Abs(pdgMother) != 4122) {
2466 AliDebug(2, Form(
"The proton does not come from a Lc, but from a particle with pdgcode = %d", pdgMother));
2470 if (labelLc != bachelorMotherLabel){
2472 AliDebug(2, Form(
"The proton comes from a Lc, but it is not the candidate we are analyzing"));
2476 AliDebug(2, Form(
"The proton comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2490 TClonesArray *mcArray ){
2501 if (labelFind == -1) {
2505 AliAODMCParticle *mcpart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelFind));
2507 Int_t
pdg = mcpart->PdgCode();
2508 if (TMath::Abs(pdg) != 310) {
2509 AliDebug(2, Form(
"K0Spart is not a K0S, but a particle with pdg code = %d", pdg));
2516 Int_t K0SpartMotherLabel = mcpart->GetMother();
2517 if (K0SpartMotherLabel == -1) {
2520 AliAODMCParticle *K0SpartMother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(K0SpartMotherLabel));
2522 Int_t pdgMotherK0S = K0SpartMother->PdgCode();
2523 if (TMath::Abs(pdgMotherK0S) != 311) {
2524 AliDebug(2, Form(
"The K0S does not come from a K0, but from a particle with pdgcode = %d", pdgMotherK0S));
2529 Int_t K0MotherLabel = K0SpartMother->GetMother();
2530 if (K0MotherLabel == -1) {
2533 AliAODMCParticle *K0Mother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(K0MotherLabel));
2535 Int_t pdgK0Mother = K0Mother->PdgCode();
2536 if (TMath::Abs(pdgK0Mother) != 4122) {
2537 AliDebug(2, Form(
"The K0 does not come from a Lc, but from a particle with pdgcode = %d", pdgK0Mother));
2542 if (labelLc != K0MotherLabel){
2543 AliDebug(2, Form(
"The K0S comes from a Lc, but it is not the candidate we are analyzing"));
2548 AliDebug(2, Form(
"The K0S comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2568 Int_t labMother[2]={-1, -1};
2569 AliAODMCParticle *part=0;
2570 AliAODMCParticle *mother=0;
2571 Int_t dgLabels = -1;
2573 Int_t ndg = v0part->GetNDaughters();
2575 AliFatal(Form(
"IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2578 for(Int_t i = 0; i < 2; i++) {
2579 AliAODTrack *trk = (AliAODTrack*)v0part->GetDaughter(i);
2580 dgLabels = trk->GetLabel();
2581 if (dgLabels == -1) {
2585 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2590 labMother[i] = part->GetMother();
2591 if (labMother[i] != -1){
2592 mother = (AliAODMCParticle*)mcArray->At(labMother[i]);
2603 if (labMother[0] == labMother[1])
return labMother[0];
2617 AliAODMCParticle *part=0;
2618 AliAODMCParticle *mother=0;
2619 AliAODMCParticle *grandmother=0;
2620 Int_t dgLabels = -1;
2622 Int_t ndg = cascade->GetNDaughters();
2624 AliFatal(Form(
"IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2628 AliAODTrack *trk = (AliAODTrack*)cascade->GetDaughter(0);
2629 dgLabels = trk->GetLabel();
2630 if (dgLabels == -1 ) {
2634 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2639 Int_t labMotherBach = part->GetMother();
2640 if (labMotherBach == -1){
2643 mother = (AliAODMCParticle*)mcArray->At(labMotherBach);
2649 AliAODv0 *v0 = (AliAODv0*)cascade->GetDaughter(1);
2651 if (dgLabels == -1 ) {
2655 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2660 Int_t labMotherv0 = part->GetMother();
2661 if (labMotherv0 == -1){
2664 mother = (AliAODMCParticle*)mcArray->At(labMotherv0);
2669 Int_t labGrandMotherv0 = mother->GetMother();
2670 if (labGrandMotherv0 == -1){
2673 grandmother = (AliAODMCParticle*)mcArray->At(labGrandMotherv0);
2680 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
static Int_t GetNumberOfTrackletsInEtaRange(AliAODEvent *ev, Double_t mineta, Double_t maxeta)
Bool_t fUseOnTheFlyV0
list of weights
Int_t fNTracklets
mask to the trigger word returned by the physics selection
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)
TH1D * fHistoDistanceV0ToPrimVtxSgn
! KF: distance for signal Lc of V0 vertex from primary vertex
TF1 * fFuncWeightPythia
multiplicity definition with tracklets
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.