ROOT logo
/**************************************************************************
 * 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),
  fSwapEta(kFALSE),
  fUsePatches(kFALSE)
{
  /*
   * Dummy (I/O) constructor, not to be used
   */
}

//______________________________________________________________________________
AliEMCalTriggerRecJetAnalysisComponent::AliEMCalTriggerRecJetAnalysisComponent(const char* name) :
  AliEMCalTriggerTracksAnalysisComponent(name),
  fTrackSelection(NULL),
  fMinimumJetPt(20.),
  fRequestMCtrue(kFALSE),
  fSwapEta(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("zvertex");

  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()), (fSwapEta ? -1. : 1.) * track->Eta(), track->Phi(), vz, fTriggerDecision->IsMinBias() ? 1. : 0.};
  fHistos->FillTHnSparse(histname.Data(), data);
}

} /* namespace EMCalTriggerPtAnalysis */
 AliEMCalTriggerRecJetAnalysisComponent.cxx:1
 AliEMCalTriggerRecJetAnalysisComponent.cxx:2
 AliEMCalTriggerRecJetAnalysisComponent.cxx:3
 AliEMCalTriggerRecJetAnalysisComponent.cxx:4
 AliEMCalTriggerRecJetAnalysisComponent.cxx:5
 AliEMCalTriggerRecJetAnalysisComponent.cxx:6
 AliEMCalTriggerRecJetAnalysisComponent.cxx:7
 AliEMCalTriggerRecJetAnalysisComponent.cxx:8
 AliEMCalTriggerRecJetAnalysisComponent.cxx:9
 AliEMCalTriggerRecJetAnalysisComponent.cxx:10
 AliEMCalTriggerRecJetAnalysisComponent.cxx:11
 AliEMCalTriggerRecJetAnalysisComponent.cxx:12
 AliEMCalTriggerRecJetAnalysisComponent.cxx:13
 AliEMCalTriggerRecJetAnalysisComponent.cxx:14
 AliEMCalTriggerRecJetAnalysisComponent.cxx:15
 AliEMCalTriggerRecJetAnalysisComponent.cxx:16
 AliEMCalTriggerRecJetAnalysisComponent.cxx:17
 AliEMCalTriggerRecJetAnalysisComponent.cxx:18
 AliEMCalTriggerRecJetAnalysisComponent.cxx:19
 AliEMCalTriggerRecJetAnalysisComponent.cxx:20
 AliEMCalTriggerRecJetAnalysisComponent.cxx:21
 AliEMCalTriggerRecJetAnalysisComponent.cxx:22
 AliEMCalTriggerRecJetAnalysisComponent.cxx:23
 AliEMCalTriggerRecJetAnalysisComponent.cxx:24
 AliEMCalTriggerRecJetAnalysisComponent.cxx:25
 AliEMCalTriggerRecJetAnalysisComponent.cxx:26
 AliEMCalTriggerRecJetAnalysisComponent.cxx:27
 AliEMCalTriggerRecJetAnalysisComponent.cxx:28
 AliEMCalTriggerRecJetAnalysisComponent.cxx:29
 AliEMCalTriggerRecJetAnalysisComponent.cxx:30
 AliEMCalTriggerRecJetAnalysisComponent.cxx:31
 AliEMCalTriggerRecJetAnalysisComponent.cxx:32
 AliEMCalTriggerRecJetAnalysisComponent.cxx:33
 AliEMCalTriggerRecJetAnalysisComponent.cxx:34
 AliEMCalTriggerRecJetAnalysisComponent.cxx:35
 AliEMCalTriggerRecJetAnalysisComponent.cxx:36
 AliEMCalTriggerRecJetAnalysisComponent.cxx:37
 AliEMCalTriggerRecJetAnalysisComponent.cxx:38
 AliEMCalTriggerRecJetAnalysisComponent.cxx:39
 AliEMCalTriggerRecJetAnalysisComponent.cxx:40
 AliEMCalTriggerRecJetAnalysisComponent.cxx:41
 AliEMCalTriggerRecJetAnalysisComponent.cxx:42
 AliEMCalTriggerRecJetAnalysisComponent.cxx:43
 AliEMCalTriggerRecJetAnalysisComponent.cxx:44
 AliEMCalTriggerRecJetAnalysisComponent.cxx:45
 AliEMCalTriggerRecJetAnalysisComponent.cxx:46
 AliEMCalTriggerRecJetAnalysisComponent.cxx:47
 AliEMCalTriggerRecJetAnalysisComponent.cxx:48
 AliEMCalTriggerRecJetAnalysisComponent.cxx:49
 AliEMCalTriggerRecJetAnalysisComponent.cxx:50
 AliEMCalTriggerRecJetAnalysisComponent.cxx:51
 AliEMCalTriggerRecJetAnalysisComponent.cxx:52
 AliEMCalTriggerRecJetAnalysisComponent.cxx:53
 AliEMCalTriggerRecJetAnalysisComponent.cxx:54
 AliEMCalTriggerRecJetAnalysisComponent.cxx:55
 AliEMCalTriggerRecJetAnalysisComponent.cxx:56
 AliEMCalTriggerRecJetAnalysisComponent.cxx:57
 AliEMCalTriggerRecJetAnalysisComponent.cxx:58
 AliEMCalTriggerRecJetAnalysisComponent.cxx:59
 AliEMCalTriggerRecJetAnalysisComponent.cxx:60
 AliEMCalTriggerRecJetAnalysisComponent.cxx:61
 AliEMCalTriggerRecJetAnalysisComponent.cxx:62
 AliEMCalTriggerRecJetAnalysisComponent.cxx:63
 AliEMCalTriggerRecJetAnalysisComponent.cxx:64
 AliEMCalTriggerRecJetAnalysisComponent.cxx:65
 AliEMCalTriggerRecJetAnalysisComponent.cxx:66
 AliEMCalTriggerRecJetAnalysisComponent.cxx:67
 AliEMCalTriggerRecJetAnalysisComponent.cxx:68
 AliEMCalTriggerRecJetAnalysisComponent.cxx:69
 AliEMCalTriggerRecJetAnalysisComponent.cxx:70
 AliEMCalTriggerRecJetAnalysisComponent.cxx:71
 AliEMCalTriggerRecJetAnalysisComponent.cxx:72
 AliEMCalTriggerRecJetAnalysisComponent.cxx:73
 AliEMCalTriggerRecJetAnalysisComponent.cxx:74
 AliEMCalTriggerRecJetAnalysisComponent.cxx:75
 AliEMCalTriggerRecJetAnalysisComponent.cxx:76
 AliEMCalTriggerRecJetAnalysisComponent.cxx:77
 AliEMCalTriggerRecJetAnalysisComponent.cxx:78
 AliEMCalTriggerRecJetAnalysisComponent.cxx:79
 AliEMCalTriggerRecJetAnalysisComponent.cxx:80
 AliEMCalTriggerRecJetAnalysisComponent.cxx:81
 AliEMCalTriggerRecJetAnalysisComponent.cxx:82
 AliEMCalTriggerRecJetAnalysisComponent.cxx:83
 AliEMCalTriggerRecJetAnalysisComponent.cxx:84
 AliEMCalTriggerRecJetAnalysisComponent.cxx:85
 AliEMCalTriggerRecJetAnalysisComponent.cxx:86
 AliEMCalTriggerRecJetAnalysisComponent.cxx:87
 AliEMCalTriggerRecJetAnalysisComponent.cxx:88
 AliEMCalTriggerRecJetAnalysisComponent.cxx:89
 AliEMCalTriggerRecJetAnalysisComponent.cxx:90
 AliEMCalTriggerRecJetAnalysisComponent.cxx:91
 AliEMCalTriggerRecJetAnalysisComponent.cxx:92
 AliEMCalTriggerRecJetAnalysisComponent.cxx:93
 AliEMCalTriggerRecJetAnalysisComponent.cxx:94
 AliEMCalTriggerRecJetAnalysisComponent.cxx:95
 AliEMCalTriggerRecJetAnalysisComponent.cxx:96
 AliEMCalTriggerRecJetAnalysisComponent.cxx:97
 AliEMCalTriggerRecJetAnalysisComponent.cxx:98
 AliEMCalTriggerRecJetAnalysisComponent.cxx:99
 AliEMCalTriggerRecJetAnalysisComponent.cxx:100
 AliEMCalTriggerRecJetAnalysisComponent.cxx:101
 AliEMCalTriggerRecJetAnalysisComponent.cxx:102
 AliEMCalTriggerRecJetAnalysisComponent.cxx:103
 AliEMCalTriggerRecJetAnalysisComponent.cxx:104
 AliEMCalTriggerRecJetAnalysisComponent.cxx:105
 AliEMCalTriggerRecJetAnalysisComponent.cxx:106
 AliEMCalTriggerRecJetAnalysisComponent.cxx:107
 AliEMCalTriggerRecJetAnalysisComponent.cxx:108
 AliEMCalTriggerRecJetAnalysisComponent.cxx:109
 AliEMCalTriggerRecJetAnalysisComponent.cxx:110
 AliEMCalTriggerRecJetAnalysisComponent.cxx:111
 AliEMCalTriggerRecJetAnalysisComponent.cxx:112
 AliEMCalTriggerRecJetAnalysisComponent.cxx:113
 AliEMCalTriggerRecJetAnalysisComponent.cxx:114
 AliEMCalTriggerRecJetAnalysisComponent.cxx:115
 AliEMCalTriggerRecJetAnalysisComponent.cxx:116
 AliEMCalTriggerRecJetAnalysisComponent.cxx:117
 AliEMCalTriggerRecJetAnalysisComponent.cxx:118
 AliEMCalTriggerRecJetAnalysisComponent.cxx:119
 AliEMCalTriggerRecJetAnalysisComponent.cxx:120
 AliEMCalTriggerRecJetAnalysisComponent.cxx:121
 AliEMCalTriggerRecJetAnalysisComponent.cxx:122
 AliEMCalTriggerRecJetAnalysisComponent.cxx:123
 AliEMCalTriggerRecJetAnalysisComponent.cxx:124
 AliEMCalTriggerRecJetAnalysisComponent.cxx:125
 AliEMCalTriggerRecJetAnalysisComponent.cxx:126
 AliEMCalTriggerRecJetAnalysisComponent.cxx:127
 AliEMCalTriggerRecJetAnalysisComponent.cxx:128
 AliEMCalTriggerRecJetAnalysisComponent.cxx:129
 AliEMCalTriggerRecJetAnalysisComponent.cxx:130
 AliEMCalTriggerRecJetAnalysisComponent.cxx:131
 AliEMCalTriggerRecJetAnalysisComponent.cxx:132
 AliEMCalTriggerRecJetAnalysisComponent.cxx:133
 AliEMCalTriggerRecJetAnalysisComponent.cxx:134
 AliEMCalTriggerRecJetAnalysisComponent.cxx:135
 AliEMCalTriggerRecJetAnalysisComponent.cxx:136
 AliEMCalTriggerRecJetAnalysisComponent.cxx:137
 AliEMCalTriggerRecJetAnalysisComponent.cxx:138
 AliEMCalTriggerRecJetAnalysisComponent.cxx:139
 AliEMCalTriggerRecJetAnalysisComponent.cxx:140
 AliEMCalTriggerRecJetAnalysisComponent.cxx:141
 AliEMCalTriggerRecJetAnalysisComponent.cxx:142
 AliEMCalTriggerRecJetAnalysisComponent.cxx:143
 AliEMCalTriggerRecJetAnalysisComponent.cxx:144
 AliEMCalTriggerRecJetAnalysisComponent.cxx:145
 AliEMCalTriggerRecJetAnalysisComponent.cxx:146
 AliEMCalTriggerRecJetAnalysisComponent.cxx:147
 AliEMCalTriggerRecJetAnalysisComponent.cxx:148
 AliEMCalTriggerRecJetAnalysisComponent.cxx:149
 AliEMCalTriggerRecJetAnalysisComponent.cxx:150
 AliEMCalTriggerRecJetAnalysisComponent.cxx:151
 AliEMCalTriggerRecJetAnalysisComponent.cxx:152
 AliEMCalTriggerRecJetAnalysisComponent.cxx:153
 AliEMCalTriggerRecJetAnalysisComponent.cxx:154
 AliEMCalTriggerRecJetAnalysisComponent.cxx:155
 AliEMCalTriggerRecJetAnalysisComponent.cxx:156
 AliEMCalTriggerRecJetAnalysisComponent.cxx:157
 AliEMCalTriggerRecJetAnalysisComponent.cxx:158
 AliEMCalTriggerRecJetAnalysisComponent.cxx:159
 AliEMCalTriggerRecJetAnalysisComponent.cxx:160
 AliEMCalTriggerRecJetAnalysisComponent.cxx:161
 AliEMCalTriggerRecJetAnalysisComponent.cxx:162
 AliEMCalTriggerRecJetAnalysisComponent.cxx:163
 AliEMCalTriggerRecJetAnalysisComponent.cxx:164
 AliEMCalTriggerRecJetAnalysisComponent.cxx:165
 AliEMCalTriggerRecJetAnalysisComponent.cxx:166
 AliEMCalTriggerRecJetAnalysisComponent.cxx:167
 AliEMCalTriggerRecJetAnalysisComponent.cxx:168
 AliEMCalTriggerRecJetAnalysisComponent.cxx:169
 AliEMCalTriggerRecJetAnalysisComponent.cxx:170
 AliEMCalTriggerRecJetAnalysisComponent.cxx:171
 AliEMCalTriggerRecJetAnalysisComponent.cxx:172
 AliEMCalTriggerRecJetAnalysisComponent.cxx:173
 AliEMCalTriggerRecJetAnalysisComponent.cxx:174
 AliEMCalTriggerRecJetAnalysisComponent.cxx:175
 AliEMCalTriggerRecJetAnalysisComponent.cxx:176
 AliEMCalTriggerRecJetAnalysisComponent.cxx:177
 AliEMCalTriggerRecJetAnalysisComponent.cxx:178
 AliEMCalTriggerRecJetAnalysisComponent.cxx:179
 AliEMCalTriggerRecJetAnalysisComponent.cxx:180
 AliEMCalTriggerRecJetAnalysisComponent.cxx:181
 AliEMCalTriggerRecJetAnalysisComponent.cxx:182
 AliEMCalTriggerRecJetAnalysisComponent.cxx:183
 AliEMCalTriggerRecJetAnalysisComponent.cxx:184
 AliEMCalTriggerRecJetAnalysisComponent.cxx:185
 AliEMCalTriggerRecJetAnalysisComponent.cxx:186
 AliEMCalTriggerRecJetAnalysisComponent.cxx:187
 AliEMCalTriggerRecJetAnalysisComponent.cxx:188
 AliEMCalTriggerRecJetAnalysisComponent.cxx:189
 AliEMCalTriggerRecJetAnalysisComponent.cxx:190
 AliEMCalTriggerRecJetAnalysisComponent.cxx:191
 AliEMCalTriggerRecJetAnalysisComponent.cxx:192
 AliEMCalTriggerRecJetAnalysisComponent.cxx:193
 AliEMCalTriggerRecJetAnalysisComponent.cxx:194
 AliEMCalTriggerRecJetAnalysisComponent.cxx:195
 AliEMCalTriggerRecJetAnalysisComponent.cxx:196
 AliEMCalTriggerRecJetAnalysisComponent.cxx:197
 AliEMCalTriggerRecJetAnalysisComponent.cxx:198
 AliEMCalTriggerRecJetAnalysisComponent.cxx:199
 AliEMCalTriggerRecJetAnalysisComponent.cxx:200