]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/EMCALJetTasks/AliJetFastSimulation.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / PWGJE / EMCALJetTasks / AliJetFastSimulation.cxx
CommitLineData
b3821b05 1// $Id$
2//
3// Jet model task to merge to existing branches
4// only implemented for track branches
5//
6// Author: M. Verweij
7
8#include "AliJetFastSimulation.h"
9
10#include <TClonesArray.h>
11#include <TFolder.h>
12#include <TLorentzVector.h>
13#include <TParticle.h>
14#include <TParticlePDG.h>
15#include <TRandom3.h>
16#include <TProfile.h>
17#include <TGrid.h>
18#include <TFile.h>
19#include <TF1.h>
20#include "AliAnalysisManager.h"
21#include "AliEMCALDigit.h"
22#include "AliEMCALGeometry.h"
23#include "AliEMCALRecPoint.h"
24#include "AliGenerator.h"
25#include "AliHeader.h"
26#include "AliLog.h"
27#include "AliPicoTrack.h"
28#include "AliRun.h"
29#include "AliRunLoader.h"
30#include "AliStack.h"
31#include "AliStack.h"
32#include "AliVCluster.h"
33#include "AliVEvent.h"
34
35ClassImp(AliJetFastSimulation)
36
37//________________________________________________________________________
38AliJetFastSimulation::AliJetFastSimulation() :
39AliAnalysisTaskEmcal("AliJetFastSimulation",kTRUE),
40 fTracksOutName(""),
41 fTracksOut(0x0),
42 fNTrackClasses(2),
43 fRandom(0),
689017c8 44 fEfficiencyFixed(1.1),
b3821b05 45 fMomResH1(0x0),
46 fMomResH2(0x0),
47 fMomResH3(0x0),
48 fMomResH1Fit(0x0),
49 fMomResH2Fit(0x0),
50 fMomResH3Fit(0x0),
51 fhEffH1(0x0),
52 fhEffH2(0x0),
53 fhEffH3(0x0),
54 fUseTrPtResolutionSmearing(kFALSE),
55 fUseDiceEfficiency(kFALSE),
56 fDiceEfficiencyMinPt(-1.),
57 fUseTrPtResolutionFromOADB(kFALSE),
58 fUseTrEfficiencyFromOADB(kFALSE),
59 fPathTrPtResolution(""),
60 fPathTrEfficiency(""),
61 fHistPtDet(0),
62 fh2PtGenPtSmeared(0),
63 fp1Efficiency(0),
64 fp1PtResolution(0)
65{
66 // Default constructor.
67 SetMakeGeneralHistograms(kTRUE);
68}
69
70//________________________________________________________________________
71AliJetFastSimulation::AliJetFastSimulation(const char *name) :
72 AliAnalysisTaskEmcal(name,kTRUE),
73 fTracksOutName(""),
74 fTracksOut(0x0),
75 fNTrackClasses(2),
76 fRandom(0),
689017c8 77 fEfficiencyFixed(1.1),
b3821b05 78 fMomResH1(0x0),
79 fMomResH2(0x0),
80 fMomResH3(0x0),
81 fMomResH1Fit(0x0),
82 fMomResH2Fit(0x0),
83 fMomResH3Fit(0x0),
84 fhEffH1(0x0),
85 fhEffH2(0x0),
86 fhEffH3(0x0),
87 fUseTrPtResolutionSmearing(kFALSE),
88 fUseDiceEfficiency(kFALSE),
89 fDiceEfficiencyMinPt(-1.),
90 fUseTrPtResolutionFromOADB(kFALSE),
91 fUseTrEfficiencyFromOADB(kFALSE),
92 fPathTrPtResolution(""),
93 fPathTrEfficiency(""),
94 fHistPtDet(0),
95 fh2PtGenPtSmeared(0),
96 fp1Efficiency(0),
97 fp1PtResolution(0)
98{
99 // Standard constructor.
100 SetMakeGeneralHistograms(kTRUE);
101}
102
103//________________________________________________________________________
104AliJetFastSimulation::~AliJetFastSimulation()
105{
106 // Destructor
107
108 delete fRandom;
109}
110
111//________________________________________________________________________
112void AliJetFastSimulation::ExecOnce()
113{
114 // Exec only once.
115
116 AliAnalysisTaskEmcal::ExecOnce();
117
118 if(!fRandom) fRandom = new TRandom3(0);
119
120 if (!fTracksOutName.IsNull()) {
121 fTracksOut = new TClonesArray("AliPicoTrack");
122 fTracksOut->SetName(fTracksOutName);
123 if (InputEvent()->FindListObject(fTracksOutName)) {
124 AliFatal(Form("%s: Collection %s is already present in the event!", GetName(), fTracksOutName.Data()));
125 return;
126 }
127 else {
128 InputEvent()->AddObject(fTracksOut);
129 }
130 }
131}
132//________________________________________________________________________
133void AliJetFastSimulation::LocalInit() {
134 //initialize track response
135 if(fUseTrPtResolutionFromOADB) LoadTrPtResolutionRootFileFromOADB();
136 if(fUseTrEfficiencyFromOADB) LoadTrEfficiencyRootFileFromOADB();
137 FitMomentumResolution();
138}
139
140//________________________________________________________________________
141void AliJetFastSimulation::UserCreateOutputObjects()
142{
143 AliAnalysisTaskEmcal::UserCreateOutputObjects();
144
145 const Int_t nBinPt = 100;
146 Double_t binLimitsPt[nBinPt+1];
147 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
148 if(iPt == 0){
149 binLimitsPt[iPt] = 0.0;
150 } else {// 1.0
151 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
152 }
153 }
154
155 fHistPtDet = new TH1F("fHistpt","fHistPtDet;#it{p}_{T};N",nBinPt,binLimitsPt);
156 fOutput->Add(fHistPtDet);
157
158 fh2PtGenPtSmeared = new TH2F("fh2PtGenPtSmeared","fh2PtGenPtSmeared",nBinPt,binLimitsPt,nBinPt,binLimitsPt);
159 fOutput->Add(fh2PtGenPtSmeared);
160
161 fp1Efficiency = new TProfile("fp1Efficiency","fp1Efficiency",nBinPt,binLimitsPt);
162 fOutput->Add(fp1Efficiency);
163
164 fp1PtResolution = new TProfile("fp1PtResolution","fp1PtResolution",nBinPt,binLimitsPt);
165 fOutput->Add(fp1PtResolution);
166
167 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
168}
169
170
171//________________________________________________________________________
172Bool_t AliJetFastSimulation::Run()
173{
174 //Check if information is provided detector level effects
175 if(!fMomResH1 && fNTrackClasses>0 )
176 fUseTrPtResolutionSmearing = 0;
177 if(!fMomResH2 && fNTrackClasses>1 )
178 fUseTrPtResolutionSmearing = 0;
179 if(!fMomResH3 && fNTrackClasses>2 )
180 fUseTrPtResolutionSmearing = 0;
181
689017c8 182 if(fEfficiencyFixed < 1.)
b3821b05 183 fUseDiceEfficiency = 1; // 1 is the default; 2 can be set by user but not implemented
184 else {
185 if(!fhEffH1 && fNTrackClasses>0 )
186 fUseDiceEfficiency = 0;
187 if(!fhEffH2 && fNTrackClasses>1 )
188 fUseDiceEfficiency = 0;
189 if(!fhEffH3 && fNTrackClasses>2 )
190 fUseDiceEfficiency = 0;
191 }
192
3c923384 193 fTracksOut->Delete();
b3821b05 194 SimulateTracks();
195 return kTRUE;
196}
197
198//________________________________________________________________________
199void AliJetFastSimulation::SimulateTracks()
200{
201 //Apply toy detector simulation to tracks
4ccfe90c 202 Int_t it = 0;
b3821b05 203 const Int_t nTracks = fTracks->GetEntriesFast();
204 for (Int_t i = 0; i < nTracks; ++i) {
205 AliPicoTrack *picotrack = static_cast<AliPicoTrack*>(fTracks->At(i));
206 if (!picotrack)
207 continue;
208
209 Bool_t accept = kTRUE;
210 Double_t eff[3] = {0};
211 Double_t rnd = fRandom->Uniform(1.);
212 if(fUseDiceEfficiency) accept = DiceEfficiency(picotrack,eff,rnd);
213 if(!accept) continue;
214
215 AliPicoTrack *track = NULL;
216 if(fUseTrPtResolutionSmearing) {
217 track = SmearPt(picotrack,eff,rnd);
4ccfe90c 218 (*fTracksOut)[it] = track;
b3821b05 219 } else
4ccfe90c 220 track = new ((*fTracksOut)[it]) AliPicoTrack(*picotrack);
b3821b05 221
222 track->SetBit(TObject::kBitMask,1);
223 fHistPtDet->Fill(track->Pt());
4ccfe90c 224 it++;
b3821b05 225 }
226}
227
228//________________________________________________________________________
229Bool_t AliJetFastSimulation::DiceEfficiency(AliPicoTrack *vp, Double_t eff[3], Double_t rnd)
230{
231 // Dice to decide if particle is kept or not - toy model for efficiency
232 //
233 Double_t sumEff = 0.;
234 Double_t pT = 0.;
235
236 if(fEfficiencyFixed<1.)
237 sumEff = fEfficiencyFixed;
238 else {
239 pT = vp->Pt();
240 Double_t pTtmp = pT;
241 if(pT>10.) pTtmp = 10.;
242 if(fhEffH1) eff[0] = fhEffH1->GetBinContent(fhEffH1->FindBin(pTtmp));
243 if(fhEffH2) eff[1] = fhEffH2->GetBinContent(fhEffH2->FindBin(pTtmp));
244 if(fhEffH3) eff[2] = fhEffH3->GetBinContent(fhEffH3->FindBin(pTtmp));
245
246 sumEff = eff[0]+eff[1]+eff[2];
247 }
248 fp1Efficiency->Fill(vp->Pt(),sumEff);
249 if(rnd>sumEff && pT > fDiceEfficiencyMinPt) return kFALSE;
250 return kTRUE;
251}
252
253//________________________________________________________________________
254AliPicoTrack* AliJetFastSimulation::SmearPt(AliPicoTrack *vp, Double_t eff[3], Double_t rnd)
255{
256 //Smear momentum of generated particle
257 Double_t smear = 1.;
258 Double_t pT = vp->Pt();
259 //Select hybrid track category
260
261 //Sort efficiencies from large to small
262 Int_t cat[3] = {0};
263 TMath::Sort(3,eff,cat);
264 if(rnd<=eff[cat[2]])
265 smear = GetMomentumSmearing(cat[2],pT);
266 else if(rnd<=(eff[cat[2]]+eff[cat[1]]))
267 smear = GetMomentumSmearing(cat[1],pT);
268 else
269 smear = GetMomentumSmearing(cat[0],pT);
270
271 fp1PtResolution->Fill(vp->Pt(),smear);
272
273 Double_t sigma = vp->Pt()*smear;
274 Double_t pTrec = fRandom->Gaus(vp->Pt(),sigma);
275 fh2PtGenPtSmeared->Fill(vp->Pt(),pTrec);
276
277 AliPicoTrack *picotrack = new AliPicoTrack(pTrec,
278 vp->Eta(),
279 vp->Phi(),
280 vp->Charge(),
281 vp->GetLabel(),
282 AliPicoTrack::GetTrackType(vp),
283 vp->GetTrackEtaOnEMCal(),
284 vp->GetTrackPhiOnEMCal(),
285 vp->GetTrackPtOnEMCal(),
286 vp->IsEMCAL(),
287 0.13957); //assume pion mass
288 return picotrack;
289}
290
291//________________________________________________________________________
292Double_t AliJetFastSimulation::GetMomentumSmearing(Int_t cat, Double_t pt) {
293
294 //
295 // Get smearing on generated momentum
296 //
297
298 TProfile *fMomRes = 0x0;
299 if(cat==1 && fMomResH1) fMomRes = (TProfile*)fMomResH1->Clone("fMomRes");
300 if(cat==2 && fMomResH2) fMomRes = (TProfile*)fMomResH2->Clone("fMomRes");
301 if(cat==3 && fMomResH3) fMomRes = (TProfile*)fMomResH3->Clone("fMomRes");
302
303 if(!fMomRes)
304 return 0.;
305
306 Double_t smear = 0.;
307 if(pt>20.) {
308 if(cat==1 && fMomResH1Fit) smear = fMomResH1Fit->Eval(pt);
309 if(cat==2 && fMomResH2Fit) smear = fMomResH2Fit->Eval(pt);
310 if(cat==3 && fMomResH3Fit) smear = fMomResH3Fit->Eval(pt);
311 }
312 else {
313 Int_t bin = fMomRes->FindBin(pt);
314 smear = fRandom->Gaus(fMomRes->GetBinContent(bin),fMomRes->GetBinError(bin));
315 }
316
317 if(fMomRes) delete fMomRes;
318
319 return smear;
320}
321
322//________________________________________________________________________
323void AliJetFastSimulation::LoadTrPtResolutionRootFileFromOADB() {
324
325 if (!gGrid && fPathTrPtResolution.Contains("alien://")) {
326 AliInfo("Trying to connect to AliEn ...");
327 TGrid::Connect("alien://");
328 }
329
330 TFile *f = TFile::Open(fPathTrPtResolution.Data());
331 if(!f)return;
332 TProfile *fProfPtPtSigma1PtGlobSt = NULL;
333 TProfile *fProfPtPtSigma1PtGlobCnoSPD = NULL;
334 TProfile *fProfPtPtSigma1PtGlobCnoITS = NULL;
335 if(fNTrackClasses>0) fProfPtPtSigma1PtGlobSt = (TProfile*)f->Get("fProfPtPtSigma1PtGlobSt");
336 if(fNTrackClasses>1) fProfPtPtSigma1PtGlobCnoSPD = (TProfile*)f->Get("fProfPtPtSigma1PtGlobCnoSPD");
337 if(fNTrackClasses>2) fProfPtPtSigma1PtGlobCnoITS = (TProfile*)f->Get("fProfPtPtSigma1PtGlobCnoITS");
338
339 SetSmearResolution(kTRUE);
340 SetMomentumResolutionHybrid(fProfPtPtSigma1PtGlobSt,fProfPtPtSigma1PtGlobCnoSPD,fProfPtPtSigma1PtGlobCnoITS);
341}
342
343//________________________________________________________________________
344void AliJetFastSimulation::LoadTrEfficiencyRootFileFromOADB() {
345
346 if (!gGrid && fPathTrPtResolution.Contains("alien://")) {
347 AliInfo("Trying to connect to AliEn ...");
348 TGrid::Connect("alien://");
349 }
350
351 TFile *f = TFile::Open(fPathTrEfficiency.Data());
352 if(!f)return;
353 TH1D *hEffPosGlobSt = NULL;
354 TH1D *hEffPosGlobCnoSPD = NULL;
355 TH1D *hEffPosGlobCnoITS = NULL;
356 if(fNTrackClasses>0) hEffPosGlobSt = (TH1D*)f->Get("hEffPosGlobSt");
357 if(fNTrackClasses>1) hEffPosGlobCnoSPD = (TH1D*)f->Get("hEffPosGlobCnoSPD");
358 if(fNTrackClasses>2) hEffPosGlobCnoITS = (TH1D*)f->Get("hEffPosGlobCnoITS");
359
360 SetDiceEfficiency(kTRUE);
361 SetEfficiencyHybrid(hEffPosGlobSt,hEffPosGlobCnoSPD,hEffPosGlobCnoITS);
362}
363
364//________________________________________________________________________
365void AliJetFastSimulation::SetMomentumResolutionHybrid(TProfile *p1, TProfile *p2, TProfile *p3) {
366 //
367 // set mom res profiles
368 //
369 if(fMomResH1) delete fMomResH1;
370 if(fMomResH2) delete fMomResH2;
371 if(fMomResH3) delete fMomResH3;
372
373 if(p1) fMomResH1 = new TProfile(*p1);//(TProfile*)p1->Clone("fMomResH1");
374 if(p2) fMomResH2 = new TProfile(*p2);//(TProfile*)p2->Clone("fMomResH2");
375 if(p3) fMomResH3 = new TProfile(*p3);//(TProfile*)p3->Clone("fMomResH3");
376}
377
378//________________________________________________________________________
379void AliJetFastSimulation:: SetEfficiencyHybrid(TH1 *h1, TH1 *h2, TH1 *h3) {
380 //
381 // set tracking efficiency histos
382 //
383 if(h1) fhEffH1 = (TH1*)h1->Clone("fhEffH1");
384 if(h2) fhEffH2 = (TH1*)h2->Clone("fhEffH2");
385 if(h3) fhEffH3 = (TH1*)h3->Clone("fhEffH3");
386}
387
388//________________________________________________________________________
389void AliJetFastSimulation::FitMomentumResolution() {
390 //
391 // Fit linear function on momentum resolution at high pT
392 //
393
394 if(!fMomResH1Fit && fMomResH1) {
395 fMomResH1Fit = new TF1("fMomResH1Fit","[0]+[1]*x",0.,200.);
396 fMomResH1->Fit(fMomResH1Fit,"LL V0","",5.,30.);
397 fMomResH1Fit ->SetRange(5.,100.);
398 }
399
400 if(!fMomResH2Fit && fMomResH2) {
401 fMomResH2Fit = new TF1("fMomResH2Fit","[0]+[1]*x",0.,200.);
402 fMomResH2->Fit(fMomResH2Fit,"LL V0","",5.,30.);
403 fMomResH2Fit ->SetRange(5.,100.);
404 }
405
406 if(!fMomResH3Fit && fMomResH3) {
407 fMomResH3Fit = new TF1("fMomResH3Fit","[0]+[1]*x",0.,200.);
408 fMomResH3->Fit(fMomResH3Fit,"LL V0","",5.,30.);
409 fMomResH3Fit ->SetRange(5.,100.);
410 }
411
412}
413
414