]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGHF/hfe/AliAnalysisTaskElecHadronCorrel.cxx
Needed for compilation
[u/mrichter/AliRoot.git] / PWGHF / hfe / AliAnalysisTaskElecHadronCorrel.cxx
CommitLineData
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
86ClassImp(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//________________________________________________________________________
165AliAnalysisTaskElecHadronCorrel::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
242AliAnalysisTaskElecHadronCorrel::~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
258void 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//_________________________________________
448void 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//________________________________________________________________________
618void AliAnalysisTaskElecHadronCorrel::Terminate(Option_t *)
619{
620 // Info("Terminate");
520a29a8 621 AliAnalysisTaskSE::Terminate();
57189f04 622}
623
624//________________________________________________________________________
625Bool_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//_________________________________________
633void 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//_________________________________________
737void 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 785void 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}