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 "AliEMCALRecoUtils.h"
59 #include "AliEMCALGeometry.h"
60 #include "AliGeomManager.h"
62 #include "TGeoManager.h"
66 #include "AliEMCALTrack.h"
69 #include "AliKFParticle.h"
70 #include "AliKFVertex.h"
73 #include "AliPIDResponse.h"
74 #include "AliHFEcontainer.h"
75 #include "AliHFEcuts.h"
76 #include "AliHFEpid.h"
77 #include "AliHFEpidBase.h"
78 #include "AliHFEpidQAmanager.h"
79 #include "AliHFEtools.h"
80 #include "AliCFContainer.h"
81 #include "AliCFManager.h"
83 ClassImp(AliAnalysisTaskElecHadronCorrel)
84 //________________________________________________________________________
85 AliAnalysisTaskElecHadronCorrel::AliAnalysisTaskElecHadronCorrel(const char *name)
86 : AliAnalysisTaskSE(name)
93 ,fIdentifiedAsOutInz(kFALSE)
94 ,fPassTheEventCut(kFALSE)
95 ,fRejectKinkMother(kFALSE)
100 ,fOpeningAngleCut(0.1)
114 ,fInclusiveElecDphi(0)
120 ,fTrackPtBefTrkCuts(0)
121 ,fTrackPtAftTrkCuts(0)
126 fPID = new AliHFEpid("hfePid");
127 fTrackCuts1 = new AliESDtrackCuts();
128 fTrackCuts2 = new AliESDtrackCuts();
130 // Define input and output slots here
131 // Input slot #0 works with a TChain
132 DefineInput(0, TChain::Class());
133 // Output slot #0 id reserved by the base class for AOD
134 // Output slot #1 writes into a TH1 container
135 // DefineOutput(1, TH1I::Class());
136 DefineOutput(1, TList::Class());
137 // DefineOutput(3, TTree::Class());
140 //________________________________________________________________________
141 AliAnalysisTaskElecHadronCorrel::AliAnalysisTaskElecHadronCorrel()
142 : AliAnalysisTaskSE("DefaultAnalysis_AliAnalysisElecHadCorrel")
149 ,fIdentifiedAsOutInz(kFALSE)
150 ,fPassTheEventCut(kFALSE)
151 ,fRejectKinkMother(kFALSE)
156 ,fOpeningAngleCut(0.1)
170 ,fInclusiveElecDphi(0)
176 ,fTrackPtBefTrkCuts(0)
177 ,fTrackPtAftTrkCuts(0)
180 //Default constructor
181 fPID = new AliHFEpid("hfePid");
183 fTrackCuts1 = new AliESDtrackCuts();
184 fTrackCuts2 = new AliESDtrackCuts();
187 // Define input and output slots here
188 // Input slot #0 works with a TChain
189 DefineInput(0, TChain::Class());
190 // Output slot #0 id reserved by the base class for AOD
191 // Output slot #1 writes into a TH1 container
192 // DefineOutput(1, TH1I::Class());
193 DefineOutput(1, TList::Class());
194 //DefineOutput(3, TTree::Class());
196 //_________________________________________
198 AliAnalysisTaskElecHadronCorrel::~AliAnalysisTaskElecHadronCorrel()
210 //_________________________________________
212 void AliAnalysisTaskElecHadronCorrel::UserExec(Option_t*)
215 //Called for each event
217 // create pointer to event
218 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
220 printf("ERROR: fESD not available\n");
225 AliError("HFE cuts not available");
229 if(!fPID->IsInitialized()){
230 // Initialize PID with the given run number
231 AliWarning("PID not initialised, get from Run no");
232 fPID->InitializePID(fESD->GetRunNumber());
235 //-------trigger selection
236 UInt_t res = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
240 if( (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kFastOnly) )
243 if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kEMC1) ) return;
244 //if(!(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB) ) return;
246 Int_t fNOtrks = fESD->GetNumberOfTracks();
247 const AliESDVertex *pVtx = fESD->GetPrimaryVertex();
249 Double_t pVtxZ = -999;
250 pVtxZ = pVtx->GetZ();
253 // if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) return;
255 //Check if its an LED event
256 if(IsLEDEvent()) return;
258 if(TMath::Abs(pVtxZ)>10) return;
261 if(fNOtrks<2) return;
263 AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
265 AliDebug(1, "Using default PID Response");
266 pidResponse = AliHFEtools::GetDefaultPID(kFALSE, fInputEvent->IsA() == AliAODEvent::Class());
269 fPID->SetPIDResponse(pidResponse);
271 fCFM->SetRecEventInfo(fESD);
274 for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
275 AliESDtrack* track = fESD->GetTrack(iTracks);
277 printf("ERROR: Could not receive track %d\n", iTracks);
281 fTrackPtBefTrkCuts->Fill(track->Pt());
282 // RecKine: ITSTPC cuts
283 if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
286 if(fRejectKinkMother) { // Quick and dirty fix to reject both kink mothers and daughters
287 if(track->GetKinkIndex(0) != 0) continue;
291 if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
293 // HFEcuts: ITS layers cuts
294 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
296 // HFE cuts: TPC PID cleanup
297 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
299 fTrackPtAftTrkCuts->Fill(track->Pt());
301 Double_t fClsE = -999, p = -999, fEovP=-999, pt = -999, dEdx=-999, fTPCnSigma=0;
302 // Track extrapolation
303 Int_t fClsId = track->GetEMCALcluster();
304 if(fClsId == -1) continue;
305 AliESDCaloCluster *cluster = fESD->GetCaloCluster(fClsId);
310 fClsE = cluster->E();
312 dEdx = track->GetTPCsignal();
314 fTPCnSigma = fPID->GetPIDResponse() ? fPID->GetPIDResponse()->NumberOfSigmasTPC(track, AliPID::kElectron) : 1000;
315 fdEdxBef->Fill(p,dEdx);
316 fTPCnsigma->Fill(p,fTPCnSigma);
318 if(fTPCnSigma >= 1.5 && fTPCnSigma <= 3)fTrkEovPBef->Fill(pt,fEovP);
320 //--- track accepted, do PID
321 AliHFEpidObject hfetrack;
322 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
323 hfetrack.SetRecTrack(track);
325 if(!fPID->IsSelected(&hfetrack, NULL, "", fPIDqa)) pidpassed = 0;
327 if(pidpassed==0) continue;
328 fTrkEovPAft->Fill(pt,fEovP);
329 fdEdxAft->Fill(p,dEdx);
331 Bool_t fFlagPhotonicElec = kFALSE;
332 // select photonic electron
333 SelectPhotonicElectron(iTracks,track,fFlagPhotonicElec);
335 //Inclusive electron-hadron correlation
336 ElectronHadCorrel(iTracks, track, fInclusiveElecDphi);
339 if(fFlagPhotonicElec){
340 //Electron hadron correlation
341 ElectronHadCorrel(iTracks, track, fPhotElecDphi);
342 fPhotoElecPt->Fill(pt);
345 // Semi inclusive electron
346 if(!fFlagPhotonicElec){
347 //Electron hadron correlation
348 ElectronHadCorrel(iTracks, track, fSemiIncElecDphi);
349 fSemiInclElecPt->Fill(pt);
354 PostData(1, fOutputList);
356 //_________________________________________
357 void AliAnalysisTaskElecHadronCorrel::UserCreateOutputObjects()
360 TGeoManager::Import("geometry.root");
361 fGeom = AliEMCALGeometry::GetInstance("EMCAL_COMPLETEV1");
363 //--------Initialize PID
364 fPID->SetHasMCData(kFALSE);
365 if(!fPID->GetNumberOfPIDdetectors())
367 fPID->AddDetector("TPC", 0);
368 fPID->AddDetector("EMCAL", 1);
371 fPID->SortDetectors();
372 fPIDqa = new AliHFEpidQAmanager();
373 fPIDqa->Initialize(fPID);
375 //--------Initialize correction Framework and Cuts
376 fCFM = new AliCFManager;
377 const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack;
378 fCFM->SetNStepParticle(kNcutSteps);
379 for(Int_t istep = 0; istep < kNcutSteps; istep++)
380 fCFM->SetParticleCutsList(istep, NULL);
383 AliWarning("Cuts not available. Default cuts will be used");
384 fCuts = new AliHFEcuts;
385 fCuts->CreateStandardCuts();
387 fCuts->Initialize(fCFM);
389 //---------Output Tlist
390 fOutputList = new TList();
391 fOutputList->SetOwner();
392 fOutputList->Add(fPIDqa->MakeList("PIDQA"));
394 fNoEvents = new TH1F("fNoEvents","",1,0,1) ;
395 fOutputList->Add(fNoEvents);
397 fTrkpt = new TH1F("fTrkpt","track pt",1000,0,50);
398 fOutputList->Add(fTrkpt);
400 fTrackPtBefTrkCuts = new TH1F("fTrackPtBefTrkCuts","track pt before track cuts",1000,0,50);
401 fOutputList->Add(fTrackPtBefTrkCuts);
403 fTrackPtAftTrkCuts = new TH1F("fTrackPtAftTrkCuts","track pt after track cuts",1000,0,50);
404 fOutputList->Add(fTrackPtAftTrkCuts);
406 fTPCnsigma = new TH2F("fTPCnsigma", "TPC - n sigma",1000,0,50,200,-10,10);
407 fOutputList->Add(fTPCnsigma);
409 fTrkEovPBef = new TH2F("fTrkEovPBef","track E/p before HFE pid",1000,0,50,100,0,2);
410 fOutputList->Add(fTrkEovPBef);
412 fTrkEovPAft = new TH2F("fTrkEovPAft","track E/p after HFE pid",1000,0,50,100,0,2);
413 fOutputList->Add(fTrkEovPAft);
415 fdEdxBef = new TH2F("fdEdxBef","track dEdx vs p before HFE pid",1000,0,50,150,0,150);
416 fOutputList->Add(fdEdxBef);
418 fdEdxAft = new TH2F("fdEdxAft","track dEdx vs p after HFE pid",1000,0,50,150,0,150);
419 fOutputList->Add(fdEdxAft);
421 fInvmassLS = new TH1F("fInvmassLS", "Inv mass of LS (e,e); mass(GeV/c^2); counts;", 1000,0,0.5);
422 fOutputList->Add(fInvmassLS);
424 fInvmassULS = new TH1F("fInvmassULS", "Inv mass of ULS (e,e); mass(GeV/c^2); counts;", 1000,0,0.5);
425 fOutputList->Add(fInvmassULS);
427 fOpeningAngleLS = new TH1F("fOpeningAngleLS","Opening angle for LS pairs",100,0,1);
428 fOutputList->Add(fOpeningAngleLS);
430 fOpeningAngleULS = new TH1F("fOpeningAngleULS","Opening angle for ULS pairs",100,0,1);
431 fOutputList->Add(fOpeningAngleULS);
433 fSemiIncElecDphi = new TH2F("fSemiIncElecDphi", "Semi Inclusive elec-had Dphi correlation",200,0,20,100,-3.14,3.14);
434 fOutputList->Add(fSemiIncElecDphi);
436 fPhotElecDphi = new TH2F("fPhotElecDphi", "Photon elec-had Dphi correlation",200,0,20,100,-3.14,3.14);
437 fOutputList->Add(fPhotElecDphi);
439 fInclusiveElecDphi = new TH2F("fInclusiveElecDphi", "Inclusive elec-had Dphi correlation",200,0,20,100,-3.14,3.14);
440 fOutputList->Add(fInclusiveElecDphi);
442 fDphiMassHigh = new TH2F("fDphiMassHigh", "e-h Dphi LS+ULS, mass>0.01",200,0,20,100,-3.14,3.14);
443 fOutputList->Add(fDphiMassHigh);
445 fDphiULSMassLow = new TH2F("fDphiULSMassLow", "e-h Dphi ULS, mass<0.01",200,0,20,100,-3.14,3.14);
446 fOutputList->Add(fDphiULSMassLow);
448 fDphiLSMassLow = new TH2F("fDphiLSMassLow", "e-h Dphi LS, mass<0.01",200,0,20,100,-3.14,3.14);
449 fOutputList->Add(fDphiLSMassLow);
451 fPhotoElecPt = new TH1F("fPhotoElecPt", "photonic electron pt",1000,0,100);
452 fOutputList->Add(fPhotoElecPt);
454 fSemiInclElecPt = new TH1F("fSemiInclElecPt", "Semi-inclusive electron pt",1000,0,100);
455 fOutputList->Add(fSemiInclElecPt);
456 PostData(1,fOutputList);
459 //________________________________________________________________________
460 void AliAnalysisTaskElecHadronCorrel::Terminate(Option_t *)
462 // Info("Terminate");
463 AliAnalysisTaskSE::Terminate();
466 //________________________________________________________________________
467 Bool_t AliAnalysisTaskElecHadronCorrel::ProcessCutStep(Int_t cutStep, AliVParticle *track)
469 // Check single track cuts for a given cut step
470 const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack;
471 if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE;
474 //_________________________________________
475 void AliAnalysisTaskElecHadronCorrel::SelectPhotonicElectron(Int_t itrack, AliESDtrack *track, Bool_t &fFlagPhotonicElec)
477 //Identify non-heavy flavour electrons using Invariant mass method
479 fTrackCuts1->SetAcceptKinkDaughters(kFALSE);
480 fTrackCuts1->SetRequireTPCRefit(kTRUE);
481 fTrackCuts1->SetEtaRange(-0.9,0.9);
482 fTrackCuts1->SetRequireSigmaToVertex(kTRUE);
483 fTrackCuts1->SetMaxChi2PerClusterTPC(3.5);
484 fTrackCuts1->SetMinNClustersTPC(80);
486 const AliESDVertex *pVtx = fESD->GetPrimaryVertex();
488 Bool_t flagPhotonicElec = kFALSE;
490 for(Int_t jTracks = itrack+1; jTracks<fESD->GetNumberOfTracks(); jTracks++){
491 AliESDtrack* trackAsso = fESD->GetTrack(jTracks);
493 printf("ERROR: Could not receive track %d\n", jTracks);
497 Double_t dEdxAsso = -999., ptAsso=-999., openingAngle = -999.;
498 Double_t mass=999., width = -999;
499 Bool_t fFlagLS=kFALSE, fFlagULS=kFALSE;
501 dEdxAsso = trackAsso->GetTPCsignal();
502 ptAsso = trackAsso->Pt();
503 Int_t chargeAsso = trackAsso->Charge();
504 Int_t charge = track->Charge();
506 if(ptAsso <0.3) continue;
507 if(!fTrackCuts1->AcceptTrack(trackAsso)) continue;
508 if(dEdxAsso <70 || dEdxAsso>100) continue; //11a pass1
510 Int_t fPDGe1 = 11; Int_t fPDGe2 = 11;
511 if(charge>0) fPDGe1 = -11;
512 if(chargeAsso>0) fPDGe2 = -11;
514 if(charge == chargeAsso) fFlagLS = kTRUE;
515 if(charge != chargeAsso) fFlagULS = kTRUE;
517 AliKFParticle ge1(*track, fPDGe1);
518 AliKFParticle ge2(*trackAsso, fPDGe2);
519 AliKFParticle recg(ge1, ge2);
521 if(recg.GetNDF()<1) continue;
522 Double_t chi2recg = recg.GetChi2()/recg.GetNDF();
523 if(TMath::Sqrt(TMath::Abs(chi2recg))>3.) continue;
525 AliKFVertex primV(*pVtx);
527 recg.SetProductionVertex(primV);
529 recg.SetMassConstraint(0,0.0001);
531 openingAngle = ge1.GetAngle(ge2);
532 if(fFlagLS) fOpeningAngleLS->Fill(openingAngle);
533 if(fFlagULS) fOpeningAngleULS->Fill(openingAngle);
535 if(openingAngle > fOpeningAngleCut) continue;
537 recg.GetMass(mass,width);
539 if(fFlagLS) fInvmassLS->Fill(mass);
540 if(fFlagULS) fInvmassULS->Fill(mass);
542 if(mass>fInvmassCut){
543 ElectronHadCorrel(itrack,track,fDphiMassHigh);
545 if(mass>fInvmassCut){
546 if(fFlagULS) ElectronHadCorrel(itrack,track,fDphiULSMassLow);
547 if(fFlagLS) ElectronHadCorrel(itrack,track,fDphiLSMassLow);
550 if(mass<fInvmassCut && fFlagULS && !flagPhotonicElec){
551 flagPhotonicElec = kTRUE;
555 fFlagPhotonicElec = flagPhotonicElec;
558 //_________________________________________
559 void AliAnalysisTaskElecHadronCorrel::ElectronHadCorrel(Int_t itrack, AliESDtrack *track, TH2F *DphiPt)
561 //Construct Delta Phi between electrons and hadrons
563 fTrackCuts2->SetAcceptKinkDaughters(kFALSE);
564 fTrackCuts2->SetRequireTPCRefit(kTRUE);
565 fTrackCuts2->SetRequireITSRefit(kTRUE);
566 fTrackCuts2->SetEtaRange(-0.9,0.9);
567 fTrackCuts2->SetRequireSigmaToVertex(kTRUE);
568 fTrackCuts2->SetMaxChi2PerClusterTPC(3.5);
569 fTrackCuts2->SetMinNClustersTPC(80);
571 for(Int_t ktracks = 0; ktracks<fESD->GetNumberOfTracks(); ktracks++){
572 AliESDtrack* trackHad = fESD->GetTrack(ktracks);
574 printf("ERROR: Could not receive track %d\n", ktracks);
577 if(ktracks == itrack) continue; //do not select the same electron
579 Double_t ptHad= -999, pHad=-999., dEdxHad = -999;
580 Double_t ptEle = -999;
581 Double_t phiEle = -999, phiHad = -999, Dphi = -999;
584 dEdxHad = trackHad->GetTPCsignal();
585 ptHad = trackHad->Pt();
586 pHad = trackHad->P();
588 if(ptHad <0.3) continue;
589 if(!fTrackCuts2->AcceptTrack(trackHad)) continue;
591 phiEle = track->Phi();
592 phiHad = trackHad->Phi();
593 Dphi = phiEle - phiHad;
601 DphiPt->Fill(ptEle,Dphi);
604 //_________________________________________
605 Bool_t AliAnalysisTaskElecHadronCorrel::IsLEDEvent() const
607 // Identify LED events which had to be discarded
609 AliESDCaloCells *cells = fESD->GetEMCALCells();
610 Short_t nCells = cells->GetNumberOfCells();
611 Int_t nCellCount[2] = {0,0};
612 for(Int_t iCell=0; iCell<nCells; iCell++)
614 Int_t cellId = cells->GetCellNumber(iCell);
615 Double_t cellE = cells->GetCellAmplitude(cellId);
616 Int_t sMod = fGeom->GetSuperModuleNumber(cellId);
618 if(sMod==3 || sMod==4)
621 nCellCount[sMod-3]++;
625 if(nCellCount[0]>7 || nCellCount[1]>7)
627 //cout<<"Bad event!"<<endl;