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),
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();
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");
473 AliError(
"fOutputKF not available");
483 AliInfo(Form(
"CreateOutputObjects of task %s\n", GetName()));
492 const char* nameoutput = GetOutputSlot(1)->GetContainer()->GetName();
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";
608 fHistoEvents =
new TH1F(
"fHistoEvents",
"fHistoEvents", 2, -0.5, 1.5);
609 TString labelEv[2] = {
"NotSelected",
"Selected"};
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"};
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);
689 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
707 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
719 fHistoDistanceV0ToLc =
new TH1D(
"fHistoDistanceV0ToLc",
"V0 distance to Lc 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.);
766 fHistoLifeTimeLcSgn =
new TH1D(
"fHistoLifeTimeLcSgn",
"True Lc Signal Life Time; lifeTime", 100000, -0.1, 0.1);
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);
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!");
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");
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();
984 fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
986 if (
fVtx1->GetNContributors()<1)
return;
997 fBField = aodEvent->GetMagneticField();
998 AliKFParticle::SetField(
fBField);
1000 Int_t nSelectedAnal = 0;
1004 array3Prong, mcHeader);
1019 for (
Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
1020 AliAODMCParticle* mcPart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iPart));
1022 AliError(
"Failed casting particle from MC array!, Skipping particle");
1026 if (TMath::Abs(pdg) != 4122){
1027 AliDebug(2, Form(
"MC particle %d is not a Lc: its pdg code is %d", iPart, pdg));
1030 AliDebug(2, Form(
"Step 0 ok: MC particle %d is a Lc: its pdg code is %d", iPart, pdg));
1031 Int_t labeldaugh0 = mcPart->GetDaughter(0);
1032 Int_t labeldaugh1 = mcPart->GetDaughter(1);
1033 if (labeldaugh0 <= 0 || labeldaugh1 <= 0){
1034 AliDebug(2, Form(
"The MC particle doesn't have correct daughters, skipping!!"));
1037 else if (labeldaugh1 - labeldaugh0 == 1){
1038 AliDebug(2, Form(
"Step 1 ok: The MC particle has correct daughters!!"));
1039 AliAODMCParticle* daugh0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labeldaugh0));
1040 AliAODMCParticle* daugh1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labeldaugh1));
1041 if(!daugh0 || !daugh1){
1042 AliDebug(2,
"Particle daughters not properly retrieved!");
1045 Int_t pdgCodeDaugh0 = TMath::Abs(daugh0->GetPdgCode());
1046 Int_t pdgCodeDaugh1 = TMath::Abs(daugh1->GetPdgCode());
1047 AliAODMCParticle* bachelorMC = daugh0;
1048 AliAODMCParticle* v0MC = daugh1;
1049 AliDebug(2, Form(
"pdgCodeDaugh0 = %d, pdgCodeDaugh1 = %d", pdgCodeDaugh0, pdgCodeDaugh1));
1050 if ((pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) || (pdgCodeDaugh0 == 2212 && pdgCodeDaugh1 == 311)){
1053 if (pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) {
1054 bachelorMC = daugh1;
1057 AliDebug(2, Form(
"Number of Daughters of v0 = %d", v0MC->GetNDaughters()));
1058 if (v0MC->GetNDaughters() != 1) {
1059 AliDebug(2,
"The K0 does not decay in 1 body only! Impossible... Continuing...");
1063 AliDebug(2,
"Step 2 ok: The K0 does decay in 1 body only! ");
1064 Int_t labelK0daugh = v0MC->GetDaughter(0);
1065 AliAODMCParticle* partK0S =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0daugh));
1067 AliError(
"Error while casting particle! returning a NULL array");
1071 if (partK0S->GetNDaughters() != 2 || TMath::Abs(partK0S->GetPdgCode() != 310)){
1072 AliDebug(2,
"The K0 daughter is not a K0S or does not decay in 2 bodies");
1076 AliDebug(2,
"Step 3 ok: The K0 daughter is a K0S and does decay in 2 bodies");
1077 Int_t labelK0Sdaugh0 = partK0S->GetDaughter(0);
1078 Int_t labelK0Sdaugh1 = partK0S->GetDaughter(1);
1079 AliAODMCParticle* daughK0S0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0Sdaugh0));
1080 AliAODMCParticle* daughK0S1 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelK0Sdaugh1));
1081 if (!daughK0S0 || ! daughK0S1){
1082 AliDebug(2,
"Could not access K0S daughters, continuing...");
1086 AliDebug(2,
"Step 4 ok: Could access K0S daughters, continuing...");
1087 Int_t pdgK0Sdaugh0 = daughK0S0->GetPdgCode();
1088 Int_t pdgK0Sdaugh1 = daughK0S1->GetPdgCode();
1089 if (TMath::Abs(pdgK0Sdaugh0) != 211 || TMath::Abs(pdgK0Sdaugh1) != 211){
1090 AliDebug(2,
"The K0S does not decay in pi+pi-, continuing");
1095 AliDebug(2, Form(
"----> Filling histo with pt = %f", mcPart->Pt()));
1099 if(!(TMath::Abs(bachelorMC->Eta()) > 0.9 || bachelorMC->Pt() < 0.1 ||
1100 TMath::Abs(daughK0S0->Eta()) > 0.9 || daughK0S0->Pt() < 0.1 ||
1101 TMath::Abs(daughK0S1->Eta()) > 0.9 || daughK0S1->Pt() < 0.1)) {
1106 AliDebug(2,
"not in fiducial acceptance! Skipping");
1124 TClonesArray *mcArray,
1125 Int_t &nSelectedAnal,
1127 AliAODMCHeader* aodheader){
1130 Int_t pdgCand = 4122;
1131 Int_t pdgDgLctoV0bachelor[2]={2212, 310};
1132 Int_t pdgDgV0toDaughters[2]={211, 211};
1134 Int_t pdgDgLctopKpi[3]={2212, 321, 211};
1137 Int_t n3Prong = array3Prong->GetEntriesFast();
1138 Int_t nCascades= arrayLctopKos->GetEntriesFast();
1141 for (
Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
1147 Int_t mcLabel = d->MatchToMC(4122, mcArray, 3, pdgDgLctopKpi);
1152 AliAODMCParticle *partLcpKpi =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(mcLabel));
1154 Int_t pdgCode = partLcpKpi->GetPdgCode();
1155 AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1171 for (
Int_t iLctopK0s = 0; iLctopK0s < nCascades; iLctopK0s++) {
1176 AliDebug(2,Form(
"Cascade %d doens't exist, skipping",iLctopK0s));
1181 AliDebug(2,Form(
"Cascade %d is not flagged as Lc candidate",iLctopK0s));
1191 fmcLabelLc = lcK0spr->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1193 AliDebug(2, Form(
"----> cascade number %d (total cascade number = %d) is a Lc!", iLctopK0s, nCascades));
1195 AliAODMCParticle *partLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(
fmcLabelLc));
1197 pdgCode = partLc->GetPdgCode();
1198 if (pdgCode<0) AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d",
fmcLabelLc, pdgCode));
1199 pdgCode = TMath::Abs(pdgCode);
1214 if (lcK0spr->GetNDaughters()!=2) {
1215 AliDebug(2,Form(
"Cascade %d has not 2 daughters (nDaughters=%d)",iLctopK0s,lcK0spr->GetNDaughters()));
1219 AliAODv0 * v0part =
dynamic_cast<AliAODv0*
>(lcK0spr->
Getv0());
1220 AliAODTrack * bachPart =
dynamic_cast<AliAODTrack*
>(lcK0spr->
GetBachelor());
1221 if (!v0part || !bachPart) {
1222 AliDebug(2,Form(
"Cascade %d has no V0 or no bachelor object",iLctopK0s));
1227 if (!v0part->GetSecondaryVtx()) {
1228 AliDebug(2,Form(
"No secondary vertex for V0 by cascade %d",iLctopK0s));
1232 if (v0part->GetNDaughters()!=2) {
1233 AliDebug(2,Form(
"current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters()));
1239 if (!v0Neg || !v0Pos) {
1240 AliDebug(2,Form(
"V0 by cascade %d has no V0positive of V0negative object",iLctopK0s));
1245 if (v0Pos->Charge() == v0Neg->Charge()) {
1246 AliDebug(2,Form(
"V0 by cascade %d has daughters with the same sign: IMPOSSIBLE!",iLctopK0s));
1257 mcLabel = lcK0spr->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1259 AliDebug(2,Form(
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s, nCascades));
1261 AliAODMCParticle *partLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(mcLabel));
1263 pdgCode = partLc->GetPdgCode();
1264 if (pdgCode<0) AliDebug(2,Form(
" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1265 pdgCode = TMath::Abs(pdgCode);
1275 AliDebug(2, Form(
"\n\n\n Analysing candidate %d\n", iLctopK0s));
1276 AliDebug(2, Form(
">>>>>>>>>> Candidate is background, fFillOnlySgn = %d --> SKIPPING",
fFillOnlySgn));
1285 if (!isCandidateInjected){
1286 AliDebug(2,
"The candidate is from HIJING (i.e. not injected), keeping it to fill background");
1290 AliDebug(2,
"The candidate is NOT from HIJING, we skip it when filling background");
1297 AliAODTrack *bachelor = (AliAODTrack*)lcK0spr->
GetBachelor();
1300 if (!bachelor || !v0pos || !v0neg) {
1301 AliDebug(2,
"Cannot retrieve one of the tracks while checking origin, continuing");
1305 Int_t labelbachelor = TMath::Abs(bachelor->GetLabel());
1306 Int_t labelv0pos = TMath::Abs(v0pos->GetLabel());
1307 Int_t labelv0neg = TMath::Abs(v0neg->GetLabel());
1308 AliAODMCParticle* MCbachelor = (AliAODMCParticle*)mcArray->At(labelbachelor);
1309 AliAODMCParticle* MCv0pos = (AliAODMCParticle*)mcArray->At(labelv0pos);
1310 AliAODMCParticle* MCv0neg = (AliAODMCParticle*)mcArray->At(labelv0neg);
1311 if (!MCbachelor || !MCv0pos || !MCv0neg) {
1312 AliDebug(2,
"Cannot retrieve MC particle for one of the tracks while checking origin, continuing");
1319 if (isBachelorFromPythia != 0 && isv0posFromPythia != 0 && isv0negFromPythia != 0){
1320 AliDebug(2,
"The candidate is from PYTHIA (i.e. all daughters originate from a quark), keeping it to fill background");
1324 AliDebug(2,
"The candidate is NOT from PYTHIA, we skip it when filling background");
1344 Int_t &nSelectedAnal,
1346 TClonesArray *mcArray,
Int_t iLctopK0s){
1362 AliAODv0 * v0part = part->
Getv0();
1363 Bool_t onFlyV0 = v0part->GetOnFlyStatus();
1382 Double_t invmassK0s = v0part->MassK0Short();
1403 if (isInV0window == 0) {
1404 AliDebug(2,
"No: The candidate has NOT passed the V0 window cuts!");
1405 if (isLc) Printf(
"SIGNAL candidate rejected: V0 window cuts");
1408 else AliDebug(2,
"Yes: The candidate has passed the mass cuts!");
1412 if (!isInCascadeWindow) {
1413 AliDebug(2,
"No: The candidate has NOT passed the cascade window cuts!");
1414 if (isLc) Printf(
"SIGNAL candidate rejected: cascade window cuts");
1417 else AliDebug(2,
"Yes: The candidate has passed the cascade window cuts!");
1421 if (!isCandidateSelectedCuts){
1422 AliDebug(2,
"No: Analysis cuts kCandidate level NOT passed");
1423 if (isLc) Printf(
"SIGNAL candidate rejected");
1427 AliDebug(2,
"Yes: Analysis cuts kCandidate level passed");
1430 AliAODTrack *bachelor = (AliAODTrack*)part->
GetBachelor();
1432 AliDebug(2, Form(
"Very weird, the bachelor is not there... returning for this candidate"));
1437 Double_t probTPCTOF[AliPID::kSPECIES]={-1.};
1440 AliDebug(2, Form(
"detUsed (TPCTOF case) = %d", detUsed));
1445 AliDebug(2, Form(
"We have found the detector mask for TOF + TPC: probProton will be set to %f", probTPCTOF[
AliPID::kProton]));
1451 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
1452 AliDebug(2,
"We did not find the detector mask for TOF + TPC, let's see only TPC");
1454 AliDebug(2,Form(
" detUsed (TPC case) = %d", detUsed));
1459 AliDebug(2, Form(
"TPC only worked: probProton will be set to %f", probTPCTOF[
AliPID::kProton]));
1462 AliDebug(2,
"Only TPC did not work...");
1465 fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
1467 AliDebug(2, Form(
"probProton = %f", probProton));
1472 Double_t pidTPC[AliPID::kSPECIES]={-1.};
1473 Double_t pidTOF[AliPID::kSPECIES]={-1.};
1474 Int_t respTPC =
fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTPC, bachelor, AliPID::kSPECIES, pidTPC);
1475 Int_t respTOF =
fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTOF, bachelor, AliPID::kSPECIES, pidTOF);
1476 if (respTPC == AliPIDResponse::kDetPidOk) probProtonTPC = pidTPC[
AliPID::kProton];
1477 if (respTOF == AliPIDResponse::kDetPidOk) probProtonTOF = pidTOF[
AliPID::kProton];
1481 AliDebug(2,
"On-the-fly discarded");
1492 if (isLc) Printf(
"SIGNAL candidate rejected");
1493 AliDebug(2,
"No: Analysis cuts kTracks level NOT passed");
1497 AliDebug(2,
"Yes: Analysis cuts kTracks level passed");
1500 Int_t pdgCand = 4122;
1501 Int_t pdgDgLctoV0bachelor[2]={211, 3122};
1502 Int_t pdgDgV0toDaughters[2]={2212, 211};
1503 Int_t isLc2LBarpi=0, isLc2Lpi=0;
1504 Int_t currentLabel = part->GetLabel();
1507 mcLabel = part->
MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1509 if (bachelor->Charge()==-1) isLc2LBarpi=1;
1510 if (bachelor->Charge()==+1) isLc2Lpi=1;
1514 Int_t pdgDg2prong[2] = {211, 211};
1518 labelK0S = v0part->MatchToMC(310, mcArray, 2, pdgDg2prong);
1519 if (labelK0S>=0) isK0S = 1;
1522 pdgDg2prong[0] = 211;
1523 pdgDg2prong[1] = 2212;
1525 Int_t isLambdaBar = 0;
1526 Int_t lambdaLabel = 0;
1528 lambdaLabel = v0part->MatchToMC(3122, mcArray, 2, pdgDg2prong);
1529 if (lambdaLabel>=0) {
1530 AliAODMCParticle *lambdaTrack = (AliAODMCParticle*)mcArray->At(lambdaLabel);
1531 if (lambdaTrack->GetPdgCode()==3122) isLambda = 1;
1532 else if (lambdaTrack->GetPdgCode()==-3122) isLambdaBar = 1;
1536 pdgDg2prong[0] = 11;
1537 pdgDg2prong[1] = 11;
1539 Int_t gammaLabel = 0;
1541 gammaLabel = v0part->MatchToMC(22, mcArray, 2, pdgDg2prong);
1542 if (gammaLabel>=0) {
1543 AliAODMCParticle *gammaTrack = (AliAODMCParticle*)mcArray->At(gammaLabel);
1544 if (gammaTrack->GetPdgCode()==22) isGamma = 1;
1549 if (currentLabel != -1){
1550 AliAODMCParticle *tempPart = (AliAODMCParticle*)mcArray->At(currentLabel);
1551 pdgTemp = tempPart->GetPdgCode();
1553 if (isLc) AliDebug(2, Form(
"Signal: Candidate is a Lc in K0s+p"));
1554 else if (isLc2LBarpi) AliDebug(2, Form(
"Background: Candidate is a Lc in Lbar + pi"));
1555 else if (isLc2Lpi) AliDebug(2, Form(
"Background: Candidate is a Lc in L + pi"));
1556 else AliDebug(2, Form(
"Pure bkg: Candidate has pdg = %d", pdgTemp));
1557 if (isK0S) AliDebug(2, Form(
"V0 is a K0S"));
1558 else if (isLambda) AliDebug(2, Form(
"V0 is a Lambda"));
1559 else if (isLambdaBar) AliDebug(2, Form(
"V0 is a LambdaBar"));
1560 else if (isGamma) AliDebug(2, Form(
"V0 is a Gamma"));
1564 Double_t invmassLambda = v0part->MassLambda();
1565 Double_t invmassLambdaBar = v0part->MassAntiLambda();
1591 nSigmaTPCpi =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kPion));
1592 nSigmaTPCka =
fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kKaon));
1594 nSigmaTOFpi =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kPion));
1595 nSigmaTOFka =
fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kKaon));
1599 Double_t weightPythia = -1, weight5LHC13d3 = -1, weight5LHC13d3Lc = -1;
1602 if (iLctopK0s >= 0) {
1603 AliAODMCParticle *partLcMC = (AliAODMCParticle*)mcArray->At(iLctopK0s);
1604 ptLcMC = partLcMC->Pt();
1617 if(!
fHistoMCNch) AliInfo(
"Input histos to evaluate Nch weights missing");
1624 if (!onFlyV0 && isInV0window && isInCascadeWindow && part->
CosV0PointingAngle()>0.99 && TMath::Abs(nSigmaTPCpr) <= 3 && v0part->Getd0Prong(0) < 20 && v0part->Getd0Prong(1) < 20) {
1682 k0SCode =
CheckK0S(part, v0part, mcArray);
1688 Double_t V0KF[3] = {-999999, -999999, -999999};
1689 Double_t errV0KF[3] = {-999999, -999999, -999999};
1690 Double_t LcKF[3] = {-999999, -999999, -999999};
1691 Double_t errLcKF[3] = {-999999, -999999, -999999};
1692 Double_t distances[3] = {-999999, -999999, -999999};
1693 Double_t armPolKF[2] = {-999999, -999999};
1696 Int_t kfResult =
CallKFVertexing(part, v0part, bachelor, mcArray, &V0KF[0], &errV0KF[0], &LcKF[0], &errLcKF[0], &distances[0], &armPolKF[0]);
1697 AliDebug(2, Form(
"Result from KF = %d", kfResult));
1730 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)));
1745 fCandidateVariables[77] = bachelor->HasPointOnITSLayer(0) + bachelor->HasPointOnITSLayer(1);
1753 TVector3 mom1(bachelor->Px(), bachelor->Py(), bachelor->Pz());
1754 TVector3 mom2(v0part->Px(), v0part->Py(), v0part->Pz());
1755 TVector3 momTot(part->Px(), part->Py(), part->Pz());
1757 Double_t Ql1 = mom1.Dot(momTot)/momTot.Mag();
1758 Double_t Ql2 = mom2.Dot(momTot)/momTot.Mag();
1760 Double_t alphaArmLc = (Ql1 - Ql2)/(Ql1 + Ql2);
1761 Double_t alphaArmLcCharge = ( bachelor->Charge() > 0 ? (Ql1 - Ql2)/(Ql1 + Ql2) : (Ql2 - Ql1)/(Ql1 + Ql2) );
1762 Double_t ptArmLc = mom1.Perp(momTot);
1768 Double_t massK0SPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
1769 Double_t massPrPDG = TDatabasePDG::Instance()->GetParticle(2212)->Mass();
1770 Double_t massLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
1772 Double_t pStar = TMath::Sqrt((massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)*(massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)-4.*massPrPDG*massPrPDG*massK0SPDG*massK0SPDG)/(2.*massLcPDG);
1777 Double_t cts = (Ql1/gamma-beta*TMath::Sqrt(pStar*pStar+massPrPDG*massPrPDG))/pStar;
1789 AliDebug(2, Form(
"Reco particle %d --> Filling Sgn", iLctopK0s));
1795 AliDebug(2,
"Filling Bkg");
1820 Int_t codeKFV0 = -1, codeKFLc = -1;
1822 AliKFVertex primVtxCopy;
1823 Int_t nt = 0, ntcheck = 0;
1829 fVtx1->GetCovarianceMatrix(covmatrix);
1831 AliESDVertex primaryESDVtxCopy(pos, covmatrix, chi2, contr,
"Vertex");
1834 primVtxCopy = AliKFVertex(primaryESDVtxCopy);
1835 nt = primaryESDVtxCopy.GetNContributors();
1839 Int_t pdgLc[2] = {2212, 310};
1841 Int_t pdgDgV0toDaughters[2] = {211, 211};
1843 Int_t mcLabelV0 = v0part->MatchToMC(310, mcArray, 2, pdgDgV0toDaughters);
1846 Bool_t isMCokV0 = kTRUE, isBkgV0 = kFALSE;
1847 AliKFParticle V0, positiveV0KF, negativeV0KF;
1848 Int_t labelsv0daugh[2] = {-1, -1};
1849 Int_t idv0daugh[2] = {-1, -1};
1850 AliExternalTrackParam* esdv0Daugh1 = 0x0;
1851 AliExternalTrackParam* esdv0Daugh2 = 0x0;
1852 for(
Int_t ipr= 0; ipr < 2; ipr++){
1853 AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1855 AliDebug(2,
"No V0 daughters available");
1858 Double_t xyz[3], pxpypz[3], cv[21];
1860 aodTrack->GetXYZ(xyz);
1861 aodTrack->PxPyPz(pxpypz);
1862 aodTrack->GetCovarianceXYZPxPyPz(cv);
1863 sign = aodTrack->Charge();
1864 AliExternalTrackParam tmp1( xyz, pxpypz, cv, sign);
1866 if (ipr == 0) esdv0Daugh1 =
new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1867 else esdv0Daugh2 =
new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1868 labelsv0daugh[ipr] = TMath::Abs(aodTrack->GetLabel());
1869 idv0daugh[ipr] = aodTrack->GetID();
1870 if (labelsv0daugh[ipr] == -1) isBkgV0 = kTRUE;
1874 AliKFParticle daughterKF(*aodTrack, pdg[ipr]);
1875 if (aodTrack->Charge() > 0) {
1876 positiveV0KF = daughterKF;
1879 negativeV0KF = daughterKF;
1884 AliDebug(2, Form(
"bField = %f, esdv0Daugh1 = %p, esdv0Daugh2 = %p",
fBField, esdv0Daugh1, esdv0Daugh2));
1887 AliExternalTrackParam tr1(*esdv0Daugh1);
1888 AliExternalTrackParam tr2(*esdv0Daugh2);
1892 AliKFParticle daughterKF1(tr1, 211);
1893 AliKFParticle daughterKF2(tr2, 211);
1894 V0.AddDaughter(positiveV0KF);
1895 V0.AddDaughter(negativeV0KF);
1904 if( V0.GetNDF() < 1 ) {
1908 if( TMath::Sqrt(TMath::Abs(V0.GetChi2()/V0.GetNDF())) >
fCutKFChi2NDF ) {
1914 for(
Int_t ipr = 0; ipr < 2; ipr++){
1915 AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1917 if(!aodTrack->GetUsedForPrimVtxFit()) {
1921 AliKFParticle daughterKF(*aodTrack, pdg[ipr]);
1922 primVtxCopy -= daughterKF;
1936 Double_t massV0 = 999999, sigmaMassV0 = 999999;
1937 Int_t retMV0 = V0.GetMass( massV0, sigmaMassV0 );
1941 if (sigmaMassV0 > 1e19) codeKFV0 = 5;
1943 else if (sigmaMassV0 > 1e19) codeKFV0 = 2;
1947 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]);
1948 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]);
1950 Printf(
"Vertices: KF: x = %f, y = %f, z = %f", V0.GetX(), V0.GetY(), V0.GetZ());
1951 Printf(
"Vertices: AOD: x = %f, y = %f, z = %f", v0part->Xv(), v0part->Yv(), v0part->Zv());
1954 if (
fUseMCInfo && TMath::Abs(labelsv0daugh[0] - labelsv0daugh[1]) == 1) {
1955 AliAODMCParticle* tmpdaughv01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[0]));
1956 AliAODMCParticle* tmpdaughv02 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[1]));
1957 if (!tmpdaughv01 && labelsv0daugh[0] > 0){
1958 AliDebug(2,
"Could not access MC info for first daughter of V0, continuing");
1960 if (!tmpdaughv02 && labelsv0daugh[1] > 0){
1961 AliDebug(2,
"Could not access MC info for second daughter of V0, continuing");
1964 Double_t xPionMC = tmpdaughv01->Xv();
1965 Double_t yPionMC = tmpdaughv01->Yv();
1966 Double_t zPionMC = tmpdaughv01->Zv();
1968 Printf(
"Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
1972 Printf(
"Not a true V0");
1979 nt = primVtxCopy.GetNContributors();
1982 Bool_t isMCokLc = kTRUE, isBkgLc = kFALSE;
1984 Int_t labelsLcdaugh[2] = {-1, -1};
1985 labelsLcdaugh[0] = TMath::Abs(bach->GetLabel());
1986 labelsLcdaugh[1] = mcLabelV0;
1988 if (bach->Charge() < 0) pdgLc[0] = -pdgLc[0];
1989 AliKFParticle daughterKFLc(*bach, pdgLc[0]);
1990 Lc.AddDaughter(daughterKFLc);
1991 TParticlePDG* particlePDG = TDatabasePDG::Instance()->GetParticle(310);
1992 Double_t massPDGK0S = particlePDG->Mass();
1993 V0.SetMassConstraint(massPDGK0S);
1995 if( Lc.GetNDF() < 1 ) {
1996 AliDebug(2, Form(
"Lc: Number of degrees of freedom < 1 (%d), continuing", Lc.GetNDF()));
1999 if( TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) >
fCutKFChi2NDF) {
2000 AliDebug(2, Form(
"Lc: Chi2 per DOF too big, continuing (%f)", TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
2006 if(!bach->GetUsedForPrimVtxFit()) {
2007 AliDebug(3,
"Lc: Bachelor was not used for primary vertex, not subtracting it from primary vertex");
2010 primVtxCopy -= daughterKFLc;
2039 if( TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) >
fCutKFChi2NDF) {
2040 AliDebug(2, Form(
"Lc: Final Chi2 per DOF too big, continuing (%f)", TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
2045 V0.SetProductionVertex(Lc);
2051 Double_t decayLengthV0 = 999999, sigmaDecayLengthV0 = 999999;
2052 Int_t retDLV0 = V0.GetDecayLength( decayLengthV0, sigmaDecayLengthV0 );
2054 if (sigmaDecayLengthV0 > 1e19) {
2058 if (sigmaMassV0 > 1e19) codeKFV0 = 11;
2060 else if (sigmaMassV0 > 1e19) codeKFV0 = 8;
2066 Double_t lifeTimeV0 = 999999, sigmaLifeTimeV0 = 999999;
2067 Int_t retTLV0 = V0.GetLifeTime( lifeTimeV0, sigmaLifeTimeV0 );
2069 if (sigmaLifeTimeV0 > 1e19) {
2071 if (sigmaDecayLengthV0 > 1e19) {
2075 if (sigmaMassV0 > 1e19) codeKFV0 = 15;
2077 else if (sigmaMassV0 > 1e19) codeKFV0 = 13;
2079 else if (massV0 < 0) {
2081 if (sigmaMassV0 > 1e19) codeKFV0 = 12;
2083 else if (sigmaMassV0 > 1e19) codeKFV0 = 10;
2088 if (codeKFV0 == -1) codeKFV0 = 0;
2091 AliDebug(2, Form(
"V0: mass = %f, decay length = %f, life time = %f", massV0, decayLengthV0, lifeTimeV0 ));
2098 Double_t vtxV0KF[3] = {V0.GetX(), V0.GetY(), V0.GetZ()};
2099 positiveV0KF.TransportToPoint(vtxV0KF);
2100 negativeV0KF.TransportToPoint(vtxV0KF);
2101 V0.GetArmenterosPodolanski(positiveV0KF, negativeV0KF, qtAlphaV0);
2102 AliDebug(2, Form(
"Armenteros-Podolanski variables: alpha = %f, qt = %f", qtAlphaV0[1], qtAlphaV0[0]));
2105 armPolKF[0] = qtAlphaV0[1];
2106 armPolKF[1] = qtAlphaV0[0];
2110 AliAODMCParticle *motherV0 = 0x0;
2111 AliAODMCParticle *daughv01 = 0x0;
2112 AliAODMCParticle *daughv02 = 0x0;
2115 daughv01 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[0]));
2116 daughv02 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsv0daugh[1]));
2117 if (!daughv01 && labelsv0daugh[0] > 0){
2118 AliDebug(2,
"Could not access MC info for first daughter of V0, continuing");
2121 if (!daughv02 && labelsv0daugh[1] > 0){
2122 AliDebug(2,
"Could not access MC info for second daughter of V0, continuing");
2126 if( daughv01->GetMother() == daughv02->GetMother() && daughv01->GetMother()>=0 ){
2127 AliDebug(3, Form(
"The mother has label %d", daughv01->GetMother()));
2128 motherV0 =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughv01->GetMother()));
2129 if( motherV0 && TMath::Abs(motherV0->GetPdgCode()) != 21 ){
2130 if( motherV0->GetNDaughters() == 2 ){
2135 if (TMath::Abs(motherV0->GetPdgCode()) == 310){
2142 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()));
2144 else if (!motherV0){
2145 AliDebug(3,
"could not access MC info for mother, continuing");
2148 AliDebug(3,
"MC mother is a gluon, continuing");
2152 AliDebug(3,
"Background V0!");
2158 AliDebug(2, Form(
"isMCokV0 = %d, isBkgV0 = %d", (
Int_t)isMCokV0, (
Int_t)isBkgV0));
2163 Double_t massLc = 999999, sigmaMassLc= 999999;
2164 Int_t retMLc = Lc.GetMass( massLc, sigmaMassLc );
2166 AliDebug(3, Form(
"----> Could not get mass (%e), and sigma(%e) for Lc, continuing", massLc, sigmaMassLc));
2169 if (sigmaMassLc > 1e19) codeKFLc = 5;
2171 else if (sigmaMassLc > 1e19) codeKFLc = 2;
2176 Double_t decayLengthLc = 999999, sigmaDecayLengthLc = 999999;
2177 Int_t retDLLc = Lc.GetDecayLength( decayLengthLc, sigmaDecayLengthLc );
2179 AliDebug(3,
"----> Lc: Could not get decay length, and sigma");
2180 if (sigmaDecayLengthLc > 1e19) {
2184 if (sigmaMassLc > 1e19) codeKFLc = 11;
2186 else if (sigmaMassLc > 1e19) codeKFLc = 8;
2189 AliDebug(3, Form(
"retDLLc = %d, with decayLength = %f and error = %e", retDLLc, decayLengthLc, sigmaDecayLengthLc));
2194 Double_t lifeTimeLc = 999999, sigmaLifeTimeLc = 999999;
2195 Int_t retTLLc = Lc.GetLifeTime( lifeTimeLc, sigmaLifeTimeLc );
2197 AliDebug(3,
"----> Lc: Could not get lifeTime, and sigma");
2198 if (sigmaLifeTimeLc > 1e19) {
2200 if (sigmaDecayLengthLc > 1e19) {
2204 if (sigmaMassLc > 1e19) codeKFLc = 15;
2206 else if (sigmaMassLc > 1e19) codeKFLc = 13;
2208 else if (massLc < 0) {
2210 if (sigmaMassLc > 1e19) codeKFLc = 12;
2212 else if (sigmaMassLc > 1e19) codeKFLc = 10;
2218 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));
2220 if (codeKFLc == -1) codeKFLc = 0;
2223 fHistoKF->Fill(codeKFV0, codeKFLc);
2242 Double_t xPrimVtx = primVtxCopy.GetX();
2243 Double_t yPrimVtx = primVtxCopy.GetY();
2244 Double_t zPrimVtx = primVtxCopy.GetZ();
2246 Double_t distanceLcToPrimVtx = TMath::Sqrt((xPrimVtx - xLc) * (xPrimVtx - xLc) +
2247 (yPrimVtx - yLc) * (yPrimVtx - yLc) +
2248 (zPrimVtx - zLc) * (zPrimVtx - zLc));
2250 Double_t distanceV0ToPrimVtx = TMath::Sqrt((xPrimVtx - xV0) * (xPrimVtx - xV0) +
2251 (yPrimVtx - yV0) * (yPrimVtx - yV0) +
2252 (zPrimVtx - zV0) * (zPrimVtx - zV0));
2254 Double_t distanceV0ToLc = TMath::Sqrt((xLc - xV0)*(xLc - xV0) +
2255 (yLc - yV0)*(yLc - yV0) +
2256 (zLc - zV0)*(zLc - zV0));
2264 distances[0] = distanceLcToPrimVtx;
2265 distances[1] = distanceV0ToPrimVtx;
2266 distances[2] = distanceV0ToLc;
2270 AliAODMCParticle *daughv01Lc = 0x0;
2271 AliAODMCParticle *K0S = 0x0;
2272 AliAODMCParticle *daughv02Lc = 0x0;
2274 if (labelsLcdaugh[0] >= 0) {
2276 daughv01Lc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsLcdaugh[0]));
2278 AliDebug(3,
"Could not access MC info for first daughter of Lc");
2282 AliDebug(2, Form(
"The bachelor has label = %d", daughv01Lc->GetLabel()));
2283 if (TMath::Abs(daughv01Lc->GetPdgCode()) != 2212) isBkgLc = kTRUE;
2290 if (labelsLcdaugh[1] >= 0) {
2292 K0S =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelsLcdaugh[1]));
2294 AliDebug(3,
"Could not access MC info for second daughter of Lc");
2298 if (TMath::Abs(K0S->GetPdgCode()) != 310) isBkgLc = kTRUE;
2302 AliDebug(2,
"The K0S is not true --> it does not have a label, continuing...");
2308 Int_t iK0 = K0S->GetMother();
2310 Printf(
"The K0S has no mother... IMPOSSIBLE");
2313 daughv02Lc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(iK0));
2315 AliDebug(3,
"Could not access MC info for second daughter of Lc");
2318 if( daughv01Lc && (daughv01Lc->GetMother() == daughv02Lc->GetMother()) && (daughv01Lc->GetMother()>=0) ){
2320 AliAODMCParticle *motherLc =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(daughv01Lc->GetMother()));
2321 Int_t pdgMum = 0, pdgBach = 0, pdgV0 = 0;
2322 if (motherLc) pdgMum = motherLc->GetPdgCode();
2323 if (daughv01Lc) pdgBach = daughv01Lc->GetPdgCode();
2324 if (daughv02Lc) pdgV0 = daughv02Lc->GetPdgCode();
2325 AliDebug(2, Form(
"pdgMum = %d, pdgBach = %d, pdgV0 = %d", pdgMum, pdgBach, pdgV0));
2327 if( motherLc && TMath::Abs(motherLc->GetPdgCode()) != 21 ){
2337 if (TMath::Abs(motherLc->GetPdgCode()) == 4122 && TMath::Abs(motherV0->GetPdgCode()) == 310 && TMath::Abs(daughv01Lc->GetPdgCode()) == 2212){
2338 AliDebug(2, Form(
"IT IS SIGNAL!!! with label = %d", motherLc->GetLabel()));
2367 Double_t xProtonMC = daughv01Lc->Xv();
2368 Double_t yProtonMC = daughv01Lc->Yv();
2369 Double_t zProtonMC = daughv01Lc->Zv();
2372 Double_t vtxLcResidualToPrimVtx = TMath::Sqrt((xLcMC - xProtonMC) * (xLcMC - xProtonMC) +
2373 (yLcMC - yProtonMC) * (yLcMC - yProtonMC) +
2374 (zLcMC - zProtonMC) * (zLcMC - zProtonMC)) - distanceLcToPrimVtx;
2386 Printf(
"Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
2388 Double_t vtxV0ResidualToLc = TMath::Sqrt((xV0MC - xPionMC) * (xV0MC - xPionMC) +
2389 (yV0MC - yPionMC) * (yV0MC - yPionMC) +
2390 (zV0MC - zPionMC) * (zV0MC - zPionMC)) - distanceV0ToLc;
2394 Double_t vtxV0ResidualToPrimVtx = TMath::Sqrt((xPionMC - xLcMC) * (xPionMC - xLcMC) +
2395 (yPionMC - yLcMC) * (yPionMC - yLcMC) +
2396 (zPionMC - zLcMC) * (zPionMC - zLcMC)) - distanceV0ToPrimVtx;
2403 else if (!motherLc){
2404 AliDebug(2,
"We could not access MC info for Lc mother, so we did nothing");
2407 AliDebug(2,
"MC Lc mother is a gluon, so we did nothing");
2420 if ( retMV0 == 0 && retMLc == 0){
2422 errV0KF[0] = sigmaMassV0;
2423 V0KF[1] = decayLengthV0;
2424 errV0KF[1] = sigmaDecayLengthV0;
2425 V0KF[2] = lifeTimeV0;
2426 errV0KF[2] = sigmaLifeTimeV0;
2428 errLcKF[0] = sigmaMassLc;
2429 LcKF[1] = decayLengthLc;
2430 errLcKF[1] = sigmaDecayLengthLc;
2431 LcKF[2] = lifeTimeLc;
2432 errLcKF[2] = sigmaLifeTimeLc;
2440 AliAODTrack* bachelor,
2441 TClonesArray *mcArray ){
2448 Int_t label = bachelor->GetLabel();
2453 AliAODMCParticle *mcpart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(TMath::Abs(label)));
2456 if (TMath::Abs(pdg) != 2212) {
2457 AliDebug(2, Form(
"Bachelor is not a p, but a particle with pdg code = %d", pdg));
2464 Int_t bachelorMotherLabel = mcpart->GetMother();
2466 if (bachelorMotherLabel == -1) {
2469 AliAODMCParticle *bachelorMother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(bachelorMotherLabel));
2471 Int_t pdgMother = bachelorMother->PdgCode();
2472 if (TMath::Abs(pdgMother) != 4122) {
2473 AliDebug(2, Form(
"The proton does not come from a Lc, but from a particle with pdgcode = %d", pdgMother));
2477 if (labelLc != bachelorMotherLabel){
2479 AliDebug(2, Form(
"The proton comes from a Lc, but it is not the candidate we are analyzing"));
2483 AliDebug(2, Form(
"The proton comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2497 TClonesArray *mcArray ){
2508 if (labelFind == -1) {
2512 AliAODMCParticle *mcpart =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(labelFind));
2515 if (TMath::Abs(pdg) != 310) {
2516 AliDebug(2, Form(
"K0Spart is not a K0S, but a particle with pdg code = %d", pdg));
2523 Int_t K0SpartMotherLabel = mcpart->GetMother();
2524 if (K0SpartMotherLabel == -1) {
2527 AliAODMCParticle *K0SpartMother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(K0SpartMotherLabel));
2529 Int_t pdgMotherK0S = K0SpartMother->PdgCode();
2530 if (TMath::Abs(pdgMotherK0S) != 311) {
2531 AliDebug(2, Form(
"The K0S does not come from a K0, but from a particle with pdgcode = %d", pdgMotherK0S));
2536 Int_t K0MotherLabel = K0SpartMother->GetMother();
2537 if (K0MotherLabel == -1) {
2540 AliAODMCParticle *K0Mother =
dynamic_cast<AliAODMCParticle*
>(mcArray->At(K0MotherLabel));
2542 Int_t pdgK0Mother = K0Mother->PdgCode();
2543 if (TMath::Abs(pdgK0Mother) != 4122) {
2544 AliDebug(2, Form(
"The K0 does not come from a Lc, but from a particle with pdgcode = %d", pdgK0Mother));
2549 if (labelLc != K0MotherLabel){
2550 AliDebug(2, Form(
"The K0S comes from a Lc, but it is not the candidate we are analyzing"));
2555 AliDebug(2, Form(
"The K0S comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2575 Int_t labMother[2]={-1, -1};
2576 AliAODMCParticle *part=0;
2577 AliAODMCParticle *mother=0;
2578 Int_t dgLabels = -1;
2580 Int_t ndg = v0part->GetNDaughters();
2582 AliFatal(Form(
"IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2585 for(
Int_t i = 0; i < 2; i++) {
2586 AliAODTrack *trk = (AliAODTrack*)v0part->GetDaughter(i);
2587 dgLabels = trk->GetLabel();
2588 if (dgLabels == -1) {
2592 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2597 labMother[i] = part->GetMother();
2598 if (labMother[i] != -1){
2599 mother = (AliAODMCParticle*)mcArray->At(labMother[i]);
2610 if (labMother[0] == labMother[1])
return labMother[0];
2624 AliAODMCParticle *part=0;
2625 AliAODMCParticle *mother=0;
2626 AliAODMCParticle *grandmother=0;
2627 Int_t dgLabels = -1;
2629 Int_t ndg = cascade->GetNDaughters();
2631 AliFatal(Form(
"IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2635 AliAODTrack *trk = (AliAODTrack*)cascade->GetDaughter(0);
2636 dgLabels = trk->GetLabel();
2637 if (dgLabels == -1 ) {
2641 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2646 Int_t labMotherBach = part->GetMother();
2647 if (labMotherBach == -1){
2650 mother = (AliAODMCParticle*)mcArray->At(labMotherBach);
2656 AliAODv0 *v0 = (AliAODv0*)cascade->GetDaughter(1);
2658 if (dgLabels == -1 ) {
2662 part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2667 Int_t labMotherv0 = part->GetMother();
2668 if (labMotherv0 == -1){
2671 mother = (AliAODMCParticle*)mcArray->At(labMotherv0);
2676 Int_t labGrandMotherv0 = mother->GetMother();
2677 if (labGrandMotherv0 == -1){
2680 grandmother = (AliAODMCParticle*)mcArray->At(labGrandMotherv0);
2687 if (labGrandMotherv0 == labMotherBach)
return labMotherBach;
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)
Bool_t CheckCascadeFlags(AliRDHFCuts::ESele selFlag=AliRDHFCuts::kLctoV0Cuts)
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 IsSelectedSingleCut(TObject *obj, Int_t selectionLevel, Int_t cutIndex, AliAODEvent *aod=0x0)
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)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
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.