]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG3/vertexingHF/AliAnalysisTaskSEBkgLikeSignJPSI.cxx
Included check for errors in the stdout
[u/mrichter/AliRoot.git] / PWG3 / vertexingHF / AliAnalysisTaskSEBkgLikeSignJPSI.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////
17 //
18 // AliAnalysisTaskSE for reading both reconstructed JPSI -> ee candidates
19 // and like sign pairs and for drawing corresponding distributions
20 //
21 // Author: C.Di Giglio, carmelo.digiglio@ba.infn.it
22 ///////////////////////////////////////////////////////////////////////////
23
24 #include <TSystem.h>
25 #include <TROOT.h>
26 #include <TClonesArray.h>
27 #include <TNtuple.h>
28 #include <TList.h>
29 #include <TH1F.h>
30
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"
38
39 ClassImp(AliAnalysisTaskSEBkgLikeSignJPSI)
40
41 //________________________________________________________________________
42 AliAnalysisTaskSEBkgLikeSignJPSI::AliAnalysisTaskSEBkgLikeSignJPSI():
43 AliAnalysisTaskSE(),
44 fOutput(0), 
45 fHistMassJPSI(0),
46 fHistMassLS(0),
47 fHistCtsJPSI(0),           
48 fHistCtsLS(0),
49 fHistCtsLSpos(0),
50 fHistCtsLSneg(0),
51 fHistCPtaJPSI(0),          
52 fHistCPtaLS(0),
53 fHistd0d0JPSI(0),          
54 fHistd0d0LS(0),
55 fHistDCAJPSI(0),           
56 fHistDCALS(0),
57 fVHF(0),
58 fTotPosPairs(0),
59 fTotNegPairs(0),
60 fLsNormalization(1.)
61 {
62   //
63   // Default constructor
64   //
65 }
66
67 //________________________________________________________________________
68 AliAnalysisTaskSEBkgLikeSignJPSI::AliAnalysisTaskSEBkgLikeSignJPSI(const char *name):
69 AliAnalysisTaskSE(name),
70 fOutput(0),
71 fHistMassJPSI(0),
72 fHistMassLS(0),
73 fHistCtsJPSI(0),
74 fHistCtsLS(0),
75 fHistCtsLSpos(0),
76 fHistCtsLSneg(0),
77 fHistCPtaJPSI(0),
78 fHistCPtaLS(0),
79 fHistd0d0JPSI(0),
80 fHistd0d0LS(0),
81 fHistDCAJPSI(0),
82 fHistDCALS(0),
83 fVHF(0),
84 fTotPosPairs(0),
85 fTotNegPairs(0),
86 fLsNormalization(1.)
87 {
88   //
89   // Standard constructor
90   //
91   // Output slot #1 writes into a TList container
92   DefineOutput(1,TList::Class());  //My private output
93 }
94
95 //________________________________________________________________________
96 AliAnalysisTaskSEBkgLikeSignJPSI::~AliAnalysisTaskSEBkgLikeSignJPSI()
97 {
98   // Destructor
99   if (fOutput) {
100     delete fOutput;
101     fOutput = 0;
102   }
103
104   if (fVHF) {
105     delete fVHF;
106     fVHF = 0;
107   }
108
109 }
110 //________________________________________________________________________
111 void AliAnalysisTaskSEBkgLikeSignJPSI::Init()
112 {
113   // Initialization
114
115   if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignJPSI::Init() \n");
116
117   gROOT->LoadMacro("ConfigVertexingHF.C");
118
119   fVHF = (AliAnalysisVertexingHF*)gROOT->ProcessLine("ConfigVertexingHF()");
120   fVHF->PrintStatus();
121
122   return;
123 }
124
125 //________________________________________________________________________
126 void AliAnalysisTaskSEBkgLikeSignJPSI::UserCreateOutputObjects()
127 {
128   // Create the output container
129   //
130   if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignJPSI::UserCreateOutputObjects() \n");
131
132   // Several histograms are more conveniently managed in a TList
133   fOutput = new TList();
134   fOutput->SetOwner();
135
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);
140
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);
145
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);
150
151   fHistCtsLS = new TH1F("fHistCtsLS", "Like sign pairs cosine of decay angle; Cos#Theta*; Entries",200,-1.,1.);
152   fHistCtsLS->Sumw2();
153   fHistCtsLS->SetMinimum(0);
154   fOutput->Add(fHistCtsLS);
155
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);
160
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);
165
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);
170
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);
175
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);
180
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);
185
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);
190
191   fHistDCALS = new TH1F("fHistDCALS", "Like sign pairs distance of closest approach; dca [10^{2}#mu m]; Entries",100,0.,5.);
192   fHistDCALS->Sumw2(); 
193   fHistDCALS->SetMinimum(0);
194   fOutput->Add(fHistDCALS);
195
196   return;
197 }
198
199 //________________________________________________________________________
200 void AliAnalysisTaskSEBkgLikeSignJPSI::UserExec(Option_t */*option*/)
201 {
202   // Execute analysis for current event:
203   // heavy flavor candidates association to MC truth
204   
205   AliAODEvent *aod = dynamic_cast<AliAODEvent*> (InputEvent());
206
207   // load heavy flavour vertices
208   TClonesArray *arrayVerticesHF =
209     (TClonesArray*)aod->GetList()->FindObject("VerticesHF");
210   if(!arrayVerticesHF) {
211     printf("AliAnalysisTaskSEBkgLikeSignJPSI::UserExec: VerticesHF branch not found!\n");
212     return;
213   }
214
215   // load JPSI->ee candidates                                                   
216   TClonesArray *arrayJPSItoEle =
217     (TClonesArray*)aod->GetList()->FindObject("JPSItoEle");
218   if(!arrayJPSItoEle) {
219     printf("AliAnalysisTaskSEBkgLikeSignJPSI::UserExec: JPSItoEle branch not found!\n");
220     return;
221   }
222
223   // load like sign candidates
224   TClonesArray *arrayLikeSign =
225     (TClonesArray*)aod->GetList()->FindObject("LikeSign2Prong");
226   if(!arrayLikeSign) {
227     printf("AliAnalysisTaskSEBkgLikeSignJPSI::UserExec: LikeSign2Prong branch not found!\n");
228     return;
229   }
230
231   // AOD primary vertex
232   AliAODVertex *vtx1 = (AliAODVertex*)aod->GetPrimaryVertex();
233
234   // make trkIDtoEntry register (temporary)
235   Int_t trkIDtoEntry[100000];
236   for(Int_t it=0;it<aod->GetNumberOfTracks();it++) {
237     AliAODTrack *track = aod->GetTrack(it);
238     trkIDtoEntry[track->GetID()]=it;
239   }
240
241   // loop over Like sign candidates
242   Int_t nPosPairs=0,nNegPairs=0;
243   Int_t nLikeSign = arrayLikeSign->GetEntriesFast();
244   if(fDebug>1) printf("+++\n+++Number of like sign pairs ---> %d \n+++\n", nLikeSign);
245
246   for(Int_t iLikeSign = 0; iLikeSign < nLikeSign; iLikeSign++) {
247     AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)arrayLikeSign->UncheckedAt(iLikeSign);
248     Bool_t unsetvtx=kFALSE;
249     if(!d->GetOwnPrimaryVtx()) {
250         d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
251         unsetvtx=kTRUE;
252     }
253     Int_t okBtoJPSIls=0;
254     if(d->SelectBtoJPSI(fVHF->GetBtoJPSICuts(),okBtoJPSIls)) {
255        AliAODTrack *trk0 = (AliAODTrack*)d->GetDaughter(0);
256        fHistMassLS->Fill(d->InvMassJPSIee());
257        fHistCPtaLS->Fill(d->CosPointingAngle());
258        fHistd0d0LS->Fill(1e8*d->Prodd0d0());
259        fHistDCALS->Fill(100*d->GetDCA());
260        //PostData(1,fOutput);
261        if(!trk0) {
262           trk0=aod->GetTrack(trkIDtoEntry[d->GetProngID(0)]);
263           printf("references to standard AOD not available \n");
264        }
265        if((trk0->Charge())==1) {
266           nPosPairs++;
267           fHistCtsLS->Fill(d->CosThetaStar(0,443,11,11));
268           fHistCtsLSpos->Fill(d->CosThetaStar(0,443,11,11));
269           //PostData(1,fOutput);
270         } else {
271           nNegPairs++;
272           fHistCtsLS->Fill(d->CosThetaStarJPSI());
273           fHistCtsLSneg->Fill(d->CosThetaStarJPSI());
274           //PostData(1,fOutput);
275         }
276        PostData(1,fOutput);
277     }
278     if(unsetvtx) d->UnsetOwnPrimaryVtx();
279   }
280
281   if(fDebug>1) printf("------------ N. of positive pairs in Event ----- %d \n", nPosPairs);
282   if(fDebug>1) printf("------------ N. of negative pairs in Event ----- %d \n", nNegPairs);
283
284   fTotPosPairs += nPosPairs;
285   fTotNegPairs += nNegPairs;
286
287   // loop over JPSI candidates
288   Int_t nBtoJpsiToEle = arrayJPSItoEle->GetEntriesFast();
289   if(fDebug>1) printf("Number of like JPSI -> ee candidates ---> %d \n", nBtoJpsiToEle);
290
291   for (Int_t iBtoJpsiToEle = 0; iBtoJpsiToEle < nBtoJpsiToEle; iBtoJpsiToEle++) {
292     AliAODRecoDecayHF2Prong *d = (AliAODRecoDecayHF2Prong*)arrayJPSItoEle->UncheckedAt(iBtoJpsiToEle);
293     Bool_t unsetvtx=kFALSE;
294     if(!d->GetOwnPrimaryVtx()) {
295       d->SetOwnPrimaryVtx(vtx1); // needed to compute all variables
296       unsetvtx=kTRUE;
297     }
298     Int_t okBtoJPSI=0;
299     if(d->SelectBtoJPSI(fVHF->GetBtoJPSICuts(),okBtoJPSI)) {
300       fHistMassJPSI->Fill(d->InvMassJPSIee());
301       fHistCtsJPSI->Fill(d->CosThetaStarJPSI());
302       fHistd0d0JPSI->Fill(1e8*d->Prodd0d0());
303       fHistCPtaJPSI->Fill(d->CosPointingAngle());
304       fHistDCAJPSI->Fill(100*d->GetDCA());
305       PostData(1,fOutput);
306     }
307     if(unsetvtx) d->UnsetOwnPrimaryVtx();
308   }
309
310   return;
311 }
312
313 //________________________________________________________________________
314 void AliAnalysisTaskSEBkgLikeSignJPSI::Terminate(Option_t */*option*/)
315 {
316   // Terminate analysis
317   //
318   if(fDebug > 1) printf("AnalysisTaskSEBkgLikeSignJPSI: Terminate() \n");
319
320   fOutput = dynamic_cast<TList*> (GetOutputData(1));
321   if (!fOutput) {     
322     printf("ERROR: fOutput not available\n");
323     return;
324   }
325
326   fLsNormalization = 2.*TMath::Sqrt(fTotPosPairs*fTotNegPairs); 
327
328   fHistMassJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistMassJPSI"));
329   fHistMassLS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistMassLS"));
330   fHistCtsJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsJPSI"));
331   fHistCtsLS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsLS"));
332   fHistCtsLSpos = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsLSpos"));
333   fHistCtsLSneg = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCtsLSneg"));
334   fHistCPtaJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCPtaJPSI"));
335   fHistCPtaLS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistCPtaLS"));
336   fHistd0d0JPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistd0d0JPSI"));
337   fHistd0d0LS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistd0d0LS"));
338   fHistDCAJPSI = dynamic_cast<TH1F*>(fOutput->FindObject("fHistDCAJPSI"));
339   fHistDCALS = dynamic_cast<TH1F*>(fOutput->FindObject("fHistDCALS"));
340
341   if(fLsNormalization>0.) {
342     fHistMassLS->Scale((1/fLsNormalization)*fHistMassLS->GetEntries());
343     fHistCtsLS->Scale((1/fLsNormalization)*fHistCtsLS->GetEntries());
344     fHistCtsLSpos->Scale((1/fLsNormalization)*fHistCtsLSpos->GetEntries());
345     fHistCtsLSneg->Scale((1/fLsNormalization)*fHistCtsLSneg->GetEntries());
346     fHistCPtaLS->Scale((1/fLsNormalization)*fHistCPtaLS->GetEntries());
347     fHistd0d0LS->Scale((1/fLsNormalization)*fHistd0d0LS->GetEntries());
348     fHistDCALS->Scale((1/fLsNormalization)*fHistDCALS->GetEntries());
349   }
350
351   return;
352 }