ROOT logo
#ifndef ALIEMCALJETTASK_H
#define ALIEMCALJETTASK_H

class TClonesArray;
class TObjArray;
class AliVEvent;
class AliEMCALGeometry;
class AliEmcalJetUtility;
class AliFJWrapper;

namespace fastjet {
  class PseudoJet;
}

#include "AliLog.h"
#include "AliAnalysisTaskSE.h"
#include "AliFJWrapper.h"
#include "AliAODMCParticle.h"
#include "AliEmcalJet.h"

class AliEmcalJetTask : public AliAnalysisTaskSE {
 public:

  enum JetType {
    kNone=0,
    kKT=1<<0,
    kAKT=1<<1,
    kFullJet=1<<2,
    kChargedJet=1<<3,
    kNeutralJet=1<<4,
    kR020Jet=1<<5,
    kR030Jet=1<<6,
    kR040Jet=1<<7,
    kRX1Jet=1<<8,  // user defined radii, use SetRadius(Double_t)
    kRX2Jet=1<<9,
    kRX3Jet=1<<10
  };

  AliEmcalJetTask();
  AliEmcalJetTask(const char *name);
  virtual ~AliEmcalJetTask();

  void UserCreateOutputObjects();
  void UserExec(Option_t* option);
  void Terminate(Option_t* /*option*/) {;}

  void                   SetAlgo(Int_t a)                           { if (IsLocked()) return; if (a==0) fJetType |= kKT; else fJetType |= kAKT; }  // for backward compatibility only
  void                   SetClusName(const char *n)                 { if (IsLocked()) return; fCaloName         = n     ; }
  void                   SetClusLabelRange(Int_t min, Int_t max)    { if (IsLocked()) return; fMinLabelClusters = min   ; fMaxLabelClusters = max; }
  void                   SetEtaRange(Double_t emi, Double_t ema)    { if (IsLocked()) return; fEtaMin           = emi   ; fEtaMax = ema   ; }
  void                   SetGhostArea(Double_t gharea)              { if (IsLocked()) return; fGhostArea        = gharea; }
  void                   SetJetsName(const char *n)                 { if (IsLocked()) return; fJetsName         = n     ; }
  void                   SetJetEtaRange(Double_t emi, Double_t ema) { if (IsLocked()) return; fJetEtaMin        = emi   ; fJetEtaMax = ema; }
  void                   SetJetPhiRange(Double_t pmi, Double_t pma) { if (IsLocked()) return; fJetPhiMin        = pmi   ; fJetPhiMax = pma; }
  void                   SetJetType(UInt_t t)                       { if (IsLocked()) return; fJetType          = t     ; }
  void                   SetLocked()                                { fLocked = kTRUE;}
  void                   SetMinJetArea(Double_t a)                  { if (IsLocked()) return; fMinJetArea       = a     ; }
  void                   SetMinJetClusPt(Double_t min)              { if (IsLocked()) return; fMinJetClusPt     = min   ; }
  void                   SetMinJetPt(Double_t j)                    { if (IsLocked()) return; fMinJetPt         = j     ; }
  void                   SetMinJetTrackPt(Double_t min)             { if (IsLocked()) return; fMinJetTrackPt    = min   ; }
  void                   SetMinMCLabel(Int_t s)                     { if (IsLocked()) return; fMinMCLabel       = s     ; }
  void                   SetPhiRange(Double_t pmi, Double_t pma)    { if (IsLocked()) return; fPhiMin           = pmi   ; fPhiMax = pma; }
  void                   SetRecombScheme(Int_t scheme)              { if (IsLocked()) return; fRecombScheme     = scheme; }
  void                   SetTracksName(const char *n)               { if (IsLocked()) return; fTracksName       = n     ; }
  void                   SetTrackEfficiency(Double_t t)             { if (IsLocked()) return; fTrackEfficiency  = t     ; }
  void                   SetTrackLabelRange(Int_t min, Int_t max)   { if (IsLocked()) return; fMinLabelTracks   = min   ; fMaxLabelTracks = max; }
  void                   SetLegacyMode(Bool_t mode)                 { if (IsLocked()) return; fLegacyMode       = mode  ; }
  void                   SetMCFlag(UInt_t m)                        { if (IsLocked()) return; fMCFlag           = m     ; }
  void                   SelectHIJING(Bool_t s)                     { if (IsLocked()) return; if (s) fGeneratorIndex = 0; else fGeneratorIndex = -1; }
  void                   SetGeneratorIndex(Short_t i)               { if (IsLocked()) return; fGeneratorIndex   = i     ; }

