]>
Commit | Line | Data |
---|---|---|
57189f04 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, 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 | // // | |
19 | // Task for Heavy Flavour Electron-Hadron DeltaPhi Correlation // | |
20 | // Non-Photonic Electron identified with Invariant mass // | |
21 | // analysis methos in function SelectPhotonicElectron // | |
22 | // DeltaPhi calculated in function ElectronHadCorrel // | |
23 | // // | |
24 | // Author: Deepa Thomas (Utrecht University) // | |
25 | // // | |
26 | //////////////////////////////////////////////////////////////////////// | |
27 | ||
28 | #include "TChain.h" | |
29 | #include "TTree.h" | |
30 | #include "TH2F.h" | |
31 | #include "TMath.h" | |
32 | #include "TCanvas.h" | |
33 | #include "THnSparse.h" | |
34 | #include "TLorentzVector.h" | |
35 | #include "TString.h" | |
36 | #include "TFile.h" | |
37 | ||
38 | #include "AliAnalysisTask.h" | |
39 | #include "AliAnalysisManager.h" | |
40 | ||
41 | #include "AliESDEvent.h" | |
42 | #include "AliESDHandler.h" | |
43 | #include "AliAODEvent.h" | |
44 | #include "AliAODHandler.h" | |
45 | ||
46 | #include "AliAnalysisTaskElecHadronCorrel.h" | |
47 | #include "TGeoGlobalMagField.h" | |
48 | #include "AliLog.h" | |
49 | #include "AliAnalysisTaskSE.h" | |
50 | #include "TRefArray.h" | |
51 | #include "TVector.h" | |
52 | #include "AliESDInputHandler.h" | |
53 | #include "AliESDpid.h" | |
54 | #include "AliESDtrackCuts.h" | |
55 | #include "AliPhysicsSelection.h" | |
56 | #include "AliESDCaloCluster.h" | |
57 | #include "AliAODCaloCluster.h" | |
520a29a8 | 58 | #include "AliESDCaloTrigger.h" |
57189f04 | 59 | #include "AliEMCALRecoUtils.h" |
60 | #include "AliEMCALGeometry.h" | |
61 | #include "AliGeomManager.h" | |
62 | #include "stdio.h" | |
63 | #include "TGeoManager.h" | |
64 | #include "iostream" | |
65 | #include "fstream" | |
66 | ||
520a29a8 | 67 | #include "AliCentrality.h" |
57189f04 | 68 | #include "AliEMCALTrack.h" |
520a29a8 | 69 | //#include "AliEMCALTracker.h" |
57189f04 | 70 | #include "AliMagF.h" |
71 | ||
72 | #include "AliKFParticle.h" | |
73 | #include "AliKFVertex.h" | |
74 | ||
75 | #include "AliPID.h" | |
76 | #include "AliPIDResponse.h" | |
77 | #include "AliHFEcontainer.h" | |
78 | #include "AliHFEcuts.h" | |
79 | #include "AliHFEpid.h" | |
80 | #include "AliHFEpidBase.h" | |
81 | #include "AliHFEpidQAmanager.h" | |
82 | #include "AliHFEtools.h" | |
83 | #include "AliCFContainer.h" | |
84 | #include "AliCFManager.h" | |
85 | ||
86 | ClassImp(AliAnalysisTaskElecHadronCorrel) | |
87 | //________________________________________________________________________ | |
520a29a8 | 88 | AliAnalysisTaskElecHadronCorrel::AliAnalysisTaskElecHadronCorrel(const char *name) |
57189f04 | 89 | : AliAnalysisTaskSE(name) |
90 | ,fESD(0) | |
91 | ,fGeom(0) | |
92 | ,fOutputList(0) | |
520a29a8 | 93 | ,fTrackCuts1(new AliESDtrackCuts) |
94 | ,fTrackCuts2(new AliESDtrackCuts) | |
57189f04 | 95 | ,fCuts(0) |
96 | ,fIdentifiedAsOutInz(kFALSE) | |
97 | ,fPassTheEventCut(kFALSE) | |
98 | ,fRejectKinkMother(kFALSE) | |
99 | ,fVz(0.0) | |
100 | ,fCFM(0) | |
101 | ,fPID(0) | |
102 | ,fPIDqa(0) | |
103 | ,fOpeningAngleCut(0.1) | |
104 | ,fInvmassCut(0.01) | |
105 | ,fNoEvents(0) | |
106 | ,fTrkpt(0) | |
107 | ,fTrkEovPBef(0) | |
520a29a8 | 108 | ,fTrkEovPBefHad(0) |
57189f04 | 109 | ,fTrkEovPAft(0) |
520a29a8 | 110 | ,fTrkEovPAftOwn(0) |
57189f04 | 111 | ,fdEdxBef(0) |
112 | ,fdEdxAft(0) | |
520a29a8 | 113 | ,fdEdxAftOwn(0) |
57189f04 | 114 | ,fInvmassLS(0) |
115 | ,fInvmassULS(0) | |
116 | ,fOpeningAngleLS(0) | |
117 | ,fOpeningAngleULS(0) | |
118 | ,fSemiIncElecDphi(0) | |
119 | ,fPhotElecDphi(0) | |
120 | ,fInclusiveElecDphi(0) | |
121 | ,fDphiMassHigh(0) | |
122 | ,fDphiULSMassLow(0) | |
123 | ,fDphiLSMassLow(0) | |
520a29a8 | 124 | ,fDphiULSMassLowNoPartner(0) |
125 | ,fDphiLSMassLowNoPartner(0) | |
57189f04 | 126 | ,fPhotoElecPt(0) |
127 | ,fSemiInclElecPt(0) | |
520a29a8 | 128 | ,fInclusiveElecPt(0) |
129 | ,fULSElecPt(0) | |
130 | ,fLSElecPt(0) | |
57189f04 | 131 | ,fTrackPtBefTrkCuts(0) |
132 | ,fTrackPtAftTrkCuts(0) | |
520a29a8 | 133 | ,fTPCnsigma(0) |
134 | ,fTPCnsigmaAft(0) | |
135 | ,fTPCnsigmaAftOwn(0) | |
136 | ,fNCellv1(0) | |
137 | ,fClsEv1(0) | |
138 | ,fNClusv1(0) | |
139 | ,fKFParticleP(0) | |
140 | ,fKFParticleE(0) | |
141 | ,fInvmassLS1(0) | |
142 | ,fInvmassULS1(0) | |
143 | ,fcentrality(0) | |
144 | ,fElecPhi(0) | |
145 | ,fHadronPhi(0) | |
146 | // ,fSparseElectron(0) | |
147 | // ,fvalueElectron(0) | |
57189f04 | 148 | { |
149 | //Named constructor | |
520a29a8 | 150 | |
57189f04 | 151 | fPID = new AliHFEpid("hfePid"); |
520a29a8 | 152 | // fvalueElectron = new Double_t[8]; |
57189f04 | 153 | |
154 | // Define input and output slots here | |
155 | // Input slot #0 works with a TChain | |
156 | DefineInput(0, TChain::Class()); | |
157 | // Output slot #0 id reserved by the base class for AOD | |
158 | // Output slot #1 writes into a TH1 container | |
159 | // DefineOutput(1, TH1I::Class()); | |
160 | DefineOutput(1, TList::Class()); | |
161 | // DefineOutput(3, TTree::Class()); | |
162 | } | |
163 | ||
164 | //________________________________________________________________________ | |
165 | AliAnalysisTaskElecHadronCorrel::AliAnalysisTaskElecHadronCorrel() | |
166 | : AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisElecHadCorrel") | |
167 | ,fESD(0) | |
168 | ,fGeom(0) | |
169 | ,fOutputList(0) | |
520a29a8 | 170 | ,fTrackCuts1(new AliESDtrackCuts) |
171 | ,fTrackCuts2(new AliESDtrackCuts) | |
57189f04 | 172 | ,fCuts(0) |
173 | ,fIdentifiedAsOutInz(kFALSE) | |
174 | ,fPassTheEventCut(kFALSE) | |
175 | ,fRejectKinkMother(kFALSE) | |
520a29a8 | 176 | ,fVz(0.0) |
177 | ,fCFM(0) | |
178 | ,fPID(0) | |
179 | ,fPIDqa(0) | |
180 | ,fOpeningAngleCut(0.1) | |
57189f04 | 181 | ,fInvmassCut(0.01) |
182 | ,fNoEvents(0) | |
183 | ,fTrkpt(0) | |
184 | ,fTrkEovPBef(0) | |
520a29a8 | 185 | ,fTrkEovPBefHad(0) |
57189f04 | 186 | ,fTrkEovPAft(0) |
520a29a8 | 187 | ,fTrkEovPAftOwn(0) |
57189f04 | 188 | ,fdEdxBef(0) |
189 | ,fdEdxAft(0) | |
520a29a8 | 190 | ,fdEdxAftOwn(0) |
57189f04 | 191 | ,fInvmassLS(0) |
192 | ,fInvmassULS(0) | |
193 | ,fOpeningAngleLS(0) | |
194 | ,fOpeningAngleULS(0) | |
195 | ,fSemiIncElecDphi(0) | |
196 | ,fPhotElecDphi(0) | |
197 | ,fInclusiveElecDphi(0) | |
198 | ,fDphiMassHigh(0) | |
199 | ,fDphiULSMassLow(0) | |
200 | ,fDphiLSMassLow(0) | |
520a29a8 | 201 | ,fDphiULSMassLowNoPartner(0) |
202 | ,fDphiLSMassLowNoPartner(0) | |
57189f04 | 203 | ,fPhotoElecPt(0) |
204 | ,fSemiInclElecPt(0) | |
520a29a8 | 205 | ,fInclusiveElecPt(0) |
206 | ,fULSElecPt(0) | |
207 | ,fLSElecPt(0) | |
57189f04 | 208 | ,fTrackPtBefTrkCuts(0) |
209 | ,fTrackPtAftTrkCuts(0) | |
520a29a8 | 210 | ,fTPCnsigma(0) |
211 | ,fTPCnsigmaAft(0) | |
212 | ,fTPCnsigmaAftOwn(0) | |
213 | ,fNCellv1(0) | |
214 | ,fClsEv1(0) | |
215 | ,fNClusv1(0) | |
216 | ,fKFParticleP(0) | |
217 | ,fKFParticleE(0) | |
218 | ,fInvmassLS1(0) | |
219 | ,fInvmassULS1(0) | |
220 | ,fcentrality(0) | |
221 | ,fElecPhi(0) | |
222 | ,fHadronPhi(0) | |
223 | // ,fSparseElectron(0) | |
224 | // ,fvalueElectron(0) | |
57189f04 | 225 | { |
520a29a8 | 226 | //Default constructor |
227 | fPID = new AliHFEpid("hfePid"); | |
228 | // fvalueElectron = new Double_t[8]; | |
57189f04 | 229 | |
520a29a8 | 230 | // Constructor |
57189f04 | 231 | // Define input and output slots here |
232 | // Input slot #0 works with a TChain | |
233 | DefineInput(0, TChain::Class()); | |
234 | // Output slot #0 id reserved by the base class for AOD | |
235 | // Output slot #1 writes into a TH1 container | |
236 | // DefineOutput(1, TH1I::Class()); | |
237 | DefineOutput(1, TList::Class()); | |
238 | //DefineOutput(3, TTree::Class()); | |
239 | } | |
240 | //_________________________________________ | |
241 | ||
242 | AliAnalysisTaskElecHadronCorrel::~AliAnalysisTaskElecHadronCorrel() | |
243 | { | |
520a29a8 | 244 | //Destructor |
245 | ||
246 | delete fOutputList; | |
247 | delete fGeom; | |
248 | delete fPID; | |
249 | delete fCFM; | |
250 | delete fPIDqa; | |
251 | delete fTrackCuts1; | |
252 | delete fTrackCuts2; | |
253 | // delete fSparseElectron; | |
254 | // delete []fvalueElectron; | |
57189f04 | 255 | } |
256 | //_________________________________________ | |
257 | ||
258 | void AliAnalysisTaskElecHadronCorrel::UserExec(Option_t*) | |
259 | { | |
520a29a8 | 260 | //Main loop |
261 | //Called for each event | |
262 | ||
263 | // create pointer to event | |
264 | fESD = dynamic_cast<AliESDEvent*>(InputEvent()); | |
265 | if (!fESD) { | |
266 | printf("ERROR: fESD not available\n"); | |
267 | return; | |
268 | } | |
269 | ||
270 | if(!fCuts){ | |
271 | AliError("HFE cuts not available"); | |
272 | return; | |
273 | } | |
274 | ||
275 | if(!fPID->IsInitialized()){ | |
276 | // Initialize PID with the given run number | |
277 | AliWarning("PID not initialised, get from Run no"); | |
278 | fPID->InitializePID(fESD->GetRunNumber()); | |
279 | } | |
280 | ||
281 | //-------trigger selection | |
282 | UInt_t res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected(); | |
283 | if (res==0) | |
284 | return; | |
285 | ||
286 | // if( (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kFastOnly) ) | |
287 | // return; | |
288 | ||
289 | if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & (AliVEvent::kCentral))) return; | |
290 | ||
291 | AliCentrality *fCentrality = (AliCentrality*)fESD->GetCentrality(); | |
292 | ||
293 | Float_t centvalue = fCentrality->GetCentralityPercentile("V0M"); | |
294 | fcentrality->Fill(centvalue); | |
295 | cout << "cent val" << centvalue <<endl; | |
296 | if(centvalue<0 || centvalue>10) return; | |
297 | ||
298 | cout << "event no : " <<fESD->GetRunNumber() <<endl; | |
299 | Int_t fNOtrks = fESD->GetNumberOfTracks(); | |
300 | const AliESDVertex *pVtx = fESD->GetPrimaryVertex(); | |
301 | ||
302 | Double_t pVtxZ = -999; | |
303 | pVtxZ = pVtx->GetZ(); | |
304 | ||
305 | // Event cut | |
306 | // if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) return; | |
307 | ||
308 | ||
309 | if(TMath::Abs(pVtxZ)>10) return; | |
310 | fNoEvents->Fill(0); | |
311 | ||
312 | if(fNOtrks<2) return; | |
313 | ||
314 | AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse(); | |
315 | if(!pidResponse){ | |
316 | AliDebug(1, "Using default PID Response"); | |
317 | pidResponse = AliHFEtools::GetDefaultPID(kFALSE, fInputEvent->IsA() == AliAODEvent::Class()); | |
318 | } | |
319 | ||
320 | fPID->SetPIDResponse(pidResponse); | |
321 | ||
322 | fCFM->SetRecEventInfo(fESD); | |
323 | ||
324 | // Track loop | |
325 | for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) { | |
326 | AliESDtrack* track = fESD->GetTrack(iTracks); | |
327 | if (!track) { | |
328 | printf("ERROR: Could not receive track %d\n", iTracks); | |
329 | continue; | |
330 | } | |
331 | ||
332 | //eta cut (-0.7,0.7) | |
333 | if(track->Eta() < -0.7 || track->Eta() > 0.7) continue; | |
334 | ||
335 | fTrackPtBefTrkCuts->Fill(track->Pt()); | |
336 | // RecKine: ITSTPC cuts | |
337 | if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue; | |
338 | ||
339 | //RecKink | |
340 | if(fRejectKinkMother) { // Quick and dirty fix to reject both kink mothers and daughters | |
341 | if(track->GetKinkIndex(0) != 0) continue; | |
342 | } | |
343 | ||
344 | // RecPrim | |
345 | if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue; | |
346 | ||
347 | // HFEcuts: ITS layers cuts | |
348 | if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue; | |
349 | ||
350 | // HFE cuts: TPC PID cleanup | |
351 | if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue; | |
352 | ||
353 | fTrackPtAftTrkCuts->Fill(track->Pt()); | |
354 | ||
355 | Double_t fClsE = -999, p = -999, fEovP=-999, pt = -999, dEdx=-999, fTPCnSigma=0; | |
356 | // Track extrapolation | |
357 | Int_t fClsId = track->GetEMCALcluster(); | |
358 | if(fClsId <0) continue; | |
359 | AliESDCaloCluster *cluster = fESD->GetCaloCluster(fClsId); | |
360 | if(TMath::Abs(cluster->GetTrackDx())>0.05 || TMath::Abs(cluster->GetTrackDz())>0.05) continue; | |
361 | ||
362 | pt = track->Pt(); | |
363 | if(pt<1) continue; | |
364 | fTrkpt->Fill(pt); | |
365 | fClsE = cluster->E(); | |
366 | cout << "cluster E = " << fClsE <<endl; | |
367 | p = track->P(); | |
368 | dEdx = track->GetTPCsignal(); | |
369 | fEovP = fClsE/p; | |
370 | fTPCnSigma = fPID->GetPIDResponse() ? fPID->GetPIDResponse()->NumberOfSigmasTPC(track, AliPID::kElectron) : 1000; | |
371 | fdEdxBef->Fill(p,dEdx); | |
372 | fTPCnsigma->Fill(p,fTPCnSigma); | |
373 | /* | |
374 | fvalueElectron[0] = pt; | |
375 | fvalueElectron[1] = p; | |
376 | fvalueElectron[2] = fTPCnSigma; | |
377 | fvalueElectron[3] = dEdx; | |
378 | fvalueElectron[4] = fEovP; | |
379 | fvalueElectron[5] = cluster->GetM20(); | |
380 | fvalueElectron[6] = cluster->GetM02(); | |
381 | fvalueElectron[7] = cluster->GetDispersion(); | |
382 | ||
383 | fSparseElectron->Fill(fvalueElectron); | |
384 | */ | |
3db00c72 | 385 | if(fTPCnSigma >= -2 && fTPCnSigma <= 2)fTrkEovPBef->Fill(pt,fEovP); |
386 | if(fTPCnSigma < -4.5)fTrkEovPBefHad->Fill(pt,fEovP); | |
520a29a8 | 387 | /* |
388 | Int_t pidpassed = 0; | |
389 | //--- track accepted, do PID | |
390 | AliHFEpidObject hfetrack; | |
391 | hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis); | |
392 | hfetrack.SetRecTrack(track); | |
393 | hfetrack.SetPbPb(); | |
394 | if(fPID->IsSelected(&hfetrack, NULL, "", fPIDqa)) pidpassed = 1; | |
395 | ||
396 | if(pidpassed==1){ | |
397 | cout << "dedx, E/p : "<< dEdx << ", " << fEovP <<endl; | |
398 | fTrkEovPAft->Fill(pt,fEovP); | |
399 | fdEdxAft->Fill(p,dEdx); | |
400 | fTPCnsigmaAft->Fill(p,fTPCnSigma); | |
401 | } | |
402 | */ | |
3db00c72 | 403 | if(fTPCnSigma >= -2 && fTPCnSigma <= 2 && fEovP >= 0.9 && fEovP <=1.3) { |
404 | if(cluster->GetM20()<0.3 && cluster->GetM02()< 0.7 && cluster->GetDispersion()<1){ | |
405 | fElecPhi->Fill(track->Phi()); | |
406 | fTrkEovPAftOwn->Fill(pt,fEovP); | |
407 | fdEdxAftOwn->Fill(p,dEdx); | |
408 | fTPCnsigmaAftOwn->Fill(p,fTPCnSigma); | |
409 | ||
410 | Bool_t fFlagPhotonicElec = kFALSE; | |
411 | // select photonic electron | |
412 | SelectPhotonicElectron(iTracks,track,fFlagPhotonicElec); | |
413 | //Inclusive electron-hadron correlation | |
414 | ElectronHadCorrel(iTracks, track, fInclusiveElecDphi); | |
415 | fInclusiveElecPt->Fill(pt); | |
416 | ||
417 | // photonic electron | |
418 | if(fFlagPhotonicElec){ | |
419 | //Electron hadron correlation | |
420 | ElectronHadCorrel(iTracks, track, fPhotElecDphi); | |
421 | fPhotoElecPt->Fill(pt); | |
422 | } | |
423 | ||
424 | // Semi inclusive electron | |
425 | if(!fFlagPhotonicElec){ | |
426 | //Electron hadron correlation | |
427 | ElectronHadCorrel(iTracks, track, fSemiIncElecDphi); | |
428 | fSemiInclElecPt->Fill(pt); | |
429 | } | |
520a29a8 | 430 | } |
431 | } | |
432 | } | |
433 | ||
434 | //EMC clusters | |
435 | Int_t clsNo = fESD->GetNumberOfCaloClusters(); | |
436 | fNClusv1->Fill(clsNo); | |
437 | for(Int_t iclus=0; iclus<clsNo ; iclus++){ | |
438 | AliESDCaloCluster* clus = fESD->GetCaloCluster(iclus); | |
439 | if(!clus->IsEMCAL()) continue; | |
440 | fNCellv1->Fill(clus->GetNCells()); | |
441 | fClsEv1->Fill(clus->E()); | |
442 | } | |
443 | ||
444 | ||
445 | PostData(1, fOutputList); | |
57189f04 | 446 | } |
447 | //_________________________________________ | |
448 | void AliAnalysisTaskElecHadronCorrel::UserCreateOutputObjects() | |
449 | { | |
450 | //Create histograms | |
520a29a8 | 451 | // TGeoManager::Import("geometry.root"); |
452 | // fGeom = AliEMCALGeometry::GetInstance("EMCAL_COMPLETEV1"); | |
453 | ||
57189f04 | 454 | //--------Initialize PID |
455 | fPID->SetHasMCData(kFALSE); | |
456 | if(!fPID->GetNumberOfPIDdetectors()) | |
520a29a8 | 457 | { |
458 | fPID->AddDetector("TPC", 0); | |
459 | fPID->AddDetector("EMCAL", 1); | |
460 | } | |
461 | ||
57189f04 | 462 | fPID->SortDetectors(); |
463 | fPIDqa = new AliHFEpidQAmanager(); | |
464 | fPIDqa->Initialize(fPID); | |
520a29a8 | 465 | |
57189f04 | 466 | //--------Initialize correction Framework and Cuts |
467 | fCFM = new AliCFManager; | |
468 | const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack; | |
469 | fCFM->SetNStepParticle(kNcutSteps); | |
470 | for(Int_t istep = 0; istep < kNcutSteps; istep++) | |
471 | fCFM->SetParticleCutsList(istep, NULL); | |
520a29a8 | 472 | |
57189f04 | 473 | if(!fCuts){ |
474 | AliWarning("Cuts not available. Default cuts will be used"); | |
475 | fCuts = new AliHFEcuts; | |
476 | fCuts->CreateStandardCuts(); | |
477 | } | |
478 | fCuts->Initialize(fCFM); | |
520a29a8 | 479 | |
57189f04 | 480 | //---------Output Tlist |
481 | fOutputList = new TList(); | |
482 | fOutputList->SetOwner(); | |
483 | fOutputList->Add(fPIDqa->MakeList("PIDQA")); | |
520a29a8 | 484 | |
57189f04 | 485 | fNoEvents = new TH1F("fNoEvents","",1,0,1) ; |
486 | fOutputList->Add(fNoEvents); | |
520a29a8 | 487 | |
488 | fcentrality = new TH1F("fcentrality","centrality", 100,0,100); | |
489 | fOutputList->Add(fcentrality); | |
490 | ||
57189f04 | 491 | fTrkpt = new TH1F("fTrkpt","track pt",1000,0,50); |
492 | fOutputList->Add(fTrkpt); | |
520a29a8 | 493 | |
57189f04 | 494 | fTrackPtBefTrkCuts = new TH1F("fTrackPtBefTrkCuts","track pt before track cuts",1000,0,50); |
495 | fOutputList->Add(fTrackPtBefTrkCuts); | |
520a29a8 | 496 | |
57189f04 | 497 | fTrackPtAftTrkCuts = new TH1F("fTrackPtAftTrkCuts","track pt after track cuts",1000,0,50); |
498 | fOutputList->Add(fTrackPtAftTrkCuts); | |
520a29a8 | 499 | |
57189f04 | 500 | fTPCnsigma = new TH2F("fTPCnsigma", "TPC - n sigma",1000,0,50,200,-10,10); |
501 | fOutputList->Add(fTPCnsigma); | |
520a29a8 | 502 | |
503 | fTPCnsigmaAft = new TH2F("fTPCnsigmaAft", "TPC - n sigma after hfepid",1000,0,50,200,-10,10); | |
504 | fOutputList->Add(fTPCnsigmaAft); | |
505 | ||
506 | fTPCnsigmaAftOwn = new TH2F("fTPCnsigmaAftOwn", "TPC - n sigma after own pid",1000,0,50,200,-10,10); | |
507 | fOutputList->Add(fTPCnsigmaAftOwn); | |
508 | ||
57189f04 | 509 | fTrkEovPBef = new TH2F("fTrkEovPBef","track E/p before HFE pid",1000,0,50,100,0,2); |
510 | fOutputList->Add(fTrkEovPBef); | |
520a29a8 | 511 | |
512 | fTrkEovPBefHad = new TH2F("fTrkEovPBefHad","track E/p for TPCnsig < 3.5",1000,0,50,100,0,2); | |
513 | fOutputList->Add(fTrkEovPBefHad); | |
514 | ||
57189f04 | 515 | fTrkEovPAft = new TH2F("fTrkEovPAft","track E/p after HFE pid",1000,0,50,100,0,2); |
516 | fOutputList->Add(fTrkEovPAft); | |
520a29a8 | 517 | |
518 | fTrkEovPAftOwn = new TH2F("fTrkEovPAftOwn","track E/p after own pid",1000,0,50,100,0,2); | |
519 | fOutputList->Add(fTrkEovPAftOwn); | |
520 | ||
57189f04 | 521 | fdEdxBef = new TH2F("fdEdxBef","track dEdx vs p before HFE pid",1000,0,50,150,0,150); |
522 | fOutputList->Add(fdEdxBef); | |
520a29a8 | 523 | |
57189f04 | 524 | fdEdxAft = new TH2F("fdEdxAft","track dEdx vs p after HFE pid",1000,0,50,150,0,150); |
525 | fOutputList->Add(fdEdxAft); | |
520a29a8 | 526 | |
527 | fdEdxAftOwn = new TH2F("fdEdxAftOwn","track dEdx vs p own HFE pid",1000,0,50,150,0,150); | |
528 | fOutputList->Add(fdEdxAftOwn); | |
529 | ||
530 | fElecPhi = new TH1F("fElecPhi", "Electron phi",1000,0,6.28); | |
531 | fOutputList->Add(fElecPhi); | |
532 | ||
533 | fHadronPhi = new TH1F("fHadronPhi", "Hadron phi",1000,0,6.28); | |
534 | fOutputList->Add(fHadronPhi); | |
535 | ||
536 | // fInvmassLS = new TH1F("fInvmassLS", "Inv mass of LS (e,e) if mass cal is correct; mass(GeV/c^2); counts;", 1000,0,1.0); | |
537 | // fOutputList->Add(fInvmassLS); | |
538 | ||
539 | // fInvmassULS = new TH1F("fInvmassULS", "Inv mass of ULS (e,e); mass(GeV/c^2) if mass cal is correct; counts;", 1000,0,1.0); | |
540 | // fOutputList->Add(fInvmassULS); | |
541 | ||
57189f04 | 542 | fOpeningAngleLS = new TH1F("fOpeningAngleLS","Opening angle for LS pairs",100,0,1); |
543 | fOutputList->Add(fOpeningAngleLS); | |
520a29a8 | 544 | |
57189f04 | 545 | fOpeningAngleULS = new TH1F("fOpeningAngleULS","Opening angle for ULS pairs",100,0,1); |
546 | fOutputList->Add(fOpeningAngleULS); | |
520a29a8 | 547 | |
548 | fSemiIncElecDphi = new TH2F("fSemiIncElecDphi", "Semi Inclusive elec-had Dphi correlation",200,0,20,100,-1.6,4.75); | |
57189f04 | 549 | fOutputList->Add(fSemiIncElecDphi); |
520a29a8 | 550 | |
551 | fPhotElecDphi = new TH2F("fPhotElecDphi", "Photon elec-had Dphi correlation",200,0,20,100,-1.6,4.75); | |
57189f04 | 552 | fOutputList->Add(fPhotElecDphi); |
520a29a8 | 553 | |
554 | fInclusiveElecDphi = new TH2F("fInclusiveElecDphi", "Inclusive elec-had Dphi correlation",200,0,20,100,-1.6,4.75); | |
57189f04 | 555 | fOutputList->Add(fInclusiveElecDphi); |
520a29a8 | 556 | |
557 | fDphiMassHigh = new TH2F("fDphiMassHigh", "e-h Dphi LS+ULS, mass>0.01",200,0,20,100,-1.6,4.75); | |
57189f04 | 558 | fOutputList->Add(fDphiMassHigh); |
520a29a8 | 559 | |
560 | fDphiULSMassLow = new TH2F("fDphiULSMassLow", "e-h Dphi ULS, mass<0.01",200,0,20,100,-1.6,4.75); | |
57189f04 | 561 | fOutputList->Add(fDphiULSMassLow); |
520a29a8 | 562 | |
563 | fDphiLSMassLow = new TH2F("fDphiLSMassLow", "e-h Dphi LS, mass<0.01",200,0,20,100,-1.6,4.75); | |
57189f04 | 564 | fOutputList->Add(fDphiLSMassLow); |
520a29a8 | 565 | |
566 | fDphiULSMassLowNoPartner = new TH2F("fDphiULSMassLowNoPartner", "e-h Dphi ULS with no partner, mass<mass cut,",200,0,20,100,-1.6,4.75); | |
567 | fOutputList->Add(fDphiULSMassLowNoPartner); | |
568 | ||
569 | fDphiLSMassLowNoPartner = new TH2F("fDphiLSMassLowNoPartner", "e-h Dphi LS with no partner, mass<mass cut",200,0,20,100,-1.6,4.75); | |
570 | fOutputList->Add(fDphiLSMassLowNoPartner); | |
571 | ||
57189f04 | 572 | fPhotoElecPt = new TH1F("fPhotoElecPt", "photonic electron pt",1000,0,100); |
573 | fOutputList->Add(fPhotoElecPt); | |
520a29a8 | 574 | |
57189f04 | 575 | fSemiInclElecPt = new TH1F("fSemiInclElecPt", "Semi-inclusive electron pt",1000,0,100); |
576 | fOutputList->Add(fSemiInclElecPt); | |
520a29a8 | 577 | |
578 | fInclusiveElecPt = new TH1F("fInclElecPt", "Inclusive electron pt",1000,0,100); | |
579 | fOutputList->Add(fInclusiveElecPt); | |
580 | ||
581 | fULSElecPt = new TH1F("fULSElecPt", "ULS electron pt",1000,0,100); | |
582 | fOutputList->Add(fULSElecPt); | |
583 | ||
584 | fLSElecPt = new TH1F("fLSElecPt", "LS electron pt",1000,0,100); | |
585 | fOutputList->Add(fLSElecPt); | |
586 | ||
587 | fNCellv1 = new TH1F("fNCellv1","Ncell in clus (v1); NCell; count",100,0,100) ; | |
588 | fOutputList->Add(fNCellv1); | |
589 | ||
590 | fClsEv1 = new TH1F("fClsEv1", "Clus E(v1); Cls E; count",1000,0,100); | |
591 | fOutputList->Add(fClsEv1); | |
592 | ||
593 | fNClusv1 = new TH1F("fNClusv1","Nclus in event (v1); NClus; count",500,0,500) ; | |
594 | fOutputList->Add(fNClusv1); | |
595 | ||
596 | fKFParticleP = new TH1F("fKFParticleP","KFparticle rec P; P(GeV/c)",1000,0,50); | |
597 | fOutputList->Add(fKFParticleP); | |
598 | ||
599 | fKFParticleE = new TH1F("fKFParticleE", "KfParticle rec E; E; count",1000,0,100); | |
600 | fOutputList->Add(fKFParticleE); | |
601 | ||
602 | fInvmassLS1 = new TH1F("fInvmassLS1", "Inv mass of LS (e,e); mass(GeV/c^2); counts;", 1000,0,1.0); | |
603 | fOutputList->Add(fInvmassLS1); | |
604 | ||
605 | fInvmassULS1 = new TH1F("fInvmassULS1", "Inv mass of ULS (e,e); mass(GeV/c^2); counts;", 1000,0,1.0); | |
606 | fOutputList->Add(fInvmassULS1); | |
607 | /* | |
608 | Int_t binsv1[8]={1000,1000,200,150,100,100,100,100}; //pt, p, TPCnsig, dEdx, E/p, M20, M02, dispersion | |
609 | Double_t xminv1[8]={0,0,-10,0,0,0,0,0}; | |
610 | Double_t xmaxv1[8]={50,50,10,150,2,2,2,2}; | |
611 | fSparseElectron = new THnSparseD ("Electron","Electron",8,binsv1,xminv1,xmaxv1); | |
612 | fOutputList->Add(fSparseElectron); | |
613 | */ | |
57189f04 | 614 | PostData(1,fOutputList); |
615 | } | |
616 | ||
617 | //________________________________________________________________________ | |
618 | void AliAnalysisTaskElecHadronCorrel::Terminate(Option_t *) | |
619 | { | |
620 | // Info("Terminate"); | |
520a29a8 | 621 | AliAnalysisTaskSE::Terminate(); |
57189f04 | 622 | } |
623 | ||
624 | //________________________________________________________________________ | |
625 | Bool_t AliAnalysisTaskElecHadronCorrel::ProcessCutStep(Int_t cutStep, AliVParticle *track) | |
626 | { | |
627 | // Check single track cuts for a given cut step | |
628 | const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack; | |
629 | if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE; | |
630 | return kTRUE; | |
631 | } | |
632 | //_________________________________________ | |
633 | void AliAnalysisTaskElecHadronCorrel::SelectPhotonicElectron(Int_t itrack, AliESDtrack *track, Bool_t &fFlagPhotonicElec) | |
634 | { | |
635 | //Identify non-heavy flavour electrons using Invariant mass method | |
520a29a8 | 636 | |
57189f04 | 637 | fTrackCuts1->SetAcceptKinkDaughters(kFALSE); |
638 | fTrackCuts1->SetRequireTPCRefit(kTRUE); | |
639 | fTrackCuts1->SetEtaRange(-0.9,0.9); | |
640 | fTrackCuts1->SetRequireSigmaToVertex(kTRUE); | |
641 | fTrackCuts1->SetMaxChi2PerClusterTPC(3.5); | |
642 | fTrackCuts1->SetMinNClustersTPC(80); | |
520a29a8 | 643 | |
644 | // const AliESDVertex *pVtx = fESD->GetPrimaryVertex(); | |
645 | ||
57189f04 | 646 | Bool_t flagPhotonicElec = kFALSE; |
520a29a8 | 647 | |
57189f04 | 648 | for(Int_t jTracks = itrack+1; jTracks<fESD->GetNumberOfTracks(); jTracks++){ |
649 | AliESDtrack* trackAsso = fESD->GetTrack(jTracks); | |
650 | if (!trackAsso) { | |
651 | printf("ERROR: Could not receive track %d\n", jTracks); | |
652 | continue; | |
653 | } | |
520a29a8 | 654 | |
57189f04 | 655 | Double_t dEdxAsso = -999., ptAsso=-999., openingAngle = -999.; |
520a29a8 | 656 | Double_t mass=-999., width = -999; |
57189f04 | 657 | Bool_t fFlagLS=kFALSE, fFlagULS=kFALSE; |
520a29a8 | 658 | |
57189f04 | 659 | dEdxAsso = trackAsso->GetTPCsignal(); |
660 | ptAsso = trackAsso->Pt(); | |
661 | Int_t chargeAsso = trackAsso->Charge(); | |
662 | Int_t charge = track->Charge(); | |
520a29a8 | 663 | |
57189f04 | 664 | if(ptAsso <0.3) continue; |
665 | if(!fTrackCuts1->AcceptTrack(trackAsso)) continue; | |
666 | if(dEdxAsso <70 || dEdxAsso>100) continue; //11a pass1 | |
520a29a8 | 667 | |
57189f04 | 668 | Int_t fPDGe1 = 11; Int_t fPDGe2 = 11; |
669 | if(charge>0) fPDGe1 = -11; | |
670 | if(chargeAsso>0) fPDGe2 = -11; | |
520a29a8 | 671 | |
57189f04 | 672 | if(charge == chargeAsso) fFlagLS = kTRUE; |
673 | if(charge != chargeAsso) fFlagULS = kTRUE; | |
520a29a8 | 674 | |
675 | AliKFParticle ge1 = AliKFParticle(*track, fPDGe1); | |
676 | AliKFParticle ge2 = AliKFParticle(*trackAsso, fPDGe2); | |
57189f04 | 677 | AliKFParticle recg(ge1, ge2); |
520a29a8 | 678 | /* |
679 | Double_t recP2=-999.0, recP=-999.0, recE=-999.0, m2=-999.0, m=-999.0; | |
680 | recP2= (recg.GetPx()*recg.GetPx() + recg.GetPy()*recg.GetPy() + recg.GetPz()*recg.GetPz()); | |
681 | recP = TMath::Sqrt(recP2); | |
682 | recE = recg.GetE(); | |
683 | fKFParticleP->Fill(recP); | |
684 | fKFParticleE->Fill(recE); | |
685 | m2 = (recg.GetE()*recg.GetE() - recg.GetPx()*recg.GetPx() - recg.GetPy()*recg.GetPy() - recg.GetPz()*recg.GetPz()); | |
686 | m = TMath::Sqrt(m2); | |
687 | */ | |
57189f04 | 688 | if(recg.GetNDF()<1) continue; |
689 | Double_t chi2recg = recg.GetChi2()/recg.GetNDF(); | |
690 | if(TMath::Sqrt(TMath::Abs(chi2recg))>3.) continue; | |
520a29a8 | 691 | |
57189f04 | 692 | openingAngle = ge1.GetAngle(ge2); |
693 | if(fFlagLS) fOpeningAngleLS->Fill(openingAngle); | |
694 | if(fFlagULS) fOpeningAngleULS->Fill(openingAngle); | |
520a29a8 | 695 | |
57189f04 | 696 | if(openingAngle > fOpeningAngleCut) continue; |
520a29a8 | 697 | |
698 | Int_t MassCorrect; | |
699 | MassCorrect = recg.GetMass(mass,width); | |
700 | cout << "mass = " << mass <<endl; | |
701 | ||
702 | if(fFlagLS) fInvmassLS1->Fill(mass); | |
703 | if(fFlagULS) fInvmassULS1->Fill(mass); | |
704 | ||
705 | // if(MassCorrect==1){ | |
706 | // if(fFlagLS) fInvmassLS->Fill(m); | |
707 | // if(fFlagULS) fInvmassULS->Fill(m); | |
708 | ||
57189f04 | 709 | if(mass>fInvmassCut){ |
710 | ElectronHadCorrel(itrack,track,fDphiMassHigh); | |
711 | } | |
520a29a8 | 712 | if(mass<fInvmassCut){ |
713 | if(fFlagULS) | |
714 | { | |
715 | ElectronHadCorrel(itrack,track,fDphiULSMassLow); | |
716 | fULSElecPt->Fill(track->Pt()); | |
717 | } | |
718 | if(fFlagLS) | |
719 | { | |
720 | ElectronHadCorrel(itrack,track,fDphiLSMassLow); | |
721 | fLSElecPt->Fill(track->Pt()); | |
722 | } | |
723 | if(fFlagLS) ElectronHadCorrelNoPartner(itrack,jTracks,track,fDphiLSMassLowNoPartner); | |
724 | if(fFlagULS) ElectronHadCorrelNoPartner(itrack,jTracks,track,fDphiULSMassLowNoPartner); | |
57189f04 | 725 | } |
520a29a8 | 726 | |
57189f04 | 727 | if(mass<fInvmassCut && fFlagULS && !flagPhotonicElec){ |
728 | flagPhotonicElec = kTRUE; | |
729 | } | |
520a29a8 | 730 | // } |
731 | ||
57189f04 | 732 | } |
733 | fFlagPhotonicElec = flagPhotonicElec; | |
520a29a8 | 734 | |
57189f04 | 735 | } |
736 | //_________________________________________ | |
737 | void AliAnalysisTaskElecHadronCorrel::ElectronHadCorrel(Int_t itrack, AliESDtrack *track, TH2F *DphiPt) | |
738 | { | |
739 | //Construct Delta Phi between electrons and hadrons | |
520a29a8 | 740 | |
57189f04 | 741 | fTrackCuts2->SetAcceptKinkDaughters(kFALSE); |
742 | fTrackCuts2->SetRequireTPCRefit(kTRUE); | |
743 | fTrackCuts2->SetRequireITSRefit(kTRUE); | |
744 | fTrackCuts2->SetEtaRange(-0.9,0.9); | |
745 | fTrackCuts2->SetRequireSigmaToVertex(kTRUE); | |
746 | fTrackCuts2->SetMaxChi2PerClusterTPC(3.5); | |
747 | fTrackCuts2->SetMinNClustersTPC(80); | |
520a29a8 | 748 | |
57189f04 | 749 | for(Int_t ktracks = 0; ktracks<fESD->GetNumberOfTracks(); ktracks++){ |
750 | AliESDtrack* trackHad = fESD->GetTrack(ktracks); | |
751 | if (!trackHad) { | |
752 | printf("ERROR: Could not receive track %d\n", ktracks); | |
753 | continue; | |
754 | } | |
755 | if(ktracks == itrack) continue; //do not select the same electron | |
520a29a8 | 756 | |
57189f04 | 757 | Double_t ptHad= -999, pHad=-999., dEdxHad = -999; |
758 | Double_t ptEle = -999; | |
759 | Double_t phiEle = -999, phiHad = -999, Dphi = -999; | |
760 | Double_t pi = 3.14; | |
520a29a8 | 761 | |
57189f04 | 762 | dEdxHad = trackHad->GetTPCsignal(); |
763 | ptHad = trackHad->Pt(); | |
764 | pHad = trackHad->P(); | |
520a29a8 | 765 | |
57189f04 | 766 | if(ptHad <0.3) continue; |
767 | if(!fTrackCuts2->AcceptTrack(trackHad)) continue; | |
520a29a8 | 768 | |
769 | fHadronPhi->Fill(trackHad->Phi()); | |
770 | ||
57189f04 | 771 | phiEle = track->Phi(); |
772 | phiHad = trackHad->Phi(); | |
773 | Dphi = phiEle - phiHad; | |
520a29a8 | 774 | if (Dphi > 3*pi/2) |
57189f04 | 775 | Dphi = Dphi - 2*pi; |
520a29a8 | 776 | if (Dphi < -pi/2) |
57189f04 | 777 | Dphi = Dphi + 2*pi; |
520a29a8 | 778 | |
57189f04 | 779 | ptEle = track->Pt(); |
520a29a8 | 780 | |
57189f04 | 781 | DphiPt->Fill(ptEle,Dphi); |
782 | } | |
783 | } | |
784 | //_________________________________________ | |
520a29a8 | 785 | void AliAnalysisTaskElecHadronCorrel::ElectronHadCorrelNoPartner(Int_t itrack,Int_t jtrack, AliESDtrack *track, TH2F *DphiPtNew) |
57189f04 | 786 | { |
520a29a8 | 787 | //Construct Delta Phi between electrons and hadrons for electrons from invariant mass calculation excluding associated track |
57189f04 | 788 | |
520a29a8 | 789 | fTrackCuts2->SetAcceptKinkDaughters(kFALSE); |
790 | fTrackCuts2->SetRequireTPCRefit(kTRUE); | |
791 | fTrackCuts2->SetRequireITSRefit(kTRUE); | |
792 | fTrackCuts2->SetEtaRange(-0.9,0.9); | |
793 | fTrackCuts2->SetRequireSigmaToVertex(kTRUE); | |
794 | fTrackCuts2->SetMaxChi2PerClusterTPC(3.5); | |
795 | fTrackCuts2->SetMinNClustersTPC(80); | |
796 | ||
797 | for(Int_t ktracks = 0; ktracks<fESD->GetNumberOfTracks(); ktracks++){ | |
798 | AliESDtrack* trackHad = fESD->GetTrack(ktracks); | |
799 | if (!trackHad) { | |
800 | printf("ERROR: Could not receive track %d\n", ktracks); | |
801 | continue; | |
802 | } | |
803 | if(ktracks == itrack || ktracks == jtrack) continue; //do not select the same electron and associated track from inv mass cal | |
804 | ||
805 | ||
806 | Double_t ptHad= -999, pHad=-999., dEdxHad = -999; | |
807 | Double_t ptEle = -999; | |
808 | Double_t phiEle = -999, phiHad = -999, Dphi = -999; | |
809 | Double_t pi = 3.14; | |
810 | ||
811 | dEdxHad = trackHad->GetTPCsignal(); | |
812 | ptHad = trackHad->Pt(); | |
813 | pHad = trackHad->P(); | |
814 | ||
815 | if(ptHad <0.3) continue; | |
816 | if(!fTrackCuts2->AcceptTrack(trackHad)) continue; | |
817 | ||
818 | phiEle = track->Phi(); | |
819 | phiHad = trackHad->Phi(); | |
820 | Dphi = phiEle - phiHad; | |
821 | if (Dphi > 3*pi/2) | |
822 | Dphi = Dphi - 2*pi; | |
823 | if (Dphi < -pi/2) | |
824 | Dphi = Dphi + 2*pi; | |
57189f04 | 825 | |
520a29a8 | 826 | ptEle = track->Pt(); |
827 | ||
828 | DphiPtNew->Fill(ptEle,Dphi); | |
829 | } | |
830 | } |