1 /**************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
20 // Base class for Lc2V0 Analysis
23 // The Lc spectra study is done 2D histograms:
24 // cascade_invariantMass VS cascade_pT
26 // Cuts have been centralized in AliRDHFCutsLctoV0 class
28 //-------------------------------------------------------------------------
30 // Authors: A.De Caro(a,b), P. Pagano(b)
31 // (a) Centro 'E.Fermi' - Roma
32 // (b) INFN and University of Salerno
34 // Contatcs: decaro@sa.infn.it
35 // paola.pagano@sa.infn.it
36 //-------------------------------------------------------------------------
39 #include <TParticle.h>
40 #include <TParticlePDG.h>
46 #include <TDatabasePDG.h>
47 #include <AliAnalysisDataSlot.h>
48 #include <AliAnalysisDataContainer.h>
50 #include "AliMCEvent.h"
51 #include "AliAnalysisManager.h"
52 #include "AliAODMCHeader.h"
53 #include "AliAODHandler.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"
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"
75 ClassImp(AliAnalysisTaskSELc2V0bachelor)
77 //__________________________________________________________________________
78 AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor():
86 fIsK0sAnalysis(kFALSE),
91 fUseOnTheFlyV0(kFALSE),
92 fIsEventSelected(kFALSE),
93 fWriteVariableTree(kFALSE),
95 fCandidateVariables(),
103 //___________________________________________________________________________
104 AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor(const Char_t* name, AliRDHFCutsLctoV0* prodCuts,
105 AliRDHFCutsLctoV0* analCuts, Bool_t useOnTheFly,
106 Bool_t writeVariableTree) :
107 AliAnalysisTaskSE(name),
114 fIsK0sAnalysis(kFALSE),
119 fUseOnTheFlyV0(useOnTheFly),
120 fIsEventSelected(kFALSE),
121 fWriteVariableTree(writeVariableTree),
123 fCandidateVariables(),
128 // Constructor. Initialization of Inputs and Outputs
130 Info("AliAnalysisTaskSELc2V0bachelor","Calling Constructor");
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());
138 // Output slot #6 keeps a tree of the candidate variables after track selection
139 if (fWriteVariableTree) DefineOutput(6,TTree::Class()); //My private output
143 //___________________________________________________________________________
144 AliAnalysisTaskSELc2V0bachelor::~AliAnalysisTaskSELc2V0bachelor() {
148 Info("~AliAnalysisTaskSELc2V0bachelor","Calling Destructor");
160 if (fOutputPIDBach) {
161 delete fOutputPIDBach;
190 delete fVariablesTree;
195 //_________________________________________________
196 void AliAnalysisTaskSELc2V0bachelor::Init() {
201 fIsEventSelected=kFALSE;
203 if (fDebug > 1) AliInfo("Init");
205 fListCuts = new TList();
206 fListCuts->SetOwner();
207 fListCuts->Add(new AliRDHFCutsLctoV0(*fProdCuts));
208 fListCuts->Add(new AliRDHFCutsLctoV0(*fAnalCuts));
209 PostData(5,fListCuts);
214 //_________________________________________________
215 void AliAnalysisTaskSELc2V0bachelor::UserExec(Option_t *)
219 AliError("NO EVENT FOUND!");
223 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
224 TClonesArray *arrayLctopKos=0;
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());
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");
241 arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
245 fCounter->StoreEvent(aodEvent,fAnalCuts,fUseMCInfo);
247 // AOD primary vertex
248 fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
251 // fix for temporary bug in ESDfilter
252 fBzkG = (Double_t)aodEvent->GetMagneticField();
253 if (TMath::Abs(fBzkG)<0.001) return;
256 Float_t zVertex = fVtx1->GetZ();
257 ((TH1F*)(fOutput->FindObject("hZ2")))->Fill(zVertex);
259 if (fVtx1->GetNContributors()<1) return;
262 ((TH1F*)(fOutput->FindObject("hZ3")))->Fill(zVertex);
264 if (!arrayLctopKos) {
265 AliInfo("Could not find array of HF cascades, skipping the event");
268 if (arrayLctopKos->GetEntriesFast()) {
269 AliInfo(Form("Found %d cascades",arrayLctopKos->GetEntriesFast()));
273 ((TH1F*)(fOutput->FindObject("hZ4")))->Fill(zVertex);
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()));
283 ((TH1F*)(fOutput->FindObject("hZ8")))->Fill(zVertex);
288 ULong64_t fTriggerMask=AliVEvent::kAnyINT;
289 Bool_t isSelectedAAA = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
290 if (!isSelectedAAA) {
292 ((TH1F*)(fOutput->FindObject("hZ9")))->Fill(zVertex);
295 if (!isSelectedAAA || check1) {
297 ((TH1F*)(fOutput->FindObject("hZ16")))->Fill(zVertex);
300 fTriggerMask=AliVEvent::kAny;
301 Bool_t isSelectedBBB = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
302 if (!isSelectedBBB) {
304 ((TH1F*)(fOutput->FindObject("hZ10")))->Fill(zVertex);
307 TString titleVtx=fVtx1->GetTitle();
308 if (titleVtx.Contains("Z")) {
310 ((TH1F*)(fOutput->FindObject("hZ11")))->Fill(zVertex);
312 else if (titleVtx.Contains("3D")) {
314 ((TH1F*)(fOutput->FindObject("hZ12")))->Fill(zVertex);
317 ((TH1F*)(fOutput->FindObject("hZ13")))->Fill(zVertex);
320 if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
322 ((TH1F*)(fOutput->FindObject("hZ14")))->Fill(zVertex);
325 fIsEventSelected = fAnalCuts->IsEventSelected(aodEvent);
326 if ( fIsEventSelected ) {
328 ((TH1F*)(fOutput->FindObject("hZ7")))->Fill(zVertex);
331 ((TH1F*)(fOutput->FindObject("hZ15")))->Fill(zVertex);
333 ///////////////////////
335 if ( !fIsEventSelected ) return; // don't take into account not selected events
338 TClonesArray *mcArray = 0;
339 AliAODMCHeader *mcHeader=0;
342 // MC array need for maching
343 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
345 AliError("Could not find Monte-Carlo in AOD");
348 fCEvents->Fill(5); // in case of MC events
349 ((TH1F*)(fOutput->FindObject("hZ5")))->Fill(zVertex);
352 mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
354 AliError("AliAnalysisTaskSELc2V0bachelor::UserExec: MC header branch not found!\n");
358 ((TH1F*)(fOutput->FindObject("hZ6")))->Fill(zVertex);
360 // check on MC Lc Daughter
361 SearchLcDaughter(mcArray);
365 Int_t nSelectedProd = 0;
366 Int_t nSelectedAnal = 0;
367 if (fIsK0sAnalysis) {
368 MakeAnalysisForLc2prK0S(arrayLctopKos,mcArray,
369 nSelectedProd, fProdCuts, nSelectedAnal, fAnalCuts);
373 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(4);
374 ((TH1F*)(fOutput->FindObject("hZ4a")))->Fill(zVertex);
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);
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);
394 if (!isSelectedAAAa || check1a) {
395 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(16);
396 ((TH1F*)(fOutput->FindObject("hZ16a")))->Fill(zVertex);
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);
406 if (titleVtx.Contains("Z")) {
407 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(11);
408 ((TH1F*)(fOutput->FindObject("hZ11a")))->Fill(zVertex);
410 else if (titleVtx.Contains("3D")) {
411 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(12);
412 ((TH1F*)(fOutput->FindObject("hZ12a")))->Fill(zVertex);
414 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(13);
415 ((TH1F*)(fOutput->FindObject("hZ13a")))->Fill(zVertex);
418 if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
419 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(14);
420 ((TH1F*)(fOutput->FindObject("hZ14a")))->Fill(zVertex);
423 if ( fIsEventSelected ) {
424 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(7);
425 ((TH1F*)(fOutput->FindObject("hZ7a")))->Fill(zVertex);
427 ((TH1I*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(15);
428 ((TH1F*)(fOutput->FindObject("hZ15a")))->Fill(zVertex);
435 fCounter->StoreCandidates(aodEvent,nSelectedProd,kTRUE);
436 fCounter->StoreCandidates(aodEvent,nSelectedAnal,kFALSE);
439 PostData(2,fOutputAll);
440 PostData(3,fOutputPIDBach);
441 PostData(4,fCounter);
442 if (fWriteVariableTree) PostData(6,fVariablesTree);
445 //________________________________________ terminate ___________________________
446 void AliAnalysisTaskSELc2V0bachelor::Terminate(Option_t*)
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.
452 //AliInfo("Terminate","");
453 AliAnalysisTaskSE::Terminate();
455 fOutput = dynamic_cast<TList*> (GetOutputData(1));
457 AliError("fOutput not available");
461 //fCEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fCEvents"));
463 fOutputAll = dynamic_cast<TList*> (GetOutputData(2));
465 AliError("fOutputAll not available");
469 fOutputPIDBach = dynamic_cast<TList*> (GetOutputData(3));
470 if (!fOutputPIDBach) {
471 AliError("fOutputPIDBach not available");
477 //___________________________________________________________________________
478 void AliAnalysisTaskSELc2V0bachelor::UserCreateOutputObjects() {
480 AliInfo(Form("CreateOutputObjects of task %s\n", GetName()));
484 fOutput = new TList();
486 fOutput->SetName("chist0");
488 fOutputAll = new TList();
489 fOutputAll->SetOwner();
490 fOutputAll->SetName("listAll");
492 fOutputPIDBach = new TList();
493 fOutputPIDBach->SetOwner();
494 fOutputPIDBach->SetName("listPIDBach");
499 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
500 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
501 fPIDResponse = inputHandler->GetPIDResponse();
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);
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);
521 PostData(2,fOutputAll);
522 PostData(3,fOutputPIDBach);
524 fCounter = new AliNormalizationCounter("NormalizationCounter");
526 PostData(4,fCounter);
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");
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";
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
599 fCandidateVariableNames[62]="cosPALc";
600 fCandidateVariableNames[63]="decayLengthLc";
601 fCandidateVariableNames[64]="decayLengthV0";
603 fCandidateVariableNames[65]="yLc";
605 fCandidateVariableNames[66]="massD2K0Spi"; // D+ -> pi+ K0S
606 fCandidateVariableNames[67]="massDS2K0SK"; // D+S -> K+ K0S
608 fCandidateVariableNames[68]="nSigmaITSpi"; // nSigmaITSpi
609 fCandidateVariableNames[69]="nSigmaITSka"; // nSigmaITSka
610 fCandidateVariableNames[70]="nSigmaITSpr"; // nSigmaITSpr
612 for(Int_t ivar=0; ivar<nVar; ivar++){
613 fVariablesTree->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
615 PostData(6,fVariablesTree);
620 //___________________________________ hiostograms _______________________________________
621 void AliAnalysisTaskSELc2V0bachelor::DefineHistograms() {
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");
645 fOutput->Add(fCEvents);
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);
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.);
659 //fOutput->Add(hpionV0SigmaVspTOF);
660 fOutput->Add(hprotonBachSigmaVspTOF);
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.);
667 //fOutput->Add(hpionV0SigmaVspTPC);
668 fOutput->Add(hprotonBachSigmaVspTPC);
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.);
677 //fOutput->Add(hpionV0SigmaVspTOFsgn);
678 fOutput->Add(hprotonBachSigmaVspTOFsgn);
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.);
685 //fOutput->Add(hpionV0SigmaVspTPCsgn);
686 fOutput->Add(hprotonBachSigmaVspTPCsgn);
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.);
694 //fOutput->Add(hpionV0SigmaVspTOFbkg);
695 fOutput->Add(hprotonBachSigmaVspTOFbkg);
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.);
702 //fOutput->Add(hpionV0SigmaVspTPCbkg);
703 fOutput->Add(hprotonBachSigmaVspTPCbkg);
709 TH1F *hZ2 = new TH1F("hZ2","",100,-50.,50.);
711 TH1F *hZ3 = new TH1F("hZ3","",100,-50.,50.);
713 TH1F *hZ4 = new TH1F("hZ4","",100,-50.,50.);
715 TH1F *hZ5 = new TH1F("hZ5","",100,-50.,50.);
717 TH1F *hZ6 = new TH1F("hZ6","",100,-50.,50.);
719 TH1F *hZ7 = new TH1F("hZ7","",100,-50.,50.);
721 TH1F *hZ8 = new TH1F("hZ8","",100,-50.,50.);
723 TH1F *hZ9 = new TH1F("hZ9","",100,-50.,50.);
725 TH1F *hZ10 = new TH1F("hZ10","",100,-50.,50.);
727 TH1F *hZ11 = new TH1F("hZ11","",100,-50.,50.);
729 TH1F *hZ12 = new TH1F("hZ12","",100,-50.,50.);
731 TH1F *hZ13 = new TH1F("hZ13","",100,-50.,50.);
733 TH1F *hZ14 = new TH1F("hZ14","",100,-50.,50.);
735 TH1F *hZ15 = new TH1F("hZ15","",100,-50.,50.);
737 TH1F *hZ16 = new TH1F("hZ16","",100,-50.,50.);
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);
757 TH1I *hEventsWithCandidates = new TH1I("hEventsWithCandidates","conter",17,0,17);
758 fOutput->Add(hEventsWithCandidates);
760 TH1F *hZ2a = new TH1F("hZ2a","",100,-50.,50.);
762 TH1F *hZ3a = new TH1F("hZ3a","",100,-50.,50.);
764 TH1F *hZ4a = new TH1F("hZ4a","",100,-50.,50.);
766 TH1F *hZ5a = new TH1F("hZ5a","",100,-50.,50.);
768 TH1F *hZ6a = new TH1F("hZ6a","",100,-50.,50.);
770 TH1F *hZ7a = new TH1F("hZ7a","",100,-50.,50.);
772 TH1F *hZ8a = new TH1F("hZ8a","",100,-50.,50.);
774 TH1F *hZ9a = new TH1F("hZ9a","",100,-50.,50.);
776 TH1F *hZ10a = new TH1F("hZ10a","",100,-50.,50.);
778 TH1F *hZ11a = new TH1F("hZ11a","",100,-50.,50.);
780 TH1F *hZ12a = new TH1F("hZ12a","",100,-50.,50.);
782 TH1F *hZ13a = new TH1F("hZ13a","",100,-50.,50.);
784 TH1F *hZ14a = new TH1F("hZ14a","",100,-50.,50.);
786 TH1F *hZ15a = new TH1F("hZ15a","",100,-50.,50.);
788 TH1F *hZ16a = new TH1F("hZ16a","",100,-50.,50.);
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);
800 if (fIsK0sAnalysis) DefineK0SHistos();// hK0S histos declarations
804 //________________________________________________________________________
805 void AliAnalysisTaskSELc2V0bachelor::FillLc2pK0Sspectrum(AliAODRecoCascadeHF *part,
807 Int_t &nSelectedProd,
808 AliRDHFCutsLctoV0 *cutsProd,
809 Int_t &nSelectedAnal,
810 AliRDHFCutsLctoV0 *cutsAnal,
811 TClonesArray *mcArray)
814 // Fill histos for Lc -> K0S+proton
819 Double_t invmassLc = part->InvMassLctoK0sP();
820 Double_t lambdacpt = part->Pt();
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
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
837 if (fIsEventSelected) {
839 (onFlyV0 && fUseOnTheFlyV0) ) &&
840 isCandidateSelectedCuts && isBachelorID) {
841 fillthis="hist1LcMassOfflineByK0S";
842 if (isBachelorID) ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
846 (onFlyV0 && fUseOnTheFlyV0) ) &&
847 isCandidateSelectedCuts && isBachelorID) {
848 fillthis="hist0LcMassOfflineByK0S";
849 if (isBachelorID) ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
851 return; // don't take into account not selected events
856 ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(3); // it counts number of candidates coming from offline V0s
858 if ( !( !onFlyV0 || (onFlyV0 && fUseOnTheFlyV0) ) ) return;
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);
873 ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(8); // it counts number of candidates coming from offline V0s
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);
888 if ( !(cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) return;
890 if ( !( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) return;
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 );
898 ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates1")))->Fill( aaa );
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 );
907 ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates2")))->Fill( aaa );
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 );
916 ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates3")))->Fill( aaa );
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 );
925 ((TH1I*)(fOutput->FindObject("hSwitchOnCandidates4")))->Fill( aaa );
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
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
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
951 if ( aaa==AliRDHFCutsLctoV0::kLcToK0Spr ) {
952 flagToCheckCandidate = -10-(AliRDHFCutsLctoV0::kLcToK0Spr); // NEVER
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
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
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;
977 mcLabel = part->MatchToMC(pdgCand,pdgDgLctoV0bachelor[0],pdgDgLctoV0bachelor,pdgDgV0toDaughters,mcArray,kTRUE);
979 if (bachelor->Charge()==-1) isLc2LBarpi=1;
980 if (bachelor->Charge()==+1) isLc2Lpi=1;
984 Int_t pdgDg2prong[2] = {211, 211};
988 labelK0S = v0part->MatchToMC(310,mcArray,2,pdgDg2prong);
989 if (labelK0S>=0) isK0S = 1;
992 pdgDg2prong[0] = 211;
993 pdgDg2prong[1] = 2212;
995 Int_t isLambdaBar = 0;
996 Int_t lambdaLabel = 0;
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;
1006 pdgDg2prong[0] = 11;
1007 pdgDg2prong[1] = 11;
1009 Int_t gammaLabel = 0;
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;
1018 Double_t invmassLc2Lpi = part->InvMassLctoLambdaPi();
1019 Double_t invmassLambda = v0part->MassLambda();
1020 Double_t invmassLambdaBar = v0part->MassAntiLambda();
1022 Int_t isLcByMC = isLc+isLc2LBarpi*2+isLc2Lpi*4;
1023 Int_t isV0ByMC = isK0S+isLambdaBar*2+isLambda*4+isGamma*8;
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);
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);
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);
1047 // Fill candidate variable Tree (track selection, V0 invMass selection)
1048 if ( fWriteVariableTree && !onFlyV0 && isInV0windowProd && isInCascadeWindow && part->CosV0PointingAngle()>0.99) {
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);
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();
1116 fCandidateVariables[62] = part->CosPointingAngle();
1117 fCandidateVariables[63] = part->DecayLength();
1118 fCandidateVariables[64] = part->DecayLengthV0();
1120 fCandidateVariables[65] = part->Y(4122);
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
1125 fCandidateVariables[68] = nSigmaITSpr;
1126 fCandidateVariables[69] = nSigmaITSpi;
1127 fCandidateVariables[70] = nSigmaITSka;
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
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);
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);
1143 //AliInfo(Form(" v0Momentum-ratio=%2.1f - lcMomentum-ratio=%2.1f",v0Momentum/v0part->P(),lcMomentum/part->P()));// ==1, as expected
1145 fVariablesTree->Fill();
1150 if (onFlyV0 && fUseOnTheFlyV0) {
1152 fillthis="histK0SMass";
1153 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1154 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1156 if (isCandidateSelectedCuts) {
1158 fillthis="histpK0Svsp";
1159 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1160 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1162 fillthis="histDCAtoPVvspK0S";
1163 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1164 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1166 fillthis="histArmPodK0s";
1167 FillArmPodDistribution(v0part,fillthis,fOutputAll);
1168 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1170 fillthis="histLcMassByK0S";
1171 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1172 if (isBachelorID)((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1176 else if (!onFlyV0) {
1178 fillthis="histK0SMassOffline";
1179 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1180 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1182 if (isCandidateSelectedCuts) {
1184 fillthis="histoprotonBachSigmaVspTOF";
1185 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
1186 fillthis="histoprotonBachSigmaVspTPC";
1187 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
1190 fillthis="histpK0SvspOffline";
1191 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1192 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1194 fillthis="histDCAtoPVvspK0SOffline";
1195 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1196 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1198 fillthis="histOfflineArmPodK0s";
1199 FillArmPodDistribution(v0part,fillthis,fOutputAll);
1200 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1202 fillthis="histLcMassOfflineByK0S";
1203 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1204 if (isBachelorID)((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt); // main histogram
1212 if (onFlyV0 && fUseOnTheFlyV0) {
1214 fillthis="histK0SMassSgn";
1215 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1216 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1218 if (isCandidateSelectedCuts) {
1220 fillthis="histpK0SvspSgn";
1221 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1222 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1224 fillthis="histDCAtoPVvspK0SSgn";
1225 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1226 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1228 fillthis="histArmPodK0sSgn";
1229 FillArmPodDistribution(v0part,fillthis,fOutputAll);
1230 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1232 fillthis="histLcMassByK0SSgn";
1233 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1234 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1239 else if (!onFlyV0) {
1241 fillthis="histK0SMassOfflineSgn";
1242 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1243 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1245 if (isCandidateSelectedCuts) {
1247 fillthis="histoprotonBachSigmaVspTOFsgn";
1248 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
1249 fillthis="histoprotonBachSigmaVspTPCsgn";
1250 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
1253 fillthis="histpK0SvspOfflineSgn";
1254 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1255 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1257 fillthis="histDCAtoPVvspK0SOfflineSgn";
1258 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1259 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1261 fillthis="histOfflineArmPodK0sSgn";
1262 FillArmPodDistribution(v0part,fillthis,fOutputAll);
1263 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1265 fillthis="histLcMassOfflineByK0SSgn";
1266 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1267 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1275 if (onFlyV0 && fUseOnTheFlyV0) {
1277 fillthis="histK0SMassBkg";
1278 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1279 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1281 if (isCandidateSelectedCuts) {
1283 fillthis="histpK0SvspBkg";
1284 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1285 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1287 fillthis="histDCAtoPVvspK0SBkg";
1288 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1289 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1291 fillthis="histArmPodK0sBkg";
1292 FillArmPodDistribution(v0part,fillthis,fOutputAll);
1293 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1295 fillthis="histLcMassByK0SBkg";
1296 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1297 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1302 else if (!onFlyV0) {
1304 fillthis="histK0SMassOfflineBkg";
1305 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1306 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0s,ptK0s);
1308 if (isCandidateSelectedCuts) {
1310 fillthis="histoprotonBachSigmaVspTOFbkg";
1311 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
1312 fillthis="histoprotonBachSigmaVspTPCbkg";
1313 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
1316 fillthis="histpK0SvspOfflineBkg";
1317 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0s);
1318 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0s);
1320 fillthis="histDCAtoPVvspK0SOfflineBkg";
1321 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1322 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0s,dcaV0ptp);
1324 fillthis="histOfflineArmPodK0sBkg";
1325 FillArmPodDistribution(v0part,fillthis,fOutputAll);
1326 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
1328 fillthis="histLcMassOfflineByK0SBkg";
1329 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1330 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
1341 //-------------------------------------------------------------------------------
1342 Int_t AliAnalysisTaskSELc2V0bachelor::CheckOrigin(TClonesArray* arrayMC, AliAODMCParticle *mcPartCandidate) const {
1344 // checking whether the mother of the particles come from a charm or a bottom quark
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();
1355 AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
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();
1364 AliError("Failed casting the mother particle!");
1369 if (isFromB) return 5;
1374 //-------------------------------------------------------------------------------
1375 void AliAnalysisTaskSELc2V0bachelor::MakeAnalysisForLc2prK0S(TClonesArray *arrayLctopKos,
1376 TClonesArray *mcArray,
1377 Int_t &nSelectedProd,
1378 AliRDHFCutsLctoV0 *cutsProd,
1379 Int_t &nSelectedAnal,
1380 AliRDHFCutsLctoV0 *cutsAnal)
1383 // counters for efficiencies
1384 Int_t icountReco = 0;
1386 //Lc prong needed to MatchToMC method
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};
1393 // loop over cascades to search for candidates Lc->p+K0S
1394 Int_t nCascades= arrayLctopKos->GetEntriesFast();
1396 AliInfo("Could not find cascades, skipping the event");
1399 for (Int_t iLctopK0s = 0; iLctopK0s<nCascades; iLctopK0s++) {
1401 ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(0);
1403 // Lc candidates and K0s from Lc
1404 AliAODRecoCascadeHF* lcK0spr = (AliAODRecoCascadeHF*)arrayLctopKos->At(iLctopK0s);
1405 if (!lcK0spr->GetSecondaryVtx()) {
1406 AliInfo("No secondary vertex");
1410 ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(1);
1412 AliAODTrack * v0Pos = lcK0spr->Getv0PositiveTrack();
1413 AliAODTrack * v0Neg = lcK0spr->Getv0NegativeTrack();
1414 if (v0Pos->Charge() == v0Neg->Charge()) continue;
1416 ((TH1I*)(fOutput->FindObject("hCandidateSelection")))->Fill(2);
1422 Bool_t isPrimary=kTRUE;
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));
1431 AliInfo(Form(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0s,nCascades));
1433 AliAODMCParticle *partLc = (AliAODMCParticle*)mcArray->At(mcLabel);
1434 Int_t checkOrigin = CheckOrigin(mcArray,partLc);
1435 if (checkOrigin==5) isPrimary=kFALSE;
1437 pdgCode = partLc->GetPdgCode();
1438 if (pdgCode<0) AliInfo(Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
1439 pdgCode = TMath::Abs(pdgCode);
1446 FillLc2pK0Sspectrum(lcK0spr, isLc,
1447 nSelectedProd, cutsProd,
1448 nSelectedAnal, cutsAnal,
1453 AliDebug(2, Form("Found %d Reco particles that are Lc!!", icountReco));
1456 //-------------------------------------------------------------------------------
1457 Int_t AliAnalysisTaskSELc2V0bachelor::MatchToMC(AliAODRecoCascadeHF *lc2bacV0,
1458 Int_t *pdgDgLc2bacV0, Int_t *pdgDgV0,
1459 TClonesArray *mcArray)
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;
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;
1475 AliAODTrack *posV0Daugh = (AliAODTrack*)lc2bacV0->Getv0PositiveTrack();
1476 AliAODTrack *negV0Daugh = (AliAODTrack*)lc2bacV0->Getv0NegativeTrack();
1477 Int_t labV0pos = posV0Daugh->GetLabel();
1478 Int_t labV0neg = negV0Daugh->GetLabel();
1480 if (labV0pos<0 || labV0neg<0) return -1;
1481 AliAODMCParticle *partV0pos = (AliAODMCParticle*)mcArray->At(labV0neg);
1482 AliAODMCParticle *partV0neg = (AliAODMCParticle*)mcArray->At(labV0pos);
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();
1491 if (labV0posMother<0 || labV0negMother<0) return -1;
1492 if (labV0posMother!=labV0negMother) return -1;
1494 AliAODMCParticle *motherV0 = (AliAODMCParticle*)mcArray->At(labV0posMother);
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);
1501 if ( !(pdgDgLc2bacV0[1]==310 && TMath::Abs(gMotherV0->GetPdgCode())==311) &&
1502 !(pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) ) return -1;
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);
1509 if (TMath::Abs(ggMotherV0->GetPdgCode())!=4122) return -1;
1510 gMotherV0 = (AliAODMCParticle*)ggMotherV0;
1511 labV0mother=labV0GMother;
1513 else if (pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) {
1514 if (TMath::Abs(gMotherV0->GetPdgCode())!=4122) return -1;
1517 if (labBacMother!=labV0mother) {
1518 //AliInfo(Form(" bachelor mother label=%d - V0 mother label=%d",labBacMother, labV0mother));
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()));
1528 //AliInfo(Form(" Bachelor: %d (label=%d) --- M %d (label=%d)",
1529 //partBachelor->GetPdgCode(), labBachelor,
1530 //labBacMother, partBacMother->GetPdgCode()));
1531 return labBacMother;//labV0mother;//
1535 //-----------------------
1536 void AliAnalysisTaskSELc2V0bachelor::SearchLcDaughter(TClonesArray *arrayMC)
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;
1552 Int_t searchLcpdg=0;
1562 TString fillthis="";
1563 fillthis="histMcStatLc";
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();
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();
1582 if ( (daughPdg1==2212 && daughPdg2==-311) ||
1583 (daughPdg2==2212 && daughPdg1==-311) ) { // Lc+ -> p K0bar
1584 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(2);
1586 if (daughPdg1==-311) {
1587 nDaughK0=daugh1->GetNDaughters();
1589 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1592 daughK0 = (AliAODMCParticle*)arrayMC->At(daugh1->GetDaughter(0)); // K0S
1593 } else { // if (daughPdg2==-311)
1594 nDaughK0=daugh2->GetNDaughters();
1596 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1599 daughK0 = (AliAODMCParticle*)arrayMC->At(daugh2->GetDaughter(0)); // K0S
1602 //((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1605 AliInfo(" Found positive daughK0 ");
1606 daughK0Pdg=daughK0->GetPdgCode();
1607 if (daughK0Pdg!=310) {
1608 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1611 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(3);
1612 nDaughK0s=daughK0->GetNDaughters();
1614 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(6);
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();
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);
1628 } //if ((daughPdg1==2212 && daughPdg2==-311)||(daughPdg2==2212 && daughPdg1==-311))
1630 else if ( (daughPdg1==3122 && daughPdg2==211) ||
1631 (daughPdg2==3122 && daughPdg1==211) ) { // Lc+ -> pi+ Lambda
1632 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(7);
1634 if (daughPdg1==3122)
1635 daugh = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(0)); // Lambda
1637 daugh = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(1)); // Lambda
1638 if (!daugh) continue;
1639 AliInfo(" Found positive daughL ");
1640 nDaughL=daugh->GetNDaughters();
1642 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(9);
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);
1655 }//else if ((daughPdg1==3122 && daughPdg2==211)||(daughPdg2==3122 && daughPdg1==211))
1657 }//if (searchLcpdg == 4122)
1659 if (searchLcpdg == -4122) { // It is Lc+
1661 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-1);
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);
1674 if (daughPdg1==311) {
1675 nDaughK0=daugh1->GetNDaughters();
1677 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-4);
1680 daughK0 = (AliAODMCParticle*)arrayMC->At(daugh1->GetDaughter(0));
1683 nDaughK0=daugh2->GetNDaughters();
1685 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-4);
1688 daughK0 = (AliAODMCParticle*)arrayMC->At(daugh2->GetDaughter(0));
1692 //((TH1F*)(fOutput->FindObject(fillthis)))->Fill(4);
1696 AliInfo(" Found negative daughK0 ");
1697 daughK0Pdg=daughK0->GetPdgCode();
1698 if (daughK0Pdg!=310) {
1699 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-4);
1702 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-3);
1703 nDaughK0s=daughK0->GetNDaughters();
1705 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-6);
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);
1718 }//if ((daughPdg1==-2212 && daughPdg2==-311)||(daughPdg2==-2212 && daughPdg1==-311))
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));
1726 daugh = (AliAODMCParticle*)arrayMC->At(searchLc->GetDaughter(1));
1727 if (!daugh) continue;
1728 AliInfo(" Found negative daughL ");
1729 nDaughL=daugh->GetNDaughters();
1731 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(-9);
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);
1742 }//else if ((daughPdg1==-3122 && daughPdg2==-211)||(daughPdg2==-3122 && daughPdg1==-211))
1745 }// if (TMath::Abs(searchLcpdg) == 4122)
1746 }// for (Int_t iii=0; iii<arrayMC->GetEntries(); iii++)
1749 //----------------------------------------------------
1751 void AliAnalysisTaskSELc2V0bachelor::FillArmPodDistribution(AliAODv0 *vZero,
1755 Double_t alpha = vZero->AlphaV0();
1756 Double_t qT = vZero->PtArmV0();
1758 ((TH2F*)(histoList->FindObject(histoTitle)))->Fill(alpha,qT);
1761 //----------------------------------------------------
1763 void AliAnalysisTaskSELc2V0bachelor::DefineK0SHistos()
1766 TString nameMass=" ", nameSgn=" ", nameBkg=" ";
1768 ///---------------- START K0S HISTOS DECLARATIONS -------------------///
1770 if (fUseOnTheFlyV0) {
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.);
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.);
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.);
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.);
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);
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.);
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.);
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();
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();
1816 TH2F* allArmenterosPodK0s = (TH2F*)armenterosPodK0s->Clone();
1817 TH2F* pidBachArmenterosPodK0s = (TH2F*)armenterosPodK0s->Clone();
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);
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);
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.);
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.);
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.);
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.);
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);
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.);
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.);
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();
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();
1884 TH2F* allArmenterosPodK0sOff = (TH2F*)armenterosPodK0sOff->Clone();
1885 TH2F* pidBachArmenterosPodK0sOff = (TH2F*)armenterosPodK0sOff->Clone();
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);
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);
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.);
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.);
1915 if (fUseOnTheFlyV0) {
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.);
1922 TH2F* allspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone();
1923 TH2F* allspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();
1924 TH2F* pidBachspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone();
1925 TH2F* pidBachspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();
1928 fOutputAll->Add(allspectrumK0SMassSgn);
1929 fOutputAll->Add(allspectrumK0SMassBkg);
1930 fOutputPIDBach->Add(pidBachspectrumK0SMassSgn);
1931 fOutputPIDBach->Add(pidBachspectrumK0SMassBkg);
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.);
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);
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.);
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);
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.);
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);
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);
1993 TH2F* allArmenterosPodK0sSgn = (TH2F*)armenterosPodK0sSgn->Clone();
1994 TH2F* allArmenterosPodK0sBkg = (TH2F*)armenterosPodK0sBkg->Clone();
1995 TH2F* pidBachArmenterosPodK0sSgn = (TH2F*)armenterosPodK0sSgn->Clone();
1996 TH2F* pidBachArmenterosPodK0sBkg = (TH2F*)armenterosPodK0sBkg->Clone();
1998 fOutputAll->Add(allArmenterosPodK0sSgn);
1999 fOutputAll->Add(allArmenterosPodK0sBkg);
2001 fOutputPIDBach->Add(pidBachArmenterosPodK0sSgn);
2002 fOutputPIDBach->Add(pidBachArmenterosPodK0sBkg);
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);
2010 TH2F* alldcatoPVvspK0sSgn= (TH2F*)dcatoPVvspK0sSgn->Clone();
2011 TH2F* alldcatoPVvspK0sBkg= (TH2F*)dcatoPVvspK0sBkg->Clone();
2012 TH2F* pidBachdcatoPVvspK0sSgn= (TH2F*)dcatoPVvspK0sSgn->Clone();
2013 TH2F* pidBachdcatoPVvspK0sBkg= (TH2F*)dcatoPVvspK0sBkg->Clone();
2015 fOutputAll->Add(alldcatoPVvspK0sSgn);
2016 fOutputPIDBach->Add(pidBachdcatoPVvspK0sSgn);
2017 fOutputAll->Add(alldcatoPVvspK0sBkg);
2018 fOutputPIDBach->Add(pidBachdcatoPVvspK0sBkg);
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.);
2030 TH2F* allspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone();
2031 TH2F* allspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();
2032 fOutputAll->Add(allspectrumK0SMassOfflineSgn);
2033 fOutputAll->Add(allspectrumK0SMassOfflineBkg);
2036 TH2F* pidBachspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone();
2037 TH2F* pidBachspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();
2038 fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineSgn);
2039 fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineBkg);
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.);
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);
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.);
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);
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.);
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);
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);
2110 TH2F* allArmenterosPodK0sOffSgn = (TH2F*)armenterosPodK0sOffSgn->Clone();
2111 TH2F* allArmenterosPodK0sOffBkg = (TH2F*)armenterosPodK0sOffBkg->Clone();
2112 TH2F* pidBachArmenterosPodK0sOffSgn = (TH2F*)armenterosPodK0sOffSgn->Clone();
2113 TH2F* pidBachArmenterosPodK0sOffBkg = (TH2F*)armenterosPodK0sOffBkg->Clone();
2116 fOutputAll->Add(allArmenterosPodK0sOffSgn);
2117 fOutputAll->Add(allArmenterosPodK0sOffBkg);
2118 fOutputPIDBach->Add(pidBachArmenterosPodK0sOffSgn);
2119 fOutputPIDBach->Add(pidBachArmenterosPodK0sOffBkg);
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);
2128 TH2F* alldcatoPVvspK0sOfflineSgn= (TH2F*)dcatoPVvspK0sOfflineSgn->Clone();
2129 TH2F* pidBachdcatoPVvspK0sOfflineSgn= (TH2F*)dcatoPVvspK0sOfflineSgn->Clone();
2130 TH2F* alldcatoPVvspK0sOfflineBkg= (TH2F*)dcatoPVvspK0sOfflineBkg->Clone();
2131 TH2F* pidBachdcatoPVvspK0sOfflineBkg= (TH2F*)dcatoPVvspK0sOfflineBkg->Clone();
2135 fOutputAll->Add(alldcatoPVvspK0sOfflineSgn);
2136 fOutputPIDBach->Add(pidBachdcatoPVvspK0sOfflineSgn);
2137 fOutputAll->Add(alldcatoPVvspK0sOfflineBkg);
2138 fOutputPIDBach->Add(pidBachdcatoPVvspK0sOfflineBkg);
2143 ///---------------- END K0S HISTOS DECLARATIONS -------------------///