EMCALJetTasks/Tracks/AliEMCalTriggerEventCounterAnalysisComponent.cxx
EMCALJetTasks/Tracks/AliEMCalTriggerPatchAnalysisComponent.cxx
EMCALJetTasks/Tracks/AliEMCalTriggerRecTrackAnalysisComponent.cxx
+ EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.cxx
+ EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.cxx
EMCALJetTasks/UserTasks/AliAnalysisTaskEmcalTriggerTreeWriter.cxx
)
//______________________________________________________________________________
AliEMCalTriggerEventCounterAnalysisComponent::AliEMCalTriggerEventCounterAnalysisComponent():
- AliEMCalTriggerTracksAnalysisComponent()
+ AliEMCalTriggerTracksAnalysisComponent(),
+ fUsePatches(kFALSE)
{
/*
* Default (I/O) constructor, not to be used
//______________________________________________________________________________
AliEMCalTriggerEventCounterAnalysisComponent::AliEMCalTriggerEventCounterAnalysisComponent(const char *name):
- AliEMCalTriggerTracksAnalysisComponent(name)
+ AliEMCalTriggerTracksAnalysisComponent(name),
+ fUsePatches(kFALSE)
{
/*
* Main constructor
triggerCorrelation[0] = 1.;
fHistos->FillTH1("hEventHistMinBias", vz);
}
- if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJHigh)){
+ if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJHigh, fUsePatches)){
triggerCorrelation[2] = 1.;
fHistos->FillTH1("hEventHistEMCJHigh", vz);
// Check whether also the gamma high-threshold trigger fired
- if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGHigh)){
+ if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGHigh, fUsePatches)){
fHistos->FillTH1("hEventHistEMCHighBoth", vz);
} else {
fHistos->FillTH1("hEventHistEMCHighJetOnly", vz);
}
}
- if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJLow)){
+ if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJLow, fUsePatches)){
triggerCorrelation[1] = 1.;
fHistos->FillTH1("hEventHistEMCJLow", vz);
// Check whether also the gamma high-threshold trigger fired
- if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGLow)){
+ if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGLow, fUsePatches)){
fHistos->FillTH1("hEventHistEMCLowBoth", vz);
} else {
fHistos->FillTH1("hEventHistEMCLowJetOnly", vz);
}
}
- if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGHigh)){
+ if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGHigh, fUsePatches)){
triggerCorrelation[3] = 1.;
fHistos->FillTH1("hEventHistEMCGHigh", vz);
- if(!fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJHigh))
+ if(!fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJHigh, fUsePatches))
fHistos->FillTH1("hEventHistEMCHighGammaOnly", vz);
}
- if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGLow)){
+ if(fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCGLow, fUsePatches)){
triggerCorrelation[4] = 1.;
fHistos->FillTH1("hEventHistEMCGLow", vz);
- if(!fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJLow))
+ if(!fTriggerDecision->IsTriggered(AliEMCalTriggerAnaTriggerDecision::kTAEMCJLow, fUsePatches))
fHistos->FillTH1("hEventHistEMCLowGammaOnly", vz);
}
virtual void CreateHistos();
virtual void Process(const AliEMCalTriggerEventData * const data);
+ void SetUsePatches(Bool_t doUse = kTRUE) { fUsePatches = doUse; }
+
protected:
void DefineAxis(TAxis& axis, const char* name,
const char* title, int nbins, double min, double max,
const char** labels) const;
+ Bool_t fUsePatches; // Use patches for trigger decision
+
ClassDef(AliEMCalTriggerEventCounterAnalysisComponent, 1); // Analysis component for event counting
};
const TClonesArray * GetMatchedTrackContainer() const { return fTrackContainer; }
const TClonesArray * GetParticleContainer() const { return fParticleContainer; }
const TClonesArray * GetTriggerPatchContainer() const { return fTriggerPatchContainer; }
- const AliJetContainer * GetJetContainerData() const { return fJetContainerData; }
- const AliJetContainer * GetJetContainerMC() const { return fJetContainerMC; }
+ AliJetContainer * GetJetContainerData() const { return fJetContainerData; }
+ AliJetContainer * GetJetContainerMC() const { return fJetContainerMC; }
void SetRecEvent(AliVEvent * const ev) { fRecEvent = ev; }
void SetMCEvent(AliMCEvent * const ev) { fMCEvent = ev; }
void SetTrackContainer(const TClonesArray * const cont) { fTrackContainer = cont; }
void SetParticleContainer(const TClonesArray * const cont) { fParticleContainer = cont ;}
void SetTriggerPatchContainer(const TClonesArray *const cont) { fTriggerPatchContainer = cont; }
- void SetMCJetContainer(const AliJetContainer * const cont) { fJetContainerMC = cont; }
- void SetDataJetContainer(const AliJetContainer * const cont) { fJetContainerData = cont; }
+ void SetMCJetContainer(AliJetContainer * const cont) { fJetContainerMC = cont; }
+ void SetDataJetContainer(AliJetContainer * const cont) { fJetContainerData = cont; }
protected:
AliVEvent *fRecEvent; // Reconstructed event
- AliMCEvent *fMCEvent; // Monte-Carlo event
+ AliMCEvent *fMCEvent; // Monte-Carlo event
const TClonesArray *fClusterContainer; // Container with calibrated clusters
const TClonesArray *fTrackContainer; // Container with matched tracks
const TClonesArray *fParticleContainer; // Container with MC-true filtered particles
const TClonesArray *fTriggerPatchContainer; // Container with trigger patches
- const AliJetContainer *fJetContainerMC; // Container with reconstructed jets
- const AliJetContainer *fJetContainerData; // Container with reconstructed jets
+ AliJetContainer *fJetContainerMC; // Container with reconstructed jets
+ AliJetContainer *fJetContainerData; // Container with reconstructed jets
ClassDef(AliEMCalTriggerEventData, 1); // Data structure exchanged to trigger analysis components
};
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-2014, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+/*
+ * Analysis component for tracks in jets of MC particles where the jet has a given
+ * minimum pt
+ *
+ * Author: Markus Fasel
+ */
+#include <string>
+#include <vector>
+
+#include <TMath.h>
+#include <TString.h>
+
+#include "AliEmcalJet.h"
+#include "AliJetContainer.h"
+#include "AliMCParticle.h"
+#include "AliMCEvent.h"
+#include "AliParticleContainer.h"
+#include "AliVEvent.h"
+#include "AliVParticle.h"
+#include "AliVVertex.h"
+
+#include "AliEMCalHistoContainer.h"
+#include "AliEMCalTriggerAnaTriggerDecision.h"
+#include "AliEMCalTriggerBinningComponent.h"
+#include "AliEMCalTriggerKineCuts.h"
+#include "AliEMCalTriggerEventData.h"
+#include "AliEMCalTriggerMCJetAnalysisComponent.h"
+
+ClassImp(EMCalTriggerPtAnalysis::AliEMCalTriggerMCJetAnalysisComponent)
+
+namespace EMCalTriggerPtAnalysis {
+
+//______________________________________________________________________________
+AliEMCalTriggerMCJetAnalysisComponent::AliEMCalTriggerMCJetAnalysisComponent():
+ AliEMCalTriggerTracksAnalysisComponent(),
+ fMinimumJetPt(20.),
+ fUsePatches(kFALSE)
+{
+ /*
+ * Dummy (I/O) constructor, not to be used
+ */
+}
+
+//______________________________________________________________________________
+AliEMCalTriggerMCJetAnalysisComponent::AliEMCalTriggerMCJetAnalysisComponent(const char* name) :
+ AliEMCalTriggerTracksAnalysisComponent(name),
+ fMinimumJetPt(20.),
+ fUsePatches(kFALSE)
+{
+ /*
+ * Main constructor, to be used
+ */
+}
+
+//______________________________________________________________________________
+void AliEMCalTriggerMCJetAnalysisComponent::CreateHistos() {
+ /*
+ * Create histograms for the MC jet analysis
+ */
+ AliEMCalTriggerTracksAnalysisComponent::CreateHistos();
+
+ TString jetptstring = Form("jetPt%03d", int(fMinimumJetPt));
+ // Create trigger definitions
+ std::map<std::string, std::string> triggerCombinations;
+ const char *triggernames[11] = {"MinBias", "EMCJHigh", "EMCJLow", "EMCGHigh",
+ "EMCGLow", "EMCHighBoth", "EMCHighGammaOnly", "EMCHighJetOnly",
+ "EMCLowBoth", "EMCLowGammaOnly", "EMCLowJetOnly"};
+ // Define names and titles for different triggers in the histogram container
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[0], "min. bias events"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[1], "jet-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[2], "jet-triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[3], "gamma-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[4], "gamma-triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[5], "jet and gamma triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[6], "exclusively gamma-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[7], "exclusively jet-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[8], "jet and gamma triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[9], "exclusively gamma-triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[10], "exclusively-triggered events (low threshold)"));
+
+ // Create axis definitions
+ const AliEMCalTriggerBinningDimension *ptbinning = fBinning->GetBinning("pt"),
+ *etabinning = fBinning->GetBinning("eta"),
+ *phibinning = fBinning->GetBinning("phi"),
+ *vertexbinning = fBinning->GetBinning("vertex");
+
+ const TAxis *trackaxes[6] = {
+ DefineAxis("trackpt", ptbinning),
+ DefineAxis("jettpt", ptbinning),
+ DefineAxis("eta", etabinning),
+ DefineAxis("phi", phibinning),
+ DefineAxis("zvertex", vertexbinning),
+ DefineAxis("mbtrigger", 2, -0.5, 1.5)
+ };
+
+ // Build histograms
+ for(std::map<std::string,std::string>::iterator it = triggerCombinations.begin(); it != triggerCombinations.end(); ++it){
+ const std::string name = it->first, &title = it->second;
+ fHistos->CreateTHnSparse(Form("hParticleJetHist%s%s", jetptstring.Data(), name.c_str()), Form("Track-based data for tracks in jets in %s events", title.c_str()), 6, trackaxes, "s");
+ }
+
+ for(int iaxis = 0; iaxis < 6; iaxis++) delete trackaxes[iaxis];
+}
+
+//______________________________________________________________________________
+void AliEMCalTriggerMCJetAnalysisComponent::Process(const AliEMCalTriggerEventData* const data) {
+ /*
+ * Analyse particles in a jet with a given minimum jet pt
+ */
+ std::vector<std::string> triggernames;
+ this->GetMachingTriggerNames(triggernames, fUsePatches);
+ TString jetptstring = Form("jetPt%03d", int(fMinimumJetPt));
+
+ AliJetContainer *cont = data->GetJetContainerData();
+ AliEmcalJet *reconstructedJet = cont->GetNextAcceptJet(0);
+ AliVParticle *foundtrack(NULL);
+ while(reconstructedJet){
+ if(TMath::Abs(reconstructedJet->Pt()) > fMinimumJetPt){
+ // Jet selected, loop over particles
+ for(int ipart = 0; ipart < reconstructedJet->GetNumberOfTracks(); ipart++){
+ foundtrack = dynamic_cast<AliVParticle *>(reconstructedJet->TrackAt(ipart, cont->GetParticleContainer()->GetArray()));
+ if(!fKineCuts->IsSelected(foundtrack)) continue;
+ if(!foundtrack->Charge()) continue;
+ if(!data->GetMCEvent()->IsPhysicalPrimary(foundtrack->GetLabel())) continue;
+ // track selected, fill histogram
+ for(std::vector<std::string>::iterator name = triggernames.begin(); name != triggernames.end(); ++name){
+ FillHistogram(Form("hParticleJetHist%s%s", jetptstring.Data(), name->c_str()), foundtrack, reconstructedJet, data->GetRecEvent()->GetPrimaryVertex()->GetZ());
+ }
+ }
+ }
+ reconstructedJet = cont->GetNextAcceptJet();
+ }
+}
+
+//______________________________________________________________________________
+void AliEMCalTriggerMCJetAnalysisComponent::FillHistogram(
+ const TString& histname, const AliVParticle* track, const AliEmcalJet* jet,
+ double vz) {
+ /*
+ * Fill Histogram with relevant information
+ */
+ if(!fTriggerDecision) return;
+ double data[6] = {TMath::Abs(track->Pt()), TMath::Abs(jet->Pt()), track->Eta(), track->Phi(), vz, fTriggerDecision->IsMinBias() ? 1. : 0.};
+ fHistos->FillTHnSparse(histname.Data(), data);
+}
+
+} /* namespace EMCalTriggerPtAnalysis */
--- /dev/null
+#ifndef ALIEMCALTRIGGERMCJETANALYSISCOMPONENT_H
+#define ALIEMCALTRIGGERMCJETANALYSISCOMPONENT_H
+/* Copyright(c) 1998-2014, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+// Author: Markus Fasel
+
+#include "AliEMCalTriggerTracksAnalysisComponent.h"
+
+class TString;
+class AliVParticle;
+class AliEmcalJet;
+
+namespace EMCalTriggerPtAnalysis {
+
+class AliEMCalTriggerEventData;
+
+class AliEMCalTriggerMCJetAnalysisComponent: public AliEMCalTriggerTracksAnalysisComponent {
+public:
+ AliEMCalTriggerMCJetAnalysisComponent();
+ AliEMCalTriggerMCJetAnalysisComponent(const char * name);
+ virtual ~AliEMCalTriggerMCJetAnalysisComponent() {}
+
+ virtual void CreateHistos();
+ virtual void Process(const AliEMCalTriggerEventData * const data);
+
+ void SetUsePatches(Bool_t doUse = kTRUE) { fUsePatches = doUse; }
+ void SetMinimumJetPt(Double_t minpt) { fMinimumJetPt = minpt; }
+
+protected:
+ void FillHistogram(const TString &histname, const AliVParticle *track, const AliEmcalJet *jet, double vz);
+
+ Double_t fMinimumJetPt; // Min. pt request for the jet
+ Bool_t fUsePatches; // Use patches for trigger decision
+
+ ClassDef(AliEMCalTriggerMCJetAnalysisComponent, 1); // Analysis component for MC Jets
+};
+
+} /* namespace EMCalTriggerPtAnalysis */
+
+#endif /* ALIEMCALTRIGGERMCJETANALYSISCOMPONENT_H */
--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-2014, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+/*
+ * Analysis component inspecting tracks with a minimum given jet pt
+ *
+ * Author: Markus Fasel
+ */
+#include <string>
+#include <vector>
+
+#include <TMath.h>
+#include <TString.h>
+
+#include "AliEmcalJet.h"
+#include "AliJetContainer.h"
+#include "AliMCParticle.h"
+#include "AliMCEvent.h"
+#include "AliParticleContainer.h"
+#include "AliVEvent.h"
+#include "AliVTrack.h"
+#include "AliVVertex.h"
+
+#include "AliEMCalHistoContainer.h"
+#include "AliEMCalPtTaskVTrackSelection.h"
+#include "AliEMCalTriggerAnaTriggerDecision.h"
+#include "AliEMCalTriggerBinningComponent.h"
+#include "AliEMCalTriggerKineCuts.h"
+#include "AliEMCalTriggerEventData.h"
+#include "AliEMCalTriggerRecJetAnalysisComponent.h"
+
+ClassImp(EMCalTriggerPtAnalysis::AliEMCalTriggerRecJetAnalysisComponent)
+
+namespace EMCalTriggerPtAnalysis {
+
+//______________________________________________________________________________
+AliEMCalTriggerRecJetAnalysisComponent::AliEMCalTriggerRecJetAnalysisComponent() :
+ AliEMCalTriggerTracksAnalysisComponent(),
+ fTrackSelection(NULL),
+ fMinimumJetPt(20.),
+ fRequestMCtrue(kFALSE),
+ fUsePatches(kFALSE)
+{
+ /*
+ * Dummy (I/O) constructor, not to be used
+ */
+}
+
+//______________________________________________________________________________
+AliEMCalTriggerRecJetAnalysisComponent::AliEMCalTriggerRecJetAnalysisComponent(const char* name) :
+ AliEMCalTriggerTracksAnalysisComponent(name),
+ fTrackSelection(NULL),
+ fMinimumJetPt(20.),
+ fRequestMCtrue(kFALSE),
+ fUsePatches(kFALSE)
+{
+ /*
+ * Main constructor for the users
+ */
+}
+
+//______________________________________________________________________________
+AliEMCalTriggerRecJetAnalysisComponent::~AliEMCalTriggerRecJetAnalysisComponent() {
+ /*
+ * Destructor
+ */
+ if(fTrackSelection) delete fTrackSelection;
+}
+
+//______________________________________________________________________________
+void AliEMCalTriggerRecJetAnalysisComponent::CreateHistos() {
+ /*
+ * Create histrogram for the jet pt analysis
+ */
+ AliEMCalTriggerTracksAnalysisComponent::CreateHistos();
+
+ TString jetptstring = Form("jetPt%03d", int(fMinimumJetPt));
+ // Create trigger definitions
+ std::map<std::string, std::string> triggerCombinations;
+ const char *triggernames[11] = {"MinBias", "EMCJHigh", "EMCJLow", "EMCGHigh",
+ "EMCGLow", "EMCHighBoth", "EMCHighGammaOnly", "EMCHighJetOnly",
+ "EMCLowBoth", "EMCLowGammaOnly", "EMCLowJetOnly"};
+ // Define names and titles for different triggers in the histogram container
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[0], "min. bias events"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[1], "jet-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[2], "jet-triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[3], "gamma-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[4], "gamma-triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[5], "jet and gamma triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[6], "exclusively gamma-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[7], "exclusively jet-triggered events (high threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[8], "jet and gamma triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[9], "exclusively gamma-triggered events (low threshold)"));
+ triggerCombinations.insert(std::pair<std::string,std::string>(triggernames[10], "exclusively-triggered events (low threshold)"));
+
+ // Create axis definitions
+ const AliEMCalTriggerBinningDimension *ptbinning = fBinning->GetBinning("pt"),
+ *etabinning = fBinning->GetBinning("eta"),
+ *phibinning = fBinning->GetBinning("phi"),
+ *vertexbinning = fBinning->GetBinning("vertex");
+
+ const TAxis *trackaxes[6] = {
+ DefineAxis("trackpt", ptbinning),
+ DefineAxis("jettpt", ptbinning),
+ DefineAxis("eta", etabinning),
+ DefineAxis("phi", phibinning),
+ DefineAxis("zvertex", vertexbinning),
+ DefineAxis("mbtrigger", 2, -0.5, 1.5)
+ };
+
+ // Build histograms
+ for(std::map<std::string,std::string>::iterator it = triggerCombinations.begin(); it != triggerCombinations.end(); ++it){
+ const std::string name = it->first, &title = it->second;
+ fHistos->CreateTHnSparse(Form("hTrackJetHist%s%s", jetptstring.Data(), name.c_str()), Form("Track-based data for tracks in jets in %s events", title.c_str()), 6, trackaxes, "s");
+ fHistos->CreateTHnSparse(Form("hMCTrackJetHist%s%s", jetptstring.Data(), name.c_str()), Form("Track-based data for tracks in jets in %s events with MC kinematics", title.c_str()), 6, trackaxes, "s");
+ }
+
+ for(int iaxis = 0; iaxis < 6; iaxis++) delete trackaxes[iaxis];
+
+}
+
+//______________________________________________________________________________
+void AliEMCalTriggerRecJetAnalysisComponent::Process(const AliEMCalTriggerEventData* const data) {
+ /*
+ * Analyse tracks from jets with a given minimum pt
+ */
+ std::vector<std::string> triggernames;
+ this->GetMachingTriggerNames(triggernames, fUsePatches);
+ TString jetptstring = Form("jetPt%03d", int(fMinimumJetPt));
+
+ AliJetContainer *cont = data->GetJetContainerData();
+ AliEmcalJet *reconstructedJet = cont->GetNextAcceptJet(0);
+ AliVTrack *foundtrack(NULL);
+ AliVParticle *assocMC(NULL);
+ while(reconstructedJet){
+ if(TMath::Abs(reconstructedJet->Pt()) > fMinimumJetPt){
+ // Jet selected, loop over particles
+ for(int ipart = 0; ipart < reconstructedJet->GetNumberOfTracks(); ipart++){
+ foundtrack = dynamic_cast<AliVTrack *>(reconstructedJet->TrackAt(ipart, cont->GetParticleContainer()->GetArray()));
+ if(!fKineCuts->IsSelected(foundtrack)) continue;
+ if(fRequestMCtrue && data->GetMCEvent() && (assocMC = IsMCTrueTrack(foundtrack, data->GetMCEvent()))) continue;
+ if(fTrackSelection && !fTrackSelection->IsTrackAccepted(foundtrack)) continue;
+ // track selected, fill histogram
+ for(std::vector<std::string>::iterator name = triggernames.begin(); name != triggernames.end(); ++name){
+ FillHistogram(Form("hTrackJetHist%s%s", jetptstring.Data(), name->c_str()), foundtrack, reconstructedJet, data->GetRecEvent()->GetPrimaryVertex()->GetZ());
+ if(assocMC){
+ FillHistogram(Form("hTrackJetHist%s%s", jetptstring.Data(), name->c_str()), assocMC, reconstructedJet, data->GetRecEvent()->GetPrimaryVertex()->GetZ());
+ }
+ }
+ }
+ }
+ reconstructedJet = cont->GetNextAcceptJet();
+ }
+}
+
+//______________________________________________________________________________
+AliVParticle * AliEMCalTriggerRecJetAnalysisComponent::IsMCTrueTrack(
+ const AliVTrack* const trk, const AliMCEvent* evnt) const {
+ /*
+ * Check according to the associated MC information whether the track is a MC true track,
+ * and whether it is physical primary
+ *
+ * @param trk: track to check
+ * @param evnt: MC event information necessary for the check
+ *
+ * @return: the associated MC particle (NULL if not MC true)
+ */
+ int label = TMath::Abs(trk->GetLabel());
+ AliVParticle *mcpart = evnt->GetTrack(label);
+ if(!mcpart) return NULL;
+ if(!evnt->IsPhysicalPrimary(label)) return NULL;
+ return mcpart;
+}
+
+//______________________________________________________________________________
+void AliEMCalTriggerRecJetAnalysisComponent::FillHistogram(
+ const TString& histname, const AliVParticle* track, const AliEmcalJet* jet,
+ double vz) {
+ /*
+ * Fill Histogram with relevant information
+ */
+ if(!fTriggerDecision) return;
+ double data[6] = {TMath::Abs(track->Pt()), TMath::Abs(jet->Pt()), track->Eta(), track->Phi(), vz, fTriggerDecision->IsMinBias() ? 1. : 0.};
+ fHistos->FillTHnSparse(histname.Data(), data);
+}
+
+} /* namespace EMCalTriggerPtAnalysis */
--- /dev/null
+#ifndef ALIEMCALTRIGGERRECJETANALYSISCOMPONENT_H
+#define ALIEMCALTRIGGERRECJETANALYSISCOMPONENT_H
+/* Copyright(c) 1998-2014, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice */
+
+// Author: Markus Fasel
+
+#include "AliEMCalTriggerTracksAnalysisComponent.h"
+
+class TString;
+class AliEmcalJet;
+class AliMCEvnet;
+class AliVParticle;
+
+namespace EMCalTriggerPtAnalysis {
+
+class AliEMCalPtTaskVTrackSelection;
+class AliEMCalTriggerEventData;
+
+class AliEMCalTriggerRecJetAnalysisComponent: public AliEMCalTriggerTracksAnalysisComponent {
+public:
+ AliEMCalTriggerRecJetAnalysisComponent();
+ AliEMCalTriggerRecJetAnalysisComponent(const char *name);
+ virtual ~AliEMCalTriggerRecJetAnalysisComponent();
+
+ virtual void CreateHistos();
+ virtual void Process(const AliEMCalTriggerEventData * const data);
+
+ void SetUsePatches(Bool_t doUse = kTRUE) { fUsePatches = doUse; }
+ void SetMinimumJetPt(Double_t minpt) { fMinimumJetPt = minpt; }
+ void SetSingleTrackCuts(AliEMCalPtTaskVTrackSelection * trackcuts) { fTrackSelection = trackcuts; }
+
+protected:
+ AliVParticle * IsMCTrueTrack(const AliVTrack* const trk, const AliMCEvent* evnt) const;
+ void FillHistogram(const TString &histname, const AliVParticle *track, const AliEmcalJet *jet, double vz);
+ AliEMCalPtTaskVTrackSelection *fTrackSelection; // Track selection cuts used in the analysis
+ Double_t fMinimumJetPt; // Minimum jet pt
+ Bool_t fRequestMCtrue; // Request MC true track
+ Bool_t fUsePatches; // Use patches for trigger decision
+
+ ClassDef(AliEMCalTriggerRecJetAnalysisComponent, 1); // Analysis component for reconstructed Jets
+};
+
+} /* namespace EMCalTriggerPtAnalysis */
+
+#endif /* ALIEMCALTRIGGERRECJETANALYSISCOMPONENT_H */
* - tracks with clusters and esd information
* - tracks with clusters and MC information
*/
+ AliEMCalTriggerTracksAnalysisComponent::CreateHistos();
+
// Create trigger definitions
std::map<std::string, std::string> triggerCombinations;
const char *triggernames[11] = {"MinBias", "EMCJHigh", "EMCJLow", "EMCGHigh",
#pragma link C++ class EMCalTriggerPtAnalysis::AliEMCalTriggerEventCounterAnalysisComponent+;
#pragma link C++ class EMCalTriggerPtAnalysis::AliEMCalTriggerPatchAnalysisComponent+;
#pragma link C++ class EMCalTriggerPtAnalysis::AliEMCalTriggerRecTrackAnalysisComponent+;
+#pragma link C++ class EMCalTriggerPtAnalysis::AliEMCalTriggerMCJetAnalysisComponent+;
+#pragma link C++ class EMCalTriggerPtAnalysis::AliEMCalTriggerRecJetAnalysisComponent+;
#pragma link C++ class AliAnalysisTaskEmcalTriggerTreeWriter+;
#ifdef HAVE_FASTJET