20 #include <TClonesArray.h>
25 #include "AliAODMCParticle.h"
27 #include "AliEmcalTriggerPatchInfo.h"
28 #include "AliMCEvent.h"
29 #include "AliPicoTrack.h"
30 #include "AliVCluster.h"
31 #include "AliVEvent.h"
32 #include "AliVParticle.h"
33 #include "AliVTrack.h"
47 namespace EMCalTriggerPtAnalysis {
54 AliEMCalTriggerRecTrackAnalysisComponent::AliEMCalTriggerRecTrackAnalysisComponent() :
56 fTrackSelection(NULL),
59 fRequestMCtrue(kFALSE)
71 fTrackSelection(NULL),
74 fRequestMCtrue(kFALSE)
106 std::map<std::string, std::string> triggerCombinations;
107 const char *triggernames[11] = {
"MinBias",
"EMCJHigh",
"EMCJLow",
"EMCGHigh",
108 "EMCGLow",
"EMCHighBoth",
"EMCHighGammaOnly",
"EMCHighJetOnly",
109 "EMCLowBoth",
"EMCLowGammaOnly",
"EMCLowJetOnly"};
111 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[0],
"min. bias events"));
112 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[1],
"jet-triggered events (high threshold)"));
113 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[2],
"jet-triggered events (low threshold)"));
114 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[3],
"gamma-triggered events (high threshold)"));
115 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[4],
"gamma-triggered events (low threshold)"));
116 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[5],
"jet and gamma triggered events (high threshold)"));
117 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[6],
"exclusively gamma-triggered events (high threshold)"));
118 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[7],
"exclusively jet-triggered events (high threshold)"));
119 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[8],
"jet and gamma triggered events (low threshold)"));
120 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[9],
"exclusively gamma-triggered events (low threshold)"));
121 triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[10],
"exclusively-triggered events (low threshold)"));
129 const TAxis *trackaxes[5] = {
138 for(std::map<std::string,std::string>::iterator it = triggerCombinations.begin(); it != triggerCombinations.end(); ++it){
139 const std::string name = it->first, &title = it->second;
140 fHistos->
CreateTHnSparse(Form(
"hTrackHist%s", name.c_str()), Form(
"Track-based data for %s events", title.c_str()), 5, trackaxes,
"s");
141 fHistos->
CreateTHnSparse(Form(
"hTrackInAcceptanceHist%s", name.c_str()), Form(
"Track-based data for %s events for tracks matched to EMCal clusters", title.c_str()), 5, trackaxes,
"s");
142 fHistos->
CreateTHnSparse(Form(
"hMCTrackHist%s", name.c_str()), Form(
"Track-based data for %s events with MC kinematics", title.c_str()), 5, trackaxes,
"s");
143 fHistos->
CreateTHnSparse(Form(
"hMCTrackInAcceptanceHist%s", name.c_str()), Form(
"Track-based data for %s events for tracks matched to EMCal clusters with MC kinematics", title.c_str()), 5, trackaxes,
"s");
144 fHistos->
CreateTHnSparse(Form(
"hTrackHistPatchMatch%s", name.c_str()), Form(
"Track-based data for %s events for tracks matched to EMCal patches", title.c_str()), 5, trackaxes,
"s");
145 fHistos->
CreateTHnSparse(Form(
"hMCTrackHistPatchMatch%s", name.c_str()), Form(
"Track-based data for %s events for tracks matched to EMCal patches with MC kinematics", title.c_str()), 5, trackaxes,
"s");
153 const TAxis *corraxes[4] = {
161 for(
int iaxis = 0; iaxis < 5; iaxis++)
delete trackaxes[iaxis];
186 std::vector<std::string> triggernames;
189 AliVTrack *track(NULL);
190 const AliVParticle *assocMC(NULL);
192 AliError(
"No container for matched tracks");
201 while((track = dynamic_cast<AliVTrack *>(trackIter()))){
206 AliDebug(2,
"Track not accepted");
215 Bool_t hasCluster = kFALSE;
216 AliVCluster *clust(NULL);
217 AliVTrack *testtrack = track;
218 AliPicoTrack *pictrack =
dynamic_cast<AliPicoTrack *
>(track);
219 if(pictrack) testtrack = pictrack->GetTrack();
220 if(testtrack->GetEMCALcluster() >= 0 && (clust =
dynamic_cast<AliVCluster *
>(data->
GetClusterContainer()->At(testtrack->GetEMCALcluster()))))
228 for(std::vector<std::string>::iterator name = triggernames.begin(); name != triggernames.end(); name++){
230 if(hasCluster)
FillHistogram(Form(
"hTrackInAcceptanceHist%s", name->c_str()), track, NULL, data->
GetRecEvent(), kFALSE, weight);
232 if(hasPatch)
FillHistogram(Form(
"hTrackHistPatchMatch%s", name->c_str()), track, NULL, data->
GetRecEvent(), kFALSE, weight);
235 if(hasCluster)
FillHistogram(Form(
"hMCTrackInAcceptanceHist%s", name->c_str()), track, assocMC, data->
GetRecEvent(), kTRUE, weight);
236 if(hasPatch)
FillHistogram(Form(
"hMCTrackHistPatchMatch%s", name->c_str()), track, NULL, data->
GetRecEvent(), kFALSE, weight);
253 const AliVTrack*
const trk,
const AliMCEvent* evnt)
const {
254 int label = TMath::Abs(trk->GetLabel());
255 const AliVParticle *mcpart = evnt->GetTrack(label);
256 if(!mcpart)
return NULL;
257 const AliAODMCParticle *aodpart =
dynamic_cast<const AliAODMCParticle *
>(mcpart);
259 if(!aodpart->IsPhysicalPrimary())
return NULL;
261 if(!evnt->IsPhysicalPrimary(label))
return NULL;
286 const TString& histname,
const AliVTrack*
const trk,
287 const AliVParticle* assocMC,
const AliVEvent*
const recev,
288 Bool_t useMCkine, Double_t weight) {
289 if(useMCkine && !assocMC)
return;
291 data[0] = useMCkine ? TMath::Abs(assocMC->Pt()) : TMath::Abs(trk->Pt());
292 data[1] = (
fSwapEta ? -1. : 1.) * (useMCkine ? assocMC->Eta() : trk->Eta());
293 data[2] = useMCkine ? assocMC->Phi() : trk->Phi();
294 data[3] = recev->GetPrimaryVertex()->GetZ();
311 const AliVParticle*
const genparticle,
312 const AliVParticle*
const recparticle,
double weight) {
313 double data[4] = {TMath::Abs(genparticle->Pt()), TMath::Abs(recparticle->Pt()), recparticle->Eta(), recparticle->Phi()};
325 const AliVTrack* rectrack,
const TClonesArray* inputpatches,
326 TList& outputpatches)
const {
327 outputpatches.Clear();
328 Double_t etaEMCAL = rectrack->GetTrackEtaOnEMCal(),
329 phiEMCAL = rectrack->GetTrackPhiOnEMCal();
330 for(TIter patchiter = TIter(inputpatches).Begin(); patchiter != TIter::End(); ++patchiter){
331 AliEmcalTriggerPatchInfo *recpatch =
static_cast<AliEmcalTriggerPatchInfo *
>(*patchiter);
332 double etamin = TMath::Min(recpatch->GetEtaMin(), recpatch->GetEtaMax()),
333 etamax = TMath::Max(recpatch->GetEtaMin(), recpatch->GetEtaMax()),
334 phimin = TMath::Min(recpatch->GetPhiMin(), recpatch->GetPhiMax()),
335 phimax = TMath::Max(recpatch->GetPhiMin(), recpatch->GetPhiMax());
336 if(etaEMCAL >= etamin && etaEMCAL <= etamax && phiEMCAL >= phimin && phiEMCAL <= phimax){
338 outputpatches.Add(recpatch);
350 TString triggertype,
const TList& patches)
const {
351 Bool_t hasGammaLow = kFALSE,
352 hasGammaHigh = kFALSE,
355 for(TIter patchIter = TIter(&patches).Begin(); patchIter != TIter::End(); ++patchIter){
356 AliEmcalTriggerPatchInfo *matchedpad =
static_cast<AliEmcalTriggerPatchInfo *
>(*patchIter);
358 if(!matchedpad->IsOfflineSimple())
continue;
359 if(matchedpad->IsJetHighSimple()) hasJetHigh = kTRUE;
360 if(matchedpad->IsJetLowSimple()) hasJetLow = kTRUE;
361 if(matchedpad->IsGammaHighSimple()) hasGammaHigh = kTRUE;
362 if(matchedpad->IsGammaLowSimple()) hasGammaLow = kTRUE;
364 if(matchedpad->IsOfflineSimple())
continue;
365 if(matchedpad->IsJetHigh()) hasJetHigh = kTRUE;
366 if(matchedpad->IsJetLow()) hasJetLow = kTRUE;
367 if(matchedpad->IsGammaHigh()) hasGammaHigh = kTRUE;
368 if(matchedpad->IsGammaLow()) hasGammaLow = kTRUE;
372 if((triggertype.Contains(
"EMCJHigh") || triggertype.Contains(
"EMCHighJetOnly")) && hasJetHigh)
return kTRUE;
373 if((triggertype.Contains(
"EMCJLow") || triggertype.Contains(
"EMCLowJetOnly")) && hasJetLow)
return kTRUE;
374 if((triggertype.Contains(
"EMCGHigh") || triggertype.Contains(
"EMCHighGammaOnly")) && hasGammaHigh)
return kTRUE;
375 if((triggertype.Contains(
"EMCGLow") || triggertype.Contains(
"EMCLowGammaOnly")) && hasGammaLow)
return kTRUE;
376 if(triggertype.Contains(
"EMCHighBoth") && (hasJetHigh || hasGammaHigh))
return kTRUE;
377 if(triggertype.Contains(
"EMCLowBoth") && (hasJetLow || hasGammaLow))
return kTRUE;
AliVEvent * GetRecEvent() const
bool IsSelected(const AliVParticle *const track) const
AliEMCalTriggerRecTrackAnalysisComponent()
Dummy constructor.
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
Bool_t fRequestMCtrue
Request MC true track.
Weight handler for the analysis of high- tracks in EMCAL-triggered events.
Declaration of class AliEMCalTriggerAnaTriggerDecision, a container for trigger decision in EMCAL-tri...
const TClonesArray * GetMatchedTrackContainer() const
void FillHistogram(const TString &histname, const AliVTrack *const trk, const AliVParticle *assocMC, const AliVEvent *const recev, Bool_t useMCkine, Double_t weight)
Fill main track-based histogram.
Bool_t fSwapEta
Swap eta sign.
const AliEMCalTriggerWeightHandler * fWeightHandler
Event weight handler.
void GetMachingTriggerNames(std::vector< std::string > &triggernames, ETriggerMethod_t usePatches)
TAxis * DefineAxis(const char *name, const AliEMCalTriggerBinningDimension *binning)
const AliEMCalTriggerAnaTriggerDecisionConfig * GetConfiguration() const
const TClonesArray * GetClusterContainer() const
void FillTHnSparse(const char *name, const double *x, double weight=1.)
Analysis component for reconstructed tracks.
Bool_t IsUsingOfflinePatches() const
void CreateTHnSparse(const char *name, const char *title, int ndim, const int *nbins, const double *min, const double *max, Option_t *opt="")
const AliVParticle * IsMCTrueTrack(const AliVTrack *const trk, const AliMCEvent *evnt) const
Check whether track is a true signal track.
AliEMCalHistoContainer * fHistos
Histogram container of the analysis component.
const AliEMCalTriggerAnaTriggerDecision * fTriggerDecision
Trigger decision handler.
ETriggerMethod_t fTriggerMethod
Method used for trigger decision.
AliEMCalPtTaskVTrackSelection * fTrackSelection
Track selection cuts used in the analysis.
AliEMCalTriggerBinningDimension * GetBinning(const char *name) const
virtual void CreateHistos()
Creating histograms for the analysis component.
const AliEMCalTriggerKineCuts * fKineCuts
Kinematical cuts for tracks and particle selection.
Base class for analysis components in the analysis of EMCAL-triggered events.
Binning definition for a certain dimension.
double GetEventWeight(const AliMCEvent *const event) const
Declaration of the classes AliEMCalTriggerBinningComponent and AliEMCalTriggerBinningDimension.
virtual bool IsTrackAccepted(AliVTrack *const trk)=0
const TClonesArray * GetTriggerPatchContainer() const
Bool_t HasMatchedPatchOfType(TString triggertype, const TList &patches) const
void FillCorrelation(const AliVParticle *const genparticle, const AliVParticle *const recparticle, double weight=1.)
void MatchTriggerPatches(const AliVTrack *rectrack, const TClonesArray *inputpatches, TList &outputpatches) const
virtual void Process(const AliEMCalTriggerEventData *const data)
Run track loop on list of matching tracks.
const AliEMCalTriggerBinningComponent * fBinning
Global binning handler.
virtual ~AliEMCalTriggerRecTrackAnalysisComponent()
Destructor.
virtual void CreateHistos()
AliMCEvent * GetMCEvent() const
Declartion of class AliEMCalPtTaskVTrackSelection.
Analysis component for reconstructed tracks.