ROOT logo
#if !defined (__CINT__) || defined (__MAKECINT__)
#include "AliAnalysisManager.h"
#include "AliAnalysisTaskPtEMCalTriggerV1.h"
#include "AliESDtrackCuts.h"
#include "AliJetContainer.h"
#include <TList.h>
#include <TString.h>
#include <cstring>
#endif

void AddClusterComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, bool isMC);
void AddTrackComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, AliESDtrackCuts *trackcuts, bool isMC, bool isSwapEta);
void AddMCParticleComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group);
void AddEventCounterComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, bool isMC);
void AddMCJetComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, double minJetPt);
void AddRecJetComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, AliESDtrackCuts *trackcuts, double minJetPt, bool isMC, bool isSwapEta);
AliESDtrackCuts *CreateDefaultTrackCuts();
AliESDtrackCuts *CreateHybridTrackCuts();

AliAnalysisTask* AddTaskPtEMCalTriggerV1(
    bool isMC,
    bool usePythiaHard,
    const char *period ="LHC13d",
    const char *ntrackContainer = "",
    const char *nclusterContainer = "",
    const char *njetcontainerData = "",
    const char *njetcontainerMC = "",
    double jetradius = 0.5
)
{
  //AliLog::SetClassDebugLevel("EMCalTriggerPtAnalysis::AliAnalysisTaskPtEMCalTrigger", 2);
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();

  if (!mgr) {
    ::Error("AddTaskPtEMCalTrigger", "No analysis manager to connect to.");
    return NULL;
  }

  if (!mgr->GetInputEventHandler()) {
    ::Error("AddTaskPtEMCalTrigger", "This task requires an input event handler");
    return NULL;
  }

  bool isSwapEta = TString(period).CompareTo("LHC13f") ? kFALSE : kTRUE;
  EMCalTriggerPtAnalysis::AliAnalysisTaskPtEMCalTriggerV1 *pttriggertask = new EMCalTriggerPtAnalysis::AliAnalysisTaskPtEMCalTriggerV1("ptemcaltriggertask");
  //pttriggertask->SelectCollisionCandidates(AliVEvent::kINT7 | AliVEvent::kEMC7);                          // Select both INT7 or EMC7 triggered events
  pttriggertask->SelectCollisionCandidates(AliVEvent::kAny);

  mgr->AddTask(pttriggertask);
  if(usePythiaHard){
    pttriggertask->SetIsPythia(kTRUE);
  }

  // Add components
  EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *noselect = new EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup("noselect");
  noselect->AddAnalysisComponent(new EMCalTriggerPtAnalysis::AliEMCalTriggerPatchAnalysisComponent("patchanalysis"));

  double jetpt[4] = {40., 60., 80., 100.};
  EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *defaultselect = new EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup("defaultselect");
  defaultselect->SetEventSelection(new EMCalTriggerPtAnalysis::AliEMCalTriggerEventSelection());
  EMCalTriggerPtAnalysis::AliEMCalTriggerKineCuts *kineCuts = new EMCalTriggerPtAnalysis::AliEMCalTriggerKineCuts();
  kineCuts->SetPtRange(2., 100.);
  defaultselect->SetKineCuts(kineCuts);
  AddEventCounterComponent(defaultselect, isMC);
  if(isMC){
    AddMCParticleComponent(defaultselect);
    for(int ijpt = 0; ijpt < 4; ijpt++)
      AddMCJetComponent(defaultselect, jetpt[ijpt]);
  }
  AddClusterComponent(defaultselect, isMC);
  AddTrackComponent(defaultselect, CreateDefaultTrackCuts(), isMC, isSwapEta);
  for(int ijpt = 0; ijpt < 4; ijpt++)
    AddRecJetComponent(defaultselect, CreateDefaultTrackCuts(), jetpt[ijpt], isMC, isSwapEta);

  pttriggertask->AddAnalysisGroup(noselect);
  pttriggertask->AddAnalysisGroup(defaultselect);

  // Add containers
  Bool_t isAOD = mgr->GetInputEventHandler()->IsA() == AliAODInputHandler::Class();
  AliParticleContainer *trackContainer = pttriggertask->AddParticleContainer(ntrackContainer);
  //trackContainer->SetClassName("AliVTrack");
  AliClusterContainer *clusterContainer = pttriggertask->AddClusterContainer(nclusterContainer);
  AliParticleContainer *mcpartcont = isMC ? pttriggertask->AddParticleContainer("MCParticlesSelected") : NULL;


  // Handle Jet Containers
  if(strlen(njetcontainerData)){
    AliJetContainer *jetcontainerData = pttriggertask->AddJetContainer(njetcontainerData, "TPC", jetradius);
    pttriggertask->SetDataJetContainerName("PtTriggerTaskJetsData");
    jetcontainerData->ConnectParticleContainer(trackContainer);
    jetcontainerData->SetName("PtTriggerTaskJetsData");
    jetcontainerData->SetJetPtCut(20.);
    jetcontainerData->SetJetEtaPhiEMCAL();
  }
  if(isMC && strlen(njetcontainerMC)){
    AliJetContainer *jetcontainerMC = pttriggertask->AddJetContainer(njetcontainerMC, "TPC", jetradius);
    pttriggertask->SetMCJetContainerName("PtTriggerTaskJetsMC")
    jetcontainerMC->ConnectParticleContainer(mcpartcont);
    jetcontainerMC->SetName("PtTriggerTaskJetsMC");
    jetcontainerMC->SetJetPtCut(20.);
    jetcontainerMC->SetJetEtaPhiEMCAL();
  }

  TString containerName = mgr->GetCommonFileName();
  containerName += ":PtEMCalTriggerTask";
  printf("container name: %s\n", containerName.Data());

  AliAnalysisDataContainer *cinput = mgr->GetCommonInputContainer();
  AliAnalysisDataContainer *coutput = mgr->CreateContainer("results", TList::Class(),    AliAnalysisManager::kOutputContainer, containerName.Data());

  //Connect input/output
  mgr->ConnectInput(pttriggertask, 0, cinput);
  mgr->ConnectOutput(pttriggertask, 1, coutput);

  return pttriggertask;
}

void AddClusterComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, bool isMC){
  EMCalTriggerPtAnalysis::AliEMCalTriggerClusterAnalysisComponent *clusteranalysis = new EMCalTriggerPtAnalysis::AliEMCalTriggerClusterAnalysisComponent("clusterAnalysis");
  clusteranalysis->SetEnergyRange(2., 100.);
  if(isMC) clusteranalysis->SetUsePatches();
  group->AddAnalysisComponent(clusteranalysis);
}

void AddTrackComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, AliESDtrackCuts * trackcuts, bool isMC, bool isSwapEta){
  EMCalTriggerPtAnalysis::AliEMCalTriggerRecTrackAnalysisComponent *trackanalysis = new EMCalTriggerPtAnalysis::AliEMCalTriggerRecTrackAnalysisComponent("trackAnalysisStandard");
  group->AddAnalysisComponent(trackanalysis);
  // Create charged hadrons pPb standard track cuts
  trackanalysis->SetTrackSelection(new EMCalTriggerPtAnalysis::AliEMCalPtTaskTrackSelectionESD(trackcuts));

  if(isMC){
    trackanalysis->SetRequestMCtrueTracks();
    trackanalysis->SetUsePatches();
  }
  if(isSwapEta) trackanalysis->SetSwapEta();
}

void AddEventCounterComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, Bool_t isMC){
  EMCalTriggerPtAnalysis::AliEMCalTriggerEventCounterAnalysisComponent * evcount = new EMCalTriggerPtAnalysis::AliEMCalTriggerEventCounterAnalysisComponent("eventCounter");
  evcount->SetUsePatches(isMC);
  group->AddAnalysisComponent(evcount);
}

void AddMCParticleComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group){
  group->AddAnalysisComponent(new EMCalTriggerPtAnalysis::AliEMCalTriggerMCParticleAnalysisComponent("partana"));
}

void AddMCJetComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, double minJetPt){
  EMCalTriggerPtAnalysis::AliEMCalTriggerMCJetAnalysisComponent *jetana = new EMCalTriggerPtAnalysis::AliEMCalTriggerMCJetAnalysisComponent(Form("MCJetAna%f", minJetPt));
  jetana->SetMinimumJetPt(minJetPt);
  jetana->SetUsePatches();
  group->AddAnalysisComponent(jetana);
}

void AddRecJetComponent(EMCalTriggerPtAnalysis::AliEMCalTriggerTaskGroup *group, AliESDtrackCuts *trackcuts, double minJetPt, bool isMC, bool isSwapEta){
  EMCalTriggerPtAnalysis::AliEMCalTriggerRecJetAnalysisComponent *jetana = new EMCalTriggerPtAnalysis::AliEMCalTriggerRecJetAnalysisComponent(Form("RecJetAna%f", minJetPt));
  jetana->SetMinimumJetPt(minJetPt);
  jetana->SetUsePatches();
  jetana->SetSingleTrackCuts(new EMCalTriggerPtAnalysis::AliEMCalPtTaskTrackSelectionESD(trackcuts));
  group->AddAnalysisComponent(jetana);
}

AliESDtrackCuts *CreateDefaultTrackCuts(){
  AliESDtrackCuts *standardTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(true, 1);
  standardTrackCuts->SetName("Standard Track cuts");
  standardTrackCuts->SetMinNCrossedRowsTPC(120);
  standardTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
  return standardTrackCuts;
}

