ROOT logo
// $Id$
//
// Standalone jet finder
//   CINT-compatible wrapper for AliFJWrapper, can be used in macros and from the ROOT command line.
//   Compiled code can use AliFJWrapper directly
//
// Authors: R.Haake

#include "AliFJWrapper.h"
#include "AliEmcalJet.h"
#include "AliEmcalJetFinder.h"
#include "AliLog.h"
#include <vector>
#include "TH1.h"

//________________________________________________________________________
AliEmcalJetFinder::AliEmcalJetFinder() :
  TNamed("EmcalJetFinder","EmcalJetFinder"), fFastjetWrapper(0), fInputVectorIndex(0), fJetCount(0), fJetArray(), fGhostArea(0.005), fRadius(0.4), fJetAlgorithm(0), fRecombScheme(-1), fTrackMaxEta(0.9), fJetMaxEta(0.5), fJetMinPt(0), fJetMinArea(0)
{
  // Constructor
  fFastjetWrapper = new AliFJWrapper("FJWrapper", "FJWrapper");
}

//________________________________________________________________________
AliEmcalJetFinder::AliEmcalJetFinder(const char* name) :
  TNamed(name, name), fFastjetWrapper(0), fInputVectorIndex(0), fJetCount(0), fJetArray(), fGhostArea(0.005), fRadius(0.4), fJetAlgorithm(0), fRecombScheme(-1), fTrackMaxEta(0.9), fJetMaxEta(0.5), fJetMinPt(0), fJetMinArea(0)
{
  // Constructor
  fFastjetWrapper = new AliFJWrapper("FJWrapper", "FJWrapper");
}

//________________________________________________________________________
AliEmcalJetFinder::~AliEmcalJetFinder()
{
  if(fFastjetWrapper)
    delete fFastjetWrapper;
}


//________________________________________________________________________
Bool_t AliEmcalJetFinder::FindJets()
{
  // Tidy up and check input
  for (UInt_t i=0; i<fJetArray.size(); i++) {
    delete fJetArray[i];
    fJetArray[i] = 0;
  }
  fJetArray.clear();
  fJetCount = 0;
  if(!fInputVectorIndex)
  {
    AliError("No input vectors added to jet finder!");
    return kFALSE;
  }

  // Pass settings to fastjet
  fFastjetWrapper->SetAreaType(fastjet::active_area_explicit_ghosts);
  fFastjetWrapper->SetGhostArea(fGhostArea);
  fFastjetWrapper->SetR(fRadius);
  if(fJetAlgorithm == 0)
    fFastjetWrapper->SetAlgorithm(fastjet::antikt_algorithm);  
  if(fJetAlgorithm == 1)
    fFastjetWrapper->SetAlgorithm(fastjet::kt_algorithm);  
  if(fRecombScheme>=0)
    fFastjetWrapper->SetRecombScheme(static_cast<fastjet::RecombinationScheme>(fRecombScheme));

  fFastjetWrapper->SetMaxRap(fTrackMaxEta);

  // Run jet finding
  fFastjetWrapper->Run();

  // Save the found jets as light-weight objects
  std::vector<fastjet::PseudoJet> fastjets = fFastjetWrapper->GetInclusiveJets();
  fJetArray.resize(fastjets.size());

  for (UInt_t i=0; i<fastjets.size(); i++)
  {
    // Apply jet cuts
    if (fastjets[i].perp()<fJetMinPt) 
      continue;
    if (fFastjetWrapper->GetJetArea(i)<fJetMinArea)
      continue;
    if (TMath::Abs(fastjets[i].eta())>fJetMaxEta)
      continue;

    AliEmcalJet* jet = new AliEmcalJet(fastjets[i].perp(), fastjets[i].eta(), fastjets[i].phi(), fastjets[i].m());

    // Set the most important properties of the jet
    Int_t nConstituents(fFastjetWrapper->GetJetConstituents(i).size());
    jet->SetArea(fFastjetWrapper->GetJetArea(i));
    jet->SetNumberOfTracks(nConstituents);
    jet->SetNumberOfClusters(nConstituents);
    fJetArray[fJetCount] = jet;
    fJetCount++;
  }

  fJetArray.resize(fJetCount);

  //fastjets.clear(); // will be done by the destructor at the end of the function
  fFastjetWrapper->Clear();
  fInputVectorIndex = 0;
  return kTRUE;
}
    