  AliEmcalJetUtility*    AddUtility(AliEmcalJetUtility* utility);

  const char*            GetClusName()                    { return fCaloName.Data()   ; }
  Double_t               GetEtaMin()                      { return fEtaMin            ; }
  Double_t               GetEtaMax()                      { return fEtaMax            ; }
  Double_t               GetGhostArea()                   { return fGhostArea         ; }
  const char*            GetJetsName()                    { return fJetsName.Data()   ; }
  Double_t               GetJetEtaMin()                   { return fJetEtaMin         ; }
  Double_t               GetJetEtaMax()                   { return fJetEtaMax         ; }
  Double_t               GetJetPhiMin()                   { return fJetPhiMin         ; }
  Double_t               GetJetPhiMax()                   { return fJetPhiMax         ; }
  UInt_t                 GetJetType()                     { return fJetType           ; }
  Bool_t                 GetLegacyMode()                  { return fLegacyMode        ; }
  Double_t               GetMinJetArea()                  { return fMinJetArea        ; }
  Double_t               GetMinJetClusPt()                { return fMinJetClusPt      ; }
  Double_t               GetMinJetPt()                    { return fMinJetPt          ; }
  Double_t               GetMinJetTrackPt()               { return fMinJetTrackPt     ; }
  Int_t                  GetMinMCLabel()                  { return fMinMCLabel        ; }
  Double_t               GetPhiMin()                      { return fPhiMin            ; }
  Double_t               GetPhiMax()                      { return fPhiMax            ; }
  Double_t               GetRadius()                      { return fRadius            ; }
  Int_t                  GetRecombScheme()                { return fRecombScheme      ; }
  const char*            GetTracksName()                  { return fTracksName.Data() ; }
  Double_t               GetTrackEfficiency()             { return fTrackEfficiency   ; }

  AliVEvent*             GetEvent()                       { return fEvent             ; }
  TClonesArray*          GetClusters()                    { return fClus              ; }
  TClonesArray*          GetTracks()                      { return fTracks            ; }
  TClonesArray*          GetJets()                        { return fJets              ; }
  TObjArray*             GetUtilities()                   { return fUtilities         ; }

  void                   FillJetConstituents(AliEmcalJet *jet, std::vector<fastjet::PseudoJet>& constituents, TClonesArray *tracks, TClonesArray *clusters,
                                             std::vector<fastjet::PseudoJet>& constituents_sub, Int_t flag = 0, TClonesArray *particles_sub = 0);

  Int_t                  GetIndexSub(Double_t phi_sub, std::vector<fastjet::PseudoJet>& constituents_unsub);

  Bool_t IsLocked() 
  {
    if (fLocked) {
      AliFatal("Jet finder task is locked! Changing properties is not allowed."); 
      return kTRUE;
    } 
    else {
      return kFALSE;
    }
  }

  void SelectCollisionCandidates(UInt_t offlineTriggerMask = AliVEvent::kMB)
  {
    if(!fIsPSelSet)
    {
      fIsPSelSet = kTRUE;
      fOfflineTriggerMask = offlineTriggerMask;
    }
    else
    {
      AliWarning("Manually setting the event selection for jet finders is not allowed! Using trigger=old_trigger | your_trigger");  
      fOfflineTriggerMask = fOfflineTriggerMask | offlineTriggerMask;
    }
  }

  void SetRadius(Double_t r)            
  { 
    if (IsLocked()) return; 
    fRadius = r; 
    if ((fJetType & (kRX1Jet|kRX2Jet|kRX3Jet)) == 0) 
      AliWarning("Radius value will be ignored if jet type is not set to a user defined radius (kRX1Jet,kRX2Jet,kRX3Jet)."); 
  }

