1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 ////////////////////////////////////////////////////////////////////////
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 //
24 // Author: Deepa Thomas (Utrecht University) //
26 ////////////////////////////////////////////////////////////////////////
33 #include "THnSparse.h"
34 #include "TLorentzVector.h"
38 #include "AliAnalysisTask.h"
39 #include "AliAnalysisManager.h"
41 #include "AliESDEvent.h"
42 #include "AliESDHandler.h"
43 #include "AliAODEvent.h"
44 #include "AliAODHandler.h"
46 #include "AliAnalysisTaskElecHadronCorrel.h"
47 #include "TGeoGlobalMagField.h"
49 #include "AliAnalysisTaskSE.h"
50 #include "TRefArray.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"
58 #include "AliESDCaloTrigger.h"
59 #include "AliEMCALRecoUtils.h"
60 #include "AliEMCALGeometry.h"
61 #include "AliGeomManager.h"
63 #include "TGeoManager.h"
67 //#include "AliEventPoolManager.h"
68 #include "AliAnalysisTaskPhiCorrelations.h"
70 #include "AliCentrality.h"
71 #include "AliEMCALTrack.h"
72 //#include "AliEMCALTracker.h"
75 #include "AliKFParticle.h"
76 #include "AliKFVertex.h"
79 #include "AliPIDResponse.h"
80 #include "AliHFEcontainer.h"
81 #include "AliHFEcuts.h"
82 #include "AliHFEpid.h"
83 #include "AliHFEpidBase.h"
84 #include "AliHFEpidQAmanager.h"
85 #include "AliHFEtools.h"
86 #include "AliCFContainer.h"
87 #include "AliCFManager.h"
92 ClassImp(AliAnalysisTaskElecHadronCorrel)
93 //________________________________________________________________________
94 AliAnalysisTaskElecHadronCorrel::AliAnalysisTaskElecHadronCorrel(const char *name)
95 : AliAnalysisTaskSE(name)
99 ,fTrackCuts1(new AliESDtrackCuts)
100 ,fTrackCuts2(new AliESDtrackCuts)
102 ,fIdentifiedAsOutInz(kFALSE)
103 ,fPassTheEventCut(kFALSE)
104 ,fRejectKinkMother(kFALSE)
109 ,fOpeningAngleCut(0.1)
127 ,fInclusiveElecDphi(0)
130 ,fDphiULSMassLowNoPartner(0)
131 ,fDphiLSMassLowNoPartner(0)
137 ,fTrackPtBefTrkCuts(0)
138 ,fTrackPtAftTrkCuts(0)
160 /* ,fNoMixedEvents(0)
163 ,fMixedIncElecDphi(0)
164 ,fMixedPhotElecDphi(0)
165 ,fMixedSemiIncElecDphi(0)
166 ,fMixedDphiULSMassLow(0)
167 ,fMixedDphiLSMassLow(0)
169 // ,fSparseElectron(0)
170 // ,fvalueElectron(0)
174 fPID = new AliHFEpid("hfePid");
175 // fvalueElectron = new Double_t[8];
177 // Define input and output slots here
178 // Input slot #0 works with a TChain
179 DefineInput(0, TChain::Class());
180 // Output slot #0 id reserved by the base class for AOD
181 // Output slot #1 writes into a TH1 container
182 // DefineOutput(1, TH1I::Class());
183 DefineOutput(1, TList::Class());
184 // DefineOutput(3, TTree::Class());
187 //________________________________________________________________________
188 AliAnalysisTaskElecHadronCorrel::AliAnalysisTaskElecHadronCorrel()
189 : AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisElecHadCorrel")
193 ,fTrackCuts1(new AliESDtrackCuts)
194 ,fTrackCuts2(new AliESDtrackCuts)
196 ,fIdentifiedAsOutInz(kFALSE)
197 ,fPassTheEventCut(kFALSE)
198 ,fRejectKinkMother(kFALSE)
203 ,fOpeningAngleCut(0.1)
221 ,fInclusiveElecDphi(0)
224 ,fDphiULSMassLowNoPartner(0)
225 ,fDphiLSMassLowNoPartner(0)
231 ,fTrackPtBefTrkCuts(0)
232 ,fTrackPtAftTrkCuts(0)
254 /* ,fNoMixedEvents(0)
257 ,fMixedIncElecDphi(0)
258 ,fMixedPhotElecDphi(0)
259 ,fMixedSemiIncElecDphi(0)
260 ,fMixedDphiULSMassLow(0)
261 ,fMixedDphiLSMassLow(0)
263 // ,fSparseElectron(0)
264 // ,fvalueElectron(0)
266 //Default constructor
267 fPID = new AliHFEpid("hfePid");
268 // fvalueElectron = new Double_t[8];
271 // Define input and output slots here
272 // Input slot #0 works with a TChain
273 DefineInput(0, TChain::Class());
274 // Output slot #0 id reserved by the base class for AOD
275 // Output slot #1 writes into a TH1 container
276 // DefineOutput(1, TH1I::Class());
277 DefineOutput(1, TList::Class());
278 //DefineOutput(3, TTree::Class());
280 //_________________________________________
282 AliAnalysisTaskElecHadronCorrel::~AliAnalysisTaskElecHadronCorrel()
293 // delete fSparseElectron;
294 // delete []fvalueElectron;
296 //_________________________________________
298 void AliAnalysisTaskElecHadronCorrel::UserExec(Option_t*)
301 //Called for each event
303 // create pointer to event
304 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
306 printf("ERROR: fESD not available\n");
311 AliError("HFE cuts not available");
315 if(!fPID->IsInitialized()){
316 // Initialize PID with the given run number
317 AliWarning("PID not initialised, get from Run no");
318 fPID->InitializePID(fESD->GetRunNumber());
321 //-------trigger selection
322 UInt_t res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
326 // if( (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kFastOnly) )
329 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & (AliVEvent::kCentral))) return;
331 AliCentrality *fCentrality = (AliCentrality*)fESD->GetCentrality();
333 Float_t centvalue = fCentrality->GetCentralityPercentile("V0M");
334 fcentrality->Fill(centvalue);
335 cout << "cent val" << centvalue <<endl;
336 if(centvalue<0 || centvalue>10) return;
338 cout << "event no : " <<fESD->GetRunNumber() <<endl;
339 Int_t fNOtrks = fESD->GetNumberOfTracks();
340 const AliESDVertex *pVtx = fESD->GetPrimaryVertex();
342 Double_t pVtxZ = -999;
343 pVtxZ = pVtx->GetZ();
346 // if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) return;
348 if(TMath::Abs(pVtxZ)>10) return;
351 if(fNOtrks<2) return;
353 AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
355 AliDebug(1, "Using default PID Response");
356 pidResponse = AliHFEtools::GetDefaultPID(kFALSE, fInputEvent->IsA() == AliAODEvent::Class());
359 fPID->SetPIDResponse(pidResponse);
361 fCFM->SetRecEventInfo(fESD);
364 AliEventPool* pool = fPoolMgr->GetEventPool(centvalue, pVtxZ); // Get the buffer associated with the current centrality and z-vtx
366 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centvalue, pVtxZ));
368 TObjArray* tracksClone = CloneAndReduceTrackList();
369 tracksClone->SetOwner();
370 pool->UpdatePool(tracksClone);
373 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
374 AliESDtrack* track = fESD->GetTrack(iTracks);
376 printf("ERROR: Could not receive track %d\n", iTracks);
380 if(track->Pt()<1) continue;
382 fTrackPtBefTrkCuts->Fill(track->Pt());
384 // RecKine: ITSTPC cuts
385 if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
388 if(fRejectKinkMother) { // Quick and dirty fix to reject both kink mothers and daughters
389 if(track->GetKinkIndex(0) != 0) continue;
393 if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
395 // HFE cuts: TPC PID cleanup
396 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
398 fTrackHFEcuts->Fill(track->Phi());
400 //track phi distribution for diff ITS layer hit
401 if(track->HasPointOnITSLayer(0)) fTrakPhiSPD1->Fill(track->Phi());
402 if(track->HasPointOnITSLayer(1)) fTrakPhiSPD2->Fill(track->Phi());
404 if(track->HasPointOnITSLayer(0) || track->HasPointOnITSLayer(1)) fTrakPhiSPDOr->Fill(track->Phi());
405 if(track->HasPointOnITSLayer(0) && track->HasPointOnITSLayer(1)) fTrakPhiSPDAnd->Fill(track->Phi());
407 // HFEcuts: ITS layers cuts
408 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
410 fTrackHFEcutsITS->Fill(track->Phi());
412 fTrackPtAftTrkCuts->Fill(track->Pt());
414 Double_t fClsE = -999, p = -999, fEovP=-999, pt = -999, dEdx=-999, fTPCnSigma=0;
417 dEdx = track->GetTPCsignal();
418 fTPCnSigma = fPID->GetPIDResponse() ? fPID->GetPIDResponse()->NumberOfSigmasTPC(track, AliPID::kElectron) : 1000;
421 if(fTPCnSigma >= -2 && fTPCnSigma <= 2){
422 fElecPhiTPC->Fill(track->Phi());
426 if(track->Eta() < -0.7 || track->Eta() > 0.7) continue;
428 // Track extrapolation to EMCAL
429 Int_t fClsId = track->GetEMCALcluster();
430 if(fClsId <0) continue;
431 AliESDCaloCluster *cluster = fESD->GetCaloCluster(fClsId);
432 if(TMath::Abs(cluster->GetTrackDx())>0.05 || TMath::Abs(cluster->GetTrackDz())>0.05) continue;
433 fdEdxBef->Fill(p,dEdx);
434 fTPCnsigma->Fill(p,fTPCnSigma);
437 fClsE = cluster->E();
438 cout << "cluster E = " << fClsE <<endl;
441 fvalueElectron[0] = pt;
442 fvalueElectron[1] = p;
443 fvalueElectron[2] = fTPCnSigma;
444 fvalueElectron[3] = dEdx;
445 fvalueElectron[4] = fEovP;
446 fvalueElectron[5] = cluster->GetM20();
447 fvalueElectron[6] = cluster->GetM02();
448 fvalueElectron[7] = cluster->GetDispersion();
450 fSparseElectron->Fill(fvalueElectron);
452 if(fTPCnSigma >= -2 && fTPCnSigma <= 2){
453 fTrkEovPBef->Fill(pt,fEovP);
455 if(fTPCnSigma < -3.5)fTrkEovPBefHad->Fill(pt,fEovP);
458 //--- track accepted, do PID
459 AliHFEpidObject hfetrack;
460 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
461 hfetrack.SetRecTrack(track);
463 if(fPID->IsSelected(&hfetrack, NULL, "", fPIDqa)) pidpassed = 1;
466 cout << "dedx, E/p : "<< dEdx << ", " << fEovP <<endl;
467 fTrkEovPAft->Fill(pt,fEovP);
468 fdEdxAft->Fill(p,dEdx);
469 fTPCnsigmaAft->Fill(p,fTPCnSigma);
473 //Electron id with TPC and E/p
474 if(fTPCnSigma >= -2 && fTPCnSigma <= 2 && fEovP >= 0.8 && fEovP <=1.2) {
475 fElecPhiTPCEovP->Fill(track->Phi());
477 //Electron id with shower shape
478 if(cluster->GetM20()<0.2 && cluster->GetM02()< 0.5 && cluster->GetDispersion()<1){
479 fElecPhi->Fill(track->Phi());
480 fTrkEovPAftOwn->Fill(pt,fEovP);
481 fdEdxAftOwn->Fill(p,dEdx);
482 fTPCnsigmaAftOwn->Fill(p,fTPCnSigma);
484 Bool_t fFlagPhotonicElec = kFALSE;
485 // select photonic electron
486 SelectPhotonicElectron(iTracks,track,fFlagPhotonicElec);
487 //Inclusive electron-hadron correlation
488 ElectronHadCorrel(iTracks, track, fInclusiveElecDphi);
489 fInclusiveElecPt->Fill(pt);
490 // MixedEvent(track,fMixedIncElecDphi);
493 if(fFlagPhotonicElec){
494 //Electron hadron correlation
495 ElectronHadCorrel(iTracks, track, fPhotElecDphi);
496 fPhotoElecPt->Fill(pt);
497 // MixedEvent(track,fMixedPhotElecDphi);
500 // Semi inclusive electron
501 if(!fFlagPhotonicElec){
502 //Electron hadron correlation
503 ElectronHadCorrel(iTracks, track, fSemiIncElecDphi);
504 fSemiInclElecPt->Fill(pt);
505 // MixedEvent(track,fMixedSemiIncElecDphi);
513 Int_t clsNo = fESD->GetNumberOfCaloClusters();
514 fNClusv1->Fill(clsNo);
515 for(Int_t iclus=0; iclus<clsNo ; iclus++){
516 AliESDCaloCluster* clus = fESD->GetCaloCluster(iclus);
517 if(!clus->IsEMCAL()) continue;
518 fNCellv1->Fill(clus->GetNCells());
519 fClsEv1->Fill(clus->E());
523 PostData(1, fOutputList);
525 //_________________________________________
526 void AliAnalysisTaskElecHadronCorrel::UserCreateOutputObjects()
529 // TGeoManager::Import("geometry.root");
530 // fGeom = AliEMCALGeometry::GetInstance("EMCAL_COMPLETEV1");
532 //--------Initialize PID
533 fPID->SetHasMCData(kFALSE);
534 if(!fPID->GetNumberOfPIDdetectors())
536 fPID->AddDetector("TPC", 0);
537 fPID->AddDetector("EMCAL", 1);
540 fPID->SortDetectors();
541 fPIDqa = new AliHFEpidQAmanager();
542 fPIDqa->Initialize(fPID);
544 //--------Initialize correction Framework and Cuts
545 fCFM = new AliCFManager;
546 const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack;
547 fCFM->SetNStepParticle(kNcutSteps);
548 for(Int_t istep = 0; istep < kNcutSteps; istep++)
549 fCFM->SetParticleCutsList(istep, NULL);
552 AliWarning("Cuts not available. Default cuts will be used");
553 fCuts = new AliHFEcuts;
554 fCuts->CreateStandardCuts();
556 fCuts->Initialize(fCFM);
558 //Mixed event initialising
559 Int_t trackDepth = 2000;
560 Int_t poolsize = 1000;
562 Int_t nCentralityBins = 5;
563 Double_t CentralityBins[] = {0,2,4,6,8,10};
566 Double_t vertexBins[] = {-10,0,10};
568 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, (Double_t*) CentralityBins, nZvtxBins, (Double_t*) vertexBins);
570 //---------Output Tlist
571 fOutputList = new TList();
572 fOutputList->SetOwner();
573 fOutputList->Add(fPIDqa->MakeList("PIDQA"));
575 fNoEvents = new TH1F("fNoEvents","",1,0,1) ;
576 fOutputList->Add(fNoEvents);
578 fcentrality = new TH1F("fcentrality","centrality", 100,0,100);
579 fOutputList->Add(fcentrality);
581 fTrkpt = new TH1F("fTrkpt","track pt",1000,0,50);
582 fOutputList->Add(fTrkpt);
584 fTrackPtBefTrkCuts = new TH1F("fTrackPtBefTrkCuts","track pt before track cuts",1000,0,50);
585 fOutputList->Add(fTrackPtBefTrkCuts);
587 fTrackPtAftTrkCuts = new TH1F("fTrackPtAftTrkCuts","track pt after track cuts",1000,0,50);
588 fOutputList->Add(fTrackPtAftTrkCuts);
590 fTPCnsigma = new TH2F("fTPCnsigma", "TPC - n sigma",1000,0,50,200,-10,10);
591 fOutputList->Add(fTPCnsigma);
593 fTPCnsigmaAft = new TH2F("fTPCnsigmaAft", "TPC - n sigma after hfepid",1000,0,50,200,-10,10);
594 fOutputList->Add(fTPCnsigmaAft);
596 fTPCnsigmaAftOwn = new TH2F("fTPCnsigmaAftOwn", "TPC - n sigma after own pid",1000,0,50,200,-10,10);
597 fOutputList->Add(fTPCnsigmaAftOwn);
599 fTrkEovPBef = new TH2F("fTrkEovPBef","track E/p before HFE pid",1000,0,50,100,0,2);
600 fOutputList->Add(fTrkEovPBef);
602 fTrkEovPBefHad = new TH2F("fTrkEovPBefHad","track E/p for TPCnsig < 3.5",1000,0,50,100,0,2);
603 fOutputList->Add(fTrkEovPBefHad);
605 fTrkEovPAft = new TH2F("fTrkEovPAft","track E/p after HFE pid",1000,0,50,100,0,2);
606 fOutputList->Add(fTrkEovPAft);
608 fTrkEovPAftOwn = new TH2F("fTrkEovPAftOwn","track E/p after own pid",1000,0,50,100,0,2);
609 fOutputList->Add(fTrkEovPAftOwn);
611 fdEdxBef = new TH2F("fdEdxBef","track dEdx vs p before HFE pid",1000,0,50,150,0,150);
612 fOutputList->Add(fdEdxBef);
614 fdEdxAft = new TH2F("fdEdxAft","track dEdx vs p after HFE pid",1000,0,50,150,0,150);
615 fOutputList->Add(fdEdxAft);
617 fdEdxAftOwn = new TH2F("fdEdxAftOwn","track dEdx vs p own HFE pid",1000,0,50,150,0,150);
618 fOutputList->Add(fdEdxAftOwn);
620 fElecPhi = new TH1F("fElecPhi", "Electron phi",1000,0,6.28);
621 fOutputList->Add(fElecPhi);
623 fElecPhiTPC = new TH1F("fElecPhiTPC", "Electron phi after TPC cut",1000,0,6.28);
624 fOutputList->Add(fElecPhiTPC);
626 fElecPhiTPCEovP = new TH1F("fElecPhiTPCEovP", "Electron phi after TPC and E/p cut",1000,0,6.28);
627 fOutputList->Add(fElecPhiTPCEovP);
629 fHadronPhi = new TH1F("fHadronPhi", "Hadron phi",1000,0,6.28);
630 fOutputList->Add(fHadronPhi);
632 fTrackHFEcuts = new TH1F("fTrackHFEcuts","Track phi for HFE cuts",1000,0,6.28);
633 fOutputList->Add(fTrackHFEcuts);
635 fTrakPhiSPD1 = new TH1F("fTrakPhiSPD1","Track phi for hit in SPD layer 1",1000,0,6.28);
636 fOutputList->Add(fTrakPhiSPD1);
638 fTrakPhiSPD2 = new TH1F("fTrakPhiSPD2","Track phi for hit in SPD layer 2",1000,0,6.28);
639 fOutputList->Add(fTrakPhiSPD2);
641 fTrakPhiSPDOr = new TH1F("fTrakPhiSPDOr","Track phi for hit in any SPD layer",1000,0,6.28);
642 fOutputList->Add(fTrakPhiSPDOr);
644 fTrakPhiSPDAnd = new TH1F("fTrakPhiSPDAnd","Track phi for hit in both SPD layer",1000,0,6.28);
645 fOutputList->Add(fTrakPhiSPDAnd);
647 fTrackHFEcutsITS = new TH1F("fTrackHFEcutsITS","Track phi for HFE cuts + ITS HFE cuts",1000,0,6.28);
648 fOutputList->Add(fTrackHFEcutsITS);
650 // fInvmassLS = new TH1F("fInvmassLS", "Inv mass of LS (e,e) if mass cal is correct; mass(GeV/c^2); counts;", 1000,0,1.0);
651 // fOutputList->Add(fInvmassLS);
653 // fInvmassULS = new TH1F("fInvmassULS", "Inv mass of ULS (e,e); mass(GeV/c^2) if mass cal is correct; counts;", 1000,0,1.0);
654 // fOutputList->Add(fInvmassULS);
656 fOpeningAngleLS = new TH1F("fOpeningAngleLS","Opening angle for LS pairs",100,0,1);
657 fOutputList->Add(fOpeningAngleLS);
659 fOpeningAngleULS = new TH1F("fOpeningAngleULS","Opening angle for ULS pairs",100,0,1);
660 fOutputList->Add(fOpeningAngleULS);
662 fSemiIncElecDphi = new TH2F("fSemiIncElecDphi", "Semi Inclusive elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
663 fOutputList->Add(fSemiIncElecDphi);
665 fPhotElecDphi = new TH2F("fPhotElecDphi", "Photon elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
666 fOutputList->Add(fPhotElecDphi);
668 fInclusiveElecDphi = new TH2F("fInclusiveElecDphi", "Inclusive elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
669 fOutputList->Add(fInclusiveElecDphi);
671 fDphiULSMassLow = new TH2F("fDphiULSMassLow", "e-h Dphi ULS, mass<0.01",200,0,20,100,-1.6,4.75);
672 fOutputList->Add(fDphiULSMassLow);
674 fDphiLSMassLow = new TH2F("fDphiLSMassLow", "e-h Dphi LS, mass<0.01",200,0,20,100,-1.6,4.75);
675 fOutputList->Add(fDphiLSMassLow);
677 fDphiULSMassLowNoPartner = new TH2F("fDphiULSMassLowNoPartner", "e-h Dphi ULS with no partner, mass<mass cut,",200,0,20,100,-1.6,4.75);
678 fOutputList->Add(fDphiULSMassLowNoPartner);
680 fDphiLSMassLowNoPartner = new TH2F("fDphiLSMassLowNoPartner", "e-h Dphi LS with no partner, mass<mass cut",200,0,20,100,-1.6,4.75);
681 fOutputList->Add(fDphiLSMassLowNoPartner);
683 fPhotoElecPt = new TH1F("fPhotoElecPt", "photonic electron pt",1000,0,100);
684 fOutputList->Add(fPhotoElecPt);
686 fSemiInclElecPt = new TH1F("fSemiInclElecPt", "Semi-inclusive electron pt",1000,0,100);
687 fOutputList->Add(fSemiInclElecPt);
689 fInclusiveElecPt = new TH1F("fInclElecPt", "Inclusive electron pt",1000,0,100);
690 fOutputList->Add(fInclusiveElecPt);
692 fULSElecPt = new TH1F("fULSElecPt", "ULS electron pt",1000,0,100);
693 fOutputList->Add(fULSElecPt);
695 fLSElecPt = new TH1F("fLSElecPt", "LS electron pt",1000,0,100);
696 fOutputList->Add(fLSElecPt);
698 fNCellv1 = new TH1F("fNCellv1","Ncell in clus (v1); NCell; count",100,0,100) ;
699 fOutputList->Add(fNCellv1);
701 fClsEv1 = new TH1F("fClsEv1", "Clus E(v1); Cls E; count",1000,0,100);
702 fOutputList->Add(fClsEv1);
704 fNClusv1 = new TH1F("fNClusv1","Nclus in event (v1); NClus; count",500,0,500) ;
705 fOutputList->Add(fNClusv1);
707 fKFParticleP = new TH1F("fKFParticleP","KFparticle rec P; P(GeV/c)",1000,0,50);
708 fOutputList->Add(fKFParticleP);
710 fKFParticleE = new TH1F("fKFParticleE", "KfParticle rec E; E; count",1000,0,100);
711 fOutputList->Add(fKFParticleE);
713 fInvmassLS1 = new TH1F("fInvmassLS1", "Inv mass of LS (e,e); mass(GeV/c^2); counts;", 1000,0,1.0);
714 fOutputList->Add(fInvmassLS1);
716 fInvmassULS1 = new TH1F("fInvmassULS1", "Inv mass of ULS (e,e); mass(GeV/c^2); counts;", 1000,0,1.0);
717 fOutputList->Add(fInvmassULS1);
719 fNoMixedEvents = new TH1F("fNoMixedEvents","",1,0,1) ;
720 fOutputList->Add(fNoMixedEvents);
722 fMixStat = new TH2F("fMixStat","no of events in pool vs multiplicity;Nevent in pool;N hadrons",200,0,200,500,0,500);
723 fOutputList->Add(fMixStat);
725 fMixStat1 = new TH2F("fMixStat1","no of events in pool vs zvtx;Nevents in pool;zvtx",200,0,200,200,-11,11);
726 fOutputList->Add(fMixStat1);
728 fMixedIncElecDphi = new TH2F("fMixedIncElecDphi", "Mixed event - Inclusive elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
729 fOutputList->Add(fMixedIncElecDphi);
731 fMixedSemiIncElecDphi = new TH2F("fMixedSemiIncElecDphi", "Mixed event - Semi Inclusive elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
732 fOutputList->Add(fMixedSemiIncElecDphi);
734 fMixedPhotElecDphi = new TH2F("fMixedPhotElecDphi", "Mixed event - Photo elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
735 fOutputList->Add(fMixedPhotElecDphi);
737 fMixedDphiULSMassLow = new TH2F("fMixedDphiULSMassLow", "Mixed event - ULS mass < cut elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
738 fOutputList->Add(fMixedDphiULSMassLow);
740 fMixedDphiLSMassLow = new TH2F("fMixedDphiLSMassLow", "Mixed event - LS mass < cut elec-had Dphi correlation",200,0,20,100,-1.6,4.75);
741 fOutputList->Add(fMixedDphiLSMassLow);
744 Int_t binsv1[8]={1000,1000,200,150,100,100,100,100}; //pt, p, TPCnsig, dEdx, E/p, M20, M02, dispersion
745 Double_t xminv1[8]={0,0,-10,0,0,0,0,0};
746 Double_t xmaxv1[8]={50,50,10,150,2,2,2,2};
747 fSparseElectron = new THnSparseD ("Electron","Electron",8,binsv1,xminv1,xmaxv1);
748 fOutputList->Add(fSparseElectron);
750 PostData(1,fOutputList);
753 //________________________________________________________________________
754 void AliAnalysisTaskElecHadronCorrel::Terminate(Option_t *)
756 // Info("Terminate");
757 AliAnalysisTaskSE::Terminate();
760 //________________________________________________________________________
761 Bool_t AliAnalysisTaskElecHadronCorrel::ProcessCutStep(Int_t cutStep, AliVParticle *track)
763 // Check single track cuts for a given cut step
764 const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack;
765 if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE;
768 //_________________________________________
769 void AliAnalysisTaskElecHadronCorrel::SelectPhotonicElectron(Int_t itrack, AliESDtrack *track, Bool_t &fFlagPhotonicElec)
771 //Identify non-heavy flavour electrons using Invariant mass method
773 fTrackCuts1->SetAcceptKinkDaughters(kFALSE);
774 fTrackCuts1->SetRequireTPCRefit(kTRUE);
775 fTrackCuts1->SetEtaRange(-0.9,0.9);
776 fTrackCuts1->SetRequireSigmaToVertex(kTRUE);
777 fTrackCuts1->SetMaxChi2PerClusterTPC(3.5);
778 fTrackCuts1->SetMinNClustersTPC(80);
780 // const AliESDVertex *pVtx = fESD->GetPrimaryVertex();
782 Bool_t flagPhotonicElec = kFALSE;
784 for(Int_t jTracks = itrack+1; jTracks<fESD->GetNumberOfTracks(); jTracks++){
785 AliESDtrack* trackAsso = fESD->GetTrack(jTracks);
787 printf("ERROR: Could not receive track %d\n", jTracks);
791 Double_t dEdxAsso = -999., ptAsso=-999., openingAngle = -999.;
792 Double_t mass=-999., width = -999;
793 Bool_t fFlagLS=kFALSE, fFlagULS=kFALSE;
795 dEdxAsso = trackAsso->GetTPCsignal();
796 ptAsso = trackAsso->Pt();
797 Int_t chargeAsso = trackAsso->Charge();
798 Int_t charge = track->Charge();
800 if(ptAsso <0.3) continue;
801 if(!fTrackCuts1->AcceptTrack(trackAsso)) continue;
802 if(dEdxAsso <70 || dEdxAsso>100) continue; //11a pass1
804 Int_t fPDGe1 = 11; Int_t fPDGe2 = 11;
805 if(charge>0) fPDGe1 = -11;
806 if(chargeAsso>0) fPDGe2 = -11;
808 if(charge == chargeAsso) fFlagLS = kTRUE;
809 if(charge != chargeAsso) fFlagULS = kTRUE;
811 AliKFParticle ge1 = AliKFParticle(*track, fPDGe1);
812 AliKFParticle ge2 = AliKFParticle(*trackAsso, fPDGe2);
813 AliKFParticle recg(ge1, ge2);
815 Double_t recP2=-999.0, recP=-999.0, recE=-999.0, m2=-999.0, m=-999.0;
816 recP2= (recg.GetPx()*recg.GetPx() + recg.GetPy()*recg.GetPy() + recg.GetPz()*recg.GetPz());
817 recP = TMath::Sqrt(recP2);
819 fKFParticleP->Fill(recP);
820 fKFParticleE->Fill(recE);
821 m2 = (recg.GetE()*recg.GetE() - recg.GetPx()*recg.GetPx() - recg.GetPy()*recg.GetPy() - recg.GetPz()*recg.GetPz());
824 if(recg.GetNDF()<1) continue;
825 Double_t chi2recg = recg.GetChi2()/recg.GetNDF();
826 if(TMath::Sqrt(TMath::Abs(chi2recg))>3.) continue;
828 openingAngle = ge1.GetAngle(ge2);
829 if(fFlagLS) fOpeningAngleLS->Fill(openingAngle);
830 if(fFlagULS) fOpeningAngleULS->Fill(openingAngle);
832 // if(openingAngle > fOpeningAngleCut) continue;
835 MassCorrect = recg.GetMass(mass,width);
836 cout << "mass = " << mass <<endl;
838 if(fFlagLS) fInvmassLS1->Fill(mass);
839 if(fFlagULS) fInvmassULS1->Fill(mass);
841 // if(MassCorrect==1){
842 // if(fFlagLS) fInvmassLS->Fill(m);
843 // if(fFlagULS) fInvmassULS->Fill(m);
845 if(mass<fInvmassCut){
848 ElectronHadCorrel(itrack,track,fDphiULSMassLow);
849 fULSElecPt->Fill(track->Pt());
850 // MixedEvent(track,fMixedDphiULSMassLow);
854 ElectronHadCorrel(itrack,track,fDphiLSMassLow);
855 fLSElecPt->Fill(track->Pt());
856 // MixedEvent(track,fMixedDphiLSMassLow);
858 if(fFlagLS) ElectronHadCorrelNoPartner(itrack,jTracks,track,fDphiLSMassLowNoPartner);
859 if(fFlagULS) ElectronHadCorrelNoPartner(itrack,jTracks,track,fDphiULSMassLowNoPartner);
862 if(mass<fInvmassCut && fFlagULS && !flagPhotonicElec){
863 flagPhotonicElec = kTRUE;
868 fFlagPhotonicElec = flagPhotonicElec;
871 //_________________________________________
872 void AliAnalysisTaskElecHadronCorrel::ElectronHadCorrel(Int_t itrack, AliESDtrack *track, TH2F *DphiPt)
874 //Construct Delta Phi between electrons and hadrons
876 fTrackCuts2->SetAcceptKinkDaughters(kFALSE);
877 fTrackCuts2->SetRequireTPCRefit(kTRUE);
878 fTrackCuts2->SetRequireITSRefit(kTRUE);
879 fTrackCuts2->SetEtaRange(-0.9,0.9);
880 fTrackCuts2->SetRequireSigmaToVertex(kTRUE);
881 fTrackCuts2->SetMaxChi2PerClusterTPC(3.5);
882 fTrackCuts2->SetMinNClustersTPC(80);
884 for(Int_t ktracks = 0; ktracks<fESD->GetNumberOfTracks(); ktracks++){
885 AliESDtrack* trackHad = fESD->GetTrack(ktracks);
887 printf("ERROR: Could not receive track %d\n", ktracks);
890 if(ktracks == itrack) continue; //do not select the same electron
892 Double_t ptHad= -999, pHad=-999., dEdxHad = -999;
893 Double_t ptEle = -999;
894 Double_t phiEle = -999, phiHad = -999, Dphi = -999;
897 dEdxHad = trackHad->GetTPCsignal();
898 ptHad = trackHad->Pt();
899 pHad = trackHad->P();
902 if(ptHad <2) continue;
903 if(ptHad > ptEle) continue;
904 if(!fTrackCuts2->AcceptTrack(trackHad)) continue;
906 fHadronPhi->Fill(trackHad->Phi());
908 phiEle = track->Phi();
909 phiHad = trackHad->Phi();
910 Dphi = phiEle - phiHad;
916 DphiPt->Fill(ptEle,Dphi);
920 //_________________________________________
921 void AliAnalysisTaskElecHadronCorrel::ElectronHadCorrelNoPartner(Int_t itrack,Int_t jtrack, AliESDtrack *track, TH2F *DphiPtNew)
923 //Construct Delta Phi between electrons and hadrons for electrons from invariant mass calculation excluding associated track
925 fTrackCuts2->SetAcceptKinkDaughters(kFALSE);
926 fTrackCuts2->SetRequireTPCRefit(kTRUE);
927 fTrackCuts2->SetRequireITSRefit(kTRUE);
928 fTrackCuts2->SetEtaRange(-0.9,0.9);
929 fTrackCuts2->SetRequireSigmaToVertex(kTRUE);
930 fTrackCuts2->SetMaxChi2PerClusterTPC(3.5);
931 fTrackCuts2->SetMinNClustersTPC(80);
933 for(Int_t ktracks = 0; ktracks<fESD->GetNumberOfTracks(); ktracks++){
934 AliESDtrack* trackHad = fESD->GetTrack(ktracks);
936 printf("ERROR: Could not receive track %d\n", ktracks);
939 if(ktracks == itrack || ktracks == jtrack) continue; //do not select the same electron and associated track from inv mass cal
942 Double_t ptHad= -999, pHad=-999., dEdxHad = -999;
943 Double_t ptEle = -999;
944 Double_t phiEle = -999, phiHad = -999, Dphi = -999;
947 dEdxHad = trackHad->GetTPCsignal();
948 ptHad = trackHad->Pt();
949 pHad = trackHad->P();
952 if(ptHad <2) continue;
953 if(ptHad > ptEle) continue;
954 if(!fTrackCuts2->AcceptTrack(trackHad)) continue;
956 phiEle = track->Phi();
957 phiHad = trackHad->Phi();
958 Dphi = phiEle - phiHad;
964 DphiPtNew->Fill(ptEle,Dphi);
968 //_________________________________________
969 void AliAnalysisTaskElecHadronCorrel::MixedEvent(AliESDtrack *track, TH2F *DphiPt)
972 const AliESDVertex *pVtx = fESD->GetPrimaryVertex();
977 AliCentrality *fCentrality = (AliCentrality*)fESD->GetCentrality();
978 Double_t centvalue = fCentrality->GetCentralityPercentile("V0M");
980 AliEventPool* pool = fPoolMgr->GetEventPool(centvalue, zVtx); // Get the buffer associated with the current centrality and z-vtx
982 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", centvalue, zVtx));
984 // pool->PrintInfo();
985 if (pool->GetCurrentNEvents() >= 5) // start mixing when 5 events are in the buffer
987 Int_t nMix = pool->GetCurrentNEvents();
988 fNoMixedEvents->Fill(0);
989 fMixStat->Fill(pool->GetCurrentNEvents(),centvalue);
990 fMixStat1->Fill(pool->GetCurrentNEvents(),zVtx);
992 cout << "nMix = " << nMix << " tracks in pool = " << pool->NTracksInPool() << endl;
993 for (Int_t jMix=0; jMix<pool->GetCurrentNEvents(); jMix++) // mix with each event in the buffer
995 TObjArray* bgTracks = pool->GetEvent(jMix);
996 for (Int_t i=0;i<bgTracks->GetEntriesFast(); i++)
998 AliVParticle* mixtrk = (AliVParticle*) bgTracks->At(i);
1000 Double_t mixtrkPhi = -999;
1001 Double_t ptEle = -999;
1002 Double_t phiEle = -999, Dphi = -999;
1004 Double_t ptmixtrk = -999;
1006 ptEle = track->Pt();
1007 if(ptmixtrk > ptEle) continue;
1009 mixtrkPhi = mixtrk->Phi();
1010 phiEle = track->Phi();
1011 Dphi = phiEle - mixtrkPhi;
1017 cout << "dphi ; " << Dphi <<endl;
1018 DphiPt->Fill(ptEle,Dphi);
1025 //___________________________________________
1026 TObjArray* AliAnalysisTaskElecHadronCorrel::CloneAndReduceTrackList()
1028 // clones a track list by using AliDPhiBasicParticle which uses much less memory (used for event mixing)
1030 fTrackCuts2->SetAcceptKinkDaughters(kFALSE);
1031 fTrackCuts2->SetRequireTPCRefit(kTRUE);
1032 fTrackCuts2->SetRequireITSRefit(kTRUE);
1033 fTrackCuts2->SetEtaRange(-0.9,0.9);
1034 fTrackCuts2->SetRequireSigmaToVertex(kTRUE);
1035 fTrackCuts2->SetMaxChi2PerClusterTPC(3.5);
1036 fTrackCuts2->SetMinNClustersTPC(80);
1038 TObjArray* tracksClone = new TObjArray;
1039 tracksClone->SetOwner(kTRUE);
1041 for(Int_t ktracks = 0; ktracks<fESD->GetNumberOfTracks(); ktracks++){
1042 AliESDtrack* track = fESD->GetTrack(ktracks);
1044 printf("ERROR: Could not receive track %d\n", ktracks);
1048 // if(ktracks == iTrack) continue;
1049 Double_t ptHad= -999, pHad=-999.;
1050 ptHad = track->Pt();
1053 if(ptHad <2) continue;
1054 if(!fTrackCuts2->AcceptTrack(track)) continue;
1056 cout << "hadrntrk"<<endl;
1057 AliVParticle* particle = (AliVParticle*) fESD->GetTrack(ktracks);
1058 tracksClone->Add(new AliDPhiBasicParticle(particle->Eta(), particle->Phi(), particle->Pt(), particle->Charge()));