AliESDtrackCuts *CreateHybridTrackCuts(){
  AliESDtrackCuts* hybridTrackCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
  hybridTrackCuts->SetName("Global Hybrid tracks, loose DCA");
  hybridTrackCuts->SetMaxDCAToVertexXY(2.4);
  hybridTrackCuts->SetMaxDCAToVertexZ(3.2);
  hybridTrackCuts->SetDCAToVertex2D(kTRUE);
  hybridTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
  hybridTrackCuts->SetMaxFractionSharedTPCClusters(0.4);
  return hybridTrackCuts;
}
 AddTaskPtEMCalTriggerV1.C:1
 AddTaskPtEMCalTriggerV1.C:2
 AddTaskPtEMCalTriggerV1.C:3
 AddTaskPtEMCalTriggerV1.C:4
 AddTaskPtEMCalTriggerV1.C:5
 AddTaskPtEMCalTriggerV1.C:6
 AddTaskPtEMCalTriggerV1.C:7
 AddTaskPtEMCalTriggerV1.C:8
 AddTaskPtEMCalTriggerV1.C:9
 AddTaskPtEMCalTriggerV1.C:10
 AddTaskPtEMCalTriggerV1.C:11
 AddTaskPtEMCalTriggerV1.C:12
 AddTaskPtEMCalTriggerV1.C:13
 AddTaskPtEMCalTriggerV1.C:14
 AddTaskPtEMCalTriggerV1.C:15
 AddTaskPtEMCalTriggerV1.C:16
 AddTaskPtEMCalTriggerV1.C:17
 AddTaskPtEMCalTriggerV1.C:18
 AddTaskPtEMCalTriggerV1.C:19
 AddTaskPtEMCalTriggerV1.C:20
 AddTaskPtEMCalTriggerV1.C:21
 AddTaskPtEMCalTriggerV1.C:22
 AddTaskPtEMCalTriggerV1.C:23
 AddTaskPtEMCalTriggerV1.C:24
 AddTaskPtEMCalTriggerV1.C:25
 AddTaskPtEMCalTriggerV1.C:26
 AddTaskPtEMCalTriggerV1.C:27
 AddTaskPtEMCalTriggerV1.C:28
 AddTaskPtEMCalTriggerV1.C:29
 AddTaskPtEMCalTriggerV1.C:30
 AddTaskPtEMCalTriggerV1.C:31
 AddTaskPtEMCalTriggerV1.C:32
 AddTaskPtEMCalTriggerV1.C:33
 AddTaskPtEMCalTriggerV1.C:34
 AddTaskPtEMCalTriggerV1.C:35
 AddTaskPtEMCalTriggerV1.C:36
 AddTaskPtEMCalTriggerV1.C:37
 AddTaskPtEMCalTriggerV1.C:38
 AddTaskPtEMCalTriggerV1.C:39
 AddTaskPtEMCalTriggerV1.C:40
 AddTaskPtEMCalTriggerV1.C:41
 AddTaskPtEMCalTriggerV1.C:42
 AddTaskPtEMCalTriggerV1.C:43
 AddTaskPtEMCalTriggerV1.C:44
 AddTaskPtEMCalTriggerV1.C:45
 AddTaskPtEMCalTriggerV1.C:46
 AddTaskPtEMCalTriggerV1.C:47
 AddTaskPtEMCalTriggerV1.C:48
 AddTaskPtEMCalTriggerV1.C:49
 AddTaskPtEMCalTriggerV1.C:50
 AddTaskPtEMCalTriggerV1.C:51
 AddTaskPtEMCalTriggerV1.C:52
 AddTaskPtEMCalTriggerV1.C:53
 AddTaskPtEMCalTriggerV1.C:54
 AddTaskPtEMCalTriggerV1.C:55
 AddTaskPtEMCalTriggerV1.C:56
 AddTaskPtEMCalTriggerV1.C:57
 AddTaskPtEMCalTriggerV1.C:58
 AddTaskPtEMCalTriggerV1.C:59
 AddTaskPtEMCalTriggerV1.C:60
 AddTaskPtEMCalTriggerV1.C:61
 AddTaskPtEMCalTriggerV1.C:62
 AddTaskPtEMCalTriggerV1.C:63
 AddTaskPtEMCalTriggerV1.C:64
 AddTaskPtEMCalTriggerV1.C:65
 AddTaskPtEMCalTriggerV1.C:66
 AddTaskPtEMCalTriggerV1.C:67
 AddTaskPtEMCalTriggerV1.C:68
 AddTaskPtEMCalTriggerV1.C:69
 AddTaskPtEMCalTriggerV1.C:70
 AddTaskPtEMCalTriggerV1.C:71
 AddTaskPtEMCalTriggerV1.C:72
 AddTaskPtEMCalTriggerV1.C:73
 AddTaskPtEMCalTriggerV1.C:74
 AddTaskPtEMCalTriggerV1.C:75
 AddTaskPtEMCalTriggerV1.C:76
 AddTaskPtEMCalTriggerV1.C:77
 AddTaskPtEMCalTriggerV1.C:78
 AddTaskPtEMCalTriggerV1.C:79
 AddTaskPtEMCalTriggerV1.C:80
 AddTaskPtEMCalTriggerV1.C:81
 AddTaskPtEMCalTriggerV1.C:82
 AddTaskPtEMCalTriggerV1.C:83
 AddTaskPtEMCalTriggerV1.C:84
 AddTaskPtEMCalTriggerV1.C:85
 AddTaskPtEMCalTriggerV1.C:86
 AddTaskPtEMCalTriggerV1.C:87
 AddTaskPtEMCalTriggerV1.C:88
 AddTaskPtEMCalTriggerV1.C:89
 AddTaskPtEMCalTriggerV1.C:90
 AddTaskPtEMCalTriggerV1.C:91
 AddTaskPtEMCalTriggerV1.C:92
 AddTaskPtEMCalTriggerV1.C:93
 AddTaskPtEMCalTriggerV1.C:94
 AddTaskPtEMCalTriggerV1.C:95
 AddTaskPtEMCalTriggerV1.C:96
 AddTaskPtEMCalTriggerV1.C:97
 AddTaskPtEMCalTriggerV1.C:98
 AddTaskPtEMCalTriggerV1.C:99
 AddTaskPtEMCalTriggerV1.C:100
 AddTaskPtEMCalTriggerV1.C:101
 AddTaskPtEMCalTriggerV1.C:102
 AddTaskPtEMCalTriggerV1.C:103
 AddTaskPtEMCalTriggerV1.C:104
 AddTaskPtEMCalTriggerV1.C:105
 AddTaskPtEMCalTriggerV1.C:106
 AddTaskPtEMCalTriggerV1.C:107
 AddTaskPtEMCalTriggerV1.C:108
 AddTaskPtEMCalTriggerV1.C:109
 AddTaskPtEMCalTriggerV1.C:110
 AddTaskPtEMCalTriggerV1.C:111
 AddTaskPtEMCalTriggerV1.C:112
 AddTaskPtEMCalTriggerV1.C:113
 AddTaskPtEMCalTriggerV1.C:114
 AddTaskPtEMCalTriggerV1.C:115
 AddTaskPtEMCalTriggerV1.C:116
 AddTaskPtEMCalTriggerV1.C:117
 AddTaskPtEMCalTriggerV1.C:118
 AddTaskPtEMCalTriggerV1.C:119
 AddTaskPtEMCalTriggerV1.C:120
 AddTaskPtEMCalTriggerV1.C:121
 AddTaskPtEMCalTriggerV1.C:122
 AddTaskPtEMCalTriggerV1.C:123
 AddTaskPtEMCalTriggerV1.C:124
 AddTaskPtEMCalTriggerV1.C:125
 AddTaskPtEMCalTriggerV1.C:126
 AddTaskPtEMCalTriggerV1.C:127
 AddTaskPtEMCalTriggerV1.C:128
 AddTaskPtEMCalTriggerV1.C:129
 AddTaskPtEMCalTriggerV1.C:130
 AddTaskPtEMCalTriggerV1.C:131
 AddTaskPtEMCalTriggerV1.C:132
 AddTaskPtEMCalTriggerV1.C:133
 AddTaskPtEMCalTriggerV1.C:134
 AddTaskPtEMCalTriggerV1.C:135
 AddTaskPtEMCalTriggerV1.C:136
 AddTaskPtEMCalTriggerV1.C:137
 AddTaskPtEMCalTriggerV1.C:138
 AddTaskPtEMCalTriggerV1.C:139
 AddTaskPtEMCalTriggerV1.C:140
 AddTaskPtEMCalTriggerV1.C:141
 AddTaskPtEMCalTriggerV1.C:142
 AddTaskPtEMCalTriggerV1.C:143
 AddTaskPtEMCalTriggerV1.C:144
 AddTaskPtEMCalTriggerV1.C:145
 AddTaskPtEMCalTriggerV1.C:146
 AddTaskPtEMCalTriggerV1.C:147
 AddTaskPtEMCalTriggerV1.C:148
 AddTaskPtEMCalTriggerV1.C:149
 AddTaskPtEMCalTriggerV1.C:150
 AddTaskPtEMCalTriggerV1.C:151
 AddTaskPtEMCalTriggerV1.C:152
 AddTaskPtEMCalTriggerV1.C:153
 AddTaskPtEMCalTriggerV1.C:154
 AddTaskPtEMCalTriggerV1.C:155
 AddTaskPtEMCalTriggerV1.C:156
 AddTaskPtEMCalTriggerV1.C:157
 AddTaskPtEMCalTriggerV1.C:158
 AddTaskPtEMCalTriggerV1.C:159
 AddTaskPtEMCalTriggerV1.C:160
 AddTaskPtEMCalTriggerV1.C:161
 AddTaskPtEMCalTriggerV1.C:162
 AddTaskPtEMCalTriggerV1.C:163
 AddTaskPtEMCalTriggerV1.C:164
 AddTaskPtEMCalTriggerV1.C:165
 AddTaskPtEMCalTriggerV1.C:166
 AddTaskPtEMCalTriggerV1.C:167
 AddTaskPtEMCalTriggerV1.C:168
 AddTaskPtEMCalTriggerV1.C:169
 AddTaskPtEMCalTriggerV1.C:170
 AddTaskPtEMCalTriggerV1.C:171
 AddTaskPtEMCalTriggerV1.C:172
 AddTaskPtEMCalTriggerV1.C:173
 AddTaskPtEMCalTriggerV1.C:174
 AddTaskPtEMCalTriggerV1.C:175
 AddTaskPtEMCalTriggerV1.C:176
 AddTaskPtEMCalTriggerV1.C:177
 AddTaskPtEMCalTriggerV1.C:178
 AddTaskPtEMCalTriggerV1.C:179
 AddTaskPtEMCalTriggerV1.C:180
 AddTaskPtEMCalTriggerV1.C:181