AliPhysics  8417398 (8417398)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliAnalysisTaskSELc2V0bachelorTMVA.cxx
Go to the documentation of this file.
1 /**************************************************************************
2  * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Author: The ALICE Off-line Project. *
5  * Contributors are mentioned in the code where appropriate. *
6  * *
7  * Permission to use, copy, modify and distribute this software and its *
8  * documentation strictly for non-commercial purposes is hereby granted *
9  * without fee, provided that the above copyright notice appears in all *
10  * copies and that both the copyright notice and this permission notice *
11  * appeuear in the supporting documentation. The authors make no claims *
12  * about the suitability of this software for any purpose. It is *
13  * provided "as is" without express or implied warranty. *
14  **************************************************************************/
15 
16 /* $Id: AliAnalysisTaskSELc2V0bachelorTMVA.cxx 62231 2013-04-29 09:47:26Z fprino $ */
17 
18 //
19 //
20 // Base class for Lc2V0 Analysis to be used with TMVA
21 //
22 //
23 
24 //------------------------------------------------------------------------------------------
25 //
26 // Author: C. Zampolli (from AliAnalysisTaskSELc2V0bachelor class by A.De Caro, P. Pagano)
27 //
28 //------------------------------------------------------------------------------------------
29 
30 #include <TSystem.h>
31 #include <TParticle.h>
32 #include <TParticlePDG.h>
33 #include <TH1F.h>
34 #include <TH1I.h>
35 #include <TH2F.h>
36 #include <TTree.h>
37 #include "TROOT.h"
38 #include <TDatabasePDG.h>
39 #include "TVector3.h"
40 
41 #include <AliAnalysisDataSlot.h>
42 #include <AliAnalysisDataContainer.h>
43 #include "AliStack.h"
44 #include "AliMCEvent.h"
45 #include "AliAnalysisManager.h"
46 #include "AliAODMCHeader.h"
47 #include "AliAODHandler.h"
48 #include "AliLog.h"
49 #include "AliAODVertex.h"
50 #include "AliAODRecoDecay.h"
51 #include "AliAODRecoDecayHF.h"
52 #include "AliAODRecoCascadeHF.h"
53 #include "AliAnalysisVertexingHF.h"
54 #include "AliESDtrack.h"
55 #include "AliAODTrack.h"
56 #include "AliAODv0.h"
57 #include "AliAODMCParticle.h"
58 #include "AliAnalysisTaskSE.h"
61 #include "AliAODPidHF.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"
71 
72 using std::cout;
73 using std::endl;
74 
78 
79 //__________________________________________________________________________
81 AliAnalysisTaskSE(),
82  fUseMCInfo(kFALSE),
83  fOutput(0),
84  fCEvents(0),
85  fPIDResponse(0),
86  fPIDCombined(0),
87  fIsK0sAnalysis(kFALSE),
88  fCounter(0),
89  fAnalCuts(0),
90  fListCuts(0),
91  fListWeight(0),
92  fHistoMCNch(0x0),
93  fUseOnTheFlyV0(kFALSE),
94  fIsEventSelected(kFALSE),
95  fVariablesTreeSgn(0),
96  fVariablesTreeBkg(0),
97  fCandidateVariables(),
98  fIspA(kFALSE),
99  fHistoEvents(0),
100  fHistoLc(0),
101  fHistoLcOnTheFly(0),
102  fFillOnlySgn(kFALSE),
103  fHistoLcBeforeCuts(0),
104  fHistoFiducialAcceptance(0),
105  fHistoCodesSgn(0),
106  fHistoCodesBkg(0),
107  fHistoLcpKpiBeforeCuts(0),
108  fVtx1(0),
109 
110  fHistoDistanceLcToPrimVtx(0),
111  fHistoDistanceV0ToPrimVtx(0),
112  fHistoDistanceV0ToLc(0),
113 
114  fHistoDistanceLcToPrimVtxSgn(0),
115  fHistoDistanceV0ToPrimVtxSgn(0),
116  fHistoDistanceV0ToLcSgn(0),
117 
118  fHistoVtxLcResidualToPrimVtx(0),
119  fHistoVtxV0ResidualToPrimVtx(0),
120  fHistoVtxV0ResidualToLc(0),
121 
122  fHistoMassV0All(0),
123  fHistoDecayLengthV0All(0),
124  fHistoLifeTimeV0All(0),
125 
126  fHistoMassV0True(0),
127  fHistoDecayLengthV0True(0),
128  fHistoLifeTimeV0True(0),
129 
130  fHistoMassV0TrueFromAOD(0),
131 
132  fHistoMassV0TrueK0S(0),
133  fHistoDecayLengthV0TrueK0S(0),
134  fHistoLifeTimeV0TrueK0S(0),
135 
136  fHistoMassV0TrueK0SFromAOD(0),
137 
138  fHistoMassLcAll(0),
139  fHistoDecayLengthLcAll(0),
140  fHistoLifeTimeLcAll(0),
141 
142  fHistoMassLcTrue(0),
143  fHistoDecayLengthLcTrue(0),
144  fHistoLifeTimeLcTrue(0),
145 
146  fHistoMassLcTrueFromAOD(0),
147 
148  fHistoMassV0fromLcAll(0),
149  fHistoDecayLengthV0fromLcAll(0),
150  fHistoLifeTimeV0fromLcAll(0),
151 
152  fHistoMassV0fromLcTrue(0),
153  fHistoDecayLengthV0fromLcTrue(0),
154  fHistoLifeTimeV0fromLcTrue(0),
155 
156  fHistoMassLcSgn(0),
157  fHistoMassLcSgnFromAOD(0),
158  fHistoDecayLengthLcSgn(0),
159  fHistoLifeTimeLcSgn(0),
160 
161  fHistoMassV0fromLcSgn(0),
162  fHistoDecayLengthV0fromLcSgn(0),
163  fHistoLifeTimeV0fromLcSgn(0),
164 
165  fHistoKF(0),
166  fHistoKFV0(0),
167  fHistoKFLc(0),
168 
169  fHistoMassKFV0(0),
170  fHistoDecayLengthKFV0(0),
171  fHistoLifeTimeKFV0(0),
172 
173  fHistoMassKFLc(0),
174  fHistoDecayLengthKFLc(0),
175  fHistoLifeTimeKFLc(0),
176 
177  fHistoArmenterosPodolanskiV0KF(0),
178  fHistoArmenterosPodolanskiV0KFSgn(0),
179  fHistoArmenterosPodolanskiV0AOD(0),
180  fHistoArmenterosPodolanskiV0AODSgn(0),
181 
182  fOutputKF(0),
183  fmcLabelLc(-1),
184  ftopoConstraint(kTRUE),
185  fCallKFVertexing(kFALSE),
186  fKeepingOnlyHIJINGBkg(kFALSE),
187  fUtils(0),
188  fHistoBackground(0),
189  fCutKFChi2NDF(999999.),
190  fCutKFDeviationFromVtx(999999.),
191  fCutKFDeviationFromVtxV0(0.),
192  fCurrentEvent(-1),
193  fBField(0),
194  fKeepingOnlyPYTHIABkg(kFALSE),
195  fHistoMCLcK0SpGen(0x0),
196  fHistoMCLcK0SpGenAcc(0x0),
197  fHistoMCLcK0SpGenLimAcc(0x0),
198  fTriggerMask(0),
199  fFuncWeightPythia(0),
200  fFuncWeightFONLL5overLHC13d3(0),
201  fFuncWeightFONLL5overLHC13d3Lc(0),
202  fNTracklets(0)
203 {
204  //
206  //
207 }
208 //___________________________________________________________________________
210  AliRDHFCutsLctoV0* analCuts, Bool_t useOnTheFly) :
211  AliAnalysisTaskSE(name),
212  fUseMCInfo(kFALSE),
213  fOutput(0),
214  fCEvents(0),
215  fPIDResponse(0),
216  fPIDCombined(0),
217  fIsK0sAnalysis(kFALSE),
218  fCounter(0),
219  fAnalCuts(analCuts),
220  fListCuts(0),
221  fListWeight(0),
222  fHistoMCNch(0x0),
223  fUseOnTheFlyV0(useOnTheFly),
224  fIsEventSelected(kFALSE),
225  fVariablesTreeSgn(0),
226  fVariablesTreeBkg(0),
227  fCandidateVariables(),
228  fIspA(kFALSE),
229  fHistoEvents(0),
230  fHistoLc(0),
231  fHistoLcOnTheFly(0),
232  fFillOnlySgn(kFALSE),
233  fHistoLcBeforeCuts(0),
234  fHistoFiducialAcceptance(0),
235  fHistoCodesSgn(0),
236  fHistoCodesBkg(0),
237  fHistoLcpKpiBeforeCuts(0),
238  fVtx1(0),
239 
240  fHistoDistanceLcToPrimVtx(0),
241  fHistoDistanceV0ToPrimVtx(0),
242  fHistoDistanceV0ToLc(0),
243 
244  fHistoDistanceLcToPrimVtxSgn(0),
245  fHistoDistanceV0ToPrimVtxSgn(0),
246  fHistoDistanceV0ToLcSgn(0),
247 
248  fHistoVtxLcResidualToPrimVtx(0),
249  fHistoVtxV0ResidualToPrimVtx(0),
250  fHistoVtxV0ResidualToLc(0),
251 
252  fHistoMassV0All(0),
253  fHistoDecayLengthV0All(0),
254  fHistoLifeTimeV0All(0),
255 
256  fHistoMassV0True(0),
257  fHistoDecayLengthV0True(0),
258  fHistoLifeTimeV0True(0),
259 
260  fHistoMassV0TrueFromAOD(0),
261 
262  fHistoMassV0TrueK0S(0),
263  fHistoDecayLengthV0TrueK0S(0),
264  fHistoLifeTimeV0TrueK0S(0),
265 
266  fHistoMassV0TrueK0SFromAOD(0),
267 
268  fHistoMassLcAll(0),
269  fHistoDecayLengthLcAll(0),
270  fHistoLifeTimeLcAll(0),
271 
272  fHistoMassLcTrue(0),
273  fHistoDecayLengthLcTrue(0),
274  fHistoLifeTimeLcTrue(0),
275 
276  fHistoMassLcTrueFromAOD(0),
277 
278  fHistoMassV0fromLcAll(0),
279  fHistoDecayLengthV0fromLcAll(0),
280  fHistoLifeTimeV0fromLcAll(0),
281 
282  fHistoMassV0fromLcTrue(0),
283  fHistoDecayLengthV0fromLcTrue(0),
284  fHistoLifeTimeV0fromLcTrue(0),
285 
286  fHistoMassLcSgn(0),
287  fHistoMassLcSgnFromAOD(0),
288  fHistoDecayLengthLcSgn(0),
289  fHistoLifeTimeLcSgn(0),
290 
291  fHistoMassV0fromLcSgn(0),
292  fHistoDecayLengthV0fromLcSgn(0),
293  fHistoLifeTimeV0fromLcSgn(0),
294 
295  fHistoKF(0),
296  fHistoKFV0(0),
297  fHistoKFLc(0),
298 
299  fHistoMassKFV0(0),
300  fHistoDecayLengthKFV0(0),
301  fHistoLifeTimeKFV0(0),
302 
303  fHistoMassKFLc(0),
304  fHistoDecayLengthKFLc(0),
305  fHistoLifeTimeKFLc(0),
306 
307  fHistoArmenterosPodolanskiV0KF(0),
308  fHistoArmenterosPodolanskiV0KFSgn(0),
309  fHistoArmenterosPodolanskiV0AOD(0),
310  fHistoArmenterosPodolanskiV0AODSgn(0),
311 
312  fOutputKF(0),
313  fmcLabelLc(-1),
314  ftopoConstraint(kTRUE),
315  fCallKFVertexing(kFALSE),
316  fKeepingOnlyHIJINGBkg(kFALSE),
317  fUtils(0),
318  fHistoBackground(0),
319  fCutKFChi2NDF(999999.),
320  fCutKFDeviationFromVtx(999999.),
321  fCutKFDeviationFromVtxV0(0.),
322  fCurrentEvent(-1),
323  fBField(0),
324  fKeepingOnlyPYTHIABkg(kFALSE),
325  fHistoMCLcK0SpGen(0x0),
326  fHistoMCLcK0SpGenAcc(0x0),
327  fHistoMCLcK0SpGenLimAcc(0x0),
328  fTriggerMask(0),
329 
330  fFuncWeightPythia(0),
331  fFuncWeightFONLL5overLHC13d3(0),
332  fFuncWeightFONLL5overLHC13d3Lc(0),
333  fNTracklets(0)
334 {
335  //
337  //
338  Info("AliAnalysisTaskSELc2V0bachelorTMVA","Calling Constructor");
339 
340  DefineOutput(1, TList::Class()); // Tree signal + Tree Bkg + histoEvents
341  DefineOutput(2, AliNormalizationCounter::Class()); // normalization counter object
342  DefineOutput(3, TList::Class()); // Cuts
343  DefineOutput(4, TTree::Class()); // Tree signal + Tree Bkg + histoEvents
344  DefineOutput(5, TTree::Class()); // Tree signal + Tree Bkg + histoEvents
345  DefineOutput(6, TList::Class()); // Tree signal + Tree Bkg + histoEvents
346  DefineOutput(7, TList::Class()); // weights
347 }
348 
349 //___________________________________________________________________________
351  //
353  //
354  Info("~AliAnalysisTaskSELc2V0bachelorTMVA","Calling Destructor");
355 
356  if (fOutput) {
357  delete fOutput;
358  fOutput = 0;
359  }
360 
361  if (fPIDResponse) {
362  delete fPIDResponse;
363  }
364 
365  if (fPIDCombined) {
366  delete fPIDCombined;
367  }
368 
369  if (fCounter) {
370  delete fCounter;
371  fCounter = 0;
372  }
373 
374  if (fAnalCuts) {
375  delete fAnalCuts;
376  fAnalCuts = 0;
377  }
378 
379  if (fListCuts) {
380  delete fListCuts;
381  fListCuts = 0;
382  }
383 
384  if (fListWeight) {
385  delete fListWeight;
386  fListWeight = 0;
387  }
388 
389  if(fVariablesTreeSgn){
390  delete fVariablesTreeSgn;
391  fVariablesTreeSgn = 0;
392  }
393 
394  if(fVariablesTreeBkg){
395  delete fVariablesTreeBkg;
396  fVariablesTreeBkg = 0;
397  }
398 
399  if (fOutputKF) {
400  delete fOutputKF;
401  fOutputKF = 0;
402  }
403 
404  if (fUtils) {
405  delete fUtils;
406  fUtils = 0;
407  }
408 
409 }
410 //_________________________________________________
412  //
414  //
415 
416  fIsEventSelected=kFALSE;
417 
418  if (fDebug > 1) AliInfo("Init");
419 
420  fListCuts = new TList();
421  fListCuts->SetOwner();
423  PostData(3,fListCuts);
424 
425  // Save the weight functions or histograms
426  fListWeight = new TList();
427  fListWeight->Add(fHistoMCNch);
428  PostData(7,fListWeight);
429 
431 
432  return;
433 }
434 
435 //________________________________________ terminate ___________________________
437 {
441 
442  AliInfo("Terminate");
443  AliAnalysisTaskSE::Terminate();
444 
445  fOutput = dynamic_cast<TList*> (GetOutputData(1));
446  if (!fOutput) {
447  AliError("fOutput not available");
448  return;
449  }
450 
451 
452  //AliDebug(2, Form("At MC level, %f Lc --> K0S + p were found", fHistoMCLcK0SpGen->GetEntries()));
453  //AliDebug(2, Form("At MC level, %f Lc --> K0S + p were found in the acceptance", fHistoMCLcK0SpGenAcc->GetEntries()));
454  //AliDebug(2, Form("At Reco level, %lld Lc --> K0S + p were found", fVariablesTreeSgn->GetEntries()));
455  if(fHistoMCLcK0SpGen) {
456  AliInfo(Form("At MC level, %f Lc --> K0S + p were found", fHistoMCLcK0SpGen->GetEntries()));
457  } else {
458  AliInfo("fHistoMCLcK0SpGen not available");
459  }
461  AliInfo(Form("At MC level, %f Lc --> K0S + p were found in the acceptance", fHistoMCLcK0SpGenAcc->GetEntries()));
462  } else {
463  AliInfo("fHistoMCLcK0SpGenAcc not available");
464  }
465  if(fVariablesTreeSgn) {
466  AliInfo(Form("At Reco level, %lld Lc --> K0S + p were found", fVariablesTreeSgn->GetEntries()));
467  } else {
468  AliInfo("fVariablesTreeSgn not available");
469  }
470 
471  fOutputKF = dynamic_cast<TList*> (GetOutputData(6));
472  if (!fOutputKF) {
473  AliError("fOutputKF not available");
474  return;
475  }
476 
477  return;
478 }
479 
480 //___________________________________________________________________________
483  AliInfo(Form("CreateOutputObjects of task %s\n", GetName()));
484 
485  //slot #1
486  //OpenFile(1);
487  fOutput = new TList();
488  fOutput->SetOwner();
489  fOutput->SetName("listTrees");
490 
491  // Output slot 1: list of 2 trees (Sgn + Bkg) of the candidate variables
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");
495  Int_t nVar = 90;
496  fCandidateVariables = new Float_t [nVar];
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";
545 
546  fCandidateVariableNames[47]="V0KFmass";
547  fCandidateVariableNames[48]="V0KFdecayLength";
548  fCandidateVariableNames[49]="V0KFlifeTime";
549 
550  fCandidateVariableNames[50]="V0KFmassErr";
551  fCandidateVariableNames[51]="V0KFdecayTimeErr";
552  fCandidateVariableNames[52]="V0KFlifeTimeErr";
553 
554  fCandidateVariableNames[53]="LcKFmass";
555  fCandidateVariableNames[54]="LcKFdecayLength";
556  fCandidateVariableNames[55]="LcKFlifeTime";
557 
558  fCandidateVariableNames[56]="LcKFmassErr";
559  fCandidateVariableNames[57]="LcKFdecayTimeErr";
560  fCandidateVariableNames[58]="LcKFlifeTimeErr";
561 
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";
569 
570  fCandidateVariableNames[66]="ITSrefitV0pos";
571  fCandidateVariableNames[67]="ITSrefitV0neg";
572 
573  fCandidateVariableNames[68]="TPCClV0pos";
574  fCandidateVariableNames[69]="TPCClV0neg";
575 
576  fCandidateVariableNames[70]="v0Xcoord";
577  fCandidateVariableNames[71]="v0Ycoord";
578  fCandidateVariableNames[72]="v0Zcoord";
579  fCandidateVariableNames[73]="primVtxX";
580  fCandidateVariableNames[74]="primVtxY";
581  fCandidateVariableNames[75]="primVtxZ";
582 
583  fCandidateVariableNames[76]="ITSclBach";
584  fCandidateVariableNames[77]="SPDclBach";
585 
586  fCandidateVariableNames[78]="ITSclV0pos";
587  fCandidateVariableNames[79]="SPDclV0pos";
588  fCandidateVariableNames[80]="ITSclV0neg";
589  fCandidateVariableNames[81]="SPDclV0neg";
590 
591  fCandidateVariableNames[82]="alphaArmLc";
592  fCandidateVariableNames[83]="alphaArmLcCharge";
593  fCandidateVariableNames[84]="ptArmLc";
594 
595  fCandidateVariableNames[85]="CosThetaStar";
596 
597  fCandidateVariableNames[86]="weightPtFlat";
598  fCandidateVariableNames[87]="weightFONLL5overLHC13d3";
599  fCandidateVariableNames[88]="weightFONLL5overLHC13d3Lc";
600  fCandidateVariableNames[89]="weightNch";
601 
602 
603  for(Int_t ivar=0; ivar<nVar; ivar++){
604  fVariablesTreeSgn->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
605  fVariablesTreeBkg->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
606  }
607 
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++){
611  fHistoEvents->GetXaxis()->SetBinLabel(ibin, labelEv[ibin-1].Data());
612  }
613 
614  fHistoLc = new TH1F("fHistoLc", "fHistoLc", 2, -0.5, 1.5);
615 
616  fHistoLcOnTheFly = new TH1F("fHistoLcOnTheFly", "fHistoLcOnTheFly", 4, -0.5, 3.5);
617  TString labelOnTheFly[4] = {"OnTheFly-Bkg", "OfflineBkg", "OnTheFly-Sgn", "OfflineSgn"};
618  for (Int_t ibin = 1; ibin <= fHistoLcOnTheFly->GetNbinsX(); ibin++){
619  fHistoLcOnTheFly->GetXaxis()->SetBinLabel(ibin, labelOnTheFly[ibin-1].Data());
620  }
621 
622  fHistoLcBeforeCuts = new TH1F("fHistoLcBeforeCuts", "fHistoLcBeforeCuts", 2, -0.5, 1.5);
623  TString labelBeforeCuts[2] = {"Bkg", "Sgn"};
624  for (Int_t ibin = 1; ibin <= fHistoLcBeforeCuts->GetNbinsX(); ibin++){
625  fHistoLcBeforeCuts->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].Data());
626  fHistoLc->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].Data());
627  }
628 
629  fHistoFiducialAcceptance = new TH1F("fHistoFiducialAcceptance", "fHistoFiducialAcceptance", 4, -0.5, 3.5);
630  TString labelAcc[4] = {"NotOk-Bkg", "Ok-Bkg", "NotOk-Sgn", "Ok-Sgn"};
631  for (Int_t ibin = 1; ibin <= fHistoFiducialAcceptance->GetNbinsX(); ibin++){
632  fHistoFiducialAcceptance->GetXaxis()->SetBinLabel(ibin, labelAcc[ibin-1].Data());
633  }
634 
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);
637 
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"};
642 
643  for (Int_t ibin = 1; ibin <= fHistoCodesSgn->GetNbinsX(); ibin++){
644  fHistoCodesSgn->GetXaxis()->SetBinLabel(ibin, labelx[ibin-1].Data());
645  fHistoCodesBkg->GetXaxis()->SetBinLabel(ibin, labelx[ibin-1].Data());
646  }
647  for (Int_t ibin = 1; ibin <= fHistoCodesSgn->GetNbinsY(); ibin++){
648  fHistoCodesSgn->GetYaxis()->SetBinLabel(ibin, labely[ibin-1].Data());
649  fHistoCodesBkg->GetYaxis()->SetBinLabel(ibin, labely[ibin-1].Data());
650  }
651 
652  fHistoLcpKpiBeforeCuts = new TH1F("fHistoLcpKpiBeforeCuts", "fHistoLcpKpiBeforeCuts", 2, -0.5, 1.5);
653  for (Int_t ibin = 1; ibin <= fHistoLcpKpiBeforeCuts->GetNbinsX(); ibin++){
654  fHistoLcpKpiBeforeCuts->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].Data());
655  }
656 
657  fHistoBackground = new TH1F("fHistoBackground", "fHistoBackground", 4, -0.5, 3.5);
658  TString labelBkg[4] = {"Injected", "Non-injected", "Non-PYTHIA", "PYTHIA"};
659  for (Int_t ibin = 1; ibin <= fHistoBackground->GetNbinsX(); ibin++){
660  fHistoBackground->GetXaxis()->SetBinLabel(ibin, labelBkg[ibin-1].Data());
661  }
662 
663  //fOutput->Add(fVariablesTreeSgn);
664  //fOutput->Add(fVariablesTreeBkg);
665 
666  const Float_t ptbins[15] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 12., 17., 25., 35.};
667 
668  fHistoMCLcK0SpGen = new TH1F("fHistoMCLcK0SpGen", "fHistoMCLcK0SpGen", 14, ptbins);
669  fHistoMCLcK0SpGenAcc = new TH1F("fHistoMCLcK0SpGenAcc", "fHistoMCLcK0SpGenAcc", 14, ptbins);
670  fHistoMCLcK0SpGenLimAcc = new TH1F("fHistoMCLcK0SpGenLimAcc", "fHistoMCLcK0SpGenLimAcc", 14, ptbins);
671 
672  fOutput->Add(fHistoEvents);
673  fOutput->Add(fHistoLc);
677  fOutput->Add(fHistoCodesSgn);
678  fOutput->Add(fHistoCodesBkg);
684 
685  PostData(1, fOutput);
686  PostData(4, fVariablesTreeSgn);
687  PostData(5, fVariablesTreeBkg);
688  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
689  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
690  fPIDResponse = inputHandler->GetPIDResponse();
691 
692  if (fAnalCuts->GetIsUsePID()){
693  /*
694  fAnalCuts->GetPidHF()->SetPidResponse(fPIDResponse);
695  fAnalCuts->GetPidV0pos()->SetPidResponse(fPIDResponse);
696  fAnalCuts->GetPidV0neg()->SetPidResponse(fPIDResponse);
697  fAnalCuts->GetPidHF()->SetOldPid(kFALSE);
698  fAnalCuts->GetPidV0pos()->SetOldPid(kFALSE);
699  fAnalCuts->GetPidV0neg()->SetOldPid(kFALSE);
700  */
701  fAnalCuts->SetUsePID(kFALSE); // I don't want to use the PID through the cut object, but I will use the PID response directly!!!
702  }
703 
704  // Setting properties of PID
705  fPIDCombined=new AliPIDCombined;
706  fPIDCombined->SetDefaultTPCPriors();
707  fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
708  //fPIDCombined->SetPriorDistribution((AliPID::EParticleType)ispec,fPriors[ispec]);
709 
710  fCounter = new AliNormalizationCounter("NormalizationCounter");
711  fCounter->Init();
712  PostData(2, fCounter);
713 
714  // Histograms from KF
715 
716  if (fCallKFVertexing){
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.);
720 
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.);
724 
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.);
728 
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);
732 
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);
736 
737  fHistoMassV0TrueFromAOD = new TH1D("fHistoMassV0TrueFormAOD", "True V0 Mass (AOD); mass", 500, 0.4, 0.6);
738 
739  fHistoMassV0TrueK0S = new TH1D("fHistoMassV0TrueK0S", "True V0-K0S Mass; mass", 500, 0.4, 0.6);
740  fHistoDecayLengthV0TrueK0S = new TH1D("fHistoDecayLengthV0TrueK0S", "True V0-K0S Decay Length; decayLength", 500, -10, 10.0);
741  fHistoLifeTimeV0TrueK0S = new TH1D("fHistoLifeTimeV0TrueK0S", "True V0-K0S Life Time; lifeTime", 500, -10.0, 10.0);
742 
743  fHistoMassV0TrueK0SFromAOD = new TH1D("fHistoMassV0TrueK0SFormAOD", "True V0-K0S Mass (AOD); mass", 500, 0.4, 0.6);
744 
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);
748 
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);
752 
753  fHistoMassLcTrueFromAOD = new TH1D("fHistoMassLcTrueFromAOD", "True Lc Mass (AOD); mass", 500, 2.0, 3.0);
754 
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);
758 
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);
762 
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);
767 
768  fHistoMassV0fromLcSgn = new TH1D("fHistoMassV0fromLcSgn", "V0 from True Lc Signal Mass; mass", 500, 0.4, 0.6);
769  fHistoDecayLengthV0fromLcSgn = new TH1D("fHistoDecayLengthV0fromLcSgn", "V0 True Lc Signal Decay Length; decayLength", 500, 0, 10.0);
770  fHistoLifeTimeV0fromLcSgn = new TH1D("fHistoLifeTimeV0fromLcSgn", "V0 True Lc Signal Life Time; lifeTime", 500, 0.0, 3.0);
771 
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"};
779 
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());
785  }
786 
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);
790 
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);
794 
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);
799  }
800 
801  fOutputKF = new TList();
802  fOutputKF->SetOwner();
803  fOutputKF->SetName("listHistoKF");
804 
805  if (fCallKFVertexing){
809 
813 
817 
821 
825 
827 
831 
833 
837 
841 
843 
847 
851 
856 
860 
861  fOutputKF->Add(fHistoKF);
862  fOutputKF->Add(fHistoKFV0);
863  fOutputKF->Add(fHistoKFLc);
864 
868 
872 
877  }
878 
879  // weight function from ratio of flat value (1/30) to pythia
880  // use to normalise to flat distribution (should lead to flat pT distribution)
881  fFuncWeightPythia = new TF1("funcWeightPythia","1./(30. *[0]*x/TMath::Power(1.+(TMath::Power((x/[1]),[3])),[2]))",0.15,30);
882  fFuncWeightPythia->SetParameters(0.36609,1.94635,1.40463,2.5);
883 
884  // weight function from the ratio of the LHC13d3 MC
885  // and FONLL calculations for pp data
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);
888 
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);
891 
892  PostData(6, fOutputKF);
893 
894  return;
895 }
896 
897 //_________________________________________________
899 {
901  if (!fInputEvent) {
902  AliError("NO EVENT FOUND!");
903  return;
904  }
905 
906  fCurrentEvent++;
907  AliDebug(2, Form("Processing event = %d", fCurrentEvent));
908  AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
909  TClonesArray *arrayLctopKos=0;
910 
911  TClonesArray *array3Prong = 0;
912 
913  if (!aodEvent && AODEvent() && IsStandardAOD()) {
914  // In case there is an AOD handler writing a standard AOD, use the AOD
915  // event in memory rather than the input (ESD) event.
916  aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
917  // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
918  // have to taken from the AOD event hold by the AliAODExtension
919  AliAODHandler* aodHandler = (AliAODHandler*)
920  ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
921 
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");
926 
927  array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
928  }
929  } else {
930  arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
931 
932  array3Prong=(TClonesArray*)aodEvent->GetList()->FindObject("Charm3Prong");
933  }
934 
935  if (!fUseMCInfo && fIspA) {
938  }
939 
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");
943  return;
944  }
945 
947 
948  // mc analysis
949  TClonesArray *mcArray = 0;
950  AliAODMCHeader *mcHeader=0;
951 
952  if (fUseMCInfo) {
953  // MC array need for matching
954  mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
955  if (!mcArray) {
956  AliError("Could not find Monte-Carlo in AOD");
957  return;
958  }
959  // load MC header
960  mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
961  if (!mcHeader) {
962  AliError("AliAnalysisTaskSELc2V0bachelorTMVA::UserExec: MC header branch not found!\n");
963  return;
964  }
965 
966  Double_t zMCVertex = mcHeader->GetVtxZ();
967  if (TMath::Abs(zMCVertex) > fAnalCuts->GetMaxVtxZ()){
968  AliDebug(3,Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fAnalCuts->GetMaxVtxZ(), fAnalCuts->GetMaxVtxZ()));
969  AliInfo(Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fAnalCuts->GetMaxVtxZ(), fAnalCuts->GetMaxVtxZ()));
970  return;
971  }
972 
973  // multiplicity definition with tracklets
974  fNTracklets = static_cast<Int_t>(AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(aodEvent,-1.,1.));
975 
976  //Printf("Filling MC histo");
977  FillMCHisto(mcArray);
978  }
979 
980  // AOD primary vertex
981  fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
982  if (!fVtx1) return;
983  if (fVtx1->GetNContributors()<1) return;
984 
986 
987  if ( !fIsEventSelected ) {
988  fHistoEvents->Fill(0);
989  return; // don't take into account not selected events
990  }
991  fHistoEvents->Fill(1);
992 
993  // Setting magnetic field for KF vertexing
994  fBField = aodEvent->GetMagneticField();
995  AliKFParticle::SetField(fBField);
996 
997  Int_t nSelectedAnal = 0;
998  if (fIsK0sAnalysis) {
999  MakeAnalysisForLc2prK0S(arrayLctopKos, mcArray,
1000  nSelectedAnal, fAnalCuts,
1001  array3Prong, mcHeader);
1002  }
1003  fCounter->StoreCandidates(aodEvent,nSelectedAnal,kFALSE);
1004 
1005  PostData(1, fOutput);
1006  PostData(2, fCounter);
1007  PostData(4, fVariablesTreeSgn);
1008  PostData(5, fVariablesTreeBkg);
1009  PostData(6, fOutputKF);
1010 
1011 }
1012 //-------------------------------------------------------------------------------
1014 
1016  for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
1017  AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
1018  if (!mcPart){
1019  AliError("Failed casting particle from MC array!, Skipping particle");
1020  continue;
1021  }
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));
1025  continue;
1026  }
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!!"));
1032  continue;
1033  }
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!");
1040  return;
1041  }
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)){
1048  // we are in the case of Lc --> K0 + p; now we have to check if the K0 decays in K0S, and if this goes in pi+pi-
1050  if (pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) {
1051  bachelorMC = daugh1;
1052  v0MC = daugh0;
1053  }
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...");
1057  continue;
1058  }
1059  else { // So far: Lc --> K0 + p, K0 with 1 daughter
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));
1063  if(!partK0S){
1064  AliError("Error while casting particle! returning a NULL array");
1065  continue;
1066  }
1067  else { // So far: Lc --> K0 + p, K0 with 1 daughter that we can access
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");
1070  continue;
1071  }
1072  else { // So far: Lc --> K0 + p, K0 --> K0S, K0S 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...");
1080  continue;
1081  }
1082  else { // So far: Lc --> K0 + p, K0 --> K0S, K0S in 2 bodies that we can access
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");
1088  //AliInfo("The K0S does not decay in pi+pi-, continuing");
1089  }
1090  else { // Full chain: Lc --> K0 + p, K0 --> K0S, K0S --> pi+pi-
1091  if (fAnalCuts->IsInFiducialAcceptance(mcPart->Pt(), mcPart->Y())) {
1092  AliDebug(2, Form("----> Filling histo with pt = %f", mcPart->Pt()));
1093  if(TMath::Abs(mcPart->Y()) < 0.5) fHistoMCLcK0SpGenLimAcc->Fill(mcPart->Pt());
1094  //AliInfo(Form("\nparticle = %d, Filling MC Gen histo\n", iPart));
1095  fHistoMCLcK0SpGen->Fill(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)) {
1099  fHistoMCLcK0SpGenAcc->Fill(mcPart->Pt());
1100  }
1101  }
1102  else {
1103  AliDebug(2, "not in fiducial acceptance! Skipping");
1104  continue;
1105  }
1106  }
1107  }
1108  }
1109  }
1110  }
1111  }
1112  }
1113  } // closing loop over mcArray
1114 
1115  return;
1116 
1117 }
1118 
1119 //-------------------------------------------------------------------------------
1121  TClonesArray *mcArray,
1122  Int_t &nSelectedAnal,
1123  AliRDHFCutsLctoV0 *cutsAnal, TClonesArray *array3Prong,
1124  AliAODMCHeader* aodheader){
1126 
1127  Int_t pdgCand = 4122;
1128  Int_t pdgDgLctoV0bachelor[2]={2212, 310};
1129  Int_t pdgDgV0toDaughters[2]={211, 211};
1130 
1131  Int_t pdgDgLctopKpi[3]={2212, 321, 211};
1132 
1133  // loop to search for candidates Lc->p+K+pi
1134  Int_t n3Prong = array3Prong->GetEntriesFast();
1135  Int_t nCascades= arrayLctopKos->GetEntriesFast();
1136 
1137  //AliInfo(Form("\n\n\n\n3 prong candidates = %d, ncascades = %d \n\n\n\n\n", n3Prong, nCascades));
1138  for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
1139  AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
1140  //Filling a control histogram with no cuts
1141  if (fUseMCInfo) {
1142 
1143  // find associated MC particle for Lc -> p+K+pi
1144  Int_t mcLabel = d->MatchToMC(4122, mcArray, 3, pdgDgLctopKpi);
1145  //Int_t mcLabelTemp = d->MatchToMC(4122, mcArray);
1146  //Printf("mcLabel = %d, mcLabelTemp = %d", mcLabel, mcLabelTemp);
1147  if (mcLabel >= 0) {
1148 
1149  AliAODMCParticle *partLcpKpi = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
1150  if(partLcpKpi){
1151  Int_t pdgCode = partLcpKpi->GetPdgCode();
1152  AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1153  //AliInfo(Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1154  fHistoLcpKpiBeforeCuts->Fill(1);
1155 
1156  }
1157  }
1158  else {
1159  //AliInfo(Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~", mcLabel));
1160  fHistoLcpKpiBeforeCuts->Fill(0);
1161  }
1162  }
1163  }
1164 
1165  // loop over cascades to search for candidates Lc->p+K0S
1166 
1167  Int_t mcLabel = -1;
1168  for (Int_t iLctopK0s = 0; iLctopK0s < nCascades; iLctopK0s++) {
1169 
1170  // Lc candidates and K0s from Lc
1171  AliAODRecoCascadeHF* lcK0spr = dynamic_cast<AliAODRecoCascadeHF*>(arrayLctopKos->At(iLctopK0s));
1172  if (!lcK0spr) {
1173  AliDebug(2,Form("Cascade %d doens't exist, skipping",iLctopK0s));
1174  continue;
1175  }
1176 
1177  //Filling a control histogram with no cuts
1178  if (fUseMCInfo) {
1179 
1180  Int_t pdgCode=-2;
1181 
1182  // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
1183  fmcLabelLc = lcK0spr->MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1184  if (fmcLabelLc>=0) {
1185  AliDebug(2, Form("----> cascade number %d (total cascade number = %d) is a Lc!", iLctopK0s, nCascades));
1186 
1187  AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(fmcLabelLc));
1188  if(partLc){
1189  pdgCode = partLc->GetPdgCode();
1190  if (pdgCode<0) AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", fmcLabelLc, pdgCode));
1191  pdgCode = TMath::Abs(pdgCode);
1192  fHistoLcBeforeCuts->Fill(1);
1193  }
1194  }
1195  else {
1196  fHistoLcBeforeCuts->Fill(0);
1197  pdgCode=-1;
1198  }
1199  }
1200 
1201  //if (!lcK0spr->GetSecondaryVtx()) {
1202  // AliInfo("No secondary vertex");
1203  //continue;
1204  //}
1205 
1206  if (lcK0spr->GetNDaughters()!=2) {
1207  AliDebug(2,Form("Cascade %d has not 2 daughters (nDaughters=%d)",iLctopK0s,lcK0spr->GetNDaughters()));
1208  continue;
1209  }
1210 
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));
1215  continue;
1216  }
1217 
1218 
1219  if (!v0part->GetSecondaryVtx()) {
1220  AliDebug(2,Form("No secondary vertex for V0 by cascade %d",iLctopK0s));
1221  continue;
1222  }
1223 
1224  if (v0part->GetNDaughters()!=2) {
1225  AliDebug(2,Form("current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters()));
1226  continue;
1227  }
1228 
1229  AliAODTrack * v0Pos = dynamic_cast<AliAODTrack*>(lcK0spr->Getv0PositiveTrack());
1230  AliAODTrack * v0Neg = dynamic_cast<AliAODTrack*>(lcK0spr->Getv0NegativeTrack());
1231  if (!v0Neg || !v0Pos) {
1232  AliDebug(2,Form("V0 by cascade %d has no V0positive of V0negative object",iLctopK0s));
1233  continue;
1234  }
1235 
1236 
1237  if (v0Pos->Charge() == v0Neg->Charge()) {
1238  AliDebug(2,Form("V0 by cascade %d has daughters with the same sign: IMPOSSIBLE!",iLctopK0s));
1239  continue;
1240  }
1241 
1242  Int_t isLc = 0;
1243 
1244  if (fUseMCInfo) {
1245 
1246  Int_t pdgCode = -2;
1247 
1248  // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
1249  mcLabel = lcK0spr->MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1250  if (mcLabel>=0) {
1251  AliDebug(2,Form(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s, nCascades));
1252 
1253  AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
1254  if(partLc){
1255  pdgCode = partLc->GetPdgCode();
1256  if (pdgCode<0) AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1257  pdgCode = TMath::Abs(pdgCode);
1258  isLc = 1;
1259  fHistoLc->Fill(1);
1260  }
1261  }
1262  else {
1263  fHistoLc->Fill(0);
1264  pdgCode=-1;
1265  }
1266  }
1267  AliDebug(2, Form("\n\n\n Analysing candidate %d\n", iLctopK0s));
1268  AliDebug(2, Form(">>>>>>>>>> Candidate is background, fFillOnlySgn = %d --> SKIPPING", fFillOnlySgn));
1269  if (!isLc) {
1270  if (fFillOnlySgn) { // if it is background, and we want only signal, we do not fill the tree
1271  continue;
1272  }
1273  else { // checking if we want to fill the background
1274  if (fKeepingOnlyHIJINGBkg){
1275  // we have decided to fill the background only when the candidate has the daugthers that all come from HIJING underlying event!
1276  Bool_t isCandidateInjected = fUtils->HasCascadeCandidateAnyDaughInjected(lcK0spr, aodheader, mcArray);
1277  if (!isCandidateInjected){
1278  AliDebug(2, "The candidate is from HIJING (i.e. not injected), keeping it to fill background");
1279  fHistoBackground->Fill(1);
1280  }
1281  else {
1282  AliDebug(2, "The candidate is NOT from HIJING, we skip it when filling background");
1283  fHistoBackground->Fill(0);
1284  continue;
1285  }
1286  }
1287  else if (fKeepingOnlyPYTHIABkg){
1288  // we have decided to fill the background only when the candidate has the daugthers that all come from HIJING underlying event!
1289  AliAODTrack *bachelor = (AliAODTrack*)lcK0spr->GetBachelor();
1290  AliAODTrack *v0pos = (AliAODTrack*)lcK0spr->Getv0PositiveTrack();
1291  AliAODTrack *v0neg = (AliAODTrack*)lcK0spr->Getv0NegativeTrack();
1292  if (!bachelor || !v0pos || !v0neg) {
1293  AliDebug(2, "Cannot retrieve one of the tracks while checking origin, continuing");
1294  continue;
1295  }
1296  else {
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");
1305  continue;
1306  }
1307  else {
1308  Int_t isBachelorFromPythia = fUtils->CheckOrigin(mcArray, MCbachelor, kTRUE);
1309  Int_t isv0posFromPythia = fUtils->CheckOrigin(mcArray, MCv0pos, kTRUE);
1310  Int_t isv0negFromPythia = fUtils->CheckOrigin(mcArray, MCv0neg, kTRUE);
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");
1313  fHistoBackground->Fill(2);
1314  }
1315  else {
1316  AliDebug(2, "The candidate is NOT from PYTHIA, we skip it when filling background");
1317  fHistoBackground->Fill(3);
1318  continue;
1319  }
1320  }
1321  }
1322  }
1323  }
1324  }
1325 
1326  //FillLc2pK0Sspectrum(lcK0spr, isLc, nSelectedAnal, cutsAnal, mcArray, iLctopK0s);
1327  FillLc2pK0Sspectrum(lcK0spr, isLc, nSelectedAnal, cutsAnal, mcArray, mcLabel);
1328 
1329  }
1330 
1331  return;
1332 
1333 }
1334 //________________________________________________________________________
1336  Int_t isLc,
1337  Int_t &nSelectedAnal,
1338  AliRDHFCutsLctoV0 *cutsAnal,
1339  TClonesArray *mcArray, Int_t iLctopK0s){
1340  //
1342  //
1343 
1344  /*
1345  if (!part->GetOwnPrimaryVtx()) {
1346  //Printf("No primary vertex for Lc found!!");
1347  part->SetOwnPrimaryVtx(fVtx1);
1348  }
1349  else {
1350  //Printf("Yu-huuuu!!! primary vertex for Lc found!!");
1351  }
1352  */
1353  Double_t invmassLc = part->InvMassLctoK0sP();
1354 
1355  AliAODv0 * v0part = part->Getv0();
1356  Bool_t onFlyV0 = v0part->GetOnFlyStatus(); // on-the-flight V0s
1357  if (onFlyV0){ // on-the-fly V0
1358  if (isLc) { // Lc
1359  fHistoLcOnTheFly->Fill(2.);
1360  }
1361  else { // not Lc
1362  fHistoLcOnTheFly->Fill(0.);
1363  }
1364  }
1365  else { // offline V0
1366  if (isLc) { // Lc
1367  fHistoLcOnTheFly->Fill(3.);
1368  }
1369  else { // not Lc
1370  fHistoLcOnTheFly->Fill(1.);
1371  }
1372  }
1373 
1374  Double_t dcaV0 = v0part->GetDCA();
1375  Double_t invmassK0s = v0part->MassK0Short();
1376 
1377  if ( (cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) {
1378  if (isLc) {
1379  fHistoFiducialAcceptance->Fill(3.);
1380  }
1381  else {
1382  fHistoFiducialAcceptance->Fill(1.);
1383  }
1384  }
1385  else {
1386  if (isLc) {
1387  fHistoFiducialAcceptance->Fill(2.);
1388  }
1389  else {
1390  fHistoFiducialAcceptance->Fill(0.);
1391  }
1392  }
1393 
1394  Int_t isInV0window = (((cutsAnal->IsSelectedSingleCut(part, AliRDHFCuts::kCandidate, 2)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on V0 invMass
1395 
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");
1399  return;
1400  }
1401  else AliDebug(2, "Yes: The candidate has passed the mass cuts!");
1402 
1403  Bool_t isInCascadeWindow = (((cutsAnal->IsSelectedSingleCut(part, AliRDHFCuts::kCandidate, 0)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on Lc->p+K0S invMass
1404 
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");
1408  return;
1409  }
1410  else AliDebug(2, "Yes: The candidate has passed the cascade window cuts!");
1411 
1412  Bool_t isCandidateSelectedCuts = (((cutsAnal->IsSelected(part, AliRDHFCuts::kCandidate)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // kinematic/topological cuts
1413  AliDebug(2, Form("recoAnalysisCuts = %d", cutsAnal->IsSelected(part, AliRDHFCuts::kCandidate) & (AliRDHFCutsLctoV0::kLcToK0Spr)));
1414  if (!isCandidateSelectedCuts){
1415  AliDebug(2, "No: Analysis cuts kCandidate level NOT passed");
1416  if (isLc) Printf("SIGNAL candidate rejected");
1417  return;
1418  }
1419  else {
1420  AliDebug(2, "Yes: Analysis cuts kCandidate level passed");
1421  }
1422 
1423  AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
1424  if (!bachelor) {
1425  AliDebug(2, Form("Very weird, the bachelor is not there... returning for this candidate"));
1426  return;
1427  }
1428 
1429  //Bool_t isBachelorID = (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // ID x bachelor
1430  Double_t probTPCTOF[AliPID::kSPECIES]={-1.};
1431 
1432  UInt_t detUsed = fPIDCombined->ComputeProbabilities(bachelor, fPIDResponse, probTPCTOF);
1433  AliDebug(2, Form("detUsed (TPCTOF case) = %d", detUsed));
1434  Double_t probProton = -1.;
1435  // Double_t probPion = -1.;
1436  // Double_t probKaon = -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];
1440  // probPion = probTPCTOF[AliPID::kPion];
1441  // probKaon = probTPCTOF[AliPID::kKaon];
1442  }
1443  else { // if you don't have both TOF and TPC, try only TPC
1444  fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
1445  AliDebug(2, "We did not find the detector mask for TOF + TPC, let's see only TPC");
1446  detUsed = fPIDCombined->ComputeProbabilities(bachelor, fPIDResponse, probTPCTOF);
1447  AliDebug(2,Form(" detUsed (TPC case) = %d", detUsed));
1448  if (detUsed == (UInt_t)fPIDCombined->GetDetectorMask()) {
1449  probProton = probTPCTOF[AliPID::kProton];
1450  // probPion = probTPCTOF[AliPID::kPion];
1451  // probKaon = probTPCTOF[AliPID::kKaon];
1452  AliDebug(2, Form("TPC only worked: probProton will be set to %f", probTPCTOF[AliPID::kProton]));
1453  }
1454  else {
1455  AliDebug(2, "Only TPC did not work...");
1456  }
1457  // resetting mask to ask for both TPC+TOF
1458  fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
1459  }
1460  AliDebug(2, Form("probProton = %f", probProton));
1461 
1462  // now we get the TPC and TOF single PID probabilities (only for Proton, or the tree will explode :) )
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];
1471 
1472  // checking V0 status (on-the-fly vs offline)
1473  if ( !( !onFlyV0 || (onFlyV0 && fUseOnTheFlyV0) ) ) {
1474  AliDebug(2, "On-the-fly discarded");
1475  return;
1476  }
1477 
1479  nSelectedAnal++;
1480  }
1481 
1482  if ( !(cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) return;
1483 
1484  if ( !( ( (cutsAnal->IsSelected(part, AliRDHFCuts::kTracks)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) { // esd track cuts
1485  if (isLc) Printf("SIGNAL candidate rejected");
1486  AliDebug(2, "No: Analysis cuts kTracks level NOT passed");
1487  return;
1488  }
1489  else {
1490  AliDebug(2, "Yes: Analysis cuts kTracks level passed");
1491  }
1492 
1493  Int_t pdgCand = 4122;
1494  Int_t pdgDgLctoV0bachelor[2]={211, 3122}; // case of wrong decay! Lc --> L + pi
1495  Int_t pdgDgV0toDaughters[2]={2212, 211}; // case of wrong decay! Lc --> L + pi
1496  Int_t isLc2LBarpi=0, isLc2Lpi=0;
1497  Int_t currentLabel = part->GetLabel();
1498  Int_t mcLabel = 0;
1499  if (fUseMCInfo) {
1500  mcLabel = part->MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1501  if (mcLabel>=0) {
1502  if (bachelor->Charge()==-1) isLc2LBarpi=1;
1503  if (bachelor->Charge()==+1) isLc2Lpi=1;
1504  }
1505  }
1506 
1507  Int_t pdgDg2prong[2] = {211, 211};
1508  Int_t labelK0S = 0;
1509  Int_t isK0S = 0;
1510  if (fUseMCInfo) {
1511  labelK0S = v0part->MatchToMC(310, mcArray, 2, pdgDg2prong);
1512  if (labelK0S>=0) isK0S = 1;
1513  }
1514 
1515  pdgDg2prong[0] = 211;
1516  pdgDg2prong[1] = 2212;
1517  Int_t isLambda = 0;
1518  Int_t isLambdaBar = 0;
1519  Int_t lambdaLabel = 0;
1520  if (fUseMCInfo) {
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;
1526  }
1527  }
1528 
1529  pdgDg2prong[0] = 11;
1530  pdgDg2prong[1] = 11;
1531  Int_t isGamma = 0;
1532  Int_t gammaLabel = 0;
1533  if (fUseMCInfo) {
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;
1538  }
1539  }
1540 
1541  Int_t pdgTemp = -1;
1542  if (currentLabel != -1){
1543  AliAODMCParticle *tempPart = (AliAODMCParticle*)mcArray->At(currentLabel);
1544  pdgTemp = tempPart->GetPdgCode();
1545  }
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"));
1554  //else AliDebug(2, Form("V0 is something else!!"));
1555 
1556  Double_t invmassLc2Lpi = part->InvMassLctoLambdaPi();
1557  Double_t invmassLambda = v0part->MassLambda();
1558  Double_t invmassLambdaBar = v0part->MassAntiLambda();
1559 
1560  //Double_t nSigmaITSpr=-999.;
1561  Double_t nSigmaTPCpr=-999.;
1562  Double_t nSigmaTOFpr=-999.;
1563 
1564  //Double_t nSigmaITSpi=-999.;
1565  Double_t nSigmaTPCpi=-999.;
1566  Double_t nSigmaTOFpi=-999.;
1567 
1568  //Double_t nSigmaITSka=-999.;
1569  Double_t nSigmaTPCka=-999.;
1570  Double_t nSigmaTOFka=-999.;
1571 
1572  /*
1573  cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,4,nSigmaITSpr);
1574  cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,4,nSigmaTPCpr);
1575  cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,4,nSigmaTOFpr);
1576  cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,2,nSigmaITSpi);
1577  cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,2,nSigmaTPCpi);
1578  cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,2,nSigmaTOFpi);
1579  cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,3,nSigmaITSka);
1580  cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,3,nSigmaTPCka);
1581  cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,3,nSigmaTOFka);
1582  */
1583 
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));
1590 
1591  Double_t ptLcMC = -1;
1592  Double_t weightPythia = -1, weight5LHC13d3 = -1, weight5LHC13d3Lc = -1;
1593 
1594  if (fUseMCInfo) {
1595  if (iLctopK0s >= 0) {
1596  AliAODMCParticle *partLcMC = (AliAODMCParticle*)mcArray->At(iLctopK0s);
1597  ptLcMC = partLcMC->Pt();
1598  //Printf("--------------------- Reco pt = %f, MC particle pt = %f", part->Pt(), ptLcMC);
1599  weightPythia = fFuncWeightPythia->Eval(ptLcMC);
1600  weight5LHC13d3 = fFuncWeightFONLL5overLHC13d3->Eval(ptLcMC);
1601  weight5LHC13d3Lc = fFuncWeightFONLL5overLHC13d3Lc->Eval(ptLcMC);
1602  }
1603  }
1604 
1605  Double_t weightNch = 1;
1606  if (fUseMCInfo) {
1607  //Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(mcArray,-1.0,1.0);
1608  // if(nChargedMCPhysicalPrimary > 0){
1609  if(fNTracklets > 0){
1610  if(!fHistoMCNch) AliInfo("Input histos to evaluate Nch weights missing");
1611  if(fHistoMCNch) weightNch *= fHistoMCNch->GetBinContent(fHistoMCNch->FindBin(fNTracklets));
1612  }
1613  }
1614 
1615 
1616  // Fill candidate variable Tree (track selection, V0 invMass selection)
1617  if (!onFlyV0 && isInV0window && isInCascadeWindow && part->CosV0PointingAngle()>0.99 && TMath::Abs(nSigmaTPCpr) <= 3 && v0part->Getd0Prong(0) < 20 && v0part->Getd0Prong(1) < 20) {
1618 
1619  fCandidateVariables[0] = invmassLc;
1620  fCandidateVariables[1] = invmassLc2Lpi;
1621  fCandidateVariables[2] = invmassK0s;
1622  fCandidateVariables[3] = invmassLambda;
1623  fCandidateVariables[4] = invmassLambdaBar;
1625  fCandidateVariables[6] = dcaV0;
1626  fCandidateVariables[7] = part->Getd0Prong(0);
1627  fCandidateVariables[8] = part->Getd0Prong(1);
1628  fCandidateVariables[9] = nSigmaTPCpr;
1629  fCandidateVariables[10] = nSigmaTPCpi;
1630  fCandidateVariables[11] = nSigmaTPCka;
1631  fCandidateVariables[12] = nSigmaTOFpr;
1632  fCandidateVariables[13] = nSigmaTOFpi;
1633  fCandidateVariables[14] = nSigmaTOFka;
1634  fCandidateVariables[15] = bachelor->Pt();
1635  AliAODTrack *v0pos = (AliAODTrack*)part->Getv0PositiveTrack();
1636  fCandidateVariables[16] = v0pos->Pt();
1637  AliAODTrack *v0neg = (AliAODTrack*)part->Getv0NegativeTrack();
1638  fCandidateVariables[17] = v0neg->Pt();
1639  fCandidateVariables[18] = v0part->Getd0Prong(0);
1640  fCandidateVariables[19] = v0part->Getd0Prong(1);
1641  fCandidateVariables[20] = v0part->Pt();
1642  fCandidateVariables[21] = v0part->InvMass2Prongs(0,1,11,11);
1643  fCandidateVariables[22] = part->Pt();
1644  fCandidateVariables[23] = probProton;
1645  fCandidateVariables[24] = part->Eta();
1646  fCandidateVariables[25] = v0pos->Eta();
1647  fCandidateVariables[26] = v0neg->Eta();
1648  fCandidateVariables[27] = probProtonTPC;
1649  fCandidateVariables[28] = probProtonTOF;
1650  fCandidateVariables[29] = bachelor->Eta();
1651 
1652  fCandidateVariables[30] = part->P();
1653  fCandidateVariables[31] = bachelor->P();
1654  fCandidateVariables[32] = v0part->P();
1655  fCandidateVariables[33] = v0pos->P();
1656  fCandidateVariables[34] = v0neg->P();
1657 
1658  fCandidateVariables[35] = part->Y(4122);
1659  fCandidateVariables[36] = bachelor->Y(2212);
1660  fCandidateVariables[37] = v0part->Y(310);
1661  fCandidateVariables[38] = v0pos->Y(211);
1662  fCandidateVariables[39] = v0neg->Y(211);
1663 
1664  fCandidateVariables[40] = v0part->Eta();
1665 
1666  fCandidateVariables[41] = part->DecayLength();
1667  fCandidateVariables[42] = part->DecayLengthV0();
1668  fCandidateVariables[43] = part->Ct(4122);
1669  fCandidateVariables[44] = v0part->Ct(310, v0part->GetSecondaryVtx());
1670 
1671  EBachelor bachCode = kBachInvalid;
1672  EK0S k0SCode = kK0SInvalid;
1673  if (fUseMCInfo) {
1674  bachCode = CheckBachelor(part, bachelor, mcArray);
1675  k0SCode = CheckK0S(part, v0part, mcArray);
1676  }
1677 
1678  fCandidateVariables[45] = bachCode;
1679  fCandidateVariables[46] = k0SCode;
1680 
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};
1687 
1688  if (fCallKFVertexing){
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));
1691  }
1692 
1693  /*
1694  for (Int_t i = 0; i< 3; i++){
1695  Printf("i = %d, V0KF = %f, errV0KF = %f, LcKF = %f, errLcKF = %f", V0KF[i], errV0KF[i], LcKF[i], errLcKF[i]);
1696  }
1697  */
1698 
1699  fCandidateVariables[47] = V0KF[0];
1700  fCandidateVariables[48] = V0KF[1];
1701  fCandidateVariables[49] = V0KF[2];
1702 
1703  fCandidateVariables[50] = errV0KF[0];
1704  fCandidateVariables[51] = errV0KF[1];
1705  fCandidateVariables[52] = errV0KF[2];
1706 
1707  fCandidateVariables[53] = LcKF[0];
1708  fCandidateVariables[54] = LcKF[1];
1709  fCandidateVariables[55] = LcKF[2];
1710 
1711  fCandidateVariables[56] = errLcKF[0];
1712  fCandidateVariables[57] = errLcKF[1];
1713  fCandidateVariables[58] = errLcKF[2];
1714 
1715  fCandidateVariables[59] = distances[0];
1716  fCandidateVariables[60] = distances[1];
1717  fCandidateVariables[61] = distances[2];
1718  fCandidateVariables[62] = armPolKF[0];
1719  fCandidateVariables[63] = armPolKF[1];
1720  fCandidateVariables[64] = v0part->AlphaV0();
1721  fCandidateVariables[65] = v0part->PtArmV0();
1722 
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)));
1724  fCandidateVariables[66] = v0pos->GetStatus() & AliESDtrack::kITSrefit;
1725  fCandidateVariables[67] = v0neg->GetStatus() & AliESDtrack::kITSrefit;
1726  fCandidateVariables[68] = v0pos->GetTPCClusterInfo(2, 1);
1727  fCandidateVariables[69] = v0neg->GetTPCClusterInfo(2, 1);
1728 
1729  fCandidateVariables[70] = v0part->Xv();
1730  fCandidateVariables[71] = v0part->Yv();
1731  fCandidateVariables[72] = v0part->Zv();
1732 
1733  fCandidateVariables[73] = fVtx1->GetX();
1734  fCandidateVariables[74] = fVtx1->GetY();
1735  fCandidateVariables[75] = fVtx1->GetZ();
1736 
1737  fCandidateVariables[76] = bachelor->GetITSNcls();
1738  fCandidateVariables[77] = bachelor->HasPointOnITSLayer(0) + bachelor->HasPointOnITSLayer(1);
1739 
1740  fCandidateVariables[78] = v0pos->GetITSNcls();
1741  fCandidateVariables[79] = v0pos->HasPointOnITSLayer(0) + v0pos->HasPointOnITSLayer(1);
1742 
1743  fCandidateVariables[80] = v0neg->GetITSNcls();
1744  fCandidateVariables[81] = v0neg->HasPointOnITSLayer(0) + v0neg->HasPointOnITSLayer(1);
1745 
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());
1749 
1750  Double_t Ql1 = mom1.Dot(momTot)/momTot.Mag();
1751  Double_t Ql2 = mom2.Dot(momTot)/momTot.Mag();
1752 
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);
1756 
1757  fCandidateVariables[82] = alphaArmLc;
1758  fCandidateVariables[83] = alphaArmLcCharge;
1759  fCandidateVariables[84] = ptArmLc;
1760 
1761  Double_t massK0SPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass(); // mass K0S PDG
1762  Double_t massPrPDG = TDatabasePDG::Instance()->GetParticle(2212)->Mass(); // mass Proton PDG
1763  Double_t massLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass(); // mass Lc PDG
1764 
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;
1769 
1770  Double_t cts = (Ql1/gamma-beta*TMath::Sqrt(pStar*pStar+massPrPDG*massPrPDG))/pStar;
1771 
1772  fCandidateVariables[85] = cts;
1773 
1774  fCandidateVariables[86] = weightPythia;
1775  fCandidateVariables[87] = weight5LHC13d3;
1776  fCandidateVariables[88] = weight5LHC13d3Lc;
1777  fCandidateVariables[89] = weightNch;
1778 
1779 
1780  if (fUseMCInfo) {
1781  if (isLc){
1782  AliDebug(2, Form("Reco particle %d --> Filling Sgn", iLctopK0s));
1783  fVariablesTreeSgn->Fill();
1784  fHistoCodesSgn->Fill(bachCode, k0SCode);
1785  }
1786  else {
1787  if (fFillOnlySgn == kFALSE){
1788  AliDebug(2, "Filling Bkg");
1789  fVariablesTreeBkg->Fill();
1790  fHistoCodesBkg->Fill(bachCode, k0SCode);
1791  }
1792  }
1793  }
1794  else {
1795  fVariablesTreeSgn->Fill();
1796  }
1797  }
1798 
1799  return;
1800 
1801 }
1802 
1803 //________________________________________________________________________
1804 Int_t AliAnalysisTaskSELc2V0bachelorTMVA::CallKFVertexing(AliAODRecoCascadeHF *cascade, AliAODv0* v0part, AliAODTrack* bach, TClonesArray *mcArray,
1805  Double_t* V0KF, Double_t* errV0KF, Double_t* LcKF, Double_t* errLcKF,
1806  Double_t* distances, Double_t* armPolKF) {
1807 
1808  //
1811  //
1812 
1813  Int_t codeKFV0 = -1, codeKFLc = -1;
1814 
1815  AliKFVertex primVtxCopy;
1816  Int_t nt = 0, ntcheck = 0;
1817  Double_t pos[3] = {0., 0., 0.};
1818 
1819  fVtx1->GetXYZ(pos);
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");
1825 
1826  // topological constraint
1827  primVtxCopy = AliKFVertex(primaryESDVtxCopy);
1828  nt = primaryESDVtxCopy.GetNContributors();
1829  ntcheck = nt;
1830 
1831  Int_t pdg[2] = {211, -211};
1832  Int_t pdgLc[2] = {2212, 310};
1833 
1834  Int_t pdgDgV0toDaughters[2] = {211, 211};
1835 
1836  Int_t mcLabelV0 = v0part->MatchToMC(310, mcArray, 2, pdgDgV0toDaughters);
1837 
1838  // the KF vertex for the V0 has to be built with the prongs of the V0!
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++){ // 0 is positive, 1 is negative
1846  AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1847  if(!aodTrack) {
1848  AliDebug(2, "No V0 daughters available");
1849  return -1;
1850  }
1851  Double_t xyz[3], pxpypz[3], cv[21];
1852  Short_t sign;
1853  aodTrack->GetXYZ(xyz);
1854  aodTrack->PxPyPz(pxpypz);
1855  aodTrack->GetCovarianceXYZPxPyPz(cv);
1856  sign = aodTrack->Charge();
1857  AliExternalTrackParam tmp1( xyz, pxpypz, cv, sign);
1858 
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;
1864 
1865  //Printf("v0 daughter %d has label %d", ipr, labelsv0daugh[ipr]);
1866 
1867  AliKFParticle daughterKF(*aodTrack, pdg[ipr]); // we assume that the PDG is correct
1868  if (aodTrack->Charge() > 0) { // assigning positive and negative track to KF V0 for Armenteros-Podolanski plot
1869  positiveV0KF = daughterKF;
1870  }
1871  else {
1872  negativeV0KF = daughterKF;
1873  }
1874  }
1875 
1876  Double_t xn=0., xp=0.;//, dca;
1877  AliDebug(2, Form("bField = %f, esdv0Daugh1 = %p, esdv0Daugh2 = %p", fBField, esdv0Daugh1, esdv0Daugh2));
1878  // dca = esdv0Daugh1->GetDCA(esdv0Daugh2, fBField, xn, xp);
1879 
1880  AliExternalTrackParam tr1(*esdv0Daugh1);
1881  AliExternalTrackParam tr2(*esdv0Daugh2);
1882  tr1.PropagateTo(xn, fBField);
1883  tr2.PropagateTo(xp, fBField);
1884 
1885  AliKFParticle daughterKF1(tr1, 211);
1886  AliKFParticle daughterKF2(tr2, 211);
1887  V0.AddDaughter(positiveV0KF);
1888  V0.AddDaughter(negativeV0KF);
1889  //V0.AddDaughter(daughterKF1);
1890  //V0.AddDaughter(daughterKF2);
1891 
1892  delete esdv0Daugh1;
1893  delete esdv0Daugh2;
1894  esdv0Daugh1=0;
1895  esdv0Daugh2=0;
1896  // Checking the quality of the KF V0 vertex
1897  if( V0.GetNDF() < 1 ) {
1898  //Printf("Number of degrees of freedom < 1, continuing");
1899  return -1;
1900  }
1901  if( TMath::Sqrt(TMath::Abs(V0.GetChi2()/V0.GetNDF())) > fCutKFChi2NDF ) {
1902  //Printf("Chi2 per DOF too big, continuing");
1903  return -1;
1904  }
1905 
1906  if(ftopoConstraint && nt > 0){
1907  for(Int_t ipr = 0; ipr < 2; ipr++){ // 0 is positive, 1 is negative
1908  AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1909  //* subtruct daughters from primary vertex
1910  if(!aodTrack->GetUsedForPrimVtxFit()) {
1911  //Printf("Track %d was not used for primary vertex, continuing", i);
1912  continue;
1913  }
1914  AliKFParticle daughterKF(*aodTrack, pdg[ipr]); // we assume that the PDG is correct
1915  primVtxCopy -= daughterKF;
1916  ntcheck--;
1917  }
1918  }
1919 
1920  // Check V0 Chi^2 deviation from primary vertex // not needed for V0 for Lc decay!!
1921  /*
1922  if( V0.GetDeviationFromVertex( primVtxCopy ) < fCutKFDeviationFromVtxV0) {
1923  //Printf("Deviation from vertex too big, continuing");
1924  return -1;
1925  }
1926  */
1927 
1928  //* Get V0 invariant mass
1929  Double_t massV0 = 999999, sigmaMassV0 = 999999;
1930  Int_t retMV0 = V0.GetMass( massV0, sigmaMassV0 );
1931  if( retMV0 ) {
1932  if (massV0 < 0) {
1933  codeKFV0 = 1; // Mass not ok
1934  if (sigmaMassV0 > 1e19) codeKFV0 = 5; // Mass and SigmaMass not ok
1935  }
1936  else if (sigmaMassV0 > 1e19) codeKFV0 = 2; // SigmaMass not ok
1937  }
1938  fHistoMassKFV0->Fill(massV0, sigmaMassV0);
1939 
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]);
1942 
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());
1945 
1946  //Printf("Got MC vtx for V0");
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");
1952  }
1953  if (!tmpdaughv02 && labelsv0daugh[1] > 0){
1954  AliDebug(2, "Could not access MC info for second daughter of V0, continuing");
1955  }
1956  if(tmpdaughv01){
1957  Double_t xPionMC = tmpdaughv01->Xv(); //Production vertex of Pion --> Where K0S decays
1958  Double_t yPionMC = tmpdaughv01->Yv();
1959  Double_t zPionMC = tmpdaughv01->Zv();
1960  //Printf("Got MC vtx for Pion");
1961  Printf("Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
1962  }
1963  }
1964  else {
1965  Printf("Not a true V0");
1966  }
1967  //massV0=-1;//return -1;// !!!!
1968 
1969  // now use what we just try with the bachelor, to build the Lc
1970 
1971  // topological constraint
1972  nt = primVtxCopy.GetNContributors();
1973  ntcheck = nt;
1974 
1975  Bool_t isMCokLc = kTRUE, isBkgLc = kFALSE;
1976  AliKFParticle Lc;
1977  Int_t labelsLcdaugh[2] = {-1, -1};
1978  labelsLcdaugh[0] = TMath::Abs(bach->GetLabel());
1979  labelsLcdaugh[1] = mcLabelV0;
1980 
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);
1987  Lc.AddDaughter(V0);
1988  if( Lc.GetNDF() < 1 ) {
1989  AliDebug(2, Form("Lc: Number of degrees of freedom < 1 (%d), continuing", Lc.GetNDF()));
1990  return -1;
1991  }
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()))));
1994  return -1;
1995  }
1996 
1997  if(ftopoConstraint && nt > 0){
1998  //* subtruct daughters from primary vertex
1999  if(!bach->GetUsedForPrimVtxFit()) {
2000  AliDebug(3, "Lc: Bachelor was not used for primary vertex, not subtracting it from primary vertex");
2001  }
2002  else{
2003  primVtxCopy -= daughterKFLc;
2004  ntcheck--;
2005  }
2006  /* the V0 was added above, so it is ok to remove it without checking
2007  if(!V0->GetUsedForPrimVtxFit()) {
2008  Printf("Lc: V0 was not used for primary vertex, continuing");
2009  continue;
2010  }
2011  */
2012  //primVtxCopy -= V0;
2013  //ntcheck--;
2014  }
2015 
2016  // Check Lc Chi^2 deviation from primary vertex
2017  /*
2018  if( Lc.GetDeviationFromVertex( primVtxCopy ) > fCutKFDeviationFromVtx) {
2019  AliDebug(2, Form("Lc: Deviation from vertex too big, continuing (%f)", Lc.GetDeviationFromVertex( primVtxCopy )));
2020  return -1;
2021  }
2022 
2023  if(ftopoConstraint){
2024  if(ntcheck>0) {
2025  // Add Lc to primary vertex to improve the primary vertex resolution
2026  primVtxCopy += Lc;
2027  Lc.SetProductionVertex(primVtxCopy);
2028  }
2029  }
2030  */
2031  //* Check chi^2
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()))));
2034  return -1;
2035  }
2036 
2037  if(ftopoConstraint){
2038  V0.SetProductionVertex(Lc);
2039  }
2040 
2041  // After setting the vertex of the V0, getting/filling some info
2042 
2043  //* Get V0 decayLength
2044  Double_t decayLengthV0 = 999999, sigmaDecayLengthV0 = 999999;
2045  Int_t retDLV0 = V0.GetDecayLength( decayLengthV0, sigmaDecayLengthV0 );
2046  if( retDLV0 ) {
2047  if (sigmaDecayLengthV0 > 1e19) {
2048  codeKFV0 = 3; // DecayLength not ok
2049  if (massV0 < 0) {
2050  codeKFV0 = 6; // DecayLength and Mass not ok
2051  if (sigmaMassV0 > 1e19) codeKFV0 = 11; // DecayLength and Mass and SigmaMass not ok
2052  }
2053  else if (sigmaMassV0 > 1e19) codeKFV0 = 8; // DecayLength and SigmaMass not ok
2054  }
2055  }
2056  fHistoDecayLengthKFV0->Fill(decayLengthV0, sigmaDecayLengthV0);
2057 
2058  //* Get V0 life time
2059  Double_t lifeTimeV0 = 999999, sigmaLifeTimeV0 = 999999;
2060  Int_t retTLV0 = V0.GetLifeTime( lifeTimeV0, sigmaLifeTimeV0 );
2061  if( retTLV0 ) {
2062  if (sigmaLifeTimeV0 > 1e19) {
2063  codeKFV0 = 4; // LifeTime not ok
2064  if (sigmaDecayLengthV0 > 1e19) {
2065  codeKFV0 = 9; // LifeTime and DecayLength not ok
2066  if (massV0 < 0) {
2067  codeKFV0 = 14; // LifeTime and DecayLength and Mass not ok
2068  if (sigmaMassV0 > 1e19) codeKFV0 = 15; // LifeTime and DecayLength and Mass and SigmaMass not ok
2069  }
2070  else if (sigmaMassV0 > 1e19) codeKFV0 = 13; // LifeTime and DecayLength and SigmaMass not ok
2071  }
2072  else if (massV0 < 0) { // LifeTime and Mass and SigmaMass not ok
2073  codeKFV0 = 7; // LifeTime and Mass not ok
2074  if (sigmaMassV0 > 1e19) codeKFV0 = 12; // LifeTime and Mass and SigmaMass not ok
2075  }
2076  else if (sigmaMassV0 > 1e19) codeKFV0 = 10; // LifeTime and SigmaMass not ok
2077  }
2078  }
2079  fHistoLifeTimeKFV0->Fill(lifeTimeV0, sigmaLifeTimeV0);
2080 
2081  if (codeKFV0 == -1) codeKFV0 = 0;
2082  fHistoKFV0->Fill(codeKFV0);
2083 
2084  AliDebug(2, Form("V0: mass = %f, decay length = %f, life time = %f", massV0, decayLengthV0, lifeTimeV0 ));
2085 
2086  fHistoMassV0All->Fill(massV0);
2087  fHistoDecayLengthV0All->Fill(decayLengthV0);
2088  fHistoLifeTimeV0All->Fill(lifeTimeV0);
2089 
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]));
2096  fHistoArmenterosPodolanskiV0KF->Fill(qtAlphaV0[1], qtAlphaV0[0]);
2097  fHistoArmenterosPodolanskiV0AOD->Fill(v0part->AlphaV0(), v0part->PtArmV0());
2098  armPolKF[0] = qtAlphaV0[1];
2099  armPolKF[1] = qtAlphaV0[0];
2100 
2101  // Checking MC info for V0
2102 
2103  AliAODMCParticle *motherV0 = 0x0;
2104  AliAODMCParticle *daughv01 = 0x0;
2105  AliAODMCParticle *daughv02 = 0x0;
2106 
2107  if (fUseMCInfo) {
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");
2112  isMCokV0 = kFALSE;
2113  }
2114  if (!daughv02 && labelsv0daugh[1] > 0){
2115  AliDebug(2, "Could not access MC info for second daughter of V0, continuing");
2116  isMCokV0 = kFALSE;
2117  }
2118  if (isMCokV0){
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 ){ // These are all V0 that are truly V0, not only K0S, but no gluons
2123  if( motherV0->GetNDaughters() == 2 ){
2124  fHistoMassV0True->Fill(massV0);
2125  fHistoDecayLengthV0True->Fill(decayLengthV0);
2126  fHistoLifeTimeV0True->Fill(lifeTimeV0);
2127  fHistoMassV0TrueFromAOD->Fill(v0part->MassK0Short());
2128  if (TMath::Abs(motherV0->GetPdgCode()) == 310){ // These are true V0 that are also K0S
2129  fHistoMassV0TrueK0S->Fill(massV0);
2130  fHistoDecayLengthV0TrueK0S->Fill(decayLengthV0);
2131  fHistoLifeTimeV0TrueK0S->Fill(lifeTimeV0);
2132  fHistoMassV0TrueK0SFromAOD->Fill(v0part->MassK0Short());
2133  }
2134  }
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()));
2136  }
2137  else if (!motherV0){
2138  AliDebug(3, "could not access MC info for mother, continuing");
2139  }
2140  else {
2141  AliDebug(3, "MC mother is a gluon, continuing");
2142  }
2143  }
2144  else {
2145  AliDebug(3, "Background V0!");
2146  isBkgV0 = kTRUE;
2147  }
2148  }
2149  }
2150 
2151  AliDebug(2, Form("isMCokV0 = %d, isBkgV0 = %d", (Int_t)isMCokV0, (Int_t)isBkgV0));
2152 
2153  // Going back to Lc
2154 
2155  //* Get Lc invariant mass
2156  Double_t massLc = 999999, sigmaMassLc= 999999;
2157  Int_t retMLc = Lc.GetMass( massLc, sigmaMassLc );
2158  if( retMLc ) {
2159  AliDebug(3, Form("----> Could not get mass (%e), and sigma(%e) for Lc, continuing", massLc, sigmaMassLc));
2160  if (massLc < 0) {
2161  codeKFLc = 1; // Mass not ok
2162  if (sigmaMassLc > 1e19) codeKFLc = 5; // Mass and SigmaMass not ok
2163  }
2164  else if (sigmaMassLc > 1e19) codeKFLc = 2; // SigmaMass not ok
2165  }
2166  fHistoMassKFLc->Fill(massLc, sigmaMassLc);
2167 
2168  //* Get Lc Decay length
2169  Double_t decayLengthLc = 999999, sigmaDecayLengthLc = 999999;
2170  Int_t retDLLc = Lc.GetDecayLength( decayLengthLc, sigmaDecayLengthLc );
2171  if( retDLLc ) {
2172  AliDebug(3, "----> Lc: Could not get decay length, and sigma");
2173  if (sigmaDecayLengthLc > 1e19) {
2174  codeKFLc = 3; // DecayLength not ok
2175  if (massLc < 0) {
2176  codeKFLc = 6; // DecayLength and Mass not ok
2177  if (sigmaMassLc > 1e19) codeKFLc = 11; // DecayLength and Mass and SigmaMass not ok
2178  }
2179  else if (sigmaMassLc > 1e19) codeKFLc = 8; // DecayLength and SigmaMass not ok
2180  }
2181  }
2182  AliDebug(3, Form("retDLLc = %d, with decayLength = %f and error = %e", retDLLc, decayLengthLc, sigmaDecayLengthLc));
2183 
2184  fHistoDecayLengthKFLc->Fill(decayLengthLc, sigmaDecayLengthLc);
2185 
2186  //* Get Lc life time
2187  Double_t lifeTimeLc = 999999, sigmaLifeTimeLc = 999999;
2188  Int_t retTLLc = Lc.GetLifeTime( lifeTimeLc, sigmaLifeTimeLc );
2189  if( retTLLc ) {
2190  AliDebug(3, "----> Lc: Could not get lifeTime, and sigma");
2191  if (sigmaLifeTimeLc > 1e19) {
2192  codeKFLc = 4; // LifeTime not ok
2193  if (sigmaDecayLengthLc > 1e19) {
2194  codeKFLc = 9; // LifeTime and DecayLength not ok
2195  if (massLc < 0) {
2196  codeKFLc = 14; // LifeTime and DecayLength and Mass not ok
2197  if (sigmaMassLc > 1e19) codeKFLc = 15; // LifeTime and DecayLength and Mass and SigmaMass not ok
2198  }
2199  else if (sigmaMassLc > 1e19) codeKFLc = 13; // LifeTime and DecayLength and SigmaMass not ok
2200  }
2201  else if (massLc < 0) { // LifeTime and Mass and SigmaMass not ok
2202  codeKFLc = 7; // LifeTime and Mass not ok
2203  if (sigmaMassLc > 1e19) codeKFLc = 12; // LifeTime and Mass and SigmaMass not ok
2204  }
2205  else if (sigmaMassLc > 1e19) codeKFLc = 10; // LifeTime and SigmaMass not ok
2206  }
2207  }
2208 
2209  fHistoLifeTimeKFLc->Fill(lifeTimeLc, sigmaLifeTimeLc);
2210 
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));
2212 
2213  if (codeKFLc == -1) codeKFLc = 0;
2214  fHistoKFLc->Fill(codeKFLc);
2215 
2216  fHistoKF->Fill(codeKFV0, codeKFLc);
2217 
2218  // here we fill the histgrams for all the reconstructed KF vertices for the cascade
2219  fHistoMassLcAll->Fill(massLc);
2220  fHistoDecayLengthLcAll->Fill(decayLengthLc);
2221  fHistoLifeTimeLcAll->Fill(lifeTimeLc);
2222 
2223  fHistoMassV0fromLcAll->Fill(massV0);
2224  fHistoDecayLengthV0fromLcAll->Fill(decayLengthV0);
2225  fHistoLifeTimeV0fromLcAll->Fill(lifeTimeV0);
2226 
2227  Double_t xV0 = V0.GetX();
2228  Double_t yV0 = V0.GetY();
2229  Double_t zV0 = V0.GetZ();
2230 
2231  Double_t xLc = Lc.GetX();
2232  Double_t yLc = Lc.GetY();
2233  Double_t zLc = Lc.GetZ();
2234 
2235  Double_t xPrimVtx = primVtxCopy.GetX();
2236  Double_t yPrimVtx = primVtxCopy.GetY();
2237  Double_t zPrimVtx = primVtxCopy.GetZ();
2238 
2239  Double_t distanceLcToPrimVtx = TMath::Sqrt((xPrimVtx - xLc) * (xPrimVtx - xLc) +
2240  (yPrimVtx - yLc) * (yPrimVtx - yLc) +
2241  (zPrimVtx - zLc) * (zPrimVtx - zLc));
2242 
2243  Double_t distanceV0ToPrimVtx = TMath::Sqrt((xPrimVtx - xV0) * (xPrimVtx - xV0) +
2244  (yPrimVtx - yV0) * (yPrimVtx - yV0) +
2245  (zPrimVtx - zV0) * (zPrimVtx - zV0));
2246 
2247  Double_t distanceV0ToLc = TMath::Sqrt((xLc - xV0)*(xLc - xV0) +
2248  (yLc - yV0)*(yLc - yV0) +
2249  (zLc - zV0)*(zLc - zV0));
2250 
2251  //Printf("distanceLcToPrimVtx = %e, distanceV0ToPrimVtx= %f, distanceV0ToLc = %f", distanceLcToPrimVtx, distanceV0ToPrimVtx, distanceV0ToLc);
2252 
2253  fHistoDistanceLcToPrimVtx->Fill(distanceLcToPrimVtx);
2254  fHistoDistanceV0ToPrimVtx->Fill(distanceV0ToPrimVtx);
2255  fHistoDistanceV0ToLc->Fill(distanceV0ToLc);
2256 
2257  distances[0] = distanceLcToPrimVtx;
2258  distances[1] = distanceV0ToPrimVtx;
2259  distances[2] = distanceV0ToLc;
2260 
2261  if (fUseMCInfo) {
2262 
2263  AliAODMCParticle *daughv01Lc = 0x0;
2264  AliAODMCParticle *K0S = 0x0;
2265  AliAODMCParticle *daughv02Lc = 0x0;
2266 
2267  if (labelsLcdaugh[0] >= 0) {
2268  // Printf("Getting Bachelor from label %d", labelsLcdaugh[1]);
2269  daughv01Lc = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsLcdaugh[0]));
2270  if (!daughv01Lc){
2271  AliDebug(3, "Could not access MC info for first daughter of Lc");
2272  isMCokLc = kFALSE;
2273  }
2274  else {
2275  AliDebug(2, Form("The bachelor has label = %d", daughv01Lc->GetLabel()));
2276  if (TMath::Abs(daughv01Lc->GetPdgCode()) != 2212) isBkgLc = kTRUE;
2277  }
2278  }
2279  else { // The bachelor is a fake
2280  isBkgLc = kTRUE;
2281  }
2282 
2283  if (labelsLcdaugh[1] >= 0) {
2284  //Printf("Getting K0S");
2285  K0S = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsLcdaugh[1]));
2286  if (!K0S) {
2287  AliDebug(3, "Could not access MC info for second daughter of Lc");
2288  isMCokLc = kFALSE;
2289  }
2290  else{
2291  if (TMath::Abs(K0S->GetPdgCode()) != 310) isBkgLc = kTRUE;
2292  }
2293  }
2294  else{
2295  AliDebug(2, "The K0S is not true --> it does not have a label, continuing...");
2296  isBkgLc = kTRUE;
2297  }
2298 
2299  if (!isBkgLc){ // so far, we only checked that the V0 and the bachelor are not fake, and in particular, we know that the V0 is a K0S since we used the MatchToMC method
2300  if (isMCokLc) { // We can then access its MC info, and it might then be that also the Lc is a true Lc
2301  Int_t iK0 = K0S->GetMother();
2302  if (iK0 < 0) {
2303  Printf("The K0S has no mother... IMPOSSIBLE"); // the K0S MUST have a mother!
2304  }
2305  else { // The K0S has a mother
2306  daughv02Lc = dynamic_cast<AliAODMCParticle*>(mcArray->At(iK0));
2307  if (!daughv02Lc){
2308  AliDebug(3, "Could not access MC info for second daughter of Lc");
2309  }
2310  else { // we can access safely the K0S mother in the MC
2311  if( daughv01Lc && (daughv01Lc->GetMother() == daughv02Lc->GetMother()) && (daughv01Lc->GetMother()>=0) ){ // This is a true cascade! bachelor and V0 come from the same mother
2312  //Printf("Lc: The mother has label %d", daughv01Lc->GetMother());
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));
2319 
2320  if( motherLc && TMath::Abs(motherLc->GetPdgCode()) != 21 ){ // These are true cascades, we don't know yet if they are Lc
2321  fHistoMassLcTrue->Fill(massLc);
2322  fHistoDecayLengthLcTrue->Fill(decayLengthLc);
2323  fHistoLifeTimeLcTrue->Fill(lifeTimeLc);
2324  fHistoMassLcTrueFromAOD->Fill(cascade->InvMassLctoK0sP());
2325 
2326  fHistoMassV0fromLcTrue->Fill(massV0);
2327  fHistoDecayLengthV0fromLcTrue->Fill(decayLengthV0);
2328  fHistoLifeTimeV0fromLcTrue->Fill(lifeTimeV0);
2329 
2330  if (TMath::Abs(motherLc->GetPdgCode()) == 4122 && TMath::Abs(motherV0->GetPdgCode()) == 310 && TMath::Abs(daughv01Lc->GetPdgCode()) == 2212){ // This is Lc --> K0S + p (the check on the PDG code of the V0 is useless, since we used MathcToMC with it, but fine...
2331  AliDebug(2, Form("IT IS SIGNAL!!! with label = %d", motherLc->GetLabel()));
2332 
2333  fHistoArmenterosPodolanskiV0KFSgn->Fill(qtAlphaV0[1], qtAlphaV0[0]);
2334  fHistoArmenterosPodolanskiV0AODSgn->Fill(v0part->AlphaV0(), v0part->PtArmV0());
2335 
2336  fHistoDistanceLcToPrimVtxSgn->Fill(distanceLcToPrimVtx);
2337  fHistoDistanceV0ToPrimVtxSgn->Fill(distanceV0ToPrimVtx);
2338  fHistoDistanceV0ToLcSgn->Fill(distanceV0ToLc);
2339 
2340  fHistoMassLcSgn->Fill(massLc);
2341  fHistoMassLcSgnFromAOD->Fill(cascade->InvMassLctoK0sP());
2342 
2343  fHistoDecayLengthLcSgn->Fill(decayLengthLc);
2344  fHistoLifeTimeLcSgn->Fill(lifeTimeLc);
2345 
2346  fHistoMassV0fromLcSgn->Fill(massV0);
2347  fHistoDecayLengthV0fromLcSgn->Fill(decayLengthV0);
2348  fHistoLifeTimeV0fromLcSgn->Fill(lifeTimeV0);
2349  }
2350  else {
2351  isBkgLc = kTRUE; // it is not a Lc, since the pdg != 4122
2352  }
2353 
2354  // if we got here, we can compare with MC information; this part is done also for cases where the cascade is not a Lc!
2355  // First, we compare the vtx of the Lc
2356  Double_t xLcMC = motherLc->Xv();
2357  Double_t yLcMC = motherLc->Yv();
2358  Double_t zLcMC = motherLc->Zv();
2359  //Printf("Got MC vtx for Lc");
2360  Double_t xProtonMC = daughv01Lc->Xv();
2361  Double_t yProtonMC = daughv01Lc->Yv();
2362  Double_t zProtonMC = daughv01Lc->Zv();
2363  //Printf("Got MC vtx for Proton");
2364 
2365  Double_t vtxLcResidualToPrimVtx = TMath::Sqrt((xLcMC - xProtonMC) * (xLcMC - xProtonMC) +
2366  (yLcMC - yProtonMC) * (yLcMC - yProtonMC) +
2367  (zLcMC - zProtonMC) * (zLcMC - zProtonMC)) - distanceLcToPrimVtx;
2368 
2369  // Then, we compare the vtx of the K0s
2370  Double_t xV0MC = motherV0->Xv(); //Production vertex of K0S --> Where Lc decays
2371  Double_t yV0MC = motherV0->Yv();
2372  Double_t zV0MC = motherV0->Zv();
2373 
2374  //Printf("Got MC vtx for V0");
2375  Double_t xPionMC = daughv01->Xv(); //Production vertex of Pion --> Where K0S decays
2376  Double_t yPionMC = daughv01->Yv();
2377  Double_t zPionMC = daughv01->Zv();
2378  //Printf("Got MC vtx for Pion");
2379  Printf("Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
2380 
2381  Double_t vtxV0ResidualToLc = TMath::Sqrt((xV0MC - xPionMC) * (xV0MC - xPionMC) +
2382  (yV0MC - yPionMC) * (yV0MC - yPionMC) +
2383  (zV0MC - zPionMC) * (zV0MC - zPionMC)) - distanceV0ToLc;
2384 
2385  // Then, the K0S vertex wrt primary vertex
2386 
2387  Double_t vtxV0ResidualToPrimVtx = TMath::Sqrt((xPionMC - xLcMC) * (xPionMC - xLcMC) +
2388  (yPionMC - yLcMC) * (yPionMC - yLcMC) +
2389  (zPionMC - zLcMC) * (zPionMC - zLcMC)) - distanceV0ToPrimVtx;
2390 
2391  fHistoVtxLcResidualToPrimVtx->Fill(vtxLcResidualToPrimVtx);
2392  fHistoVtxV0ResidualToLc->Fill(vtxV0ResidualToLc);
2393  fHistoVtxV0ResidualToPrimVtx->Fill(vtxV0ResidualToPrimVtx);
2394 
2395  } //closing: if( motherLc && TMath::Abs(motherLc->GetPdgCode()) != 21 )
2396  else if (!motherLc){
2397  AliDebug(2, "We could not access MC info for Lc mother, so we did nothing");
2398  }
2399  else {
2400  AliDebug(2, "MC Lc mother is a gluon, so we did nothing");
2401  }
2402  } //closing: if( daughv01Lc->GetMother() == daughv02Lc->GetMother() && daughv01Lc->GetMother()>=0 )
2403  else {
2404  isBkgLc = kTRUE; // it cannot be a Lc, since the daughters do not have the same mother
2405  }
2406  } // closing: else { // we can access safely the K0S mother in the MC
2407  } // closing: else { // The K0S has a mother
2408  } // closing isMCLcok
2409  } // closing !isBkgLc
2410  } // closing fUseMCInfo
2411 
2412  //Printf("retMV0 = %d, retMLc = %d", retMV0, retMLc);
2413  if ( retMV0 == 0 && retMLc == 0){
2414  V0KF[0] = massV0;
2415  errV0KF[0] = sigmaMassV0;
2416  V0KF[1] = decayLengthV0;
2417  errV0KF[1] = sigmaDecayLengthV0;
2418  V0KF[2] = lifeTimeV0;
2419  errV0KF[2] = sigmaLifeTimeV0;
2420  LcKF[0] = massLc;
2421  errLcKF[0] = sigmaMassLc;
2422  LcKF[1] = decayLengthLc;
2423  errLcKF[1] = sigmaDecayLengthLc;
2424  LcKF[2] = lifeTimeLc;
2425  errLcKF[2] = sigmaLifeTimeLc;
2426  }
2427 
2428  return 1;
2429 
2430 }
2431 //________________________________________________________________________
2433  AliAODTrack* bachelor,
2434  TClonesArray *mcArray ){
2435 
2436  //Printf("In CheckBachelor");
2437 
2440 
2441  Int_t label = bachelor->GetLabel();
2442  if (label == -1) {
2443  return kBachFake;
2444  }
2445 
2446  AliAODMCParticle *mcpart = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(label)));
2447  if (!mcpart) return kBachInvalid;
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));
2451  return kBachNoProton;
2452  }
2453  else { // it is a proton
2454  //Int_t labelLc = part->GetLabel();
2455  Int_t labelLc = FindLcLabel(part, mcArray);
2456  //Printf(">>>>>>>>>>>>> label for Lc = %d", labelLc);
2457  Int_t bachelorMotherLabel = mcpart->GetMother();
2458  //Printf(">>>>>>>>>>>>> label for bachelorMother = %d", bachelorMotherLabel);
2459  if (bachelorMotherLabel == -1) {
2460  return kBachPrimary;
2461  }
2462  AliAODMCParticle *bachelorMother = dynamic_cast<AliAODMCParticle*>(mcArray->At(bachelorMotherLabel));
2463  if (!bachelorMother) return kBachInvalid;
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));
2467  return kBachNoLambdaMother;
2468  }
2469  else { // it comes from Lc
2470  if (labelLc != bachelorMotherLabel){
2471  //AliInfo(Form("The proton comes from a Lc, but it is not the candidate we are analyzing (label Lc = %d, label p mother = %d", labelLc, bachelorMotherLabel));
2472  AliDebug(2, Form("The proton comes from a Lc, but it is not the candidate we are analyzing"));
2474  }
2475  else { // it comes from the correct Lc
2476  AliDebug(2, Form("The proton comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2477  return kBachCorrectLambdaMother;
2478  }
2479  }
2480  }
2481 
2482  return kBachInvalid;
2483 
2484 }
2485 
2486 //________________________________________________________________________
2488  AliAODv0* v0part,
2489  //AliAODTrack* v0part,
2490  TClonesArray *mcArray ){
2491 
2494 
2495  //Printf(" CheckK0S");
2496 
2497  //Int_t labelMatchToMC = v0part->MatchToMC(310, mcArray);
2498  //Int_t label = v0part->GetLabel();
2499  Int_t labelFind = FindV0Label(v0part, mcArray);
2500  //Printf("\n >>>>>>>>>>>>> label for V0 = %d, from MatchToMC = %d, from Find = %d", label, labelMatchToMC, labelFind);
2501  if (labelFind == -1) {
2502  return kK0SFake;
2503  }
2504 
2505  AliAODMCParticle *mcpart = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelFind));
2506  if (!mcpart) return kK0SInvalid;
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));
2510  //AliInfo(Form("K0Spart is not a K0S, but a particle with pdg code = %d", pdg));
2511  return kK0SNoK0S;
2512  }
2513  else { // it is a K0S
2514  //Int_t labelLc = part->GetLabel();
2515  Int_t labelLc = FindLcLabel(part, mcArray);
2516  Int_t K0SpartMotherLabel = mcpart->GetMother();
2517  if (K0SpartMotherLabel == -1) {
2518  return kK0SWithoutMother;
2519  }
2520  AliAODMCParticle *K0SpartMother = dynamic_cast<AliAODMCParticle*>(mcArray->At(K0SpartMotherLabel)); // should be a K0 in case of signal
2521  if (!K0SpartMother) return kK0SInvalid;
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));
2525  //AliInfo(Form("The K0S does not come from a K0, but from a particle with pdgcode = %d", pdgMotherK0S));
2526  return kK0SNotFromK0;
2527  }
2528  else { // the K0S comes from a K0
2529  Int_t K0MotherLabel = K0SpartMother->GetMother(); // mother of K0 --> Lc in case of signal
2530  if (K0MotherLabel == -1) {
2531  return kK0Primary;
2532  }
2533  AliAODMCParticle *K0Mother = dynamic_cast<AliAODMCParticle*>(mcArray->At(K0MotherLabel));
2534  if (!K0Mother) return kK0SInvalid;
2535  Int_t pdgK0Mother = K0Mother->PdgCode();
2536  if (TMath::Abs(pdgK0Mother) != 4122) { // the K0 does not come from a Lc
2537  AliDebug(2, Form("The K0 does not come from a Lc, but from a particle with pdgcode = %d", pdgK0Mother));
2538  //AliInfo(Form("The K0 does not come from a Lc, but from a particle with pdgcode = %d", pdgK0Mother));
2539  return kK0NoLambdaMother;
2540  }
2541  else { // the K0 comes from Lc
2542  if (labelLc != K0MotherLabel){ // The K0 comes from a different Lc
2543  AliDebug(2, Form("The K0S comes from a Lc, but it is not the candidate we are analyzing"));
2544  //AliInfo(Form("The K0S comes from a Lc, but it is not the candidate we are analyzing"));
2545  return kK0DifferentLambdaMother;
2546  }
2547  else { // it comes from the correct Lc
2548  AliDebug(2, Form("The K0S comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2549  //AliInfo(Form("The K0S comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2550  return kK0CorrectLambdaMother;
2551  }
2552  }
2553  }
2554  }
2555 
2556  return kK0SInvalid;
2557 
2558 }
2559 
2560 //----------------------------------------------------------------------------
2561 Int_t AliAnalysisTaskSELc2V0bachelorTMVA::FindV0Label(AliAODRecoDecay* v0part, TClonesArray *mcArray) const
2562 {
2563 
2564  //Printf(" FindV0Label");
2565 
2567 
2568  Int_t labMother[2]={-1, -1};
2569  AliAODMCParticle *part=0;
2570  AliAODMCParticle *mother=0;
2571  Int_t dgLabels = -1;
2572 
2573  Int_t ndg = v0part->GetNDaughters();
2574  if (ndg != 2) {
2575  AliFatal(Form("IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2576  }
2577 
2578  for(Int_t i = 0; i < 2; i++) {
2579  AliAODTrack *trk = (AliAODTrack*)v0part->GetDaughter(i);
2580  dgLabels = trk->GetLabel();
2581  if (dgLabels == -1) {
2582  //printf("daughter with negative label %d\n", dgLabels);
2583  return -1;
2584  }
2585  part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2586  if (!part) {
2587  //printf("no MC particle\n");
2588  return -1;
2589  }
2590  labMother[i] = part->GetMother();
2591  if (labMother[i] != -1){
2592  mother = (AliAODMCParticle*)mcArray->At(labMother[i]);
2593  if(!mother) {
2594  //printf("no MC mother particle\n");
2595  return -1;
2596  }
2597  }
2598  else {
2599  return -1;
2600  }
2601  }
2602 
2603  if (labMother[0] == labMother[1]) return labMother[0];
2604 
2605  else return -1;
2606 
2607 }
2608 
2609 //----------------------------------------------------------------------------
2610 Int_t AliAnalysisTaskSELc2V0bachelorTMVA::FindLcLabel(AliAODRecoCascadeHF* cascade, TClonesArray *mcArray) const
2611 {
2612 
2614 
2615  //Printf(" FindLcLabel");
2616 
2617  AliAODMCParticle *part=0;
2618  AliAODMCParticle *mother=0;
2619  AliAODMCParticle *grandmother=0;
2620  Int_t dgLabels = -1;
2621 
2622  Int_t ndg = cascade->GetNDaughters();
2623  if (ndg != 2) {
2624  AliFatal(Form("IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2625  }
2626 
2627  // daughter 0 --> bachelor, daughter 1 --> V0
2628  AliAODTrack *trk = (AliAODTrack*)cascade->GetDaughter(0); // bachelor
2629  dgLabels = trk->GetLabel();
2630  if (dgLabels == -1 ) {
2631  //printf("daughter with negative label %d\n", dgLabels);
2632  return -1;
2633  }
2634  part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2635  if (!part) {
2636  //printf("no MC particle\n");
2637  return -1;
2638  }
2639  Int_t labMotherBach = part->GetMother();
2640  if (labMotherBach == -1){
2641  return -1;
2642  }
2643  mother = (AliAODMCParticle*)mcArray->At(labMotherBach);
2644  if(!mother) {
2645  //printf("no MC mother particle\n");
2646  return -1;
2647  }
2648 
2649  AliAODv0 *v0 = (AliAODv0*)cascade->GetDaughter(1); // V0
2650  dgLabels = FindV0Label(v0, mcArray);
2651  if (dgLabels == -1 ) {
2652  //printf("daughter with negative label (v0 was a fake) %d\n", dgLabels);
2653  return -1;
2654  }
2655  part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2656  if (!part) {
2657  //printf("no MC particle\n");
2658  return -1;
2659  }
2660  Int_t labMotherv0 = part->GetMother();
2661  if (labMotherv0 == -1){
2662  return -1;
2663  }
2664  mother = (AliAODMCParticle*)mcArray->At(labMotherv0);
2665  if(!mother) {
2666  //printf("no MC mother particle\n");
2667  return -1;
2668  }
2669  Int_t labGrandMotherv0 = mother->GetMother();
2670  if (labGrandMotherv0 == -1){
2671  return -1;
2672  }
2673  grandmother = (AliAODMCParticle*)mcArray->At(labGrandMotherv0);
2674  if(!grandmother) {
2675  //printf("no MC mother particle\n");
2676  return -1;
2677  }
2678 
2679  //Printf("labMotherBach = %d, labMotherv0 = %d, labGrandMotherv0 = %d", labMotherBach, labMotherv0, labGrandMotherv0);
2680  if (labGrandMotherv0 == labMotherBach) return labMotherBach;
2681 
2682  else return -1;
2683 
2684 }
2685 
2686 
2687 
2688 
2689 
2690 
Int_t IsSelectedSingleCut(TObject *obj, Int_t selectionLevel, Int_t cutIndex)
virtual Int_t IsSelected(TObject *obj, Int_t selectionLevel)
Int_t pdg
TH1D * fHistoDistanceV0ToLc
! KF: distance V0 vertex from Lc vertex
TH2D * fHistoArmenterosPodolanskiV0KFSgn
! KF: Armeteros-Podolanski plot for V0 from signal Lc from KF
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
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)
AliAODv0 * Getv0() const
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.
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
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
Definition: AliRDHFCuts.h:241
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)
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
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
TH1D * fHistoLifeTimeV0fromLcAll
! KF: life time of V0 for all cascades reconstructed with KF
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)
Definition: AliRDHFCuts.h:204
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
const Int_t nVar
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
Definition: AliRDHFCuts.h:254
TH1D * fHistoLifeTimeV0fromLcSgn
! KF: life time of V0 for signal Lc reconstructed with KF
TTree * fVariablesTreeBkg
! tree of the candidate variables after track selection (Background)
Double_t DecayLengthV0() const
void SetTriggerClass(TString trclass0, TString trclass1="")
Definition: AliRDHFCuts.h:192
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
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
TH1D * fHistoVtxLcResidualToPrimVtx
! KF: residual wrt MC of distance Lc vertex from primary vertex (MC - KF)
void SetTriggerMask(ULong64_t mask=0)
Definition: AliRDHFCuts.h:63
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.