]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Add components for jet analysis on mc and rec jets
authormfasel <mfasel@lbl.gov>
Wed, 10 Dec 2014 23:19:22 +0000 (15:19 -0800)
committermfasel <mfasel@lbl.gov>
Fri, 12 Dec 2014 01:12:33 +0000 (17:12 -0800)
PWGJE/CMakelibPWGJEEMCALJetTasks.pkg
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerEventCounterAnalysisComponent.cxx
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerEventCounterAnalysisComponent.h
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerEventData.h
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.cxx [new file with mode: 0644]
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.h [new file with mode: 0644]
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.cxx [new file with mode: 0644]
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.h [new file with mode: 0644]
PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerRecTrackAnalysisComponent.cxx
PWGJE/PWGJEEMCALJetTasksLinkDef.h

index b15ac1d7699e697bcacff1b1cc7a3027f8ed595e..9057ecf311934192a0fba2dd8ef5f2691e60dbf5 100644 (file)
@@ -116,6 +116,8 @@ set ( SRCS
  EMCALJetTasks/Tracks/AliEMCalTriggerEventCounterAnalysisComponent.cxx
  EMCALJetTasks/Tracks/AliEMCalTriggerPatchAnalysisComponent.cxx
  EMCALJetTasks/Tracks/AliEMCalTriggerRecTrackAnalysisComponent.cxx
+ EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.cxx
+ EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.cxx
  EMCALJetTasks/UserTasks/AliAnalysisTaskEmcalTriggerTreeWriter.cxx
 )
 
index ff370e46bf3e7210d97fb0c6714d3a7c0e5f491b..c8a5f7f8738a1e6e1a114f2f0c538b360ee92058 100644 (file)
@@ -36,7 +36,8 @@ namespace EMCalTriggerPtAnalysis {
 
 //______________________________________________________________________________
 AliEMCalTriggerEventCounterAnalysisComponent::AliEMCalTriggerEventCounterAnalysisComponent():
-  AliEMCalTriggerTracksAnalysisComponent()
+  AliEMCalTriggerTracksAnalysisComponent(),
+  fUsePatches(kFALSE)
 {
   /*
    * Default (I/O) constructor, not to be used
@@ -45,7 +46,8 @@ AliEMCalTriggerEventCounterAnalysisComponent::AliEMCalTriggerEventCounterAnalysi
 
 //______________________________________________________________________________
 AliEMCalTriggerEventCounterAnalysisComponent::AliEMCalTriggerEventCounterAnalysisComponent(const char *name):
-  AliEMCalTriggerTracksAnalysisComponent(name)
+  AliEMCalTriggerTracksAnalysisComponent(name),
+  fUsePatches(kFALSE)
 {
   /*
    * Main constructor
@@ -110,36 +112,36 @@ void AliEMCalTriggerEventCounterAnalysisComponent::Process(const AliEMCalTrigger
     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);
   }
 
index cbd8050e10ed35fbce92419834fcaf01549848ed..7d64331bb0a73fdfa7e2ef701a33568b79dc2fec 100644 (file)
@@ -20,11 +20,15 @@ public:
   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
 };
 
index 92df21edd089bf76f337da0b06b5ae705ffe2c45..54d8a13c0587814a6718d5b68f815860acafd3e6 100644 (file)
@@ -26,8 +26,8 @@ public:
   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; }
@@ -35,18 +35,18 @@ public:
   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
 };
diff --git a/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.cxx b/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.cxx
new file mode 100644 (file)
index 0000000..3b702aa
--- /dev/null
@@ -0,0 +1,161 @@
+/**************************************************************************
+ * 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 */
diff --git a/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.h b/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerMCJetAnalysisComponent.h
new file mode 100644 (file)
index 0000000..7d100b5
--- /dev/null
@@ -0,0 +1,41 @@
+#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 */
diff --git a/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.cxx b/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.cxx
new file mode 100644 (file)
index 0000000..137b06e
--- /dev/null
@@ -0,0 +1,198 @@
+/**************************************************************************
+ * 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 */
diff --git a/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.h b/PWGJE/EMCALJetTasks/Tracks/AliEMCalTriggerRecJetAnalysisComponent.h
new file mode 100644 (file)
index 0000000..72725c4
--- /dev/null
@@ -0,0 +1,46 @@
+#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 */
index 73e4b3a93b940f10f2eaedc65cdf5d13a4794c20..aa090bac2ac6d269131c695ae5b1817b22b46c71 100644 (file)
@@ -87,6 +87,8 @@ void AliEMCalTriggerRecTrackAnalysisComponent::CreateHistos() {
    * - 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",
index 639ed0f389c4de9822590ef3146e05dc7d327235..bb5ef6fb7bcf01036c0f0998b6658828bc74e74c 100644 (file)
 #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