//________________________________________________________________________
void AliEmcalJetFinder::AddInputVector(Double_t px, Double_t py, Double_t pz)
{
  fFastjetWrapper->AddInputVector(px, py, pz, TMath::Sqrt(px*px + py*py + pz*pz), fInputVectorIndex + 100);
  fInputVectorIndex++;
}

//________________________________________________________________________
void AliEmcalJetFinder::AddInputVector(Double_t px, Double_t py, Double_t pz, Double_t E)
{
  fFastjetWrapper->AddInputVector(px, py, pz, E, fInputVectorIndex + 100);
  fInputVectorIndex++;
}

//________________________________________________________________________
void AliEmcalJetFinder::FillPtHistogram(TH1* histogram)
{
  if(!histogram)
    return;
  for (std::size_t i=0; i<fJetArray.size(); i++)
  {
    histogram->Fill(fJetArray[i]->Pt());
  }
}

//________________________________________________________________________
void AliEmcalJetFinder::FillPhiHistogram(TH1* histogram)
{
  if(!histogram)
    return;
  for (std::size_t i=0; i<fJetArray.size(); i++)
  {
    histogram->Fill(fJetArray[i]->Phi());
  }
}

//________________________________________________________________________
void AliEmcalJetFinder::FillEtaHistogram(TH1* histogram)
{
  if(!histogram)
    return;
  for (std::size_t i=0; i<fJetArray.size(); i++)
  {
    histogram->Fill(fJetArray[i]->Eta());
  }
}
 AliEmcalJetFinder.cxx:1
 AliEmcalJetFinder.cxx:2
 AliEmcalJetFinder.cxx:3
 AliEmcalJetFinder.cxx:4
 AliEmcalJetFinder.cxx:5
 AliEmcalJetFinder.cxx:6
 AliEmcalJetFinder.cxx:7
 AliEmcalJetFinder.cxx:8
 AliEmcalJetFinder.cxx:9
 AliEmcalJetFinder.cxx:10
 AliEmcalJetFinder.cxx:11
 AliEmcalJetFinder.cxx:12
 AliEmcalJetFinder.cxx:13
 AliEmcalJetFinder.cxx:14
 AliEmcalJetFinder.cxx:15
 AliEmcalJetFinder.cxx:16
 AliEmcalJetFinder.cxx:17
 AliEmcalJetFinder.cxx:18
 AliEmcalJetFinder.cxx:19
 AliEmcalJetFinder.cxx:20
 AliEmcalJetFinder.cxx:21
 AliEmcalJetFinder.cxx:22
 AliEmcalJetFinder.cxx:23
 AliEmcalJetFinder.cxx:24
 AliEmcalJetFinder.cxx:25
 AliEmcalJetFinder.cxx:26
 AliEmcalJetFinder.cxx:27
 AliEmcalJetFinder.cxx:28
 AliEmcalJetFinder.cxx:29
 AliEmcalJetFinder.cxx:30
 AliEmcalJetFinder.cxx:31
 AliEmcalJetFinder.cxx:32
 AliEmcalJetFinder.cxx:33
 AliEmcalJetFinder.cxx:34
 AliEmcalJetFinder.cxx:35
 AliEmcalJetFinder.cxx:36
 AliEmcalJetFinder.cxx:37
 AliEmcalJetFinder.cxx:38
 AliEmcalJetFinder.cxx:39
 AliEmcalJetFinder.cxx:40
 AliEmcalJetFinder.cxx:41
 AliEmcalJetFinder.cxx:42
 AliEmcalJetFinder.cxx:43
 AliEmcalJetFinder.cxx:44
 AliEmcalJetFinder.cxx:45
 AliEmcalJetFinder.cxx:46
 AliEmcalJetFinder.cxx:47
 AliEmcalJetFinder.cxx:48
 AliEmcalJetFinder.cxx:49
 AliEmcalJetFinder.cxx:50
 AliEmcalJetFinder.cxx:51
 AliEmcalJetFinder.cxx:52
 AliEmcalJetFinder.cxx:53
 AliEmcalJetFinder.cxx:54
 AliEmcalJetFinder.cxx:55
 AliEmcalJetFinder.cxx:56
 AliEmcalJetFinder.cxx:57
 AliEmcalJetFinder.cxx:58
 AliEmcalJetFinder.cxx:59
 AliEmcalJetFinder.cxx:60
 AliEmcalJetFinder.cxx:61
 AliEmcalJetFinder.cxx:62
 AliEmcalJetFinder.cxx:63
 AliEmcalJetFinder.cxx:64
 AliEmcalJetFinder.cxx:65
 AliEmcalJetFinder.cxx:66
 AliEmcalJetFinder.cxx:67
 AliEmcalJetFinder.cxx:68
 AliEmcalJetFinder.cxx:69
 AliEmcalJetFinder.cxx:70
 AliEmcalJetFinder.cxx:71
 AliEmcalJetFinder.cxx:72
 AliEmcalJetFinder.cxx:73
 AliEmcalJetFinder.cxx:74
 AliEmcalJetFinder.cxx:75
 AliEmcalJetFinder.cxx:76
 AliEmcalJetFinder.cxx:77
 AliEmcalJetFinder.cxx:78
 AliEmcalJetFinder.cxx:79
 AliEmcalJetFinder.cxx:80
 AliEmcalJetFinder.cxx:81
 AliEmcalJetFinder.cxx:82
 AliEmcalJetFinder.cxx:83
 AliEmcalJetFinder.cxx:84
 AliEmcalJetFinder.cxx:85
 AliEmcalJetFinder.cxx:86
 AliEmcalJetFinder.cxx:87
 AliEmcalJetFinder.cxx:88
 AliEmcalJetFinder.cxx:89
 AliEmcalJetFinder.cxx:90
 AliEmcalJetFinder.cxx:91
 AliEmcalJetFinder.cxx:92
 AliEmcalJetFinder.cxx:93
 AliEmcalJetFinder.cxx:94
 AliEmcalJetFinder.cxx:95
 AliEmcalJetFinder.cxx:96
 AliEmcalJetFinder.cxx:97
 AliEmcalJetFinder.cxx:98
 AliEmcalJetFinder.cxx:99
 AliEmcalJetFinder.cxx:100
 AliEmcalJetFinder.cxx:101
 AliEmcalJetFinder.cxx:102
 AliEmcalJetFinder.cxx:103
 AliEmcalJetFinder.cxx:104
 AliEmcalJetFinder.cxx:105
 AliEmcalJetFinder.cxx:106
 AliEmcalJetFinder.cxx:107
 AliEmcalJetFinder.cxx:108
 AliEmcalJetFinder.cxx:109
 AliEmcalJetFinder.cxx:110
 AliEmcalJetFinder.cxx:111
 AliEmcalJetFinder.cxx:112
 AliEmcalJetFinder.cxx:113
 AliEmcalJetFinder.cxx:114
 AliEmcalJetFinder.cxx:115
 AliEmcalJetFinder.cxx:116
 AliEmcalJetFinder.cxx:117
 AliEmcalJetFinder.cxx:118
 AliEmcalJetFinder.cxx:119
 AliEmcalJetFinder.cxx:120
 AliEmcalJetFinder.cxx:121
 AliEmcalJetFinder.cxx:122
 AliEmcalJetFinder.cxx:123
 AliEmcalJetFinder.cxx:124
 AliEmcalJetFinder.cxx:125
 AliEmcalJetFinder.cxx:126
 AliEmcalJetFinder.cxx:127
 AliEmcalJetFinder.cxx:128
 AliEmcalJetFinder.cxx:129
 AliEmcalJetFinder.cxx:130
 AliEmcalJetFinder.cxx:131
 AliEmcalJetFinder.cxx:132
 AliEmcalJetFinder.cxx:133
 AliEmcalJetFinder.cxx:134
 AliEmcalJetFinder.cxx:135
 AliEmcalJetFinder.cxx:136
 AliEmcalJetFinder.cxx:137
 AliEmcalJetFinder.cxx:138
 AliEmcalJetFinder.cxx:139
 AliEmcalJetFinder.cxx:140
 AliEmcalJetFinder.cxx:141
 AliEmcalJetFinder.cxx:142
 AliEmcalJetFinder.cxx:143
 AliEmcalJetFinder.cxx:144
 AliEmcalJetFinder.cxx:145
 AliEmcalJetFinder.cxx:146
 AliEmcalJetFinder.cxx:147
 AliEmcalJetFinder.cxx:148
 AliEmcalJetFinder.cxx:149
 AliEmcalJetFinder.cxx:150