3 // Emcal jet finder task.
7 #include "AliEmcalJetTask.h"
9 #include <TClonesArray.h>
13 #include <TLorentzVector.h>
14 #include <TParticle.h>
15 #include "AliAnalysisManager.h"
16 #include "AliCentrality.h"
17 #include "AliFJWrapper.h"
18 #include "AliVCluster.h"
19 #include "AliVTrack.h"
20 #include "AliEmcalJet.h"
22 ClassImp(AliEmcalJetTask)
24 //________________________________________________________________________
25 AliEmcalJetTask::AliEmcalJetTask() :
26 AliAnalysisTaskSE("AliEmcalJetTask"),
27 fTracksName("Tracks"),
28 fCaloName("CaloClusters"),
37 // Default constructor.
40 //________________________________________________________________________
41 AliEmcalJetTask::AliEmcalJetTask(const char *name) :
42 AliAnalysisTaskSE(name),
43 fTracksName("Tracks"),
44 fCaloName("CaloClusters"),
53 // Standard constructor.
55 fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.";
58 //________________________________________________________________________
59 AliEmcalJetTask::~AliEmcalJetTask()
64 //________________________________________________________________________
65 void AliEmcalJetTask::UserCreateOutputObjects()
67 // Create user objects.
69 fJets = new TClonesArray("AliEmcalJet");
70 fJets->SetName(fJetsName);
73 //________________________________________________________________________
74 void AliEmcalJetTask::UserExec(Option_t *)
76 // Main loop, called for each event.
78 // add jets to event if not yet there
79 if (!(InputEvent()->FindListObject(fJetsName)))
80 InputEvent()->AddObject(fJets);
86 // get input collections
87 TClonesArray *tracks = 0;
88 TClonesArray *clus = 0;
89 TList *l = InputEvent()->GetList();
90 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
92 if ((fType==0)||(fType==1)) {
93 if (fTracksName == "Tracks")
94 am->LoadBranch("Tracks");
95 tracks = dynamic_cast<TClonesArray*>(l->FindObject(fTracksName));
97 AliError(Form("Pointer to tracks %s == 0", fTracksName.Data() ));
101 if ((fType==0)||(fType==2)) {
102 if (fCaloName == "CaloClusters")
103 am->LoadBranch("CaloClusters");
104 clus = dynamic_cast<TClonesArray*>(l->FindObject(fCaloName));
106 AliError(Form("Pointer to clus %s == 0", fCaloName.Data() ));
113 AliCentrality *centrality = InputEvent()->GetCentrality() ;
115 cent = centrality->GetCentralityPercentile("V0M");
117 cent=99; // probably pp data
119 AliError(Form("Centrality negative: %f", cent));
123 FindJets(tracks, clus, fAlgo, fRadius, cent);
126 //________________________________________________________________________
127 void AliEmcalJetTask::Terminate(Option_t *)
129 // Called once at the end of the analysis.
132 //________________________________________________________________________
133 void AliEmcalJetTask::FindJets(TObjArray *tracks, TObjArray *clus, Int_t algo, Double_t radius, Float_t /*cent*/)
137 if (!tracks && !clus)
141 fastjet::JetAlgorithm jalgo(fastjet::kt_algorithm);
144 jalgo = fastjet::antikt_algorithm;
147 AliFJWrapper fjw(name, name);
149 fjw.SetAlgorithm(jalgo);
154 const Int_t Ntracks = tracks->GetEntries();
155 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
156 AliVTrack *t = static_cast<AliVTrack*>(tracks->At(iTracks));
159 if (t->Pt()<fMinJetTrackPt)
161 fjw.AddInputVector(t->Px(), t->Py(), t->Pz(), t->P(), iTracks);
166 Double_t vertex[3] = {0, 0, 0};
167 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
168 const Int_t Nclus = clus->GetEntries();
169 for (Int_t iClus = 0; iClus < Nclus; ++iClus) {
170 AliVCluster *c = dynamic_cast<AliVCluster*>(clus->At(iClus));
175 TLorentzVector nPart;
176 c->GetMomentum(nPart, vertex);
177 Double_t et = nPart.Pt();
178 if (et<fMinJetClusPt)
180 fjw.AddInputVector(nPart.Px(), nPart.Py(), nPart.Pz(), nPart.P(), -iClus-1);
187 std::vector<fastjet::PseudoJet> jets_incl = fjw.GetInclusiveJets();
188 for(UInt_t ij=0, jetCount=0; ij<jets_incl.size(); ++ij) {
189 if (jets_incl[ij].perp()<1)
191 AliEmcalJet *jet = new ((*fJets)[jetCount])
192 AliEmcalJet(jets_incl[ij].perp(), jets_incl[ij].eta(), jets_incl[ij].phi(), jets_incl[ij].m());
193 jet->SetArea(fjw.GetJetArea(ij));
194 Double_t vertex[3] = {0, 0, 0};
195 InputEvent()->GetPrimaryVertex()->GetXYZ(vertex);
196 vector<fastjet::PseudoJet> constituents = fjw.GetJetConstituents(ij);
197 Double_t neutralE = 0;Double_t maxTrack = 0;Double_t maxCluster=0;
198 jet->SetNumberOfTracks(constituents.size());
199 jet->SetNumberOfClusters(constituents.size());
202 for(UInt_t ic=0; ic<constituents.size(); ++ic) {
203 Int_t uid = constituents[ic].user_index();
205 jet->AddTrackAt(uid, nt);
206 AliVTrack *t = static_cast<AliVTrack*>(tracks->At(uid));
208 if (t->Pt()>maxTrack)
213 jet->AddClusterAt(-(uid+1),nc);
214 AliVCluster *c = static_cast<AliVCluster*>(clus->At(-(uid+1)));
217 c->GetMomentum(nP, vertex);
219 if (nP.Pt()>maxCluster)
225 jet->SetNumberOfTracks(nt);
226 jet->SetNumberOfClusters(nc);
227 jet->SetMaxTrackPt(maxTrack);
228 jet->SetMaxClusterPt(maxCluster);
229 jet->SetNEF(neutralE/jet->E());