  void SetType(Int_t t)                 
  { 
    if(IsLocked()) return; 
    if (t==0) fJetType |= kFullJet; 
    else if (t==1) fJetType |= kChargedJet; 
    else if (t==2) fJetType |= kNeutralJet; 
  } // for backward compatibility only

  void SelectPhysicalPrimaries(Bool_t s)    
  { 
    if(IsLocked()) return; 
    if (s) fMCFlag |=  AliAODMCParticle::kPhysicalPrim; 
    else   fMCFlag &= ~AliAODMCParticle::kPhysicalPrim; 
  }

 protected:

  void                   FindJets();
  void                   FillJetBranch();
  Bool_t                 DoInit();
  void                   InitUtilities();
  void                   PrepareUtilities();
  void                   ExecuteUtilities(AliEmcalJet* jet, Int_t ij);
  void                   TerminateUtilities();
  Bool_t                 GetSortedArray(Int_t indexes[], std::vector<fastjet::PseudoJet> array) const;

  TString                fTracksName;             // name of track collection
  TString                fCaloName;               // name of calo cluster collection
  TString                fJetsName;               // name of jet collection
  UInt_t                 fJetType;                // jet type (algorithm, radius, constituents)
  Int_t                  fMinLabelTracks;         // select track constituents with a minimum label index (track->GetLabel())
  Int_t                  fMaxLabelTracks;         // select track constituents with a maximum label index (track->GetLabel())
  Int_t                  fMinLabelClusters;       // select cluster constituents with a minimum label index (cluster->GetLabel())
  Int_t                  fMaxLabelClusters;       // select cluster constituents with a maximum label index (cluster->GetLabel())
  Int_t                  fMinMCLabel;             // minimum MC label value for the tracks/clusters being considered MC particles
  Double_t               fRadius;                 // jet radius
  Double_t               fMinJetTrackPt;          // min jet track momentum (applied before clustering)
  Double_t               fMinJetClusPt;           // min jet cluster momentum (applied before clustering)
  Double_t               fPhiMin;                 // minimum phi for constituents (applied before clustering)
  Double_t               fPhiMax;                 // maximum phi for constituents (applied before clustering)
  Double_t               fEtaMin;                 // minimum eta for constituents (applied before clustering)
  Double_t               fEtaMax;                 // maximum eta for constituents (applied before clustering)
  Double_t               fMinJetArea;             // min area to keep jet in output
  Double_t               fMinJetPt;               // min jet pt to keep jet in output
  Double_t               fJetPhiMin;              // minimum phi to keep jet in output
  Double_t               fJetPhiMax;              // maximum phi to keep jet in output
  Double_t               fJetEtaMin;              // minimum eta to keep jet in output
  Double_t               fJetEtaMax;              // maximum eta to keep jet in output
  Double_t               fGhostArea;              // ghost area
  Int_t                  fRecombScheme;           // recombination scheme used by fastjet
  Double_t               fTrackEfficiency;        // artificial tracking inefficiency (0...1)
  UInt_t                 fMCFlag;                 // select MC particles with flags (e.g. to select physical primaries)
  Short_t                fGeneratorIndex;         // select MC particles with generator index (default = -1 to switch off selection)
  TObjArray             *fUtilities;              // jet utilities (gen subtractor, constituent subtractor etc.)
  Bool_t                 fLocked;                 // true if lock is set
 
  Bool_t                 fIsInit;                 //!=true if already initialized
  Bool_t                 fIsPSelSet;              //!=true if physics selection was set
  Bool_t                 fIsEmcPart;              //!=true if emcal particles are given as input (for clusters)
  Bool_t                 fLegacyMode;             //!=true to enable FJ 2.x behavior

  Double_t               fVertex[3];              //!vertex of the current event
  AliEMCALGeometry      *fGeom;                   //!emcal geometry object
  TClonesArray          *fJets;                   //!jet collection
  AliVEvent             *fEvent;                  //!current event
  TClonesArray          *fTracks;                 //!tracks collection
  TClonesArray          *fClus;                   //!cluster collection
  AliFJWrapper           fFastJetWrapper;         //!fastjet wrapper

 private:
  AliEmcalJetTask(const AliEmcalJetTask&);            // not implemented
  AliEmcalJetTask &operator=(const AliEmcalJetTask&); // not implemented

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