ROOT logo
// $Id$
//
// Jet trigger selection task.
//
// Author: S.Aiola

#include <TLorentzVector.h>
#include <TMath.h>
#include <TF1.h>

#include "AliVEvent.h"
#include "AliVCluster.h"
#include "AliEmcalJet.h"
#include "AliLog.h"
#include "AliVVZERO.h"
#include "AliESDUtils.h"

#include "AliJetTriggerSelectionTask.h"

ClassImp(AliJetTriggerSelectionTask)

//________________________________________________________________________
AliJetTriggerSelectionTask::AliJetTriggerSelectionTask() : 
  AliAnalysisTaskEmcalJet("AliJetTriggerSelectionTask", kFALSE),
  fEnergyThreshold(0),
  fMaxDistance2(0.0225),
  fTriggerBits(AliVEvent::kEMCEJE),
  fTaskSettingsOk(kFALSE),
  fNTriggers(0),
  fVZERO(0),
  fV0ATotMult(0),
  fV0CTotMult(0)
{
  // Default constructor.
  
  for (Int_t i = 0; i < 999; i++) {
    fTrigPos[i][0] = -999;
    fTrigPos[i][1] = -999;
  }
}

//________________________________________________________________________
AliJetTriggerSelectionTask::AliJetTriggerSelectionTask(const char *name) : 
  AliAnalysisTaskEmcalJet(name, kFALSE),
  fEnergyThreshold(0),
  fMaxDistance2(0.0225),
  fTriggerBits(AliVEvent::kEMCEJE),
  fTaskSettingsOk(kFALSE),
  fNTriggers(0),
  fVZERO(0),
  fV0ATotMult(0),
  fV0CTotMult(0)
{
  // Standard constructor.

  for (Int_t i = 0; i < 999; i++) {
    fTrigPos[i][0] = -999;
    fTrigPos[i][1] = -999;
  }
}

//________________________________________________________________________
void AliJetTriggerSelectionTask::ExecOnce()
{
  // Initialize the task.

  AliAnalysisTaskEmcalJet::ExecOnce();

  fTaskSettingsOk = kTRUE;

  fVZERO = InputEvent()->GetVZEROData();
  if (!fVZERO) {
    AliError(Form("%s: AliVVZERO not available, task will not be executed!",GetName()));
    fTaskSettingsOk = kFALSE;
  }
  
  if (GetClusterArray() == 0) {
    AliError(Form("%s: No cluster collection provided, task will not be executed!",GetName()));
    fTaskSettingsOk = kFALSE;
  }

  if (GetJetArray() == 0) {
    AliError(Form("%s: No jet collection provided, task will not be executed!",GetName()));
    fTaskSettingsOk = kFALSE;
  }
 
  if (!fEnergyThreshold) {
    AliError(Form("%s: No threshold function provided, task will not be executed!",GetName()));
    fTaskSettingsOk = kFALSE;
  }
}

//________________________________________________________________________
Bool_t AliJetTriggerSelectionTask::RetrieveEventObjects()
{
  // Retrieve event objects.

  if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
    return kFALSE;

  if (fVZERO) {
    fV0ATotMult = fVZERO->GetMTotV0A();
    fV0CTotMult = fVZERO->GetMTotV0C();
  }

  return kTRUE;
}

//________________________________________________________________________
Bool_t AliJetTriggerSelectionTask::Run()
{
  // Run the analysis.

  if (!fTaskSettingsOk) return kFALSE;

  FindTriggers();
  SelectJets();
  
  return kTRUE;
}

//________________________________________________________________________
void AliJetTriggerSelectionTask::FindTriggers()
{
  fNTriggers = 0;

  Int_t nclusters = GetNClusters();

  Double_t th = fEnergyThreshold->Eval(fV0ATotMult+fV0CTotMult);

  for (Int_t i = 0; i < nclusters; i++) {
    if (fNTriggers >= 999) {
      AliError("More than 999 triggers found!");
      break;
    }

    AliVCluster *cluster = GetAcceptClusterFromArray(i);
    if (!cluster)
      continue;

    //Printf("Cluster energy=%.3f, th=%.3f",cluster->E(), th);

    if (cluster->E() > th) {
      TLorentzVector vect;
      cluster->GetMomentum(vect,fVertex);
      fTrigPos[fNTriggers][0] = vect.Eta();
      fTrigPos[fNTriggers][1] = vect.Phi();
      fNTriggers++;
    }
  }

  AliDebug(2,Form("%s: %d triggers found among %d candidates (cent=%.1f, mult=%.1f, th=%.2f)!",GetName(),fNTriggers,nclusters,fCent,fV0ATotMult+fV0CTotMult,th));
}

//________________________________________________________________________
void AliJetTriggerSelectionTask::SelectJets()
{
  for (Int_t c = 0; c < fJetCollArray.GetEntriesFast(); c++) {

    Int_t njets = GetNJets(c);

    for (Int_t i = 0; i < njets; i++) {
      AliEmcalJet *jet = GetAcceptJetFromArray(i,c);
      if (IsTriggerJet(jet)) jet->AddTrigger(fTriggerBits);
    }
  }
}

//________________________________________________________________________
Bool_t AliJetTriggerSelectionTask::IsTriggerJet(AliEmcalJet *jet)
{
  if (!jet) return kFALSE;

  for (Int_t i = 0; i < fNTriggers; i++) {
    Double_t deta = jet->Eta() - fTrigPos[i][0];
    Double_t dphi = jet->Phi() - fTrigPos[i][1];
    
    Double_t d2 = deta * deta + dphi * dphi;

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