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>
44 #include <THnSparse.h>
47 #include <TDatabasePDG.h>
48 #include <AliAnalysisDataSlot.h>
49 #include <AliAnalysisDataContainer.h>
51 #include "AliMCEvent.h"
52 #include "AliAnalysisManager.h"
53 #include "AliAODMCHeader.h"
54 #include "AliAODHandler.h"
56 #include "AliExternalTrackParam.h"
57 #include "AliAODVertex.h"
58 #include "AliAODRecoDecay.h"
59 #include "AliAODRecoDecayHF.h"
60 #include "AliAODRecoCascadeHF.h"
61 #include "AliAnalysisVertexingHF.h"
62 #include "AliESDtrack.h"
63 #include "AliAODTrack.h"
65 #include "AliAODMCParticle.h"
66 #include "AliAnalysisTaskSE.h"
67 #include "AliAnalysisTaskSELc2V0bachelor.h"
68 #include "AliNormalizationCounter.h"
69 #include "AliAODPidHF.h"
70 #include "AliInputEventHandler.h"
71 #include "AliESDtrackCuts.h"
72 #include "AliNeutralTrackParam.h"
77 ClassImp(AliAnalysisTaskSELc2V0bachelor)
79 //__________________________________________________________________________
80 AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor() : AliAnalysisTaskSE(),
86 fIsK0SAnalysis(kFALSE),
89 fUseOnTheFlyV0(kFALSE),
90 fIsEventSelected(kFALSE),
91 fWriteVariableTree(kFALSE),
93 fCandidateVariables(),
96 fAdditionalChecks(kFALSE),
97 fTrackRotation(kFALSE),
99 fMinAngleForRot(5*TMath::Pi()/6),
100 fMaxAngleForRot(7*TMath::Pi()/6),
109 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
110 fMinMass=mLcPDG-0.250;
111 fMaxMass=mLcPDG+0.250;
114 //___________________________________________________________________________
115 AliAnalysisTaskSELc2V0bachelor::AliAnalysisTaskSELc2V0bachelor(const Char_t* name,
116 AliRDHFCutsLctoV0* analCuts, Bool_t useOnTheFly,
117 Bool_t writeVariableTree, Bool_t additionalChecks, Bool_t trackRotation) :
118 AliAnalysisTaskSE(name),
124 fIsK0SAnalysis(kFALSE),
127 fUseOnTheFlyV0(useOnTheFly),
128 fIsEventSelected(kFALSE),
129 fWriteVariableTree(writeVariableTree),
131 fCandidateVariables(),
134 fAdditionalChecks(additionalChecks),
135 fTrackRotation(trackRotation),
137 fMinAngleForRot(5*TMath::Pi()/6),
138 fMaxAngleForRot(7*TMath::Pi()/6),
144 // Constructor. Initialization of Inputs and Outputs
146 Info("AliAnalysisTaskSELc2V0bachelor","Calling Constructor");
148 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
149 fMinMass=mLcPDG-0.250;
150 fMaxMass=mLcPDG+0.250;
152 DefineOutput(1,TList::Class()); //conters
153 DefineOutput(2,AliNormalizationCounter::Class());
154 DefineOutput(3,AliRDHFCutsLctoV0::Class());
155 if (!writeVariableTree) {
156 DefineOutput(4,TList::Class()); //All Entries output
157 DefineOutput(5,TList::Class()); //3sigma PID output
159 DefineOutput(6,TList::Class()); //All Entries output
162 // Output slot #4 keeps a tree of the candidate variables after track selection
163 DefineOutput(4,TTree::Class()); //My private output
168 //___________________________________________________________________________
169 AliAnalysisTaskSELc2V0bachelor::~AliAnalysisTaskSELc2V0bachelor() {
173 Info("~AliAnalysisTaskSELc2V0bachelor","Calling Destructor");
185 if (fOutputPIDBach) {
186 delete fOutputPIDBach;
200 if (fVariablesTree) {
201 delete fVariablesTree;
205 if (fOutputPIDBachTR) {
206 delete fOutputPIDBachTR;
207 fOutputPIDBachTR = 0;
211 //_________________________________________________
212 void AliAnalysisTaskSELc2V0bachelor::Init() {
217 fIsEventSelected=kFALSE;
219 if (fDebug > 1) AliInfo("Init");
221 PostData(3,fAnalCuts);
226 //_________________________________________________
227 void AliAnalysisTaskSELc2V0bachelor::UserExec(Option_t *)
231 AliError("NO EVENT FOUND!");
235 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(fInputEvent);
236 TClonesArray *arrayLctopKos=0;
238 if (!aodEvent && AODEvent() && IsStandardAOD()) {
239 // In case there is an AOD handler writing a standard AOD, use the AOD
240 // event in memory rather than the input (ESD) event.
241 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
242 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
243 // have to taken from the AOD event hold by the AliAODExtension
244 AliAODHandler* aodHandler = (AliAODHandler*)
245 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
247 if (aodHandler->GetExtensions()) {
248 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
249 AliAODEvent *aodFromExt = ext->GetAOD();
250 arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject("CascadesHF");
253 arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
259 fAnalCuts->SetTriggerClass("");
261 // AOD primary vertex
262 fVtx1 = (AliAODVertex*)aodEvent->GetPrimaryVertex();
265 fIsEventSelected = fAnalCuts->IsEventSelected(aodEvent); // better to initialize before CheckEventSelection call
267 CheckEventSelection(aodEvent);
270 // fix for temporary bug in ESDfilter
271 fBzkG = (Double_t)aodEvent->GetMagneticField();
272 if (TMath::Abs(fBzkG)<0.001) return;
275 if (!arrayLctopKos) {
276 AliInfo("Could not find array of HF cascades, skipping the event");
279 if (arrayLctopKos->GetEntriesFast()) {
280 AliInfo(Form("Found %d cascades",arrayLctopKos->GetEntriesFast()));
286 TClonesArray *mcArray = 0;
287 AliAODMCHeader *mcHeader=0;
290 // MC array need for maching
291 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
293 AliError("Could not find Monte-Carlo in AOD");
296 fCEvents->Fill(4); // in case of MC events
299 mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
301 AliError("AliAnalysisTaskSELc2V0bachelor::UserExec: MC header branch not found!\n");
304 fCEvents->Fill(5); // in case of MC events
306 Double_t zMCVertex = mcHeader->GetVtxZ();
307 if (TMath::Abs(zMCVertex) > fAnalCuts->GetMaxVtxZ()) {
308 AliDebug(2,Form("Event rejected: abs(zVtxMC)=%f > fAnalCuts->GetMaxVtxZ()=%f",zMCVertex,fAnalCuts->GetMaxVtxZ()));
311 fCEvents->Fill(17); // in case of MC events
315 fCounter->StoreEvent(aodEvent,fAnalCuts,fUseMCInfo); // it is very important that it stays BEFORE any other event selection
317 if (fVtx1->GetNContributors()>0) // this check is done in IsEventSelected
320 if ( !fIsEventSelected ) return; // don't take into account not selected events
323 Int_t nSelectedAnal = 0;
324 if (fIsK0SAnalysis) {
325 MakeAnalysisForLc2prK0S(arrayLctopKos,mcArray, nSelectedAnal, fAnalCuts);
328 CheckEventSelectionWithCandidates(aodEvent);
332 fCounter->StoreCandidates(aodEvent,nSelectedAnal,kTRUE);
333 fCounter->StoreCandidates(aodEvent,nSelectedAnal,kFALSE);
336 PostData(2,fCounter);
337 if (!fWriteVariableTree) {
338 PostData(4,fOutputAll);
339 PostData(5,fOutputPIDBach);
341 PostData(6,fOutputPIDBachTR);
343 PostData(4,fVariablesTree);
346 fIsEventSelected=kFALSE;
351 //________________________________________ terminate ___________________________
352 void AliAnalysisTaskSELc2V0bachelor::Terminate(Option_t*)
354 // The Terminate() function is the last function to be called during
355 // a query. It always runs on the client, it can be used to present
356 // the results graphically or save the results to file.
358 //AliInfo("Terminate","");
359 AliAnalysisTaskSE::Terminate();
361 fOutput = dynamic_cast<TList*> (GetOutputData(1));
363 AliError("fOutput not available");
367 //fCEvents = dynamic_cast<TH1F*>(fOutput->FindObject("fCEvents"));
368 if (!fWriteVariableTree) {
369 fOutputAll = dynamic_cast<TList*> (GetOutputData(4));
371 AliError("fOutputAll not available");
375 fOutputPIDBach = dynamic_cast<TList*> (GetOutputData(5));
376 if (!fOutputPIDBach) {
377 AliError("fOutputPIDBach not available");
381 if (fTrackRotation) {
382 fOutputPIDBachTR = dynamic_cast<TList*> (GetOutputData(6));
383 if (!fOutputPIDBachTR) {
384 AliError("fOutputPIDBachTR not available");
393 //___________________________________________________________________________
394 void AliAnalysisTaskSELc2V0bachelor::UserCreateOutputObjects() {
396 AliInfo(Form("CreateOutputObjects of task %s\n", GetName()));
398 fOutput = new TList();
400 fOutput->SetName("chist0");
401 DefineGeneralHistograms(); // define general histograms
404 fCounter = new AliNormalizationCounter("NormalizationCounter");
406 PostData(2,fCounter);
408 if (!fWriteVariableTree) {
410 fOutputAll = new TList();
411 fOutputAll->SetOwner();
412 fOutputAll->SetName("listAll");
414 fOutputPIDBach = new TList();
415 fOutputPIDBach->SetOwner();
416 fOutputPIDBach->SetName("listPIDBach");
418 if (fTrackRotation) {
419 fOutputPIDBachTR = new TList();
420 fOutputPIDBachTR->SetOwner();
421 fOutputPIDBachTR->SetName("listPIDBachTR");
424 DefineAnalysisHistograms(); // define analysis histograms
426 PostData(4,fOutputAll);
427 PostData(5,fOutputPIDBach);
430 PostData(6,fOutputPIDBachTR);
434 DefineTreeVariables();
435 PostData(4,fVariablesTree);
441 //-------------------------------------------------------------------------------
442 void AliAnalysisTaskSELc2V0bachelor::MakeAnalysisForLc2prK0S(TClonesArray *arrayLctopKos,
443 TClonesArray *mcArray,
444 Int_t &nSelectedAnal,
445 AliRDHFCutsLctoV0 *cutsAnal)
450 Int_t pdgCand = 4122;
451 Int_t pdgDgLctoV0bachelor[2]={2212,310}; // always 1st bachelor, 2nd V0
452 Int_t pdgDgV0toDaughters[2]={211,211};
454 // loop over cascades to search for candidates Lc->p+K0S
455 Int_t nCascades= arrayLctopKos->GetEntriesFast();
457 AliInfo("Could not find cascades, skipping the event");
461 for (Int_t iLctopK0S = 0; iLctopK0S<nCascades; iLctopK0S++) {
463 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(0);
465 // Lc candidates and K0S from Lc
466 AliAODRecoCascadeHF* lcK0Spr = dynamic_cast<AliAODRecoCascadeHF*>(arrayLctopKos->At(iLctopK0S));
468 AliDebug(2,Form("Cascade %d doens't exist, skipping",iLctopK0S));
472 Bool_t unsetvtx=kFALSE;
473 if (!lcK0Spr->GetOwnPrimaryVtx()) {
474 lcK0Spr->SetOwnPrimaryVtx(fVtx1);
478 if (!lcK0Spr->GetSecondaryVtx()) {
479 AliInfo("No secondary vertex"); // it will be done in AliRDHFCutsLctoV0::IsSelected
483 if (lcK0Spr->GetNDaughters()!=2) {
484 AliDebug(2,Form("Cascade %d has not 2 daughters (nDaughters=%d)",iLctopK0S,lcK0Spr->GetNDaughters())); // it will be done in AliRDHFCutsLctoV0::IsSelected
488 AliAODv0 * v0part = dynamic_cast<AliAODv0*>(lcK0Spr->Getv0());
489 AliAODTrack * bachPart = dynamic_cast<AliAODTrack*>(lcK0Spr->GetBachelor());
490 if (!v0part || !bachPart) {
491 AliDebug(2,Form("Cascade %d has no V0 or no bachelor object",iLctopK0S)); // it will be done in AliRDHFCutsLctoV0::IsSelected
495 if (!v0part->GetSecondaryVtx()) {
496 AliDebug(2,Form("No secondary vertex for V0 by cascade %d",iLctopK0S)); // it will be done in AliRDHFCutsLctoV0::IsSelected
500 if (v0part->GetNDaughters()!=2) {
501 AliDebug(2,Form("current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters())); // it will be done in AliRDHFCutsLctoV0::IsSelected
505 AliAODTrack * v0Pos = dynamic_cast<AliAODTrack*>(lcK0Spr->Getv0PositiveTrack());
506 AliAODTrack * v0Neg = dynamic_cast<AliAODTrack*>(lcK0Spr->Getv0NegativeTrack());
507 if (!v0Neg || !v0Pos) {
508 AliDebug(2,Form("V0 by cascade %d has no V0positive of V0negative object",iLctopK0S)); // it will be done in AliRDHFCutsLctoV0::IsSelected
512 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(1);
514 if (v0Pos->Charge() == v0Neg->Charge()) continue;
516 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(2);
524 // find associated MC particle for Lc -> p+K0 and K0S->pi+pi
525 Int_t mcLabel = lcK0Spr->MatchToMC(pdgCand,pdgDgLctoV0bachelor[1],pdgDgLctoV0bachelor,pdgDgV0toDaughters,mcArray,kTRUE);
527 AliDebug(2,Form(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cascade number %d (total cascade number = %d)", iLctopK0S,nCascades));
529 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
531 pdgCode = partLc->GetPdgCode();
532 if (pdgCode<0) AliDebug(2,Form(" ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ MClabel=%d ~~~~~~~~~~ pdgCode=%d", mcLabel, pdgCode));
533 pdgCode = TMath::Abs(pdgCode);
537 AliDebug(2,Form("No MC candidate (cascade number %d -total cascade number = %d -)", iLctopK0S,nCascades));
542 FillLc2pK0Sspectrum(lcK0Spr, isLc,
543 nSelectedAnal, cutsAnal,
546 if (unsetvtx) lcK0Spr->UnsetOwnPrimaryVtx();
550 AliDebug(2, Form("Found %d Reco particles that are Lc!!", nSelectedAnal));
555 //________________________________________________________________________
556 void AliAnalysisTaskSELc2V0bachelor::FillLc2pK0Sspectrum(AliAODRecoCascadeHF *part,
558 Int_t &nSelectedAnal,
559 AliRDHFCutsLctoV0 *cutsAnal,
560 TClonesArray *mcArray)
563 // Fill histos for Lc -> K0S+proton
568 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
569 Double_t momBach = bachelor->P();
571 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
572 Bool_t onFlyV0 = v0part->GetOnFlyStatus(); // on-the-flight V0s
574 Bool_t areCutsUsingPID = cutsAnal->GetIsUsePID();
575 cutsAnal->SetUsePID(kFALSE);
576 Bool_t isInCascadeWindow = (((cutsAnal->IsSelectedSingleCut(part,AliRDHFCuts::kCandidate,0))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // cut on Lc->p+K0S invMass
577 cutsAnal->SetUsePID(areCutsUsingPID);
579 if ( onFlyV0 && !fUseOnTheFlyV0 ) return;
581 if (fAdditionalChecks) CheckCandidatesAtDifferentLevels(part,cutsAnal);
584 if (fTrackRotation) {
586 TrackRotation(cutsAnal,part,"");
589 TrackRotation(cutsAnal,part,"Offline");
594 TrackRotation(cutsAnal,part,"Sgn");
597 TrackRotation(cutsAnal,part,"OfflineSgn");
602 TrackRotation(cutsAnal,part,"Bkg");
605 TrackRotation(cutsAnal,part,"OfflineBkg");
609 } // if fTrackRotation
614 if ( !(cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122))) ) return;
616 if ( !( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) return;
618 if ( ( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) nSelectedAnal++;
620 // Fill candidate variable Tree (track selection, V0 invMass selection)
621 if ( fWriteVariableTree ) {
622 Double_t invmassK0S = v0part->MassK0Short();
623 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
624 if ( !onFlyV0 && isInCascadeWindow && part->CosV0PointingAngle()>0.99 && TMath::Abs(invmassK0S-mk0sPDG)<=0.05)
625 FillTheTree(part,cutsAnal,mcArray,isLc);
629 cutsAnal->SetUsePID(kFALSE);
630 Bool_t isCandidateSelectedCuts = (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // kinematic/topological cuts
631 cutsAnal->SetUsePID(areCutsUsingPID);
632 Bool_t isBachelorID = (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)); // ID x bachelor
634 //if (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
635 if (((cutsAnal->IsSelected(part,AliRDHFCuts::kAll))&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
636 if (fUseMCInfo && isLc && !fWriteVariableTree) {
637 Int_t pdgCand1 = 4122;
638 Int_t pdgDgLctoV0bachelor1[2]={2212,310};
639 Int_t pdgDgV0toDaughters1[2]={211,211};
640 Int_t mcLabel1=part->MatchToMC(pdgCand1,pdgDgLctoV0bachelor1[1],pdgDgLctoV0bachelor1,pdgDgV0toDaughters1,mcArray,kTRUE);
641 AliDebug(2,Form(" Found true MC candidate: Lc->pK0S(%d) - onTheFly=%1d",mcLabel1,onFlyV0));
645 Double_t nSigmaTPCpr=-999.;
646 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,4,nSigmaTPCpr);
647 Double_t nSigmaTOFpr=-999.;
648 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,4,nSigmaTOFpr);
650 Double_t nSigmaTPCpi=-999.;
651 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,2,nSigmaTPCpi);
652 Double_t nSigmaTOFpi=-999.;
653 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,2,nSigmaTOFpi);
655 Double_t nSigmaTPCka=-999.;
656 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,3,nSigmaTPCka);
657 Double_t nSigmaTOFka=-999.;
658 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,3,nSigmaTOFka);
661 if (isCandidateSelectedCuts) {
662 FillAnalysisHistograms(part,isBachelorID,"");
666 if (isCandidateSelectedCuts) {
667 fillthis="histoprotonBachSigmaVspTOF";
668 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
669 fillthis="histoprotonBachSigmaVspTPC";
670 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
671 FillAnalysisHistograms(part,isBachelorID,"Offline");
677 if (isCandidateSelectedCuts) {
678 FillAnalysisHistograms(part,isBachelorID,"Sgn");
682 if (isCandidateSelectedCuts) {
683 fillthis="histoprotonBachSigmaVspTOFsgn";
684 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
685 fillthis="histoprotonBachSigmaVspTPCsgn";
686 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
687 FillAnalysisHistograms(part,isBachelorID,"OfflineSgn");
693 if (isCandidateSelectedCuts) {
694 FillAnalysisHistograms(part,isBachelorID,"Bkg");
698 if (isCandidateSelectedCuts) {
699 fillthis="histoprotonBachSigmaVspTOFbkg";
700 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTOFpr);
701 fillthis="histoprotonBachSigmaVspTPCbkg";
702 ((TH2F*)(fOutput->FindObject(fillthis)))->Fill(momBach,nSigmaTPCpr);
703 FillAnalysisHistograms(part,isBachelorID,"OfflineBkg");
712 //----------------------------------------------------
713 void AliAnalysisTaskSELc2V0bachelor::DefineK0SHistos()
716 TString nameMass=" ", nameSgn=" ", nameBkg=" ";
718 Double_t mLcPDG = TDatabasePDG::Instance()->GetParticle(4122)->Mass();
719 Double_t mK0SPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
721 if (fUseOnTheFlyV0) {
723 // V0 invariant masses (on-the-fly)
724 nameMass="histK0SMass";
725 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",
726 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
728 // Lc invariant masses (x K0S on-the-fly)
729 nameMass="histLcMassByK0S";
730 TH2F* spectrumLcMassByK0S = new TH2F(nameMass.Data(),"#Lambda_{c} invariant mass (by K^{0}_{S}) vs p_{T} ; m_{inv}(p-K^{0}_{S}) [GeV/c^{2}]; p_{T}(#Lambda_{c}) [GeV/c]",
731 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
733 nameMass="histpK0Svsp";
734 TH2F* momentumDistributionK0Svsp = new TH2F(nameMass.Data(),"#Lambda_{c}: p(K^{0}_{S}) vs p(p); p_{p}; p_{K^{0}_{S}} ",
735 175,0.,35.,175,0.,35.);
737 nameMass="histArmPodK0S";
738 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]",
739 200,-1.,1.,300,0.,0.3);
741 nameMass="histDCAtoPVvspK0S";
742 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 [n#sigmas]; Entries",
743 175,0.,35.,50,0.,5.);
745 nameMass="histK0ScosPAwrtPVvspK0S";
746 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",
747 175,0.,35.,100,0.99,1.);
749 TH2F* allspectrumK0SMass = (TH2F*)spectrumK0SMass->Clone();
750 TH2F* allspectrumLcMassByK0S = (TH2F*)spectrumLcMassByK0S->Clone();
751 TH2F* allmomentumDistributionK0Svsp= (TH2F*)momentumDistributionK0Svsp->Clone();
752 TH2F* alldcatoPVvspK0S=(TH2F*)dcatoPVvspK0S->Clone();
753 TH2F* allcosV0PAwrtPVvspK0S=(TH2F*)cosPAwrtPVvspK0S->Clone();
755 TH2F* pidBachspectrumK0SMass = (TH2F*)spectrumK0SMass->Clone();
756 TH2F* pidBachspectrumLcMassByK0S = (TH2F*)spectrumLcMassByK0S->Clone();
757 TH2F* pidBachmomentumDistributionK0Svsp= (TH2F*)momentumDistributionK0Svsp->Clone();
758 TH2F* pidBachdcatoPVvspK0S=(TH2F*)dcatoPVvspK0S->Clone();
759 TH2F* pidBachcosV0PAwrtPVvspK0S=(TH2F*)cosPAwrtPVvspK0S->Clone();
761 TH2F* allArmenterosPodK0S = (TH2F*)armenterosPodK0S->Clone();
762 TH2F* pidBachArmenterosPodK0S = (TH2F*)armenterosPodK0S->Clone();
764 fOutputAll->Add(allspectrumK0SMass);
765 fOutputAll->Add(allspectrumLcMassByK0S);
766 fOutputAll->Add(allmomentumDistributionK0Svsp);
767 fOutputAll->Add(allArmenterosPodK0S);
768 fOutputAll->Add(alldcatoPVvspK0S);
769 fOutputAll->Add(allcosV0PAwrtPVvspK0S);
771 fOutputPIDBach->Add(pidBachspectrumK0SMass);
772 fOutputPIDBach->Add(pidBachspectrumLcMassByK0S);
773 fOutputPIDBach->Add(pidBachmomentumDistributionK0Svsp);
774 fOutputPIDBach->Add(pidBachArmenterosPodK0S);
775 fOutputPIDBach->Add(pidBachdcatoPVvspK0S);
776 fOutputPIDBach->Add(pidBachcosV0PAwrtPVvspK0S);
779 TH2F* pidBachTRspectrumLcMassByK0S = (TH2F*)spectrumLcMassByK0S->Clone();
780 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassByK0S);
785 // V0 invariant masses (offline)
786 nameMass="histK0SMassOffline";
787 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",
788 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
790 // Lc invariant masses (x K0S offline)
791 nameMass="histLcMassByK0SOffline";
792 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]",
793 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
795 nameMass="histpK0SvspOffline";
796 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]",
797 175,0.,35.,175,0.,35.);
799 nameMass="histArmPodK0SOffline";
800 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]",
801 200,-1.,1.,300,0.,0.3);
803 nameMass="histDCAtoPVvspK0SOffline";
804 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 [n#sigmas]; Entries",
805 175,0.,35.,50,0.,5.);
807 nameMass="histK0ScosPAwrtPVvspK0SOffline";
808 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",
809 175,0.,35.,100,0.99,1.);
813 TH2F* allspectrumK0SMassOffline = (TH2F*)spectrumK0SMassOffline->Clone();
814 TH2F* allspectrumLcMassOfflineByK0S = (TH2F*)spectrumLcMassOfflineByK0S->Clone();
815 TH2F* allmomentumDistributionK0SvspOffline= (TH2F*)momentumDistributionK0SvspOffline->Clone();
816 TH2F* alldcatoPVvspK0SOffline=(TH2F*)dcatoPVvspK0SOffline->Clone();
817 TH2F* allcosPAwrtPVvspK0SOffline=(TH2F*)cosPAwrtPVvspK0SOffline->Clone();
818 TH2F* allArmenterosPodK0SOff = (TH2F*)armenterosPodK0SOff->Clone();
820 TH2F* pidBachspectrumK0SMassOffline = (TH2F*)spectrumK0SMassOffline->Clone();
821 TH2F* pidBachspectrumLcMassOfflineByK0S = (TH2F*)spectrumLcMassOfflineByK0S->Clone();
822 TH2F* pidBachmomentumDistributionK0SvspOffline= (TH2F*)momentumDistributionK0SvspOffline->Clone();
823 TH2F* pidBachdcatoPVvspK0SOffline=(TH2F*)dcatoPVvspK0SOffline->Clone();
824 TH2F* pidBachcosPAwrtPVvspK0SOffline=(TH2F*)cosPAwrtPVvspK0SOffline->Clone();
825 TH2F* pidBachArmenterosPodK0SOff = (TH2F*)armenterosPodK0SOff->Clone();
828 fOutputAll->Add(allspectrumK0SMassOffline);
829 fOutputAll->Add(allspectrumLcMassOfflineByK0S);
830 fOutputAll->Add(allmomentumDistributionK0SvspOffline);
831 fOutputAll->Add(allArmenterosPodK0SOff);
832 fOutputAll->Add(alldcatoPVvspK0SOffline);
833 fOutputAll->Add(allcosPAwrtPVvspK0SOffline);
835 fOutputPIDBach->Add(pidBachspectrumK0SMassOffline);
836 fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0S);
837 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOffline);
838 fOutputPIDBach->Add(pidBachArmenterosPodK0SOff);
839 fOutputPIDBach->Add(pidBachdcatoPVvspK0SOffline);
840 fOutputPIDBach->Add(pidBachcosPAwrtPVvspK0SOffline);
842 if (fTrackRotation) {
843 TH2F* pidBachTRspectrumLcMassOfflineByK0S = (TH2F*)spectrumLcMassOfflineByK0S->Clone();
844 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassOfflineByK0S);
849 if (fUseOnTheFlyV0) {
851 nameSgn="histK0SMassSgn";
852 nameBkg="histK0SMassBkg";
853 TH2F* spectrumK0SMassSgn = new TH2F(nameSgn.Data(), "K^{0}_{S} - sgn: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
854 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
855 TH2F* spectrumK0SMassBkg = new TH2F(nameBkg.Data(), "K^{0}_{S} - bkg: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
856 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
858 nameSgn="histLcMassByK0SSgn";
859 nameBkg="histLcMassByK0SBkg";
860 TH2F* spectrumLcMassByK0SSgn = new TH2F(nameSgn.Data(), "#Lambda_{c} - sgn: invariant mass (by K^{0}_{S}) vs p_{T} - MC; m_{inv}(p-K^{0}_{S}) [GeV/c^{2}]; p_{T}",
861 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
862 TH2F* spectrumLcMassByK0SBkg = new TH2F(nameBkg.Data(), "#Lambda_{c} - bkg: invariant mass (by K^{0}_{S}) vs p_{T} - MC; m_{inv}(p-K^{0}_{S}) [GeV/c^{2}]; p_{T}",
863 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
864 nameSgn="histpK0SvspSgn";
865 nameBkg="histpK0SvspBkg";
866 TH2F* momentumDistributionK0SvspSgn= new TH2F(nameSgn.Data(),"#Lambda_{c} - sgn: K^{0}_{S} vs p Total Momentum Distribution - MC; p_{p}; p_{K^{0}_{S}}",
867 175,0.,35.,175,0.,35.);
868 TH2F* momentumDistributionK0SvspBkg= new TH2F(nameBkg.Data(),"#Lambda_{c} - bkg: K^{0}_{S} vs p Total Momentum Distribution - MC; p_{p}; p_{K^{0}_{S}}",
869 175,0.,35.,175,0.,35.);
870 // armenteros-podolanski plots K0S
871 nameSgn="histArmPodK0SSgn";
872 nameBkg="histArmPodK0SBkg";
873 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]",
874 200,-1.,1.,300,0.,0.3);
875 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]",
876 200,-1.,1.,300,0.,0.3);
877 nameSgn="histDCAtoPVvspK0SSgn";
878 nameBkg="histDCAtoPVvspK0SBkg";
879 TH2F *dcatoPVvspK0SSgn=new TH2F(nameSgn.Data(),"K^{0}_{S} - sgn: DCA to Primary Vertex vs K^{0}_{S} invariant mass (sgn); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",175,0.,35.,50,0.,5.);
880 TH2F *dcatoPVvspK0SBkg=new TH2F(nameBkg.Data(),"K^{0}_{S} - bkg: DCA to Primary Vertex vs K^{0}_{S} invariant mass (bkg); p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",175,0.,35.,50,0.,5.);
882 TH2F* allspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone();
883 TH2F* allspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();
884 TH2F* allspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone();
885 TH2F* allspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();
886 TH2F* allmomentumDistributionK0SvspSgn= (TH2F*)momentumDistributionK0SvspSgn->Clone();
887 TH2F* allmomentumDistributionK0SvspBkg= (TH2F*)momentumDistributionK0SvspBkg->Clone();
888 TH2F* allArmenterosPodK0SSgn = (TH2F*)armenterosPodK0SSgn->Clone();
889 TH2F* allArmenterosPodK0SBkg = (TH2F*)armenterosPodK0SBkg->Clone();
890 TH2F* alldcatoPVvspK0SSgn= (TH2F*)dcatoPVvspK0SSgn->Clone();
891 TH2F* alldcatoPVvspK0SBkg= (TH2F*)dcatoPVvspK0SBkg->Clone();
893 TH2F* pidBachspectrumK0SMassSgn = (TH2F*)spectrumK0SMassSgn->Clone();
894 TH2F* pidBachspectrumK0SMassBkg = (TH2F*) spectrumK0SMassBkg->Clone();
895 TH2F* pidBachspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone();
896 TH2F* pidBachspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();
897 TH2F* pidBachmomentumDistributionK0SvspSgn= (TH2F*)momentumDistributionK0SvspSgn->Clone();
898 TH2F* pidBachmomentumDistributionK0SvspBkg= (TH2F*)momentumDistributionK0SvspBkg->Clone();
899 TH2F* pidBachArmenterosPodK0SSgn = (TH2F*)armenterosPodK0SSgn->Clone();
900 TH2F* pidBachArmenterosPodK0SBkg = (TH2F*)armenterosPodK0SBkg->Clone();
901 TH2F* pidBachdcatoPVvspK0SSgn= (TH2F*)dcatoPVvspK0SSgn->Clone();
902 TH2F* pidBachdcatoPVvspK0SBkg= (TH2F*)dcatoPVvspK0SBkg->Clone();
904 fOutputAll->Add(allspectrumK0SMassSgn);
905 fOutputAll->Add(allspectrumK0SMassBkg);
906 fOutputAll->Add(allspectrumLcMassByK0SSgn);
907 fOutputAll->Add(allspectrumLcMassByK0SBkg);
908 fOutputAll->Add(allmomentumDistributionK0SvspSgn);
909 fOutputAll->Add(allmomentumDistributionK0SvspBkg);
910 fOutputAll->Add(allArmenterosPodK0SSgn);
911 fOutputAll->Add(allArmenterosPodK0SBkg);
912 fOutputAll->Add(alldcatoPVvspK0SSgn);
913 fOutputAll->Add(alldcatoPVvspK0SBkg);
915 fOutputPIDBach->Add(pidBachspectrumK0SMassSgn);
916 fOutputPIDBach->Add(pidBachspectrumK0SMassBkg);
917 fOutputPIDBach->Add(pidBachspectrumLcMassByK0SSgn);
918 fOutputPIDBach->Add(pidBachspectrumLcMassByK0SBkg);
919 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspSgn);
920 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspBkg);
921 fOutputPIDBach->Add(pidBachArmenterosPodK0SSgn);
922 fOutputPIDBach->Add(pidBachArmenterosPodK0SBkg);
923 fOutputPIDBach->Add(pidBachdcatoPVvspK0SSgn);
924 fOutputPIDBach->Add(pidBachdcatoPVvspK0SBkg);
926 if (fTrackRotation) {
927 TH2F* pidBachTRspectrumLcMassByK0SSgn = (TH2F*)spectrumLcMassByK0SSgn->Clone();
928 TH2F* pidBachTRspectrumLcMassByK0SBkg = (TH2F*) spectrumLcMassByK0SBkg->Clone();
929 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassByK0SSgn);
930 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassByK0SBkg);
936 nameSgn="histK0SMassOfflineSgn";
937 nameBkg="histK0SMassOfflineBkg";
938 TH2F* spectrumK0SMassOfflineSgn = new TH2F(nameSgn.Data(), "K^{0}_{S} - sgn: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}-#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
939 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
940 TH2F* spectrumK0SMassOfflineBkg = new TH2F(nameBkg.Data(), "K^{0}_{S} - bkg: invariant mass VS p_{T} - MC; m_{inv}(#pi^{+}-#pi^{-}) [GeV/c^{2}]; p_{T}(K^{0}_{S}) [GeV/c]; Entries",
941 1000,mK0SPDG-0.050,mK0SPDG+0.050,175,0.,35.);
943 nameSgn="histLcMassByK0SOfflineSgn";
944 nameBkg="histLcMassByK0SOfflineBkg";
945 TH2F* spectrumLcMassOfflineByK0SSgn = new TH2F(nameSgn.Data(), "#Lambda_{c} - sgn: invariant mass (by K^{0}_{S}) vs p_{T} - MC; M(#Lambda_{c}) [GeV/c^{2}]; p_{T}",
946 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
947 TH2F* spectrumLcMassOfflineByK0SBkg = new TH2F(nameBkg.Data(), "#Lambda_{c} - bkg: invariant mass (by K^{0}_{S}) vs p_{T} - MC; M(#Lambda_{c}) [GeV/c^{2}]; p_{T}",
948 1000,mLcPDG-0.250,mLcPDG+0.250,175,0.,35.);
949 nameSgn="histpK0SvspOfflineSgn";
950 nameBkg="histpK0SvspOfflineBkg";
951 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}}",
952 175,0.,35.,175,0.,35.);
953 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}}",
954 175,0.,35.,175,0.,35.);
955 // armenteros-podolanski plots K0S (offline)
956 nameSgn="histArmPodK0SOfflineSgn";
957 nameBkg="histArmPodK0SOfflineBkg";
958 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]",
959 200,-1.,1.,300,0.,0.3);
960 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]",
961 200,-1.,1.,300,0.,0.3);
962 nameSgn="histDCAtoPVvspK0SOfflineSgn";
963 nameBkg="histDCAtoPVvspK0SOfflineBkg";
964 TH2F *dcatoPVvspK0SOfflineSgn=new TH2F(nameSgn.Data(),"K^{0}_{S} -offline - (sgn): DCA to Primary Vertex vs K^{0}_{S} invariant mass; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",
965 175,0.,35.,50,0.,5.);
966 TH2F *dcatoPVvspK0SOfflineBkg=new TH2F(nameBkg.Data(),"K^{0}_{S} -offline - (bkg): DCA to Primary Vertex vs K^{0}_{S} invariant mass; p(K^{0}_{S}) [GeV/c]; DCA to Primary Vertex [n#sigmas]; Entries",
967 175,0.,35.,50,0.,5.);
970 TH2F* allspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone();
971 TH2F* allspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();
972 TH2F* allspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone();
973 TH2F* allspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();
974 TH2F* allmomentumDistributionK0SvspOfflineSgn= (TH2F*)momentumDistributionK0SvspOfflineSgn->Clone();
975 TH2F* allmomentumDistributionK0SvspOfflineBkg= (TH2F*)momentumDistributionK0SvspOfflineBkg->Clone();
976 TH2F* allArmenterosPodK0SOffSgn = (TH2F*)armenterosPodK0SOffSgn->Clone();
977 TH2F* allArmenterosPodK0SOffBkg = (TH2F*)armenterosPodK0SOffBkg->Clone();
978 TH2F* alldcatoPVvspK0SOfflineSgn= (TH2F*)dcatoPVvspK0SOfflineSgn->Clone();
979 TH2F* alldcatoPVvspK0SOfflineBkg= (TH2F*)dcatoPVvspK0SOfflineBkg->Clone();
981 TH2F* pidBachspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone();
982 TH2F* pidBachspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();
983 TH2F* pidBachspectrumK0SMassOfflineSgn = (TH2F*)spectrumK0SMassOfflineSgn->Clone();
984 TH2F* pidBachspectrumK0SMassOfflineBkg = (TH2F*) spectrumK0SMassOfflineBkg->Clone();
985 TH2F* pidBachmomentumDistributionK0SvspOfflineSgn= (TH2F*)momentumDistributionK0SvspOfflineSgn->Clone();
986 TH2F* pidBachmomentumDistributionK0SvspOfflineBkg= (TH2F*)momentumDistributionK0SvspOfflineBkg->Clone();
987 TH2F* pidBachArmenterosPodK0SOffSgn = (TH2F*)armenterosPodK0SOffSgn->Clone();
988 TH2F* pidBachArmenterosPodK0SOffBkg = (TH2F*)armenterosPodK0SOffBkg->Clone();
989 TH2F* pidBachdcatoPVvspK0SOfflineSgn= (TH2F*)dcatoPVvspK0SOfflineSgn->Clone();
990 TH2F* pidBachdcatoPVvspK0SOfflineBkg= (TH2F*)dcatoPVvspK0SOfflineBkg->Clone();
992 fOutputAll->Add(allspectrumK0SMassOfflineSgn);
993 fOutputAll->Add(allspectrumK0SMassOfflineBkg);
994 fOutputAll->Add(allspectrumLcMassOfflineByK0SSgn);
995 fOutputAll->Add(allspectrumLcMassOfflineByK0SBkg);
996 fOutputAll->Add(allmomentumDistributionK0SvspOfflineSgn);
997 fOutputAll->Add(allmomentumDistributionK0SvspOfflineBkg);
998 fOutputAll->Add(allArmenterosPodK0SOffSgn);
999 fOutputAll->Add(allArmenterosPodK0SOffBkg);
1000 fOutputAll->Add(alldcatoPVvspK0SOfflineSgn);
1001 fOutputAll->Add(alldcatoPVvspK0SOfflineBkg);
1003 fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineSgn);
1004 fOutputPIDBach->Add(pidBachspectrumK0SMassOfflineBkg);
1005 fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0SSgn);
1006 fOutputPIDBach->Add(pidBachspectrumLcMassOfflineByK0SBkg);
1007 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOfflineSgn);
1008 fOutputPIDBach->Add(pidBachmomentumDistributionK0SvspOfflineBkg);
1009 fOutputPIDBach->Add(pidBachArmenterosPodK0SOffSgn);
1010 fOutputPIDBach->Add(pidBachArmenterosPodK0SOffBkg);
1011 fOutputPIDBach->Add(pidBachdcatoPVvspK0SOfflineSgn);
1012 fOutputPIDBach->Add(pidBachdcatoPVvspK0SOfflineBkg);
1014 if (fTrackRotation) {
1015 TH2F* pidBachTRspectrumLcMassOfflineByK0SSgn = (TH2F*)spectrumLcMassOfflineByK0SSgn->Clone();
1016 TH2F* pidBachTRspectrumLcMassOfflineByK0SBkg = (TH2F*) spectrumLcMassOfflineByK0SBkg->Clone();
1017 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassOfflineByK0SSgn);
1018 fOutputPIDBachTR->Add(pidBachTRspectrumLcMassOfflineByK0SBkg);
1024 if (fTrackRotation) {
1026 TH1F *hNormRotated=new TH1F("hNormRotated","",11,-0.5,10.5);
1027 TH1F *hNormRotatedOffline=new TH1F("hNormRotatedOffline","",11,-0.5,10.5);
1028 TH1F *hNormRotatedSgn=new TH1F("hNormRotatedSgn","",11,-0.5,10.5);
1029 TH1F *hNormRotatedOfflineSgn=new TH1F("hNormRotatedOfflineSgn","",11,-0.5,10.5);
1030 TH1F *hNormRotatedBkg=new TH1F("hNormRotatedBkg","",11,-0.5,10.5);
1031 TH1F *hNormRotatedOfflineBkg=new TH1F("hNormRotatedOfflineBkg","",11,-0.5,10.5);
1032 hNormRotated->Sumw2();
1033 hNormRotatedOffline->Sumw2();
1034 hNormRotatedSgn->Sumw2();
1035 hNormRotatedOfflineSgn->Sumw2();
1036 hNormRotatedBkg->Sumw2();
1037 hNormRotatedOfflineBkg->Sumw2();
1038 hNormRotated->SetMinimum(0);
1039 hNormRotatedOffline->SetMinimum(0);
1040 hNormRotatedSgn->SetMinimum(0);
1041 hNormRotatedOfflineSgn->SetMinimum(0);
1042 hNormRotatedBkg->SetMinimum(0);
1043 hNormRotatedOfflineBkg->SetMinimum(0);
1045 fOutputPIDBachTR->Add(hNormRotated);
1046 fOutputPIDBachTR->Add(hNormRotatedOffline);
1047 fOutputPIDBachTR->Add(hNormRotatedSgn);
1048 fOutputPIDBachTR->Add(hNormRotatedOfflineSgn);
1049 fOutputPIDBachTR->Add(hNormRotatedBkg);
1050 fOutputPIDBachTR->Add(hNormRotatedOfflineBkg);
1052 Int_t nMassBins=fMaxMass*1000.-fMinMass*1000.;
1053 Double_t maxm=fMinMass+nMassBins*0.001;
1054 TH3F *hMassVsPtVsY=new TH3F("hMassVsPtVsY","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1055 TH3F *hMassVsPtVsYOffline=new TH3F("hMassVsPtVsYOffline","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1056 TH3F *hMassVsPtVsYSgn=new TH3F("hMassVsPtVsYSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1057 TH3F *hMassVsPtVsYOfflineSgn=new TH3F("hMassVsPtVsYOfflineSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1058 TH3F *hMassVsPtVsYBkg=new TH3F("hMassVsPtVsYBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1059 TH3F *hMassVsPtVsYOfflineBkg=new TH3F("hMassVsPtVsYOfflineBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1061 hMassVsPtVsY->Sumw2();
1062 hMassVsPtVsYOffline->Sumw2();
1063 hMassVsPtVsYSgn->Sumw2();
1064 hMassVsPtVsYOfflineSgn->Sumw2();
1065 hMassVsPtVsYBkg->Sumw2();
1066 hMassVsPtVsYOfflineBkg->Sumw2();
1067 hMassVsPtVsY->SetMinimum(0);
1068 hMassVsPtVsYOffline->SetMinimum(0);
1069 hMassVsPtVsYSgn->SetMinimum(0);
1070 hMassVsPtVsYOfflineSgn->SetMinimum(0);
1071 hMassVsPtVsYBkg->SetMinimum(0);
1072 hMassVsPtVsYOfflineBkg->SetMinimum(0);
1074 fOutputPIDBachTR->Add(hMassVsPtVsY);
1075 fOutputPIDBachTR->Add(hMassVsPtVsYOffline);
1076 fOutputPIDBachTR->Add(hMassVsPtVsYSgn);
1077 fOutputPIDBachTR->Add(hMassVsPtVsYOfflineSgn);
1078 fOutputPIDBachTR->Add(hMassVsPtVsYBkg);
1079 fOutputPIDBachTR->Add(hMassVsPtVsYOfflineBkg);
1081 TH3F *hMassVsPtVsYRot=new TH3F("hMassVsPtVsYRot","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1082 TH3F *hMassVsPtVsYRotOffline=new TH3F("hMassVsPtVsYRotOffline","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1083 TH3F *hMassVsPtVsYRotSgn=new TH3F("hMassVsPtVsYRotSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1084 TH3F *hMassVsPtVsYRotOfflineSgn=new TH3F("hMassVsPtVsYRotOfflineSgn","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1085 TH3F *hMassVsPtVsYRotBkg=new TH3F("hMassVsPtVsYRotBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1086 TH3F *hMassVsPtVsYRotOfflineBkg=new TH3F("hMassVsPtVsYRotOfflineBkg","",nMassBins,fMinMass,maxm,20,0.,10.,20,-1.,1.);
1088 hMassVsPtVsYRot->Sumw2();
1089 hMassVsPtVsYRotOffline->Sumw2();
1090 hMassVsPtVsYRotSgn->Sumw2();
1091 hMassVsPtVsYRotOfflineSgn->Sumw2();
1092 hMassVsPtVsYRotBkg->Sumw2();
1093 hMassVsPtVsYRotOfflineBkg->Sumw2();
1094 hMassVsPtVsYRot->SetMinimum(0);
1095 hMassVsPtVsYRotOffline->SetMinimum(0);
1096 hMassVsPtVsYRotSgn->SetMinimum(0);
1097 hMassVsPtVsYRotOfflineSgn->SetMinimum(0);
1098 hMassVsPtVsYRotBkg->SetMinimum(0);
1099 hMassVsPtVsYRotOfflineBkg->SetMinimum(0);
1101 fOutputPIDBachTR->Add(hMassVsPtVsYRot);
1102 fOutputPIDBachTR->Add(hMassVsPtVsYRotOffline);
1103 fOutputPIDBachTR->Add(hMassVsPtVsYRotSgn);
1104 fOutputPIDBachTR->Add(hMassVsPtVsYRotOfflineSgn);
1105 fOutputPIDBachTR->Add(hMassVsPtVsYRotBkg);
1106 fOutputPIDBachTR->Add(hMassVsPtVsYRotOfflineBkg);
1109 TH1F *hDeltaMass=new TH1F("hDeltaMass","",100,-0.4,0.4);
1110 TH1F *hDeltaMassOffline=new TH1F("hDeltaMassOffline","",100,-0.4,0.4);
1111 TH1F *hDeltaMassSgn=new TH1F("hDeltaMassSgn","",100,-0.4,0.4);
1112 TH1F *hDeltaMassOfflineSgn=new TH1F("hDeltaMassOfflineSgn","",100,-0.4,0.4);
1113 TH1F *hDeltaMassBkg=new TH1F("hDeltaMassBkg","",100,-0.4,0.4);
1114 TH1F *hDeltaMassOfflineBkg=new TH1F("hDeltaMassOfflineBkg","",100,-0.4,0.4);
1115 hDeltaMass->Sumw2();
1116 hDeltaMassOffline->Sumw2();
1117 hDeltaMassSgn->Sumw2();
1118 hDeltaMassOfflineSgn->Sumw2();
1119 hDeltaMassBkg->Sumw2();
1120 hDeltaMassOfflineBkg->Sumw2();
1122 hDeltaMass->SetMinimum(0);
1123 hDeltaMassOffline->SetMinimum(0);
1124 hDeltaMassSgn->SetMinimum(0);
1125 hDeltaMassOfflineSgn->SetMinimum(0);
1126 hDeltaMassBkg->SetMinimum(0);
1127 hDeltaMassOfflineBkg->SetMinimum(0);
1129 fOutputPIDBachTR->Add(hDeltaMass);
1130 fOutputPIDBachTR->Add(hDeltaMassOffline);
1131 fOutputPIDBachTR->Add(hDeltaMassSgn);
1132 fOutputPIDBachTR->Add(hDeltaMassOfflineSgn);
1133 fOutputPIDBachTR->Add(hDeltaMassBkg);
1134 fOutputPIDBachTR->Add(hDeltaMassOfflineBkg);
1137 Int_t binSparseDMassRot[5]={nMassBins,100,24,40,20};
1138 Double_t edgeLowSparseDMassRot[5]={fMinMass,-0.4,0.,-4.,0};
1139 Double_t edgeHighSparseDMassRot[5]={maxm,0.4,12.,4.,3.14};
1140 THnSparse *hDeltaMassFullAnalysis=new THnSparseF("hDeltaMassFullAnalysis","hDeltaMassFullAnalysis;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1141 THnSparse *hDeltaMassFullAnalysisOffline=new THnSparseF("fDeltaMassFullAnalysisOffline","hDeltaMassFullAnalysisOffline;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1143 THnSparse *hDeltaMassFullAnalysisSgn=new THnSparseF("hDeltaMassFullAnalysisSgn","hDeltaMassFullAnalysisSgn;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1144 THnSparse *hDeltaMassFullAnalysisOfflineSgn=new THnSparseF("fDeltaMassFullAnalysisOfflineSgn","hDeltaMassFullAnalysisOfflineSgn;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1146 THnSparse *hDeltaMassFullAnalysisBkg=new THnSparseF("hDeltaMassFullAnalysisBkg","hDeltaMassFullAnalysisBkg;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1147 THnSparse *hDeltaMassFullAnalysisOfflineBkg=new THnSparseF("fDeltaMassFullAnalysisOfflineBkg","hDeltaMassFullAnalysisOfflineBkg;inv mass (GeV/c);#Delta inv mass (GeV/c) ; p_{T}^{#Lambda_{c}} (GeV/c); #Delta p_{T} (GeV/c); daughter angle (2prongs) (rad);",5,binSparseDMassRot,edgeLowSparseDMassRot,edgeHighSparseDMassRot);
1149 fOutputPIDBachTR->Add(hDeltaMassFullAnalysis);
1150 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisOffline);
1151 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisSgn);
1152 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisOfflineSgn);
1153 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisBkg);
1154 fOutputPIDBachTR->Add(hDeltaMassFullAnalysisOfflineBkg);
1161 //---------------------------
1162 void AliAnalysisTaskSELc2V0bachelor::CheckEventSelection(AliAODEvent *aodEvent) {
1164 // To fill control histograms
1167 TClonesArray *arrayLctopKos=0;
1169 if(AODEvent() && IsStandardAOD()) {
1170 // In case there is an AOD handler writing a standard AOD, use the AOD
1171 // event in memory rather than the input (ESD) event.
1172 aodEvent = dynamic_cast<AliAODEvent*> (AODEvent());
1173 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
1174 // have to taken from the AOD event hold by the AliAODExtension
1175 AliAODHandler* aodHandler = (AliAODHandler*)
1176 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
1178 if (aodHandler->GetExtensions()) {
1179 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
1180 AliAODEvent *aodFromExt = ext->GetAOD();
1181 arrayLctopKos=(TClonesArray*)aodFromExt->GetList()->FindObject("CascadesHF");
1185 arrayLctopKos=(TClonesArray*)aodEvent->GetList()->FindObject("CascadesHF");
1188 Float_t zVertex = fVtx1->GetZ();
1189 TString titleVtx=fVtx1->GetTitle();
1191 if (TMath::Abs(fBzkG)>=0.001) {
1193 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ2")))->Fill(zVertex);
1195 if (arrayLctopKos) {
1197 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ3")))->Fill(zVertex);
1200 TClonesArray *mcArray = 0;
1201 AliAODMCHeader *mcHeader=0;
1204 // MC array need for maching
1205 mcArray = dynamic_cast<TClonesArray*>(aodEvent->FindListObject(AliAODMCParticle::StdBranchName()));
1209 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ4")))->Fill(zVertex);
1210 mcHeader = (AliAODMCHeader*)aodEvent->GetList()->FindObject(AliAODMCHeader::StdBranchName());
1212 if (mcHeader && fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ5")))->Fill(zVertex);
1214 // check on MC Lc Daughter
1215 if (fAdditionalChecks) {
1216 for (Int_t iii=0; iii<mcArray->GetEntries(); iii++)
1217 SearchLcDaughter(mcArray,iii);
1224 if (fVtx1->GetNContributors()>0) {
1225 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ6")))->Fill(zVertex);
1227 TString firedTriggerClasses = aodEvent->GetFiredTriggerClasses(); // trigger class
1228 ULong64_t fTriggerMask=AliVEvent::kAnyINT;
1229 Bool_t check1 = kFALSE;
1230 if ( !fUseMCInfo && // don't do for MC...
1231 (aodEvent->GetRunNumber()<136851 || aodEvent->GetRunNumber()>139517) ) { // ...and for PbPb 2010 data
1232 if ( !(firedTriggerClasses.Contains("CINT1")) ) {
1233 AliInfo(Form(" ======================== firedTriggerClasses.Data() = %s",firedTriggerClasses.Data()));
1235 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ8")))->Fill(zVertex);
1240 Bool_t isSelectedAAA = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1241 if (!isSelectedAAA) {
1243 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ9")))->Fill(zVertex);
1246 if (!isSelectedAAA || check1) {
1248 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ16")))->Fill(zVertex);
1251 fTriggerMask=AliVEvent::kAny;
1252 Bool_t isSelectedBBB = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1253 if (!isSelectedBBB) {
1255 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ10")))->Fill(zVertex);
1258 if (titleVtx.Contains("Z")) {
1260 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ11")))->Fill(zVertex);
1262 else if (titleVtx.Contains("3D")) {
1264 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ12")))->Fill(zVertex);
1267 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ13")))->Fill(zVertex);
1270 if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
1272 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ14")))->Fill(zVertex);
1275 if ( fIsEventSelected ) {
1276 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ7")))->Fill(zVertex);
1279 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ15")))->Fill(zVertex);
1282 } // nContributors>=1
1283 } // analysisArray exists
1284 } // magnetic field exists
1290 void AliAnalysisTaskSELc2V0bachelor::CheckEventSelectionWithCandidates(AliAODEvent *aodEvent) {
1292 // To fill control histograms
1295 Float_t zVertex = fVtx1->GetZ();
1296 TString titleVtx=fVtx1->GetTitle();
1297 TString firedTriggerClasses = aodEvent->GetFiredTriggerClasses(); // trigger class
1298 ULong64_t fTriggerMask=AliVEvent::kAnyINT;
1300 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(6);
1301 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ6a")))->Fill(zVertex);
1303 Bool_t check1a = kFALSE;
1304 if ( !fUseMCInfo && // don't do for MC...
1305 (aodEvent->GetRunNumber()<136851 || aodEvent->GetRunNumber()>139517) ) { // ...and for PbPb 2010 data
1306 if ( !(firedTriggerClasses.Contains("CINT1")) ) {
1307 AliInfo(Form(" ======================== firedTriggerClasses.Data() = %s",firedTriggerClasses.Data()));
1308 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(8);
1309 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ8a")))->Fill(zVertex);
1314 Bool_t isSelectedAAAa = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1315 if (!isSelectedAAAa) {
1316 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(9);
1317 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ9a")))->Fill(zVertex);
1320 if (!isSelectedAAAa || check1a) {
1321 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(16);
1322 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ16a")))->Fill(zVertex);
1325 fTriggerMask=AliVEvent::kAny;
1326 Bool_t isSelectedBBBa = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
1327 if (!isSelectedBBBa) {
1328 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(10);
1329 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ10a")))->Fill(zVertex);
1332 if (titleVtx.Contains("Z")) {
1333 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(11);
1334 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ11a")))->Fill(zVertex);
1336 else if (titleVtx.Contains("3D")) {
1337 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(12);
1338 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ12a")))->Fill(zVertex);
1340 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(13);
1341 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ13a")))->Fill(zVertex);
1344 if (TMath::Abs(zVertex)<=fAnalCuts->GetMaxVtxZ()) {
1345 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(14);
1346 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ14a")))->Fill(zVertex);
1349 if ( fIsEventSelected ) {
1350 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(7);
1351 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ7a")))->Fill(zVertex);
1353 ((TH1F*)(fOutput->FindObject("hEventsWithCandidates")))->Fill(15);
1354 if (fAdditionalChecks) ((TH1F*)(fOutput->FindObject("hZ15a")))->Fill(zVertex);
1360 //-----------------------------
1361 Int_t AliAnalysisTaskSELc2V0bachelor::MatchToMC(AliAODRecoCascadeHF *lc2bacV0,
1362 Int_t *pdgDgLc2bacV0, Int_t *pdgDgV0,
1363 TClonesArray *mcArray) {
1365 // This is now implemented in AliAODRecoCascadeHF
1369 AliAODTrack *bachelor = (AliAODTrack*)lc2bacV0->GetBachelor();
1370 if (!bachelor) return -1;
1371 Int_t labBachelor = TMath::Abs(bachelor->GetLabel());
1372 if (labBachelor<0) return -1;
1373 AliAODMCParticle *partBachelor = (AliAODMCParticle*)mcArray->At(labBachelor);
1374 if (!partBachelor) return -1;
1375 if (TMath::Abs(partBachelor->GetPdgCode())!=pdgDgLc2bacV0[0]) return -1;
1377 Int_t labBacMother = partBachelor->GetMother();
1378 if (labBacMother<0) return -1;
1379 AliAODMCParticle *partBacMother = (AliAODMCParticle*)mcArray->At(labBacMother);
1380 if (!partBacMother) return -1;
1381 if (TMath::Abs(partBacMother->GetPdgCode())!=4122) return -1;
1384 AliAODTrack *posV0Daugh = (AliAODTrack*)lc2bacV0->Getv0PositiveTrack();
1385 AliAODTrack *negV0Daugh = (AliAODTrack*)lc2bacV0->Getv0NegativeTrack();
1386 if (!posV0Daugh || !negV0Daugh) return -1;
1388 Int_t labV0pos = TMath::Abs(posV0Daugh->GetLabel());
1389 Int_t labV0neg = TMath::Abs(negV0Daugh->GetLabel());
1390 if (labV0pos<0 || labV0neg<0) return -1;
1392 AliAODMCParticle *partV0pos = (AliAODMCParticle*)mcArray->At(labV0neg);
1393 AliAODMCParticle *partV0neg = (AliAODMCParticle*)mcArray->At(labV0pos);
1394 if (!partV0pos || !partV0neg) return -1;
1396 if ( ! ( (TMath::Abs(partV0pos->GetPdgCode())==pdgDgV0[0] &&
1397 TMath::Abs(partV0neg->GetPdgCode())==pdgDgV0[1]) ||
1398 (TMath::Abs(partV0pos->GetPdgCode())==pdgDgV0[1] &&
1399 TMath::Abs(partV0neg->GetPdgCode())==pdgDgV0[0]) ) ) return -1;
1400 Int_t labV0posMother = partV0pos->GetMother();
1401 Int_t labV0negMother = partV0neg->GetMother();
1403 if (labV0posMother<0 || labV0negMother<0) return -1;
1404 if (labV0posMother!=labV0negMother) return -1;
1406 AliAODMCParticle *motherV0 = (AliAODMCParticle*)mcArray->At(labV0posMother);
1407 if (!motherV0) return-1;
1409 if (TMath::Abs(motherV0->GetPdgCode())!=pdgDgLc2bacV0[1]) return -1;
1410 Int_t labV0mother = motherV0->GetMother();
1411 if (labV0mother<0) return -1;
1412 AliAODMCParticle *gMotherV0 = (AliAODMCParticle*)mcArray->At(labV0mother);
1413 if (!gMotherV0) return-1;
1415 if ( !(pdgDgLc2bacV0[1]==310 && TMath::Abs(gMotherV0->GetPdgCode())==311) &&
1416 !(pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) ) return -1;
1418 if ( (pdgDgLc2bacV0[1]==310 && TMath::Abs(gMotherV0->GetPdgCode())==311) ) {
1419 Int_t labV0GMother = gMotherV0->GetMother();
1420 if (labV0GMother<0) return -1;
1421 AliAODMCParticle *ggMotherV0 = (AliAODMCParticle*)mcArray->At(labV0GMother);
1422 if (!ggMotherV0) return-1;
1424 if (TMath::Abs(ggMotherV0->GetPdgCode())!=4122) return -1;
1425 gMotherV0 = (AliAODMCParticle*)ggMotherV0;
1426 labV0mother=labV0GMother;
1428 else if (pdgDgLc2bacV0[1]==3122 && TMath::Abs(motherV0->GetPdgCode())==3122) {
1429 if (TMath::Abs(gMotherV0->GetPdgCode())!=4122) return -1;
1432 if (labBacMother!=labV0mother) {
1436 return labBacMother;
1440 //________________________________________________________________
1441 Int_t AliAnalysisTaskSELc2V0bachelor::SearchLcDaughter(TClonesArray *arrayMC, Int_t iii) {
1443 // This is to check Lc dinasty
1446 Int_t indexToBeReturned=-999;
1449 Int_t pdgLambda=3122;
1452 Int_t pdgBachelor=2212;
1453 Int_t pdgBachelorPi=211;
1455 TString fillthis="";
1456 fillthis="histMcStatLc";
1458 AliAODMCParticle *searchLc = dynamic_cast<AliAODMCParticle*>(arrayMC->At(iii));
1459 if(!searchLc) return -999;
1460 if (TMath::Abs(searchLc->GetPdgCode()) != pdgLc) return -999;
1462 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(0);
1463 indexToBeReturned = 0;
1465 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*1);
1466 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*1;
1468 Int_t nDaughLc = searchLc->GetNDaughters();
1470 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*10);
1471 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*10;
1472 return indexToBeReturned;
1475 Int_t index1=searchLc->GetDaughter(0);
1476 Int_t index2=searchLc->GetDaughter(1);
1477 if (index1<=0 || index2<=0) {
1481 AliAODMCParticle *daugh1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1482 AliAODMCParticle *daugh2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
1483 if (!daugh1 || !daugh2) return -999;
1485 Int_t daughPdg1 = TMath::Abs(daugh1->GetPdgCode());
1486 Int_t daughPdg2 = TMath::Abs(daugh2->GetPdgCode());
1487 if ( !( (daughPdg1==pdgBachelor && daughPdg2==pdgK0) ||
1488 (daughPdg2==pdgBachelor && daughPdg1==pdgK0) ||
1489 (daughPdg1==pdgLambda && daughPdg2==pdgBachelorPi) ||
1490 (daughPdg2==pdgLambda && daughPdg1==pdgBachelorPi) ) ) {
1491 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*10);
1492 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*10;
1493 return indexToBeReturned;
1496 if (daughPdg1==pdgK0 || daughPdg1==pdgLambda) {
1497 index1=searchLc->GetDaughter(1);
1498 index2=searchLc->GetDaughter(0);
1500 daugh1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1501 daugh2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
1502 if (!daugh1 || !daugh2) return -999;
1504 daughPdg1=TMath::Abs(daugh1->GetPdgCode());
1505 daughPdg2=TMath::Abs(daugh2->GetPdgCode());
1507 if ( daughPdg1==pdgBachelor && daughPdg2==pdgK0 ) { // Lc+ -> p K0bar
1509 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*2);
1510 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*2;
1512 Int_t nDaughK0 = daugh2->GetNDaughters();
1513 if (nDaughK0!=1) return -999;
1515 Int_t indexK0daugh=daugh2->GetDaughter(0);
1516 if (indexK0daugh<=0) return -999;
1518 AliAODMCParticle *daughK0 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(indexK0daugh));
1519 if (!daughK0) return -999;
1521 Int_t daughK0Pdg=TMath::Abs(daughK0->GetPdgCode());
1522 if (daughK0Pdg!=pdgV0) {
1523 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*4); // K0L
1524 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*4;
1525 return indexToBeReturned;
1527 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*3); // K0S
1528 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*3;
1530 Int_t nDaughK0S = daughK0->GetNDaughters();
1532 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*5); // other decays for K0S
1533 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*5;
1534 return indexToBeReturned;
1537 index1=daughK0->GetDaughter(0);
1538 index2=daughK0->GetDaughter(1);
1539 if(index1<=0 || index2<=0) {
1543 AliAODMCParticle *daughK0S1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1544 AliAODMCParticle *daughK0S2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
1545 if (!daughK0S1 || !daughK0S2) return -999;
1547 Int_t daughK0S1pdg=TMath::Abs(daughK0S1->GetPdgCode());
1548 Int_t daughK0S2pdg=TMath::Abs(daughK0S2->GetPdgCode());
1550 if ( daughK0S1pdg==211 && daughK0S2pdg==211 ) {
1551 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*6); // K0S -> pi+ pi-
1552 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*6;
1554 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*5); // other decays for K0S
1555 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*5;
1558 } //if (daughPdg1==pdgBachelor && daughPdg2==pdgK0)
1559 else if ( daughPdg1==pdgBachelorPi && daughPdg2==pdgLambda ) { // Lc+ -> pi+ Lambda
1561 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*7);
1562 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*7;
1564 Int_t nDaughL = daugh2->GetNDaughters();
1566 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*8);
1567 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*8;
1568 return indexToBeReturned;
1571 index1=daugh2->GetDaughter(0);
1572 index2=daugh2->GetDaughter(1);
1573 if(index1<=0 || index2<=0) {
1577 AliAODMCParticle *daughL1 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index1));
1578 AliAODMCParticle *daughL2 = dynamic_cast<AliAODMCParticle*>(arrayMC->At(index2));
1579 if (!daughL1 || !daughL2) return -999;
1581 Int_t daughL1pdg=TMath::Abs(daughL1->GetPdgCode());
1582 Int_t daughL2pdg=TMath::Abs(daughL2->GetPdgCode());
1583 if ( (daughL1pdg==211 && daughL2pdg==2212) ||
1584 (daughL2pdg==211 && daughL1pdg==2212) ) {
1585 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*9);
1586 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*9;
1588 ((TH1F*)(fOutput->FindObject(fillthis)))->Fill(TMath::Nint(searchLc->Charge()/3.)*8);
1589 indexToBeReturned = TMath::Nint(searchLc->Charge()/3.)*8;
1592 } //else if (daughPdg1==pdgBachelorPi && daughPdg2==pdgLambda)
1594 return indexToBeReturned;
1597 //________________________________________________________________
1598 void AliAnalysisTaskSELc2V0bachelor::FillArmPodDistribution(AliAODv0 *vZero,
1602 // This is to fill Armenteros Podolanski plots
1605 Double_t alpha = vZero->AlphaV0();
1606 Double_t qT = vZero->PtArmV0();
1608 ((TH2F*)(histoList->FindObject(histoTitle)))->Fill(alpha,qT);
1612 //-------------------------------------------------------------------------------
1613 void AliAnalysisTaskSELc2V0bachelor::CheckCandidatesAtDifferentLevels(AliAODRecoCascadeHF *part, AliRDHFCutsLctoV0* cutsAnal) {
1615 // This is to check candidates at different levels
1618 Bool_t areCutsUsingPID = cutsAnal->GetIsUsePID();
1620 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
1621 Bool_t onFlyV0 = v0part->GetOnFlyStatus(); // on-the-flight V0s
1623 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
1626 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(3); // it counts number of candidates coming from offline V0s
1628 if ( cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122)) )
1629 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(4);
1630 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1631 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(5);
1632 cutsAnal->SetUsePID(kFALSE);
1633 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1634 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(6);
1635 cutsAnal->SetUsePID(areCutsUsingPID);
1636 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kPID))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1637 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(7);
1638 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1639 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(8);
1640 if ( (((cutsAnal->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr))==(AliRDHFCutsLctoV0::kLcToK0Spr)) )
1641 ((TH1F*)(fOutput->FindObject("hCandidateSelection")))->Fill(9);
1643 if ( cutsAnal->IsInFiducialAcceptance(part->Pt(),part->Y(4122)) ) {
1645 if ( ( (cutsAnal->IsSelected(part,AliRDHFCuts::kTracks))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) {
1647 Int_t aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kTracks);
1648 if ( (aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1649 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1650 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1651 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates1")))->Fill( -aaa );
1653 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates1")))->Fill( aaa );
1656 cutsAnal->SetUsePID(kFALSE);
1657 aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate);
1658 if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
1659 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1660 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1661 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates2")))->Fill( -aaa );
1663 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates2")))->Fill( aaa );
1665 cutsAnal->SetUsePID(areCutsUsingPID);
1667 aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kPID);
1668 if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
1669 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1670 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1671 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates3")))->Fill( -aaa );
1673 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates3")))->Fill( aaa );
1676 aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kAll);
1677 if ((aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr) {
1678 if ( ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi && bachelor->Charge()==-1) ||
1679 ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi && bachelor->Charge()==+1) )
1680 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates4")))->Fill( -aaa );
1682 ((TH1F*)(fOutput->FindObject("hSwitchOnCandidates4")))->Fill( aaa );
1691 //-------------------------------------------------------------------------------
1692 void AliAnalysisTaskSELc2V0bachelor::FillTheTree(AliAODRecoCascadeHF *part, AliRDHFCutsLctoV0 *cutsAnal, TClonesArray *mcArray, Int_t isLc) {
1694 // This is to fill tree
1697 Double_t mk0sPDG = TDatabasePDG::Instance()->GetParticle(310)->Mass();
1698 Double_t mLPDG = TDatabasePDG::Instance()->GetParticle(3122)->Mass();
1700 Double_t invmassLc = part->InvMassLctoK0sP();
1701 Double_t invmassLc2Lpi = part->InvMassLctoLambdaPi();
1703 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
1705 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
1706 Double_t dcaV0ptp = v0part->GetDCA();
1707 Double_t invmassK0S = v0part->MassK0Short();
1708 Double_t invmassLambda = v0part->MassLambda();
1709 Double_t invmassLambdaBar = v0part->MassAntiLambda();
1711 Int_t isLc2LBarpi=0, isLc2Lpi=0;
1713 Int_t isDp2K0Spi=0, isDs2K0SK=0;
1714 Int_t mcLabel2 = -1;
1715 Int_t mcLabel3 = -1;
1716 Int_t isKstar12K0Spi=0, isKstar22K0Spi=0;
1717 Int_t mcLabel4 = -1;
1718 Int_t mcLabel5 = -1;
1719 Double_t ptCandByMC = 0.;//fmcPartCandidate->Pt();
1720 Double_t yCandByMC = 0.;//fmcPartCandidate->Y() ;
1723 Int_t pdgCand0 = 4122;
1724 Int_t pdgDgLctoV0bachelor0[2]={2212,310};
1725 Int_t pdgDgV0toDaughters0[2]={211,211};
1726 Int_t mcLabelLc2pK0S = part->MatchToMC(pdgCand0,pdgDgLctoV0bachelor0[1],pdgDgLctoV0bachelor0,pdgDgV0toDaughters0,mcArray,kTRUE);
1727 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabelLc2pK0S);
1728 if (lambdaCpartMC) {
1729 ptCandByMC = lambdaCpartMC->Pt();
1730 yCandByMC = lambdaCpartMC->Y() ;
1734 Int_t pdgCand = 4122;
1735 Int_t pdgDgLctoV0bachelor[2]={211,3122};
1736 Int_t pdgDgV0toDaughters[2]={2212,211};
1737 mcLabel = part->MatchToMC(pdgCand,pdgDgLctoV0bachelor[1],pdgDgLctoV0bachelor,pdgDgV0toDaughters,mcArray,kTRUE);
1739 if (bachelor->Charge()==-1) isLc2LBarpi=1;
1740 if (bachelor->Charge()==+1) isLc2Lpi=1;
1741 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel);
1742 if (lambdaCpartMC) {
1743 ptCandByMC = lambdaCpartMC->Pt();
1744 yCandByMC = lambdaCpartMC->Y() ;
1748 Int_t pdgCand2 = 411; // D+ -> pi+ K0S
1749 Int_t pdgCand3 = 431; // Ds+ -> K+ K0S
1750 Int_t pdgDgCand2[2]={211,310};
1751 Int_t pdgDgCand3[2]={321,310};
1752 pdgDgV0toDaughters[0]=211;
1753 pdgDgV0toDaughters[1]=211;
1754 mcLabel2 = part->MatchToMC(pdgCand2,pdgDgCand2[1],pdgDgCand2,pdgDgV0toDaughters,mcArray,kTRUE);
1755 mcLabel3 = part->MatchToMC(pdgCand3,pdgDgCand3[1],pdgDgCand3,pdgDgV0toDaughters,mcArray,kTRUE);
1758 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel2);
1759 if (lambdaCpartMC) {
1760 ptCandByMC = lambdaCpartMC->Pt();
1761 yCandByMC = lambdaCpartMC->Y() ;
1766 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel3);
1767 if (lambdaCpartMC) {
1768 ptCandByMC = lambdaCpartMC->Pt();
1769 yCandByMC = lambdaCpartMC->Y() ;
1773 Int_t pdgCand4 = 313; // K*(892)+ -> pi+ K0S
1774 Int_t pdgCand5 = 325; // K*(1430)+ -> pi+ K0S
1775 Int_t pdgDgCand4[2]={211,310};
1776 Int_t pdgDgCand5[2]={211,310};
1777 pdgDgV0toDaughters[0]=211;
1778 pdgDgV0toDaughters[1]=211;
1779 mcLabel4 = part->MatchToMC(pdgCand4,pdgDgCand4[1],pdgDgCand4,pdgDgV0toDaughters,mcArray,kTRUE);
1780 mcLabel5 = part->MatchToMC(pdgCand5,pdgDgCand5[1],pdgDgCand5,pdgDgV0toDaughters,mcArray,kTRUE);
1783 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel4);
1784 if (lambdaCpartMC) {
1785 ptCandByMC = lambdaCpartMC->Pt();
1786 yCandByMC = lambdaCpartMC->Y() ;
1791 AliAODMCParticle *lambdaCpartMC = (AliAODMCParticle*)mcArray->At(mcLabel5);
1792 if (lambdaCpartMC) {
1793 ptCandByMC = lambdaCpartMC->Pt();
1794 yCandByMC = lambdaCpartMC->Y() ;
1799 Int_t isLcByMC = isLc+isLc2LBarpi*2+isLc2Lpi*4+isDp2K0Spi*8+isDs2K0SK*16+isKstar12K0Spi*32+isKstar22K0Spi*64;
1801 Bool_t isMCparticleInFiducialAcceptance = kTRUE;
1802 if (isLc || isLc2LBarpi || isLc2Lpi || isDp2K0Spi || isDs2K0SK || isKstar12K0Spi || isKstar22K0Spi) {
1803 isMCparticleInFiducialAcceptance = cutsAnal->IsInFiducialAcceptance(ptCandByMC,yCandByMC);
1808 Int_t isLambdaBar = 0;
1811 Int_t pdgDg2prong[2] = {211, 211};
1812 Int_t labelK0S = v0part->MatchToMC(310,mcArray,2,pdgDg2prong);
1813 if (labelK0S>=0) isK0S = 1;
1815 pdgDg2prong[0] = 211;
1816 pdgDg2prong[1] = 2212;
1817 Int_t lambdaLabel = v0part->MatchToMC(3122,mcArray,2,pdgDg2prong);
1818 if (lambdaLabel>=0) {
1819 AliAODMCParticle *lambdaTrack = (AliAODMCParticle*)mcArray->At(lambdaLabel);
1820 if (lambdaTrack->GetPdgCode()==3122) isLambda = 1;
1821 else if (lambdaTrack->GetPdgCode()==-3122) isLambdaBar = 1;
1824 pdgDg2prong[0] = 11;
1825 pdgDg2prong[1] = 11;
1826 Int_t gammaLabel = v0part->MatchToMC(22,mcArray,2,pdgDg2prong);
1827 if (gammaLabel>=0) {
1828 AliAODMCParticle *gammaTrack = (AliAODMCParticle*)mcArray->At(gammaLabel);
1829 if (gammaTrack->GetPdgCode()==22) isGamma = 1;
1833 Int_t isV0ByMC = isK0S+isLambdaBar*2+isLambda*4+isGamma*8;
1835 Int_t isBachelorSelected = (bachelor->TestFilterMask(BIT(4)))*1 + (!(bachelor->TestFilterMask(BIT(4))))*2;
1836 isBachelorSelected += (bachelor->GetLabel()<0)*4 + (bachelor->GetLabel()>=0)*8;
1837 if ( ( !(bachelor->HasPointOnITSLayer(0)) && !(bachelor->HasPointOnITSLayer(1)) ) )
1838 isBachelorSelected += 16;
1840 if ( bachelor->HasPointOnITSLayer(0) && !(bachelor->HasPointOnITSLayer(1)) )
1841 isBachelorSelected += 32;
1842 else if ( !(bachelor->HasPointOnITSLayer(0)) && bachelor->HasPointOnITSLayer(1) )
1843 isBachelorSelected += 64;
1845 isBachelorSelected += 128;
1848 AliAODTrack *v0pos = (AliAODTrack*)part->Getv0PositiveTrack();
1849 AliAODTrack *v0neg = (AliAODTrack*)part->Getv0NegativeTrack();
1851 Int_t areV0daughtersSelected = (v0pos->TestFilterMask(BIT(4)))*1 + (!(v0pos->TestFilterMask(BIT(4))))*2;
1852 areV0daughtersSelected += (v0pos->GetLabel()<0)*4 + (v0pos->GetLabel()>=0)*8;
1853 areV0daughtersSelected += (v0neg->TestFilterMask(BIT(4)))*16 + (!(v0neg->TestFilterMask(BIT(4))))*32;
1854 areV0daughtersSelected += (v0neg->GetLabel()<0)*64 + (v0neg->GetLabel()>=0)*128;
1856 Double_t nSigmaITSpr=-999.;
1857 cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,4,nSigmaITSpr);
1858 Double_t nSigmaTPCpr=-999.;
1859 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,4,nSigmaTPCpr);
1860 Double_t nSigmaTOFpr=-999.;
1861 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,4,nSigmaTOFpr);
1863 Double_t nSigmaITSpi=-999.;
1864 cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,2,nSigmaITSpi);
1865 Double_t nSigmaTPCpi=-999.;
1866 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,2,nSigmaTPCpi);
1867 Double_t nSigmaTOFpi=-999.;
1868 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,2,nSigmaTOFpi);
1870 Double_t nSigmaITSka=-999.;
1871 cutsAnal->GetPidHF()->GetnSigmaITS(bachelor,3,nSigmaITSka);
1872 Double_t nSigmaTPCka=-999.;
1873 cutsAnal->GetPidHF()->GetnSigmaTPC(bachelor,3,nSigmaTPCka);
1874 Double_t nSigmaTOFka=-999.;
1875 cutsAnal->GetPidHF()->GetnSigmaTOF(bachelor,3,nSigmaTOFka);
1878 Int_t flagToCheckCandidate = 1*(TMath::Abs(invmassK0S-mk0sPDG)<=0.050);
1879 flagToCheckCandidate+=2*((TMath::Abs(invmassLambdaBar-mLPDG)<=0.050) && (bachelor->Charge()==-1));
1880 flagToCheckCandidate+=4*((TMath::Abs(invmassLambda-mLPDG)<=0.050) && (bachelor->Charge()==+1));
1881 flagToCheckCandidate+=8*((TMath::Abs(invmassLambdaBar-mLPDG)<=0.050) && (bachelor->Charge()==+1));
1882 flagToCheckCandidate+=16*((TMath::Abs(invmassLambda-mLPDG)<=0.050) && (bachelor->Charge()==-1));
1885 Bool_t areCutsUsingPID = cutsAnal->GetIsUsePID();
1886 cutsAnal->SetUsePID(kFALSE);
1887 Int_t aaa = cutsAnal->IsSelected(part,AliRDHFCuts::kCandidate);
1888 if ( (aaa&AliRDHFCutsLctoV0::kLcToK0Spr)==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1889 if ( aaa==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1890 flagToCheckCandidate = aaa; // Lc->K0S+p OK
1892 if ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi ) {
1893 if (bachelor->Charge()==+1)
1894 flagToCheckCandidate = aaa; // Lc->Lambda+pi+
1895 else if (bachelor->Charge()==-1)
1896 flagToCheckCandidate =-aaa; // Lambda+pi- AS Lc->K0S+p candidate
1898 if ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi ) {
1899 if (bachelor->Charge()==-1)
1900 flagToCheckCandidate = aaa; // Lc->LambdaBar+pi-
1901 else if (bachelor->Charge()==+1)
1902 flagToCheckCandidate =-aaa; // LambdaBar+pi+ AS Lc->K0S+p candidate
1906 //if ( aaa==AliRDHFCutsLctoV0::kLcToK0Spr ) {
1907 //flagToCheckCandidate = -10-(AliRDHFCutsLctoV0::kLcToK0Spr); // NEVER
1909 if ( (aaa&AliRDHFCutsLctoV0::kLcToLpi)==AliRDHFCutsLctoV0::kLcToLpi ) {
1910 if (bachelor->Charge()==+1)
1911 flagToCheckCandidate = aaa; // Lc->Lambda+pi+ OK
1912 else if (bachelor->Charge()==-1)
1913 flagToCheckCandidate =-aaa; // Lambda+pi- AS Lc->Lambda+pi+ candidate
1915 if ( (aaa&AliRDHFCutsLctoV0::kLcToLBarpi)==AliRDHFCutsLctoV0::kLcToLBarpi ) {
1916 if (bachelor->Charge()==-1)
1917 flagToCheckCandidate = aaa; // Lc->LambdaBar+pi- OK
1918 else if (bachelor->Charge()==+1)
1919 flagToCheckCandidate =-aaa; // LambdaBar+pi+ AS Lc->LambdaBar+pi- candidate
1923 cutsAnal->SetUsePID(areCutsUsingPID);
1926 fCandidateVariables[ 0] = fUseMCInfo+isLcByMC; // 0: real data; 1: bkg; 2: Lc->K0S+p; 3: Lc->LambdaBar+pbar; 5: Lc->Lambda+p; 9: D+->K0S+pi; 17: Ds+->K0S+K; 33: K*+->K0S+pi; 65: K*+->K0S+K
1927 fCandidateVariables[ 1] = fUseMCInfo+isV0ByMC; // 0: real data; 1: bkg; 2: K0S->pi+pi; 3: LambdaBar->pbar+pi+; 5: Lambda->p+pi-
1928 fCandidateVariables[ 2] = isBachelorSelected;
1929 fCandidateVariables[ 3] = areV0daughtersSelected;
1930 fCandidateVariables[ 4] = flagToCheckCandidate;
1931 fCandidateVariables[ 5] = invmassLc;
1932 fCandidateVariables[ 6] = invmassLc2Lpi;
1933 fCandidateVariables[ 7] = part->InvMass2Prongs(0,1,211,310); // D+ -> pi+ K0S
1934 fCandidateVariables[ 8] = part->InvMass2Prongs(0,1,321,310); // D+S -> K+ K0S
1935 fCandidateVariables[ 9] = invmassK0S;
1936 fCandidateVariables[10] = invmassLambda;
1937 fCandidateVariables[11] = invmassLambdaBar;
1938 fCandidateVariables[12] = v0part->InvMass2Prongs(0,1,11,11);
1939 fCandidateVariables[13] = part->GetDCA();
1940 fCandidateVariables[14] = dcaV0ptp;
1941 fCandidateVariables[15] = part->Getd0Prong(0);
1942 fCandidateVariables[16] = part->Getd0Prong(1);
1943 fCandidateVariables[17] = v0part->Getd0Prong(0);
1944 fCandidateVariables[18] = v0part->Getd0Prong(1);
1945 fCandidateVariables[19] = part->CosPointingAngle();
1946 fCandidateVariables[20] = part->CosV0PointingAngle();
1947 fCandidateVariables[21] = v0part->RadiusSecVtx();
1948 fCandidateVariables[22] = nSigmaITSpr;
1949 fCandidateVariables[23] = nSigmaITSpi;
1950 fCandidateVariables[24] = nSigmaITSka;
1951 fCandidateVariables[25] = nSigmaTPCpr;
1952 fCandidateVariables[26] = nSigmaTPCpi;
1953 fCandidateVariables[27] = nSigmaTPCka;
1954 fCandidateVariables[28] = nSigmaTOFpr;
1955 fCandidateVariables[29] = nSigmaTOFpi;
1956 fCandidateVariables[30] = nSigmaTOFka;
1957 fCandidateVariables[31] = part->Y(4122);
1958 fCandidateVariables[32] = bachelor->Eta();
1959 fCandidateVariables[33] = v0pos->Eta();
1960 fCandidateVariables[34] = v0neg->Eta();
1961 fCandidateVariables[35] = part->P();
1962 fCandidateVariables[36] = part->Pt();
1963 fCandidateVariables[37] = v0part->P();
1964 fCandidateVariables[38] = v0part->Pt();
1965 fCandidateVariables[39] = bachelor->P();
1966 fCandidateVariables[40] = bachelor->Pt();
1967 fCandidateVariables[41] = v0pos->P();
1968 fCandidateVariables[42] = v0pos->Pt();
1969 fCandidateVariables[43] = v0neg->P();
1970 fCandidateVariables[44] = v0neg->Pt();
1971 fCandidateVariables[45] = part->DecayLength();
1972 fCandidateVariables[46] = part->DecayLengthV0();
1973 fCandidateVariables[47] = part->CosPointingAngleXY();
1974 fCandidateVariables[48] = part->CosV0PointingAngleXY();
1975 fCandidateVariables[49] = part->DecayLengthXY();
1976 fCandidateVariables[50] = part->DecayLengthXYV0();
1977 fCandidateVariables[51] = part->NormalizedDecayLength();
1978 fCandidateVariables[52] = part->NormalizedV0DecayLength();
1979 fCandidateVariables[53] = part->NormalizedDecayLengthXY();
1980 fCandidateVariables[54] = part->NormalizedV0DecayLengthXY();
1981 Double_t xVtxLc=0, yVtxLc=0, zVtxLc=0;
1982 Double_t xLcMC=0,yLcMC=0,zLcMC=0;
1983 Double_t pxVtxBachelor=0, pyVtxBachelor=0, pzVtxBachelor=0;
1984 Double_t dcaForLc = PropagateToDCA(v0part,bachelor,fBzkG, xVtxLc, yVtxLc, zVtxLc, pxVtxBachelor, pyVtxBachelor, pzVtxBachelor);
1986 Int_t pdgCand0 = 4122;
1987 Int_t pdgDgLctoV0bachelor0[2]={2212,310};
1988 Int_t pdgDgV0toDaughters0[2]={211,211};
1989 Int_t mcLabel0 = part->MatchToMC(pdgCand0,pdgDgLctoV0bachelor0[1],pdgDgLctoV0bachelor0,pdgDgV0toDaughters0,mcArray,kTRUE);
1990 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel0));
1992 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
1994 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
1997 } else if (isLc2LBarpi || isLc2Lpi) {
1998 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel));
1999 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2000 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2001 } else if (isDp2K0Spi) {
2002 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel2));
2003 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2004 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2005 } else if (isDs2K0SK) {
2006 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel3));
2007 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2008 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2009 } else if (isKstar12K0Spi) {
2010 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel4));
2011 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2012 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2013 } else if (isKstar22K0Spi) {
2014 AliAODMCParticle *partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(mcLabel5));
2015 AliAODMCParticle *partLcDaug0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(partLc->GetDaughter(0)));
2016 xLcMC=partLcDaug0->Xv(), yLcMC=partLcDaug0->Yv(), zLcMC=partLcDaug0->Zv();
2018 fCandidateVariables[55]=dcaForLc;
2019 fCandidateVariables[56]=part->GetSecVtxX();
2020 fCandidateVariables[57]=part->GetSecVtxY();
2021 fCandidateVariables[58]=part->GetSecVtxZ();
2022 fCandidateVariables[59]=xVtxLc;
2023 fCandidateVariables[60]=yVtxLc;
2024 fCandidateVariables[61]=zVtxLc;
2025 fCandidateVariables[62]=xLcMC;
2026 fCandidateVariables[63]=yLcMC;
2027 fCandidateVariables[64]=zLcMC;
2028 fCandidateVariables[65]=bachelor->Px();
2029 fCandidateVariables[66]=bachelor->Py();
2030 fCandidateVariables[67]=pxVtxBachelor;
2031 fCandidateVariables[68]=pyVtxBachelor;
2032 fCandidateVariables[69]=v0part->Px();
2033 fCandidateVariables[70]=v0part->Py();
2034 fCandidateVariables[71]=fVtx1->GetX();
2035 fCandidateVariables[72]=fVtx1->GetY();
2036 fCandidateVariables[73]=fVtx1->GetZ();
2037 fCandidateVariables[74]=part->CosThetaStar(0,4122,2212,310);
2038 fCandidateVariables[75]=part->CosThetaStar(1,4122,2212,310);
2039 fCandidateVariables[76]=v0part->Eta();
2040 fCandidateVariables[77]=v0part->Y(310);
2041 fCandidateVariables[78]=pzVtxBachelor;
2042 fCandidateVariables[79]=v0part->Pz();
2043 fCandidateVariables[80]=bachelor->Charge();
2044 fCandidateVariables[81]=isMCparticleInFiducialAcceptance;
2046 fCandidateVariables[82]=0;
2047 if (bachelor->GetLabel()!=-1) {
2048 AliAODMCParticle *partBachelor = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(bachelor->GetLabel())));
2049 if(partBachelor) fCandidateVariables[82]=partBachelor->GetPdgCode();
2052 fCandidateVariables[82]=-1;
2054 fCandidateVariables[83] = part->InvMass2Prongs(0,1,211,310); // Kstar( 892)+ -> pi+K0S
2055 fCandidateVariables[84] = part->InvMass2Prongs(0,1,321,310); // Kstar(1430)+ -> pi+K0S
2057 fCandidateVariables[85]=0;
2058 fCandidateVariables[86]=0;
2059 fCandidateVariables[87]=0;
2060 fCandidateVariables[88]=0;
2062 if (v0pos->GetLabel()!=-1 &&
2063 v0neg->GetLabel()!=-1) {
2065 Int_t dgLabels[ndg]={TMath::Abs(v0pos->GetLabel()),
2066 TMath::Abs(v0neg->GetLabel())};
2069 Int_t absLabelMother=-1;
2071 fCandidateVariables[88]=SearchForCommonMother(mcArray,
2072 dgLabels,ndg,ndgCk,pdgDg,absLabelMother,nDauCand);
2074 if (bachelor->GetLabel()!=-1 &&
2075 v0pos->GetLabel()!=-1 &&
2076 v0neg->GetLabel()!=-1) {
2078 Int_t dgLabels[ndg]={TMath::Abs(bachelor->GetLabel()),
2079 TMath::Abs(v0pos->GetLabel()),
2080 TMath::Abs(v0neg->GetLabel())};
2083 Int_t absLabelMother=-1;
2085 fCandidateVariables[85]=SearchForCommonMother(mcArray,
2086 dgLabels,ndg,ndgCk,pdgDg,absLabelMother,nDauCand);
2087 AliAODMCParticle *part1 = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(v0pos->GetLabel())));
2088 AliAODMCParticle *part2 = dynamic_cast<AliAODMCParticle*>(mcArray->At(TMath::Abs(v0neg->GetLabel())));
2089 if(part1) fCandidateVariables[86]=part1->GetPdgCode();
2090 if(part2) fCandidateVariables[87]=part2->GetPdgCode();
2094 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
2095 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
2096 AliPIDResponse *pidResponse=inputHandler->GetPIDResponse();
2097 fCandidateVariables[89]=pidResponse->GetTOFResponse().GetStartTimeMask(bachelor->P());
2099 //fCandidateVariables[65] = bachelor->Px();
2100 //fCandidateVariables[66] = bachelor->Py();
2101 //fCandidateVariables[67] = bachelor->Pz();
2102 //fCandidateVariables[68] = v0pos->Px();
2103 //fCandidateVariables[69] = v0pos->Py();
2104 //fCandidateVariables[70] = v0pos->Pz();
2105 //fCandidateVariables[71] = v0neg->Px();
2106 //fCandidateVariables[72] = v0neg->Py();
2107 //fCandidateVariables[73] = v0neg->Pz();
2108 //fCandidateVariables[74] = part->PxProng(0);
2109 //fCandidateVariables[75] = part->PyProng(0);
2110 //fCandidateVariables[76] = part->PzProng(0);
2111 //fCandidateVariables[77] = part->PxProng(1);
2112 //fCandidateVariables[78] = part->PyProng(1);
2113 //fCandidateVariables[79] = part->PzProng(1);
2114 //fCandidateVariables[80] = v0part->PxProng(0);
2115 //fCandidateVariables[81] = v0part->PyProng(0);
2116 //fCandidateVariables[82] = v0part->PzProng(0);
2117 //fCandidateVariables[83] = v0part->PxProng(1);
2118 //fCandidateVariables[84] = v0part->PyProng(1);
2119 //fCandidateVariables[85] = v0part->PzProng(1);
2120 //fCandidateVariables[86] = part->QtProng(0);
2121 //fCandidateVariables[87] = part->Alpha();
2123 fVariablesTree->Fill();
2128 //-------------------------------------------------------------------------------
2129 void AliAnalysisTaskSELc2V0bachelor::DefineTreeVariables() {
2131 // This is to define tree variables
2134 const char* nameoutput = GetOutputSlot(4)->GetContainer()->GetName();
2135 fVariablesTree = new TTree(nameoutput,"Candidates variables tree");
2137 fCandidateVariables = new Float_t [nVar];
2138 TString * fCandidateVariableNames = new TString[nVar];
2139 fCandidateVariableNames[ 0]="isLcByMC";
2140 fCandidateVariableNames[ 1]="isV0ByMC";
2141 fCandidateVariableNames[ 2]="flagToCheckBachelor";
2142 fCandidateVariableNames[ 3]="flagToCheckV0daughters";
2143 fCandidateVariableNames[ 4]="flagToCheckCandidate";
2144 fCandidateVariableNames[ 5]="massLc2K0Sp";
2145 fCandidateVariableNames[ 6]="massLc2Lambdapi";
2146 fCandidateVariableNames[ 7]="massD2K0Spi"; // D+ -> pi+ K0S
2147 fCandidateVariableNames[ 8]="massDS2K0SK"; // D+S -> K+ K0S
2148 fCandidateVariableNames[ 9]="massK0S";
2149 fCandidateVariableNames[10]="massLambda";
2150 fCandidateVariableNames[11]="massLambdaBar";
2151 fCandidateVariableNames[12]="massGamma";
2152 fCandidateVariableNames[13]="dcaLcptp"; // DCA Lc prong-to-prong
2153 fCandidateVariableNames[14]="dcaV0ptp";
2154 fCandidateVariableNames[15]="tImpParBach";
2155 fCandidateVariableNames[16]="tImpParV0";
2156 fCandidateVariableNames[17]="dcaV0postoPV";
2157 fCandidateVariableNames[18]="dcaV0negtoPV";
2158 fCandidateVariableNames[19]="cosPALc";
2159 fCandidateVariableNames[20]="cosPAK0S";
2160 fCandidateVariableNames[21]="rhoV0";
2161 fCandidateVariableNames[22]="nSigmaITSpr";
2162 fCandidateVariableNames[23]="nSigmaITSpi";
2163 fCandidateVariableNames[24]="nSigmaITSka";
2164 fCandidateVariableNames[25]="nSigmaTPCpr";
2165 fCandidateVariableNames[26]="nSigmaTPCpi";
2166 fCandidateVariableNames[27]="nSigmaTPCka";
2167 fCandidateVariableNames[28]="nSigmaTOFpr";
2168 fCandidateVariableNames[29]="nSigmaTOFpi";
2169 fCandidateVariableNames[30]="nSigmaTOFka";
2170 fCandidateVariableNames[31]="yLc";
2171 fCandidateVariableNames[32]="etaBach"; // etaBachelor
2172 fCandidateVariableNames[33]="etaV0pos"; // etaV0pos
2173 fCandidateVariableNames[34]="etaV0neg"; // etaV0neg
2174 fCandidateVariableNames[35]="LcP"; // @ DCA
2175 fCandidateVariableNames[36]="LcPt"; // @ DCA
2176 fCandidateVariableNames[37]="v0P"; // @ V0 DCA
2177 fCandidateVariableNames[38]="v0Pt"; // @ V0 DCA
2178 fCandidateVariableNames[39]="bachelorP"; // @ prim vtx
2179 fCandidateVariableNames[40]="bachelorPt"; // @ prim vtx
2180 fCandidateVariableNames[41]="V0positiveP"; // @ prim vtx
2181 fCandidateVariableNames[42]="V0positivePt"; // @ prim vtx
2182 fCandidateVariableNames[43]="V0negativeP"; // @ prim vtx
2183 fCandidateVariableNames[44]="V0negativePt"; // @ prim vtx
2184 fCandidateVariableNames[45]="decayLengthLc";
2185 fCandidateVariableNames[46]="decayLengthV0";
2186 fCandidateVariableNames[47]="cosPALcXY"; // cosPA XY x Lc
2187 fCandidateVariableNames[48]="cosPAV0XY"; // cosPA XY x V0
2188 fCandidateVariableNames[49]="decayLengthLcXY"; // decay length XY x Lc
2189 fCandidateVariableNames[50]="decayLengthV0XY"; // decay length XY x V0
2190 fCandidateVariableNames[51]="normalizedDecayLengthLc"; // normalized decay length x Lc
2191 fCandidateVariableNames[52]="normalizedDecayLengthV0"; // normalized decay length x V0
2192 fCandidateVariableNames[53]="normalizedDecayLengthXYLc"; // normalized decay length XY x Lc
2193 fCandidateVariableNames[54]="normalizedDecayLengthXYV0"; // normalized decay length XY x V0
2194 fCandidateVariableNames[55]="newLcDCA";
2195 fCandidateVariableNames[56]="xVtxLcBad";
2196 fCandidateVariableNames[57]="yVtxLcBad";
2197 fCandidateVariableNames[58]="zVtxLcBad";
2198 fCandidateVariableNames[59]="xVtxLcGood";
2199 fCandidateVariableNames[60]="yVtxLcGood";
2200 fCandidateVariableNames[61]="zVtxLcGood";
2201 fCandidateVariableNames[62]="xVtxLcMC";
2202 fCandidateVariableNames[63]="yVtxLcMC";
2203 fCandidateVariableNames[64]="zVtxLcMC";
2204 fCandidateVariableNames[65]="pxVtxBachelorBad";
2205 fCandidateVariableNames[66]="pyVtxBachelorBad";
2206 fCandidateVariableNames[67]="pxVtxBachelorGood";
2207 fCandidateVariableNames[68]="pyVtxBachelorGood";
2208 fCandidateVariableNames[69]="pxVtxV0";
2209 fCandidateVariableNames[70]="pyVtxV0";
2210 fCandidateVariableNames[71]="xPvtx";
2211 fCandidateVariableNames[72]="yPvtx";
2212 fCandidateVariableNames[73]="zPvtx";
2213 fCandidateVariableNames[74]="cosThetaStarBachelor";
2214 fCandidateVariableNames[75]="cosThetaStarV0";
2215 fCandidateVariableNames[76]="etaV0";
2216 fCandidateVariableNames[77]="yV0";
2217 fCandidateVariableNames[78]="pzVtxBachelorGood";
2218 fCandidateVariableNames[79]="pzVtxV0";
2219 fCandidateVariableNames[80]="bachelorCharge";
2220 fCandidateVariableNames[81]="isMCparticleInFiducialAcceptance";
2221 fCandidateVariableNames[82]="pdgBachelor"; // pdg MC bachelor
2222 fCandidateVariableNames[83]="massKstar12K0Spi"; // Kstar( 892)+ -> pi+ K0S
2223 fCandidateVariableNames[84]="massKstar22K0Spi"; // Kstar(1430)+ -> pi+ K0S
2224 fCandidateVariableNames[85]="pdgCandidate"; // pdg MC candidate recovered via new method
2225 fCandidateVariableNames[86]="pdgV0pos"; // pdg MC V0 positive
2226 fCandidateVariableNames[87]="pdgV0neg"; // pdg MC V0 negative
2227 fCandidateVariableNames[88]="pdgV0Candidate"; // pdg MC V0candidate recovered via new method
2228 fCandidateVariableNames[89]="startTimeMask"; // start time mask
2230 //fCandidateVariableNames[65]="bachelorPx";
2231 //fCandidateVariableNames[66]="bachelorPy";
2232 //fCandidateVariableNames[67]="bachelorPz";
2233 //fCandidateVariableNames[68]="V0positivePx";
2234 //fCandidateVariableNames[69]="V0positivePy";
2235 //fCandidateVariableNames[70]="V0positivePz";
2236 //fCandidateVariableNames[71]="V0negativePx";
2237 //fCandidateVariableNames[72]="V0negativePy";
2238 //fCandidateVariableNames[73]="V0negativePz";
2239 //fCandidateVariableNames[74]="bachelorPxDCA";
2240 //fCandidateVariableNames[75]="bachelorPyDCA";
2241 //fCandidateVariableNames[76]="bachelorPzDCA";
2242 //fCandidateVariableNames[77]="v0PxDCA";
2243 //fCandidateVariableNames[78]="v0PyDCA";
2244 //fCandidateVariableNames[79]="v0PzDCA";
2245 //fCandidateVariableNames[80]="V0positivePxDCA";
2246 //fCandidateVariableNames[81]="V0positivePyDCA";
2247 //fCandidateVariableNames[82]="V0positivePzDCA";
2248 //fCandidateVariableNames[83]="V0negativePxDCA";
2249 //fCandidateVariableNames[84]="V0negativePyDCA";
2250 //fCandidateVariableNames[85]="V0negativePzDCA";
2251 //fCandidateVariableNames[86]="qtLc";
2252 //fCandidateVariableNames[87]="alphaLc";
2254 for (Int_t ivar=0; ivar<nVar; ivar++) {
2255 fVariablesTree->Branch(fCandidateVariableNames[ivar].Data(),&fCandidateVariables[ivar],Form("%s/f",fCandidateVariableNames[ivar].Data()));
2261 //__________________________________________________________________________
2262 void AliAnalysisTaskSELc2V0bachelor::DefineGeneralHistograms() {
2264 // This is to define general histograms
2267 fCEvents = new TH1F("fCEvents","conter",18,0,18);
2268 fCEvents->SetStats(kTRUE);
2269 fCEvents->GetXaxis()->SetBinLabel(1,"X1");
2270 fCEvents->GetXaxis()->SetBinLabel(2,"Analyzed events");
2271 fCEvents->GetXaxis()->SetBinLabel(3,"AliAODVertex exists");
2272 fCEvents->GetXaxis()->SetBinLabel(4,"CascadesHF exists");
2273 fCEvents->GetXaxis()->SetBinLabel(5,"MCarray exists");
2274 fCEvents->GetXaxis()->SetBinLabel(6,"MCheader exists");
2275 fCEvents->GetXaxis()->SetBinLabel(7,"GetNContributors()>0");
2276 fCEvents->GetXaxis()->SetBinLabel(8,"IsEventSelected");
2277 fCEvents->GetXaxis()->SetBinLabel(9,"triggerClass!=CINT1");
2278 fCEvents->GetXaxis()->SetBinLabel(10,"triggerMask!=kAnyINT");
2279 fCEvents->GetXaxis()->SetBinLabel(11,"triggerMask!=kAny");
2280 fCEvents->GetXaxis()->SetBinLabel(12,"vtxTitle.Contains(Z)");
2281 fCEvents->GetXaxis()->SetBinLabel(13,"vtxTitle.Contains(3D)");
2282 fCEvents->GetXaxis()->SetBinLabel(14,"vtxTitle.Doesn'tContain(Z-3D)");
2283 fCEvents->GetXaxis()->SetBinLabel(15,Form("zVtx<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
2284 fCEvents->GetXaxis()->SetBinLabel(16,"!IsEventSelected");
2285 fCEvents->GetXaxis()->SetBinLabel(17,"triggerMask!=kAnyINT || triggerClass!=CINT1");
2286 fCEvents->GetXaxis()->SetBinLabel(18,Form("zVtxMC<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
2287 //fCEvents->GetXaxis()->SetTitle("");
2288 fCEvents->GetYaxis()->SetTitle("counts");
2290 fOutput->Add(fCEvents);
2291 TString fillthis="";
2293 if (fUseMCInfo && fAdditionalChecks) {
2294 fillthis="histMcStatLc";
2295 TH1F* mcStatisticLc = new TH1F(fillthis.Data(),"#Lambda_{c} generated and their decays",21,-10.5,10.5);
2296 fOutput->Add(mcStatisticLc);
2299 //fillthis="histopionV0SigmaVspTOF";
2300 //TH2F *hpionV0SigmaVspTOF=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2301 fillthis="histoprotonBachSigmaVspTOF";
2302 TH2F *hprotonBachSigmaVspTOF=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2304 //fOutput->Add(hpionV0SigmaVspTOF);
2305 fOutput->Add(hprotonBachSigmaVspTOF);
2307 //fillthis="histopionV0SigmaVspTPC";
2308 //TH2F *hpionV0SigmaVspTPC=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2309 fillthis="histoprotonBachSigmaVspTPC";
2310 TH2F *hprotonBachSigmaVspTPC=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2312 //fOutput->Add(hpionV0SigmaVspTPC);
2313 fOutput->Add(hprotonBachSigmaVspTPC);
2317 //fillthis="histopionV0SigmaVspTOFsgn";
2318 //TH2F *hpionV0SigmaVspTOFsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2319 fillthis="histoprotonBachSigmaVspTOFsgn";
2320 TH2F *hprotonBachSigmaVspTOFsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2322 //fOutput->Add(hpionV0SigmaVspTOFsgn);
2323 fOutput->Add(hprotonBachSigmaVspTOFsgn);
2325 //fillthis="histopionV0SigmaVspTPCsgn";
2326 //TH2F *hpionV0SigmaVspTPCsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2327 fillthis="histoprotonBachSigmaVspTPCsgn";
2328 TH2F *hprotonBachSigmaVspTPCsgn=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2330 //fOutput->Add(hpionV0SigmaVspTPCsgn);
2331 fOutput->Add(hprotonBachSigmaVspTPCsgn);
2334 //fillthis="histopionV0SigmaVspTOFbkg";
2335 //TH2F *hpionV0SigmaVspTOFbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2336 fillthis="histoprotonBachSigmaVspTOFbkg";
2337 TH2F *hprotonBachSigmaVspTOFbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2339 //fOutput->Add(hpionV0SigmaVspTOFbkg);
2340 fOutput->Add(hprotonBachSigmaVspTOFbkg);
2342 //fillthis="histopionV0SigmaVspTPCbkg";
2343 //TH2F *hpionV0SigmaVspTPCbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2344 fillthis="histoprotonBachSigmaVspTPCbkg";
2345 TH2F *hprotonBachSigmaVspTPCbkg=new TH2F(fillthis.Data(),fillthis.Data(),300,0.,30.,100,-5.,5.);
2347 //fOutput->Add(hpionV0SigmaVspTPCbkg);
2348 fOutput->Add(hprotonBachSigmaVspTPCbkg);
2352 if (fAdditionalChecks) {
2354 TH1F *hZ2 = new TH1F("hZ2","",100,-50.,50.);
2356 TH1F *hZ3 = new TH1F("hZ3","",100,-50.,50.);
2358 TH1F *hZ4 = new TH1F("hZ4","",100,-50.,50.);
2360 TH1F *hZ5 = new TH1F("hZ5","",100,-50.,50.);
2362 TH1F *hZ6 = new TH1F("hZ6","",100,-50.,50.);
2364 TH1F *hZ7 = new TH1F("hZ7","",100,-50.,50.);
2366 TH1F *hZ8 = new TH1F("hZ8","",100,-50.,50.);
2368 TH1F *hZ9 = new TH1F("hZ9","",100,-50.,50.);
2370 TH1F *hZ10 = new TH1F("hZ10","",100,-50.,50.);
2372 TH1F *hZ11 = new TH1F("hZ11","",100,-50.,50.);
2374 TH1F *hZ12 = new TH1F("hZ12","",100,-50.,50.);
2376 TH1F *hZ13 = new TH1F("hZ13","",100,-50.,50.);
2378 TH1F *hZ14 = new TH1F("hZ14","",100,-50.,50.);
2380 TH1F *hZ15 = new TH1F("hZ15","",100,-50.,50.);
2382 TH1F *hZ16 = new TH1F("hZ16","",100,-50.,50.);
2386 TH1F *hCandidateSelection = new TH1F("hCandidateSelection","",10,-0.5,9.5);
2387 hCandidateSelection->GetXaxis()->SetBinLabel(1,"IsEventSelected");
2388 hCandidateSelection->GetXaxis()->SetBinLabel(2,"IsSecondaryVtx");
2389 hCandidateSelection->GetXaxis()->SetBinLabel(3,"V0toPosNeg");
2390 hCandidateSelection->GetXaxis()->SetBinLabel(4,"offlineV0");
2391 hCandidateSelection->GetXaxis()->SetBinLabel(5,"isInFiducialAcceptance");
2392 hCandidateSelection->GetXaxis()->SetBinLabel(6,"analCuts::kTracks");
2393 hCandidateSelection->GetXaxis()->SetBinLabel(7,"analCuts::kCandidateNoPID");
2394 hCandidateSelection->GetXaxis()->SetBinLabel(8,"analCuts::kPID");
2395 hCandidateSelection->GetXaxis()->SetBinLabel(9,"analCuts::kCandidateWithPID");
2396 hCandidateSelection->GetXaxis()->SetBinLabel(10,"analCuts::kAll");
2397 fOutput->Add(hCandidateSelection);
2399 TH1F *hEventsWithCandidates = new TH1F("hEventsWithCandidates","conter",11,5.5,16.5);
2400 hEventsWithCandidates->GetXaxis()->SetBinLabel(1,"GetNContributors()>0");
2401 hEventsWithCandidates->GetXaxis()->SetBinLabel(2,"IsEventSelected");
2402 hEventsWithCandidates->GetXaxis()->SetBinLabel(3,"triggerClass!=CINT1");
2403 hEventsWithCandidates->GetXaxis()->SetBinLabel(4,"triggerMask!=kAnyINT");
2404 hEventsWithCandidates->GetXaxis()->SetBinLabel(5,"triggerMask!=kAny");
2405 hEventsWithCandidates->GetXaxis()->SetBinLabel(6,"vtxTitle.Contains(Z)");
2406 hEventsWithCandidates->GetXaxis()->SetBinLabel(7,"vtxTitle.Contains(3D)");
2407 hEventsWithCandidates->GetXaxis()->SetBinLabel(8,"vtxTitle.Doesn'tContain(Z-3D)");
2408 hEventsWithCandidates->GetXaxis()->SetBinLabel(9,Form("zVtx<=%2.0fcm",fAnalCuts->GetMaxVtxZ()));
2409 hEventsWithCandidates->GetXaxis()->SetBinLabel(10,"!IsEventSelected");
2410 hEventsWithCandidates->GetXaxis()->SetBinLabel(11,"triggerMask!=kAnyINT || triggerClass!=CINT1");
2411 fOutput->Add(hEventsWithCandidates);
2413 if (fAdditionalChecks) {
2415 TH1F *hZ6a = new TH1F("hZ6a","",100,-50.,50.);
2417 TH1F *hZ7a = new TH1F("hZ7a","",100,-50.,50.);
2419 TH1F *hZ8a = new TH1F("hZ8a","",100,-50.,50.);
2421 TH1F *hZ9a = new TH1F("hZ9a","",100,-50.,50.);
2423 TH1F *hZ10a = new TH1F("hZ10a","",100,-50.,50.);
2424 fOutput->Add(hZ10a);
2425 TH1F *hZ11a = new TH1F("hZ11a","",100,-50.,50.);
2426 fOutput->Add(hZ11a);
2427 TH1F *hZ12a = new TH1F("hZ12a","",100,-50.,50.);
2428 fOutput->Add(hZ12a);
2429 TH1F *hZ13a = new TH1F("hZ13a","",100,-50.,50.);
2430 fOutput->Add(hZ13a);
2431 TH1F *hZ14a = new TH1F("hZ14a","",100,-50.,50.);
2432 fOutput->Add(hZ14a);
2433 TH1F *hZ15a = new TH1F("hZ15a","",100,-50.,50.);
2434 fOutput->Add(hZ15a);
2435 TH1F *hZ16a = new TH1F("hZ16a","",100,-50.,50.);
2436 fOutput->Add(hZ16a);
2439 TH1F *hSwitchOnCandidates1 = new TH1F("hSwitchOnCandidates1","",15,-7.5,7.5);
2440 fOutput->Add(hSwitchOnCandidates1);
2441 TH1F *hSwitchOnCandidates2 = new TH1F("hSwitchOnCandidates2","",15,-7.5,7.5);
2442 fOutput->Add(hSwitchOnCandidates2);
2443 TH1F *hSwitchOnCandidates3 = new TH1F("hSwitchOnCandidates3","",15,-7.5,7.5);
2444 fOutput->Add(hSwitchOnCandidates3);
2445 TH1F *hSwitchOnCandidates4 = new TH1F("hSwitchOnCandidates4","",15,-7.5,7.5);
2446 fOutput->Add(hSwitchOnCandidates4);
2451 //________________________________________________________________________
2452 void AliAnalysisTaskSELc2V0bachelor::DefineAnalysisHistograms() {
2454 // This is to define analysis histograms
2457 if (fIsK0SAnalysis) DefineK0SHistos();// hK0S histos declarations
2462 //________________________________________________________________________
2463 void AliAnalysisTaskSELc2V0bachelor::FillAnalysisHistograms(AliAODRecoCascadeHF *part, Bool_t isBachelorID, TString appendthis) {
2465 // This is to fill analysis histograms
2468 TString fillthis="";
2470 Double_t invmassLc = part->InvMassLctoK0sP();
2471 Double_t lambdacpt = part->Pt();
2473 AliAODTrack *bachelor = (AliAODTrack*)part->GetBachelor();
2474 Double_t momBach = bachelor->P();
2476 AliAODv0 * v0part = (AliAODv0*)part->Getv0();
2477 Double_t momK0S = v0part->P();
2478 Double_t ptK0S = v0part->Pt();
2479 Double_t dcaV0ptp = v0part->GetDCA();
2480 Double_t invmassK0S = v0part->MassK0Short();
2482 fillthis="histK0SMass"+appendthis;
2483 // cout << fillthis << endl;
2484 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassK0S,ptK0S);
2485 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassK0S,ptK0S);
2487 fillthis="histpK0Svsp"+appendthis;
2488 // cout << fillthis << endl;
2489 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momBach,momK0S);
2490 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momBach,momK0S);
2492 fillthis="histDCAtoPVvspK0S"+appendthis;
2493 // cout << fillthis << endl;
2494 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(momK0S,dcaV0ptp);
2495 if (isBachelorID) ((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(momK0S,dcaV0ptp);
2497 fillthis="histArmPodK0S"+appendthis;
2498 // cout << fillthis << endl;
2499 FillArmPodDistribution(v0part,fillthis,fOutputAll);
2500 if (isBachelorID) FillArmPodDistribution(v0part,fillthis,fOutputPIDBach);
2502 fillthis="histLcMassByK0S"+appendthis;
2503 // cout << fillthis << endl;
2504 ((TH2F*)(fOutputAll->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
2505 if (isBachelorID)((TH2F*)(fOutputPIDBach->FindObject(fillthis)))->Fill(invmassLc,lambdacpt);
2509 //---------------------------
2510 Double_t AliAnalysisTaskSELc2V0bachelor::PropagateToDCA(AliAODv0 *v, AliAODTrack *bachelor, Double_t b,
2511 Double_t &xVtxLc, Double_t &yVtxLc, Double_t &zVtxLc,
2512 Double_t &pxVtxBachelor, Double_t &pyVtxBachelor, Double_t &pzVtxBachelor) {
2513 //--------------------------------------------------------------------
2514 // This function returns the DCA between the V0 and the track
2515 // This is a copy of AliCascadeVertexer::PropagateToDCA(...) method
2516 //--------------------------------------------------------------------
2518 // Get AliExternalTrackParam out of the AliAODTracks
2519 Double_t xyz[3], pxpypz[3], cv[21]; Short_t sign;
2520 bachelor->PxPyPz(pxpypz);
2521 bachelor->XvYvZv(xyz);
2522 bachelor->GetCovarianceXYZPxPyPz(cv);
2523 sign=bachelor->Charge();
2524 AliExternalTrackParam *t = new AliExternalTrackParam(xyz,pxpypz,cv,sign);
2526 Double_t alpha=t->GetAlpha(), cs1=TMath::Cos(alpha), sn1=TMath::Sin(alpha);
2527 //Double_t alpha = GetAlpha(xyz,pxpypz), cs1=TMath::Cos(alpha), sn1=TMath::Sin(alpha);
2529 // position and momentum of bachelor
2530 Double_t x1=xyz[0], y1=xyz[1], z1=xyz[2];
2531 Double_t px1=pxpypz[0], py1=pxpypz[1], pz1=pxpypz[2];
2533 // position and momentum of V0
2534 Double_t x2=v->DecayVertexV0X(),
2535 y2=v->DecayVertexV0Y(),
2536 z2=v->DecayVertexV0Z();
2537 Double_t px2=v->Px(),
2542 AliAODTrack *trackP = (AliAODTrack*) v->GetDaughter(0);
2543 //Double_t pxpypzP[3]; trackP->PxPyPz(pxpypzP);
2544 //Double_t xyzP[3]; trackP->XvYvZv(xyzP);
2545 Double_t cvP[21]; trackP->GetCovarianceXYZPxPyPz(cvP);
2546 //Short_t signP=trackP->Charge();
2547 //AliExternalTrackParam *tP = new AliExternalTrackParam(xyzP,pxpypzP,cvP,signP);
2549 // Get AliExternalTrackParam out of the AliAODTrack
2550 AliAODTrack *trackN = (AliAODTrack*) v->GetDaughter(1);
2551 //Double_t pxpypzN[3]; trackN->PxPyPz(pxpypzN);
2552 //Double_t xyzN[3]; trackN->XvYvZv(xyzN);
2553 Double_t cvN[21]; trackN->GetCovarianceXYZPxPyPz(cvN);
2554 //Short_t signN=trackN->Charge();
2555 //AliExternalTrackParam *tN = new AliExternalTrackParam(xyzN,pxpypzN,cvN,signN);
2557 Double_t xyzV0[3]={x2,y2,z2};
2558 Double_t pxpypzV0[3]={px2,py2,pz2};
2559 Double_t cvV0[21]; for (Int_t ii=0; ii<21; ii++) cvV0[ii]=cvP[ii]+cvN[ii];
2560 AliNeutralTrackParam *trackV0 = new AliNeutralTrackParam(xyzV0,pxpypzV0,cvV0,0);
2564 Double_t dd= Det(x2-x1,y2-y1,z2-z1,px1,py1,pz1,px2,py2,pz2);
2565 Double_t ax= Det(py1,pz1,py2,pz2);
2566 Double_t ay=-Det(px1,pz1,px2,pz2);
2567 Double_t az= Det(px1,py1,px2,py2);
2569 Double_t dca=TMath::Abs(dd)/TMath::Sqrt(ax*ax + ay*ay + az*az);
2571 // bachelor point @ the DCA
2572 Double_t t1 = Det(x2-x1,y2-y1,z2-z1,px2,py2,pz2,ax,ay,az)/
2573 Det(px1,py1,pz1,px2,py2,pz2,ax,ay,az);
2574 x1 += px1*t1; y1 += py1*t1; z1 += pz1*t1;
2576 //propagate track to the point of DCA
2577 Double_t rho1=x1*cs1 + y1*sn1;
2578 if (!t->PropagateTo(rho1,b)) {
2579 Error("PropagateToDCA","Propagation failed !");
2584 Double_t pBachelorDCA[3]; t->GetPxPyPz(pBachelorDCA);
2585 pxVtxBachelor=pBachelorDCA[0], pyVtxBachelor=pBachelorDCA[1], pzVtxBachelor=pBachelorDCA[2];
2589 // V0 point @ the DCA
2590 Double_t t2 = Det(x1-x2,y1-y2,z1-z2,px1,py1,pz1,ax,ay,az)/
2591 Det(px2,py2,pz2,px1,py1,pz1,ax,ay,az);
2592 x2 += px2*t2; y2 += py2*t2; z2 += pz2*t2;
2596 xVtxLc = 0.5*(x1+x2);
2597 yVtxLc = 0.5*(y1+y2);
2598 zVtxLc = 0.5*(z1+z2);
2604 //---------------------------
2605 Double_t AliAnalysisTaskSELc2V0bachelor::GetAlpha(Double_t xyz[3],Double_t pxpypz[3])
2608 // To estimate alpha according to what done in the AliExternalTrackParam::Set(...) method
2611 Double_t alpha = 0.;
2613 const double kSafe = 1e-5;
2614 Double_t radPos2 = xyz[0]*xyz[0]+xyz[1]*xyz[1];
2615 Double_t radMax = 45.; // approximately ITS outer radius
2616 if (radPos2 < radMax*radMax) { // inside the ITS
2617 alpha = TMath::ATan2(pxpypz[1],pxpypz[0]);
2618 } else { // outside the ITS
2619 Float_t phiPos = TMath::Pi()+TMath::ATan2(-xyz[1], -xyz[0]);
2621 TMath::DegToRad()*(20*((((Int_t)(phiPos*TMath::RadToDeg()))/20))+10);
2624 Double_t cs=TMath::Cos(alpha), sn=TMath::Sin(alpha);
2625 // protection: avoid alpha being too close to 0 or +-pi/2
2626 if (TMath::Abs(sn)<2*kSafe) {
2627 if (alpha>0) alpha += alpha< TMath::Pi()/2. ? 2*kSafe : -2*kSafe;
2628 else alpha += alpha>-TMath::Pi()/2. ? -2*kSafe : 2*kSafe;
2629 cs=TMath::Cos(alpha);
2630 sn=TMath::Sin(alpha);
2632 else if (TMath::Abs(cs)<2*kSafe) {
2633 if (alpha>0) alpha += alpha> TMath::Pi()/2. ? 2*kSafe : -2*kSafe;
2634 else alpha += alpha>-TMath::Pi()/2. ? 2*kSafe : -2*kSafe;
2635 cs=TMath::Cos(alpha);
2636 sn=TMath::Sin(alpha);
2643 //---------------------------
2644 Double_t AliAnalysisTaskSELc2V0bachelor::Det(Double_t a00, Double_t a01,
2645 Double_t a10, Double_t a11) const {
2646 //--------------------------------------------------------------------
2647 // This function calculates locally a 2x2 determinant.
2648 // This is a copy of the AliCascadeVertexer::Det(...) method
2649 //--------------------------------------------------------------------
2650 return a00*a11 - a01*a10;
2653 //---------------------------
2654 Double_t AliAnalysisTaskSELc2V0bachelor::Det(Double_t a00,Double_t a01,Double_t a02,
2655 Double_t a10,Double_t a11,Double_t a12,
2656 Double_t a20,Double_t a21,Double_t a22) const {
2657 //--------------------------------------------------------------------
2658 // This function calculates locally a 3x3 determinant
2659 // This is a copy of the AliCascadeVertexer::Det(...) method
2660 //--------------------------------------------------------------------
2661 return a00*Det(a11,a12,a21,a22)-a01*Det(a10,a12,a20,a22)+a02*Det(a10,a11,a20,a21);
2664 //----------------------------------------------------------------------------
2665 Int_t AliAnalysisTaskSELc2V0bachelor::MatchToMClabelC(AliAODRecoCascadeHF *candidate,
2666 TClonesArray *mcArray)
2669 // Check if this candidate is matched to a MC signal Lc -> p K0S + X
2671 // If yes, return label (>=0) of the AliAODMCParticle
2674 AliAODv0 *theV0 = dynamic_cast<AliAODv0*>(candidate->Getv0()); // the V0
2675 AliVTrack *trk = dynamic_cast<AliVTrack*>(candidate->GetBachelor()); // the bachelor
2676 if (!trk || !theV0) return -1;
2678 if (trk->GetLabel()==-1) return -1;
2679 Int_t bachLabels = TMath::Abs(trk->GetLabel());
2680 AliAODMCParticle*bachelorMC = dynamic_cast<AliAODMCParticle*>(mcArray->At(bachLabels));
2681 if (!bachelorMC) return -1;
2682 if (TMath::Abs(bachelorMC->GetPdgCode())!=2212) return -1;
2683 Int_t indexMotherBach = bachelorMC->GetMother();
2684 if (indexMotherBach==-1) return -1;
2686 Int_t pdgDg2prong[2] = {211,211};
2687 Int_t lab2Prong = theV0->MatchToMC(310,mcArray,2,pdgDg2prong); // the V0
2688 if(lab2Prong<0) return -1;
2689 AliAODMCParticle*partK0S = dynamic_cast<AliAODMCParticle*>(mcArray->At(lab2Prong));
2690 if (!partK0S) return -1;
2691 Int_t indexMotherK0S = partK0S->GetMother();
2692 if (indexMotherK0S==-1) return -1;
2693 AliAODMCParticle*partK0 = dynamic_cast<AliAODMCParticle*>(mcArray->At(indexMotherK0S));
2694 if (!partK0) return -1;
2695 Int_t indexMotherK0 = partK0->GetMother();
2696 if (indexMotherK0==-1) return -1;
2698 if (indexMotherBach!=indexMotherK0) return -1; // p e K0S sono fratelli
2700 AliAODMCParticle*partLc = dynamic_cast<AliAODMCParticle*>(mcArray->At(indexMotherK0));
2701 if (!partLc) return -1;
2702 Int_t ndg2 = partLc->GetDaughter(1)-partLc->GetDaughter(0)+1;
2703 if (ndg2==2) return -1;
2705 TString stringaCheck = Form(">>>>>>>> %d -> ",partLc->GetPdgCode());
2706 for(Int_t ii=0; ii<ndg2; ii++) {
2707 AliAODMCParticle* partDau=(AliAODMCParticle*)(mcArray->At(partLc->GetDaughter(0)+ii));
2708 stringaCheck.Append(Form(" %d",partDau->GetPdgCode()));
2710 //printf("%s \n",stringaCheck.Data());
2712 return indexMotherBach;
2715 //--------------------------------------------------------------------------
2716 Int_t AliAnalysisTaskSELc2V0bachelor::SearchForCommonMother(TClonesArray *mcArray,
2717 Int_t dgLabels[10],Int_t ndg,
2718 Int_t &ndgCk, Int_t *pdgDg, Int_t &absLabelMother, Int_t &nDauCand) const
2721 // Check if this candidate is matched to a MC signal
2723 // If yes, return pdgCode of particle
2726 Int_t lab=-1,labMother=-1,pdgMother=0;
2727 AliAODMCParticle *part=0;
2728 AliAODMCParticle *mother=0;
2730 // loop on daughter labels
2731 TArrayI **labelMother = new TArrayI*[ndg];
2732 for(Int_t i=0; i<ndg; i++) labelMother[i] = new TArrayI(0);
2733 for(Int_t i=0; i<ndg; i++) {
2734 lab = TMath::Abs(dgLabels[i]);
2736 AliDebug(2,Form("daughter with negative label %d",lab));
2739 part = (AliAODMCParticle*)mcArray->At(lab);
2741 AliDebug(2,"no MC particle");
2746 while(mother->GetMother()>=0) {
2747 labMother=mother->GetMother();
2748 mother = (AliAODMCParticle*)mcArray->At(labMother);
2750 AliDebug(2,"no MC mother particle");
2753 pdgMother = TMath::Abs(mother->GetPdgCode());
2754 if (pdgMother<10 || (pdgMother>18 && pdgMother<111)) {
2757 labelMother[i]->Set(labelMother[i]->GetSize()+1);
2758 labelMother[i]->AddAt(labMother,labelMother[i]->GetSize()-1);
2761 } // end loop on daughters
2764 TString stringaCheck;
2765 for(Int_t i=0; i<ndg; i++) {
2766 AliAODMCParticle*part0 = (AliAODMCParticle*)mcArray->At(TMath::Abs(dgLabels[i]));
2767 stringaCheck.Append(Form("part[%d]->GetLabel()=%d(%d) | ",i,dgLabels[i],part0->GetPdgCode()));
2768 stringaCheck.Append(Form("labelMother[%d] = ",i));
2769 for (Int_t jj=0;jj<labelMother[i]->GetSize(); jj++)
2770 stringaCheck.Append(Form("%d, ",labelMother[i]->At(jj)));
2772 printf("%s \n",stringaCheck.Data());
2773 Int_t pdgToBeReturned=0;
2775 TString stringaCheck2;
2777 pdgDg = new Int_t[ndgCk];
2778 for (Int_t index=1; index<ndg; index++) {
2779 Bool_t found=kFALSE;
2780 for (Int_t jj=0;jj<labelMother[index]->GetSize(); jj++) {
2781 for (Int_t ii=0;ii<labelMother[0]->GetSize(); ii++) {
2782 if (labelMother[0]->At(ii)==labelMother[index]->At(jj) &&
2783 labelMother[0]->At(ii)!=0 && labelMother[0]->At(ii)!=1 && !found) {
2784 mother = (AliAODMCParticle*)mcArray->At(labelMother[0]->At(ii));
2785 pdgToBeReturned=mother->GetPdgCode();
2786 absLabelMother=labelMother[0]->At(ii);
2787 AliDebug(2,Form("FOUND label for the mother of this candidate: %d (PDG=%d)\n",labelMother[0]->At(ii),pdgToBeReturned));
2789 nDauCand=mother->GetNDaughters();
2791 AliAODMCParticle *partMC = (AliAODMCParticle*)mcArray->At(dgLabels[0]);
2792 pdgDg[0]=partMC->GetPdgCode();
2793 partMC = (AliAODMCParticle*)mcArray->At(dgLabels[index]);
2794 pdgDg[index]=partMC->GetPdgCode();
2795 if (index==1) stringaCheck2.Append(Form("found daughters -> %d(%d)",dgLabels[0],pdgDg[0]));
2796 stringaCheck2.Append(Form(" %d(%d)",dgLabels[index],pdgDg[index]));
2803 stringaCheck2.Prepend(Form("Ecco quanto trovato: %d(%d) with %d daughters; ",absLabelMother,pdgToBeReturned,nDauCand));
2804 printf("%s \n",stringaCheck2.Data());
2806 delete [] labelMother;
2808 return pdgToBeReturned;
2812 void AliAnalysisTaskSELc2V0bachelor::TrackRotation(AliRDHFCutsLctoV0 * cuts, AliAODRecoCascadeHF *part, TString appendthis)
2815 AliAODRecoCascadeHF *partCopy = new AliAODRecoCascadeHF(*part);
2817 Double_t px[2]={partCopy->PxProng(0),partCopy->PxProng(1)};
2818 Double_t py[2]={partCopy->PyProng(0),partCopy->PyProng(1)};
2819 Double_t pz[2]={partCopy->PzProng(0),partCopy->PzProng(1)};
2821 Double_t pt = partCopy->Pt();
2823 UInt_t pdgLc2pK0S[2]={2212,310};
2824 Double_t minv2 = partCopy->InvMass2(2,pdgLc2pK0S);
2825 Double_t mass=TMath::Sqrt(minv2);
2826 Double_t rapid = partCopy->Y(pdgD);
2828 TString fillthis="hMassVsPtVsY"+appendthis;
2829 if ( ( ( (cuts->IsSelected(part,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) {
2830 ((TH3F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(mass,pt,rapid);
2834 Double_t massRot=0;// calculated later only if candidate is acceptable
2835 // Double_t angleProngXY=TMath::ACos((px[0]*px[1]+py[0]*py[1])/TMath::Sqrt((px[0]*px[0]+py[0]*py[0])*(px[1]*px[1]+py[1]*py[1])));
2836 // Double_t ptOrig=pt;
2837 Double_t rotStep=(fMaxAngleForRot-fMinAngleForRot)/(fNRotations-1); // -1 is to ensure that the last rotation is done with angle=fMaxAngleForRot
2839 for(Int_t irot=0; irot<fNRotations; irot++){
2840 Double_t phirot=fMinAngleForRot+rotStep*irot;
2841 Double_t tmpx=px[0];
2842 Double_t tmpy=py[0];
2843 px[0]=tmpx*TMath::Cos(phirot)-tmpy*TMath::Sin(phirot);
2844 py[0]=tmpx*TMath::Sin(phirot)+tmpy*TMath::Cos(phirot);
2845 partCopy->SetPxPyPzProngs(2,px,py,pz);
2846 pt = partCopy->Pt();
2847 minv2 = partCopy->InvMass2(2,pdgLc2pK0S);
2848 massRot=TMath::Sqrt(minv2);
2849 rapid = partCopy->Y(pdgD);
2850 //if(minv2>fMinMass*fMinMass && minv2<fMaxMass*fMaxMass){
2851 if ( ( ( (cuts->IsSelected(partCopy,AliRDHFCuts::kAll))&(AliRDHFCutsLctoV0::kLcToK0Spr)) == (AliRDHFCutsLctoV0::kLcToK0Spr) ) ) {
2853 fillthis="histLcMassByK0S"+appendthis;
2854 ((TH2F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(massRot,pt);
2856 fillthis="hMassVsPtVsYRot"+appendthis;
2857 ((TH3F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(mass,pt,rapid);
2858 fillthis="hDeltaMass"+appendthis;
2859 ((TH1F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(massRot-mass);
2860 //if(fFullAnalysis){
2861 //Double_t pointRot[5]={mass,massRot-mass,ptOrig,pt-ptOrig,angleProngXY};
2862 //fillthis="hDeltaMassFullAnalysis"+appendthis;
2863 //((THnSparse*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(pointRot);
2871 fillthis="hNormRotated"+appendthis;
2872 ((TH1F*)(fOutputPIDBachTR->FindObject(fillthis)))->Fill(nRotated);