]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGHF/vertexingHF/AliAnalysisTaskSELc2V0bachelor.cxx
Coverity
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAnalysisTaskSELc2V0bachelor.cxx
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$ */
17
18 //
19 //
20 //               Base class for Lc2V0 Analysis
21 //
22 //
23 //  The Lc spectra study is done 2D histograms:
24 //   cascade_invariantMass VS cascade_pT
25 //
26 //  Cuts have been centralized in AliRDHFCutsLctoV0 class
27 //
28 //-------------------------------------------------------------------------
29 //
30 //                 Authors: A.De Caro(a,b), P. Pagano(b)
31 //  (a) Centro 'E.Fermi' - Roma
32 //  (b) INFN and University of Salerno
33 //
34 //  Contatcs: decaro@sa.infn.it
35 //            paola.pagano@sa.infn.it
36 //-------------------------------------------------------------------------
37
38 #include <TSystem.h>
39 #include <TParticle.h>
40 #include <TParticlePDG.h>
41 #include <TH1F.h>
42 #include <TH1I.h>
43 #include <TH2F.h>
44 #include <TTree.h>
45 #include "TROOT.h"
46 #include <TDatabasePDG.h>
47 #include <AliAnalysisDataSlot.h>
48 #include <AliAnalysisDataContainer.h>
49 #include "AliStack.h"
50 #include "AliMCEvent.h"
51 #include "AliAnalysisManager.h"
52 #include "AliAODMCHeader.h"
53 #include "AliAODHandler.h"
54 #include "AliLog.h"
55 #include "AliAODVertex.h"
56 #include "AliAODRecoDecay.h"
57 #include "AliAODRecoDecayHF.h"
58 #include "AliAODRecoCascadeHF.h"
59 #include "AliAnalysisVertexingHF.h"
60 #include "AliESDtrack.h"
61 #include "AliAODTrack.h"
62 #include "AliAODv0.h"
63 #include "AliAODMCParticle.h"
64 #include "AliAnalysisTaskSE.h"
65 #include "AliAnalysisTaskSELc2V0bachelor.h"
66 #include "AliNormalizationCounter.h"
67 #include "AliAODPidHF.h"
68 #include "AliPIDResponse.h"
69 #include "AliTOFPIDResponse.h"
70 #include "AliInputEventHandler.h"
71
72 using std::cout;
73 using std::endl;
74
75 ClassImp(AliAnalysisTaskSELc2V0bachelor)
76
77 //__________________________________________________________________________
78 AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor():  
79   AliAnalysisTaskSE(),
80   fUseMCInfo(kFALSE),
81   fOutput(0),
82   fOutputAll(0),
83   fOutputPIDBach(0),
84   fCEvents(0),
85   fPIDResponse(0),
86   fIsK0sAnalysis(kFALSE),
87   fCounter(0),
88   fProdCuts(0),
89   fAnalCuts(0),
90   fListCuts(0),
91   fUseOnTheFlyV0(kFALSE),
92   fIsEventSelected(kFALSE),
93   fWriteVariableTree(kFALSE),
94   fVariablesTree(0),
95   fCandidateVariables(),
96   fVtx1(0),
97   fBzkG(0)
98 {
99   //
100   // Default ctor
101   //
102 }
103 //___________________________________________________________________________
104 AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor(const Char_t* name, AliRDHFCutsLctoV0* prodCuts,
105                                                                AliRDHFCutsLctoV0* analCuts, Bool_t useOnTheFly,
106                                                                Bool_t writeVariableTree) :
107   AliAnalysisTaskSE(name),
108   fUseMCInfo(kFALSE),
109   fOutput(0),
110   fOutputAll(0),
111   fOutputPIDBach(0),
112   fCEvents(0),
113   fPIDResponse(0),
114   fIsK0sAnalysis(kFALSE),
115   fCounter(0),
116   fProdCuts(prodCuts),
117   fAnalCuts(analCuts),
118   fListCuts(0),
119   fUseOnTheFlyV0(useOnTheFly),
120   fIsEventSelected(kFALSE),
121   fWriteVariableTree(writeVariableTree),
122   fVariablesTree(0),
123   fCandidateVariables(),
124   fVtx1(0),
125   fBzkG(0)
126 {
127   //
128   // Constructor. Initialization of Inputs and Outputs
129   //
130   Info("AliAnalysisTaskSELc2V0bachelor","Calling Constructor");
131
132   DefineOutput(1,TList::Class());  //conters
133   DefineOutput(2,TList::Class());  //All Entries output
134   DefineOutput(3,TList::Class());  //3sigma PID output
135   DefineOutput(4,AliNormalizationCounter::Class());
136   DefineOutput(5,TList::Class());
137
138   // Output slot #6 keeps a tree of the candidate variables after track selection
139   if (fWriteVariableTree) DefineOutput(6,TTree::Class());  //My private output
140
141 }
142
143 //___________________________________________________________________________
144 AliAnalysisTaskSELc2V0bachelor::~AliAnalysisTaskSELc2V0bachelor() {
145   //
146   // destructor
147   //
148   Info("~AliAnalysisTaskSELc2V0bachelor","Calling Destructor");
149   
150   if (fOutput) {
151     delete fOutput;
152     fOutput = 0;
153   }
154
155   if (fOutputAll) {
156     delete fOutputAll;
157     fOutputAll = 0;
158   }
159
160   if (fOutputPIDBach) {
161     delete fOutputPIDBach;
162     fOutputPIDBach = 0;
163   }
164
165   if (fPIDResponse) {
166     delete  fPIDResponse;
167   }
168
169   if (fCounter) {
170     delete fCounter;
171     fCounter = 0;
172   }
173
174   if (fProdCuts) {
175     delete fProdCuts;
176     fProdCuts = 0;
177   }
178
179   if (fAnalCuts) {
180     delete fAnalCuts;
181     fAnalCuts = 0;
182   }
183
184   if (fListCuts) {
185     delete fListCuts;
186     fListCuts = 0;
187   }
188
189   if(fVariablesTree){
190     delete fVariablesTree;
191     fVariablesTree = 0;
192   }
193
194 }
195 //_________________________________________________
196 void AliAnalysisTaskSELc2V0bachelor::Init() {
197   //
198   // Initialization
199   //
200
201   fIsEventSelected=kFALSE;
202
203   if (fDebug > 1) AliInfo("Init");
204
205   fListCuts = new TList();
206   fListCuts->SetOwner();
207   fListCuts->Add(new AliRDHFCutsLctoV0(*fProdCuts));
208   fListCuts->Add(new AliRDHFCutsLctoV0(*fAnalCuts));
209   PostData(5,fListCuts);
210
211   return;
212 }
213
214 //_________________________________________________
215 void AliAnalysisTaskSELc2V0bachelor::UserExec(Option_t *)
216 {
217   // user exec
218   if (!fInputEvent) {
219     AliError("NO EVENT FOUND!");
220     return;
221   }
222
223   AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
224   TClonesArray *arrayLctopKos=0;
225
226   if (!aodEvent && AODEvent() && IsStandardAOD()) {
227     // In case there is an AOD handler writing a standard AOD, use the AOD 
228     // event in memory rather than the input (ESD) event.    
229     aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
230     // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
231     // have to taken from the AOD event hold by the AliAODExtension
232     AliAODHandler* aodHandler = (AliAODHandler*) 
233       ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
234    
235     if (aodHandler->GetExtensions()) {
236       AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
237       AliAODEvent *aodFromExt = ext->GetAOD();
238       arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject("CascadesHF");
239     }
240   } else {
241     arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
242   }
243
244   fCEvents->Fill(1);
245   fCounter->StoreEvent(aodEvent,fAnalCuts,fUseMCInfo);
246
247   // AOD primary vertex
248   fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
249   if (!fVtx1) return;
250
251   // fix for temporary bug in ESDfilter 
252   fBzkG = (Double_t)aodEvent->GetMagneticField(); 
253   if (TMath::Abs(fBzkG)<0.001) return;
254   fCEvents->Fill(2);
255
256   Float_t zVertex = fVtx1->GetZ();
257   ((TH1F*)(fOutput->FindObject("hZ2")))->Fill(zVertex);
258
259   if (fVtx1->GetNContributors()<1) return;
260   fCEvents->Fill(3);
261
262   ((TH1F*)(fOutput->FindObject("hZ3")))->Fill(zVertex);
263
264   if (!arrayLctopKos) {
265     AliInfo("Could not find array of HF cascades, skipping the event");
266     return;
267   } else {
268     if (arrayLctopKos->GetEntriesFast()) {
269       AliInfo(Form("Found %d cascades",arrayLctopKos->GetEntriesFast()));
270     }
271   }
272   fCEvents->Fill(4);
273   ((TH1F*)(fOutput->FindObject("hZ4")))->Fill(zVertex);
274
275   ///////////////////////
276   Bool_t check1 = kFALSE;
277   TString firedTriggerClasses = aodEvent->GetFiredTriggerClasses(); // trigger class
278   if ( !fUseMCInfo && // don't do for MC...
279        (aodEvent->GetRunNumber()<136851 || aodEvent->GetRunNumber()>139517) ) { // ...and for PbPb 2010 data
280     if ( !(firedTriggerClasses.Contains("CINT1")) ) {
281       AliInfo(Form(" ======================== firedTriggerClasses.Data() = %s",firedTriggerClasses.Data()));
282       fCEvents->Fill(8);
283       ((TH1F*)(fOutput->FindObject("hZ8")))->Fill(zVertex);
284       check1 = kTRUE;
285     }
286   }
287
288   ULong64_t fTriggerMask=AliVEvent::kAnyINT;
289   Bool_t isSelectedAAA = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
290   if (!isSelectedAAA) {
291     fCEvents->Fill(9);
292     ((TH1F*)(fOutput->FindObject("hZ9")))->Fill(zVertex);
293   }
294
295   if (!isSelectedAAA || check1) {
296     fCEvents->Fill(16);
297     ((TH1F*)(fOutput->FindObject("hZ16")))->Fill(zVertex);
298   }
299
300   fTriggerMask=AliVEvent::kAny;
301   Bool_t isSelectedBBB = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
302   if (!isSelectedBBB) {
303     fCEvents->Fill(10);
304     ((TH1F*)(fOutput->FindObject("hZ10")))->Fill(zVertex);
305   }
306
307   TString titleVtx=fVtx1->GetTitle();
308   if (titleVtx.Contains("Z")) {
309     fCEvents->Fill(11);
310     ((TH1F*)(fOutput->FindObject("hZ11")))->Fill(zVertex);
311   }
312   else if (titleVtx.Contains("3D")) {
313     fCEvents->Fill(12);
314     ((TH1F*)(fOutput->FindObject("hZ12")))->Fill(zVertex);
315   } else {
316     fCEvents->Fill(13);
317     ((TH1F*)(fOutput->FindObject("hZ13")))->Fill(zVertex);
318   }
319
320   if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
321     fCEvents->Fill(14);
322     ((TH1F*)(fOutput->FindObject("hZ14")))->Fill(zVertex);
323   }
324
325   fIsEventSelected = fAnalCuts->IsEventSelected(aodEvent);
326   if ( fIsEventSelected ) {
327     fCEvents->Fill(7);
328     ((TH1F*)(fOutput->FindObject("hZ7")))->Fill(zVertex);
329   } else {
330     fCEvents->Fill(15);
331     ((TH1F*)(fOutput->FindObject("hZ15")))->Fill(zVertex);
332   }
333   ///////////////////////
334
335   if ( !fIsEventSelected ) return; // don't take into account not selected events 
336
337   // mc analysis 
338   TClonesArray *mcArray = 0;
339   AliAODMCHeader *mcHeader=0;
340
341   if (fUseMCInfo) {
342     // MC array need for maching
343     mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
344     if (!mcArray) {
345       AliError("Could not find Monte-Carlo in AOD");
346       return;
347     }
348     fCEvents->Fill(5); // in case of MC events
349     ((TH1F*)(fOutput->FindObject("hZ5")))->Fill(zVertex);
350
351     // load MC header
352     mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
353     if (!mcHeader) {
354       AliError("AliAnalysisTaskSELc2V0bachelor::UserExec: MC header branch not found!\n");
355       return;
356     }
357     fCEvents->Fill(6);
358     ((TH1F*)(fOutput->FindObject("hZ6")))->Fill(zVertex);
359
360     // check on MC Lc Daughter
361     SearchLcDaughter(mcArray);
362
363   }
364
365   Int_t nSelectedProd = 0;
366   Int_t nSelectedAnal = 0;
367   if (fIsK0sAnalysis) {
368     MakeAnalysisForLc2prK0S(arrayLctopKos,mcArray,
369                             nSelectedProd, fProdCuts, nSelectedAnal, fAnalCuts);
370
371     if (nSelectedAnal) {
372
373       ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(4);
374       ((TH1F*)(fOutput->FindObject("hZ4a")))->Fill(zVertex);
375
376       Bool_t check1a = kFALSE;
377       if ( !fUseMCInfo && // don't do for MC...
378            (aodEvent->GetRunNumber()<136851 || aodEvent->GetRunNumber()>139517) ) { // ...and for PbPb 2010 data
379         if ( !(firedTriggerClasses.Contains("CINT1")) ) {
380           AliInfo(Form(" ======================== firedTriggerClasses.Data() = %s",firedTriggerClasses.Data()));
381           ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(8);
382           ((TH1F*)(fOutput->FindObject("hZ8a")))->Fill(zVertex);
383           check1a = kTRUE;
384         }
385       }
386
387       fTriggerMask=AliVEvent::kAnyINT;
388       Bool_t isSelectedAAAa = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
389       if (!isSelectedAAAa) {
390         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(9);
391         ((TH1F*)(fOutput->FindObject("hZ9a")))->Fill(zVertex);
392       }
393
394       if (!isSelectedAAAa || check1a) {
395         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(16);
396         ((TH1F*)(fOutput->FindObject("hZ16a")))->Fill(zVertex);
397       }
398
399       fTriggerMask=AliVEvent::kAny;
400       Bool_t isSelectedBBBa = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
401       if (!isSelectedBBBa) {
402         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(10);
403         ((TH1F*)(fOutput->FindObject("hZ10a")))->Fill(zVertex);
404       }
405
406       if (titleVtx.Contains("Z")) {
407         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(11);
408         ((TH1F*)(fOutput->FindObject("hZ11a")))->Fill(zVertex);
409       }
410       else if (titleVtx.Contains("3D")) {
411         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(12);
412         ((TH1F*)(fOutput->FindObject("hZ12a")))->Fill(zVertex);
413       } else {
414         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(13);
415         ((TH1F*)(fOutput->FindObject("hZ13a")))->Fill(zVertex);
416       }
417
418       if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
419         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(14);
420         ((TH1F*)(fOutput->FindObject("hZ14a")))->Fill(zVertex);
421       }
422
423       if ( fIsEventSelected ) {
424         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(7);
425         ((TH1F*)(fOutput->FindObject("hZ7a")))->Fill(zVertex);
426       } else {
427         ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(15);
428         ((TH1F*)(fOutput->FindObject("hZ15a")))->Fill(zVertex);
429       }
430     }
431
432   }
433
434
435   fCounter->StoreCandidates(aodEvent,nSelectedProd,kTRUE);
436   fCounter->StoreCandidates(aodEvent,nSelectedAnal,kFALSE);
437
438   PostData(1,fOutput);
439   PostData(2,fOutputAll);
440   PostData(3,fOutputPIDBach);
441   PostData(4,fCounter);
442   if (fWriteVariableTree) PostData(6,fVariablesTree);
443
444 }
445 //________________________________________ terminate ___________________________
446 void AliAnalysisTaskSELc2V0bachelor::Terminate(Option_t*)
447 {    
448   // The Terminate() function is the last function to be called during
449   // a query. It always runs on the client, it can be used to present
450   // the results graphically or save the results to file.
451   
452   //AliInfo("Terminate","");
453   AliAnalysisTaskSE::Terminate();
454   
455   fOutput = dynamic_cast<TList*> (GetOutputData(1));
456   if (!fOutput) {     
457     AliError("fOutput not available");
458     return;
459   }
460   
461   //fCEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fCEvents"));
462
463   fOutputAll = dynamic_cast<TList*> (GetOutputData(2));
464   if (!fOutputAll) {
465     AliError("fOutputAll not available");
466     return;
467   }
468
469   fOutputPIDBach = dynamic_cast<TList*> (GetOutputData(3));
470   if (!fOutputPIDBach) {
471     AliError("fOutputPIDBach not available");
472     return;
473   }
474
475   return;
476 }
477 //___________________________________________________________________________
478 void AliAnalysisTaskSELc2V0bachelor::UserCreateOutputObjects() { 
479   // output
480   AliInfo(Form("CreateOutputObjects of task %s\n", GetName()));
481   
482   //slot #1  
483   //OpenFile(1);
484   fOutput = new TList();
485   fOutput->SetOwner();
486   fOutput->SetName("chist0");
487
488   fOutputAll = new TList();
489   fOutputAll->SetOwner();
490   fOutputAll->SetName("listAll");
491
492   fOutputPIDBach = new TList();
493   fOutputPIDBach->SetOwner();
494   fOutputPIDBach->SetName("listPIDBach");
495
496   // define histograms
497   DefineHistograms();
498   
499   AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
500   AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
501   fPIDResponse = inputHandler->GetPIDResponse();
502
503   if (fProdCuts->GetIsUsePID()){
504     fProdCuts->GetPidHF()->SetPidResponse(fPIDResponse);
505     fProdCuts->GetPidV0pos()->SetPidResponse(fPIDResponse);
506     fProdCuts->GetPidV0neg()->SetPidResponse(fPIDResponse);
507     fProdCuts->GetPidHF()->SetOldPid(kFALSE);
508     fProdCuts->GetPidV0pos()->SetOldPid(kFALSE);
509     fProdCuts->GetPidV0neg()->SetOldPid(kFALSE);
510   }
511   if (fAnalCuts->GetIsUsePID()){
512     fAnalCuts->GetPidHF()->SetPidResponse(fPIDResponse);
513     fAnalCuts->GetPidV0pos()->SetPidResponse(fPIDResponse);
514     fAnalCuts->GetPidV0neg()->SetPidResponse(fPIDResponse);
515     fAnalCuts->GetPidHF()->SetOldPid(kFALSE);
516     fAnalCuts->GetPidV0pos()->SetOldPid(kFALSE);
517     fAnalCuts->GetPidV0neg()->SetOldPid(kFALSE);
518   }
519
520   PostData(1,fOutput);
521   PostData(2,fOutputAll);
522   PostData(3,fOutputPIDBach);
523
524   fCounter = new AliNormalizationCounter("NormalizationCounter");
525   fCounter->Init();
526   PostData(4,fCounter);
527
528   // Output slot 6: tree of the candidate variables
529   if (fWriteVariableTree) {
530     const char* nameoutput = GetOutputSlot(6)->GetContainer()->GetName();
531     fVariablesTree = new TTree(nameoutput,"Candidates variables tree");
532     Int_t nVar = 71;
533     fCandidateVariables = new Float_t [nVar];
534     TString * fCandidateVariableNames = new TString[nVar];
535     fCandidateVariableNames[0]="isLcByMC";
536     fCandidateVariableNames[1]="isV0ByMC";
537     fCandidateVariableNames[2]="massLc2K0Sp";
538     fCandidateVariableNames[3]="massLc2Lambdapi";
539     fCandidateVariableNames[4]="massK0S";
540     fCandidateVariableNames[5]="massLambda";
541     fCandidateVariableNames[6]="massLambdaBar";
542     fCandidateVariableNames[7]="cosPAK0S";
543     fCandidateVariableNames[8]="dcaV0ptp";
544     fCandidateVariableNames[9]="tImpParBach";
545     fCandidateVariableNames[10]="tImpParV0";
546     fCandidateVariableNames[11]="nSigmaTPCpr";
547     fCandidateVariableNames[12]="nSigmaTPCpi";
548     fCandidateVariableNames[13]="nSigmaTPCka";
549     fCandidateVariableNames[14]="nSigmaTOFpr";
550     fCandidateVariableNames[15]="nSigmaTOFpi";
551     fCandidateVariableNames[16]="nSigmaTOFka";
552     fCandidateVariableNames[17]="bachelorPx";
553     fCandidateVariableNames[18]="bachelorPy";
554     fCandidateVariableNames[19]="bachelorPz";
555     fCandidateVariableNames[20]="V0positivePx";
556     fCandidateVariableNames[21]="V0positivePy";
557     fCandidateVariableNames[22]="V0positivePz";
558     fCandidateVariableNames[23]="V0negativePx";
559     fCandidateVariableNames[24]="V0negativePy";
560     fCandidateVariableNames[25]="V0negativePz";
561     fCandidateVariableNames[26]="qtLc";
562     fCandidateVariableNames[27]="alphaLc";
563     fCandidateVariableNames[28]="dcaV0postoPV";
564     fCandidateVariableNames[29]="dcaV0negtoPV";
565     fCandidateVariableNames[30]="bachelorPxDCA";
566     fCandidateVariableNames[31]="bachelorPyDCA";
567     fCandidateVariableNames[32]="bachelorPzDCA";
568     fCandidateVariableNames[33]="v0PxDCA";
569     fCandidateVariableNames[34]="v0PyDCA";
570     fCandidateVariableNames[35]="v0PzDCA";
571     fCandidateVariableNames[36]="V0positivePxDCA";
572     fCandidateVariableNames[37]="V0positivePyDCA";
573     fCandidateVariableNames[38]="V0positivePzDCA";
574     fCandidateVariableNames[39]="V0negativePxDCA";
575     fCandidateVariableNames[40]="V0negativePyDCA";
576     fCandidateVariableNames[41]="V0negativePzDCA";
577     fCandidateVariableNames[42]="flagToCheckCandidate";
578     fCandidateVariableNames[43]="massGamma";
579
580     fCandidateVariableNames[44]="bachelorP"; // @ prim vtx
581     fCandidateVariableNames[45]="bachelorPt"; // @ prim vtx
582     fCandidateVariableNames[46]="V0positiveP"; // @ prim vtx
583     fCandidateVariableNames[47]="V0positivePt"; // @ prim vtx
584     fCandidateVariableNames[48]="V0negativeP"; // @ prim vtx
585     fCandidateVariableNames[49]="V0negativePt"; // @ prim vtx
586     fCandidateVariableNames[50]="bachelorPDCA"; // @ DCA
587     fCandidateVariableNames[51]="bachelorPtDCA"; // @ DCA
588     fCandidateVariableNames[52]="v0PDCA"; // @ DCA
589     fCandidateVariableNames[53]="v0PtDCA"; // @ DCA
590     fCandidateVariableNames[54]="V0positivePDCA"; // @ DCA
591     fCandidateVariableNames[55]="V0positivePtDCA"; // @ DCA
592     fCandidateVariableNames[56]="V0negativePDCA"; // @ DCA
593     fCandidateVariableNames[57]="V0negativePtDCA"; // @ DCA
594     fCandidateVariableNames[58]="LcP"; // @ DCA
595     fCandidateVariableNames[59]="LcPt"; // @ DCA
596     fCandidateVariableNames[60]="v0P"; // @ V0 DCA
597     fCandidateVariableNames[61]="v0Pt"; // @ V0 DCA
598
599     fCandidateVariableNames[62]="cosPALc";
600     fCandidateVariableNames[63]="decayLengthLc";
601     fCandidateVariableNames[64]="decayLengthV0";
602
603     fCandidateVariableNames[65]="yLc";
604
605     fCandidateVariableNames[66]="massD2K0Spi"; // D+ -> pi+ K0S
606     fCandidateVariableNames[67]="massDS2K0SK"; // D+S -> K+ K0S
607
608     fCandidateVariableNames[68]="nSigmaITSpi"; // nSigmaITSpi
609     fCandidateVariableNames[69]="nSigmaITSka"; // nSigmaITSka
610     fCandidateVariableNames[70]="nSigmaITSpr"; // nSigmaITSpr
611
612     for(Int_t ivar=0; ivar<nVar; ivar++){
613       fVariablesTree->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
614     }
615     PostData(6,fVariablesTree);
616   }
617
618   return;
619 }
620 //___________________________________ hiostograms _______________________________________
621 void  AliAnalysisTaskSELc2V0bachelor::DefineHistograms() {
622
623   fCEvents = new TH1F("fCEvents","conter",17,0,17);
624   fCEvents->SetStats(kTRUE);
625   fCEvents->GetXaxis()->SetBinLabel(1,"X1");
626   fCEvents->GetXaxis()->SetBinLabel(2,"Analyzed events");
627   fCEvents->GetXaxis()->SetBinLabel(3,"AliAODVertex exists");
628   fCEvents->GetXaxis()->SetBinLabel(4,"GetNContributors()>0");
629   fCEvents->GetXaxis()->SetBinLabel(5,"MCarray exists");
630   fCEvents->GetXaxis()->SetBinLabel(6,"CascadesHF exists");
631   fCEvents->GetXaxis()->SetBinLabel(7,"MCheader exists");
632   fCEvents->GetXaxis()->SetBinLabel(8,"IsEventSelected");
633   fCEvents->GetXaxis()->SetBinLabel(9,"triggerClass!=CINT1");
634   fCEvents->GetXaxis()->SetBinLabel(10,"triggerMask!=kAnyINT");
635   fCEvents->GetXaxis()->SetBinLabel(11,"triggerMask!=kAny");
636   fCEvents->GetXaxis()->SetBinLabel(12,"vtxTitle.Contains(Z)");
637   fCEvents->GetXaxis()->SetBinLabel(13,"vtxTitle.Contains(3D)");
638   fCEvents->GetXaxis()->SetBinLabel(14,"vtxTitle.Doesn'tContain(Z-3D)");
639   fCEvents->GetXaxis()->SetBinLabel(15,Form("zVtx<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
640   fCEvents->GetXaxis()->SetBinLabel(16,"!IsEventSelected");
641   fCEvents->GetXaxis()->SetBinLabel(17,"triggerMask!=kAnyINT || triggerClass!=CINT1");
642   //fCEvents->GetXaxis()->SetTitle("");
643   fCEvents->GetYaxis()->SetTitle("counts");
644
645   fOutput->Add(fCEvents);
646   TString fillthis="";
647
648   if (fUseMCInfo) {
649     fillthis="histMcStatLc";
650     TH1F* mcStatisticLc = new TH1F(fillthis.Data(),"#Lambda_{C} generated and their decays",19,-9.5,9.5);
651     fOutput->Add(mcStatisticLc);
652   }
653
654   //fillthis="histopionV0SigmaVspTOF";
655   //TH2F *hpionV0SigmaVspTOF=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
656   fillthis="histoprotonBachSigmaVspTOF";
657   TH2F *hprotonBachSigmaVspTOF=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
658
659   //fOutput->Add(hpionV0SigmaVspTOF);
660   fOutput->Add(hprotonBachSigmaVspTOF);
661
662   //fillthis="histopionV0SigmaVspTPC";
663   //TH2F *hpionV0SigmaVspTPC=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
664   fillthis="histoprotonBachSigmaVspTPC";
665   TH2F *hprotonBachSigmaVspTPC=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
666
667   //fOutput->Add(hpionV0SigmaVspTPC);
668   fOutput->Add(hprotonBachSigmaVspTPC);
669
670   if (fUseMCInfo) {
671
672     //fillthis="histopionV0SigmaVspTOFsgn";
673     //TH2F *hpionV0SigmaVspTOFsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
674     fillthis="histoprotonBachSigmaVspTOFsgn";
675     TH2F *hprotonBachSigmaVspTOFsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
676
677     //fOutput->Add(hpionV0SigmaVspTOFsgn);
678     fOutput->Add(hprotonBachSigmaVspTOFsgn);
679
680     //fillthis="histopionV0SigmaVspTPCsgn";
681     //TH2F *hpionV0SigmaVspTPCsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
682     fillthis="histoprotonBachSigmaVspTPCsgn";
683     TH2F *hprotonBachSigmaVspTPCsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
684
685     //fOutput->Add(hpionV0SigmaVspTPCsgn);
686     fOutput->Add(hprotonBachSigmaVspTPCsgn);
687
688
689     //fillthis="histopionV0SigmaVspTOFbkg";
690     //TH2F *hpionV0SigmaVspTOFbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
691     fillthis="histoprotonBachSigmaVspTOFbkg";
692     TH2F *hprotonBachSigmaVspTOFbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
693
694     //fOutput->Add(hpionV0SigmaVspTOFbkg);
695     fOutput->Add(hprotonBachSigmaVspTOFbkg);
696
697     //fillthis="histopionV0SigmaVspTPCbkg";
698     //TH2F *hpionV0SigmaVspTPCbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
699     fillthis="histoprotonBachSigmaVspTPCbkg";
700     TH2F *hprotonBachSigmaVspTPCbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
701
702     //fOutput->Add(hpionV0SigmaVspTPCbkg);
703     fOutput->Add(hprotonBachSigmaVspTPCbkg);
704
705
706   }
707
708
709   TH1F *hZ2 = new TH1F("hZ2","",100,-50.,50.);
710   fOutput->Add(hZ2);
711   TH1F *hZ3 = new TH1F("hZ3","",100,-50.,50.);
712   fOutput->Add(hZ3);
713   TH1F *hZ4 = new TH1F("hZ4","",100,-50.,50.);
714   fOutput->Add(hZ4);
715   TH1F *hZ5 = new TH1F("hZ5","",100,-50.,50.);
716   fOutput->Add(hZ5);
717   TH1F *hZ6 = new TH1F("hZ6","",100,-50.,50.);
718   fOutput->Add(hZ6);
719   TH1F *hZ7 = new TH1F("hZ7","",100,-50.,50.);
720   fOutput->Add(hZ7);
721   TH1F *hZ8 = new TH1F("hZ8","",100,-50.,50.);
722   fOutput->Add(hZ8);
723   TH1F *hZ9 = new TH1F("hZ9","",100,-50.,50.);
724   fOutput->Add(hZ9);
725   TH1F *hZ10 = new TH1F("hZ10","",100,-50.,50.);
726   fOutput->Add(hZ10);
727   TH1F *hZ11 = new TH1F("hZ11","",100,-50.,50.);
728   fOutput->Add(hZ11);
729   TH1F *hZ12 = new TH1F("hZ12","",100,-50.,50.);
730   fOutput->Add(hZ12);
731   TH1F *hZ13 = new TH1F("hZ13","",100,-50.,50.);
732   fOutput->Add(hZ13);
733   TH1F *hZ14 = new TH1F("hZ14","",100,-50.,50.);
734   fOutput->Add(hZ14);
735   TH1F *hZ15 = new TH1F("hZ15","",100,-50.,50.);
736   fOutput->Add(hZ15);
737   TH1F *hZ16 = new TH1F("hZ16","",100,-50.,50.);
738   fOutput->Add(hZ16);
739
740   TH1I *hCandidateSelection = new TH1I("hCandidateSelection","",14,0,14);
741   hCandidateSelection->GetXaxis()->SetBinLabel(1,"IsEventSelected");
742   hCandidateSelection->GetXaxis()->SetBinLabel(2,"IsSecondaryVtx");
743   hCandidateSelection->GetXaxis()->SetBinLabel(3,"V0toPosNeg");
744   hCandidateSelection->GetXaxis()->SetBinLabel(4,"offlineV0");
745   hCandidateSelection->GetXaxis()->SetBinLabel(5,"prodCuts::kTracks");
746   hCandidateSelection->GetXaxis()->SetBinLabel(6,"prodCuts::kCandidate");
747   hCandidateSelection->GetXaxis()->SetBinLabel(7,"prodCuts::kPID");
748   hCandidateSelection->GetXaxis()->SetBinLabel(8,"prodCuts::kAll");
749   hCandidateSelection->GetXaxis()->SetBinLabel(9,"offlineV0");
750   hCandidateSelection->GetXaxis()->SetBinLabel(10,"isInFiducialAcceptance");
751   hCandidateSelection->GetXaxis()->SetBinLabel(11,"analCuts::kTracks");
752   hCandidateSelection->GetXaxis()->SetBinLabel(12,"analCuts::kCandidate");
753   hCandidateSelection->GetXaxis()->SetBinLabel(13,"analCuts::kPID");
754   hCandidateSelection->GetXaxis()->SetBinLabel(14,"analCuts::kAll");
755   fOutput->Add(hCandidateSelection);
756
757   TH1I *hEventsWithCandidates = new TH1I("hEventsWithCandidates","conter",17,0,17);
758   fOutput->Add(hEventsWithCandidates);
759
760   TH1F *hZ2a = new TH1F("hZ2a","",100,-50.,50.);
761   fOutput->Add(hZ2a);
762   TH1F *hZ3a = new TH1F("hZ3a","",100,-50.,50.);
763   fOutput->Add(hZ3a);
764   TH1F *hZ4a = new TH1F("hZ4a","",100,-50.,50.);
765   fOutput->Add(hZ4a);
766   TH1F *hZ5a = new TH1F("hZ5a","",100,-50.,50.);
767   fOutput->Add(hZ5a);
768   TH1F *hZ6a = new TH1F("hZ6a","",100,-50.,50.);
769   fOutput->Add(hZ6a);
770   TH1F *hZ7a = new TH1F("hZ7a","",100,-50.,50.);
771   fOutput->Add(hZ7a);
772   TH1F *hZ8a = new TH1F("hZ8a","",100,-50.,50.);
773   fOutput->Add(hZ8a);
774   TH1F *hZ9a = new TH1F("hZ9a","",100,-50.,50.);
775   fOutput->Add(hZ9a);
776   TH1F *hZ10a = new TH1F("hZ10a","",100,-50.,50.);
777   fOutput->Add(hZ10a);
778   TH1F *hZ11a = new TH1F("hZ11a","",100,-50.,50.);
779   fOutput->Add(hZ11a);
780   TH1F *hZ12a = new TH1F("hZ12a","",100,-50.,50.);
781   fOutput->Add(hZ12a);
782   TH1F *hZ13a = new TH1F("hZ13a","",100,-50.,50.);
783   fOutput->Add(hZ13a);
784   TH1F *hZ14a = new TH1F("hZ14a","",100,-50.,50.);
785   fOutput->Add(hZ14a);
786   TH1F *hZ15a = new TH1F("hZ15a","",100,-50.,50.);
787   fOutput->Add(hZ15a);
788   TH1F *hZ16a = new TH1F("hZ16a","",100,-50.,50.);
789   fOutput->Add(hZ16a);
790
791   TH1I *hSwitchOnCandidates1 = new TH1I("hSwitchOnCandidates1","",16,-8,8);
792   fOutput->Add(hSwitchOnCandidates1);
793   TH1I *hSwitchOnCandidates2 = new TH1I("hSwitchOnCandidates2","",16,-8,8);
794   fOutput->Add(hSwitchOnCandidates2);
795   TH1I *hSwitchOnCandidates3 = new TH1I("hSwitchOnCandidates3","",16,-8,8);
796   fOutput->Add(hSwitchOnCandidates3);
797   TH1I *hSwitchOnCandidates4 = new TH1I("hSwitchOnCandidates4","",16,-8,8);
798   fOutput->Add(hSwitchOnCandidates4);
799
800   if (fIsK0sAnalysis) DefineK0SHistos();// hK0S histos declarations
801
802   return;
803 }
804 //________________________________________________________________________
805 void AliAnalysisTaskSELc2V0bachelor::FillLc2pK0Sspectrum(AliAODRecoCascadeHF *part,
806                                                          Int_t isLc,
807                                                          Int_t &nSelectedProd,
808                                                          AliRDHFCutsLctoV0 *cutsProd,
809                                                          Int_t &nSelectedAnal,
810                                                          AliRDHFCutsLctoV0 *cutsAnal,
811                                                          TClonesArray *mcArray)
812 {
813   //
814   // Fill histos for Lc -> K0S+proton
815   //
816
817   TString fillthis="";
818
819   Double_t invmassLc = part->InvMassLctoK0sP();
820   Double_t lambdacpt = part->Pt();
821
822   AliAODv0 * v0part = (AliAODv0*)part->Getv0();
823   Bool_t onFlyV0 = v0part->GetOnFlyStatus(); // on-the-flight V0s
824   Double_t momK0s = TMath::Sqrt(v0part->Ptot2V0());
825   Double_t ptK0s = TMath::Sqrt(v0part->Pt2V0());
826   Double_t dcaV0ptp = v0part->GetDCA();
827   Double_t invmassK0s = v0part->MassK0Short();
828   Bool_t isInV0windowProd = (((cutsProd->IsSelectedSingleCut(part,AliRDHFCuts::kCandidate,2))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on V0 invMass
829   Bool_t isInCascadeWindow = (((cutsAnal->IsSelectedSingleCut(part,AliRDHFCuts::kCandidate,0))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on Lc->p+K0S invMass
830   Bool_t isCandidateSelectedCuts = (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // kinematic/topological cuts
831
832   AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
833   Double_t momBach  = bachelor->P();
834   Bool_t isBachelorID = (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // ID x bachelor
835
836   /*
837   if (fIsEventSelected) {
838     if ( ( !onFlyV0 ||
839            (onFlyV0 && fUseOnTheFlyV0) ) &&
840          isCandidateSelectedCuts && isBachelorID) {
841       fillthis="hist1LcMassOfflineByK0S";
842       if (isBachelorID) ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
843     }
844   } else {
845     if ( ( !onFlyV0 ||
846            (onFlyV0 && fUseOnTheFlyV0) ) &&
847          isCandidateSelectedCuts && isBachelorID) {
848       fillthis="hist0LcMassOfflineByK0S";
849       if (isBachelorID) ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
850     }
851     return; // don't take into account not selected events
852   }
853   */
854
855   if ( !onFlyV0 )
856     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(3); // it counts number of candidates coming from offline V0s
857
858   if ( !( !onFlyV0 || (onFlyV0 && fUseOnTheFlyV0) ) ) return;
859
860   if ( !( ( (cutsProd->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) return;
861   ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(4);
862   if ( ( ( (cutsProd->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) )
863     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(5);
864   if ( ( ( (cutsProd->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) )
865     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(6);
866   if ( ( ( (cutsProd->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) {
867     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(7);
868     nSelectedProd++;
869   }
870
871
872   if ( !onFlyV0 )
873     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(8); // it counts number of candidates coming from offline V0s
874
875   if ( cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122)) )
876     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(9);
877   if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
878     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(10);
879   if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
880     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(11);
881   if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
882     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(12);
883   if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) ) {
884     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(13);
885     nSelectedAnal++;
886   }
887
888   if ( !(cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) return;
889
890   if ( !( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) return;
891
892   Int_t aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kTracks);
893   if ( (aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr ) {
894     if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1)  ||
895          ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
896       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates1")))->Fill( -aaa );
897     else
898       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates1")))->Fill( aaa );
899   }
900
901   aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate);
902   if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
903     if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
904          ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
905       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates2")))->Fill( -aaa );
906     else
907       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates2")))->Fill( aaa );
908   }
909
910   aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kPID);
911   if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
912     if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
913          ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
914       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates3")))->Fill( -aaa );
915     else
916       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates3")))->Fill( aaa );
917   }
918
919   aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kAll);
920   if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
921     if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
922          ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
923       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates4")))->Fill( -aaa );
924     else
925       ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates4")))->Fill( aaa );
926   }
927
928
929
930
931   aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate);
932   Int_t flagToCheckCandidate = 0;
933   if ( (aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr ) {
934     if ( aaa==AliRDHFCutsLctoV0::kLcToK0Spr ) {
935       flagToCheckCandidate = aaa; // Lc->K0S+p OK
936     } else {
937       if ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi ) {
938         if (bachelor->Charge()==+1)
939           flagToCheckCandidate = aaa; // Lc->Lambda+pi+
940         else if (bachelor->Charge()==-1)
941           flagToCheckCandidate =-aaa;//+(AliRDHFCutsLctoV0::kLcToK0Spr); // Lambda+pi- AS Lc->K0S+p candidate
942       }
943       if ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi ) {
944         if (bachelor->Charge()==-1)
945           flagToCheckCandidate = aaa; // Lc->LambdaBar+pi-
946         else if (bachelor->Charge()==+1)
947           flagToCheckCandidate =-aaa;//+(AliRDHFCutsLctoV0::kLcToK0Spr); // LambdaBar+pi+ AS Lc->K0S+p candidate
948       }
949     }
950   } else {
951     if ( aaa==AliRDHFCutsLctoV0::kLcToK0Spr ) {
952       flagToCheckCandidate = -10-(AliRDHFCutsLctoV0::kLcToK0Spr); // NEVER
953     } else {
954       if ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi ) {
955         if (bachelor->Charge()==+1)
956           flagToCheckCandidate = aaa; // Lc->Lambda+pi+ OK
957         else if (bachelor->Charge()==-1)
958           flagToCheckCandidate =-aaa;//+(AliRDHFCutsLctoV0::kLcToK0Spr); // Lambda+pi- AS Lc->Lambda+pi+ candidate
959       }
960       if ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi ) {
961         if (bachelor->Charge()==-1)
962           flagToCheckCandidate = aaa; // Lc->LambdaBar+pi- OK
963         else if (bachelor->Charge()==+1)
964           flagToCheckCandidate =-aaa;//+(AliRDHFCutsLctoV0::kLcToK0Spr); // LambdaBar+pi+ AS Lc->LambdaBar+pi- candidate
965       }
966     }
967   }
968
969
970
971   Int_t pdgCand = 4122;
972   Int_t pdgDgLctoV0bachelor[2]={3122,211};
973   Int_t pdgDgV0toDaughters[2]={2212,211};
974   Int_t isLc2LBarpi=0, isLc2Lpi=0;
975   Int_t mcLabel = 0;
976   if (fUseMCInfo) {
977     mcLabel = part->MatchToMC(pdgCand,pdgDgLctoV0bachelor[0],pdgDgLctoV0bachelor,pdgDgV0toDaughters,mcArray,kTRUE);
978     if (mcLabel>=0) {
979       if (bachelor->Charge()==-1) isLc2LBarpi=1;
980       if (bachelor->Charge()==+1) isLc2Lpi=1;
981     }
982   }
983
984   Int_t pdgDg2prong[2] = {211, 211};
985   Int_t labelK0S = 0;
986   Int_t isK0S = 0;
987   if (fUseMCInfo) {
988     labelK0S = v0part->MatchToMC(310,mcArray,2,pdgDg2prong);
989     if (labelK0S>=0) isK0S = 1;
990   }
991
992   pdgDg2prong[0] = 211;
993   pdgDg2prong[1] = 2212;
994   Int_t isLambda = 0;
995   Int_t isLambdaBar = 0;
996   Int_t lambdaLabel = 0;
997   if (fUseMCInfo) {
998     lambdaLabel = v0part->MatchToMC(3122,mcArray,2,pdgDg2prong);
999     if (lambdaLabel>=0) {
1000       AliAODMCParticle *lambdaTrack = (AliAODMCParticle*)mcArray->At(lambdaLabel);
1001       if (lambdaTrack->GetPdgCode()==3122) isLambda = 1;
1002       else if (lambdaTrack->GetPdgCode()==-3122) isLambdaBar = 1;
1003     }
1004   }
1005
1006   pdgDg2prong[0] = 11;
1007   pdgDg2prong[1] = 11;
1008   Int_t isGamma = 0;
1009   Int_t gammaLabel = 0;
1010   if (fUseMCInfo) {
1011     gammaLabel = v0part->MatchToMC(22,mcArray,2,pdgDg2prong);
1012     if (gammaLabel>=0) {
1013       AliAODMCParticle *gammaTrack = (AliAODMCParticle*)mcArray->At(gammaLabel);
1014       if (gammaTrack->GetPdgCode()==22) isGamma = 1;
1015     }
1016   }
1017
1018   Double_t invmassLc2Lpi = part->InvMassLctoLambdaPi();
1019   Double_t invmassLambda = v0part->MassLambda();
1020   Double_t invmassLambdaBar = v0part->MassAntiLambda();
1021
1022   Int_t isLcByMC = isLc+isLc2LBarpi*2+isLc2Lpi*4;
1023   Int_t isV0ByMC = isK0S+isLambdaBar*2+isLambda*4+isGamma*8;
1024
1025   Double_t nSigmaITSpr=-999.;
1026   cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,4,nSigmaITSpr);
1027   Double_t nSigmaTPCpr=-999.;
1028   cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,4,nSigmaTPCpr);
1029   Double_t nSigmaTOFpr=-999.;
1030   cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,4,nSigmaTOFpr);
1031
1032   Double_t nSigmaITSpi=-999.;
1033   cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,2,nSigmaITSpi);
1034   Double_t nSigmaTPCpi=-999.;
1035   cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,2,nSigmaTPCpi);
1036   Double_t nSigmaTOFpi=-999.;
1037   cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,2,nSigmaTOFpi);
1038
1039   Double_t nSigmaITSka=-999.;
1040   cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,3,nSigmaITSka);
1041   Double_t nSigmaTPCka=-999.;
1042   cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,3,nSigmaTPCka);
1043   Double_t nSigmaTOFka=-999.;
1044   cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,3,nSigmaTOFka);
1045
1046
1047   // Fill candidate variable Tree (track selection, V0 invMass selection)
1048   if ( fWriteVariableTree && !onFlyV0 && isInV0windowProd && isInCascadeWindow && part->CosV0PointingAngle()>0.99) {
1049
1050     fCandidateVariables[0] = fUseMCInfo+isLcByMC; // 0: real data; 1: bkg; 2: Lc->K0S+p; 3: Lc->LambdaBar+pbar; 5: Lc->Lambda+p
1051     fCandidateVariables[1] = fUseMCInfo+isV0ByMC; // 0: real data; 1: bkg; 2: K0S->pi+pi; 3: LambdaBar->pbar+pi+; 5: Lambda->p+pi-
1052     fCandidateVariables[2] = invmassLc;
1053     fCandidateVariables[3] = invmassLc2Lpi;
1054     fCandidateVariables[4] = invmassK0s;
1055     fCandidateVariables[5] = invmassLambda;
1056     fCandidateVariables[6] = invmassLambdaBar;
1057     fCandidateVariables[7] = part->CosV0PointingAngle();
1058     fCandidateVariables[8] = dcaV0ptp;
1059     fCandidateVariables[9] = part->Getd0Prong(0);
1060     fCandidateVariables[10] = part->Getd0Prong(1);
1061     fCandidateVariables[11] = nSigmaTPCpr;
1062     fCandidateVariables[12] = nSigmaTPCpi;
1063     fCandidateVariables[13] = nSigmaTPCka;
1064     fCandidateVariables[14] = nSigmaTOFpr;
1065     fCandidateVariables[15] = nSigmaTOFpi;
1066     fCandidateVariables[16] = nSigmaTOFka;
1067     fCandidateVariables[17] = bachelor->Px();
1068     fCandidateVariables[18] = bachelor->Py();
1069     fCandidateVariables[19] = bachelor->Pz();
1070     AliAODTrack *v0neg = (AliAODTrack*)part->Getv0NegativeTrack(); 
1071     fCandidateVariables[20] = v0neg->Px();
1072     fCandidateVariables[21] = v0neg->Py();
1073     fCandidateVariables[22] = v0neg->Pz();
1074     AliAODTrack *v0pos = (AliAODTrack*)part->Getv0PositiveTrack();
1075     fCandidateVariables[23] = v0pos->Px();
1076     fCandidateVariables[24] = v0pos->Py();
1077     fCandidateVariables[25] = v0pos->Pz();
1078     fCandidateVariables[26] = part->QtProng(0);
1079     fCandidateVariables[27] = part->Alpha();
1080     fCandidateVariables[28] = v0part->Getd0Prong(0);
1081     fCandidateVariables[29] = v0part->Getd0Prong(1);
1082     fCandidateVariables[30] = part->PxProng(0);
1083     fCandidateVariables[31] = part->PyProng(0);
1084     fCandidateVariables[32] = part->PzProng(0);
1085     fCandidateVariables[33] = part->PxProng(1);
1086     fCandidateVariables[34] = part->PyProng(1);
1087     fCandidateVariables[35] = part->PzProng(1);
1088     fCandidateVariables[36] = v0part->PxProng(0);
1089     fCandidateVariables[37] = v0part->PyProng(0);
1090     fCandidateVariables[38] = v0part->PzProng(0);
1091     fCandidateVariables[39] = v0part->PxProng(1);
1092     fCandidateVariables[40] = v0part->PyProng(1);
1093     fCandidateVariables[41] = v0part->PzProng(1);
1094     fCandidateVariables[42] = flagToCheckCandidate;
1095     fCandidateVariables[43] = v0part->InvMass2Prongs(0,1,11,11);
1096
1097     fCandidateVariables[44] = bachelor->P();
1098     fCandidateVariables[45] = bachelor->Pt();
1099     fCandidateVariables[46] = v0pos->P();
1100     fCandidateVariables[47] = v0pos->Pt();
1101     fCandidateVariables[48] = v0neg->P();
1102     fCandidateVariables[49] = v0neg->Pt();
1103     fCandidateVariables[50] = part->PProng(0);
1104     fCandidateVariables[51] = part->PtProng(0);
1105     fCandidateVariables[52] = part->PProng(1);
1106     fCandidateVariables[53] = part->PtProng(1);
1107     fCandidateVariables[54] = v0part->PProng(0);
1108     fCandidateVariables[55] = v0part->PtProng(0);
1109     fCandidateVariables[56] = v0part->PProng(1);
1110     fCandidateVariables[57] = v0part->PtProng(1);
1111     fCandidateVariables[58] = part->P();
1112     fCandidateVariables[59] = part->Pt();
1113     fCandidateVariables[60] = v0part->P();
1114     fCandidateVariables[61] = v0part->Pt();
1115
1116     fCandidateVariables[62] = part->CosPointingAngle();
1117     fCandidateVariables[63] = part->DecayLength();
1118     fCandidateVariables[64] = part->DecayLengthV0();
1119
1120     fCandidateVariables[65] = part->Y(4122);
1121
1122     fCandidateVariables[66] = part->InvMass2Prongs(0,1,211,310); // D+ -> pi+ K0S
1123     fCandidateVariables[67] = part->InvMass2Prongs(0,1,321,310); // D+S -> K+ K0S
1124
1125     fCandidateVariables[68] = nSigmaITSpr;
1126     fCandidateVariables[69] = nSigmaITSpi;
1127     fCandidateVariables[70] = nSigmaITSka;
1128
1129     //AliInfo(Form(" partP: %2.1f %2.1f %2.1f",part->PxProng(0)/bachelor->Px(),part->PyProng(0)/bachelor->Px(),part->PzProng(0)/bachelor->Px())); // !=1, as expected
1130     //AliInfo(Form(" V0posP: %2.1f %2.1f %2.1f",v0part->PxProng(0)/v0pos->Px(),v0part->PyProng(0)/v0pos->Px(),v0part->PzProng(0)/v0pos->Px())); // !=1, as expected
1131     //AliInfo(Form(" V0negP: %2.1f %2.1f %2.1f",v0part->PxProng(1)/v0neg->Px(),v0part->PyProng(1)/v0neg->Px(),v0part->PzProng(1)/v0neg->Px())); // !=1, as expected
1132
1133     Double_t v0Momentum = (v0part->PxProng(0)+v0part->PxProng(1))*(v0part->PxProng(0)+v0part->PxProng(1));
1134     v0Momentum += (v0part->PyProng(0)+v0part->PyProng(1))*(v0part->PyProng(0)+v0part->PyProng(1));
1135     v0Momentum += (v0part->PzProng(0)+v0part->PzProng(1))*(v0part->PzProng(0)+v0part->PzProng(1));
1136     v0Momentum = TMath::Sqrt(v0Momentum);
1137
1138     Double_t lcMomentum = (part->PxProng(0)+part->PxProng(1))*(part->PxProng(0)+part->PxProng(1));
1139     lcMomentum += (part->PyProng(0)+part->PyProng(1))*(part->PyProng(0)+part->PyProng(1));
1140     lcMomentum += (part->PzProng(0)+part->PzProng(1))*(part->PzProng(0)+part->PzProng(1));
1141     lcMomentum = TMath::Sqrt(lcMomentum);
1142
1143     //AliInfo(Form(" v0Momentum-ratio=%2.1f - lcMomentum-ratio=%2.1f",v0Momentum/v0part->P(),lcMomentum/part->P()));// ==1, as expected
1144
1145     fVariablesTree->Fill();
1146   }
1147
1148
1149
1150   if (onFlyV0 && fUseOnTheFlyV0) {  
1151
1152     fillthis="histK0SMass";
1153     ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1154     if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1155
1156     if (isCandidateSelectedCuts) {
1157
1158       fillthis="histpK0Svsp";
1159       ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1160       if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1161
1162       fillthis="histDCAtoPVvspK0S";
1163       ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1164       if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1165
1166       fillthis="histArmPodK0s";
1167       FillArmPodDistribution(v0part,fillthis,fOutputAll);
1168       if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1169
1170       fillthis="histLcMassByK0S";
1171       ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1172       if (isBachelorID)((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1173  
1174     }
1175   }
1176   else if (!onFlyV0) {
1177
1178     fillthis="histK0SMassOffline";
1179     ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1180     if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1181
1182     if (isCandidateSelectedCuts) {
1183
1184       fillthis="histoprotonBachSigmaVspTOF";
1185       ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
1186       fillthis="histoprotonBachSigmaVspTPC";
1187       ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
1188
1189
1190       fillthis="histpK0SvspOffline";
1191       ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1192       if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1193
1194       fillthis="histDCAtoPVvspK0SOffline";
1195       ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1196       if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1197
1198       fillthis="histOfflineArmPodK0s";
1199       FillArmPodDistribution(v0part,fillthis,fOutputAll);
1200       if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1201
1202       fillthis="histLcMassOfflineByK0S";
1203       ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1204       if (isBachelorID)((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt); // main histogram
1205
1206     }
1207   }
1208
1209
1210   if (fUseMCInfo) {
1211     if (isLc==1) {
1212       if (onFlyV0 && fUseOnTheFlyV0) {
1213
1214         fillthis="histK0SMassSgn";
1215         ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1216         if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1217
1218         if (isCandidateSelectedCuts) {
1219
1220           fillthis="histpK0SvspSgn";
1221           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1222           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1223
1224           fillthis="histDCAtoPVvspK0SSgn";
1225           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1226           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1227
1228           fillthis="histArmPodK0sSgn";
1229           FillArmPodDistribution(v0part,fillthis,fOutputAll);
1230           if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1231
1232           fillthis="histLcMassByK0SSgn";
1233           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1234           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1235
1236         }
1237     
1238       }     
1239       else if (!onFlyV0) {  
1240
1241         fillthis="histK0SMassOfflineSgn";
1242         ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1243         if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1244
1245         if (isCandidateSelectedCuts) {
1246
1247           fillthis="histoprotonBachSigmaVspTOFsgn";
1248           ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
1249           fillthis="histoprotonBachSigmaVspTPCsgn";
1250           ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
1251
1252
1253           fillthis="histpK0SvspOfflineSgn";
1254           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1255           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1256   
1257           fillthis="histDCAtoPVvspK0SOfflineSgn";
1258           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1259           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1260    
1261           fillthis="histOfflineArmPodK0sSgn";
1262           FillArmPodDistribution(v0part,fillthis,fOutputAll);
1263           if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1264
1265           fillthis="histLcMassOfflineByK0SSgn";
1266           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1267           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1268           
1269         }
1270
1271       }
1272
1273     }// sgn
1274     else { // bkg
1275       if (onFlyV0 && fUseOnTheFlyV0) {
1276
1277         fillthis="histK0SMassBkg";
1278         ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1279         if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1280
1281         if (isCandidateSelectedCuts) {
1282
1283           fillthis="histpK0SvspBkg";
1284           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1285           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1286
1287           fillthis="histDCAtoPVvspK0SBkg";
1288           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1289           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1290
1291           fillthis="histArmPodK0sBkg";
1292           FillArmPodDistribution(v0part,fillthis,fOutputAll);
1293           if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1294
1295           fillthis="histLcMassByK0SBkg";
1296           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1297           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1298  
1299         }
1300
1301       }
1302       else if (!onFlyV0) {
1303
1304         fillthis="histK0SMassOfflineBkg";
1305         ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1306         if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1307   
1308         if (isCandidateSelectedCuts) {
1309
1310           fillthis="histoprotonBachSigmaVspTOFbkg";
1311           ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
1312           fillthis="histoprotonBachSigmaVspTPCbkg";
1313           ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
1314
1315
1316           fillthis="histpK0SvspOfflineBkg";
1317           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1318           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1319    
1320           fillthis="histDCAtoPVvspK0SOfflineBkg";
1321           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1322           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1323
1324           fillthis="histOfflineArmPodK0sBkg";
1325           FillArmPodDistribution(v0part,fillthis,fOutputAll);
1326           if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1327
1328           fillthis="histLcMassOfflineByK0SBkg";
1329           ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1330           if (isBachelorID)  ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1331  
1332         }
1333
1334       }
1335
1336     }
1337   } // if fUseMCInfo
1338  
1339   return;
1340 }
1341 //-------------------------------------------------------------------------------
1342 Int_t AliAnalysisTaskSELc2V0bachelor::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {             
1343   //
1344   // checking whether the mother of the particles come from a charm or a bottom quark
1345   //
1346         
1347   Int_t pdgGranma = 0;
1348   Int_t abspdgGranma =0;
1349   Bool_t isFromB=kFALSE;
1350   Bool_t isQuarkFound=kFALSE;
1351   Int_t mother = mcPartCandidate->GetMother();
1352   Int_t istep = 0;
1353   while (mother>0) {
1354     istep++;
1355     AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
1356     if (mcGranma) {
1357       pdgGranma = mcGranma->GetPdgCode();
1358       abspdgGranma = TMath::Abs(pdgGranma);
1359       if ( (abspdgGranma > 500  && abspdgGranma < 600 ) ||
1360            (abspdgGranma > 5000 && abspdgGranma < 6000) ) isFromB=kTRUE;
1361       else if (abspdgGranma==4 || abspdgGranma==5) isQuarkFound=kTRUE;
1362       mother = mcGranma->GetMother();
1363     } else {
1364       AliError("Failed casting the mother particle!");
1365       break;
1366     }
1367   }
1368   
1369   if (isFromB) return 5;
1370   else return 4;
1371
1372 }
1373
1374 //-------------------------------------------------------------------------------
1375 void AliAnalysisTaskSELc2V0bachelor::MakeAnalysisForLc2prK0S(TClonesArray *arrayLctopKos,
1376                                                              TClonesArray *mcArray,
1377                                                              Int_t &nSelectedProd,
1378                                                              AliRDHFCutsLctoV0 *cutsProd,
1379                                                              Int_t &nSelectedAnal,
1380                                                              AliRDHFCutsLctoV0 *cutsAnal)
1381 {
1382
1383   // counters for efficiencies
1384   Int_t icountReco = 0;
1385
1386   //Lc prong needed to MatchToMC method
1387
1388   Int_t pdgCand = 4122;
1389   Int_t pdgDgLctoV0bachelorOld[2]={2212,310};
1390   Int_t pdgDgLctoV0bachelor[2]={310,2212};
1391   Int_t pdgDgV0toDaughters[2]={211,211};
1392
1393   // loop over cascades to search for candidates Lc->p+K0S
1394   Int_t nCascades= arrayLctopKos->GetEntriesFast();
1395   if (nCascades==0) {
1396     AliInfo("Could not find cascades, skipping the event");
1397     return;
1398   }
1399   for (Int_t iLctopK0s = 0; iLctopK0s<nCascades; iLctopK0s++) {
1400
1401     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(0);
1402
1403     // Lc candidates and K0s from Lc
1404     AliAODRecoCascadeHF* lcK0spr = (AliAODRecoCascadeHF*)arrayLctopKos->At(iLctopK0s);
1405     if (!lcK0spr->GetSecondaryVtx()) {
1406       AliInfo("No secondary vertex");
1407       continue;
1408     }
1409
1410     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(1);
1411
1412     AliAODTrack * v0Pos = lcK0spr->Getv0PositiveTrack();
1413     AliAODTrack * v0Neg = lcK0spr->Getv0NegativeTrack();
1414     if (v0Pos->Charge() ==  v0Neg->Charge()) continue;
1415   
1416     ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(2);
1417
1418     Int_t isLc = 0;
1419
1420     if (fUseMCInfo) {
1421
1422       Bool_t isPrimary=kTRUE;
1423   
1424       Int_t pdgCode=-2;
1425
1426       // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
1427       Int_t mcLabelOld = MatchToMC(lcK0spr,pdgDgLctoV0bachelorOld,pdgDgV0toDaughters,mcArray);
1428       Int_t mcLabel = lcK0spr->MatchToMC(pdgCand,pdgDgLctoV0bachelor[0],pdgDgLctoV0bachelor,pdgDgV0toDaughters,mcArray,kTRUE);
1429       if (mcLabelOld!=mcLabel) AliInfo(Form(" Changed MC label: oldONE=%d wrt rightONE=%d",mcLabelOld,mcLabel));
1430       if (mcLabel>=0) {
1431         AliInfo(Form(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s,nCascades));
1432
1433         AliAODMCParticle *partLc = (AliAODMCParticle*)mcArray->At(mcLabel);
1434         Int_t checkOrigin = CheckOrigin(mcArray,partLc);
1435         if (checkOrigin==5) isPrimary=kFALSE;
1436
1437         pdgCode = partLc->GetPdgCode();
1438         if (pdgCode<0) AliInfo(Form(" Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯Â¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1439         pdgCode = TMath::Abs(pdgCode);
1440         isLc = 1;
1441       } else {
1442         pdgCode=-1;
1443       }
1444     }
1445
1446     FillLc2pK0Sspectrum(lcK0spr, isLc,
1447                         nSelectedProd, cutsProd,
1448                         nSelectedAnal, cutsAnal,
1449                         mcArray);
1450
1451   }
1452   
1453   AliDebug(2, Form("Found %d Reco particles that are Lc!!", icountReco));
1454
1455 }
1456 //-------------------------------------------------------------------------------
1457 Int_t AliAnalysisTaskSELc2V0bachelor::MatchToMC(AliAODRecoCascadeHF *lc2bacV0,
1458                                           Int_t *pdgDgLc2bacV0, Int_t *pdgDgV0,
1459                                           TClonesArray *mcArray)
1460 {
1461
1462   // bachelor
1463   AliAODTrack *bachelor = (AliAODTrack*)lc2bacV0->GetBachelor();
1464   Int_t labBachelor = bachelor->GetLabel();
1465   if (labBachelor<0) return -1;
1466   AliAODMCParticle *partBachelor = (AliAODMCParticle*)mcArray->At(labBachelor);
1467   if (TMath::Abs(partBachelor->GetPdgCode())!=pdgDgLc2bacV0[0]) return -1;
1468
1469   Int_t labBacMother = partBachelor->GetMother();
1470   if (labBacMother<0) return -1;
1471   AliAODMCParticle *partBacMother = (AliAODMCParticle*)mcArray->At(labBacMother);
1472   if (TMath::Abs(partBacMother->GetPdgCode())!=4122) return -1;
1473
1474   // V0
1475   AliAODTrack *posV0Daugh = (AliAODTrack*)lc2bacV0->Getv0PositiveTrack();
1476   AliAODTrack *negV0Daugh = (AliAODTrack*)lc2bacV0->Getv0NegativeTrack();
1477   Int_t labV0pos = posV0Daugh->GetLabel();
1478   Int_t labV0neg = negV0Daugh->GetLabel();
1479
1480   if (labV0pos<0 || labV0neg<0) return -1;
1481   AliAODMCParticle *partV0pos = (AliAODMCParticle*)mcArray->At(labV0neg);
1482   AliAODMCParticle *partV0neg = (AliAODMCParticle*)mcArray->At(labV0pos);
1483
1484   if ( ! ( (TMath::Abs(partV0pos->GetPdgCode())==pdgDgV0[0] &&
1485             TMath::Abs(partV0neg->GetPdgCode())==pdgDgV0[1]) ||
1486            (TMath::Abs(partV0pos->GetPdgCode())==pdgDgV0[1] &&
1487             TMath::Abs(partV0neg->GetPdgCode())==pdgDgV0[0]) ) ) return -1;
1488   Int_t labV0posMother = partV0pos->GetMother();
1489   Int_t labV0negMother = partV0neg->GetMother();
1490
1491   if (labV0posMother<0 || labV0negMother<0) return -1;
1492   if (labV0posMother!=labV0negMother) return -1;
1493
1494   AliAODMCParticle *motherV0 = (AliAODMCParticle*)mcArray->At(labV0posMother);
1495
1496   if (TMath::Abs(motherV0->GetPdgCode())!=pdgDgLc2bacV0[1]) return -1;
1497   Int_t labV0mother = motherV0->GetMother();
1498   if (labV0mother<0) return -1;
1499   AliAODMCParticle *gMotherV0 = (AliAODMCParticle*)mcArray->At(labV0mother);
1500
1501   if ( !(pdgDgLc2bacV0[1]==310 && TMath::Abs(gMotherV0->GetPdgCode())==311) &&
1502        !(pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) ) return -1;
1503
1504   if ( (pdgDgLc2bacV0[1]==310 && TMath::Abs(gMotherV0->GetPdgCode())==311) ) {
1505     Int_t labV0GMother = gMotherV0->GetMother();
1506     if (labV0GMother<0) return -1;
1507     AliAODMCParticle *ggMotherV0 = (AliAODMCParticle*)mcArray->At(labV0GMother);
1508
1509     if (TMath::Abs(ggMotherV0->GetPdgCode())!=4122) return -1;
1510     gMotherV0 = (AliAODMCParticle*)ggMotherV0;
1511     labV0mother=labV0GMother;
1512   }
1513   else if (pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) {
1514     if (TMath::Abs(gMotherV0->GetPdgCode())!=4122) return -1;
1515   }
1516
1517   if (labBacMother!=labV0mother) {
1518     //AliInfo(Form(" bachelor mother label=%d - V0 mother label=%d",labBacMother, labV0mother));
1519     return -1;
1520   }
1521
1522   //AliInfo(Form(" V0: %d (label=%d) ->  %d (label=%d) + %d (label=%d) --- GM %d (PDG=%d)",
1523   //motherV0->GetPdgCode(), labV0posMother,
1524   //partV0pos->GetPdgCode(), labV0pos,
1525   //partV0neg->GetPdgCode(), labV0neg,
1526   //labV0mother, gMotherV0->GetPdgCode()));
1527
1528   //AliInfo(Form(" Bachelor: %d (label=%d) --- M %d (label=%d)",
1529   //partBachelor->GetPdgCode(), labBachelor,
1530   //labBacMother, partBacMother->GetPdgCode()));
1531   return labBacMother;//labV0mother;//
1532
1533 }
1534
1535 //-----------------------
1536 void AliAnalysisTaskSELc2V0bachelor::SearchLcDaughter(TClonesArray *arrayMC)
1537 {
1538  
1539   AliAODMCParticle *searchLc=0;
1540   AliAODMCParticle *daugh=0;
1541   AliAODMCParticle *daugh1=0;
1542   AliAODMCParticle *daugh2=0;
1543   AliAODMCParticle *daughK0=0;
1544   AliAODMCParticle *daughK0s1=0;
1545   AliAODMCParticle *daughK0s2=0;
1546   AliAODMCParticle *daughL1=0;
1547   AliAODMCParticle *daughL2=0;
1548
1549   Int_t nDaughLc=0;
1550   Int_t nDaughK0=0;
1551   Int_t nDaughK0s=0;
1552   Int_t searchLcpdg=0;
1553   Int_t daughPdg1=0;
1554   Int_t daughPdg2=0;
1555   Int_t daughK0Pdg=0;
1556   Int_t nDaughL=0;
1557   Int_t daughK0s1pdg;
1558   Int_t daughK0s2pdg;
1559   Int_t daughL1pdg=0;
1560   Int_t daughL2pdg=0;
1561
1562   TString fillthis="";
1563   fillthis="histMcStatLc";
1564
1565   for (Int_t iii=0; iii<arrayMC->GetEntries(); iii++) {
1566     searchLc = (AliAODMCParticle*)arrayMC->At(iii);
1567     searchLcpdg =  searchLc->GetPdgCode();
1568     if (TMath::Abs(searchLcpdg) == 4122) {
1569       ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(0);
1570       nDaughLc= searchLc->GetNDaughters();
1571
1572       if (searchLcpdg == 4122) { // It is Lc+
1573         ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(1);
1574         if (nDaughLc!=2) continue;
1575         if (searchLc->GetDaughter(0)<0 || searchLc->GetDaughter(1)) continue;
1576         daugh1 = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(0));
1577         daugh2 = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(1));
1578         if (!daugh1 || !daugh2) continue;
1579         daughPdg1=daugh1->GetPdgCode();
1580         daughPdg2=daugh2->GetPdgCode();
1581
1582         if ( (daughPdg1==2212 && daughPdg2==-311) ||
1583              (daughPdg2==2212 && daughPdg1==-311) ) { // Lc+ -> p K0bar
1584           ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(2);
1585
1586           if (daughPdg1==-311) {
1587             nDaughK0=daugh1->GetNDaughters();
1588             if (nDaughK0!=1) {
1589               ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1590               continue;
1591             }
1592             daughK0 = (AliAODMCParticle*)arrayMC->At(daugh1->GetDaughter(0)); // K0S
1593           } else { // if (daughPdg2==-311)
1594             nDaughK0=daugh2->GetNDaughters();
1595             if (nDaughK0!=1) {
1596               ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1597               continue;
1598             }
1599             daughK0 = (AliAODMCParticle*)arrayMC->At(daugh2->GetDaughter(0)); // K0S
1600           }
1601           if (!daughK0) {
1602             //((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1603             continue;
1604           }
1605           AliInfo(" Found positive daughK0 ");
1606           daughK0Pdg=daughK0->GetPdgCode();
1607           if (daughK0Pdg!=310) {
1608             ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1609             continue;
1610           }
1611           ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(3);
1612           nDaughK0s=daughK0->GetNDaughters();
1613           if (nDaughK0s!=2) {
1614             ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(6);
1615             continue;
1616           }
1617           if (daughK0->GetDaughter(0)<0 || daughK0->GetDaughter(1)<0) continue;
1618           daughK0s1= (AliAODMCParticle*)arrayMC->At(daughK0->GetDaughter(0));
1619           daughK0s2= (AliAODMCParticle*)arrayMC->At(daughK0->GetDaughter(1));
1620           if (!daughK0s1 || !daughK0s2) continue;
1621           daughK0s1pdg=daughK0s1->GetPdgCode();
1622           daughK0s2pdg=daughK0s2->GetPdgCode();
1623
1624           if ( ((daughK0s1pdg==211) && (daughK0s2pdg==-211)) ||
1625                ((daughK0s2pdg==211) && (daughK0s1pdg==-211)) ) ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(5);
1626           else ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(6);
1627
1628         } //if ((daughPdg1==2212 && daughPdg2==-311)||(daughPdg2==2212 && daughPdg1==-311))
1629
1630         else if ( (daughPdg1==3122 && daughPdg2==211) ||
1631                   (daughPdg2==3122 && daughPdg1==211) ) { // Lc+ -> pi+ Lambda
1632           ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(7);
1633
1634           if (daughPdg1==3122)
1635             daugh = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(0)); // Lambda
1636           else
1637             daugh = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(1)); // Lambda
1638           if (!daugh) continue;
1639           AliInfo(" Found positive daughL ");
1640           nDaughL=daugh->GetNDaughters();
1641           if (nDaughL!=2) {
1642             ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(9);
1643             continue;
1644           }
1645           if (daugh->GetDaughter(0)<0 || daugh->GetDaughter(1)<0) continue;
1646           daughL1= (AliAODMCParticle*)arrayMC->At(daugh->GetDaughter(0));
1647           daughL2= (AliAODMCParticle*)arrayMC->At(daugh->GetDaughter(1));
1648           if (!daughL1 || !daughL2) continue;
1649           daughL1pdg=daughL1->GetPdgCode();
1650           daughL2pdg=daughL2->GetPdgCode();
1651           if ( ((daughL1pdg==-211) && (daughL2pdg==2212)) ||
1652                ((daughL2pdg==-211) && (daughL1pdg==2212)) ) ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(8);
1653           else ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(9);
1654
1655         }//else if ((daughPdg1==3122 && daughPdg2==211)||(daughPdg2==3122 && daughPdg1==211))
1656
1657       }//if (searchLcpdg == 4122)
1658
1659       if (searchLcpdg == -4122) { // It is Lc+
1660
1661         ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-1);
1662
1663         if (nDaughLc!=2) continue;
1664         if (searchLc->GetDaughter(0)<0 || searchLc->GetDaughter(1)<0) continue;
1665         daugh1 = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(0));
1666         daugh2 = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(1));
1667         if (!daugh1 || !daugh2) continue;
1668         daughPdg1=daugh1->GetPdgCode();
1669         daughPdg2=daugh2->GetPdgCode();
1670         if ( (daughPdg1==-2212 && daughPdg2==311) ||
1671              (daughPdg2==-2212 && daughPdg1==311) ) { // Lc- -> pbar K0
1672           ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-2);
1673
1674           if (daughPdg1==311) {
1675             nDaughK0=daugh1->GetNDaughters();
1676             if (nDaughK0!=1) {
1677               ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-4);
1678               continue;
1679             }
1680             daughK0 = (AliAODMCParticle*)arrayMC->At(daugh1->GetDaughter(0));
1681
1682           } else {
1683             nDaughK0=daugh2->GetNDaughters();
1684             if (nDaughK0!=1) {
1685               ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-4);
1686               continue;
1687             }
1688             daughK0 = (AliAODMCParticle*)arrayMC->At(daugh2->GetDaughter(0));
1689
1690           }
1691           if (!daughK0) {
1692             //((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1693             continue;
1694           }
1695
1696           AliInfo(" Found negative daughK0 ");
1697           daughK0Pdg=daughK0->GetPdgCode();
1698           if (daughK0Pdg!=310) {
1699             ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-4);
1700             continue;
1701           }
1702           ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-3);
1703           nDaughK0s=daughK0->GetNDaughters();
1704           if (nDaughK0s!=2) {
1705             ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-6);
1706             continue;
1707           }
1708           if (daughK0->GetDaughter(0)<0 || daughK0->GetDaughter(1)<0) continue;
1709           daughK0s1= (AliAODMCParticle*)arrayMC->At(daughK0->GetDaughter(0));
1710           daughK0s2= (AliAODMCParticle*)arrayMC->At(daughK0->GetDaughter(1));
1711           if (!daughK0s1 || !daughK0s2) continue;
1712           daughK0s1pdg=daughK0s1->GetPdgCode();
1713           daughK0s2pdg=daughK0s2->GetPdgCode();
1714           if ( ((daughK0s1pdg==211) && (daughK0s2pdg==-211)) ||
1715                ((daughK0s2pdg==211) && (daughK0s1pdg==-211)) ) ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-5);
1716           else ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-6);
1717
1718         }//if ((daughPdg1==-2212 && daughPdg2==-311)||(daughPdg2==-2212 && daughPdg1==-311))
1719
1720         else if ( (daughPdg1==-3122 && daughPdg2==-211) ||
1721                   (daughPdg2==-3122 && daughPdg1==-211) ) {
1722           ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-7);
1723           if (daughPdg1==-3122)
1724             daugh = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(0));
1725           else
1726             daugh = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(1));
1727           if (!daugh) continue;
1728           AliInfo(" Found negative daughL ");
1729           nDaughL=daugh->GetNDaughters();
1730           if (nDaughL!=2) {
1731             ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-9);
1732             continue;
1733           }
1734           daughL1 = (AliAODMCParticle*)arrayMC->At(daugh->GetDaughter(0));
1735           daughL2 = (AliAODMCParticle*)arrayMC->At(daugh->GetDaughter(1));
1736           daughL1pdg=daughL1->GetPdgCode();
1737           daughL2pdg= daughL2->GetPdgCode();
1738           if ( ((daughL1pdg==211) && (daughL2pdg==-2212)) ||
1739                ((daughL2pdg==211) && (daughL1pdg==-2212)) ) ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-8);
1740           else ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-9);
1741
1742         }//else if ((daughPdg1==-3122 && daughPdg2==-211)||(daughPdg2==-3122 && daughPdg1==-211))
1743
1744       } // pdgLc==-4122
1745     }// if (TMath::Abs(searchLcpdg) == 4122)
1746   }// for (Int_t iii=0; iii<arrayMC->GetEntries(); iii++)
1747   
1748 }
1749 //----------------------------------------------------
1750
1751 void AliAnalysisTaskSELc2V0bachelor::FillArmPodDistribution(AliAODv0 *vZero,
1752                                                       TString histoTitle,
1753                                                       TList *histoList) {
1754
1755   Double_t alpha = vZero->AlphaV0();
1756   Double_t qT    = vZero->PtArmV0();
1757
1758   ((TH2F*)(histoList->FindObject(histoTitle)))->Fill(alpha,qT);
1759
1760 }
1761 //----------------------------------------------------
1762
1763 void AliAnalysisTaskSELc2V0bachelor::DefineK0SHistos()
1764
1765
1766   TString nameMass=" ", nameSgn=" ", nameBkg=" ";
1767
1768   ///---------------- START  K0S HISTOS DECLARATIONS -------------------///
1769
1770   if (fUseOnTheFlyV0) {
1771
1772     // V0 invariant masses (on-the-fly)
1773     nameMass="histK0SMass";
1774     TH2F* spectrumK0SMass = new TH2F(nameMass.Data(),"K^{0}_{S} invariant mass VS p_{T}; M(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
1775                                      520,0.43,0.56,200,0.,20.);
1776
1777     // Lc invariant masses (x K0S on-the-fly)
1778     nameMass="histLcMassByK0S";
1779     TH2F* spectrumLcMassByK0S = new TH2F(nameMass.Data(),"#Lambda_{C} invariant mass (by K^{0}_{S}) vs p_{T} ; M(#Lambda_{C}) [GeV/c^{2}]; p_{T} [GeV/c]",
1780                                          1200,2.,2.6,200,0.,20.);
1781
1782     //nameMass="histcosOAK0Spvsp";
1783     //TH2F* cosOpeningAngleK0Spvsp = new TH2F(nameMass.Data(),"#Lambda_{C}: cosine of K^{0}_{S} - p opening angle vs #Lambda_{c} momentum; Cos(Opening Angle)  ; p [GeV/c]",
1784     //200,-1.,1.,200,0.,20.);
1785
1786     nameMass="histpK0Svsp";
1787     TH2F* momentumDistributionK0Svsp = new TH2F(nameMass.Data(),"#Lambda_{C}: p(K^{0}_{S}) vs p(p);  p_{p}; p_{K^{0}_{S}}  ",
1788                                                 200,0.,20.,200,0.,20.);
1789
1790     nameMass="histArmPodK0s";
1791     TH2F* armenterosPodK0s = new TH2F(nameMass.Data(),"K^{0}_{S}: Armenteros-Podolanski distribution; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
1792                                       200,-1.,1.,300,0.,0.3);
1793  
1794     nameMass="histDCAtoPVvspK0S";
1795     TH2F *dcatoPVvspK0s = new TH2F(nameMass.Data(),"K^{0}_{S}: DCA to Primary Vertex vs K^{0}_{S} momentum ; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex []; Entries",
1796                                    200,0.,20.,100,0.,10.);
1797
1798     nameMass="histK0ScosPAwrtPVvspK0s";
1799     TH2F *cosPAwrtPVvspK0s = new TH2F(nameMass.Data(),"K^{0}_{S}: cosine of pointing angle wrt primary vertex vs K^{0}_{S} momentum ; p(K^{0}_{S}) [GeV/c]; cosine; Entries",
1800                                       200,0.,20.,100,0.99,1.);
1801
1802     TH2F* allspectrumK0SMass = (TH2F*)spectrumK0SMass->Clone(); 
1803     TH2F* allspectrumLcMassByK0S    = (TH2F*)spectrumLcMassByK0S->Clone(); 
1804     //TH2F* allcosOpeningAngleK0Spvsp= (TH2F*)cosOpeningAngleK0Spvsp->Clone(); 
1805     TH2F* allmomentumDistributionK0Svsp= (TH2F*)momentumDistributionK0Svsp->Clone(); 
1806     TH2F* alldcatoPVvspK0s=(TH2F*)dcatoPVvspK0s->Clone(); 
1807     TH2F* allcosV0PAwrtPVvspK0s=(TH2F*)cosPAwrtPVvspK0s->Clone(); 
1808
1809     TH2F* pidBachspectrumK0SMass = (TH2F*)spectrumK0SMass->Clone(); 
1810     TH2F* pidBachspectrumLcMassByK0S    = (TH2F*)spectrumLcMassByK0S->Clone(); 
1811     //TH2F* pidBachcosOpeningAngleK0Spvsp= (TH2F*)cosOpeningAngleK0Spvsp->Clone(); 
1812     TH2F* pidBachmomentumDistributionK0Svsp= (TH2F*)momentumDistributionK0Svsp->Clone(); 
1813     TH2F* pidBachdcatoPVvspK0s=(TH2F*)dcatoPVvspK0s->Clone(); 
1814     TH2F* pidBachcosV0PAwrtPVvspK0s=(TH2F*)cosPAwrtPVvspK0s->Clone(); 
1815
1816     TH2F* allArmenterosPodK0s = (TH2F*)armenterosPodK0s->Clone();
1817     TH2F* pidBachArmenterosPodK0s = (TH2F*)armenterosPodK0s->Clone();
1818
1819     fOutputAll->Add(allspectrumK0SMass);
1820     fOutputAll->Add(allspectrumLcMassByK0S);
1821     //fOutputAll->Add(allcosOpeningAngleK0Spvsp); 
1822     fOutputAll->Add(allmomentumDistributionK0Svsp); 
1823     fOutputAll->Add(allArmenterosPodK0s);
1824     fOutputAll->Add(alldcatoPVvspK0s);
1825     fOutputAll->Add(allcosV0PAwrtPVvspK0s);
1826
1827     fOutputPIDBach->Add(pidBachspectrumK0SMass);
1828     fOutputPIDBach->Add(pidBachspectrumLcMassByK0S);
1829     //fOutputPIDBach->Add(pidBachcosOpeningAngleK0Spvsp); 
1830     fOutputPIDBach->Add(pidBachmomentumDistributionK0Svsp); 
1831     fOutputPIDBach->Add(pidBachArmenterosPodK0s);
1832     fOutputPIDBach->Add(pidBachdcatoPVvspK0s);
1833     fOutputPIDBach->Add(pidBachcosV0PAwrtPVvspK0s);
1834  
1835   }
1836
1837   // V0 invariant masses (offline)
1838   nameMass="histK0SMassOffline";
1839   TH2F* spectrumK0SMassOffline = new TH2F(nameMass.Data(),"K^{0}_{S} invariant mass VS p_{T}; M(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
1840                                           520,0.43,0.56,200,0.,20.);
1841
1842   // Lc invariant masses (x K0S offline)
1843   nameMass="histLcMassOfflineByK0S";
1844   TH2F* spectrumLcMassOfflineByK0S = new TH2F(nameMass.Data(),"#Lambda_{C} invariant mass (by K^{0}_{S}) vs p_{T}; M(K^{0}_{S}p) [GeV/c^{2}]; p_{T} [GeV/c]",
1845                                               1200,2.,2.6,200,0.,20.);
1846
1847
1848   //nameMass="histcosOAK0SpvspOffline";
1849   //TH2F* cosOpeningAngleK0SpvspOffline = new TH2F(nameMass.Data(),"#Lambda_{C}: K^{0}_{S} - p opening angle vs p  -  Offline ; Cos(Opening Angle)  ; p [GeV/c]",
1850   //200,-1.,1.,200,0.,20.);
1851
1852   nameMass="histpK0SvspOffline";
1853   TH2F* momentumDistributionK0SvspOffline = new TH2F(nameMass.Data(),"#Lambda_{C}: p(K^{0}_{S}) vs p(p) - Offline ;  p_{p} [GeV/c]; p_{K^{0}_{S}} [GeV/c]",
1854                                                     200,0.,20.,200,0.,20.);
1855
1856   nameMass="histOfflineArmPodK0s";
1857   TH2F* armenterosPodK0sOff = new TH2F(nameMass.Data(),"K^{0}_{S}  Armenteros-Podolanski distribution - Offline; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
1858                                        200,-1.,1.,300,0.,0.3);
1859
1860   nameMass="histDCAtoPVvspK0SOffline";
1861   TH2F *dcatoPVvspK0sOffline = new TH2F(nameMass.Data(),"K^{0}_{S}: DCA to Primary Vertex vs  K^{0}_{S} invariant mass - Offline; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex []; Entries",
1862                                         200,0.,20.,100,0.,10.);
1863
1864   nameMass="histK0ScosPAwrtPVvspK0sOffline";
1865   TH2F *cosPAwrtPVvspK0sOffline = new TH2F(nameMass.Data(),"K^{0}_{S}: cosine of pointing angle wrt primary vertex vs K^{0}_{S} momentum - Offline; p(K^{0}_{S}) [GeV/c]; cosine; Entries",
1866                                            200,0.,20.,100,0.99,1.);
1867
1868
1869
1870   TH2F* allspectrumK0SMassOffline = (TH2F*)spectrumK0SMassOffline->Clone(); 
1871   TH2F* allspectrumLcMassOfflineByK0S    = (TH2F*)spectrumLcMassOfflineByK0S->Clone(); 
1872   //TH2F* allcosOpeningAngleK0SpvspOffline= (TH2F*)cosOpeningAngleK0SpvspOffline->Clone(); 
1873   TH2F* allmomentumDistributionK0SvspOffline= (TH2F*)momentumDistributionK0SvspOffline->Clone(); 
1874   TH2F* alldcatoPVvspK0sOffline=(TH2F*)dcatoPVvspK0sOffline->Clone(); 
1875   TH2F* allcosPAwrtPVvspK0sOffline=(TH2F*)cosPAwrtPVvspK0sOffline->Clone(); 
1876
1877   TH2F* pidBachspectrumK0SMassOffline = (TH2F*)spectrumK0SMassOffline->Clone(); 
1878   TH2F* pidBachspectrumLcMassOfflineByK0S    = (TH2F*)spectrumLcMassOfflineByK0S->Clone(); 
1879   //TH2F* pidBachcosOpeningAngleK0SpvspOffline= (TH2F*)cosOpeningAngleK0SpvspOffline->Clone(); 
1880   TH2F* pidBachmomentumDistributionK0SvspOffline= (TH2F*)momentumDistributionK0SvspOffline->Clone(); 
1881   TH2F* pidBachdcatoPVvspK0sOffline=(TH2F*)dcatoPVvspK0sOffline->Clone(); 
1882   TH2F* pidBachcosPAwrtPVvspK0sOffline=(TH2F*)cosPAwrtPVvspK0sOffline->Clone(); 
1883
1884   TH2F* allArmenterosPodK0sOff = (TH2F*)armenterosPodK0sOff->Clone();
1885   TH2F* pidBachArmenterosPodK0sOff = (TH2F*)armenterosPodK0sOff->Clone();
1886
1887
1888   fOutputAll->Add(allspectrumK0SMassOffline);
1889   fOutputAll->Add(allspectrumLcMassOfflineByK0S);
1890   //fOutputAll->Add(allcosOpeningAngleK0SpvspOffline); 
1891   fOutputAll->Add(allmomentumDistributionK0SvspOffline); 
1892   fOutputAll->Add(allArmenterosPodK0sOff);
1893   fOutputAll->Add(alldcatoPVvspK0sOffline);
1894   fOutputAll->Add(allcosPAwrtPVvspK0sOffline);
1895
1896   fOutputPIDBach->Add(pidBachspectrumK0SMassOffline);
1897   fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0S);
1898   //fOutputPIDBach->Add(pidBachcosOpeningAngleK0SpvspOffline); 
1899   fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOffline); 
1900   fOutputPIDBach->Add(pidBachArmenterosPodK0sOff);
1901   fOutputPIDBach->Add(pidBachdcatoPVvspK0sOffline);
1902   fOutputPIDBach->Add(pidBachcosPAwrtPVvspK0sOffline);
1903
1904   /*
1905   nameMass="hist1LcMassOfflineByK0S";
1906   TH2D* h1 = new TH2D(nameMass.Data(),"IsEventSelected; M(#Lambda_{C}) [GeV/c^{2}]; p_{T}",1200,2.,2.6,200,0.,20.);
1907   fOutput->Add(h1);
1908   nameMass="hist0LcMassOfflineByK0S";
1909   TH2D* h0 = new TH2D(nameMass.Data(),"!IsEventSelected; M(#Lambda_{C}) [GeV/c^{2}]; p_{T}",1200,2.,2.6,200,0.,20.);
1910   fOutput->Add(h0);
1911   */
1912
1913   if (fUseMCInfo) {
1914
1915     if (fUseOnTheFlyV0) {
1916
1917       nameSgn="histK0SMassSgn";
1918       nameBkg="histK0SMassBkg";
1919       TH2F* spectrumK0SMassSgn = new TH2F(nameSgn.Data(), "K^{0}_{S} Signal invariant mass VS p_{T} - MC; M(K^{0}_{S}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries", 520,0.43,0.56,200,0.,20.);
1920       TH2F* spectrumK0SMassBkg = new TH2F(nameBkg.Data(), "K^{0}_{S} Background invariant mass VS p_{T} - MC; M(K^{0}_{S}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",  520,0.43,0.56,200,0.,20.);
1921
1922       TH2F* allspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone(); 
1923       TH2F* allspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();  
1924       TH2F* pidBachspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone(); 
1925       TH2F* pidBachspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();  
1926   
1927
1928       fOutputAll->Add(allspectrumK0SMassSgn);
1929       fOutputAll->Add(allspectrumK0SMassBkg);
1930       fOutputPIDBach->Add(pidBachspectrumK0SMassSgn);
1931       fOutputPIDBach->Add(pidBachspectrumK0SMassBkg);
1932
1933
1934       nameSgn="histLcMassByK0SSgn";
1935       nameBkg="histLcMassByK0SBkg";
1936       TH2F* spectrumLcMassByK0SSgn = new TH2F(nameSgn.Data(), "#Lambda_{C} Signal invariant mass (by K^{0}_{S}) vs p_{T}  - MC; M(#Lambda_{C}) [GeV/c^{2}];  p_{T}",
1937                                               1200,2.,2.6,200,0.,20.);
1938       TH2F* spectrumLcMassByK0SBkg = new TH2F(nameBkg.Data(), "#Lambda_{C} Background invariant mass (by K^{0}_{S}) vs p_{T}  - MC; M(#Lambda_{C}) [GeV/c^{2}]; p_{T}",
1939                                               1200,2.,2.6,200,0.,20.);
1940
1941       TH2F* allspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone(); 
1942       TH2F* allspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();  
1943       TH2F* pidBachspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone(); 
1944       TH2F* pidBachspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();  
1945       fOutputAll->Add(allspectrumLcMassByK0SSgn);
1946       fOutputAll->Add(allspectrumLcMassByK0SBkg);
1947       fOutputPIDBach->Add(pidBachspectrumLcMassByK0SSgn);
1948       fOutputPIDBach->Add(pidBachspectrumLcMassByK0SBkg);
1949
1950       /*
1951       nameSgn="histcosOAK0SpSgnvsp";
1952       nameBkg="histcosOAK0SpBkgvsp";
1953       TH2F* cosOpeningAngleK0SpSgnvsp= new TH2F(nameSgn.Data(),"#Lambda_{C} SGN : K^{0}_{S} - p Opening Angle  vs p - MC ; Cos(Opening Angle);  p ",
1954                                                 200,-1.,1.,200,0.,20.);
1955       TH2F* cosOpeningAngleK0SpBkgvsp= new TH2F(nameBkg.Data(),"#Lambda_{C} BKG : K^{0}_{S} - p Opening Angle  vs p - MC;  Cos(Opening Angle);  p ",
1956                                                 200,-1.,1.,200,0.,20.);
1957
1958       TH2F* allcosOpeningAngleK0SpSgnvsp= (TH2F*)cosOpeningAngleK0SpSgnvsp->Clone(); 
1959       TH2F* allcosOpeningAngleK0SpBkgvsp= (TH2F*)cosOpeningAngleK0SpBkgvsp->Clone(); 
1960       TH2F* pidBachcosOpeningAngleK0SpSgnvsp= (TH2F*)cosOpeningAngleK0SpSgnvsp->Clone(); 
1961       TH2F* pidBachcosOpeningAngleK0SpBkgvsp= (TH2F*)cosOpeningAngleK0SpBkgvsp->Clone(); 
1962       fOutputAll->Add(allcosOpeningAngleK0SpSgnvsp); 
1963       fOutputAll->Add(allcosOpeningAngleK0SpBkgvsp); 
1964       fOutputPIDBach->Add(pidBachcosOpeningAngleK0SpSgnvsp); 
1965       fOutputPIDBach->Add(pidBachcosOpeningAngleK0SpBkgvsp); 
1966       */
1967
1968       nameSgn="histpK0SvspSgn";
1969       nameBkg="histpK0SvspBkg";
1970       TH2F* momentumDistributionK0SvspSgn= new TH2F(nameSgn.Data(),"#Lambda_{C} SGN : K^{0}_{S} vs p Total Momentum Distribution - MC; p_{p}; p_{K^{0}_{S}}",
1971                                                     200,0.,20.,200,0.,20.);
1972       TH2F* momentumDistributionK0SvspBkg= new TH2F(nameBkg.Data(),"#Lambda_{C} BKG : K^{0}_{S} vs p Total Momentum Distribution - MC; p_{p}; p_{K^{0}_{S}}",
1973                                                     200,0.,20.,200,0.,20.);
1974
1975       TH2F* allmomentumDistributionK0SvspSgn= (TH2F*)momentumDistributionK0SvspSgn->Clone(); 
1976       TH2F* allmomentumDistributionK0SvspBkg= (TH2F*)momentumDistributionK0SvspBkg->Clone(); 
1977       TH2F* pidBachmomentumDistributionK0SvspSgn= (TH2F*)momentumDistributionK0SvspSgn->Clone(); 
1978       TH2F* pidBachmomentumDistributionK0SvspBkg= (TH2F*)momentumDistributionK0SvspBkg->Clone(); 
1979       fOutputAll->Add(allmomentumDistributionK0SvspSgn); 
1980       fOutputAll->Add(allmomentumDistributionK0SvspBkg); 
1981       fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspSgn); 
1982       fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspBkg); 
1983
1984
1985       // armenteros-podolanski plots K0S
1986       nameSgn="histArmPodK0sSgn";
1987       nameBkg="histArmPodK0sBkg";
1988       TH2F* armenterosPodK0sSgn = new TH2F(nameSgn.Data(),"K^{0}_{S}  Armenteros-Podolanski distribution (sgn); #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
1989                                            200,-1.,1.,300,0.,0.3);
1990       TH2F* armenterosPodK0sBkg = new TH2F(nameBkg.Data(),"K^{0}_{S}  Armenteros-Podolanski distribution (bkg); #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",
1991                                            200,-1.,1.,300,0.,0.3);
1992
1993       TH2F* allArmenterosPodK0sSgn = (TH2F*)armenterosPodK0sSgn->Clone();
1994       TH2F* allArmenterosPodK0sBkg = (TH2F*)armenterosPodK0sBkg->Clone();
1995       TH2F* pidBachArmenterosPodK0sSgn = (TH2F*)armenterosPodK0sSgn->Clone();
1996       TH2F* pidBachArmenterosPodK0sBkg = (TH2F*)armenterosPodK0sBkg->Clone();
1997
1998       fOutputAll->Add(allArmenterosPodK0sSgn);
1999       fOutputAll->Add(allArmenterosPodK0sBkg);
2000
2001       fOutputPIDBach->Add(pidBachArmenterosPodK0sSgn);
2002       fOutputPIDBach->Add(pidBachArmenterosPodK0sBkg);
2003
2004
2005       nameSgn="histDCAtoPVvspK0SSgn";
2006       nameBkg="histDCAtoPVvspK0SBkg";
2007       TH2F *dcatoPVvspK0sSgn=new TH2F(nameSgn.Data(),"K^{0}_{S}: DCA to Primary Vertex vs  K^{0}_{S} invariant mass (sgn); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex []; Entries",200,0.,20.,100,0.,10.0);
2008       TH2F *dcatoPVvspK0sBkg=new TH2F(nameBkg.Data(),"K^{0}_{S}: DCA to Primary Vertex vs  K^{0}_{S} invariant mass (bkg); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex []; Entries",200,0.,20.,100,0.,10.0);
2009
2010       TH2F* alldcatoPVvspK0sSgn= (TH2F*)dcatoPVvspK0sSgn->Clone();
2011       TH2F* alldcatoPVvspK0sBkg= (TH2F*)dcatoPVvspK0sBkg->Clone();
2012       TH2F* pidBachdcatoPVvspK0sSgn= (TH2F*)dcatoPVvspK0sSgn->Clone();
2013       TH2F* pidBachdcatoPVvspK0sBkg= (TH2F*)dcatoPVvspK0sBkg->Clone();
2014
2015       fOutputAll->Add(alldcatoPVvspK0sSgn);
2016       fOutputPIDBach->Add(pidBachdcatoPVvspK0sSgn);
2017       fOutputAll->Add(alldcatoPVvspK0sBkg);
2018       fOutputPIDBach->Add(pidBachdcatoPVvspK0sBkg);
2019
2020     }
2021
2022
2023     nameSgn="histK0SMassOfflineSgn";
2024     nameBkg="histK0SMassOfflineBkg";
2025     TH2F* spectrumK0SMassOfflineSgn = new TH2F(nameSgn.Data(), "K^{0}_{S} Signal invariant mass VS p_{T} - MC; M(K^{0}_{S}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
2026                                                520,0.43,0.56,200,0.,20.);
2027     TH2F* spectrumK0SMassOfflineBkg = new TH2F(nameBkg.Data(), "K^{0}_{S} Background invariant mass VS p_{T} - MC; M(K^{0}_{S}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
2028                                                520,0.43,0.56,200,0.,20.);
2029
2030     TH2F* allspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone(); 
2031     TH2F* allspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();  
2032     fOutputAll->Add(allspectrumK0SMassOfflineSgn);
2033     fOutputAll->Add(allspectrumK0SMassOfflineBkg);
2034
2035
2036     TH2F* pidBachspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone(); 
2037     TH2F* pidBachspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();
2038     fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineSgn);
2039     fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineBkg);
2040
2041
2042     nameSgn="histLcMassOfflineByK0SSgn";
2043     nameBkg="histLcMassOfflineByK0SBkg";
2044     TH2F* spectrumLcMassOfflineByK0SSgn = new TH2F(nameSgn.Data(), "#Lambda_{C} Signal invariant mass (by K^{0}_{S})  vs p_{T} - MC; M(#Lambda_{C}) [GeV/c^{2}]; p_{T}",
2045                                                    1200,2.,2.6,200,0.,20.);
2046     TH2F* spectrumLcMassOfflineByK0SBkg = new TH2F(nameBkg.Data(), "#Lambda_{C} Background invariant mass (by K^{0}_{S})  vs p_{T} - MC; M(#Lambda_{C}) [GeV/c^{2}]; p_{T}",
2047                                                    1200,2.,2.6,200,0.,20.);
2048
2049
2050     TH2F* allspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone(); 
2051     TH2F* allspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();  
2052     TH2F* pidBachspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone(); 
2053     TH2F* pidBachspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();  
2054     fOutputAll->Add(allspectrumLcMassOfflineByK0SSgn);
2055     fOutputAll->Add(allspectrumLcMassOfflineByK0SBkg);
2056     fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0SSgn);
2057     fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0SBkg);
2058   
2059  
2060
2061     /*
2062     nameSgn="histcosOAK0SpSgnvspOffline";
2063     nameBkg="histcosOAK0SpBkgvspOffline";
2064     TH2F* cosOpeningAngleK0SpSgnvspOffline= new TH2F(nameSgn.Data(),"#Lambda_{C} SGN : K^{0}_{S} - p Opening Angle  vs p  -  Offline  - MC ; Cos(Opening Angle);  p ",
2065                                                      200,-1.,1.,200,0.,20.);
2066     TH2F* cosOpeningAngleK0SpBkgvspOffline= new TH2F(nameBkg.Data(),"#Lambda_{C} BKG : K^{0}_{S} - p Opening Angle  vs p  -  Offline  - MC;  Cos(Opening Angle);  p ",
2067                                                      200,-1.,1.,200,0.,20.);
2068     
2069
2070     TH2F* allcosOpeningAngleK0SpSgnvspOffline= (TH2F*)cosOpeningAngleK0SpSgnvspOffline->Clone(); 
2071     TH2F* allcosOpeningAngleK0SpBkgvspOffline= (TH2F*)cosOpeningAngleK0SpBkgvspOffline->Clone(); 
2072     TH2F* pidBachcosOpeningAngleK0SpSgnvspOffline= (TH2F*)cosOpeningAngleK0SpSgnvspOffline->Clone(); 
2073     TH2F* pidBachcosOpeningAngleK0SpBkgvspOffline= (TH2F*)cosOpeningAngleK0SpBkgvspOffline->Clone(); 
2074     fOutputAll->Add(allcosOpeningAngleK0SpSgnvspOffline); 
2075     fOutputAll->Add(allcosOpeningAngleK0SpBkgvspOffline); 
2076     fOutputPIDBach->Add(pidBachcosOpeningAngleK0SpSgnvspOffline); 
2077     fOutputPIDBach->Add(pidBachcosOpeningAngleK0SpBkgvspOffline); 
2078     */
2079
2080
2081
2082     nameSgn="histpK0SvspOfflineSgn";
2083     nameBkg="histpK0SvspOfflineBkg";
2084     TH2F* momentumDistributionK0SvspOfflineSgn= new TH2F(nameSgn.Data(),"#Lambda_{C} SGN : K^{0}_{S} vs p Total Momentum Distribution - Offline  - MC; p_{p};  p_{K^{0}_{S}}",
2085                                                          200,0.,20.,200,0.,20.);
2086     TH2F* momentumDistributionK0SvspOfflineBkg= new TH2F(nameBkg.Data(),"#Lambda_{C} BKG : K^{0}_{S} vs p Total Momentum Distribution - Offline  - MC;  p_{p}; p_{K^{0}_{S}}",
2087                                                          200,0.,20.,200,0.,20.);
2088
2089
2090     TH2F* allmomentumDistributionK0SvspOfflineSgn= (TH2F*)momentumDistributionK0SvspOfflineSgn->Clone(); 
2091     TH2F* allmomentumDistributionK0SvspOfflineBkg= (TH2F*)momentumDistributionK0SvspOfflineBkg->Clone(); 
2092     TH2F* pidBachmomentumDistributionK0SvspOfflineSgn= (TH2F*)momentumDistributionK0SvspOfflineSgn->Clone(); 
2093     TH2F* pidBachmomentumDistributionK0SvspOfflineBkg= (TH2F*)momentumDistributionK0SvspOfflineBkg->Clone(); 
2094     fOutputAll->Add(allmomentumDistributionK0SvspOfflineSgn); 
2095     fOutputAll->Add(allmomentumDistributionK0SvspOfflineBkg); 
2096     fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOfflineSgn); 
2097     fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOfflineBkg); 
2098
2099
2100
2101
2102
2103     // armenteros-podolanski plots K0S (offline)
2104     nameSgn="histOfflineArmPodK0sSgn";
2105     nameBkg="histOfflineArmPodK0sBkg";
2106     TH2F* armenterosPodK0sOffSgn = new TH2F(nameSgn.Data(),"K^{0}_{S}  Armenteros-Podolanski distribution (sgn) -offline-; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",200,-1.,1.,300,0.,0.3);
2107     TH2F* armenterosPodK0sOffBkg = new TH2F(nameBkg.Data(),"K^{0}_{S}  Armenteros-Podolanski distribution (bkg) -offline-; #frac{p_{L}^{+}-p_{L}^{-}}{p_{L}^{+}+p_{L}^{-}}; p_{T}^{+} [GeV/c]",200,-1.,1.,300,0.,0.3);
2108   
2109
2110     TH2F* allArmenterosPodK0sOffSgn = (TH2F*)armenterosPodK0sOffSgn->Clone();
2111     TH2F* allArmenterosPodK0sOffBkg = (TH2F*)armenterosPodK0sOffBkg->Clone();
2112     TH2F* pidBachArmenterosPodK0sOffSgn = (TH2F*)armenterosPodK0sOffSgn->Clone();
2113     TH2F* pidBachArmenterosPodK0sOffBkg = (TH2F*)armenterosPodK0sOffBkg->Clone();
2114
2115
2116     fOutputAll->Add(allArmenterosPodK0sOffSgn);
2117     fOutputAll->Add(allArmenterosPodK0sOffBkg);
2118     fOutputPIDBach->Add(pidBachArmenterosPodK0sOffSgn);
2119     fOutputPIDBach->Add(pidBachArmenterosPodK0sOffBkg);
2120
2121
2122     nameSgn="histDCAtoPVvspK0SOfflineSgn";
2123     nameBkg="histDCAtoPVvspK0SOfflineBkg";
2124     TH2F *dcatoPVvspK0sOfflineSgn=new TH2F(nameSgn.Data(),"K^{0}_{S}: DCA to Primary Vertex vs  K^{0}_{S} invariant mass  -offline - (sgn); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex []; Entries",200,0.,20.,100,0.,10.0);
2125     TH2F *dcatoPVvspK0sOfflineBkg=new TH2F(nameBkg.Data(),"K^{0}_{S}: DCA to Primary Vertex vs  K^{0}_{S} invariant mass  -offline - (bkg); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex []; Entries",200,0.,20.,100,0.,10.0);
2126     
2127
2128     TH2F* alldcatoPVvspK0sOfflineSgn= (TH2F*)dcatoPVvspK0sOfflineSgn->Clone();
2129     TH2F* pidBachdcatoPVvspK0sOfflineSgn= (TH2F*)dcatoPVvspK0sOfflineSgn->Clone();
2130     TH2F* alldcatoPVvspK0sOfflineBkg= (TH2F*)dcatoPVvspK0sOfflineBkg->Clone();
2131     TH2F* pidBachdcatoPVvspK0sOfflineBkg= (TH2F*)dcatoPVvspK0sOfflineBkg->Clone();
2132
2133
2134
2135     fOutputAll->Add(alldcatoPVvspK0sOfflineSgn);
2136     fOutputPIDBach->Add(pidBachdcatoPVvspK0sOfflineSgn);
2137     fOutputAll->Add(alldcatoPVvspK0sOfflineBkg);
2138     fOutputPIDBach->Add(pidBachdcatoPVvspK0sOfflineBkg);
2139
2140   }
2141
2142
2143   ///---------------- END  K0S HISTOS DECLARATIONS -------------------///
2144 }