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 for EMCal clusters. Loops over calibrated and uncalibrated clusters
 *
 *   Author: Markus Fasel
 */
#include <map>
#include <string>
#include <vector>

#include <TAxis.h>
#include <TClonesArray.h>
#include <TLorentzVector.h>

#include "AliLog.h"
#include "AliVCluster.h"
#include "AliVEvent.h"

#include "AliEMCalTriggerBinningComponent.h"
#include "AliEMCalTriggerAnaTriggerDecision.h"
#include "AliEMCalTriggerEventData.h"
#include "AliEMCalTriggerClusterAnalysisComponent.h"


ClassImp(EMCalTriggerPtAnalysis::AliEMCalTriggerClusterAnalysisComponent)

namespace EMCalTriggerPtAnalysis {

//______________________________________________________________________________
AliEMCalTriggerClusterAnalysisComponent::AliEMCalTriggerClusterAnalysisComponent() :
  AliEMCalTriggerTracksAnalysisComponent(),
  fEnergyRange(),
  fUsePatches(kFALSE)
{
  /*
   * Dummy (I/O) constructor
   */
}

//______________________________________________________________________________
AliEMCalTriggerClusterAnalysisComponent::AliEMCalTriggerClusterAnalysisComponent(const char* name) :
  AliEMCalTriggerTracksAnalysisComponent(name),
  fEnergyRange(),
  fUsePatches(kFALSE)
{
  /*
   * Main constructor
   */
  fEnergyRange.SetLimits(0., 1000.);
}

//______________________________________________________________________________
void AliEMCalTriggerClusterAnalysisComponent::CreateHistos() {
  /*
   * Create histos for clusters in different event categories
   */
  AliEMCalTriggerTracksAnalysisComponent::CreateHistos();

  // 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");
  /*
  ptbinning->Print();
  etabinning->Print();
  phibinning->Print();
  vertexbinning->Print();
  */

  const TAxis *clusteraxes[5] = {
      DefineAxis("energy", 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("hClusterCalibHist%s", name.c_str()), Form("Calib. cluster-based histogram for %s events", title.c_str()), 5, clusteraxes, "s");
    fHistos->CreateTHnSparse(Form("hClusterUncalibHist%s", name.c_str()), Form("Uncalib. cluster-based histogram for %s events", title.c_str()), 5, clusteraxes, "s");
  }

  for(int iaxis = 0; iaxis < 5; iaxis++) delete clusteraxes[iaxis];
}

//______________________________________________________________________________
void AliEMCalTriggerClusterAnalysisComponent::Process(const AliEMCalTriggerEventData* const data) {
  /*
   * Run loop over calibrated and uncalibrated clusters
   */

  // First loop over uncalibrated clusters
  AliDebug(1, Form("Number of calibrated clusters: %d", data->GetClusterContainer()->GetEntries()));

  AliVCluster *clust(NULL);
  AliVEvent *recEv = data->GetRecEvent();
  std::vector<std::string> triggerNames;
  this->GetMachingTriggerNames(triggerNames, fUsePatches);
  for(int iclust = 0; iclust < recEv->GetNumberOfCaloClusters(); iclust++){
    clust = recEv->GetCaloCluster(iclust);
    if(!clust->IsEMCAL()) continue;
    if(!fEnergyRange.IsInRange(clust->E())) continue;
    for(std::vector<std::string>::iterator name = triggerNames.begin(); name != triggerNames.end(); ++name)
      FillHistogram(Form("hClusterUncalibHist%s", name->c_str()), clust, recEv, fTriggerDecision->IsMinBias());
  }

  // Loop also over calibrated clusters
  if(!data->GetClusterContainer())
    printf("Cluster container not found \n");
  TIter clusterIter(data->GetClusterContainer());
  while((clust = dynamic_cast<AliVCluster *>(clusterIter()))){
    if(!clust->IsEMCAL()) continue;
    if(!fEnergyRange.IsInRange(clust->E())) continue;
    for(std::vector<std::string>::iterator name = triggerNames.begin(); name != triggerNames.end(); ++name)
      FillHistogram(Form("hClusterCalibHist%s", name->c_str()), clust, recEv, fTriggerDecision->IsMinBias());
  }
}

//______________________________________________________________________________
void AliEMCalTriggerClusterAnalysisComponent::FillHistogram(const TString& histname, const AliVCluster* clust, AliVEvent *ev, Bool_t inMB) {
  /*
   * Fill Histogram for cluster
   *
   * @param histname: the histogram to fill
   * @param clust: the cluster analysed
   * @param event: reconstructed event information
   * @param inMB: true if event fulfills min bias condition
   */
  TLorentzVector vec;
  double xyz[3];
  ev->GetPrimaryVertex()->GetXYZ(xyz);
  clust->GetMomentum(vec, xyz);
  double infs[5] = {clust->E(), vec.Eta(), vec.Phi(), xyz[2], inMB ? 1. : 0.};
  fHistos->FillTHnSparse(histname.Data(), infs);
}


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