25 #include "AliAnalysisDataContainer.h"
26 #include "AliAnalysisManager.h"
27 #include "AliAnalysisUtils.h"
28 #include "AliAODInputHandler.h"
29 #include "AliAODTrack.h"
31 #include "AliEMCALGeometry.h"
32 #include "AliEMCALRecoUtils.h"
33 #include "AliEMCALTriggerPatchInfo.h"
35 #include "AliESDtrackCuts.h"
36 #include "AliESDEvent.h"
37 #include "AliInputEventHandler.h"
38 #include "AliPIDResponse.h"
39 #include "AliTOFPIDResponse.h"
40 #include "AliVEvent.h"
41 #include "AliVEventHandler.h"
42 #include "AliVVertex.h"
51 namespace EMCalTriggerPtAnalysis {
53 AliAnalysisTaskChargedParticlesRef::AliAnalysisTaskChargedParticlesRef() :
58 fEtaLabCut(-0.5, 0.5),
60 fPhiCut(0., TMath::TwoPi()),
71 fEtaLabCut(-0.5, 0.5),
73 fPhiCut(0., TMath::TwoPi()),
95 const int kdimPID = 3;
96 const int knbinsPID[kdimPID] = {1000, 200, 300};
97 const double kminPID[kdimPID] = {-100., 0., 0.}, kmaxPID[kdimPID] = {100., 200., 1.5};
98 std::array<TString, 2> charges = {
"Pos",
"Neg"};
100 fHistos->
CreateTH1(
"hEventCount" + trg,
"Event Counter for trigger class " + trg, 1, 0.5, 1.5, optionstring);
101 fHistos->
CreateTH1(
"hVertexBefore" + trg,
"Vertex distribution before z-cut for trigger class " + trg, 500, -50, 50, optionstring);
102 fHistos->
CreateTH1(
"hVertexAfter" + trg,
"Vertex distribution after z-cut for trigger class " + trg, 100, -10, 10, optionstring);
104 fHistos->
CreateTH3(
"hPtEtaPhiAll" + trg,
"p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg +
" ; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
105 fHistos->
CreateTH3(
"hPtEtaPhiEMCALAll" + trg,
"p_{t}-#eta-#phi distribution of all accepted tracks pointing to the EMCAL for trigger " + trg +
"; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
106 fHistos->
CreateTH3(
"hPtEtaPhiCent" + trg,
"p_{t}-#eta-#phi distribution of all accepted tracks for trigger " + trg +
"; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
107 fHistos->
CreateTH3(
"hPtEtaPhiEMCALCent" + trg,
"p_{t}-#eta-#phi distribution of all accepted tracks pointing to the EMCAL for trigger " + trg +
"; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
109 for(
const auto c : charges){
110 fHistos->
CreateTH3(
"hPtEtaPhiAll" +
c + trg,
"p_{t}-#eta-#phi distribution of " +
c +
" accepted tracks for trigger " + trg +
" ; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
111 fHistos->
CreateTH3(
"hPtEtaPhiEMCALAll" +
c + trg,
"p_{t}-#eta-#phi distribution of " +
c +
" accepted tracks pointing to the EMCAL for trigger " + trg +
"; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
112 fHistos->
CreateTH3(
"hPtEtaPhiCent" +
c + trg,
"p_{t}-#eta-#phi distribution of " +
c +
" accepted tracks for trigger " + trg +
"; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
113 fHistos->
CreateTH3(
"hPtEtaPhiEMCALCent" +
c + trg,
"p_{t}-#eta-#phi distribution of " +
c +
" accepted tracks pointing to the EMCAL for trigger " + trg +
"; p_{t} (GeV/c); #eta; #phi", newbinning,
TLinearBinning(64, -0.8, 0.8),
TLinearBinning(100, 0., 2*TMath::Pi()), optionstring);
117 fHistos->
CreateTH2(Form(
"hTPCdEdxEMCAL%s", trg.Data()), Form(
"TPC dE/dx of charged particles in the EMCAL region for trigger %s", trg.Data()), 400, -20., 20., 200, 0., 200., optionstring);
118 fHistos->
CreateTH2(Form(
"hTOFBetaEMCAL%s", trg.Data()), Form(
"TOF beta of charged particles in the EMCAL region for trigger %s", trg.Data()), 400, -20., 20., 150, 0., 1.5, optionstring);
119 fHistos->
CreateTHnSparse(Form(
"hPIDcorrEMCAL%s", trg.Data()), Form(
"Correlation of PID observables for Trigger %s", trg.Data()), kdimPID, knbinsPID, kminPID, kmaxPID, optionstring);
125 Bool_t hasPIDresponse = fInputHandler->GetPIDResponse() !=
nullptr;
126 if(
fStudyPID && !hasPIDresponse) AliErrorStream() <<
"PID requested but PID response not available" << std::endl;
138 AliVTrack *checktrack(
nullptr);
139 int ptmin[5] = {1,2,5,10,20};
141 Double_t etaEMCAL(0.), phiEMCAL(0.);
142 for(
int itrk = 0; itrk < fInputEvent->GetNumberOfTracks(); ++itrk){
143 checktrack =
dynamic_cast<AliVTrack *
>(fInputEvent->GetTrack(itrk));
144 if(!checktrack)
continue;
147 if(TMath::Abs(checktrack->Pt()) < 0.1)
continue;
148 if(checktrack->IsA() == AliESDtrack::Class()){
149 AliESDtrack copytrack(*(static_cast<AliESDtrack *>(checktrack)));
150 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
151 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
152 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
154 AliAODTrack copytrack(*(static_cast<AliAODTrack *>(checktrack)));
155 AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(©track);
156 etaEMCAL = copytrack.GetTrackEtaOnEMCal();
157 phiEMCAL = copytrack.GetTrackPhiOnEMCal();
159 Int_t supermoduleID = -1;
160 isEMCAL =
fGeom->SuperModuleNumberFromEtaPhi(etaEMCAL, phiEMCAL, supermoduleID);
162 isEMCAL = isEMCAL && supermoduleID < 10;
174 bool posCharge = checktrack->Charge() > 0;
177 FillTrackHistos(t, posCharge, checktrack->Pt(), checktrack->Eta() *
fEtaSign, etacent, checktrack->Phi(), isEMCAL);
213 TString chargelabel = posCharge ?
"Pos" :
"Neg";
214 AliDebugStream(1) << GetName() <<
": Using weight " << weight <<
" for trigger " << eventclass <<
" in particle histograms." << std::endl;
215 double kinepointall[3] = {TMath::Abs(pt), etalab, phi}, kinepointcent[3] = {TMath::Abs(pt), etacent, phi};
216 fHistos->
FillTH3(
"hPtEtaPhiAll" + eventclass, kinepointall, weight);
217 fHistos->
FillTH3(
"hPtEtaPhiCent" + eventclass, kinepointcent, weight);
218 fHistos->
FillTH3(
"hPtEtaPhiAll" + chargelabel + eventclass, kinepointall, weight);
219 fHistos->
FillTH3(
"hPtEtaPhiCent" + chargelabel + eventclass, kinepointcent, weight);
221 fHistos->
FillTH3(
"hPtEtaPhiEMCALAll" + eventclass, kinepointall, weight);
222 fHistos->
FillTH3(
"hPtEtaPhiEMCALCent" + eventclass, kinepointall, weight);
223 fHistos->
FillTH3(
"hPtEtaPhiEMCALAll" + chargelabel + eventclass, kinepointall, weight);
224 fHistos->
FillTH3(
"hPtEtaPhiEMCALCent" + chargelabel + eventclass, kinepointall, weight);
233 AliDebugStream(1) << GetName() <<
": Using weight " << weight <<
" for trigger " << eventclass <<
" in PID histograms." << std::endl;
234 AliPIDResponse *pid = fInputHandler->GetPIDResponse();
235 if(TMath::Abs(trk.Eta()) > 0.5)
return;
236 if(!((trk.GetStatus() & AliVTrack::kTOFout) && (trk.GetStatus() & AliVTrack::kTIME)))
return;
238 double poverz = TMath::Abs(trk.P())/static_cast<double>(trk.Charge());
239 fHistos->
FillTH2(
"hTPCdEdxEMCAL" + eventclass, poverz, trk.GetTPCsignal(), weight);
241 Double_t trtime = (trk.GetTOFsignal() - pid->GetTOFResponse().GetTimeZero()) * 1e-12;
242 Double_t v = trk.GetIntegratedLength()/(100. * trtime);
244 fHistos->
FillTH2(
"hTOFBetaEMCAL" + eventclass, poverz, beta, weight);
245 double datapoint[3] = {poverz, trk.GetTPCsignal(), beta};
261 TString outfile(mgr->GetCommonFileName());
262 outfile +=
":ChargedParticleQA_" +
suffix;
265 task->ConnectInput(0, mgr->GetCommonInputContainer());
266 mgr->ConnectOutput(task, 1, mgr->CreateContainer(containername.Data(), TList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
292 mgr->GetInputEventHandler()->IsA() == AliAODInputHandler::Class()
296 TString outfile(mgr->GetCommonFileName());
297 outfile +=
":ChargedParticleQA_%s" + cutname;
299 task->ConnectInput(0, mgr->GetCommonInputContainer());
300 mgr->ConnectOutput(task, 1, mgr->CreateContainer(Form(
"TrackResults_%s", cutname.Data()), TList::Class(), AliAnalysisManager::kOutputContainer, outfile.Data()));
std::vector< TString > fSelectedTriggers
! Triggers selected for given event
std::vector< TString > GetSupportedTriggers()
Double_t fEtaSign
Sign of the eta distribution (swaps when beam directions swap): p-Pb: +1, Pb-p: -1.
AliEmcalTrackSelection * fTrackCuts
Standard track selection.
Class creating a linear binning, used in the histogram manager.
THistManager * fHistos
Task Histogram container.
virtual ~AliAnalysisTaskChargedParticlesRef()
Test class for charged particle distributions.
static AliAnalysisTaskChargedParticlesRef * AddTaskChargedParticlesRef(const TString &suffix)
Double_t GetTriggerWeight(const TString &triggerclass) const
void FillTH2(const char *hname, double x, double y, double weight=1., Option_t *opt="")
void FillTH3(const char *hname, double x, double y, double z, double weight=1., Option_t *opt="")
Bool_t fStudyPID
Use kinematics correlation histograms.
void AddStep(Double_t max, Double_t binwidth)
virtual void UserFillHistosBeforeEventSelection()
void SetOfflineTriggerSelection(AliEmcalTriggerOfflineSelection *sel)
Set an offline trigger selection.
void SetCaloTriggerPatchInfoName(const char *n)
AliCutValueRange< double > fEtaCmsCut
Cut applied in frame.
static AliEmcalTrackSelection * TrackCutsFactory(TString name, Bool_t isAOD)
Fully-configure EMCAL track selection independent of the data type.
Base class for analyses using EMCAL triggers.
Double_t fYshift
Rapidity shift.
void FillTHnSparse(const char *name, const double *x, double weight=1., Option_t *opt="")
static AliAnalysisTaskChargedParticlesRef * AddTaskChargedParticlesRefDefault(const TString &cutname="standard")
TH2 * CreateTH2(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt="")
AliEMCALGeometry * fGeom
!emcal geometry
virtual void CreateUserHistos()
void FillTrackHistos(const TString &eventclass, Bool_t posCharge, Double_t pt, Double_t eta, Double_t etacent, Double_t phi, Bool_t inEmcal)
AliAnalysisTaskChargedParticlesRef()
Definition of the -binning used in the histograms.
void SetEMCALTrackSelection(AliEmcalTrackSelection *sel)
TH1 * CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt="")
Helper class creating user defined custom binning.
void FillTH1(const char *hname, double x, double weight=1., Option_t *opt="")
virtual void CreateUserObjects()
AliCutValueRange< double > fPhiCut
Cut applied in .
AliCutValueRange< double > fEtaLabCut
Cut applied in frame.
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
Double_t fVertex[3]
!event vertex
void FillPIDHistos(const TString &eventclass, const AliVTrack &track)
void SetNeedEmcalGeom(Bool_t n)
void InitializeTrackCuts(TString cutname, bool isAOD)
virtual void UserFillHistosAfterEventSelection()
THnSparse * CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
static AliEmcalTriggerOfflineSelection * TriggerSelectionFactory(Double_t el0, Double_t eg1, Double_t eg2, Double_t ej1, Double_t ej2, AliEmcalTriggerOfflineSelection::EmcalEnergyDefinition_t endef=AliEmcalTriggerOfflineSelection::kFEEEnergy)
Configures EMCAL trigger offline selection used to restrict EMCAL triggered sample.
TH3 * CreateTH3(const char *name, const char *title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, int nbinsz, double zmin, double zmax, Option_t *opt="")
Bool_t fEnableSumw2
Enable sumw2 during histogram creation.
virtual bool IsTrackAccepted(AliVTrack *const trk)=0
bool IsInRange(t value) const
void SetMinimum(Double_t min)