1 /**************************************************************************
\r
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
16 /////////////////////////////////////////////////////////////
\r
18 // AliAnalysisTaskSE for D* candidates invariant mass histogram
\r
19 // and comparison with the MC truth.
\r
21 // Authors: Y.Wang, yifei@physi.uni-heidelberg.de
\r
22 /////////////////////////////////////////////////////////////
\r
24 #include <Riostream.h>
\r
25 #include <TClonesArray.h>
\r
31 #include "AliTPCPIDResponse.h"
\r
32 #include "AliAnalysisManager.h"
\r
33 #include "AliAODHandler.h"
\r
34 #include "AliESDtrack.h"
\r
35 #include "AliAODEvent.h"
\r
36 #include "AliAODVertex.h"
\r
37 #include "AliAODTrack.h"
\r
38 #include "AliAODMCHeader.h"
\r
39 #include "AliAODMCParticle.h"
\r
40 #include "AliAODRecoDecayHF2Prong.h"
\r
41 #include "AliAODRecoCascadeHF.h"
\r
42 #include "AliAnalysisVertexingHF.h"
\r
43 #include "AliAnalysisTaskSE.h"
\r
44 #include "AliAnalysisTaskSEDStar.h"
\r
46 ClassImp(AliAnalysisTaskSEDStar)
\r
49 //________________________________________________________________________
\r
50 AliAnalysisTaskSEDStar::AliAnalysisTaskSEDStar():
\r
51 AliAnalysisTaskSE(),
\r
61 // Default constructor
\r
64 //________________________________________________________________________
\r
65 AliAnalysisTaskSEDStar::AliAnalysisTaskSEDStar(const char *name):
\r
66 AliAnalysisTaskSE(name),
\r
76 // Default constructor
\r
78 // Output slot #1 writes into a TList container
\r
79 DefineOutput(1,TList::Class()); //My private output
\r
82 //________________________________________________________________________
\r
83 AliAnalysisTaskSEDStar::~AliAnalysisTaskSEDStar()
\r
113 //________________________________________________________________________
\r
114 void AliAnalysisTaskSEDStar::Init()
\r
118 if(fDebug > 1) printf("AnalysisTaskSEDStar::Init() \n");
\r
120 // gROOT->LoadMacro("$ALICE_ROOT/PWG3/vertexingHF/ConfigVertexingHF.C");
\r
121 gROOT->LoadMacro("ConfigVertexingHF.C");
\r
123 fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");
\r
124 // set dedidcated cuts
\r
125 //fVHF->SetD0fromDstarCuts(0.7,0.03,0.8,0.06,0.06,0.05,0.05,-0.0002,0.6); //2.p-p vertex reconstructed
\r
126 fVHF->SetD0fromDstarCuts(0.3,999999.,1.1,0.,0.,999999.,999999.,999999.,0.);
\r
127 fVHF->SetDstarCuts(0.3, 0.1, 0.05, 100000000000.0, 0.5);
\r
128 fVHF->PrintStatus();
\r
133 //________________________________________________________________________
\r
134 void AliAnalysisTaskSEDStar::UserCreateOutputObjects()
\r
137 // Create the output container
\r
139 if(fDebug > 1) printf("AnalysisTaskSEDStar::UserCreateOutputObjects() \n");
\r
141 // Several histograms are more conveniently managed in a TList
\r
142 fOutput = new TList();
\r
143 fOutput->SetOwner();
\r
145 fhistMass = new TH1F("fhistMass","D^{*+}-D^{0} invariant mass; M [GeV]; Entries",200,0,0.3);
\r
146 fhistSgn = new TH1F("fhistSgn", "D^{*+}-D^{0} invariant mass - MC; M [GeV]; Entries",200,0,0.3);
\r
147 fhistBkg = new TH1F("fhistBkg", "D^{*+}-Background invariant mass - MC; M [GeV]; Entries",200,0,0.3);
\r
149 fOutput->Add(fhistMass);
\r
150 fOutput->Add(fhistSgn);
\r
151 fOutput->Add(fhistBkg);
\r
157 //________________________________________________________________________
\r
158 void AliAnalysisTaskSEDStar::UserExec(Option_t */*option*/)
\r
160 // Execute analysis for current event:
\r
161 // heavy flavor candidates association to MC truth
\r
163 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
\r
165 // load D*->D0 pi candidates
\r
166 TClonesArray *inputArray=0;
\r
168 if(!aod && AODEvent() && IsStandardAOD()) {
\r
169 // In case there is an AOD handler writing a standard AOD, use the AOD
\r
170 // event in memory rather than the input (ESD) event.
\r
171 aod = dynamic_cast<AliAODEvent*> (AODEvent());
\r
172 // in this case the braches in the deltaAOD (AliAOD.VertexingHF.root)
\r
173 // have to taken from the AOD event hold by the AliAODExtension
\r
174 AliAODHandler* aodHandler = (AliAODHandler*)
\r
175 ((AliAnalysisManager::GetAnalysisManager())->GetOutputEventHandler());
\r
176 if(aodHandler->GetExtensions()) {
\r
177 AliAODExtension *ext = (AliAODExtension*)aodHandler->GetExtensions()->FindObject("AliAOD.VertexingHF.root");
\r
178 AliAODEvent *aodFromExt = ext->GetAOD();
\r
179 inputArray=(TClonesArray*)aodFromExt->GetList()->FindObject("Dstar");
\r
182 inputArray=(TClonesArray*)aod->GetList()->FindObject("Dstar");
\r
187 printf("AliAnalysisTaskSEDStar::UserExec: input branch not found!\n");
\r
191 // AOD primary vertex
\r
192 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
\r
195 TClonesArray *mcArray = 0;
\r
196 AliAODMCHeader *mcHeader = 0;
\r
199 // load MC particles
\r
200 mcArray = (TClonesArray*)aod->GetList()->FindObject(AliAODMCParticle::StdBranchName());
\r
202 printf("AliAnalysisTaskSEDStar::UserExec: MC particles branch not found!\n");
\r
207 mcHeader = (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
\r
209 printf("AliAnalysisTaskSEDStar::UserExec: MC header branch not found!\n");
\r
214 Int_t pdgDg[2]={421,211},pdgD0Dg[2]={321,211};
\r
216 // loop over D*->D0 pi candidates
\r
217 Int_t nInDstar = inputArray->GetEntriesFast();
\r
218 if(fDebug > 1) printf("Number of D*->D0 pi: %d\n",nInDstar);
\r
221 for (Int_t iDstar = 0; iDstar < nInDstar; iDstar++) {
\r
222 AliAODRecoCascadeHF *d = (AliAODRecoCascadeHF*)inputArray->UncheckedAt(iDstar);
\r
224 Bool_t unsetvtx=kFALSE;
\r
225 if(!d->GetOwnPrimaryVtx()) {
\r
226 d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
\r
227 d->Get2Prong()->SetOwnPrimaryVtx(vtx1);
\r
231 if(d->SelectDstar(fVHF->GetDstarCuts(),fVHF->GetD0fromDstarCuts(),kTRUE)) {//selected
\r
232 Double_t invmassDelta = d->DeltaInvMass();
\r
233 //TVector3 p3Trk0(d->PxProng(0),d->PyProng(0),d->PzProng(0)); // pi_s
\r
234 //TVector3 p3Trk1(d->PxProng(1),d->PyProng(1),d->PzProng(1)); // D0
\r
235 //Double_t CosOpenAngle = p3Trk0.Dot(p3Trk1)/(p3Trk0.Mag()*p3Trk1.Mag());
\r
237 //PID of D0 daughters
\r
238 AliAODTrack *pos = (AliAODTrack*)d->Get2Prong()->GetDaughter(0);
\r
239 AliAODTrack *neg = (AliAODTrack*)d->Get2Prong()->GetDaughter(1);
\r
242 if(fDebug > 1) printf("AnalysisTaskSEDStar::TPCPIDon \n");
\r
243 if(fDebug > 1) printf("AnalysisTaskSEDStar::NSigmaTPC: %f\n", fNSigma);
\r
245 if (d->Charge()>0){
\r
246 if(!SelectTPCPID(pos, 2, fNSigma)) continue;//pion+
\r
247 if(!SelectTPCPID(neg, 3, fNSigma)) continue;//kaon-
\r
249 if(!SelectTPCPID(pos, 3, fNSigma)) continue;//kaon+
\r
250 if(!SelectTPCPID(neg, 2, fNSigma)) continue;//pion-
\r
255 Int_t labDstar = d->MatchToMC(413,421,pdgDg,pdgD0Dg,mcArray); //return MC particle label if the array corresponds to a D0, -1 if not (cf. AliAODRecoDecay.cxx)
\r
257 //AliAODMCParticle *partDstar = (AliAODMCParticle*)mcArray->At(labDstar);
\r
258 //AliAODMCParticle *partPis = (AliAODMCParticle*)mcArray->At(partDstar->GetDaughter(1));
\r
259 //AliAODMCParticle *partD0 = (AliAODMCParticle*)mcArray->At(partDstar->GetDaughter(0));
\r
260 //AliAODMCParticle *partD0daughter = (AliAODMCParticle*)mcArray->At(partD0->GetDaughter(0));
\r
261 fhistSgn->Fill(invmassDelta);
\r
265 fhistBkg->Fill(invmassDelta);
\r
268 //no MC info, just cut selection
\r
269 fhistMass->Fill(invmassDelta);
\r
271 } //else cout<<"NOT SELECTED"<<endl;
\r
274 d->UnsetOwnPrimaryVtx();
\r
275 d->Get2Prong()->UnsetOwnPrimaryVtx();
\r
280 PostData(1,fOutput);
\r
285 //________________________________________________________________________
\r
286 Bool_t AliAnalysisTaskSEDStar::SelectTPCPID(AliAODTrack *trk, Int_t pid, Double_t nsig){//pid(0-4): {e,mu,pi,K,p}
\r
288 if ((trk->GetStatus()&AliESDtrack::kTPCpid )==0) return flag;
\r
289 AliAODPid *detpid = trk->GetDetPid();
\r
290 static AliTPCPIDResponse TPCpid;
\r
291 Double_t nsigma = TPCpid.GetNumberOfSigmas(trk->P(),detpid->GetTPCsignal(),trk->GetTPCClusterMap().CountBits(),(AliPID::EParticleType)pid);
\r
292 if (TMath::Abs(nsigma)>nsig) flag=kFALSE;
\r
296 //________________________________________________________________________
\r
297 void AliAnalysisTaskSEDStar::Terminate(Option_t */*option*/)
\r
299 // Terminate analysis
\r
301 if(fDebug > 1) printf("AnalysisTaskSEDStar: Terminate() \n");
\r
303 fOutput = dynamic_cast<TList*> (GetOutputData(1));
\r
305 printf("ERROR: fOutput not available\n");
\r
310 fhistMass = dynamic_cast<TH1F*>(fOutput->FindObject("fhistMass"));
\r
311 fhistSgn = dynamic_cast<TH1F*>(fOutput->FindObject("fhistSgn"));
\r
312 fhistBkg = dynamic_cast<TH1F*>(fOutput->FindObject("fhistBkg"));
\r