AliPhysics  c66ce6c (c66ce6c)
 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 {
203  //
205  //
206 }
207 //___________________________________________________________________________
209  AliRDHFCutsLctoV0* analCuts, Bool_t useOnTheFly) :
210  AliAnalysisTaskSE(name),
211  fUseMCInfo(kFALSE),
212  fOutput(0),
213  fCEvents(0),
214  fPIDResponse(0),
215  fPIDCombined(0),
216  fIsK0sAnalysis(kFALSE),
217  fCounter(0),
218  fAnalCuts(analCuts),
219  fListCuts(0),
220  fListWeight(0),
221  fHistoMCNch(0x0),
222  fUseOnTheFlyV0(useOnTheFly),
223  fIsEventSelected(kFALSE),
224  fVariablesTreeSgn(0),
225  fVariablesTreeBkg(0),
226  fCandidateVariables(),
227  fIspA(kFALSE),
228  fHistoEvents(0),
229  fHistoLc(0),
230  fHistoLcOnTheFly(0),
231  fFillOnlySgn(kFALSE),
232  fHistoLcBeforeCuts(0),
233  fHistoFiducialAcceptance(0),
234  fHistoCodesSgn(0),
235  fHistoCodesBkg(0),
236  fHistoLcpKpiBeforeCuts(0),
237  fVtx1(0),
238 
239  fHistoDistanceLcToPrimVtx(0),
240  fHistoDistanceV0ToPrimVtx(0),
241  fHistoDistanceV0ToLc(0),
242 
243  fHistoDistanceLcToPrimVtxSgn(0),
244  fHistoDistanceV0ToPrimVtxSgn(0),
245  fHistoDistanceV0ToLcSgn(0),
246 
247  fHistoVtxLcResidualToPrimVtx(0),
248  fHistoVtxV0ResidualToPrimVtx(0),
249  fHistoVtxV0ResidualToLc(0),
250 
251  fHistoMassV0All(0),
252  fHistoDecayLengthV0All(0),
253  fHistoLifeTimeV0All(0),
254 
255  fHistoMassV0True(0),
256  fHistoDecayLengthV0True(0),
257  fHistoLifeTimeV0True(0),
258 
259  fHistoMassV0TrueFromAOD(0),
260 
261  fHistoMassV0TrueK0S(0),
262  fHistoDecayLengthV0TrueK0S(0),
263  fHistoLifeTimeV0TrueK0S(0),
264 
265  fHistoMassV0TrueK0SFromAOD(0),
266 
267  fHistoMassLcAll(0),
268  fHistoDecayLengthLcAll(0),
269  fHistoLifeTimeLcAll(0),
270 
271  fHistoMassLcTrue(0),
272  fHistoDecayLengthLcTrue(0),
273  fHistoLifeTimeLcTrue(0),
274 
275  fHistoMassLcTrueFromAOD(0),
276 
277  fHistoMassV0fromLcAll(0),
278  fHistoDecayLengthV0fromLcAll(0),
279  fHistoLifeTimeV0fromLcAll(0),
280 
281  fHistoMassV0fromLcTrue(0),
282  fHistoDecayLengthV0fromLcTrue(0),
283  fHistoLifeTimeV0fromLcTrue(0),
284 
285  fHistoMassLcSgn(0),
286  fHistoMassLcSgnFromAOD(0),
287  fHistoDecayLengthLcSgn(0),
288  fHistoLifeTimeLcSgn(0),
289 
290  fHistoMassV0fromLcSgn(0),
291  fHistoDecayLengthV0fromLcSgn(0),
292  fHistoLifeTimeV0fromLcSgn(0),
293 
294  fHistoKF(0),
295  fHistoKFV0(0),
296  fHistoKFLc(0),
297 
298  fHistoMassKFV0(0),
299  fHistoDecayLengthKFV0(0),
300  fHistoLifeTimeKFV0(0),
301 
302  fHistoMassKFLc(0),
303  fHistoDecayLengthKFLc(0),
304  fHistoLifeTimeKFLc(0),
305 
306  fHistoArmenterosPodolanskiV0KF(0),
307  fHistoArmenterosPodolanskiV0KFSgn(0),
308  fHistoArmenterosPodolanskiV0AOD(0),
309  fHistoArmenterosPodolanskiV0AODSgn(0),
310 
311  fOutputKF(0),
312  fmcLabelLc(-1),
313  ftopoConstraint(kTRUE),
314  fCallKFVertexing(kFALSE),
315  fKeepingOnlyHIJINGBkg(kFALSE),
316  fUtils(0),
317  fHistoBackground(0),
318  fCutKFChi2NDF(999999.),
319  fCutKFDeviationFromVtx(999999.),
320  fCutKFDeviationFromVtxV0(0.),
321  fCurrentEvent(-1),
322  fBField(0),
323  fKeepingOnlyPYTHIABkg(kFALSE),
324  fHistoMCLcK0SpGen(0x0),
325  fHistoMCLcK0SpGenAcc(0x0),
326  fHistoMCLcK0SpGenLimAcc(0x0),
327  fTriggerMask(0),
328 
329  fFuncWeightPythia(0),
330  fFuncWeightFONLL5overLHC13d3(0),
331  fFuncWeightFONLL5overLHC13d3Lc(0)
332 {
333  //
335  //
336  Info("AliAnalysisTaskSELc2V0bachelorTMVA","Calling Constructor");
337 
338  DefineOutput(1, TList::Class()); // Tree signal + Tree Bkg + histoEvents
339  DefineOutput(2, AliNormalizationCounter::Class()); // normalization counter object
340  DefineOutput(3, TList::Class()); // Cuts
341  DefineOutput(4, TTree::Class()); // Tree signal + Tree Bkg + histoEvents
342  DefineOutput(5, TTree::Class()); // Tree signal + Tree Bkg + histoEvents
343  DefineOutput(6, TList::Class()); // Tree signal + Tree Bkg + histoEvents
344  DefineOutput(7, TList::Class()); // weights
345 }
346 
347 //___________________________________________________________________________
349  //
351  //
352  Info("~AliAnalysisTaskSELc2V0bachelorTMVA","Calling Destructor");
353 
354  if (fOutput) {
355  delete fOutput;
356  fOutput = 0;
357  }
358 
359  if (fPIDResponse) {
360  delete fPIDResponse;
361  }
362 
363  if (fPIDCombined) {
364  delete fPIDCombined;
365  }
366 
367  if (fCounter) {
368  delete fCounter;
369  fCounter = 0;
370  }
371 
372  if (fAnalCuts) {
373  delete fAnalCuts;
374  fAnalCuts = 0;
375  }
376 
377  if (fListCuts) {
378  delete fListCuts;
379  fListCuts = 0;
380  }
381 
382  if (fListWeight) {
383  delete fListWeight;
384  fListWeight = 0;
385  }
386 
387  if(fVariablesTreeSgn){
388  delete fVariablesTreeSgn;
389  fVariablesTreeSgn = 0;
390  }
391 
392  if(fVariablesTreeBkg){
393  delete fVariablesTreeBkg;
394  fVariablesTreeBkg = 0;
395  }
396 
397  if (fOutputKF) {
398  delete fOutputKF;
399  fOutputKF = 0;
400  }
401 
402  if (fUtils) {
403  delete fUtils;
404  fUtils = 0;
405  }
406 
407 }
408 //_________________________________________________
410  //
412  //
413 
414  fIsEventSelected=kFALSE;
415 
416  if (fDebug > 1) AliInfo("Init");
417 
418  fListCuts = new TList();
419  fListCuts->SetOwner();
421  PostData(3,fListCuts);
422 
423  // Save the weight functions or histograms
424  fListWeight = new TList();
425  fListWeight->Add(fHistoMCNch);
426  PostData(7,fListWeight);
427 
429 
430  return;
431 }
432 
433 //________________________________________ terminate ___________________________
435 {
439 
440  AliInfo("Terminate");
441  AliAnalysisTaskSE::Terminate();
442 
443  fOutput = dynamic_cast<TList*> (GetOutputData(1));
444  if (!fOutput) {
445  AliError("fOutput not available");
446  return;
447  }
448 
449 
450  //AliDebug(2, Form("At MC level, %f Lc --> K0S + p were found", fHistoMCLcK0SpGen->GetEntries()));
451  //AliDebug(2, Form("At MC level, %f Lc --> K0S + p were found in the acceptance", fHistoMCLcK0SpGenAcc->GetEntries()));
452  //AliDebug(2, Form("At Reco level, %lld Lc --> K0S + p were found", fVariablesTreeSgn->GetEntries()));
453  if(fHistoMCLcK0SpGen) {
454  AliInfo(Form("At MC level, %f Lc --> K0S + p were found", fHistoMCLcK0SpGen->GetEntries()));
455  } else {
456  AliInfo("fHistoMCLcK0SpGen not available");
457  }
459  AliInfo(Form("At MC level, %f Lc --> K0S + p were found in the acceptance", fHistoMCLcK0SpGenAcc->GetEntries()));
460  } else {
461  AliInfo("fHistoMCLcK0SpGenAcc not available");
462  }
463  if(fVariablesTreeSgn) {
464  AliInfo(Form("At Reco level, %lld Lc --> K0S + p were found", fVariablesTreeSgn->GetEntries()));
465  } else {
466  AliInfo("fVariablesTreeSgn not available");
467  }
468 
469  fOutputKF = dynamic_cast<TList*> (GetOutputData(6));
470  if (!fOutputKF) {
471  AliError("fOutputKF not available");
472  return;
473  }
474 
475  return;
476 }
477 
478 //___________________________________________________________________________
481  AliInfo(Form("CreateOutputObjects of task %s\n", GetName()));
482 
483  //slot #1
484  //OpenFile(1);
485  fOutput = new TList();
486  fOutput->SetOwner();
487  fOutput->SetName("listTrees");
488 
489  // Output slot 1: list of 2 trees (Sgn + Bkg) of the candidate variables
490  const char* nameoutput = GetOutputSlot(1)->GetContainer()->GetName();
491  fVariablesTreeSgn = new TTree(Form("%s_Sgn", nameoutput), "Candidates variables tree, Signal");
492  fVariablesTreeBkg = new TTree(Form("%s_Bkg", nameoutput), "Candidates variables tree, Background");
493  Int_t nVar = 90;
494  fCandidateVariables = new Float_t [nVar];
495  TString * fCandidateVariableNames = new TString[nVar];
496  fCandidateVariableNames[0]="massLc2K0Sp";
497  fCandidateVariableNames[1]="massLc2Lambdapi";
498  fCandidateVariableNames[2]="massK0S";
499  fCandidateVariableNames[3]="massLambda";
500  fCandidateVariableNames[4]="massLambdaBar";
501  fCandidateVariableNames[5]="cosPAK0S";
502  fCandidateVariableNames[6]="dcaV0";
503  fCandidateVariableNames[7]="tImpParBach";
504  fCandidateVariableNames[8]="tImpParV0";
505  fCandidateVariableNames[9]="nSigmaTPCpr";
506  fCandidateVariableNames[10]="nSigmaTPCpi";
507  fCandidateVariableNames[11]="nSigmaTPCka";
508  fCandidateVariableNames[12]="nSigmaTOFpr";
509  fCandidateVariableNames[13]="nSigmaTOFpi";
510  fCandidateVariableNames[14]="nSigmaTOFka";
511  fCandidateVariableNames[15]="bachelorPt";
512  fCandidateVariableNames[16]="V0positivePt";
513  fCandidateVariableNames[17]="V0negativePt";
514  fCandidateVariableNames[18]="dcaV0pos";
515  fCandidateVariableNames[19]="dcaV0neg";
516  fCandidateVariableNames[20]="v0Pt";
517  fCandidateVariableNames[21]="massGamma";
518  fCandidateVariableNames[22]="LcPt";
519  fCandidateVariableNames[23]="combinedProtonProb";
520  fCandidateVariableNames[24]="LcEta";
521  fCandidateVariableNames[25]="V0positiveEta";
522  fCandidateVariableNames[26]="V0negativeEta";
523  fCandidateVariableNames[27]="TPCProtonProb";
524  fCandidateVariableNames[28]="TOFProtonProb";
525  fCandidateVariableNames[29]="bachelorEta";
526  fCandidateVariableNames[30]="LcP";
527  fCandidateVariableNames[31]="bachelorP";
528  fCandidateVariableNames[32]="v0P";
529  fCandidateVariableNames[33]="V0positiveP";
530  fCandidateVariableNames[34]="V0negativeP";
531  fCandidateVariableNames[35]="LcY";
532  fCandidateVariableNames[36]="v0Y";
533  fCandidateVariableNames[37]="bachelorY";
534  fCandidateVariableNames[38]="V0positiveY";
535  fCandidateVariableNames[39]="V0negativeY";
536  fCandidateVariableNames[40]="v0Eta";
537  fCandidateVariableNames[41]="DecayLengthLc";
538  fCandidateVariableNames[42]="DecayLengthK0S";
539  fCandidateVariableNames[43]="CtLc";
540  fCandidateVariableNames[44]="CtK0S";
541  fCandidateVariableNames[45]="bachCode";
542  fCandidateVariableNames[46]="k0SCode";
543 
544  fCandidateVariableNames[47]="V0KFmass";
545  fCandidateVariableNames[48]="V0KFdecayLength";
546  fCandidateVariableNames[49]="V0KFlifeTime";
547 
548  fCandidateVariableNames[50]="V0KFmassErr";
549  fCandidateVariableNames[51]="V0KFdecayTimeErr";
550  fCandidateVariableNames[52]="V0KFlifeTimeErr";
551 
552  fCandidateVariableNames[53]="LcKFmass";
553  fCandidateVariableNames[54]="LcKFdecayLength";
554  fCandidateVariableNames[55]="LcKFlifeTime";
555 
556  fCandidateVariableNames[56]="LcKFmassErr";
557  fCandidateVariableNames[57]="LcKFdecayTimeErr";
558  fCandidateVariableNames[58]="LcKFlifeTimeErr";
559 
560  fCandidateVariableNames[59]="LcKFDistToPrimVtx";
561  fCandidateVariableNames[60]="V0KFDistToPrimVtx";
562  fCandidateVariableNames[61]="V0KFDistToLc";
563  fCandidateVariableNames[62]="alphaArmKF";
564  fCandidateVariableNames[63]="ptArmKF";
565  fCandidateVariableNames[64]="alphaArm";
566  fCandidateVariableNames[65]="ptArm";
567 
568  fCandidateVariableNames[66]="ITSrefitV0pos";
569  fCandidateVariableNames[67]="ITSrefitV0neg";
570 
571  fCandidateVariableNames[68]="TPCClV0pos";
572  fCandidateVariableNames[69]="TPCClV0neg";
573 
574  fCandidateVariableNames[70]="v0Xcoord";
575  fCandidateVariableNames[71]="v0Ycoord";
576  fCandidateVariableNames[72]="v0Zcoord";
577  fCandidateVariableNames[73]="primVtxX";
578  fCandidateVariableNames[74]="primVtxY";
579  fCandidateVariableNames[75]="primVtxZ";
580 
581  fCandidateVariableNames[76]="ITSclBach";
582  fCandidateVariableNames[77]="SPDclBach";
583 
584  fCandidateVariableNames[78]="ITSclV0pos";
585  fCandidateVariableNames[79]="SPDclV0pos";
586  fCandidateVariableNames[80]="ITSclV0neg";
587  fCandidateVariableNames[81]="SPDclV0neg";
588 
589  fCandidateVariableNames[82]="alphaArmLc";
590  fCandidateVariableNames[83]="alphaArmLcCharge";
591  fCandidateVariableNames[84]="ptArmLc";
592 
593  fCandidateVariableNames[85]="CosThetaStar";
594 
595  fCandidateVariableNames[86]="weightPtFlat";
596  fCandidateVariableNames[87]="weightFONLL5overLHC13d3";
597  fCandidateVariableNames[88]="weightFONLL5overLHC13d3Lc";
598  fCandidateVariableNames[89]="weightNch";
599 
600 
601  for(Int_t ivar=0; ivar<nVar; ivar++){
602  fVariablesTreeSgn->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
603  fVariablesTreeBkg->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
604  }
605 
606  fHistoEvents = new TH1F("fHistoEvents", "fHistoEvents", 2, -0.5, 1.5);
607  TString labelEv[2] = {"NotSelected", "Selected"};
608  for (Int_t ibin = 1; ibin <= fHistoEvents->GetNbinsX(); ibin++){
609  fHistoEvents->GetXaxis()->SetBinLabel(ibin, labelEv[ibin-1].Data());
610  }
611 
612  fHistoLc = new TH1F("fHistoLc", "fHistoLc", 2, -0.5, 1.5);
613 
614  fHistoLcOnTheFly = new TH1F("fHistoLcOnTheFly", "fHistoLcOnTheFly", 4, -0.5, 3.5);
615  TString labelOnTheFly[4] = {"OnTheFly-Bkg", "OfflineBkg", "OnTheFly-Sgn", "OfflineSgn"};
616  for (Int_t ibin = 1; ibin <= fHistoLcOnTheFly->GetNbinsX(); ibin++){
617  fHistoLcOnTheFly->GetXaxis()->SetBinLabel(ibin, labelOnTheFly[ibin-1].Data());
618  }
619 
620  fHistoLcBeforeCuts = new TH1F("fHistoLcBeforeCuts", "fHistoLcBeforeCuts", 2, -0.5, 1.5);
621  TString labelBeforeCuts[2] = {"Bkg", "Sgn"};
622  for (Int_t ibin = 1; ibin <= fHistoLcBeforeCuts->GetNbinsX(); ibin++){
623  fHistoLcBeforeCuts->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].Data());
624  fHistoLc->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].Data());
625  }
626 
627  fHistoFiducialAcceptance = new TH1F("fHistoFiducialAcceptance", "fHistoFiducialAcceptance", 4, -0.5, 3.5);
628  TString labelAcc[4] = {"NotOk-Bkg", "Ok-Bkg", "NotOk-Sgn", "Ok-Sgn"};
629  for (Int_t ibin = 1; ibin <= fHistoFiducialAcceptance->GetNbinsX(); ibin++){
630  fHistoFiducialAcceptance->GetXaxis()->SetBinLabel(ibin, labelAcc[ibin-1].Data());
631  }
632 
633  fHistoCodesSgn = new TH2F("fHistoCodesSgn", "fHistoCodes for Signal; bachelor; K0S", 7, -1.5, 5.5, 9, -1.5, 7.5);
634  fHistoCodesBkg = new TH2F("fHistoCodesBkg", "fHistoCodes for Background; bachelor; K0S", 7, -1.5, 5.5, 9, -1.5, 7.5);
635 
636  TString labelx[7] = { "kBachInvalid", "kBachFake", "kBachNoProton", "kBachPrimary", "kBachNoLambdaMother",
637  "kBachDifferentLambdaMother", "kBachCorrectLambdaMother"};
638  TString labely[9] = { "kK0SInvalid", "kK0SFake", "kK0SNoK0S", "kK0SWithoutMother", "kK0SNotFromK0",
639  "kK0Primary", "kK0NoLambdaMother", "kK0DifferentLambdaMother", "kK0CorrectLambdaMother"};
640 
641  for (Int_t ibin = 1; ibin <= fHistoCodesSgn->GetNbinsX(); ibin++){
642  fHistoCodesSgn->GetXaxis()->SetBinLabel(ibin, labelx[ibin-1].Data());
643  fHistoCodesBkg->GetXaxis()->SetBinLabel(ibin, labelx[ibin-1].Data());
644  }
645  for (Int_t ibin = 1; ibin <= fHistoCodesSgn->GetNbinsY(); ibin++){
646  fHistoCodesSgn->GetYaxis()->SetBinLabel(ibin, labely[ibin-1].Data());
647  fHistoCodesBkg->GetYaxis()->SetBinLabel(ibin, labely[ibin-1].Data());
648  }
649 
650  fHistoLcpKpiBeforeCuts = new TH1F("fHistoLcpKpiBeforeCuts", "fHistoLcpKpiBeforeCuts", 2, -0.5, 1.5);
651  for (Int_t ibin = 1; ibin <= fHistoLcpKpiBeforeCuts->GetNbinsX(); ibin++){
652  fHistoLcpKpiBeforeCuts->GetXaxis()->SetBinLabel(ibin, labelBeforeCuts[ibin-1].Data());
653  }
654 
655  fHistoBackground = new TH1F("fHistoBackground", "fHistoBackground", 4, -0.5, 3.5);
656  TString labelBkg[4] = {"Injected", "Non-injected", "Non-PYTHIA", "PYTHIA"};
657  for (Int_t ibin = 1; ibin <= fHistoBackground->GetNbinsX(); ibin++){
658  fHistoBackground->GetXaxis()->SetBinLabel(ibin, labelBkg[ibin-1].Data());
659  }
660 
661  //fOutput->Add(fVariablesTreeSgn);
662  //fOutput->Add(fVariablesTreeBkg);
663 
664  const Float_t ptbins[15] = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 12., 17., 25., 35.};
665 
666  fHistoMCLcK0SpGen = new TH1F("fHistoMCLcK0SpGen", "fHistoMCLcK0SpGen", 14, ptbins);
667  fHistoMCLcK0SpGenAcc = new TH1F("fHistoMCLcK0SpGenAcc", "fHistoMCLcK0SpGenAcc", 14, ptbins);
668  fHistoMCLcK0SpGenLimAcc = new TH1F("fHistoMCLcK0SpGenLimAcc", "fHistoMCLcK0SpGenLimAcc", 14, ptbins);
669 
670  fOutput->Add(fHistoEvents);
671  fOutput->Add(fHistoLc);
675  fOutput->Add(fHistoCodesSgn);
676  fOutput->Add(fHistoCodesBkg);
682 
683  PostData(1, fOutput);
684  PostData(4, fVariablesTreeSgn);
685  PostData(5, fVariablesTreeBkg);
686  AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
687  AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
688  fPIDResponse = inputHandler->GetPIDResponse();
689 
690  if (fAnalCuts->GetIsUsePID()){
691  /*
692  fAnalCuts->GetPidHF()->SetPidResponse(fPIDResponse);
693  fAnalCuts->GetPidV0pos()->SetPidResponse(fPIDResponse);
694  fAnalCuts->GetPidV0neg()->SetPidResponse(fPIDResponse);
695  fAnalCuts->GetPidHF()->SetOldPid(kFALSE);
696  fAnalCuts->GetPidV0pos()->SetOldPid(kFALSE);
697  fAnalCuts->GetPidV0neg()->SetOldPid(kFALSE);
698  */
699  fAnalCuts->SetUsePID(kFALSE); // I don't want to use the PID through the cut object, but I will use the PID response directly!!!
700  }
701 
702  // Setting properties of PID
703  fPIDCombined=new AliPIDCombined;
704  fPIDCombined->SetDefaultTPCPriors();
705  fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
706  //fPIDCombined->SetPriorDistribution((AliPID::EParticleType)ispec,fPriors[ispec]);
707 
708  fCounter = new AliNormalizationCounter("NormalizationCounter");
709  fCounter->Init();
710  PostData(2, fCounter);
711 
712  // Histograms from KF
713 
714  if (fCallKFVertexing){
715  fHistoDistanceLcToPrimVtx = new TH1D("fHistoDistanceLcToPrimVtx", "Lc distance to Prim Vertex from KF; distance [cm]", 1000, 0., 1);
716  fHistoDistanceV0ToPrimVtx = new TH1D("fHistoDistanceV0ToPrimVtx", "V0 distance to Prim Vertex from KF; distance [cm]", 1000, 0., 100.);
717  fHistoDistanceV0ToLc = new TH1D("fHistoDistanceV0ToLc", "V0 distance to Lc Vertex from KF; distance [cm]", 1000, 0., 100.);
718 
719  fHistoDistanceLcToPrimVtxSgn = new TH1D("fHistoDistanceLcToPrimVtxSgn", "Lc Sgn distance to Prim Vertex from KF; distance [cm]", 1000, 0., 1);
720  fHistoDistanceV0ToPrimVtxSgn = new TH1D("fHistoDistanceV0ToPrimVtxSgn", "V0 Sgn distance to Prim Vertex from KF; distance [cm]", 1000, 0., 100.);
721  fHistoDistanceV0ToLcSgn = new TH1D("fHistoDistanceV0ToLcSgn", "V0 Sgn distance to Lc Vertex from KF; distance [cm]", 1000, 0., 100.);
722 
723  fHistoVtxLcResidualToPrimVtx = new TH1D("fHistoVtxLcResidualToPrimVtx", "Residual between MC and KF (MC - KF): Lc to Prim Vtx; distance [cm]", 1000, -5., 5.);
724  fHistoVtxV0ResidualToPrimVtx = new TH1D("fHistoVtxV0ResidualToPrimVtx", "Residual between MC and KF (MC - KF): V0 to Prim Vtx; distance [cm]", 1000, -5., 5.);
725  fHistoVtxV0ResidualToLc = new TH1D("fHistoVtxV0ResidualToLc", "Residual between MC and KF: V0 to Lc (MC - KF); distance [cm]", 1000, -5., 5.);
726 
727  fHistoMassV0All = new TH1D("fHistoMassV0All", "V0 Mass; mass", 500, 0.4, 0.6);
728  fHistoDecayLengthV0All = new TH1D("fHistoDecayLengthV0All", "V0 Decay Length; decayLength", 500, -10, 10.0);
729  fHistoLifeTimeV0All = new TH1D("fHistoLifeTimeV0All", "V0 Life Time; lifeTime", 500, -10.0, 10.0);
730 
731  fHistoMassV0True = new TH1D("fHistoMassV0True", "True V0 Mass; mass", 500, 0.4, 0.6);
732  fHistoDecayLengthV0True = new TH1D("fHistoDecayLengthV0True", "True V0 Decay Length; decayLength", 500, -10, 10.0);
733  fHistoLifeTimeV0True = new TH1D("fHistoLifeTimeV0True", "True V0 Life Time; lifeTime", 500, -10.0, 10.0);
734 
735  fHistoMassV0TrueFromAOD = new TH1D("fHistoMassV0TrueFormAOD", "True V0 Mass (AOD); mass", 500, 0.4, 0.6);
736 
737  fHistoMassV0TrueK0S = new TH1D("fHistoMassV0TrueK0S", "True V0-K0S Mass; mass", 500, 0.4, 0.6);
738  fHistoDecayLengthV0TrueK0S = new TH1D("fHistoDecayLengthV0TrueK0S", "True V0-K0S Decay Length; decayLength", 500, -10, 10.0);
739  fHistoLifeTimeV0TrueK0S = new TH1D("fHistoLifeTimeV0TrueK0S", "True V0-K0S Life Time; lifeTime", 500, -10.0, 10.0);
740 
741  fHistoMassV0TrueK0SFromAOD = new TH1D("fHistoMassV0TrueK0SFormAOD", "True V0-K0S Mass (AOD); mass", 500, 0.4, 0.6);
742 
743  fHistoMassLcAll = new TH1D("fHistoMassLcAll", "Lc Mass; mass", 500, 2.0, 3.0);
744  fHistoDecayLengthLcAll = new TH1D("fHistoDecayLengthLcAll", "Lc Decay Length; decayLenght", 100000, -0.1, 0.1);
745  fHistoLifeTimeLcAll = new TH1D("fHistoLifeTimeLcAll", "Lc Life Time; lifeTime", 100000, -0.1, 0.1);
746 
747  fHistoMassLcTrue = new TH1D("fHistoMassLcTrue", "True Lc Mass; mass", 500, 2.0, 3.0);
748  fHistoDecayLengthLcTrue = new TH1D("fHistoDecayLengthLcTrue", "True Lc Decay Length; decayLength", 100000, -0.1, 0.1);
749  fHistoLifeTimeLcTrue = new TH1D("fHistoLifeTimeLcTrue", "True Lc Life Time; lifeTime", 100000, -0.1, 0.1);
750 
751  fHistoMassLcTrueFromAOD = new TH1D("fHistoMassLcTrueFromAOD", "True Lc Mass (AOD); mass", 500, 2.0, 3.0);
752 
753  fHistoMassV0fromLcAll = new TH1D("fHistoMassV0fromLcAll", "V0 mass from Lc built in KF; mass", 500, 0.4, 0.6);
754  fHistoDecayLengthV0fromLcAll = new TH1D("fHistoDecayLengthV0fromLcAll", "V0 Decay Length from Lc built in KF; decayLength", 500, 0, 10.0);
755  fHistoLifeTimeV0fromLcAll = new TH1D("fHistoLifeTimeV0fromLcAll", "V0 Life Time from Lc built in KF; lifeTime", 500, 0.0, 3.0);
756 
757  fHistoMassV0fromLcTrue = new TH1D("fHistoMassV0fromLcTrue", "V0 mass from true Lc built in KF; mass", 500, 0.4, 0.6);
758  fHistoDecayLengthV0fromLcTrue= new TH1D("fHistoDecayLengthV0fromLcTrue", "V0 Decay Length from true Lc built in KF; decayLength", 500, 0, 10.0);
759  fHistoLifeTimeV0fromLcTrue = new TH1D("fHistoLifeTimeV0fromLcTrue", "V0 Life Time from true Lc built in KF; lifeTime", 500, 0.0, 3.0);
760 
761  fHistoMassLcSgn = new TH1D("fHistoMassLcSgn", "True Lc Signal Mass; mass", 500, 2.0, 3.0);
762  fHistoMassLcSgnFromAOD = new TH1D("fHistoMassLcSgnFromAOD", "True Lc Signal Mass (AOD); mass", 500, 2.0, 3.0);
763  fHistoDecayLengthLcSgn = new TH1D("fHistoDecayLengthLcSgn", "True Lc Signal Decay Length; decayLength", 100000, -0.1, 0.1);
764  fHistoLifeTimeLcSgn = new TH1D("fHistoLifeTimeLcSgn", "True Lc Signal Life Time; lifeTime", 100000, -0.1, 0.1);
765 
766  fHistoMassV0fromLcSgn = new TH1D("fHistoMassV0fromLcSgn", "V0 from True Lc Signal Mass; mass", 500, 0.4, 0.6);
767  fHistoDecayLengthV0fromLcSgn = new TH1D("fHistoDecayLengthV0fromLcSgn", "V0 True Lc Signal Decay Length; decayLength", 500, 0, 10.0);
768  fHistoLifeTimeV0fromLcSgn = new TH1D("fHistoLifeTimeV0fromLcSgn", "V0 True Lc Signal Life Time; lifeTime", 500, 0.0, 3.0);
769 
770  fHistoKF = new TH2D("fHistoKF", "Summary from KF; V0 KF; Lc KF", 16, -0.5, 15.5, 16, -0.5, 15.5);
771  fHistoKFV0 = new TH1D("fHistoKFV0", "Summary from KF; V0 KF", 16, -0.5, 15.5);
772  fHistoKFLc = new TH1D("fHistoKFLc", "Summary from KF; V0 KF", 16, -0.5, 15.5);
773  TString axisLabel[16] = {"AllOk", "M_NotOk", "Sm_NotOk", "Dl_NotOk",
774  "Lt_NotOk", "M_Sm_NotOk", "M_Dl_NotOk", "M_Lt_NotOk",
775  "Dl_Sm_NotOk", "Dl_Lt_NotOk", "Sm_Lt_NotOk", "M_Sm_Dl_NotOk",
776  "M_Sm_Lt_NotOk", "Sm_Dl_Lt_NotOk", "M_Dl_Lt_NotOk", "All_NotOk"};
777 
778  for (Int_t ibin = 1; ibin <=16; ibin++){
779  fHistoKF->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].Data());
780  fHistoKF->GetYaxis()->SetBinLabel(ibin, axisLabel[ibin-1].Data());
781  fHistoKFV0->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].Data());
782  fHistoKFLc->GetXaxis()->SetBinLabel(ibin, axisLabel[ibin-1].Data());
783  }
784 
785  fHistoMassKFV0 = new TH2D("fHistoMassKFV0", "mass vs sigmaMass for V0; mass; sigmaMass", 500, 0.4, 0.6, 500, 0., 10);
786  fHistoDecayLengthKFV0 = new TH2D("fHistoDecayLengthKFV0", "decayLength vs sigmaDecayLength for V0; decayLength; sigmaDecayLength", 500, -10, 10, 500, 0., 10);
787  fHistoLifeTimeKFV0 = new TH2D("fHistoLifeTimeKFV0", "lifeTime vs sigmalifeTime for V0; lifeTime; sigmaLifeTime", 500, -10, 10, 500, 0., 10);
788 
789  fHistoMassKFLc = new TH2D("fHistoMassKFLc", "mass vs sigmaMass for Lc; mass; sigmaMass", 500, 0.4, 0.6, 500, 0., 10);
790  fHistoDecayLengthKFLc = new TH2D("fHistoDecayLengthKFLc", "decayLength vs sigmaDecayLength for Lc; decayLength; sigmaDecayLength", 500, -10, 10, 500, 0., 10);
791  fHistoLifeTimeKFLc = new TH2D("fHistoLifeTimeKFLc", "lifeTime vs sigmalifeTime for Lc; lifeTime; sigmaLifeTime", 500, -10, 10, 500, 0., 10);
792 
793  fHistoArmenterosPodolanskiV0KF = new TH2D("fHistoArmenterosPodolanskiV0KF", "V0 ArmenterosPodolanski from KF; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
794  fHistoArmenterosPodolanskiV0KFSgn = new TH2D("fHistoArmenterosPodolanskiV0KFSgn", "V0 (signal) ArmenterosPodolanski from KF; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
795  fHistoArmenterosPodolanskiV0AOD = new TH2D("fHistoArmenterosPodolanskiV0AOD", "V0 ArmenterosPodolanski from AOD; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
796  fHistoArmenterosPodolanskiV0AODSgn = new TH2D("fHistoArmenterosPodolanskiV0AODSgn", "V0 (signal) ArmenterosPodolanski from AOD; #alpha; Qt", 1000, -1, 1, 1000, 0, 1);
797  }
798 
799  fOutputKF = new TList();
800  fOutputKF->SetOwner();
801  fOutputKF->SetName("listHistoKF");
802 
803  if (fCallKFVertexing){
807 
811 
815 
819 
823 
825 
829 
831 
835 
839 
841 
845 
849 
854 
858 
859  fOutputKF->Add(fHistoKF);
860  fOutputKF->Add(fHistoKFV0);
861  fOutputKF->Add(fHistoKFLc);
862 
866 
870 
875  }
876 
877  // weight function from ratio of flat value (1/30) to pythia
878  // use to normalise to flat distribution (should lead to flat pT distribution)
879  fFuncWeightPythia = new TF1("funcWeightPythia","1./(30. *[0]*x/TMath::Power(1.+(TMath::Power((x/[1]),[3])),[2]))",0.15,30);
880  fFuncWeightPythia->SetParameters(0.36609,1.94635,1.40463,2.5);
881 
882  // weight function from the ratio of the LHC13d3 MC
883  // and FONLL calculations for pp data
884  fFuncWeightFONLL5overLHC13d3 = new TF1("funcWeightFONLL5overLHC13d3","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,30.);
885  fFuncWeightFONLL5overLHC13d3->SetParameters(2.94999e+00,3.47032e+00,2.81278e+00,2.5,1.93370e-02,3.86865e+00,-1.54113e-01,8.86944e-02,2.56267e-02);
886 
887  fFuncWeightFONLL5overLHC13d3Lc = new TF1("funcWeightFONLL5overLHC13d3Lc","([0]*x)/TMath::Power([2],(1+TMath::Power([3],x/[1])))+[4]*TMath::Exp([5]+[6]*x)+[7]*TMath::Exp([8]*x)",0.15,20.);
888  fFuncWeightFONLL5overLHC13d3Lc->SetParameters(5.94428e+01,1.63585e+01,9.65555e+00,6.71944e+00,8.88338e-02,2.40477e+00,-4.88649e-02,-6.78599e-01,-2.10951e-01);
889 
890  PostData(6, fOutputKF);
891 
892  return;
893 }
894 
895 //_________________________________________________
897 {
899  if (!fInputEvent) {
900  AliError("NO EVENT FOUND!");
901  return;
902  }
903 
904  fCurrentEvent++;
905  AliDebug(2, Form("Processing event = %d", fCurrentEvent));
906  AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
907  TClonesArray *arrayLctopKos=0;
908 
909  TClonesArray *array3Prong = 0;
910 
911  if (!aodEvent && AODEvent() && IsStandardAOD()) {
912  // In case there is an AOD handler writing a standard AOD, use the AOD
913  // event in memory rather than the input (ESD) event.
914  aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
915  // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
916  // have to taken from the AOD event hold by the AliAODExtension
917  AliAODHandler* aodHandler = (AliAODHandler*)
918  ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
919 
920  if (aodHandler->GetExtensions()) {
921  AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
922  AliAODEvent *aodFromExt = ext->GetAOD();
923  arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject("CascadesHF");
924 
925  array3Prong=(TClonesArray*)aodFromExt->GetList()->FindObject("Charm3Prong");
926  }
927  } else {
928  arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
929 
930  array3Prong=(TClonesArray*)aodEvent->GetList()->FindObject("Charm3Prong");
931  }
932 
933  if (!fUseMCInfo && fIspA) {
936  }
937 
938  Int_t runnumber = aodEvent->GetRunNumber();
939  if (aodEvent->GetTriggerMask() == 0 && (runnumber >= 195344 && runnumber <= 195677)){
940  AliDebug(3,"Event rejected because of null trigger mask");
941  return;
942  }
943 
945 
946  // mc analysis
947  TClonesArray *mcArray = 0;
948  AliAODMCHeader *mcHeader=0;
949 
950  if (fUseMCInfo) {
951  // MC array need for matching
952  mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
953  if (!mcArray) {
954  AliError("Could not find Monte-Carlo in AOD");
955  return;
956  }
957  // load MC header
958  mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
959  if (!mcHeader) {
960  AliError("AliAnalysisTaskSELc2V0bachelorTMVA::UserExec: MC header branch not found!\n");
961  return;
962  }
963 
964  Double_t zMCVertex = mcHeader->GetVtxZ();
965  if (TMath::Abs(zMCVertex) > fAnalCuts->GetMaxVtxZ()){
966  AliDebug(3,Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fAnalCuts->GetMaxVtxZ(), fAnalCuts->GetMaxVtxZ()));
967  AliInfo(Form("z coordinate of MC vertex = %f, it was required to be within [-%f, +%f], skipping event", zMCVertex, fAnalCuts->GetMaxVtxZ(), fAnalCuts->GetMaxVtxZ()));
968  return;
969  }
970 
971  //Printf("Filling MC histo");
972  FillMCHisto(mcArray);
973  }
974 
975  // AOD primary vertex
976  fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
977  if (!fVtx1) return;
978  if (fVtx1->GetNContributors()<1) return;
979 
981 
982  if ( !fIsEventSelected ) {
983  fHistoEvents->Fill(0);
984  return; // don't take into account not selected events
985  }
986  fHistoEvents->Fill(1);
987 
988  // Setting magnetic field for KF vertexing
989  fBField = aodEvent->GetMagneticField();
990  AliKFParticle::SetField(fBField);
991 
992  Int_t nSelectedAnal = 0;
993  if (fIsK0sAnalysis) {
994  MakeAnalysisForLc2prK0S(arrayLctopKos, mcArray,
995  nSelectedAnal, fAnalCuts,
996  array3Prong, mcHeader);
997  }
998  fCounter->StoreCandidates(aodEvent,nSelectedAnal,kFALSE);
999 
1000  PostData(1, fOutput);
1001  PostData(2, fCounter);
1002  PostData(4, fVariablesTreeSgn);
1003  PostData(5, fVariablesTreeBkg);
1004  PostData(6, fOutputKF);
1005 
1006 }
1007 //-------------------------------------------------------------------------------
1009 
1011  for (Int_t iPart=0; iPart<mcArray->GetEntriesFast(); iPart++) {
1012  AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(mcArray->At(iPart));
1013  if (!mcPart){
1014  AliError("Failed casting particle from MC array!, Skipping particle");
1015  continue;
1016  }
1017  Int_t pdg = mcPart->GetPdgCode();
1018  if (TMath::Abs(pdg) != 4122){
1019  AliDebug(2, Form("MC particle %d is not a Lc: its pdg code is %d", iPart, pdg));
1020  continue;
1021  }
1022  AliDebug(2, Form("Step 0 ok: MC particle %d is a Lc: its pdg code is %d", iPart, pdg));
1023  Int_t labeldaugh0 = mcPart->GetDaughter(0);
1024  Int_t labeldaugh1 = mcPart->GetDaughter(1);
1025  if (labeldaugh0 <= 0 || labeldaugh1 <= 0){
1026  AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!"));
1027  continue;
1028  }
1029  else if (labeldaugh1 - labeldaugh0 == 1){
1030  AliDebug(2, Form("Step 1 ok: The MC particle has correct daughters!!"));
1031  AliAODMCParticle* daugh0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labeldaugh0));
1032  AliAODMCParticle* daugh1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labeldaugh1));
1033  if(!daugh0 || !daugh1){
1034  AliDebug(2,"Particle daughters not properly retrieved!");
1035  return;
1036  }
1037  Int_t pdgCodeDaugh0 = TMath::Abs(daugh0->GetPdgCode());
1038  Int_t pdgCodeDaugh1 = TMath::Abs(daugh1->GetPdgCode());
1039  AliAODMCParticle* bachelorMC = daugh0;
1040  AliAODMCParticle* v0MC = daugh1;
1041  AliDebug(2, Form("pdgCodeDaugh0 = %d, pdgCodeDaugh1 = %d", pdgCodeDaugh0, pdgCodeDaugh1));
1042  if ((pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) || (pdgCodeDaugh0 == 2212 && pdgCodeDaugh1 == 311)){
1043  // 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-
1045  if (pdgCodeDaugh0 == 311 && pdgCodeDaugh1 == 2212) {
1046  bachelorMC = daugh1;
1047  v0MC = daugh0;
1048  }
1049  AliDebug(2, Form("Number of Daughters of v0 = %d", v0MC->GetNDaughters()));
1050  if (v0MC->GetNDaughters() != 1) {
1051  AliDebug(2, "The K0 does not decay in 1 body only! Impossible... Continuing...");
1052  continue;
1053  }
1054  else { // So far: Lc --> K0 + p, K0 with 1 daughter
1055  AliDebug(2, "Step 2 ok: The K0 does decay in 1 body only! ");
1056  Int_t labelK0daugh = v0MC->GetDaughter(0);
1057  AliAODMCParticle* partK0S = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelK0daugh));
1058  if(!partK0S){
1059  AliError("Error while casting particle! returning a NULL array");
1060  continue;
1061  }
1062  else { // So far: Lc --> K0 + p, K0 with 1 daughter that we can access
1063  if (partK0S->GetNDaughters() != 2 || TMath::Abs(partK0S->GetPdgCode() != 310)){
1064  AliDebug(2, "The K0 daughter is not a K0S or does not decay in 2 bodies");
1065  continue;
1066  }
1067  else { // So far: Lc --> K0 + p, K0 --> K0S, K0S in 2 bodies
1068  AliDebug(2, "Step 3 ok: The K0 daughter is a K0S and does decay in 2 bodies");
1069  Int_t labelK0Sdaugh0 = partK0S->GetDaughter(0);
1070  Int_t labelK0Sdaugh1 = partK0S->GetDaughter(1);
1071  AliAODMCParticle* daughK0S0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelK0Sdaugh0));
1072  AliAODMCParticle* daughK0S1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelK0Sdaugh1));
1073  if (!daughK0S0 || ! daughK0S1){
1074  AliDebug(2, "Could not access K0S daughters, continuing...");
1075  continue;
1076  }
1077  else { // So far: Lc --> K0 + p, K0 --> K0S, K0S in 2 bodies that we can access
1078  AliDebug(2, "Step 4 ok: Could access K0S daughters, continuing...");
1079  Int_t pdgK0Sdaugh0 = daughK0S0->GetPdgCode();
1080  Int_t pdgK0Sdaugh1 = daughK0S1->GetPdgCode();
1081  if (TMath::Abs(pdgK0Sdaugh0) != 211 || TMath::Abs(pdgK0Sdaugh1) != 211){
1082  AliDebug(2, "The K0S does not decay in pi+pi-, continuing");
1083  //AliInfo("The K0S does not decay in pi+pi-, continuing");
1084  }
1085  else { // Full chain: Lc --> K0 + p, K0 --> K0S, K0S --> pi+pi-
1086  if (fAnalCuts->IsInFiducialAcceptance(mcPart->Pt(), mcPart->Y())) {
1087  AliDebug(2, Form("----> Filling histo with pt = %f", mcPart->Pt()));
1088  if(TMath::Abs(mcPart->Y()) < 0.5) fHistoMCLcK0SpGenLimAcc->Fill(mcPart->Pt());
1089  //AliInfo(Form("\nparticle = %d, Filling MC Gen histo\n", iPart));
1090  fHistoMCLcK0SpGen->Fill(mcPart->Pt());
1091  if(!(TMath::Abs(bachelorMC->Eta()) > 0.9 || bachelorMC->Pt() < 0.1 ||
1092  TMath::Abs(daughK0S0->Eta()) > 0.9 || daughK0S0->Pt() < 0.1 ||
1093  TMath::Abs(daughK0S1->Eta()) > 0.9 || daughK0S1->Pt() < 0.1)) {
1094  fHistoMCLcK0SpGenAcc->Fill(mcPart->Pt());
1095  }
1096  }
1097  else {
1098  AliDebug(2, "not in fiducial acceptance! Skipping");
1099  continue;
1100  }
1101  }
1102  }
1103  }
1104  }
1105  }
1106  }
1107  }
1108  } // closing loop over mcArray
1109 
1110  return;
1111 
1112 }
1113 
1114 //-------------------------------------------------------------------------------
1116  TClonesArray *mcArray,
1117  Int_t &nSelectedAnal,
1118  AliRDHFCutsLctoV0 *cutsAnal, TClonesArray *array3Prong,
1119  AliAODMCHeader* aodheader){
1121 
1122  Int_t pdgCand = 4122;
1123  Int_t pdgDgLctoV0bachelor[2]={2212, 310};
1124  Int_t pdgDgV0toDaughters[2]={211, 211};
1125 
1126  Int_t pdgDgLctopKpi[3]={2212, 321, 211};
1127 
1128  // loop to search for candidates Lc->p+K+pi
1129  Int_t n3Prong = array3Prong->GetEntriesFast();
1130  Int_t nCascades= arrayLctopKos->GetEntriesFast();
1131 
1132  //AliInfo(Form("\n\n\n\n3 prong candidates = %d, ncascades = %d \n\n\n\n\n", n3Prong, nCascades));
1133  for (Int_t i3Prong = 0; i3Prong < n3Prong; i3Prong++) {
1134  AliAODRecoDecayHF3Prong *d = (AliAODRecoDecayHF3Prong*)array3Prong->UncheckedAt(i3Prong);
1135  //Filling a control histogram with no cuts
1136  if (fUseMCInfo) {
1137 
1138  // find associated MC particle for Lc -> p+K+pi
1139  Int_t mcLabel = d->MatchToMC(4122, mcArray, 3, pdgDgLctopKpi);
1140  //Int_t mcLabelTemp = d->MatchToMC(4122, mcArray);
1141  //Printf("mcLabel = %d, mcLabelTemp = %d", mcLabel, mcLabelTemp);
1142  if (mcLabel >= 0) {
1143 
1144  AliAODMCParticle *partLcpKpi = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
1145  if(partLcpKpi){
1146  Int_t pdgCode = partLcpKpi->GetPdgCode();
1147  AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1148  //AliInfo(Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1149  fHistoLcpKpiBeforeCuts->Fill(1);
1150 
1151  }
1152  }
1153  else {
1154  //AliInfo(Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~", mcLabel));
1155  fHistoLcpKpiBeforeCuts->Fill(0);
1156  }
1157  }
1158  }
1159 
1160  // loop over cascades to search for candidates Lc->p+K0S
1161 
1162  Int_t mcLabel = -1;
1163  for (Int_t iLctopK0s = 0; iLctopK0s < nCascades; iLctopK0s++) {
1164 
1165  // Lc candidates and K0s from Lc
1166  AliAODRecoCascadeHF* lcK0spr = dynamic_cast<AliAODRecoCascadeHF*>(arrayLctopKos->At(iLctopK0s));
1167  if (!lcK0spr) {
1168  AliDebug(2,Form("Cascade %d doens't exist, skipping",iLctopK0s));
1169  continue;
1170  }
1171 
1172  //Filling a control histogram with no cuts
1173  if (fUseMCInfo) {
1174 
1175  Int_t pdgCode=-2;
1176 
1177  // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
1178  fmcLabelLc = lcK0spr->MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1179  if (fmcLabelLc>=0) {
1180  AliDebug(2, Form("----> cascade number %d (total cascade number = %d) is a Lc!", iLctopK0s, nCascades));
1181 
1182  AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(fmcLabelLc));
1183  if(partLc){
1184  pdgCode = partLc->GetPdgCode();
1185  if (pdgCode<0) AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", fmcLabelLc, pdgCode));
1186  pdgCode = TMath::Abs(pdgCode);
1187  fHistoLcBeforeCuts->Fill(1);
1188  }
1189  }
1190  else {
1191  fHistoLcBeforeCuts->Fill(0);
1192  pdgCode=-1;
1193  }
1194  }
1195 
1196  //if (!lcK0spr->GetSecondaryVtx()) {
1197  // AliInfo("No secondary vertex");
1198  //continue;
1199  //}
1200 
1201  if (lcK0spr->GetNDaughters()!=2) {
1202  AliDebug(2,Form("Cascade %d has not 2 daughters (nDaughters=%d)",iLctopK0s,lcK0spr->GetNDaughters()));
1203  continue;
1204  }
1205 
1206  AliAODv0 * v0part = dynamic_cast<AliAODv0*>(lcK0spr->Getv0());
1207  AliAODTrack * bachPart = dynamic_cast<AliAODTrack*>(lcK0spr->GetBachelor());
1208  if (!v0part || !bachPart) {
1209  AliDebug(2,Form("Cascade %d has no V0 or no bachelor object",iLctopK0s));
1210  continue;
1211  }
1212 
1213 
1214  if (!v0part->GetSecondaryVtx()) {
1215  AliDebug(2,Form("No secondary vertex for V0 by cascade %d",iLctopK0s));
1216  continue;
1217  }
1218 
1219  if (v0part->GetNDaughters()!=2) {
1220  AliDebug(2,Form("current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters()));
1221  continue;
1222  }
1223 
1224  AliAODTrack * v0Pos = dynamic_cast<AliAODTrack*>(lcK0spr->Getv0PositiveTrack());
1225  AliAODTrack * v0Neg = dynamic_cast<AliAODTrack*>(lcK0spr->Getv0NegativeTrack());
1226  if (!v0Neg || !v0Pos) {
1227  AliDebug(2,Form("V0 by cascade %d has no V0positive of V0negative object",iLctopK0s));
1228  continue;
1229  }
1230 
1231 
1232  if (v0Pos->Charge() == v0Neg->Charge()) {
1233  AliDebug(2,Form("V0 by cascade %d has daughters with the same sign: IMPOSSIBLE!",iLctopK0s));
1234  continue;
1235  }
1236 
1237  Int_t isLc = 0;
1238 
1239  if (fUseMCInfo) {
1240 
1241  Int_t pdgCode = -2;
1242 
1243  // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
1244  mcLabel = lcK0spr->MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1245  if (mcLabel>=0) {
1246  AliDebug(2,Form(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s, nCascades));
1247 
1248  AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
1249  if(partLc){
1250  pdgCode = partLc->GetPdgCode();
1251  if (pdgCode<0) AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1252  pdgCode = TMath::Abs(pdgCode);
1253  isLc = 1;
1254  fHistoLc->Fill(1);
1255  }
1256  }
1257  else {
1258  fHistoLc->Fill(0);
1259  pdgCode=-1;
1260  }
1261  }
1262  AliDebug(2, Form("\n\n\n Analysing candidate %d\n", iLctopK0s));
1263  AliDebug(2, Form(">>>>>>>>>> Candidate is background, fFillOnlySgn = %d --> SKIPPING", fFillOnlySgn));
1264  if (!isLc) {
1265  if (fFillOnlySgn) { // if it is background, and we want only signal, we do not fill the tree
1266  continue;
1267  }
1268  else { // checking if we want to fill the background
1269  if (fKeepingOnlyHIJINGBkg){
1270  // we have decided to fill the background only when the candidate has the daugthers that all come from HIJING underlying event!
1271  Bool_t isCandidateInjected = fUtils->HasCascadeCandidateAnyDaughInjected(lcK0spr, aodheader, mcArray);
1272  if (!isCandidateInjected){
1273  AliDebug(2, "The candidate is from HIJING (i.e. not injected), keeping it to fill background");
1274  fHistoBackground->Fill(1);
1275  }
1276  else {
1277  AliDebug(2, "The candidate is NOT from HIJING, we skip it when filling background");
1278  fHistoBackground->Fill(0);
1279  continue;
1280  }
1281  }
1282  else if (fKeepingOnlyPYTHIABkg){
1283  // we have decided to fill the background only when the candidate has the daugthers that all come from HIJING underlying event!
1284  AliAODTrack *bachelor = (AliAODTrack*)lcK0spr->GetBachelor();
1285  AliAODTrack *v0pos = (AliAODTrack*)lcK0spr->Getv0PositiveTrack();
1286  AliAODTrack *v0neg = (AliAODTrack*)lcK0spr->Getv0NegativeTrack();
1287  if (!bachelor || !v0pos || !v0neg) {
1288  AliDebug(2, "Cannot retrieve one of the tracks while checking origin, continuing");
1289  continue;
1290  }
1291  else {
1292  Int_t labelbachelor = TMath::Abs(bachelor->GetLabel());
1293  Int_t labelv0pos = TMath::Abs(v0pos->GetLabel());
1294  Int_t labelv0neg = TMath::Abs(v0neg->GetLabel());
1295  AliAODMCParticle* MCbachelor = (AliAODMCParticle*)mcArray->At(labelbachelor);
1296  AliAODMCParticle* MCv0pos = (AliAODMCParticle*)mcArray->At(labelv0pos);
1297  AliAODMCParticle* MCv0neg = (AliAODMCParticle*)mcArray->At(labelv0neg);
1298  if (!MCbachelor || !MCv0pos || !MCv0neg) {
1299  AliDebug(2, "Cannot retrieve MC particle for one of the tracks while checking origin, continuing");
1300  continue;
1301  }
1302  else {
1303  Int_t isBachelorFromPythia = fUtils->CheckOrigin(mcArray, MCbachelor, kTRUE);
1304  Int_t isv0posFromPythia = fUtils->CheckOrigin(mcArray, MCv0pos, kTRUE);
1305  Int_t isv0negFromPythia = fUtils->CheckOrigin(mcArray, MCv0neg, kTRUE);
1306  if (isBachelorFromPythia != 0 && isv0posFromPythia != 0 && isv0negFromPythia != 0){
1307  AliDebug(2, "The candidate is from PYTHIA (i.e. all daughters originate from a quark), keeping it to fill background");
1308  fHistoBackground->Fill(2);
1309  }
1310  else {
1311  AliDebug(2, "The candidate is NOT from PYTHIA, we skip it when filling background");
1312  fHistoBackground->Fill(3);
1313  continue;
1314  }
1315  }
1316  }
1317  }
1318  }
1319  }
1320 
1321  //FillLc2pK0Sspectrum(lcK0spr, isLc, nSelectedAnal, cutsAnal, mcArray, iLctopK0s);
1322  FillLc2pK0Sspectrum(lcK0spr, isLc, nSelectedAnal, cutsAnal, mcArray, mcLabel);
1323 
1324  }
1325 
1326  return;
1327 
1328 }
1329 //________________________________________________________________________
1331  Int_t isLc,
1332  Int_t &nSelectedAnal,
1333  AliRDHFCutsLctoV0 *cutsAnal,
1334  TClonesArray *mcArray, Int_t iLctopK0s){
1335  //
1337  //
1338 
1339  /*
1340  if (!part->GetOwnPrimaryVtx()) {
1341  //Printf("No primary vertex for Lc found!!");
1342  part->SetOwnPrimaryVtx(fVtx1);
1343  }
1344  else {
1345  //Printf("Yu-huuuu!!! primary vertex for Lc found!!");
1346  }
1347  */
1348  Double_t invmassLc = part->InvMassLctoK0sP();
1349 
1350  AliAODv0 * v0part = part->Getv0();
1351  Bool_t onFlyV0 = v0part->GetOnFlyStatus(); // on-the-flight V0s
1352  if (onFlyV0){ // on-the-fly V0
1353  if (isLc) { // Lc
1354  fHistoLcOnTheFly->Fill(2.);
1355  }
1356  else { // not Lc
1357  fHistoLcOnTheFly->Fill(0.);
1358  }
1359  }
1360  else { // offline V0
1361  if (isLc) { // Lc
1362  fHistoLcOnTheFly->Fill(3.);
1363  }
1364  else { // not Lc
1365  fHistoLcOnTheFly->Fill(1.);
1366  }
1367  }
1368 
1369  Double_t dcaV0 = v0part->GetDCA();
1370  Double_t invmassK0s = v0part->MassK0Short();
1371 
1372  if ( (cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) {
1373  if (isLc) {
1374  fHistoFiducialAcceptance->Fill(3.);
1375  }
1376  else {
1377  fHistoFiducialAcceptance->Fill(1.);
1378  }
1379  }
1380  else {
1381  if (isLc) {
1382  fHistoFiducialAcceptance->Fill(2.);
1383  }
1384  else {
1385  fHistoFiducialAcceptance->Fill(0.);
1386  }
1387  }
1388 
1389  Int_t isInV0window = (((cutsAnal->IsSelectedSingleCut(part, AliRDHFCuts::kCandidate, 2)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on V0 invMass
1390 
1391  if (isInV0window == 0) {
1392  AliDebug(2, "No: The candidate has NOT passed the V0 window cuts!");
1393  if (isLc) Printf("SIGNAL candidate rejected: V0 window cuts");
1394  return;
1395  }
1396  else AliDebug(2, "Yes: The candidate has passed the mass cuts!");
1397 
1398  Bool_t isInCascadeWindow = (((cutsAnal->IsSelectedSingleCut(part, AliRDHFCuts::kCandidate, 0)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on Lc->p+K0S invMass
1399 
1400  if (!isInCascadeWindow) {
1401  AliDebug(2, "No: The candidate has NOT passed the cascade window cuts!");
1402  if (isLc) Printf("SIGNAL candidate rejected: cascade window cuts");
1403  return;
1404  }
1405  else AliDebug(2, "Yes: The candidate has passed the cascade window cuts!");
1406 
1407  Bool_t isCandidateSelectedCuts = (((cutsAnal->IsSelected(part, AliRDHFCuts::kCandidate)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr)); // kinematic/topological cuts
1408  AliDebug(2, Form("recoAnalysisCuts = %d", cutsAnal->IsSelected(part, AliRDHFCuts::kCandidate) & (AliRDHFCutsLctoV0::kLcToK0Spr)));
1409  if (!isCandidateSelectedCuts){
1410  AliDebug(2, "No: Analysis cuts kCandidate level NOT passed");
1411  if (isLc) Printf("SIGNAL candidate rejected");
1412  return;
1413  }
1414  else {
1415  AliDebug(2, "Yes: Analysis cuts kCandidate level passed");
1416  }
1417 
1418  AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
1419  if (!bachelor) {
1420  AliDebug(2, Form("Very weird, the bachelor is not there... returning for this candidate"));
1421  return;
1422  }
1423 
1424  //Bool_t isBachelorID = (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // ID x bachelor
1425  Double_t probTPCTOF[AliPID::kSPECIES]={-1.};
1426 
1427  UInt_t detUsed = fPIDCombined->ComputeProbabilities(bachelor, fPIDResponse, probTPCTOF);
1428  AliDebug(2, Form("detUsed (TPCTOF case) = %d", detUsed));
1429  Double_t probProton = -1.;
1430  // Double_t probPion = -1.;
1431  // Double_t probKaon = -1.;
1432  if (detUsed == (UInt_t)fPIDCombined->GetDetectorMask() ) {
1433  AliDebug(2, Form("We have found the detector mask for TOF + TPC: probProton will be set to %f", probTPCTOF[AliPID::kProton]));
1434  probProton = probTPCTOF[AliPID::kProton];
1435  // probPion = probTPCTOF[AliPID::kPion];
1436  // probKaon = probTPCTOF[AliPID::kKaon];
1437  }
1438  else { // if you don't have both TOF and TPC, try only TPC
1439  fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC);
1440  AliDebug(2, "We did not find the detector mask for TOF + TPC, let's see only TPC");
1441  detUsed = fPIDCombined->ComputeProbabilities(bachelor, fPIDResponse, probTPCTOF);
1442  AliDebug(2,Form(" detUsed (TPC case) = %d", detUsed));
1443  if (detUsed == (UInt_t)fPIDCombined->GetDetectorMask()) {
1444  probProton = probTPCTOF[AliPID::kProton];
1445  // probPion = probTPCTOF[AliPID::kPion];
1446  // probKaon = probTPCTOF[AliPID::kKaon];
1447  AliDebug(2, Form("TPC only worked: probProton will be set to %f", probTPCTOF[AliPID::kProton]));
1448  }
1449  else {
1450  AliDebug(2, "Only TPC did not work...");
1451  }
1452  // resetting mask to ask for both TPC+TOF
1453  fPIDCombined->SetDetectorMask(AliPIDResponse::kDetTPC+AliPIDResponse::kDetTOF);
1454  }
1455  AliDebug(2, Form("probProton = %f", probProton));
1456 
1457  // now we get the TPC and TOF single PID probabilities (only for Proton, or the tree will explode :) )
1458  Double_t probProtonTPC = -1.;
1459  Double_t probProtonTOF = -1.;
1460  Double_t pidTPC[AliPID::kSPECIES]={-1.};
1461  Double_t pidTOF[AliPID::kSPECIES]={-1.};
1462  Int_t respTPC = fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTPC, bachelor, AliPID::kSPECIES, pidTPC);
1463  Int_t respTOF = fPIDResponse->ComputePIDProbability(AliPIDResponse::kDetTOF, bachelor, AliPID::kSPECIES, pidTOF);
1464  if (respTPC == AliPIDResponse::kDetPidOk) probProtonTPC = pidTPC[AliPID::kProton];
1465  if (respTOF == AliPIDResponse::kDetPidOk) probProtonTOF = pidTOF[AliPID::kProton];
1466 
1467  // checking V0 status (on-the-fly vs offline)
1468  if ( !( !onFlyV0 || (onFlyV0 && fUseOnTheFlyV0) ) ) {
1469  AliDebug(2, "On-the-fly discarded");
1470  return;
1471  }
1472 
1474  nSelectedAnal++;
1475  }
1476 
1477  if ( !(cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) return;
1478 
1479  if ( !( ( (cutsAnal->IsSelected(part, AliRDHFCuts::kTracks)) & (AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) { // esd track cuts
1480  if (isLc) Printf("SIGNAL candidate rejected");
1481  AliDebug(2, "No: Analysis cuts kTracks level NOT passed");
1482  return;
1483  }
1484  else {
1485  AliDebug(2, "Yes: Analysis cuts kTracks level passed");
1486  }
1487 
1488  Int_t pdgCand = 4122;
1489  Int_t pdgDgLctoV0bachelor[2]={211, 3122}; // case of wrong decay! Lc --> L + pi
1490  Int_t pdgDgV0toDaughters[2]={2212, 211}; // case of wrong decay! Lc --> L + pi
1491  Int_t isLc2LBarpi=0, isLc2Lpi=0;
1492  Int_t currentLabel = part->GetLabel();
1493  Int_t mcLabel = 0;
1494  if (fUseMCInfo) {
1495  mcLabel = part->MatchToMC(pdgCand, pdgDgLctoV0bachelor[1], pdgDgLctoV0bachelor, pdgDgV0toDaughters, mcArray, kTRUE);
1496  if (mcLabel>=0) {
1497  if (bachelor->Charge()==-1) isLc2LBarpi=1;
1498  if (bachelor->Charge()==+1) isLc2Lpi=1;
1499  }
1500  }
1501 
1502  Int_t pdgDg2prong[2] = {211, 211};
1503  Int_t labelK0S = 0;
1504  Int_t isK0S = 0;
1505  if (fUseMCInfo) {
1506  labelK0S = v0part->MatchToMC(310, mcArray, 2, pdgDg2prong);
1507  if (labelK0S>=0) isK0S = 1;
1508  }
1509 
1510  pdgDg2prong[0] = 211;
1511  pdgDg2prong[1] = 2212;
1512  Int_t isLambda = 0;
1513  Int_t isLambdaBar = 0;
1514  Int_t lambdaLabel = 0;
1515  if (fUseMCInfo) {
1516  lambdaLabel = v0part->MatchToMC(3122, mcArray, 2, pdgDg2prong);
1517  if (lambdaLabel>=0) {
1518  AliAODMCParticle *lambdaTrack = (AliAODMCParticle*)mcArray->At(lambdaLabel);
1519  if (lambdaTrack->GetPdgCode()==3122) isLambda = 1;
1520  else if (lambdaTrack->GetPdgCode()==-3122) isLambdaBar = 1;
1521  }
1522  }
1523 
1524  pdgDg2prong[0] = 11;
1525  pdgDg2prong[1] = 11;
1526  Int_t isGamma = 0;
1527  Int_t gammaLabel = 0;
1528  if (fUseMCInfo) {
1529  gammaLabel = v0part->MatchToMC(22, mcArray, 2, pdgDg2prong);
1530  if (gammaLabel>=0) {
1531  AliAODMCParticle *gammaTrack = (AliAODMCParticle*)mcArray->At(gammaLabel);
1532  if (gammaTrack->GetPdgCode()==22) isGamma = 1;
1533  }
1534  }
1535 
1536  Int_t pdgTemp = -1;
1537  if (currentLabel != -1){
1538  AliAODMCParticle *tempPart = (AliAODMCParticle*)mcArray->At(currentLabel);
1539  pdgTemp = tempPart->GetPdgCode();
1540  }
1541  if (isLc) AliDebug(2, Form("Signal: Candidate is a Lc in K0s+p"));
1542  else if (isLc2LBarpi) AliDebug(2, Form("Background: Candidate is a Lc in Lbar + pi"));
1543  else if (isLc2Lpi) AliDebug(2, Form("Background: Candidate is a Lc in L + pi"));
1544  else AliDebug(2, Form("Pure bkg: Candidate has pdg = %d", pdgTemp));
1545  if (isK0S) AliDebug(2, Form("V0 is a K0S"));
1546  else if (isLambda) AliDebug(2, Form("V0 is a Lambda"));
1547  else if (isLambdaBar) AliDebug(2, Form("V0 is a LambdaBar"));
1548  else if (isGamma) AliDebug(2, Form("V0 is a Gamma"));
1549  //else AliDebug(2, Form("V0 is something else!!"));
1550 
1551  Double_t invmassLc2Lpi = part->InvMassLctoLambdaPi();
1552  Double_t invmassLambda = v0part->MassLambda();
1553  Double_t invmassLambdaBar = v0part->MassAntiLambda();
1554 
1555  //Double_t nSigmaITSpr=-999.;
1556  Double_t nSigmaTPCpr=-999.;
1557  Double_t nSigmaTOFpr=-999.;
1558 
1559  //Double_t nSigmaITSpi=-999.;
1560  Double_t nSigmaTPCpi=-999.;
1561  Double_t nSigmaTOFpi=-999.;
1562 
1563  //Double_t nSigmaITSka=-999.;
1564  Double_t nSigmaTPCka=-999.;
1565  Double_t nSigmaTOFka=-999.;
1566 
1567  /*
1568  cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,4,nSigmaITSpr);
1569  cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,4,nSigmaTPCpr);
1570  cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,4,nSigmaTOFpr);
1571  cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,2,nSigmaITSpi);
1572  cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,2,nSigmaTPCpi);
1573  cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,2,nSigmaTOFpi);
1574  cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,3,nSigmaITSka);
1575  cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,3,nSigmaTPCka);
1576  cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,3,nSigmaTOFka);
1577  */
1578 
1579  nSigmaTPCpi = fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kPion));
1580  nSigmaTPCka = fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kKaon));
1581  nSigmaTPCpr = fPIDResponse->NumberOfSigmasTPC(bachelor,(AliPID::kProton));
1582  nSigmaTOFpi = fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kPion));
1583  nSigmaTOFka = fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kKaon));
1584  nSigmaTOFpr = fPIDResponse->NumberOfSigmasTOF(bachelor,(AliPID::kProton));
1585 
1586  Double_t ptLcMC = -1;
1587  Double_t weightPythia = -1, weight5LHC13d3 = -1, weight5LHC13d3Lc = -1;
1588 
1589  if (fUseMCInfo) {
1590  if (iLctopK0s >= 0) {
1591  AliAODMCParticle *partLcMC = (AliAODMCParticle*)mcArray->At(iLctopK0s);
1592  ptLcMC = partLcMC->Pt();
1593  //Printf("--------------------- Reco pt = %f, MC particle pt = %f", part->Pt(), ptLcMC);
1594  weightPythia = fFuncWeightPythia->Eval(ptLcMC);
1595  weight5LHC13d3 = fFuncWeightFONLL5overLHC13d3->Eval(ptLcMC);
1596  weight5LHC13d3Lc = fFuncWeightFONLL5overLHC13d3Lc->Eval(ptLcMC);
1597  }
1598  }
1599 
1600  Double_t weightNch = 1;
1601  if (fUseMCInfo) {
1602  Int_t nChargedMCPhysicalPrimary=AliVertexingHFUtils::GetGeneratedPhysicalPrimariesInEtaRange(mcArray,-1.0,1.0);
1603  if(nChargedMCPhysicalPrimary > 0){
1604  if(!fHistoMCNch) AliInfo("Input histos to evaluate Nch weights missing");
1605  if(fHistoMCNch) weightNch = fHistoMCNch->GetBinContent(fHistoMCNch->FindBin(nChargedMCPhysicalPrimary));
1606  }
1607  }
1608 
1609 
1610  // Fill candidate variable Tree (track selection, V0 invMass selection)
1611  if (!onFlyV0 && isInV0window && isInCascadeWindow && part->CosV0PointingAngle()>0.99 && TMath::Abs(nSigmaTPCpr) <= 3 && v0part->Getd0Prong(0) < 20 && v0part->Getd0Prong(1) < 20) {
1612 
1613  fCandidateVariables[0] = invmassLc;
1614  fCandidateVariables[1] = invmassLc2Lpi;
1615  fCandidateVariables[2] = invmassK0s;
1616  fCandidateVariables[3] = invmassLambda;
1617  fCandidateVariables[4] = invmassLambdaBar;
1619  fCandidateVariables[6] = dcaV0;
1620  fCandidateVariables[7] = part->Getd0Prong(0);
1621  fCandidateVariables[8] = part->Getd0Prong(1);
1622  fCandidateVariables[9] = nSigmaTPCpr;
1623  fCandidateVariables[10] = nSigmaTPCpi;
1624  fCandidateVariables[11] = nSigmaTPCka;
1625  fCandidateVariables[12] = nSigmaTOFpr;
1626  fCandidateVariables[13] = nSigmaTOFpi;
1627  fCandidateVariables[14] = nSigmaTOFka;
1628  fCandidateVariables[15] = bachelor->Pt();
1629  AliAODTrack *v0pos = (AliAODTrack*)part->Getv0PositiveTrack();
1630  fCandidateVariables[16] = v0pos->Pt();
1631  AliAODTrack *v0neg = (AliAODTrack*)part->Getv0NegativeTrack();
1632  fCandidateVariables[17] = v0neg->Pt();
1633  fCandidateVariables[18] = v0part->Getd0Prong(0);
1634  fCandidateVariables[19] = v0part->Getd0Prong(1);
1635  fCandidateVariables[20] = v0part->Pt();
1636  fCandidateVariables[21] = v0part->InvMass2Prongs(0,1,11,11);
1637  fCandidateVariables[22] = part->Pt();
1638  fCandidateVariables[23] = probProton;
1639  fCandidateVariables[24] = part->Eta();
1640  fCandidateVariables[25] = v0pos->Eta();
1641  fCandidateVariables[26] = v0neg->Eta();
1642  fCandidateVariables[27] = probProtonTPC;
1643  fCandidateVariables[28] = probProtonTOF;
1644  fCandidateVariables[29] = bachelor->Eta();
1645 
1646  fCandidateVariables[30] = part->P();
1647  fCandidateVariables[31] = bachelor->P();
1648  fCandidateVariables[32] = v0part->P();
1649  fCandidateVariables[33] = v0pos->P();
1650  fCandidateVariables[34] = v0neg->P();
1651 
1652  fCandidateVariables[35] = part->Y(4122);
1653  fCandidateVariables[36] = bachelor->Y(2212);
1654  fCandidateVariables[37] = v0part->Y(310);
1655  fCandidateVariables[38] = v0pos->Y(211);
1656  fCandidateVariables[39] = v0neg->Y(211);
1657 
1658  fCandidateVariables[40] = v0part->Eta();
1659 
1660  fCandidateVariables[41] = part->DecayLength();
1661  fCandidateVariables[42] = part->DecayLengthV0();
1662  fCandidateVariables[43] = part->Ct(4122);
1663  fCandidateVariables[44] = v0part->Ct(310, v0part->GetSecondaryVtx());
1664 
1665  EBachelor bachCode = kBachInvalid;
1666  EK0S k0SCode = kK0SInvalid;
1667  if (fUseMCInfo) {
1668  bachCode = CheckBachelor(part, bachelor, mcArray);
1669  k0SCode = CheckK0S(part, v0part, mcArray);
1670  }
1671 
1672  fCandidateVariables[45] = bachCode;
1673  fCandidateVariables[46] = k0SCode;
1674 
1675  Double_t V0KF[3] = {-999999, -999999, -999999};
1676  Double_t errV0KF[3] = {-999999, -999999, -999999};
1677  Double_t LcKF[3] = {-999999, -999999, -999999};
1678  Double_t errLcKF[3] = {-999999, -999999, -999999};
1679  Double_t distances[3] = {-999999, -999999, -999999};
1680  Double_t armPolKF[2] = {-999999, -999999};
1681 
1682  if (fCallKFVertexing){
1683  Int_t kfResult = CallKFVertexing(part, v0part, bachelor, mcArray, &V0KF[0], &errV0KF[0], &LcKF[0], &errLcKF[0], &distances[0], &armPolKF[0]);
1684  AliDebug(2, Form("Result from KF = %d", kfResult));
1685  }
1686 
1687  /*
1688  for (Int_t i = 0; i< 3; i++){
1689  Printf("i = %d, V0KF = %f, errV0KF = %f, LcKF = %f, errLcKF = %f", V0KF[i], errV0KF[i], LcKF[i], errLcKF[i]);
1690  }
1691  */
1692 
1693  fCandidateVariables[47] = V0KF[0];
1694  fCandidateVariables[48] = V0KF[1];
1695  fCandidateVariables[49] = V0KF[2];
1696 
1697  fCandidateVariables[50] = errV0KF[0];
1698  fCandidateVariables[51] = errV0KF[1];
1699  fCandidateVariables[52] = errV0KF[2];
1700 
1701  fCandidateVariables[53] = LcKF[0];
1702  fCandidateVariables[54] = LcKF[1];
1703  fCandidateVariables[55] = LcKF[2];
1704 
1705  fCandidateVariables[56] = errLcKF[0];
1706  fCandidateVariables[57] = errLcKF[1];
1707  fCandidateVariables[58] = errLcKF[2];
1708 
1709  fCandidateVariables[59] = distances[0];
1710  fCandidateVariables[60] = distances[1];
1711  fCandidateVariables[61] = distances[2];
1712  fCandidateVariables[62] = armPolKF[0];
1713  fCandidateVariables[63] = armPolKF[1];
1714  fCandidateVariables[64] = v0part->AlphaV0();
1715  fCandidateVariables[65] = v0part->PtArmV0();
1716 
1717  AliDebug(2, Form("v0pos->GetStatus() & AliESDtrack::kITSrefit= %d, v0neg->GetStatus() & AliESDtrack::kITSrefit = %d, v0pos->GetTPCClusterInfo(2, 1)= %f, v0neg->GetTPCClusterInfo(2, 1) = %f", (Int_t)(v0pos->GetStatus() & AliESDtrack::kITSrefit), (Int_t)(v0pos->GetStatus() & AliESDtrack::kITSrefit), v0pos->GetTPCClusterInfo(2, 1), v0neg->GetTPCClusterInfo(2, 1)));
1718  fCandidateVariables[66] = v0pos->GetStatus() & AliESDtrack::kITSrefit;
1719  fCandidateVariables[67] = v0neg->GetStatus() & AliESDtrack::kITSrefit;
1720  fCandidateVariables[68] = v0pos->GetTPCClusterInfo(2, 1);
1721  fCandidateVariables[69] = v0neg->GetTPCClusterInfo(2, 1);
1722 
1723  fCandidateVariables[70] = v0part->Xv();
1724  fCandidateVariables[71] = v0part->Yv();
1725  fCandidateVariables[72] = v0part->Zv();
1726 
1727  fCandidateVariables[73] = fVtx1->GetX();
1728  fCandidateVariables[74] = fVtx1->GetY();
1729  fCandidateVariables[75] = fVtx1->GetZ();
1730 
1731  fCandidateVariables[76] = bachelor->GetITSNcls();
1732  fCandidateVariables[77] = bachelor->HasPointOnITSLayer(0) + bachelor->HasPointOnITSLayer(1);
1733 
1734  fCandidateVariables[78] = v0pos->GetITSNcls();
1735  fCandidateVariables[79] = v0pos->HasPointOnITSLayer(0) + v0pos->HasPointOnITSLayer(1);
1736 
1737  fCandidateVariables[80] = v0neg->GetITSNcls();
1738  fCandidateVariables[81] = v0neg->HasPointOnITSLayer(0) + v0neg->HasPointOnITSLayer(1);
1739 
1740  TVector3 mom1(bachelor->Px(), bachelor->Py(), bachelor->Pz());
1741  TVector3 mom2(v0part->Px(), v0part->Py(), v0part->Pz());
1742  TVector3 momTot(part->Px(), part->Py(), part->Pz());
1743 
1744  Double_t Ql1 = mom1.Dot(momTot)/momTot.Mag();
1745  Double_t Ql2 = mom2.Dot(momTot)/momTot.Mag();
1746 
1747  Double_t alphaArmLc = (Ql1 - Ql2)/(Ql1 + Ql2);
1748  Double_t alphaArmLcCharge = ( bachelor->Charge() > 0 ? (Ql1 - Ql2)/(Ql1 + Ql2) : (Ql2 - Ql1)/(Ql1 + Ql2) );
1749  Double_t ptArmLc = mom1.Perp(momTot);
1750 
1751  fCandidateVariables[82] = alphaArmLc;
1752  fCandidateVariables[83] = alphaArmLcCharge;
1753  fCandidateVariables[84] = ptArmLc;
1754 
1755  Double_t massK0SPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass(); // mass K0S PDG
1756  Double_t massPrPDG = TDatabasePDG::Instance()->GetParticle(2212)->Mass(); // mass Proton PDG
1757  Double_t massLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass(); // mass Lc PDG
1758 
1759  Double_t pStar = TMath::Sqrt((massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)*(massLcPDG*massLcPDG-massPrPDG*massPrPDG-massK0SPDG*massK0SPDG)-4.*massPrPDG*massPrPDG*massK0SPDG*massK0SPDG)/(2.*massLcPDG);
1760  Double_t e = part->E(4122);
1761  Double_t beta = part->P()/e;
1762  Double_t gamma = e/massLcPDG;
1763 
1764  Double_t cts = (Ql1/gamma-beta*TMath::Sqrt(pStar*pStar+massPrPDG*massPrPDG))/pStar;
1765 
1766  fCandidateVariables[85] = cts;
1767 
1768  fCandidateVariables[86] = weightPythia;
1769  fCandidateVariables[87] = weight5LHC13d3;
1770  fCandidateVariables[88] = weight5LHC13d3Lc;
1771  fCandidateVariables[89] = weightNch;
1772 
1773 
1774  if (fUseMCInfo) {
1775  if (isLc){
1776  AliDebug(2, Form("Reco particle %d --> Filling Sgn", iLctopK0s));
1777  fVariablesTreeSgn->Fill();
1778  fHistoCodesSgn->Fill(bachCode, k0SCode);
1779  }
1780  else {
1781  if (fFillOnlySgn == kFALSE){
1782  AliDebug(2, "Filling Bkg");
1783  fVariablesTreeBkg->Fill();
1784  fHistoCodesBkg->Fill(bachCode, k0SCode);
1785  }
1786  }
1787  }
1788  else {
1789  fVariablesTreeSgn->Fill();
1790  }
1791  }
1792 
1793  return;
1794 
1795 }
1796 
1797 //________________________________________________________________________
1798 Int_t AliAnalysisTaskSELc2V0bachelorTMVA::CallKFVertexing(AliAODRecoCascadeHF *cascade, AliAODv0* v0part, AliAODTrack* bach, TClonesArray *mcArray,
1799  Double_t* V0KF, Double_t* errV0KF, Double_t* LcKF, Double_t* errLcKF,
1800  Double_t* distances, Double_t* armPolKF) {
1801 
1802  //
1805  //
1806 
1807  Int_t codeKFV0 = -1, codeKFLc = -1;
1808 
1809  AliKFVertex primVtxCopy;
1810  Int_t nt = 0, ntcheck = 0;
1811  Double_t pos[3] = {0., 0., 0.};
1812 
1813  fVtx1->GetXYZ(pos);
1814  Int_t contr = fVtx1->GetNContributors();
1815  Double_t covmatrix[6] = {0.};
1816  fVtx1->GetCovarianceMatrix(covmatrix);
1817  Double_t chi2 = fVtx1->GetChi2();
1818  AliESDVertex primaryESDVtxCopy(pos, covmatrix, chi2, contr, "Vertex");
1819 
1820  // topological constraint
1821  primVtxCopy = AliKFVertex(primaryESDVtxCopy);
1822  nt = primaryESDVtxCopy.GetNContributors();
1823  ntcheck = nt;
1824 
1825  Int_t pdg[2] = {211, -211};
1826  Int_t pdgLc[2] = {2212, 310};
1827 
1828  Int_t pdgDgV0toDaughters[2] = {211, 211};
1829 
1830  Int_t mcLabelV0 = v0part->MatchToMC(310, mcArray, 2, pdgDgV0toDaughters);
1831 
1832  // the KF vertex for the V0 has to be built with the prongs of the V0!
1833  Bool_t isMCokV0 = kTRUE, isBkgV0 = kFALSE;
1834  AliKFParticle V0, positiveV0KF, negativeV0KF;
1835  Int_t labelsv0daugh[2] = {-1, -1};
1836  Int_t idv0daugh[2] = {-1, -1};
1837  AliExternalTrackParam* esdv0Daugh1 = 0x0;
1838  AliExternalTrackParam* esdv0Daugh2 = 0x0;
1839  for(Int_t ipr= 0; ipr < 2; ipr++){ // 0 is positive, 1 is negative
1840  AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1841  if(!aodTrack) {
1842  AliDebug(2, "No V0 daughters available");
1843  return -1;
1844  }
1845  Double_t xyz[3], pxpypz[3], cv[21];
1846  Short_t sign;
1847  aodTrack->GetXYZ(xyz);
1848  aodTrack->PxPyPz(pxpypz);
1849  aodTrack->GetCovarianceXYZPxPyPz(cv);
1850  sign = aodTrack->Charge();
1851  AliExternalTrackParam tmp1( xyz, pxpypz, cv, sign);
1852 
1853  if (ipr == 0) esdv0Daugh1 = new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1854  else esdv0Daugh2 = new AliExternalTrackParam( xyz, pxpypz, cv, sign);
1855  labelsv0daugh[ipr] = TMath::Abs(aodTrack->GetLabel());
1856  idv0daugh[ipr] = aodTrack->GetID();
1857  if (labelsv0daugh[ipr] == -1) isBkgV0 = kTRUE;
1858 
1859  //Printf("v0 daughter %d has label %d", ipr, labelsv0daugh[ipr]);
1860 
1861  AliKFParticle daughterKF(*aodTrack, pdg[ipr]); // we assume that the PDG is correct
1862  if (aodTrack->Charge() > 0) { // assigning positive and negative track to KF V0 for Armenteros-Podolanski plot
1863  positiveV0KF = daughterKF;
1864  }
1865  else {
1866  negativeV0KF = daughterKF;
1867  }
1868  }
1869 
1870  Double_t xn=0., xp=0.;//, dca;
1871  AliDebug(2, Form("bField = %f, esdv0Daugh1 = %p, esdv0Daugh2 = %p", fBField, esdv0Daugh1, esdv0Daugh2));
1872  // dca = esdv0Daugh1->GetDCA(esdv0Daugh2, fBField, xn, xp);
1873 
1874  AliExternalTrackParam tr1(*esdv0Daugh1);
1875  AliExternalTrackParam tr2(*esdv0Daugh2);
1876  tr1.PropagateTo(xn, fBField);
1877  tr2.PropagateTo(xp, fBField);
1878 
1879  AliKFParticle daughterKF1(tr1, 211);
1880  AliKFParticle daughterKF2(tr2, 211);
1881  V0.AddDaughter(positiveV0KF);
1882  V0.AddDaughter(negativeV0KF);
1883  //V0.AddDaughter(daughterKF1);
1884  //V0.AddDaughter(daughterKF2);
1885 
1886  delete esdv0Daugh1;
1887  delete esdv0Daugh2;
1888  esdv0Daugh1=0;
1889  esdv0Daugh2=0;
1890  // Checking the quality of the KF V0 vertex
1891  if( V0.GetNDF() < 1 ) {
1892  //Printf("Number of degrees of freedom < 1, continuing");
1893  return -1;
1894  }
1895  if( TMath::Sqrt(TMath::Abs(V0.GetChi2()/V0.GetNDF())) > fCutKFChi2NDF ) {
1896  //Printf("Chi2 per DOF too big, continuing");
1897  return -1;
1898  }
1899 
1900  if(ftopoConstraint && nt > 0){
1901  for(Int_t ipr = 0; ipr < 2; ipr++){ // 0 is positive, 1 is negative
1902  AliAODTrack *aodTrack = (AliAODTrack*)v0part->GetDaughter(ipr);
1903  //* subtruct daughters from primary vertex
1904  if(!aodTrack->GetUsedForPrimVtxFit()) {
1905  //Printf("Track %d was not used for primary vertex, continuing", i);
1906  continue;
1907  }
1908  AliKFParticle daughterKF(*aodTrack, pdg[ipr]); // we assume that the PDG is correct
1909  primVtxCopy -= daughterKF;
1910  ntcheck--;
1911  }
1912  }
1913 
1914  // Check V0 Chi^2 deviation from primary vertex // not needed for V0 for Lc decay!!
1915  /*
1916  if( V0.GetDeviationFromVertex( primVtxCopy ) < fCutKFDeviationFromVtxV0) {
1917  //Printf("Deviation from vertex too big, continuing");
1918  return -1;
1919  }
1920  */
1921 
1922  //* Get V0 invariant mass
1923  Double_t massV0 = 999999, sigmaMassV0 = 999999;
1924  Int_t retMV0 = V0.GetMass( massV0, sigmaMassV0 );
1925  if( retMV0 ) {
1926  if (massV0 < 0) {
1927  codeKFV0 = 1; // Mass not ok
1928  if (sigmaMassV0 > 1e19) codeKFV0 = 5; // Mass and SigmaMass not ok
1929  }
1930  else if (sigmaMassV0 > 1e19) codeKFV0 = 2; // SigmaMass not ok
1931  }
1932  fHistoMassKFV0->Fill(massV0, sigmaMassV0);
1933 
1934  if (massV0 < 0.4) Printf("\n\n>>>>>>>>>> Found the Funny V0 (mass = %f, sigma = %f, AOD mass = %f): labels of the tracks = %d, %d, id = %d and %d", massV0, sigmaMassV0, v0part->MassK0Short(), labelsv0daugh[0], labelsv0daugh[1], idv0daugh[0], idv0daugh[1]);
1935  if (massV0 > 0.55) Printf("\n\n>>>>>>>>>> Found the Funny V0 (mass = %f, , sigma = %f, AOD mass = %f): labels of the tracks = %d, %d, id = %d and %d", massV0, sigmaMassV0, v0part->MassK0Short(), labelsv0daugh[0], labelsv0daugh[1], idv0daugh[0], idv0daugh[1]);
1936 
1937  Printf("Vertices: KF: x = %f, y = %f, z = %f", V0.GetX(), V0.GetY(), V0.GetZ());
1938  Printf("Vertices: AOD: x = %f, y = %f, z = %f", v0part->Xv(), v0part->Yv(), v0part->Zv());
1939 
1940  //Printf("Got MC vtx for V0");
1941  if (fUseMCInfo && TMath::Abs(labelsv0daugh[0] - labelsv0daugh[1]) == 1) {
1942  AliAODMCParticle* tmpdaughv01 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsv0daugh[0]));
1943  AliAODMCParticle* tmpdaughv02 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsv0daugh[1]));
1944  if (!tmpdaughv01 && labelsv0daugh[0] > 0){
1945  AliDebug(2, "Could not access MC info for first daughter of V0, continuing");
1946  }
1947  if (!tmpdaughv02 && labelsv0daugh[1] > 0){
1948  AliDebug(2, "Could not access MC info for second daughter of V0, continuing");
1949  }
1950  if(tmpdaughv01){
1951  Double_t xPionMC = tmpdaughv01->Xv(); //Production vertex of Pion --> Where K0S decays
1952  Double_t yPionMC = tmpdaughv01->Yv();
1953  Double_t zPionMC = tmpdaughv01->Zv();
1954  //Printf("Got MC vtx for Pion");
1955  Printf("Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
1956  }
1957  }
1958  else {
1959  Printf("Not a true V0");
1960  }
1961  //massV0=-1;//return -1;// !!!!
1962 
1963  // now use what we just try with the bachelor, to build the Lc
1964 
1965  // topological constraint
1966  nt = primVtxCopy.GetNContributors();
1967  ntcheck = nt;
1968 
1969  Bool_t isMCokLc = kTRUE, isBkgLc = kFALSE;
1970  AliKFParticle Lc;
1971  Int_t labelsLcdaugh[2] = {-1, -1};
1972  labelsLcdaugh[0] = TMath::Abs(bach->GetLabel());
1973  labelsLcdaugh[1] = mcLabelV0;
1974 
1975  if (bach->Charge() < 0) pdgLc[0] = -pdgLc[0];
1976  AliKFParticle daughterKFLc(*bach, pdgLc[0]);
1977  Lc.AddDaughter(daughterKFLc);
1978  TParticlePDG* particlePDG = TDatabasePDG::Instance()->GetParticle(310);
1979  Double_t massPDGK0S = particlePDG->Mass();
1980  V0.SetMassConstraint(massPDGK0S);
1981  Lc.AddDaughter(V0);
1982  if( Lc.GetNDF() < 1 ) {
1983  AliDebug(2, Form("Lc: Number of degrees of freedom < 1 (%d), continuing", Lc.GetNDF()));
1984  return -1;
1985  }
1986  if( TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) > fCutKFChi2NDF) {
1987  AliDebug(2, Form("Lc: Chi2 per DOF too big, continuing (%f)", TMath::Sqrt(TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
1988  return -1;
1989  }
1990 
1991  if(ftopoConstraint && nt > 0){
1992  //* subtruct daughters from primary vertex
1993  if(!bach->GetUsedForPrimVtxFit()) {
1994  AliDebug(3, "Lc: Bachelor was not used for primary vertex, not subtracting it from primary vertex");
1995  }
1996  else{
1997  primVtxCopy -= daughterKFLc;
1998  ntcheck--;
1999  }
2000  /* the V0 was added above, so it is ok to remove it without checking
2001  if(!V0->GetUsedForPrimVtxFit()) {
2002  Printf("Lc: V0 was not used for primary vertex, continuing");
2003  continue;
2004  }
2005  */
2006  //primVtxCopy -= V0;
2007  //ntcheck--;
2008  }
2009 
2010  // Check Lc Chi^2 deviation from primary vertex
2011  /*
2012  if( Lc.GetDeviationFromVertex( primVtxCopy ) > fCutKFDeviationFromVtx) {
2013  AliDebug(2, Form("Lc: Deviation from vertex too big, continuing (%f)", Lc.GetDeviationFromVertex( primVtxCopy )));
2014  return -1;
2015  }
2016 
2017  if(ftopoConstraint){
2018  if(ntcheck>0) {
2019  // Add Lc to primary vertex to improve the primary vertex resolution
2020  primVtxCopy += Lc;
2021  Lc.SetProductionVertex(primVtxCopy);
2022  }
2023  }
2024  */
2025  //* Check chi^2
2026  if( TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF())) > fCutKFChi2NDF) {
2027  AliDebug(2, Form("Lc: Final Chi2 per DOF too big, continuing (%f)", TMath::Sqrt( TMath::Abs(Lc.GetChi2()/Lc.GetNDF()))));
2028  return -1;
2029  }
2030 
2031  if(ftopoConstraint){
2032  V0.SetProductionVertex(Lc);
2033  }
2034 
2035  // After setting the vertex of the V0, getting/filling some info
2036 
2037  //* Get V0 decayLength
2038  Double_t decayLengthV0 = 999999, sigmaDecayLengthV0 = 999999;
2039  Int_t retDLV0 = V0.GetDecayLength( decayLengthV0, sigmaDecayLengthV0 );
2040  if( retDLV0 ) {
2041  if (sigmaDecayLengthV0 > 1e19) {
2042  codeKFV0 = 3; // DecayLength not ok
2043  if (massV0 < 0) {
2044  codeKFV0 = 6; // DecayLength and Mass not ok
2045  if (sigmaMassV0 > 1e19) codeKFV0 = 11; // DecayLength and Mass and SigmaMass not ok
2046  }
2047  else if (sigmaMassV0 > 1e19) codeKFV0 = 8; // DecayLength and SigmaMass not ok
2048  }
2049  }
2050  fHistoDecayLengthKFV0->Fill(decayLengthV0, sigmaDecayLengthV0);
2051 
2052  //* Get V0 life time
2053  Double_t lifeTimeV0 = 999999, sigmaLifeTimeV0 = 999999;
2054  Int_t retTLV0 = V0.GetLifeTime( lifeTimeV0, sigmaLifeTimeV0 );
2055  if( retTLV0 ) {
2056  if (sigmaLifeTimeV0 > 1e19) {
2057  codeKFV0 = 4; // LifeTime not ok
2058  if (sigmaDecayLengthV0 > 1e19) {
2059  codeKFV0 = 9; // LifeTime and DecayLength not ok
2060  if (massV0 < 0) {
2061  codeKFV0 = 14; // LifeTime and DecayLength and Mass not ok
2062  if (sigmaMassV0 > 1e19) codeKFV0 = 15; // LifeTime and DecayLength and Mass and SigmaMass not ok
2063  }
2064  else if (sigmaMassV0 > 1e19) codeKFV0 = 13; // LifeTime and DecayLength and SigmaMass not ok
2065  }
2066  else if (massV0 < 0) { // LifeTime and Mass and SigmaMass not ok
2067  codeKFV0 = 7; // LifeTime and Mass not ok
2068  if (sigmaMassV0 > 1e19) codeKFV0 = 12; // LifeTime and Mass and SigmaMass not ok
2069  }
2070  else if (sigmaMassV0 > 1e19) codeKFV0 = 10; // LifeTime and SigmaMass not ok
2071  }
2072  }
2073  fHistoLifeTimeKFV0->Fill(lifeTimeV0, sigmaLifeTimeV0);
2074 
2075  if (codeKFV0 == -1) codeKFV0 = 0;
2076  fHistoKFV0->Fill(codeKFV0);
2077 
2078  AliDebug(2, Form("V0: mass = %f, decay length = %f, life time = %f", massV0, decayLengthV0, lifeTimeV0 ));
2079 
2080  fHistoMassV0All->Fill(massV0);
2081  fHistoDecayLengthV0All->Fill(decayLengthV0);
2082  fHistoLifeTimeV0All->Fill(lifeTimeV0);
2083 
2084  Double_t qtAlphaV0[2] = {0., 0.};
2085  Double_t vtxV0KF[3] = {V0.GetX(), V0.GetY(), V0.GetZ()};
2086  positiveV0KF.TransportToPoint(vtxV0KF);
2087  negativeV0KF.TransportToPoint(vtxV0KF);
2088  V0.GetArmenterosPodolanski(positiveV0KF, negativeV0KF, qtAlphaV0);
2089  AliDebug(2, Form("Armenteros-Podolanski variables: alpha = %f, qt = %f", qtAlphaV0[1], qtAlphaV0[0]));
2090  fHistoArmenterosPodolanskiV0KF->Fill(qtAlphaV0[1], qtAlphaV0[0]);
2091  fHistoArmenterosPodolanskiV0AOD->Fill(v0part->AlphaV0(), v0part->PtArmV0());
2092  armPolKF[0] = qtAlphaV0[1];
2093  armPolKF[1] = qtAlphaV0[0];
2094 
2095  // Checking MC info for V0
2096 
2097  AliAODMCParticle *motherV0 = 0x0;
2098  AliAODMCParticle *daughv01 = 0x0;
2099  AliAODMCParticle *daughv02 = 0x0;
2100 
2101  if (fUseMCInfo) {
2102  daughv01 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsv0daugh[0]));
2103  daughv02 = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsv0daugh[1]));
2104  if (!daughv01 && labelsv0daugh[0] > 0){
2105  AliDebug(2, "Could not access MC info for first daughter of V0, continuing");
2106  isMCokV0 = kFALSE;
2107  }
2108  if (!daughv02 && labelsv0daugh[1] > 0){
2109  AliDebug(2, "Could not access MC info for second daughter of V0, continuing");
2110  isMCokV0 = kFALSE;
2111  }
2112  if (isMCokV0){
2113  if( daughv01->GetMother() == daughv02->GetMother() && daughv01->GetMother()>=0 ){
2114  AliDebug(3, Form("The mother has label %d", daughv01->GetMother()));
2115  motherV0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(daughv01->GetMother()));
2116  if( motherV0 && TMath::Abs(motherV0->GetPdgCode()) != 21 ){ // These are all V0 that are truly V0, not only K0S, but no gluons
2117  if( motherV0->GetNDaughters() == 2 ){
2118  fHistoMassV0True->Fill(massV0);
2119  fHistoDecayLengthV0True->Fill(decayLengthV0);
2120  fHistoLifeTimeV0True->Fill(lifeTimeV0);
2121  fHistoMassV0TrueFromAOD->Fill(v0part->MassK0Short());
2122  if (TMath::Abs(motherV0->GetPdgCode()) == 310){ // These are true V0 that are also K0S
2123  fHistoMassV0TrueK0S->Fill(massV0);
2124  fHistoDecayLengthV0TrueK0S->Fill(decayLengthV0);
2125  fHistoLifeTimeV0TrueK0S->Fill(lifeTimeV0);
2126  fHistoMassV0TrueK0SFromAOD->Fill(v0part->MassK0Short());
2127  }
2128  }
2129  AliDebug(2, Form("PDG V0 = %d, pi = %d, pj = %d, ndaughters = %d, mc mass = %f, reco mass = %f, v0 mass = %f", motherV0->GetPdgCode(), daughv01->GetPdgCode(), daughv02->GetPdgCode(), motherV0->GetNDaughters(), motherV0->GetCalcMass(), massV0, v0part->MassK0Short()));
2130  }
2131  else if (!motherV0){
2132  AliDebug(3, "could not access MC info for mother, continuing");
2133  }
2134  else {
2135  AliDebug(3, "MC mother is a gluon, continuing");
2136  }
2137  }
2138  else {
2139  AliDebug(3, "Background V0!");
2140  isBkgV0 = kTRUE;
2141  }
2142  }
2143  }
2144 
2145  AliDebug(2, Form("isMCokV0 = %d, isBkgV0 = %d", (Int_t)isMCokV0, (Int_t)isBkgV0));
2146 
2147  // Going back to Lc
2148 
2149  //* Get Lc invariant mass
2150  Double_t massLc = 999999, sigmaMassLc= 999999;
2151  Int_t retMLc = Lc.GetMass( massLc, sigmaMassLc );
2152  if( retMLc ) {
2153  AliDebug(3, Form("----> Could not get mass (%e), and sigma(%e) for Lc, continuing", massLc, sigmaMassLc));
2154  if (massLc < 0) {
2155  codeKFLc = 1; // Mass not ok
2156  if (sigmaMassLc > 1e19) codeKFLc = 5; // Mass and SigmaMass not ok
2157  }
2158  else if (sigmaMassLc > 1e19) codeKFLc = 2; // SigmaMass not ok
2159  }
2160  fHistoMassKFLc->Fill(massLc, sigmaMassLc);
2161 
2162  //* Get Lc Decay length
2163  Double_t decayLengthLc = 999999, sigmaDecayLengthLc = 999999;
2164  Int_t retDLLc = Lc.GetDecayLength( decayLengthLc, sigmaDecayLengthLc );
2165  if( retDLLc ) {
2166  AliDebug(3, "----> Lc: Could not get decay length, and sigma");
2167  if (sigmaDecayLengthLc > 1e19) {
2168  codeKFLc = 3; // DecayLength not ok
2169  if (massLc < 0) {
2170  codeKFLc = 6; // DecayLength and Mass not ok
2171  if (sigmaMassLc > 1e19) codeKFLc = 11; // DecayLength and Mass and SigmaMass not ok
2172  }
2173  else if (sigmaMassLc > 1e19) codeKFLc = 8; // DecayLength and SigmaMass not ok
2174  }
2175  }
2176  AliDebug(3, Form("retDLLc = %d, with decayLength = %f and error = %e", retDLLc, decayLengthLc, sigmaDecayLengthLc));
2177 
2178  fHistoDecayLengthKFLc->Fill(decayLengthLc, sigmaDecayLengthLc);
2179 
2180  //* Get Lc life time
2181  Double_t lifeTimeLc = 999999, sigmaLifeTimeLc = 999999;
2182  Int_t retTLLc = Lc.GetLifeTime( lifeTimeLc, sigmaLifeTimeLc );
2183  if( retTLLc ) {
2184  AliDebug(3, "----> Lc: Could not get lifeTime, and sigma");
2185  if (sigmaLifeTimeLc > 1e19) {
2186  codeKFLc = 4; // LifeTime not ok
2187  if (sigmaDecayLengthLc > 1e19) {
2188  codeKFLc = 9; // LifeTime and DecayLength not ok
2189  if (massLc < 0) {
2190  codeKFLc = 14; // LifeTime and DecayLength and Mass not ok
2191  if (sigmaMassLc > 1e19) codeKFLc = 15; // LifeTime and DecayLength and Mass and SigmaMass not ok
2192  }
2193  else if (sigmaMassLc > 1e19) codeKFLc = 13; // LifeTime and DecayLength and SigmaMass not ok
2194  }
2195  else if (massLc < 0) { // LifeTime and Mass and SigmaMass not ok
2196  codeKFLc = 7; // LifeTime and Mass not ok
2197  if (sigmaMassLc > 1e19) codeKFLc = 12; // LifeTime and Mass and SigmaMass not ok
2198  }
2199  else if (sigmaMassLc > 1e19) codeKFLc = 10; // LifeTime and SigmaMass not ok
2200  }
2201  }
2202 
2203  fHistoLifeTimeKFLc->Fill(lifeTimeLc, sigmaLifeTimeLc);
2204 
2205  AliDebug(2, Form("Lc: mass = %f (error = %e), decay length = %f (error = %e), life time = %f (error = %e) --> codeKFLc = %d", massLc, sigmaMassLc, decayLengthLc, sigmaDecayLengthLc, lifeTimeLc, sigmaLifeTimeLc, codeKFLc));
2206 
2207  if (codeKFLc == -1) codeKFLc = 0;
2208  fHistoKFLc->Fill(codeKFLc);
2209 
2210  fHistoKF->Fill(codeKFV0, codeKFLc);
2211 
2212  // here we fill the histgrams for all the reconstructed KF vertices for the cascade
2213  fHistoMassLcAll->Fill(massLc);
2214  fHistoDecayLengthLcAll->Fill(decayLengthLc);
2215  fHistoLifeTimeLcAll->Fill(lifeTimeLc);
2216 
2217  fHistoMassV0fromLcAll->Fill(massV0);
2218  fHistoDecayLengthV0fromLcAll->Fill(decayLengthV0);
2219  fHistoLifeTimeV0fromLcAll->Fill(lifeTimeV0);
2220 
2221  Double_t xV0 = V0.GetX();
2222  Double_t yV0 = V0.GetY();
2223  Double_t zV0 = V0.GetZ();
2224 
2225  Double_t xLc = Lc.GetX();
2226  Double_t yLc = Lc.GetY();
2227  Double_t zLc = Lc.GetZ();
2228 
2229  Double_t xPrimVtx = primVtxCopy.GetX();
2230  Double_t yPrimVtx = primVtxCopy.GetY();
2231  Double_t zPrimVtx = primVtxCopy.GetZ();
2232 
2233  Double_t distanceLcToPrimVtx = TMath::Sqrt((xPrimVtx - xLc) * (xPrimVtx - xLc) +
2234  (yPrimVtx - yLc) * (yPrimVtx - yLc) +
2235  (zPrimVtx - zLc) * (zPrimVtx - zLc));
2236 
2237  Double_t distanceV0ToPrimVtx = TMath::Sqrt((xPrimVtx - xV0) * (xPrimVtx - xV0) +
2238  (yPrimVtx - yV0) * (yPrimVtx - yV0) +
2239  (zPrimVtx - zV0) * (zPrimVtx - zV0));
2240 
2241  Double_t distanceV0ToLc = TMath::Sqrt((xLc - xV0)*(xLc - xV0) +
2242  (yLc - yV0)*(yLc - yV0) +
2243  (zLc - zV0)*(zLc - zV0));
2244 
2245  //Printf("distanceLcToPrimVtx = %e, distanceV0ToPrimVtx= %f, distanceV0ToLc = %f", distanceLcToPrimVtx, distanceV0ToPrimVtx, distanceV0ToLc);
2246 
2247  fHistoDistanceLcToPrimVtx->Fill(distanceLcToPrimVtx);
2248  fHistoDistanceV0ToPrimVtx->Fill(distanceV0ToPrimVtx);
2249  fHistoDistanceV0ToLc->Fill(distanceV0ToLc);
2250 
2251  distances[0] = distanceLcToPrimVtx;
2252  distances[1] = distanceV0ToPrimVtx;
2253  distances[2] = distanceV0ToLc;
2254 
2255  if (fUseMCInfo) {
2256 
2257  AliAODMCParticle *daughv01Lc = 0x0;
2258  AliAODMCParticle *K0S = 0x0;
2259  AliAODMCParticle *daughv02Lc = 0x0;
2260 
2261  if (labelsLcdaugh[0] >= 0) {
2262  // Printf("Getting Bachelor from label %d", labelsLcdaugh[1]);
2263  daughv01Lc = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsLcdaugh[0]));
2264  if (!daughv01Lc){
2265  AliDebug(3, "Could not access MC info for first daughter of Lc");
2266  isMCokLc = kFALSE;
2267  }
2268  else {
2269  AliDebug(2, Form("The bachelor has label = %d", daughv01Lc->GetLabel()));
2270  if (TMath::Abs(daughv01Lc->GetPdgCode()) != 2212) isBkgLc = kTRUE;
2271  }
2272  }
2273  else { // The bachelor is a fake
2274  isBkgLc = kTRUE;
2275  }
2276 
2277  if (labelsLcdaugh[1] >= 0) {
2278  //Printf("Getting K0S");
2279  K0S = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelsLcdaugh[1]));
2280  if (!K0S) {
2281  AliDebug(3, "Could not access MC info for second daughter of Lc");
2282  isMCokLc = kFALSE;
2283  }
2284  else{
2285  if (TMath::Abs(K0S->GetPdgCode()) != 310) isBkgLc = kTRUE;
2286  }
2287  }
2288  else{
2289  AliDebug(2, "The K0S is not true --> it does not have a label, continuing...");
2290  isBkgLc = kTRUE;
2291  }
2292 
2293  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
2294  if (isMCokLc) { // We can then access its MC info, and it might then be that also the Lc is a true Lc
2295  Int_t iK0 = K0S->GetMother();
2296  if (iK0 < 0) {
2297  Printf("The K0S has no mother... IMPOSSIBLE"); // the K0S MUST have a mother!
2298  }
2299  else { // The K0S has a mother
2300  daughv02Lc = dynamic_cast<AliAODMCParticle*>(mcArray->At(iK0));
2301  if (!daughv02Lc){
2302  AliDebug(3, "Could not access MC info for second daughter of Lc");
2303  }
2304  else { // we can access safely the K0S mother in the MC
2305  if( daughv01Lc && (daughv01Lc->GetMother() == daughv02Lc->GetMother()) && (daughv01Lc->GetMother()>=0) ){ // This is a true cascade! bachelor and V0 come from the same mother
2306  //Printf("Lc: The mother has label %d", daughv01Lc->GetMother());
2307  AliAODMCParticle *motherLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(daughv01Lc->GetMother()));
2308  Int_t pdgMum = 0, pdgBach = 0, pdgV0 = 0;
2309  if (motherLc) pdgMum = motherLc->GetPdgCode();
2310  if (daughv01Lc) pdgBach = daughv01Lc->GetPdgCode();
2311  if (daughv02Lc) pdgV0 = daughv02Lc->GetPdgCode();
2312  AliDebug(2, Form("pdgMum = %d, pdgBach = %d, pdgV0 = %d", pdgMum, pdgBach, pdgV0));
2313 
2314  if( motherLc && TMath::Abs(motherLc->GetPdgCode()) != 21 ){ // These are true cascades, we don't know yet if they are Lc
2315  fHistoMassLcTrue->Fill(massLc);
2316  fHistoDecayLengthLcTrue->Fill(decayLengthLc);
2317  fHistoLifeTimeLcTrue->Fill(lifeTimeLc);
2318  fHistoMassLcTrueFromAOD->Fill(cascade->InvMassLctoK0sP());
2319 
2320  fHistoMassV0fromLcTrue->Fill(massV0);
2321  fHistoDecayLengthV0fromLcTrue->Fill(decayLengthV0);
2322  fHistoLifeTimeV0fromLcTrue->Fill(lifeTimeV0);
2323 
2324  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...
2325  AliDebug(2, Form("IT IS SIGNAL!!! with label = %d", motherLc->GetLabel()));
2326 
2327  fHistoArmenterosPodolanskiV0KFSgn->Fill(qtAlphaV0[1], qtAlphaV0[0]);
2328  fHistoArmenterosPodolanskiV0AODSgn->Fill(v0part->AlphaV0(), v0part->PtArmV0());
2329 
2330  fHistoDistanceLcToPrimVtxSgn->Fill(distanceLcToPrimVtx);
2331  fHistoDistanceV0ToPrimVtxSgn->Fill(distanceV0ToPrimVtx);
2332  fHistoDistanceV0ToLcSgn->Fill(distanceV0ToLc);
2333 
2334  fHistoMassLcSgn->Fill(massLc);
2335  fHistoMassLcSgnFromAOD->Fill(cascade->InvMassLctoK0sP());
2336 
2337  fHistoDecayLengthLcSgn->Fill(decayLengthLc);
2338  fHistoLifeTimeLcSgn->Fill(lifeTimeLc);
2339 
2340  fHistoMassV0fromLcSgn->Fill(massV0);
2341  fHistoDecayLengthV0fromLcSgn->Fill(decayLengthV0);
2342  fHistoLifeTimeV0fromLcSgn->Fill(lifeTimeV0);
2343  }
2344  else {
2345  isBkgLc = kTRUE; // it is not a Lc, since the pdg != 4122
2346  }
2347 
2348  // if we got here, we can compare with MC information; this part is done also for cases where the cascade is not a Lc!
2349  // First, we compare the vtx of the Lc
2350  Double_t xLcMC = motherLc->Xv();
2351  Double_t yLcMC = motherLc->Yv();
2352  Double_t zLcMC = motherLc->Zv();
2353  //Printf("Got MC vtx for Lc");
2354  Double_t xProtonMC = daughv01Lc->Xv();
2355  Double_t yProtonMC = daughv01Lc->Yv();
2356  Double_t zProtonMC = daughv01Lc->Zv();
2357  //Printf("Got MC vtx for Proton");
2358 
2359  Double_t vtxLcResidualToPrimVtx = TMath::Sqrt((xLcMC - xProtonMC) * (xLcMC - xProtonMC) +
2360  (yLcMC - yProtonMC) * (yLcMC - yProtonMC) +
2361  (zLcMC - zProtonMC) * (zLcMC - zProtonMC)) - distanceLcToPrimVtx;
2362 
2363  // Then, we compare the vtx of the K0s
2364  Double_t xV0MC = motherV0->Xv(); //Production vertex of K0S --> Where Lc decays
2365  Double_t yV0MC = motherV0->Yv();
2366  Double_t zV0MC = motherV0->Zv();
2367 
2368  //Printf("Got MC vtx for V0");
2369  Double_t xPionMC = daughv01->Xv(); //Production vertex of Pion --> Where K0S decays
2370  Double_t yPionMC = daughv01->Yv();
2371  Double_t zPionMC = daughv01->Zv();
2372  //Printf("Got MC vtx for Pion");
2373  Printf("Vertices: MC: x = %f, y = %f, z = %f", xPionMC, yPionMC, zPionMC);
2374 
2375  Double_t vtxV0ResidualToLc = TMath::Sqrt((xV0MC - xPionMC) * (xV0MC - xPionMC) +
2376  (yV0MC - yPionMC) * (yV0MC - yPionMC) +
2377  (zV0MC - zPionMC) * (zV0MC - zPionMC)) - distanceV0ToLc;
2378 
2379  // Then, the K0S vertex wrt primary vertex
2380 
2381  Double_t vtxV0ResidualToPrimVtx = TMath::Sqrt((xPionMC - xLcMC) * (xPionMC - xLcMC) +
2382  (yPionMC - yLcMC) * (yPionMC - yLcMC) +
2383  (zPionMC - zLcMC) * (zPionMC - zLcMC)) - distanceV0ToPrimVtx;
2384 
2385  fHistoVtxLcResidualToPrimVtx->Fill(vtxLcResidualToPrimVtx);
2386  fHistoVtxV0ResidualToLc->Fill(vtxV0ResidualToLc);
2387  fHistoVtxV0ResidualToPrimVtx->Fill(vtxV0ResidualToPrimVtx);
2388 
2389  } //closing: if( motherLc && TMath::Abs(motherLc->GetPdgCode()) != 21 )
2390  else if (!motherLc){
2391  AliDebug(2, "We could not access MC info for Lc mother, so we did nothing");
2392  }
2393  else {
2394  AliDebug(2, "MC Lc mother is a gluon, so we did nothing");
2395  }
2396  } //closing: if( daughv01Lc->GetMother() == daughv02Lc->GetMother() && daughv01Lc->GetMother()>=0 )
2397  else {
2398  isBkgLc = kTRUE; // it cannot be a Lc, since the daughters do not have the same mother
2399  }
2400  } // closing: else { // we can access safely the K0S mother in the MC
2401  } // closing: else { // The K0S has a mother
2402  } // closing isMCLcok
2403  } // closing !isBkgLc
2404  } // closing fUseMCInfo
2405 
2406  //Printf("retMV0 = %d, retMLc = %d", retMV0, retMLc);
2407  if ( retMV0 == 0 && retMLc == 0){
2408  V0KF[0] = massV0;
2409  errV0KF[0] = sigmaMassV0;
2410  V0KF[1] = decayLengthV0;
2411  errV0KF[1] = sigmaDecayLengthV0;
2412  V0KF[2] = lifeTimeV0;
2413  errV0KF[2] = sigmaLifeTimeV0;
2414  LcKF[0] = massLc;
2415  errLcKF[0] = sigmaMassLc;
2416  LcKF[1] = decayLengthLc;
2417  errLcKF[1] = sigmaDecayLengthLc;
2418  LcKF[2] = lifeTimeLc;
2419  errLcKF[2] = sigmaLifeTimeLc;
2420  }
2421 
2422  return 1;
2423 
2424 }
2425 //________________________________________________________________________
2427  AliAODTrack* bachelor,
2428  TClonesArray *mcArray ){
2429 
2430  //Printf("In CheckBachelor");
2431 
2434 
2435  Int_t label = bachelor->GetLabel();
2436  if (label == -1) {
2437  return kBachFake;
2438  }
2439 
2440  AliAODMCParticle *mcpart = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(label)));
2441  if (!mcpart) return kBachInvalid;
2442  Int_t pdg = mcpart->PdgCode();
2443  if (TMath::Abs(pdg) != 2212) {
2444  AliDebug(2, Form("Bachelor is not a p, but a particle with pdg code = %d", pdg));
2445  return kBachNoProton;
2446  }
2447  else { // it is a proton
2448  //Int_t labelLc = part->GetLabel();
2449  Int_t labelLc = FindLcLabel(part, mcArray);
2450  //Printf(">>>>>>>>>>>>> label for Lc = %d", labelLc);
2451  Int_t bachelorMotherLabel = mcpart->GetMother();
2452  //Printf(">>>>>>>>>>>>> label for bachelorMother = %d", bachelorMotherLabel);
2453  if (bachelorMotherLabel == -1) {
2454  return kBachPrimary;
2455  }
2456  AliAODMCParticle *bachelorMother = dynamic_cast<AliAODMCParticle*>(mcArray->At(bachelorMotherLabel));
2457  if (!bachelorMother) return kBachInvalid;
2458  Int_t pdgMother = bachelorMother->PdgCode();
2459  if (TMath::Abs(pdgMother) != 4122) {
2460  AliDebug(2, Form("The proton does not come from a Lc, but from a particle with pdgcode = %d", pdgMother));
2461  return kBachNoLambdaMother;
2462  }
2463  else { // it comes from Lc
2464  if (labelLc != bachelorMotherLabel){
2465  //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));
2466  AliDebug(2, Form("The proton comes from a Lc, but it is not the candidate we are analyzing"));
2468  }
2469  else { // it comes from the correct Lc
2470  AliDebug(2, Form("The proton comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2471  return kBachCorrectLambdaMother;
2472  }
2473  }
2474  }
2475 
2476  return kBachInvalid;
2477 
2478 }
2479 
2480 //________________________________________________________________________
2482  AliAODv0* v0part,
2483  //AliAODTrack* v0part,
2484  TClonesArray *mcArray ){
2485 
2488 
2489  //Printf(" CheckK0S");
2490 
2491  //Int_t labelMatchToMC = v0part->MatchToMC(310, mcArray);
2492  //Int_t label = v0part->GetLabel();
2493  Int_t labelFind = FindV0Label(v0part, mcArray);
2494  //Printf("\n >>>>>>>>>>>>> label for V0 = %d, from MatchToMC = %d, from Find = %d", label, labelMatchToMC, labelFind);
2495  if (labelFind == -1) {
2496  return kK0SFake;
2497  }
2498 
2499  AliAODMCParticle *mcpart = dynamic_cast<AliAODMCParticle*>(mcArray->At(labelFind));
2500  if (!mcpart) return kK0SInvalid;
2501  Int_t pdg = mcpart->PdgCode();
2502  if (TMath::Abs(pdg) != 310) {
2503  AliDebug(2, Form("K0Spart is not a K0S, but a particle with pdg code = %d", pdg));
2504  //AliInfo(Form("K0Spart is not a K0S, but a particle with pdg code = %d", pdg));
2505  return kK0SNoK0S;
2506  }
2507  else { // it is a K0S
2508  //Int_t labelLc = part->GetLabel();
2509  Int_t labelLc = FindLcLabel(part, mcArray);
2510  Int_t K0SpartMotherLabel = mcpart->GetMother();
2511  if (K0SpartMotherLabel == -1) {
2512  return kK0SWithoutMother;
2513  }
2514  AliAODMCParticle *K0SpartMother = dynamic_cast<AliAODMCParticle*>(mcArray->At(K0SpartMotherLabel)); // should be a K0 in case of signal
2515  if (!K0SpartMother) return kK0SInvalid;
2516  Int_t pdgMotherK0S = K0SpartMother->PdgCode();
2517  if (TMath::Abs(pdgMotherK0S) != 311) {
2518  AliDebug(2, Form("The K0S does not come from a K0, but from a particle with pdgcode = %d", pdgMotherK0S));
2519  //AliInfo(Form("The K0S does not come from a K0, but from a particle with pdgcode = %d", pdgMotherK0S));
2520  return kK0SNotFromK0;
2521  }
2522  else { // the K0S comes from a K0
2523  Int_t K0MotherLabel = K0SpartMother->GetMother(); // mother of K0 --> Lc in case of signal
2524  if (K0MotherLabel == -1) {
2525  return kK0Primary;
2526  }
2527  AliAODMCParticle *K0Mother = dynamic_cast<AliAODMCParticle*>(mcArray->At(K0MotherLabel));
2528  if (!K0Mother) return kK0SInvalid;
2529  Int_t pdgK0Mother = K0Mother->PdgCode();
2530  if (TMath::Abs(pdgK0Mother) != 4122) { // the K0 does not come from a Lc
2531  AliDebug(2, Form("The K0 does not come from a Lc, but from a particle with pdgcode = %d", pdgK0Mother));
2532  //AliInfo(Form("The K0 does not come from a Lc, but from a particle with pdgcode = %d", pdgK0Mother));
2533  return kK0NoLambdaMother;
2534  }
2535  else { // the K0 comes from Lc
2536  if (labelLc != K0MotherLabel){ // The K0 comes from a different Lc
2537  AliDebug(2, Form("The K0S comes from a Lc, but it is not the candidate we are analyzing"));
2538  //AliInfo(Form("The K0S comes from a Lc, but it is not the candidate we are analyzing"));
2539  return kK0DifferentLambdaMother;
2540  }
2541  else { // it comes from the correct Lc
2542  AliDebug(2, Form("The K0S comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2543  //AliInfo(Form("The K0S comes from a Lc, and it is EXACTLY the candidate we are analyzing"));
2544  return kK0CorrectLambdaMother;
2545  }
2546  }
2547  }
2548  }
2549 
2550  return kK0SInvalid;
2551 
2552 }
2553 
2554 //----------------------------------------------------------------------------
2555 Int_t AliAnalysisTaskSELc2V0bachelorTMVA::FindV0Label(AliAODRecoDecay* v0part, TClonesArray *mcArray) const
2556 {
2557 
2558  //Printf(" FindV0Label");
2559 
2561 
2562  Int_t labMother[2]={-1, -1};
2563  AliAODMCParticle *part=0;
2564  AliAODMCParticle *mother=0;
2565  Int_t dgLabels = -1;
2566 
2567  Int_t ndg = v0part->GetNDaughters();
2568  if (ndg != 2) {
2569  AliFatal(Form("IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2570  }
2571 
2572  for(Int_t i = 0; i < 2; i++) {
2573  AliAODTrack *trk = (AliAODTrack*)v0part->GetDaughter(i);
2574  dgLabels = trk->GetLabel();
2575  if (dgLabels == -1) {
2576  //printf("daughter with negative label %d\n", dgLabels);
2577  return -1;
2578  }
2579  part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2580  if (!part) {
2581  //printf("no MC particle\n");
2582  return -1;
2583  }
2584  labMother[i] = part->GetMother();
2585  if (labMother[i] != -1){
2586  mother = (AliAODMCParticle*)mcArray->At(labMother[i]);
2587  if(!mother) {
2588  //printf("no MC mother particle\n");
2589  return -1;
2590  }
2591  }
2592  else {
2593  return -1;
2594  }
2595  }
2596 
2597  if (labMother[0] == labMother[1]) return labMother[0];
2598 
2599  else return -1;
2600 
2601 }
2602 
2603 //----------------------------------------------------------------------------
2604 Int_t AliAnalysisTaskSELc2V0bachelorTMVA::FindLcLabel(AliAODRecoCascadeHF* cascade, TClonesArray *mcArray) const
2605 {
2606 
2608 
2609  //Printf(" FindLcLabel");
2610 
2611  AliAODMCParticle *part=0;
2612  AliAODMCParticle *mother=0;
2613  AliAODMCParticle *grandmother=0;
2614  Int_t dgLabels = -1;
2615 
2616  Int_t ndg = cascade->GetNDaughters();
2617  if (ndg != 2) {
2618  AliFatal(Form("IMPOSSIBLE!! There are %d daughters, but they should be 2!", ndg));
2619  }
2620 
2621  // daughter 0 --> bachelor, daughter 1 --> V0
2622  AliAODTrack *trk = (AliAODTrack*)cascade->GetDaughter(0); // bachelor
2623  dgLabels = trk->GetLabel();
2624  if (dgLabels == -1 ) {
2625  //printf("daughter with negative label %d\n", dgLabels);
2626  return -1;
2627  }
2628  part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2629  if (!part) {
2630  //printf("no MC particle\n");
2631  return -1;
2632  }
2633  Int_t labMotherBach = part->GetMother();
2634  if (labMotherBach == -1){
2635  return -1;
2636  }
2637  mother = (AliAODMCParticle*)mcArray->At(labMotherBach);
2638  if(!mother) {
2639  //printf("no MC mother particle\n");
2640  return -1;
2641  }
2642 
2643  AliAODv0 *v0 = (AliAODv0*)cascade->GetDaughter(1); // V0
2644  dgLabels = FindV0Label(v0, mcArray);
2645  if (dgLabels == -1 ) {
2646  //printf("daughter with negative label (v0 was a fake) %d\n", dgLabels);
2647  return -1;
2648  }
2649  part = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels));
2650  if (!part) {
2651  //printf("no MC particle\n");
2652  return -1;
2653  }
2654  Int_t labMotherv0 = part->GetMother();
2655  if (labMotherv0 == -1){
2656  return -1;
2657  }
2658  mother = (AliAODMCParticle*)mcArray->At(labMotherv0);
2659  if(!mother) {
2660  //printf("no MC mother particle\n");
2661  return -1;
2662  }
2663  Int_t labGrandMotherv0 = mother->GetMother();
2664  if (labGrandMotherv0 == -1){
2665  return -1;
2666  }
2667  grandmother = (AliAODMCParticle*)mcArray->At(labGrandMotherv0);
2668  if(!grandmother) {
2669  //printf("no MC mother particle\n");
2670  return -1;
2671  }
2672 
2673  //Printf("labMotherBach = %d, labMotherv0 = %d, labGrandMotherv0 = %d", labMotherBach, labMotherv0, labGrandMotherv0);
2674  if (labGrandMotherv0 == labMotherBach) return labMotherBach;
2675 
2676  else return -1;
2677 
2678 }
2679 
2680 
2681 
2682 
2683 
2684 
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
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)
static Int_t GetGeneratedPhysicalPrimariesInEtaRange(TClonesArray *arrayMC, Double_t mineta, Double_t maxeta)
TH1D * fHistoDistanceV0ToPrimVtxSgn
! KF: distance for signal Lc of V0 vertex from primary vertex
TF1 * fFuncWeightPythia
mask to the trigger word returned by the physics selection
TH2D * fHistoArmenterosPodolanskiV0KF
! KF: Armeteros-Podolanski plot for all V0 from KF
TH1D * fHistoDecayLengthV0fromLcTrue
! KF: decay length of V0 for true cascades reconstructed with KF
Bool_t GetIsUsePID() const
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.