]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGHF/vertexingHF/AliAnalysisTaskCheckHFMCProd.cxx
Code cleanup in D+ task
[u/mrichter/AliRoot.git] / PWGHF / vertexingHF / AliAnalysisTaskCheckHFMCProd.cxx
CommitLineData
7b6a4dcd 1#include "AliAnalysisTaskSE.h"
2#include "AliAnalysisManager.h"
3#include "AliAnalysisDataContainer.h"
4#include "AliESDEvent.h"
7c569cb6 5#include "AliESDtrackCuts.h"
7b6a4dcd 6#include "AliStack.h"
7#include "AliCentrality.h"
8#include "AliMCEventHandler.h"
9#include "AliMCEvent.h"
c7112a2a 10#include "AliHeader.h"
11#include "AliGenCocktailEventHeader.h"
12#include "AliGenEventHeader.h"
13#include "AliGenerator.h"
ee9c9d9b 14#include "AliVertexingHFUtils.h"
7b6a4dcd 15#include "AliMultiplicity.h"
16#include <TParticle.h>
17#include <TSystem.h>
18#include <TTree.h>
19#include <TNtuple.h>
20#include <TH1F.h>
21#include <TH2F.h>
7c569cb6 22#include <TH3F.h>
7b6a4dcd 23#include <TChain.h>
24#include "AliESDInputHandlerRP.h"
25#include "AliAnalysisTaskCheckHFMCProd.h"
26
27/**************************************************************************
28 * Copyright(c) 1998-2012, ALICE Experiment at CERN, All rights reserved. *
29 * *
30 * Author: The ALICE Off-line Project. *
31 * Contributors are mentioned in the code where appropriate. *
32 * *
33 * Permission to use, copy, modify and distribute this software and its *
34 * documentation strictly for non-commercial purposes is hereby granted *
35 * without fee, provided that the above copyright notice appears in all *
36 * copies and that both the copyright notice and this permission notice *
37 * appear in the supporting documentation. The authors make no claims *
38 * about the suitability of this software for any purpose. It is *
39 * provided "as is" without express or implied warranty. *
40 **************************************************************************/
41
42/* $Id$ */
43
44//*************************************************************************
45// Implementation of class AliAnalysisTaskCheckHFMCProd
46// AliAnalysisTask to check MC production at ESD+Kine level
47//
48//
49// Authors: F. Prino, prino@to.infn.it
50//
51//*************************************************************************
52
53ClassImp(AliAnalysisTaskCheckHFMCProd)
54//______________________________________________________________________________
55AliAnalysisTaskCheckHFMCProd::AliAnalysisTaskCheckHFMCProd() : AliAnalysisTaskSE("HFMCChecks"),
56 fOutput(0),
57 fHistoNEvents(0),
a35b52e8 58 fHistoPhysPrim(0),
7b6a4dcd 59 fHistoTracks(0),
60 fHistoSelTracks(0),
61 fHistoTracklets(0),
7c3336d1 62 fHistoTrackletsEta1(0),
a916dfdb 63 fHistoPtPhysPrim(0),
c7112a2a 64 fHistoEtaPhysPrim(0),
7b6a4dcd 65 fHistoSPD3DVtxX(0),
66 fHistoSPD3DVtxY(0),
67 fHistoSPD3DVtxZ(0),
68 fHistoSPDZVtxX(0),
69 fHistoSPDZVtxY(0),
70 fHistoSPDZVtxZ(0),
71 fHistoTRKVtxX(0),
72 fHistoTRKVtxY(0),
73 fHistoTRKVtxZ(0),
74 fHistoNcharmed(0),
75 fHistoNbVsNc(0),
fcedd2b1 76 fHistOriginPrompt(0),
77 fHistOriginFeeddown(0),
c833b704 78 fHistMotherID(0),
a916dfdb 79 fHistDSpecies(0),
80 fHistBSpecies(0),
c7112a2a 81 fHistNcollHFtype(0),
7c569cb6 82 fHistEtaPhiPtGenEle(0),
83 fHistEtaPhiPtGenPi(0),
84 fHistEtaPhiPtGenK(0),
85 fHistEtaPhiPtGenPro(0),
86 fHistEtaPhiPtRecEle(0),
87 fHistEtaPhiPtRecPi(0),
88 fHistEtaPhiPtRecK(0),
89 fHistEtaPhiPtRecPro(0),
fcedd2b1 90 fSearchUpToQuark(kFALSE),
a35b52e8 91 fSystem(0),
7c569cb6 92 fESDtrackCuts(0x0),
7b6a4dcd 93 fReadMC(kTRUE)
94{
95 //
96 DefineInput(0, TChain::Class());
97 DefineOutput(1, TList::Class());
98}
99
100
101//___________________________________________________________________________
102AliAnalysisTaskCheckHFMCProd::~AliAnalysisTaskCheckHFMCProd(){
103 //
104 if (AliAnalysisManager::GetAnalysisManager()->IsProofMode()) return;
105 if (fOutput) {
106 delete fOutput;
107 fOutput = 0;
108 }
7c569cb6 109 delete fESDtrackCuts;
110
7b6a4dcd 111}
112
113//___________________________________________________________________________
114void AliAnalysisTaskCheckHFMCProd::UserCreateOutputObjects() {
115 // create output histos
116
117 fOutput = new TList();
118 fOutput->SetOwner();
119 fOutput->SetName("OutputHistos");
120
121 fHistoNEvents = new TH1F("hNEvents", "Number of processed events",3,-0.5,2.5);
122 fHistoNEvents->Sumw2();
123 fHistoNEvents->SetMinimum(0);
124 fOutput->Add(fHistoNEvents);
125
126 Double_t maxMult=100.;
a35b52e8 127 if(fSystem==1) maxMult=10000.;
128 if(fSystem==2) maxMult=500.;
7c3336d1 129 fHistoPhysPrim = new TH1F("hPhysPrim","",100,-0.5,maxMult-0.5);
a35b52e8 130 fHistoPhysPrim->Sumw2();
131 fOutput->Add(fHistoPhysPrim);
7c3336d1 132 fHistoTracks = new TH1F("hTracks","",100,-0.5,maxMult*2-0.5);
7b6a4dcd 133 fHistoTracks->Sumw2();
134 fOutput->Add(fHistoTracks);
7c3336d1 135 fHistoSelTracks = new TH1F("hSelTracks","",100,-0.5,maxMult-0.5);
7b6a4dcd 136 fHistoSelTracks->Sumw2();
137 fOutput->Add(fHistoSelTracks);
7c3336d1 138 fHistoTracklets = new TH1F("hTracklets","",100,-0.5,maxMult-0.5);
7b6a4dcd 139 fHistoTracklets->Sumw2();
140 fOutput->Add(fHistoTracklets);
7c3336d1 141 fHistoTrackletsEta1 = new TH1F("hTrackletsEta1","",100,-0.5,maxMult-0.5);
142 fHistoTrackletsEta1->Sumw2();
143 fOutput->Add(fHistoTrackletsEta1);
a916dfdb 144 fHistoPtPhysPrim = new TH1F("hPtPhysPrim","",100,0.,20.);
145 fHistoPtPhysPrim->Sumw2();
146 fOutput->Add(fHistoPtPhysPrim);
c7112a2a 147 fHistoEtaPhysPrim = new TH1F("hEtaPhysPrim","",100,-10.,10.);
148 fHistoEtaPhysPrim->Sumw2();
149 fOutput->Add(fHistoEtaPhysPrim);
7b6a4dcd 150
151 fHistoSPD3DVtxX = new TH1F("hSPD3DvX","",100,-1.,1.);
152 fHistoSPD3DVtxX->Sumw2();
153 fOutput->Add(fHistoSPD3DVtxX);
154 fHistoSPD3DVtxY = new TH1F("hSPD3DvY","",100,-1.,1.);
155 fHistoSPD3DVtxY->Sumw2();
156 fOutput->Add(fHistoSPD3DVtxY);
157 fHistoSPD3DVtxZ = new TH1F("hSPD3DvZ","",100,-15.,15.);
158 fHistoSPD3DVtxZ->Sumw2();
159 fOutput->Add(fHistoSPD3DVtxZ);
160
161 fHistoSPDZVtxX = new TH1F("hSPDZvX","",100,-1.,1.);
162 fHistoSPDZVtxX->Sumw2();
163 fOutput->Add(fHistoSPDZVtxX);
164 fHistoSPDZVtxY = new TH1F("hSPDZvY","",100,-1.,1.);
165 fHistoSPDZVtxY->Sumw2();
166 fOutput->Add(fHistoSPDZVtxY);
167 fHistoSPDZVtxZ = new TH1F("hSPDZvZ","",100,-15.,15.);
168 fHistoSPDZVtxZ->Sumw2();
169 fOutput->Add(fHistoSPDZVtxZ);
170
171
172 fHistoTRKVtxX = new TH1F("hTRKvX","",100,-1.,1.);
173 fHistoTRKVtxX->Sumw2();
174 fOutput->Add(fHistoTRKVtxX);
175 fHistoTRKVtxY = new TH1F("hTRKvY","",100,-1.,1.);
176 fHistoTRKVtxY->Sumw2();
177 fOutput->Add(fHistoTRKVtxY);
178 fHistoTRKVtxZ = new TH1F("hTRKvZ","",100,-15.,15.);
179 fHistoTRKVtxZ->Sumw2();
180 fOutput->Add(fHistoTRKVtxZ);
181
182 Int_t nBinscb=11;
a916dfdb 183 if(fSystem==1) nBinscb=200;
a35b52e8 184 if(fSystem==2) nBinscb=21;
7b6a4dcd 185 Double_t maxncn=nBinscb-0.5;
7c3336d1 186 fHistoNcharmed = new TH2F("hncharmed","",100,-0.5,maxMult-0.5,nBinscb,-0.5,maxncn);
7b6a4dcd 187 fHistoNcharmed->Sumw2();
188 fOutput->Add(fHistoNcharmed);
189 fHistoNbVsNc = new TH2F("hnbvsnc","",nBinscb,-0.5,maxncn,nBinscb,-0.5,maxncn);
190 fHistoNbVsNc->Sumw2();
191 fOutput->Add(fHistoNbVsNc);
192
a35b52e8 193 fHistYPtPrompt[0] = new TH2F("hyptD0prompt","D0 - Prompt",40,0.,40.,20,-2.,2.);
194 fHistYPtPrompt[1] = new TH2F("hyptDplusprompt","Dplus - Prompt",40,0.,40.,20,-2.,2.);
195 fHistYPtPrompt[2] = new TH2F("hyptDstarprompt","Dstar - Prompt",40,0.,40.,20,-2.,2.);
196 fHistYPtPrompt[3] = new TH2F("hyptDsprompt","Ds - Prompt",40,0.,40.,20,-2.,2.);
197 fHistYPtPrompt[4] = new TH2F("hyptLcprompt","Lc - Prompt",40,0.,40.,20,-2.,2.);
198
199 fHistBYPtAllDecay[0] = new TH2F("hyptB0AllDecay","B0 - All",40,0.,40.,40,-2.,2.);
200 fHistBYPtAllDecay[1] = new TH2F("hyptBplusAllDecay","Bplus - All",40,0.,40.,40,-2.,2.);
201 fHistBYPtAllDecay[2] = new TH2F("hyptBstarAllDecay","Bstar - All",40,0.,40.,40,-2.,2.);
202 fHistBYPtAllDecay[3] = new TH2F("hyptBsAllDecay","Bs - All",40,0.,40.,40,-2.,2.);
203 fHistBYPtAllDecay[4] = new TH2F("hyptLbAllDecay","LB - All",40,0.,40.,40,-2.,2.);
204
205 fHistYPtAllDecay[0] = new TH2F("hyptD0AllDecay","D0 - All",40,0.,40.,40,-2.,2.);
206 fHistYPtAllDecay[1] = new TH2F("hyptDplusAllDecay","Dplus - All",40,0.,40.,40,-2.,2.);
207 fHistYPtAllDecay[2] = new TH2F("hyptDstarAllDecay","Dstar - All",40,0.,40.,40,-2.,2.);
208 fHistYPtAllDecay[3] = new TH2F("hyptDsAllDecay","Ds - All",40,0.,40.,40,-2.,2.);
209 fHistYPtAllDecay[4] = new TH2F("hyptLcAllDecay","Lc - All",40,0.,40.,40,-2.,2.);
210
211 fHistYPtPromptAllDecay[0] = new TH2F("hyptD0promptAllDecay","D0 - Prompt",40,0.,40.,40,-2.,2.);
212 fHistYPtPromptAllDecay[1] = new TH2F("hyptDpluspromptAllDecay","Dplus - Prompt",40,0.,40.,40,-2.,2.);
213 fHistYPtPromptAllDecay[2] = new TH2F("hyptDstarpromptAllDecay","Dstar - Prompt",40,0.,40.,40,-2.,2.);
214 fHistYPtPromptAllDecay[3] = new TH2F("hyptDspromptAllDecay","Ds - Prompt",40,0.,40.,40,-2.,2.);
215 fHistYPtPromptAllDecay[4] = new TH2F("hyptLcpromptAllDecay","Lc - Prompt",40,0.,40.,40,-2.,2.);
216
217 fHistYPtFeeddownAllDecay[0] = new TH2F("hyptD0feeddownAllDecay","D0 - FromB",40,0.,40.,40,-2.,2.);
218 fHistYPtFeeddownAllDecay[1] = new TH2F("hyptDplusfeeddownAllDecay","Dplus - FromB",40,0.,40.,40,-2.,2.);
219 fHistYPtFeeddownAllDecay[2] = new TH2F("hyptDstarfeeddownAllDecay","Dstar - FromB",40,0.,40.,40,-2.,2.);
220 fHistYPtFeeddownAllDecay[3] = new TH2F("hyptDsfeeddownAllDecay","Ds - FromB",40,0.,40.,40,-2.,2.);
221 fHistYPtFeeddownAllDecay[4] = new TH2F("hyptLcfeeddownAllDecay","Lc - FromB",40,0.,40.,40,-2.,2.);
222
223
224 fHistYPtFeeddown[0] = new TH2F("hyptD0feeddown","D0 - Feeddown",40,0.,40.,20,-2.,2.);
225 fHistYPtFeeddown[1] = new TH2F("hyptDplusfeeddown","Dplus - Feeddown",40,0.,40.,20,-2.,2.);
226 fHistYPtFeeddown[2] = new TH2F("hyptDstarfeedown","Dstar - Feeddown",40,0.,40.,20,-2.,2.);
227 fHistYPtFeeddown[3] = new TH2F("hyptDsfeedown","Ds - Feeddown",40,0.,40.,20,-2.,2.);
228 fHistYPtFeeddown[4] = new TH2F("hyptLcfeedown","Lc - Feeddown",40,0.,40.,20,-2.,2.);
7b6a4dcd 229
230 for(Int_t ih=0; ih<5; ih++){
a35b52e8 231 fHistBYPtAllDecay[ih]->Sumw2();
232 fHistBYPtAllDecay[ih]->SetMinimum(0);
233 fOutput->Add(fHistBYPtAllDecay[ih]);
5472ae5b 234 fHistYPtAllDecay[ih]->Sumw2();
235 fHistYPtAllDecay[ih]->SetMinimum(0);
236 fOutput->Add(fHistYPtAllDecay[ih]);
237 fHistYPtPromptAllDecay[ih]->Sumw2();
238 fHistYPtPromptAllDecay[ih]->SetMinimum(0);
239 fOutput->Add(fHistYPtPromptAllDecay[ih]);
240 fHistYPtFeeddownAllDecay[ih]->Sumw2();
241 fHistYPtFeeddownAllDecay[ih]->SetMinimum(0);
242 fOutput->Add(fHistYPtFeeddownAllDecay[ih]);
7b6a4dcd 243 fHistYPtPrompt[ih]->Sumw2();
244 fHistYPtPrompt[ih]->SetMinimum(0);
245 fOutput->Add(fHistYPtPrompt[ih]);
246 fHistYPtFeeddown[ih]->Sumw2();
247 fHistYPtFeeddown[ih]->SetMinimum(0);
248 fOutput->Add(fHistYPtFeeddown[ih]);
249 }
250
a35b52e8 251 fHistYPtD0byDecChannel[0] = new TH2F("hyptD02","D0 - 2prong",40,0.,40.,20,-2.,2.);
252 fHistYPtD0byDecChannel[1] = new TH2F("hyptD04","D0 - 4prong",40,0.,40.,20,-2.,2.);
253 fHistYPtDplusbyDecChannel[0] = new TH2F("hyptDplusnonreson","Dplus - non reson",40,0.,40.,20,-2.,2.);
254 fHistYPtDplusbyDecChannel[1] = new TH2F("hyptDplusreson","Dplus - reson via K0*",40,0.,40.,20,-2.,2.);
255 fHistYPtDsbyDecChannel[0] = new TH2F("hyptDsphi","Ds - vis Phi",40,0.,40.,20,-2.,2.);
256 fHistYPtDsbyDecChannel[1] = new TH2F("hyptDsk0st","Ds - via k0*",40,0.,40.,20,-2.,2.);
7b6a4dcd 257
258 for(Int_t ih=0; ih<2; ih++){
259
260 fHistYPtD0byDecChannel[ih]->Sumw2();
261 fHistYPtD0byDecChannel[ih]->SetMinimum(0);
262 fOutput->Add(fHistYPtD0byDecChannel[ih]);
263 fHistYPtDplusbyDecChannel[ih]->Sumw2();
264 fHistYPtDplusbyDecChannel[ih]->SetMinimum(0);
265 fOutput->Add(fHistYPtDplusbyDecChannel[ih]);
266 fHistYPtDsbyDecChannel[ih]->Sumw2();
267 fHistYPtDsbyDecChannel[ih]->SetMinimum(0);
268 fOutput->Add(fHistYPtDsbyDecChannel[ih]);
269 }
270
fcedd2b1 271 fHistOriginPrompt=new TH1F("hOriginPrompt","",100,0.,0.5);
272 fHistOriginPrompt->Sumw2();
273 fHistOriginPrompt->SetMinimum(0);
274 fOutput->Add(fHistOriginPrompt);
275 fHistOriginFeeddown=new TH1F("hOriginFeeddown","",100,0.,0.5);
276 fHistOriginFeeddown->Sumw2();
277 fHistOriginFeeddown->SetMinimum(0);
278 fOutput->Add(fHistOriginFeeddown);
c833b704 279 fHistMotherID=new TH1F("hMotherID","",1000,-1.5,998.5);
280 fHistMotherID->SetMinimum(0);
281 fOutput->Add(fHistMotherID);
a916dfdb 282 fHistDSpecies=new TH1F("hDSpecies","",10,-0.5,9.5);
283 fHistDSpecies->GetXaxis()->SetBinLabel(1,"D0");
284 fHistDSpecies->GetXaxis()->SetBinLabel(2,"D0bar");
285 fHistDSpecies->GetXaxis()->SetBinLabel(3,"D+");
286 fHistDSpecies->GetXaxis()->SetBinLabel(4,"D-");
287 fHistDSpecies->GetXaxis()->SetBinLabel(5,"D*+");
288 fHistDSpecies->GetXaxis()->SetBinLabel(6,"D*-");
289 fHistDSpecies->GetXaxis()->SetBinLabel(7,"Ds+");
290 fHistDSpecies->GetXaxis()->SetBinLabel(8,"Ds-");
291 fHistDSpecies->GetXaxis()->SetBinLabel(9,"Lc+");
292 fHistDSpecies->GetXaxis()->SetBinLabel(10,"Lc-");
293 fHistDSpecies->SetMinimum(0);
294 fOutput->Add(fHistDSpecies);
295 fHistBSpecies=new TH1F("hBSpecies","",10,-0.5,9.5);
296 fHistBSpecies->GetXaxis()->SetBinLabel(1,"B0");
297 fHistBSpecies->GetXaxis()->SetBinLabel(2,"B0bar");
298 fHistBSpecies->GetXaxis()->SetBinLabel(3,"B+");
299 fHistBSpecies->GetXaxis()->SetBinLabel(4,"B-");
300 fHistBSpecies->GetXaxis()->SetBinLabel(5,"B*+");
301 fHistBSpecies->GetXaxis()->SetBinLabel(6,"B*-");
302 fHistBSpecies->GetXaxis()->SetBinLabel(7,"Bs+");
303 fHistBSpecies->GetXaxis()->SetBinLabel(8,"Bs-");
304 fHistBSpecies->GetXaxis()->SetBinLabel(9,"Lb+");
305 fHistBSpecies->GetXaxis()->SetBinLabel(10,"Lb-");
306 fHistBSpecies->SetMinimum(0);
307 fOutput->Add(fHistBSpecies);
c7112a2a 308
309 fHistNcollHFtype=new TH2F("hNcollHFtype","",5,-1.5,3.5,30,-0.5,29.5);
310 fOutput->Add(fHistNcollHFtype);
7c569cb6 311
312 Double_t binseta[11]={-1.0,-0.8,-0.6,-0.4,-0.2,0.,0.2,0.4,0.6,0.8,1.0};
313 const Int_t nBinsPhi=40;
314 Double_t binsphi[nBinsPhi+1];
315 for(Int_t ib=0; ib<=nBinsPhi; ib++) binsphi[ib]=ib*TMath::Pi()/20.;
316 const Int_t nBinsPt=24;
317 Double_t binspt[nBinsPt+1]={0.,0.10,0.15,0.2,0.25,
318 0.3,0.4,0.5,0.6,0.7,
319 0.8,0.9,1.,1.25,1.5,
320 1.75,2.,2.5,3.,4.,
321 5.,7.5,10.,15.,20.};
322
323 fHistEtaPhiPtGenEle=new TH3F("hEtaPhiPtGenEle","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
324 fOutput->Add(fHistEtaPhiPtGenEle);
325 fHistEtaPhiPtGenPi=new TH3F("hEtaPhiPtGenPi","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
326 fOutput->Add(fHistEtaPhiPtGenPi);
327 fHistEtaPhiPtGenK=new TH3F("hEtaPhiPtGenK","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
328 fOutput->Add(fHistEtaPhiPtGenK);
329 fHistEtaPhiPtGenPro=new TH3F("hEtaPhiPtGenPro","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
330 fOutput->Add(fHistEtaPhiPtGenPro);
331
332
333 fHistEtaPhiPtRecEle=new TH3F("hEtaPhiPtRecEle","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
334 fOutput->Add(fHistEtaPhiPtRecEle);
335 fHistEtaPhiPtRecPi=new TH3F("hEtaPhiPtRecPi","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
336 fOutput->Add(fHistEtaPhiPtRecPi);
337 fHistEtaPhiPtRecK=new TH3F("hEtaPhiPtRecK","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
338 fOutput->Add(fHistEtaPhiPtRecK);
339 fHistEtaPhiPtRecPro=new TH3F("hEtaPhiPtRecPro","",10,binseta,nBinsPhi,binsphi,nBinsPt,binspt);
340 fOutput->Add(fHistEtaPhiPtRecPro);
341
342
343
7b6a4dcd 344 PostData(1,fOutput);
345
346}
347//______________________________________________________________________________
348void AliAnalysisTaskCheckHFMCProd::UserExec(Option_t *)
349{
350 //
351
352 AliESDEvent *esd = (AliESDEvent*) (InputEvent());
353
354
355 if(!esd) {
356 printf("AliAnalysisTaskSDDRP::Exec(): bad ESD\n");
357 return;
358 }
359
360 fHistoNEvents->Fill(0);
361
7c569cb6 362 if(!fESDtrackCuts){
363 Int_t year=2011;
364 if(esd->GetRunNumber()<=139517) year=2010;
365 if(year==2010) fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(kFALSE);
366 else fESDtrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
367 fESDtrackCuts->SetMaxDCAToVertexXY(2.4);
368 fESDtrackCuts->SetMaxDCAToVertexZ(3.2);
369 fESDtrackCuts->SetDCAToVertex2D(kTRUE);
370 fESDtrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
371 AliESDtrackCuts::kAny);
372 }
373
7b6a4dcd 374 Int_t nTracks=esd->GetNumberOfTracks();
375 fHistoTracks->Fill(nTracks);
376 Int_t nSelTracks=0;
377 for(Int_t it=0; it<nTracks; it++){
378 AliESDtrack* tr=esd->GetTrack(it);
379 UInt_t status=tr->GetStatus();
380 if(!(status&AliESDtrack::kITSrefit)) continue;
381 if(!(status&AliESDtrack::kTPCin)) continue;
382 nSelTracks++;
383 }
384 fHistoSelTracks->Fill(nSelTracks);
385
386 const AliMultiplicity* mult=esd->GetMultiplicity();
387 Int_t nTracklets=mult->GetNumberOfTracklets();
7c3336d1 388 Int_t nTracklets1=0;
389 for(Int_t it=0; it<nTracklets; it++){
390 Double_t eta=TMath::Abs(mult->GetEta(it));
391 if(eta<1) nTracklets1++;
392 }
7b6a4dcd 393 fHistoTracklets->Fill(nTracklets);
7c3336d1 394 fHistoTrackletsEta1->Fill(nTracklets1);
395
7b6a4dcd 396 const AliESDVertex *spdv=esd->GetVertex();
397 if(spdv && spdv->IsFromVertexer3D()){
398 fHistoSPD3DVtxX->Fill(spdv->GetXv());
399 fHistoSPD3DVtxY->Fill(spdv->GetYv());
400 fHistoSPD3DVtxZ->Fill(spdv->GetZv());
401 }
402 if(spdv && spdv->IsFromVertexerZ()){
403 fHistoSPDZVtxX->Fill(spdv->GetXv());
404 fHistoSPDZVtxY->Fill(spdv->GetYv());
405 fHistoSPDZVtxZ->Fill(spdv->GetZv());
406 }
407 const AliESDVertex *trkv=esd->GetPrimaryVertex();
408 if(trkv && trkv->GetNContributors()>1){
409 fHistoTRKVtxX->Fill(trkv->GetXv());
410 fHistoTRKVtxY->Fill(trkv->GetYv());
411 fHistoTRKVtxZ->Fill(trkv->GetZv());
412 }
413
414 AliStack* stack=0;
7b6a4dcd 415 if(fReadMC){
416 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
417 if (!eventHandler) {
418 Printf("ERROR: Could not retrieve MC event handler");
419 return;
420 }
421 AliMCEvent* mcEvent = eventHandler->MCEvent();
422 if (!mcEvent) {
423 Printf("ERROR: Could not retrieve MC event");
424 return;
425 }
426 stack = mcEvent->Stack();
427 if (!stack) {
428 Printf("ERROR: stack not available");
429 return;
430 }
fcedd2b1 431 const AliVVertex* mcVert=mcEvent->GetPrimaryVertex();
432 if(!mcVert){
433 Printf("ERROR: generated vertex not available");
434 return;
435 }
7c569cb6 436 if(TMath::Abs(mcVert->GetZ())>10) return;
437
c7112a2a 438 // const AliHeader* h=(AliHeader*)mcEvent->GetHeader();
439 // cout<<h<<endl;
440 TString genname=mcEvent->GenEventHeader()->ClassName();
441 Int_t nColl=-1;
442 Int_t typeHF=-1;
443 TList* lgen=0x0;
444 if(genname.Contains("CocktailEventHeader")){
445 AliGenCocktailEventHeader *cockhead=(AliGenCocktailEventHeader*)mcEvent->GenEventHeader();
446 lgen=cockhead->GetHeaders();
447 for(Int_t ig=0; ig<lgen->GetEntries(); ig++){
448 AliGenerator* gen=(AliGenerator*)lgen->At(ig);
449 TString title=gen->GetName();
450 if(title.Contains("bchadr")) typeHF=1;
451 else if(title.Contains("chadr")) typeHF=0;
452 else if(title.Contains("bele")) typeHF=3;
453 else if(title.Contains("cele")) typeHF=2;
454 }
455 nColl=lgen->GetEntries();
c7112a2a 456 fHistNcollHFtype->Fill(typeHF,nColl);
457 }
7b6a4dcd 458 Int_t nParticles=stack->GetNtrack();
459 Double_t dNchdy = 0.;
460 Int_t nb = 0, nc=0;
a0dabf3d 461 Int_t nCharmed=0;
a35b52e8 462 Int_t nPhysPrim=0;
7b6a4dcd 463 for (Int_t i=0;i<nParticles;i++){
464 TParticle* part = (TParticle*)stack->Particle(i);
465 Int_t absPdg=TMath::Abs(part->GetPdgCode());
a916dfdb 466 Int_t pdg=part->GetPdgCode();
7b6a4dcd 467 if(absPdg==4) nc++;
468 if(absPdg==5) nb++;
469 if(stack->IsPhysicalPrimary(i)){
470 Double_t eta=part->Eta();
c7112a2a 471 fHistoEtaPhysPrim->Fill(eta);
7c569cb6 472 if(absPdg==11) fHistEtaPhiPtGenEle->Fill(eta,part->Phi(),part->Pt());
473 else if(absPdg==211) fHistEtaPhiPtGenPi->Fill(eta,part->Phi(),part->Pt());
474 else if(absPdg==321) fHistEtaPhiPtGenK->Fill(eta,part->Phi(),part->Pt());
475 else if(absPdg==2212) fHistEtaPhiPtGenPro->Fill(eta,part->Phi(),part->Pt());
476
a35b52e8 477 if(TMath::Abs(eta)<0.5){
478 dNchdy+=0.6666; // 2/3 for the ratio charged/all
479 nPhysPrim++;
480 }
a916dfdb 481 if(TMath::Abs(eta)<0.9){
482 fHistoPtPhysPrim->Fill(part->Pt());
483 }
7b6a4dcd 484 }
5f7f126e 485 Float_t rapid=-999.;
486 if (part->Energy() != TMath::Abs(part->Pz())){
487 rapid=0.5*TMath::Log((part->Energy()+part->Pz())/(part->Energy()-part->Pz()));
488 }
5472ae5b 489
490
7b6a4dcd 491 Int_t iPart=-1;
492 Int_t iType=0;
5472ae5b 493 Int_t iSpecies=-1;
ee9c9d9b 494 Int_t dummy[4];
5472ae5b 495 if(absPdg==421){
496 iSpecies=0;
ee9c9d9b 497 iType=AliVertexingHFUtils::CheckD0Decay(stack,i,dummy);
498 if(iType>0) iPart=0;
7b6a4dcd 499 }
500 else if(absPdg==411){
5472ae5b 501 iSpecies=1;
ee9c9d9b 502 iType=AliVertexingHFUtils::CheckDplusDecay(stack,i,dummy);
503 if(iType>0) iPart=1;
7b6a4dcd 504 }
505 else if(absPdg==413){
5472ae5b 506 iSpecies=2;
ee9c9d9b 507 iType=AliVertexingHFUtils::CheckDstarDecay(stack,i,dummy);
508 if(iType>0) iPart=2;
7b6a4dcd 509 }
510 else if(absPdg==431){
5472ae5b 511 iSpecies=3;
ee9c9d9b 512 iType=AliVertexingHFUtils::CheckDsDecay(stack,i,dummy);
513 if(iType==1 || iType==2) iPart=3;
7b6a4dcd 514 }
515 else if(absPdg==4122){
5472ae5b 516 iSpecies=4;
7b6a4dcd 517 iType=CheckLcDecay(i,stack);
518 if(iType>=0) iPart=4;
519 }
a35b52e8 520 if(iSpecies>=0) fHistYPtAllDecay[iSpecies]->Fill(part->Pt(),rapid);
521
522 // check beauty mesons
523 if(absPdg==511) fHistBYPtAllDecay[0]->Fill(part->Pt(),rapid);
524 else if(absPdg==521) fHistBYPtAllDecay[1]->Fill(part->Pt(),rapid);
525 else if(absPdg==513) fHistBYPtAllDecay[2]->Fill(part->Pt(),rapid);
526 else if(absPdg==531) fHistBYPtAllDecay[3]->Fill(part->Pt(),rapid);
527 else if(absPdg==5122) fHistBYPtAllDecay[4]->Fill(part->Pt(),rapid);
528
a916dfdb 529 if(pdg==511) fHistBSpecies->Fill(0);
530 else if(pdg==-511) fHistBSpecies->Fill(1);
531 else if(pdg==521) fHistBSpecies->Fill(2);
532 else if(pdg==-521) fHistBSpecies->Fill(3);
533 else if(pdg==513) fHistBSpecies->Fill(4);
534 else if(pdg==-513) fHistBSpecies->Fill(5);
535 else if(pdg==531) fHistBSpecies->Fill(6);
536 else if(pdg==-531) fHistBSpecies->Fill(7);
537 else if(pdg==5122) fHistBSpecies->Fill(8);
538 else if(pdg==-5122) fHistBSpecies->Fill(9);
539
540 if(iSpecies<0) continue; // not a charm meson
541
542 if(pdg==421) fHistDSpecies->Fill(0);
543 else if(pdg==-421) fHistDSpecies->Fill(1);
544 else if(pdg==411) fHistDSpecies->Fill(2);
545 else if(pdg==-411) fHistDSpecies->Fill(3);
546 else if(pdg==413) fHistDSpecies->Fill(4);
547 else if(pdg==-413) fHistDSpecies->Fill(5);
548 else if(pdg==431) fHistDSpecies->Fill(6);
549 else if(pdg==-431) fHistDSpecies->Fill(7);
550 else if(pdg==4122) fHistDSpecies->Fill(8);
551 else if(pdg==-4122) fHistDSpecies->Fill(9);
5472ae5b 552
fcedd2b1 553 Double_t distx=part->Vx()-mcVert->GetX();
554 Double_t disty=part->Vy()-mcVert->GetY();
555 Double_t distz=part->Vz()-mcVert->GetZ();
556 Double_t distToVert=TMath::Sqrt(distx*distx+disty*disty+distz*distz);
c833b704 557 fHistMotherID->Fill(part->GetFirstMother());
ee9c9d9b 558 Int_t iFromB=AliVertexingHFUtils::CheckOrigin(stack,part,fSearchUpToQuark);
559 if(iFromB==4){
fcedd2b1 560 fHistYPtPromptAllDecay[iSpecies]->Fill(part->Pt(),rapid);
561 fHistOriginPrompt->Fill(distToVert);
562 }
ee9c9d9b 563 else if(iFromB==5){
fcedd2b1 564 fHistYPtFeeddownAllDecay[iSpecies]->Fill(part->Pt(),rapid);
565 fHistOriginFeeddown->Fill(distToVert);
566 }
5472ae5b 567
568 if(iPart<0) continue;
569 if(iType<0) continue;
570 nCharmed++;
ee9c9d9b 571 if(iPart==0 && iType>0 && iType<=2){
572 fHistYPtD0byDecChannel[iType-1]->Fill(part->Pt(),rapid);
573 }else if(iPart==1 && iType>0 && iType<=2){
574 fHistYPtDplusbyDecChannel[iType-1]->Fill(part->Pt(),rapid);
575 }else if(iPart==3 && iType>0 && iType<=2){
576 fHistYPtDsbyDecChannel[iType-1]->Fill(part->Pt(),rapid);
5472ae5b 577 }
578
ee9c9d9b 579 if(iFromB==4 && iPart>=0 && iPart<5) fHistYPtPrompt[iPart]->Fill(part->Pt(),rapid);
580 else if(iFromB==5 && iPart>=0 && iPart<5) fHistYPtFeeddown[iPart]->Fill(part->Pt(),rapid);
7b6a4dcd 581 }
fcedd2b1 582
7c569cb6 583 for(Int_t i=0; i<nTracks; i++){
584 AliESDtrack* track=esd->GetTrack(i);
585 if(fESDtrackCuts->AcceptTrack(track)){
586 Int_t label=TMath::Abs(track->GetLabel());
587 if(stack->IsPhysicalPrimary(label)){
588 TParticle* part = (TParticle*)stack->Particle(label);
589 Int_t absPdg=TMath::Abs(part->GetPdgCode());
590 Double_t eta=part->Eta();
591 if(absPdg==11) fHistEtaPhiPtRecEle->Fill(eta,part->Phi(),part->Pt());
592 else if(absPdg==211) fHistEtaPhiPtRecPi->Fill(eta,part->Phi(),part->Pt());
593 else if(absPdg==321) fHistEtaPhiPtRecK->Fill(eta,part->Phi(),part->Pt());
594 else if(absPdg==2212) fHistEtaPhiPtRecPro->Fill(eta,part->Phi(),part->Pt());
595 }
596 }
597 }
7b6a4dcd 598 fHistoNcharmed->Fill(dNchdy,nCharmed);
599 fHistoNbVsNc->Fill(nc,nb);
a35b52e8 600 fHistoPhysPrim->Fill(nPhysPrim);
7b6a4dcd 601 }
602
603 PostData(1,fOutput);
604
605}
606//______________________________________________________________________________
607void AliAnalysisTaskCheckHFMCProd::Terminate(Option_t */*option*/)
608{
609 // Terminate analysis
610 fOutput = dynamic_cast<TList*> (GetOutputData(1));
611 if (!fOutput) {
612 printf("ERROR: fOutput not available\n");
613 return;
614 }
615
616 return;
617}
618
619
620
621
7b6a4dcd 622//______________________________________________________________________________
623Int_t AliAnalysisTaskCheckHFMCProd::CheckLcDecay(Int_t labLc, AliStack* stack) const{
624 if(labLc<0) return -1;
625 TParticle* dp = (TParticle*)stack->Particle(labLc);
626 Int_t pdgdp=dp->GetPdgCode();
627 Int_t nDau=dp->GetNDaughters();
7b6a4dcd 628
629 if(nDau==3){
630 Int_t nKaons=0;
631 Int_t nPions=0;
632 Int_t nProtons=0;
633 for(Int_t iDau=dp->GetFirstDaughter(); iDau<=dp->GetLastDaughter(); iDau++){
634 if(iDau<0) return -1;
635 TParticle* dau=(TParticle*)stack->Particle(iDau);
636 Int_t pdgdau=dau->GetPdgCode();
637 if(TMath::Abs(pdgdau)==321){
638 if(pdgdp>0 && pdgdau>0) return -1;
639 if(pdgdp<0 && pdgdau<0) return -1;
640 nKaons++;
641 }else if(TMath::Abs(pdgdau)==211){
642 if(pdgdp<0 && pdgdau>0) return -1;
643 if(pdgdp>0 && pdgdau<0) return -1;
644 nPions++;
645 }else if(TMath::Abs(pdgdau)==2212){
646 if(pdgdp<0 && pdgdau>0) return -1;
647 if(pdgdp>0 && pdgdau<0) return -1;
648 nProtons++;
649 }else{
650 return -1;
651 }
652 }
653 if(nPions!=1) return -1;
654 if(nKaons!=1) return -1;
655 if(nProtons!=1) return -1;
656 for(Int_t iDau=dp->GetFirstDaughter(); iDau<=dp->GetLastDaughter(); iDau++){
657 if(iDau<0) return -1;
658 }
659 return 0;
660 }
661
662 if(nDau==2){
663 Int_t nKaons=0;
664 Int_t nPions=0;
665 Int_t nProtons=0;
666 for(Int_t iDau=dp->GetFirstDaughter(); iDau<=dp->GetLastDaughter(); iDau++){
667 if(iDau<0) return -1;
668 TParticle* dau=(TParticle*)stack->Particle(iDau);
669 Int_t pdgdau=dau->GetPdgCode();
670 if(TMath::Abs(pdgdau)==313 || TMath::Abs(pdgdau)==3124 || TMath::Abs(pdgdau)==2224
671 || TMath::Abs(pdgdau)==3122 || TMath::Abs(pdgdau)==311){
672 Int_t nDauRes=dau->GetNDaughters();
673 if(nDauRes!=2) return -1;
674 for(Int_t resDau=dau->GetFirstDaughter(); resDau<=dau->GetLastDaughter(); resDau++){
675 if(resDau<0) return -1;
676 TParticle* resdau=(TParticle*)stack->Particle(resDau);
677 Int_t pdgresdau=resdau->GetPdgCode();
678 if(TMath::Abs(pdgresdau)==321){
679 if(pdgdp>0 && pdgresdau>0) return -1;
680 if(pdgdp<0 && pdgresdau<0) return -1;
681 nKaons++;
682 }
683 if(TMath::Abs(pdgresdau)==211){
684 if(pdgdp<0 && pdgresdau>0) return -1;
685 if(pdgdp>0 && pdgresdau<0) return -1;
686 nPions++;
687 }
688 if(TMath::Abs(pdgresdau)==2212){
689 if(pdgdp<0 && pdgresdau>0) return -1;
690 if(pdgdp>0 && pdgresdau<0) return -1;
691 nProtons++;
692 }
693 }
694 }else if(TMath::Abs(pdgdau)==321){
695 if(pdgdp>0 && pdgdau>0) return -1;
696 if(pdgdp<0 && pdgdau<0) return -1;
697 nKaons++;
698 }else if(TMath::Abs(pdgdau)==211){
699 if(pdgdp<0 && pdgdau>0) return -1;
700 if(pdgdp>0 && pdgdau<0) return -1;
701 nPions++;
702 }else if(TMath::Abs(pdgdau)==2212){
703 if(pdgdp<0 && pdgdau>0) return -1;
704 if(pdgdp>0 && pdgdau<0) return -1;
705 nProtons++;
706 }else{
707 return -1;
708 }
709 }
710 if(nPions!=1) return -1;
711 if(nKaons!=1) return -1;
712 if(nProtons!=1) return -1;
713 for(Int_t iDau=dp->GetFirstDaughter(); iDau<=dp->GetLastDaughter(); iDau++){
714 if(iDau<0) return -1;
715 }
716 return 1;
717 }
718 return -1;
719}
720