/************************************************************************** * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /////////////////////////////////////////////////////////////////////////// // // AliAnalysisTaskSE for reading both reconstructed D0->Kpi candidates // and like sign pairs and for drawing corresponding distributions // // Author: C.Di Giglio, carmelo.digiglio@ba.infn.it /////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include "AliAODEvent.h" #include "AliAODVertex.h" #include "AliAODTrack.h" #include "AliAODRecoDecayHF2Prong.h" #include "AliAnalysisVertexingHF.h" #include "AliAnalysisTaskSE.h" #include "AliAnalysisTaskSEBkgLikeSignD0.h" ClassImp(AliAnalysisTaskSEBkgLikeSignD0) //________________________________________________________________________ AliAnalysisTaskSEBkgLikeSignD0::AliAnalysisTaskSEBkgLikeSignD0(): AliAnalysisTaskSE(), fOutput(0), fHistMassD0(0), fHistMassLS(0), fHistCtsD0(0), fHistCtsLS(0), fHistCtsLSpos(0), fHistCtsLSneg(0), fHistCPtaD0(0), fHistCPtaLS(0), fHistd0d0D0(0), fHistd0d0LS(0), fHistDCAD0(0), fHistDCALS(0), fVHF(0), fTotPosPairs(0), fTotNegPairs(0), fLsNormalization(1.) { // // Default constructor // } //________________________________________________________________________ AliAnalysisTaskSEBkgLikeSignD0::AliAnalysisTaskSEBkgLikeSignD0(const char *name): AliAnalysisTaskSE(name), fOutput(0), fHistMassD0(0), fHistMassLS(0), fHistCtsD0(0), fHistCtsLS(0), fHistCtsLSpos(0), fHistCtsLSneg(0), fHistCPtaD0(0), fHistCPtaLS(0), fHistd0d0D0(0), fHistd0d0LS(0), fHistDCAD0(0), fHistDCALS(0), fVHF(0), fTotPosPairs(0), fTotNegPairs(0), fLsNormalization(1.) { // // Standard constructor // // Output slot #1 writes into a TList container DefineOutput(1,TList::Class()); //My private output } //________________________________________________________________________ AliAnalysisTaskSEBkgLikeSignD0::~AliAnalysisTaskSEBkgLikeSignD0() { // Destructor if (fOutput) { delete fOutput; fOutput = 0; } if (fVHF) { delete fVHF; fVHF = 0; } } //________________________________________________________________________ void AliAnalysisTaskSEBkgLikeSignD0::Init() { // Initialization if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignD0::Init() \n"); gROOT->LoadMacro("ConfigVertexingHF.C"); fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()"); fVHF->PrintStatus(); return; } //________________________________________________________________________ void AliAnalysisTaskSEBkgLikeSignD0::UserCreateOutputObjects() { // Create the output container // if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignD0::UserCreateOutputObjects() \n"); // Several histograms are more conveniently managed in a TList fOutput = new TList(); fOutput->SetOwner(); fHistMassD0 = new TH1F("fHistMassD0", "D0 invariant mass; M [GeV]; Entries",200,1.56,2.16); fHistMassD0->Sumw2(); fHistMassD0->SetMinimum(0); fOutput->Add(fHistMassD0); fHistMassLS = new TH1F("fHistMassLS", "Like sign pairs invariant mass; M [GeV]; Entries",200,1.56,2.16); fHistMassLS->Sumw2(); fHistMassLS->SetMinimum(0); fOutput->Add(fHistMassLS); fHistCtsD0 = new TH1F("fHistCtsD0", "D0 cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.); fHistCtsD0->Sumw2(); fHistCtsD0->SetMinimum(0); fOutput->Add(fHistCtsD0); fHistCtsLS = new TH1F("fHistCtsLS", "Like sign pairs cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.); fHistCtsLS->Sumw2(); fHistCtsLS->SetMinimum(0); fOutput->Add(fHistCtsLS); fHistCtsLSpos = new TH1F("fHistCtsLSpos", "Like sign ++ pairs cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.); fHistCtsLSpos->Sumw2(); fHistCtsLSpos->SetMinimum(0); fOutput->Add(fHistCtsLSpos); fHistCtsLSneg = new TH1F("fHistCtsLSneg", "Like sign -- pairs cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.); fHistCtsLSneg->Sumw2(); fHistCtsLSneg->SetMinimum(0); fOutput->Add(fHistCtsLSneg); fHistCPtaD0 = new TH1F("fHistCPtaD0", "D0 cosine of pointing angle; Cos#Theta_{point}; Entries",200,-1.,1.); fHistCPtaD0->Sumw2(); fHistCPtaD0->SetMinimum(0); fOutput->Add(fHistCPtaD0); fHistCPtaLS = new TH1F("fHistCPtaLS", "Like sign pairs cosine of pointing angle; Cos#Theta_{point}; Entries",200,-1.,1.); fHistCPtaLS->Sumw2(); fHistCPtaLS->SetMinimum(0); fOutput->Add(fHistCPtaLS); fHistd0d0D0 = new TH1F("fHistd0d0D0", "D0 product of impact parameters; d0xd0 [#mu m^{2}]; Entries",200,-100000.,100000.); fHistd0d0D0->Sumw2(); fHistd0d0D0->SetMinimum(0); fOutput->Add(fHistd0d0D0); fHistd0d0LS = new TH1F("fHistd0d0LS", "Like sign pairs product of impact parameters; d0xd0 [#mu m^{2}]; Entries",200,-100000.,100000.); fHistd0d0LS->Sumw2(); fHistd0d0LS->SetMinimum(0); fOutput->Add(fHistd0d0LS); fHistDCAD0 = new TH1F("fHistDCAD0", "D0 distance of closest approach; dca [10^{2}#mu m]; Entries",100,0.,5.); fHistDCAD0->Sumw2(); fHistDCAD0->SetMinimum(0); fOutput->Add(fHistDCAD0); fHistDCALS = new TH1F("fHistDCALS", "Like sign pairs distance of closest approach; dca [10^{2}#mu m]; Entries",100,0.,5.); fHistDCALS->Sumw2(); fHistDCALS->SetMinimum(0); fOutput->Add(fHistDCALS); return; } //________________________________________________________________________ void AliAnalysisTaskSEBkgLikeSignD0::UserExec(Option_t */*option*/) { // Execute analysis for current event: // heavy flavor candidates association to MC truth AliAODEvent *aod = dynamic_cast (InputEvent()); // load heavy flavour vertices TClonesArray *arrayVerticesHF = (TClonesArray*)aod->GetList()->FindObject("VerticesHF"); if(!arrayVerticesHF) { printf("AliAnalysisTaskSEBkgLikeSignD0::UserExec: VerticesHF branch not found!\n"); return; } // load D0->ee candidates TClonesArray *arrayD0toKpi = (TClonesArray*)aod->GetList()->FindObject("D0toKpi"); if(!arrayD0toKpi) { printf("AliAnalysisTaskSEBkgLikeSignD0::UserExec: D0toKpi branch not found!\n"); return; } // load like sign candidates TClonesArray *arrayLikeSign = (TClonesArray*)aod->GetList()->FindObject("LikeSign2Prong"); if(!arrayLikeSign) { printf("AliAnalysisTaskSEBkgLikeSignD0::UserExec: LikeSign2Prong branch not found!\n"); return; } // AOD primary vertex AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex(); // make trkIDtoEntry register (temporary) Int_t trkIDtoEntry[100000]; for(Int_t it=0;itGetNumberOfTracks();it++) { AliAODTrack *track = aod->GetTrack(it); trkIDtoEntry[track->GetID()]=it; } // loop over Like sign candidates Int_t nPosPairs=0,nNegPairs=0; Int_t nLikeSign = arrayLikeSign->GetEntriesFast(); printf("+++\n+++Number of like sign pairs ---> %d \n+++\n", nLikeSign); for(Int_t iLikeSign = 0; iLikeSign < nLikeSign; iLikeSign++) { AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)arrayLikeSign->UncheckedAt(iLikeSign); Bool_t unsetvtx=kFALSE; if(!d->GetOwnPrimaryVtx()) { d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables unsetvtx=kTRUE; } Int_t okD0ls=0; Int_t okD0barls=0; if(d->SelectD0(fVHF->GetD0toKpiCuts(),okD0ls,okD0barls)) { AliAODTrack *trk0 = (AliAODTrack*)d->GetDaughter(0); AliAODTrack *trk1 = (AliAODTrack*)d->GetDaughter(1); if(!trk0 || !trk1) { trk0=aod->GetTrack(trkIDtoEntry[d->GetProngID(0)]); trk1=aod->GetTrack(trkIDtoEntry[d->GetProngID(1)]); printf("references to standard AOD not available \n"); } if((trk0->Charge())==1){fHistMassLS->Fill(d->InvMassD0(),0.5);} else{fHistMassLS->Fill(d->InvMassD0bar(),0.5);} fHistCPtaLS->Fill(d->CosPointingAngle()); fHistd0d0LS->Fill(1e8*d->Prodd0d0()); if((trk0->Charge()==1)){fHistCtsLS->Fill(d->CosThetaStar(0,421,321,211),0.5);} else{fHistCtsLS->Fill(d->CosThetaStar(1,421,211,321),0.5);} fHistDCALS->Fill(100*d->GetDCA()); //PostData(1,fOutput); if((trk0->Charge())==1) { nPosPairs++; fHistCtsLSpos->Fill(d->CosThetaStarD0()); //PostData(1,fOutput); } else { nNegPairs++; fHistCtsLSneg->Fill(d->CosThetaStarD0()); //PostData(1,fOutput); } PostData(1,fOutput); } if(unsetvtx) d->UnsetOwnPrimaryVtx(); } printf("------------ N. of positive pairs in Event ----- %d \n", nPosPairs); printf("------------ N. of negative pairs in Event ----- %d \n", nNegPairs); fTotPosPairs += nPosPairs; fTotNegPairs += nNegPairs; // loop over D0 candidates Int_t nD0toKpi = arrayD0toKpi->GetEntriesFast(); printf("Number of like D0 -> Kpi candidates ---> %d \n", nD0toKpi); for (Int_t iD0toKpi = 0; iD0toKpi < nD0toKpi; iD0toKpi++) { AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)arrayD0toKpi->UncheckedAt(iD0toKpi); Bool_t unsetvtx=kFALSE; if(!d->GetOwnPrimaryVtx()) { d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables unsetvtx=kTRUE; } Int_t okD0=0; Int_t okD0bar=0; if(d->SelectD0(fVHF->GetD0toKpiCuts(),okD0,okD0bar)) { fHistMassD0->Fill(d->InvMassD0(),0.5); fHistMassD0->Fill(d->InvMassD0bar(),0.5); fHistCtsD0->Fill(d->CosThetaStarD0(),0.5); fHistCtsD0->Fill(d->CosThetaStarD0bar(),0.5); fHistd0d0D0->Fill(1e8*d->Prodd0d0()); fHistCPtaD0->Fill(d->CosPointingAngle()); fHistDCAD0->Fill(100*d->GetDCA()); PostData(1,fOutput); } if(unsetvtx) d->UnsetOwnPrimaryVtx(); } return; } //________________________________________________________________________ void AliAnalysisTaskSEBkgLikeSignD0::Terminate(Option_t */*option*/) { // Terminate analysis // if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignD0: Terminate() \n"); fOutput = dynamic_cast (GetOutputData(1)); if (!fOutput) { printf("ERROR: fOutput not available\n"); return; } fLsNormalization = 2.*TMath::Sqrt(fTotPosPairs*fTotNegPairs); fHistMassD0 = dynamic_cast(fOutput->FindObject("fHistMassD0")); fHistMassLS = dynamic_cast(fOutput->FindObject("fHistMassLS")); fHistCtsD0 = dynamic_cast(fOutput->FindObject("fHistCtsD0")); fHistCtsLS = dynamic_cast(fOutput->FindObject("fHistCtsLS")); fHistCtsLSpos = dynamic_cast(fOutput->FindObject("fHistCtsLSpos")); fHistCtsLSneg = dynamic_cast(fOutput->FindObject("fHistCtsLSneg")); fHistCPtaD0 = dynamic_cast(fOutput->FindObject("fHistCPtaD0")); fHistCPtaLS = dynamic_cast(fOutput->FindObject("fHistCPtaLS")); fHistd0d0D0 = dynamic_cast(fOutput->FindObject("fHistd0d0D0")); fHistd0d0LS = dynamic_cast(fOutput->FindObject("fHistd0d0LS")); fHistDCAD0 = dynamic_cast(fOutput->FindObject("fHistDCAD0")); fHistDCALS = dynamic_cast(fOutput->FindObject("fHistDCALS")); if(fLsNormalization>0) { fHistMassLS->Scale((1/fLsNormalization)*fHistMassLS->GetEntries()); fHistCtsLS->Scale((1/fLsNormalization)*fHistCtsLS->GetEntries()); fHistCtsLSpos->Scale((1/fLsNormalization)*fHistCtsLSpos->GetEntries()); fHistCtsLSneg->Scale((1/fLsNormalization)*fHistCtsLSneg->GetEntries()); fHistCPtaLS->Scale((1/fLsNormalization)*fHistCPtaLS->GetEntries()); fHistd0d0LS->Scale((1/fLsNormalization)*fHistd0d0LS->GetEntries()); fHistDCALS->Scale((1/fLsNormalization)*fHistDCALS->GetEntries()); } return; }