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 * appear 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 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////
18 // AliAnalysisTaskSE for reading both reconstructed JPSI -> ee candidates
19 // and like sign pairs and for drawing corresponding distributions
21 // Author: C.Di Giglio, carmelo.digiglio@ba.infn.it
22 ///////////////////////////////////////////////////////////////////////////
26 #include <TClonesArray.h>
31 #include "AliAODEvent.h"
32 #include "AliAODVertex.h"
33 #include "AliAODTrack.h"
34 #include "AliAODRecoDecayHF2Prong.h"
35 #include "AliAnalysisVertexingHF.h"
36 #include "AliAnalysisTaskSE.h"
37 #include "AliAnalysisTaskSEBkgLikeSignJPSI.h"
39 ClassImp(AliAnalysisTaskSEBkgLikeSignJPSI)
41 //________________________________________________________________________
42 AliAnalysisTaskSEBkgLikeSignJPSI::AliAnalysisTaskSEBkgLikeSignJPSI():
63 // Default constructor
67 //________________________________________________________________________
68 AliAnalysisTaskSEBkgLikeSignJPSI::AliAnalysisTaskSEBkgLikeSignJPSI(const char *name):
69 AliAnalysisTaskSE(name),
89 // Standard constructor
91 // Output slot #1 writes into a TList container
92 DefineOutput(1,TList::Class()); //My private output
95 //________________________________________________________________________
96 AliAnalysisTaskSEBkgLikeSignJPSI::~AliAnalysisTaskSEBkgLikeSignJPSI()
110 //________________________________________________________________________
111 void AliAnalysisTaskSEBkgLikeSignJPSI::Init()
115 if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignJPSI::Init() \n");
117 gROOT->LoadMacro("ConfigVertexingHF.C");
119 fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");
125 //________________________________________________________________________
126 void AliAnalysisTaskSEBkgLikeSignJPSI::UserCreateOutputObjects()
128 // Create the output container
130 if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignJPSI::UserCreateOutputObjects() \n");
132 // Several histograms are more conveniently managed in a TList
133 fOutput = new TList();
136 fHistMassJPSI = new TH1F("fHistMassJPSI", "J/#Psi invariant mass; M [GeV]; Entries",200,2.8,3.25);
137 fHistMassJPSI->Sumw2();
138 fHistMassJPSI->SetMinimum(0);
139 fOutput->Add(fHistMassJPSI);
141 fHistMassLS = new TH1F("fHistMassLS", "Like sign pairs invariant mass; M [GeV]; Entries",200,2.8,3.25);
142 fHistMassLS->Sumw2();
143 fHistMassLS->SetMinimum(0);
144 fOutput->Add(fHistMassLS);
146 fHistCtsJPSI = new TH1F("fHistCtsJPSI", "J/#Psi cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.);
147 fHistCtsJPSI->Sumw2();
148 fHistCtsJPSI->SetMinimum(0);
149 fOutput->Add(fHistCtsJPSI);
151 fHistCtsLS = new TH1F("fHistCtsLS", "Like sign pairs cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.);
153 fHistCtsLS->SetMinimum(0);
154 fOutput->Add(fHistCtsLS);
156 fHistCtsLSpos = new TH1F("fHistCtsLSpos", "Like sign ++ pairs cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.);
157 fHistCtsLSpos->Sumw2();
158 fHistCtsLSpos->SetMinimum(0);
159 fOutput->Add(fHistCtsLSpos);
161 fHistCtsLSneg = new TH1F("fHistCtsLSneg", "Like sign -- pairs cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.);
162 fHistCtsLSneg->Sumw2();
163 fHistCtsLSneg->SetMinimum(0);
164 fOutput->Add(fHistCtsLSneg);
166 fHistCPtaJPSI = new TH1F("fHistCPtaJPSI", "J/#Psi cosine of pointing angle; Cos#Theta_{point}; Entries",200,-1.,1.);
167 fHistCPtaJPSI->Sumw2();
168 fHistCPtaJPSI->SetMinimum(0);
169 fOutput->Add(fHistCPtaJPSI);
171 fHistCPtaLS = new TH1F("fHistCPtaLS", "Like sign pairs cosine of pointing angle; Cos#Theta_{point}; Entries",200,-1.,1.);
172 fHistCPtaLS->Sumw2();
173 fHistCPtaLS->SetMinimum(0);
174 fOutput->Add(fHistCPtaLS);
176 fHistd0d0JPSI = new TH1F("fHistd0d0JPSI", "J/#Psi product of impact parameters; d0xd0 [#mu m^{2}]; Entries",200,-100000.,100000.);
177 fHistd0d0JPSI->Sumw2();
178 fHistd0d0JPSI->SetMinimum(0);
179 fOutput->Add(fHistd0d0JPSI);
181 fHistd0d0LS = new TH1F("fHistd0d0LS", "Like sign pairs product of impact parameters; d0xd0 [#mu m^{2}]; Entries",200,-100000.,100000.);
182 fHistd0d0LS->Sumw2();
183 fHistd0d0LS->SetMinimum(0);
184 fOutput->Add(fHistd0d0LS);
186 fHistDCAJPSI = new TH1F("fHistDCAJPSI", "J/#Psi distance of closest approach; dca [10^{2}#mu m]; Entries",100,0.,5.);
187 fHistDCAJPSI->Sumw2();
188 fHistDCAJPSI->SetMinimum(0);
189 fOutput->Add(fHistDCAJPSI);
191 fHistDCALS = new TH1F("fHistDCALS", "Like sign pairs distance of closest approach; dca [10^{2}#mu m]; Entries",100,0.,5.);
193 fHistDCALS->SetMinimum(0);
194 fOutput->Add(fHistDCALS);
199 //________________________________________________________________________
200 void AliAnalysisTaskSEBkgLikeSignJPSI::UserExec(Option_t */*option*/)
202 // Execute analysis for current event:
203 // heavy flavor candidates association to MC truth
205 AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
207 // In case there is an AOD handler writing a standard AOD, use the AOD
208 // event in memory rather than the input (ESD) event.
209 if (!aod && AODEvent() && IsStandardAOD()) aod = dynamic_cast<AliAODEvent*> (AODEvent());
211 // load heavy flavour vertices
212 TClonesArray *arrayVerticesHF =
213 (TClonesArray*)aod->GetList()->FindObject("VerticesHF");
214 if(!arrayVerticesHF) {
215 printf("AliAnalysisTaskSEBkgLikeSignJPSI::UserExec: VerticesHF branch not found!\n");
219 // load JPSI->ee candidates
220 TClonesArray *arrayJPSItoEle =
221 (TClonesArray*)aod->GetList()->FindObject("JPSItoEle");
222 if(!arrayJPSItoEle) {
223 printf("AliAnalysisTaskSEBkgLikeSignJPSI::UserExec: JPSItoEle branch not found!\n");
227 // load like sign candidates
228 TClonesArray *arrayLikeSign =
229 (TClonesArray*)aod->GetList()->FindObject("LikeSign2Prong");
231 printf("AliAnalysisTaskSEBkgLikeSignJPSI::UserExec: LikeSign2Prong branch not found!\n");
235 // AOD primary vertex
236 AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
238 // make trkIDtoEntry register (temporary)
239 Int_t trkIDtoEntry[100000];
240 for(Int_t it=0;it<aod->GetNumberOfTracks();it++) {
241 AliAODTrack *track = aod->GetTrack(it);
242 trkIDtoEntry[track->GetID()]=it;
245 // loop over Like sign candidates
246 Int_t nPosPairs=0,nNegPairs=0;
247 Int_t nLikeSign = arrayLikeSign->GetEntriesFast();
248 if(fDebug>1) printf("+++\n+++Number of like sign pairs ---> %d \n+++\n", nLikeSign);
250 for(Int_t iLikeSign = 0; iLikeSign < nLikeSign; iLikeSign++) {
251 AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)arrayLikeSign->UncheckedAt(iLikeSign);
252 Bool_t unsetvtx=kFALSE;
253 if(!d->GetOwnPrimaryVtx()) {
254 d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
258 if(d->SelectBtoJPSI(fVHF->GetBtoJPSICuts(),okBtoJPSIls)) {
259 AliAODTrack *trk0 = (AliAODTrack*)d->GetDaughter(0);
260 fHistMassLS->Fill(d->InvMassJPSIee());
261 fHistCPtaLS->Fill(d->CosPointingAngle());
262 fHistd0d0LS->Fill(1e8*d->Prodd0d0());
263 fHistDCALS->Fill(100*d->GetDCA());
264 //PostData(1,fOutput);
266 trk0=aod->GetTrack(trkIDtoEntry[d->GetProngID(0)]);
267 printf("references to standard AOD not available \n");
269 if((trk0->Charge())==1) {
271 fHistCtsLS->Fill(d->CosThetaStar(0,443,11,11));
272 fHistCtsLSpos->Fill(d->CosThetaStar(0,443,11,11));
273 //PostData(1,fOutput);
276 fHistCtsLS->Fill(d->CosThetaStarJPSI());
277 fHistCtsLSneg->Fill(d->CosThetaStarJPSI());
278 //PostData(1,fOutput);
282 if(unsetvtx) d->UnsetOwnPrimaryVtx();
285 if(fDebug>1) printf("------------ N. of positive pairs in Event ----- %d \n", nPosPairs);
286 if(fDebug>1) printf("------------ N. of negative pairs in Event ----- %d \n", nNegPairs);
288 fTotPosPairs += nPosPairs;
289 fTotNegPairs += nNegPairs;
291 // loop over JPSI candidates
292 Int_t nBtoJpsiToEle = arrayJPSItoEle->GetEntriesFast();
293 if(fDebug>1) printf("Number of like JPSI -> ee candidates ---> %d \n", nBtoJpsiToEle);
295 for (Int_t iBtoJpsiToEle = 0; iBtoJpsiToEle < nBtoJpsiToEle; iBtoJpsiToEle++) {
296 AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)arrayJPSItoEle->UncheckedAt(iBtoJpsiToEle);
297 Bool_t unsetvtx=kFALSE;
298 if(!d->GetOwnPrimaryVtx()) {
299 d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
303 if(d->SelectBtoJPSI(fVHF->GetBtoJPSICuts(),okBtoJPSI)) {
304 fHistMassJPSI->Fill(d->InvMassJPSIee());
305 fHistCtsJPSI->Fill(d->CosThetaStarJPSI());
306 fHistd0d0JPSI->Fill(1e8*d->Prodd0d0());
307 fHistCPtaJPSI->Fill(d->CosPointingAngle());
308 fHistDCAJPSI->Fill(100*d->GetDCA());
311 if(unsetvtx) d->UnsetOwnPrimaryVtx();
317 //________________________________________________________________________
318 void AliAnalysisTaskSEBkgLikeSignJPSI::Terminate(Option_t */*option*/)
320 // Terminate analysis
322 if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignJPSI: Terminate() \n");
324 fOutput = dynamic_cast<TList*> (GetOutputData(1));
326 printf("ERROR: fOutput not available\n");
330 fLsNormalization = 2.*TMath::Sqrt(fTotPosPairs*fTotNegPairs);
332 fHistMassJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistMassJPSI"));
333 fHistMassLS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistMassLS"));
334 fHistCtsJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsJPSI"));
335 fHistCtsLS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsLS"));
336 fHistCtsLSpos = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsLSpos"));
337 fHistCtsLSneg = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsLSneg"));
338 fHistCPtaJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCPtaJPSI"));
339 fHistCPtaLS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCPtaLS"));
340 fHistd0d0JPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistd0d0JPSI"));
341 fHistd0d0LS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistd0d0LS"));
342 fHistDCAJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistDCAJPSI"));
343 fHistDCALS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistDCALS"));
345 if(fLsNormalization>0.) {
346 fHistMassLS->Scale((1/fLsNormalization)*fHistMassLS->GetEntries());
347 fHistCtsLS->Scale((1/fLsNormalization)*fHistCtsLS->GetEntries());
348 fHistCtsLSpos->Scale((1/fLsNormalization)*fHistCtsLSpos->GetEntries());
349 fHistCtsLSneg->Scale((1/fLsNormalization)*fHistCtsLSneg->GetEntries());
350 fHistCPtaLS->Scale((1/fLsNormalization)*fHistCPtaLS->GetEntries());
351 fHistd0d0LS->Scale((1/fLsNormalization)*fHistd0d0LS->GetEntries());
352 fHistDCALS->Scale((1/fLsNormalization)*fHistDCALS->GetEntries());