3 // Jet model task to merge to existing branches
4 // only implemented for track branches
8 #include "AliJetFastSimulation.h"
10 #include <TClonesArray.h>
12 #include <TLorentzVector.h>
13 #include <TParticle.h>
14 #include <TParticlePDG.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"
27 #include "AliPicoTrack.h"
29 #include "AliRunLoader.h"
32 #include "AliVCluster.h"
33 #include "AliVEvent.h"
35 ClassImp(AliJetFastSimulation)
37 //________________________________________________________________________
38 AliJetFastSimulation::AliJetFastSimulation() :
39 AliAnalysisTaskEmcal("AliJetFastSimulation",kTRUE),
44 fEfficiencyFixed(1.1),
54 fUseTrPtResolutionSmearing(kFALSE),
55 fUseDiceEfficiency(kFALSE),
56 fDiceEfficiencyMinPt(-1.),
57 fUseTrPtResolutionFromOADB(kFALSE),
58 fUseTrEfficiencyFromOADB(kFALSE),
59 fPathTrPtResolution(""),
60 fPathTrEfficiency(""),
66 // Default constructor.
67 SetMakeGeneralHistograms(kTRUE);
70 //________________________________________________________________________
71 AliJetFastSimulation::AliJetFastSimulation(const char *name) :
72 AliAnalysisTaskEmcal(name,kTRUE),
77 fEfficiencyFixed(1.1),
87 fUseTrPtResolutionSmearing(kFALSE),
88 fUseDiceEfficiency(kFALSE),
89 fDiceEfficiencyMinPt(-1.),
90 fUseTrPtResolutionFromOADB(kFALSE),
91 fUseTrEfficiencyFromOADB(kFALSE),
92 fPathTrPtResolution(""),
93 fPathTrEfficiency(""),
99 // Standard constructor.
100 SetMakeGeneralHistograms(kTRUE);
103 //________________________________________________________________________
104 AliJetFastSimulation::~AliJetFastSimulation()
111 //________________________________________________________________________
112 void AliJetFastSimulation::ExecOnce()
116 AliAnalysisTaskEmcal::ExecOnce();
118 if(!fRandom) fRandom = new TRandom3(0);
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()));
128 InputEvent()->AddObject(fTracksOut);
132 //________________________________________________________________________
133 void AliJetFastSimulation::LocalInit() {
134 //initialize track response
135 if(fUseTrPtResolutionFromOADB) LoadTrPtResolutionRootFileFromOADB();
136 if(fUseTrEfficiencyFromOADB) LoadTrEfficiencyRootFileFromOADB();
137 FitMomentumResolution();
140 //________________________________________________________________________
141 void AliJetFastSimulation::UserCreateOutputObjects()
143 AliAnalysisTaskEmcal::UserCreateOutputObjects();
145 const Int_t nBinPt = 100;
146 Double_t binLimitsPt[nBinPt+1];
147 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
149 binLimitsPt[iPt] = 0.0;
151 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 1.0;
155 fHistPtDet = new TH1F("fHistpt","fHistPtDet;#it{p}_{T};N",nBinPt,binLimitsPt);
156 fOutput->Add(fHistPtDet);
158 fh2PtGenPtSmeared = new TH2F("fh2PtGenPtSmeared","fh2PtGenPtSmeared",nBinPt,binLimitsPt,nBinPt,binLimitsPt);
159 fOutput->Add(fh2PtGenPtSmeared);
161 fp1Efficiency = new TProfile("fp1Efficiency","fp1Efficiency",nBinPt,binLimitsPt);
162 fOutput->Add(fp1Efficiency);
164 fp1PtResolution = new TProfile("fp1PtResolution","fp1PtResolution",nBinPt,binLimitsPt);
165 fOutput->Add(fp1PtResolution);
167 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
171 //________________________________________________________________________
172 Bool_t AliJetFastSimulation::Run()
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;
182 if(fEfficiencyFixed < 1.)
183 fUseDiceEfficiency = 1; // 1 is the default; 2 can be set by user but not implemented
185 if(!fhEffH1 && fNTrackClasses>0 )
186 fUseDiceEfficiency = 0;
187 if(!fhEffH2 && fNTrackClasses>1 )
188 fUseDiceEfficiency = 0;
189 if(!fhEffH3 && fNTrackClasses>2 )
190 fUseDiceEfficiency = 0;
193 fTracksOut->Delete();
198 //________________________________________________________________________
199 void AliJetFastSimulation::SimulateTracks()
201 //Apply toy detector simulation to tracks
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));
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;
215 AliPicoTrack *track = NULL;
216 if(fUseTrPtResolutionSmearing) {
217 track = SmearPt(picotrack,eff,rnd);
218 (*fTracksOut)[it] = track;
220 track = new ((*fTracksOut)[it]) AliPicoTrack(*picotrack);
222 track->SetBit(TObject::kBitMask,1);
223 fHistPtDet->Fill(track->Pt());
228 //________________________________________________________________________
229 Bool_t AliJetFastSimulation::DiceEfficiency(AliPicoTrack *vp, Double_t eff[3], Double_t rnd)
231 // Dice to decide if particle is kept or not - toy model for efficiency
233 Double_t sumEff = 0.;
236 if(fEfficiencyFixed<1.)
237 sumEff = fEfficiencyFixed;
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));
246 sumEff = eff[0]+eff[1]+eff[2];
248 fp1Efficiency->Fill(vp->Pt(),sumEff);
249 if(rnd>sumEff && pT > fDiceEfficiencyMinPt) return kFALSE;
253 //________________________________________________________________________
254 AliPicoTrack* AliJetFastSimulation::SmearPt(AliPicoTrack *vp, Double_t eff[3], Double_t rnd)
256 //Smear momentum of generated particle
258 Double_t pT = vp->Pt();
259 //Select hybrid track category
261 //Sort efficiencies from large to small
263 TMath::Sort(3,eff,cat);
265 smear = GetMomentumSmearing(cat[2],pT);
266 else if(rnd<=(eff[cat[2]]+eff[cat[1]]))
267 smear = GetMomentumSmearing(cat[1],pT);
269 smear = GetMomentumSmearing(cat[0],pT);
271 fp1PtResolution->Fill(vp->Pt(),smear);
273 Double_t sigma = vp->Pt()*smear;
274 Double_t pTrec = fRandom->Gaus(vp->Pt(),sigma);
275 fh2PtGenPtSmeared->Fill(vp->Pt(),pTrec);
277 AliPicoTrack *picotrack = new AliPicoTrack(pTrec,
282 AliPicoTrack::GetTrackType(vp),
283 vp->GetTrackEtaOnEMCal(),
284 vp->GetTrackPhiOnEMCal(),
285 vp->GetTrackPtOnEMCal(),
287 0.13957); //assume pion mass
291 //________________________________________________________________________
292 Double_t AliJetFastSimulation::GetMomentumSmearing(Int_t cat, Double_t pt) {
295 // Get smearing on generated momentum
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");
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);
313 Int_t bin = fMomRes->FindBin(pt);
314 smear = fRandom->Gaus(fMomRes->GetBinContent(bin),fMomRes->GetBinError(bin));
317 if(fMomRes) delete fMomRes;
322 //________________________________________________________________________
323 void AliJetFastSimulation::LoadTrPtResolutionRootFileFromOADB() {
325 if (!gGrid && fPathTrPtResolution.Contains("alien://")) {
326 AliInfo("Trying to connect to AliEn ...");
327 TGrid::Connect("alien://");
330 TFile *f = TFile::Open(fPathTrPtResolution.Data());
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");
339 SetSmearResolution(kTRUE);
340 SetMomentumResolutionHybrid(fProfPtPtSigma1PtGlobSt,fProfPtPtSigma1PtGlobCnoSPD,fProfPtPtSigma1PtGlobCnoITS);
343 //________________________________________________________________________
344 void AliJetFastSimulation::LoadTrEfficiencyRootFileFromOADB() {
346 if (!gGrid && fPathTrPtResolution.Contains("alien://")) {
347 AliInfo("Trying to connect to AliEn ...");
348 TGrid::Connect("alien://");
351 TFile *f = TFile::Open(fPathTrEfficiency.Data());
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");
360 SetDiceEfficiency(kTRUE);
361 SetEfficiencyHybrid(hEffPosGlobSt,hEffPosGlobCnoSPD,hEffPosGlobCnoITS);
364 //________________________________________________________________________
365 void AliJetFastSimulation::SetMomentumResolutionHybrid(TProfile *p1, TProfile *p2, TProfile *p3) {
367 // set mom res profiles
369 if(fMomResH1) delete fMomResH1;
370 if(fMomResH2) delete fMomResH2;
371 if(fMomResH3) delete fMomResH3;
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");
378 //________________________________________________________________________
379 void AliJetFastSimulation:: SetEfficiencyHybrid(TH1 *h1, TH1 *h2, TH1 *h3) {
381 // set tracking efficiency histos
383 if(h1) fhEffH1 = (TH1*)h1->Clone("fhEffH1");
384 if(h2) fhEffH2 = (TH1*)h2->Clone("fhEffH2");
385 if(h3) fhEffH3 = (TH1*)h3->Clone("fhEffH3");
388 //________________________________________________________________________
389 void AliJetFastSimulation::FitMomentumResolution() {
391 // Fit linear function on momentum resolution at high pT
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.);
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.);
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.);