1 // **************************************
2 // Task used for the correction of determiantion of reconstructed jet spectra
3 // Compares input (gen) and output (rec) jets
4 // *******************************************
7 /**************************************************************************
8 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
10 * Author: The ALICE Off-line Project. *
11 * Contributors are mentioned in the code where appropriate. *
13 * Permission to use, copy, modify and distribute this software and its *
14 * documentation strictly for non-commercial purposes is hereby granted *
15 * without fee, provided that the above copyright notice appears in all *
16 * copies and that both the copyright notice and this permission notice *
17 * appear in the supporting documentation. The authors make no claims *
18 * about the suitability of this software for any purpose. It is *
19 * provided "as is" without express or implied warranty. *
20 **************************************************************************/
26 #include <TInterpreter.h>
36 #include <TLorentzVector.h>
37 #include <TClonesArray.h>
38 #include "TDatabasePDG.h"
40 #include "AliAnalysisTaskJetCluster.h"
41 #include "AliAnalysisManager.h"
42 #include "AliJetFinder.h"
43 #include "AliJetHeader.h"
44 #include "AliJetReader.h"
45 #include "AliJetReaderHeader.h"
46 #include "AliUA1JetHeaderV1.h"
47 #include "AliESDEvent.h"
48 #include "AliAODEvent.h"
49 #include "AliAODHandler.h"
50 #include "AliAODTrack.h"
51 #include "AliAODJet.h"
52 #include "AliAODMCParticle.h"
53 #include "AliMCEventHandler.h"
54 #include "AliMCEvent.h"
56 #include "AliGenPythiaEventHeader.h"
57 #include "AliJetKineReaderHeader.h"
58 #include "AliGenCocktailEventHeader.h"
59 #include "AliInputEventHandler.h"
62 #include "fastjet/PseudoJet.hh"
63 #include "fastjet/ClusterSequenceArea.hh"
64 #include "fastjet/AreaDefinition.hh"
65 #include "fastjet/JetDefinition.hh"
66 // get info on how fastjet was configured
67 #include "fastjet/config.h"
70 ClassImp(AliAnalysisTaskJetCluster)
72 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(): AliAnalysisTaskSE(),
74 fUseAODTrackInput(kFALSE),
75 fUseAODMCInput(kFALSE),
76 fUseGlobalSelection(kFALSE),
78 fTrackTypeRec(kTrackUndef),
79 fTrackTypeGen(kTrackUndef),
84 fAlgorithm(fastjet::kt_algorithm),
85 fStrategy(fastjet::Best),
86 fRecombScheme(fastjet::BIpt_scheme),
87 fAreaType(fastjet::active_area),
95 fh1NConstLeadingRec(0x0),
97 fh1PtJetsLeadingRecIn(0x0),
98 fh1PtJetConstRec(0x0),
99 fh1PtJetConstLeadingRec(0x0),
100 fh1PtTracksRecIn(0x0),
101 fh1PtTracksLeadingRecIn(0x0),
103 fh1NConstRecRan(0x0),
104 fh1PtJetsLeadingRecInRan(0x0),
105 fh1NConstLeadingRecRan(0x0),
106 fh1PtJetsRecInRan(0x0),
107 fh1PtTracksGenIn(0x0),
110 fh2NRecTracksPt(0x0),
112 fh2NConstLeadingPt(0x0),
114 fh2LeadingJetPhiEta(0x0),
116 fh2LeadingJetEtaPt(0x0),
118 fh2LeadingTrackEtaPt(0x0),
119 fh2JetsLeadingPhiEta(0x0),
120 fh2JetsLeadingPhiPt(0x0),
121 fh2TracksLeadingPhiEta(0x0),
122 fh2TracksLeadingPhiPt(0x0),
123 fh2TracksLeadingJetPhiPt(0x0),
124 fh2JetsLeadingPhiPtW(0x0),
125 fh2TracksLeadingPhiPtW(0x0),
126 fh2TracksLeadingJetPhiPtW(0x0),
127 fh2NRecJetsPtRan(0x0),
129 fh2NConstLeadingPtRan(0x0),
134 fh2TracksLeadingJetPhiPtRan(0x0),
135 fh2TracksLeadingJetPhiPtWRan(0x0),
141 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
142 AliAnalysisTaskSE(name),
144 fUseAODTrackInput(kFALSE),
145 fUseAODMCInput(kFALSE),
146 fUseGlobalSelection(kFALSE),
148 fTrackTypeRec(kTrackUndef),
149 fTrackTypeGen(kTrackUndef),
154 fAlgorithm(fastjet::kt_algorithm),
155 fStrategy(fastjet::Best),
156 fRecombScheme(fastjet::BIpt_scheme),
157 fAreaType(fastjet::active_area),
162 fh1PtHardTrials(0x0),
165 fh1NConstLeadingRec(0x0),
167 fh1PtJetsLeadingRecIn(0x0),
168 fh1PtJetConstRec(0x0),
169 fh1PtJetConstLeadingRec(0x0),
170 fh1PtTracksRecIn(0x0),
171 fh1PtTracksLeadingRecIn(0x0),
173 fh1NConstRecRan(0x0),
174 fh1PtJetsLeadingRecInRan(0x0),
175 fh1NConstLeadingRecRan(0x0),
176 fh1PtJetsRecInRan(0x0),
177 fh1PtTracksGenIn(0x0),
180 fh2NRecTracksPt(0x0),
182 fh2NConstLeadingPt(0x0),
184 fh2LeadingJetPhiEta(0x0),
186 fh2LeadingJetEtaPt(0x0),
188 fh2LeadingTrackEtaPt(0x0),
189 fh2JetsLeadingPhiEta(0x0),
190 fh2JetsLeadingPhiPt(0x0),
191 fh2TracksLeadingPhiEta(0x0),
192 fh2TracksLeadingPhiPt(0x0),
193 fh2TracksLeadingJetPhiPt(0x0),
194 fh2JetsLeadingPhiPtW(0x0),
195 fh2TracksLeadingPhiPtW(0x0),
196 fh2TracksLeadingJetPhiPtW(0x0),
197 fh2NRecJetsPtRan(0x0),
199 fh2NConstLeadingPtRan(0x0),
204 fh2TracksLeadingJetPhiPtRan(0x0),
205 fh2TracksLeadingJetPhiPtWRan(0x0),
208 DefineOutput(1, TList::Class());
213 Bool_t AliAnalysisTaskJetCluster::Notify()
216 // Implemented Notify() to read the cross sections
217 // and number of trials from pyxsec.root
222 void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
226 // Create the output container
233 if (fDebug > 1) printf("AnalysisTaskJetCluster::UserCreateOutputObjects() \n");
236 if(!fHistList)fHistList = new TList();
238 Bool_t oldStatus = TH1::AddDirectoryStatus();
239 TH1::AddDirectory(kFALSE);
244 const Int_t nBinPt = 200;
245 Double_t binLimitsPt[nBinPt+1];
246 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
248 binLimitsPt[iPt] = 0.0;
251 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 0.5;
255 const Int_t nBinPhi = 90;
256 Double_t binLimitsPhi[nBinPhi+1];
257 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
259 binLimitsPhi[iPhi] = -1.*TMath::Pi();
262 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
268 const Int_t nBinEta = 40;
269 Double_t binLimitsEta[nBinEta+1];
270 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
272 binLimitsEta[iEta] = -2.0;
275 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
279 const int nChMax = 100;
281 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
282 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
284 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
285 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
288 fh1NJetsRec = new TH1F("fh1NJetsRec","N reconstructed jets",120,-0.5,119.5);
289 fh1NJetsRecRan = new TH1F("fh1NJetsRecRan","N reconstructed jets",120,-0.5,119.5);
291 fh1NConstRec = new TH1F("fh1NConstRec","# jet constituents",120,-0.5,119.5);
292 fh1NConstRecRan = new TH1F("fh1NConstRecRan","# jet constituents",120,-0.5,119.5);
293 fh1NConstLeadingRec = new TH1F("fh1NConstLeadingRec","jet constituents",120,-0.5,119.5);
294 fh1NConstLeadingRecRan = new TH1F("fh1NConstLeadingRecRan","jet constituents",120,-0.5,119.5);
297 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
298 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
299 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
301 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
302 fh1PtJetsRecInRan = new TH1F("fh1PtJetsRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
303 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
304 fh1PtJetsLeadingRecInRan = new TH1F("fh1PtJetsLeadingRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
305 fh1PtJetConstRec = new TH1F("fh1PtJetsConstRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
306 fh1PtJetConstLeadingRec = new TH1F("fh1PtJetsConstLeadingRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
307 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
308 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
309 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
310 fh1Nch = new TH1F("fh1Nch","charged multiplicity; N_{ch}",nChMax,-0.5,nChMax-0.5);
312 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
313 fh2NRecJetsPtRan = new TH2F("fh2NRecJetsPtRan","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
314 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
318 fh2NConstPt = new TH2F("fh2NConstPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
319 fh2NConstLeadingPt = new TH2F("fh2NConstLeadingPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
320 fh2NConstPtRan = new TH2F("fh2NConstPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
321 fh2NConstLeadingPtRan = new TH2F("fh2NConstLeadingPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
323 fh2PtNch = new TH2F("fh2PtNch","p_T of cluster vs. multiplicity; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
324 fh2PtNchRan = new TH2F("fh2PtNchRan","p_T of cluster vs. multiplicity ran; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
325 fh2PtNchN = new TH2F("fh2PtNchN","p_T of cluster vs. multiplicity N weighted; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
326 fh2PtNchNRan = new TH2F("fh2PtNchNRan","p_T of cluster vs. multiplicity N weighted ran; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
330 fh2JetPhiEta = new TH2F("fh2JetPhiEta","eta vs phi all jets;#phi;#eta",
331 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
332 fh2LeadingJetPhiEta = new TH2F("fh2LeadingJetPhiEta","eta vs phi leading jets;#phi;#eta",
333 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
335 fh2JetEtaPt = new TH2F("fh2JetEtaPt","pt vs eta all jets;#eta;p_{T}",
336 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
337 fh2LeadingJetEtaPt = new TH2F("fh2LeadingJetEtaPt","pT vs eta leading jets;#eta;p_{T}",
338 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
340 fh2TrackEtaPt = new TH2F("fh2TrackEtaPt","pt vs eta all jets;#eta;p_{T}",
341 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
342 fh2LeadingTrackEtaPt = new TH2F("fh2LeadingTrackEtaPt","pT vs eta leading jets;#eta;p_{T}",
343 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
347 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
348 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
349 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
350 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
351 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
352 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
353 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
354 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
355 fh2TracksLeadingJetPhiPt = new TH2F("fh2TracksLeadingJetPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
356 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
357 fh2TracksLeadingJetPhiPtRan = new TH2F("fh2TracksLeadingJetPhiPtRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
358 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
360 fh2JetsLeadingPhiPtW = new TH2F("fh2JetsLeadingPhiPtW","leading p_T vs delta phi p_T weigted to leading jet;#Delta#phi;p_{T} (GeV/c)",
361 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
362 fh2TracksLeadingPhiPtW = new TH2F("fh2TracksLeadingPhiPtW","leading p_T vs delta phi to leading jet (p_T weighted);#Delta#phi;p_{T} (GeV/c)",
363 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
365 fh2TracksLeadingJetPhiPtW = new TH2F("fh2TracksLeadingJetPhiPtW","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
366 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
367 fh2TracksLeadingJetPhiPtWRan = new TH2F("fh2TracksLeadingJetPhiPtWRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
368 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
372 const Int_t saveLevel = 3; // large save level more histos
374 fHistList->Add(fh1Xsec);
375 fHistList->Add(fh1Trials);
377 fHistList->Add(fh1NJetsRec);
378 fHistList->Add(fh1NConstRec);
379 fHistList->Add(fh1NConstLeadingRec);
380 fHistList->Add(fh1PtJetsRecIn);
381 fHistList->Add(fh1PtJetsLeadingRecIn);
382 fHistList->Add(fh1PtTracksRecIn);
383 fHistList->Add(fh1PtTracksLeadingRecIn);
384 fHistList->Add(fh1PtJetConstRec);
385 fHistList->Add(fh1PtJetConstLeadingRec);
386 fHistList->Add(fh1NJetsRecRan);
387 fHistList->Add(fh1NConstRecRan);
388 fHistList->Add(fh1PtJetsLeadingRecInRan);
389 fHistList->Add(fh1NConstLeadingRecRan);
390 fHistList->Add(fh1PtJetsRecInRan);
391 fHistList->Add(fh1Nch);
392 fHistList->Add(fh2NRecJetsPt);
393 fHistList->Add(fh2NRecTracksPt);
394 fHistList->Add(fh2NConstPt);
395 fHistList->Add(fh2NConstLeadingPt);
396 fHistList->Add(fh2PtNch);
397 fHistList->Add(fh2PtNchRan);
398 fHistList->Add(fh2PtNchN);
399 fHistList->Add(fh2PtNchNRan);
400 fHistList->Add(fh2JetPhiEta);
401 fHistList->Add(fh2LeadingJetPhiEta);
402 fHistList->Add(fh2JetEtaPt);
403 fHistList->Add(fh2LeadingJetEtaPt);
404 fHistList->Add(fh2TrackEtaPt);
405 fHistList->Add(fh2LeadingTrackEtaPt);
406 fHistList->Add(fh2JetsLeadingPhiEta );
407 fHistList->Add(fh2JetsLeadingPhiPt);
408 fHistList->Add(fh2TracksLeadingPhiEta);
409 fHistList->Add(fh2TracksLeadingPhiPt);
410 fHistList->Add(fh2TracksLeadingJetPhiPt);
411 fHistList->Add(fh2JetsLeadingPhiPtW);
412 fHistList->Add(fh2TracksLeadingPhiPtW);
413 fHistList->Add(fh2TracksLeadingJetPhiPtW);
414 fHistList->Add(fh2NRecJetsPtRan);
415 fHistList->Add(fh2NConstPtRan);
416 fHistList->Add(fh2NConstLeadingPtRan);
417 fHistList->Add(fh2TracksLeadingJetPhiPtRan);
418 fHistList->Add(fh2TracksLeadingJetPhiPtWRan);
421 // =========== Switch on Sumw2 for all histos ===========
422 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
423 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
428 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
431 TH1::AddDirectory(oldStatus);
434 void AliAnalysisTaskJetCluster::Init()
440 if (fDebug > 1) printf("AnalysisTaskJetCluster::Init() \n");
444 void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
447 if(fUseGlobalSelection){
448 // no selection by the service task, we continue
449 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
450 PostData(1, fHistList);
455 // Execute analysis for current event
457 AliESDEvent *fESD = 0;
458 if(fUseAODTrackInput){
459 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
461 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODTrackInput);
467 // assume that the AOD is in the general output...
470 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
474 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
478 Bool_t selectEvent = false;
479 Bool_t physicsSelection = true; // fInputHandler->IsEventSelected();
482 const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
483 if(vtxAOD->GetNContributors()>0){
484 Float_t zvtx = vtxAOD->GetZ();
485 Float_t yvtx = vtxAOD->GetY();
486 Float_t xvtx = vtxAOD->GetX();
487 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
488 if(TMath::Abs(zvtx)<8.&&r2<1.){
489 if(physicsSelection)selectEvent = true;
494 PostData(1, fHistList);
498 fh1Trials->Fill("#sum{ntrials}",1);
501 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
503 // ==== General variables needed
507 // we simply fetch the tracks/mc particles as a list of AliVParticles
512 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
513 Float_t nCh = recParticles.GetEntries();
515 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
516 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
517 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
521 vector<fastjet::PseudoJet> inputParticlesRec;
522 vector<fastjet::PseudoJet> inputParticlesRecRan;
523 for(int i = 0; i < recParticles.GetEntries(); i++){
524 AliVParticle *vp = (AliVParticle*)recParticles.At(i);
525 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
526 // we talk total momentum here
527 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
528 jInp.set_user_index(i);
529 inputParticlesRec.push_back(jInp);
531 // the randomized input changes eta and phi, but keeps the p_T
532 Double_t pT = vp->Pt();
533 Double_t eta = 1.8 * gRandom->Rndm() - 0.9;
534 Double_t phi = 2.* TMath::Pi() * gRandom->Rndm();
537 Double_t theta = 2.*TMath::ATan(TMath::Exp(-2.*eta));
538 Double_t pZ = pT/TMath::Tan(theta);
540 Double_t pX = pT * TMath::Cos(phi);
541 Double_t pY = pT * TMath::Sin(phi);
542 Double_t p = TMath::Sqrt(pT*pT+pZ*pZ);
544 fastjet::PseudoJet jInpRan(pX,pY,pZ,p);
545 jInpRan.set_user_index(i);
546 inputParticlesRecRan.push_back(jInpRan);
550 if(inputParticlesRec.size()==0){
551 if(fDebug)Printf("%s:%d No input particles found, skipping event",(char*)__FILE__,__LINE__);
552 PostData(1, fHistList);
557 fastjet::JetDefinition jetDef(fAlgorithm, fRparam, fRecombScheme, fStrategy);
558 vector <fastjet::PseudoJet> inclusiveJets, sortedJets;
559 fastjet::ClusterSequence clustSeq(inputParticlesRec, jetDef);
561 inclusiveJets = clustSeq.inclusive_jets();
562 sortedJets = sorted_by_pt(inclusiveJets);
564 fh1NJetsRec->Fill(sortedJets.size());
566 // loop over all jets an fill information, first on is the leading jet
568 Int_t nRecOver = inclusiveJets.size();
569 Int_t nRec = inclusiveJets.size();
570 if(inclusiveJets.size()>0){
571 AliAODJet leadingJet (sortedJets[0].px(), sortedJets[0].py(), sortedJets[0].pz(), sortedJets[0].E());
572 Float_t pt = leadingJet.Pt();
575 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
576 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
577 while(pt<ptCut&&iCount<nRec){
581 pt = sortedJets[iCount].perp();
584 if(nRecOver<=0)break;
585 fh2NRecJetsPt->Fill(ptCut,nRecOver);
587 Float_t phi = leadingJet.Phi();
588 if(phi<0)phi+=TMath::Pi()*2.;
589 Float_t eta = leadingJet.Eta();
590 pt = leadingJet.Pt();
592 // correlation of leading jet with tracks
593 TIterator *recIter = recParticles.MakeIterator();
594 AliVParticle *tmpRecTrack = (AliVParticle*)(recIter->Next());
597 while((tmpRecTrack = (AliVParticle*)(recIter->Next()))){
598 Float_t tmpPt = tmpRecTrack->Pt();
600 Float_t tmpPhi = tmpRecTrack->Phi();
601 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
602 Float_t dPhi = phi - tmpPhi;
603 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
604 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
605 // Float_t dEta = eta - tmpRecTrack->Eta();
606 fh2TracksLeadingJetPhiPt->Fill(dPhi,pt);
607 fh2TracksLeadingJetPhiPtW->Fill(dPhi,pt,tmpPt);
612 for(int j = 0; j < nRec;j++){
613 AliAODJet tmpRec (sortedJets[j].px(), sortedJets[j].py(), sortedJets[j].pz(), sortedJets[j].E());
614 Float_t tmpPt = tmpRec.Pt();
615 fh1PtJetsRecIn->Fill(tmpPt);
616 // Fill Spectra with constituents
617 vector<fastjet::PseudoJet> constituents = clustSeq.constituents(sortedJets[j]);
618 fh1NConstRec->Fill(constituents.size());
619 fh2PtNch->Fill(nCh,tmpPt);
620 fh2PtNchN->Fill(nCh,tmpPt,constituents.size());
621 fh2NConstPt->Fill(tmpPt,constituents.size());
622 // loop over constiutents and fill spectrum
623 for(unsigned int ic = 0; ic < constituents.size();ic++){
624 AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
625 fh1PtJetConstRec->Fill(part->Pt());
626 if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
630 Float_t tmpPhi = tmpRec.Phi();
631 Float_t tmpEta = tmpRec.Eta();
632 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
635 fh1PtJetsLeadingRecIn->Fill(tmpPt);
636 fh2LeadingJetPhiEta->Fill(tmpPhi,tmpEta);
637 fh2LeadingJetEtaPt->Fill(tmpEta,tmpPt);
638 fh1NConstLeadingRec->Fill(constituents.size());
639 fh2NConstLeadingPt->Fill(tmpPt,constituents.size());
642 fh2JetPhiEta->Fill(tmpRec.Phi(),tmpEta);
643 fh2JetEtaPt->Fill(tmpEta,tmpPt);
644 Float_t dPhi = phi - tmpPhi;
645 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
646 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
647 Float_t dEta = eta - tmpRec.Eta();
648 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
649 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
650 fh2JetsLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
656 // fill track information
657 Int_t nTrackOver = recParticles.GetSize();
658 // do the same for tracks and jets
660 TIterator *recIter = recParticles.MakeIterator();
661 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
662 Float_t pt = tmpRec->Pt();
663 // Printf("Leading track p_t %3.3E",pt);
664 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
665 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
666 while(pt<ptCut&&tmpRec){
668 tmpRec = (AliVParticle*)(recIter->Next());
673 if(nTrackOver<=0)break;
674 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
678 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
679 Float_t phi = leading->Phi();
680 if(phi<0)phi+=TMath::Pi()*2.;
681 Float_t eta = leading->Eta();
683 while((tmpRec = (AliVParticle*)(recIter->Next()))){
684 Float_t tmpPt = tmpRec->Pt();
685 Float_t tmpEta = tmpRec->Eta();
686 fh1PtTracksRecIn->Fill(tmpPt);
687 fh2TrackEtaPt->Fill(tmpEta,tmpPt);
689 fh1PtTracksLeadingRecIn->Fill(tmpPt);
690 fh2LeadingTrackEtaPt->Fill(tmpEta,tmpPt);
694 Float_t tmpPhi = tmpRec->Phi();
696 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
697 Float_t dPhi = phi - tmpPhi;
698 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
699 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
700 Float_t dEta = eta - tmpRec->Eta();
701 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
702 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
703 fh2TracksLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
708 // find the random jets
709 vector <fastjet::PseudoJet> inclusiveJetsRan, sortedJetsRan;
710 fastjet::ClusterSequence clustSeqRan(inputParticlesRecRan, jetDef);
712 inclusiveJetsRan = clustSeqRan.inclusive_jets();
713 sortedJetsRan = sorted_by_pt(inclusiveJetsRan);
715 // fill the jet information from random track
717 fh1NJetsRecRan->Fill(sortedJetsRan.size());
719 // loop over all jets an fill information, first on is the leading jet
721 Int_t nRecOverRan = inclusiveJetsRan.size();
722 Int_t nRecRan = inclusiveJetsRan.size();
723 if(inclusiveJetsRan.size()>0){
724 AliAODJet leadingJet (sortedJetsRan[0].px(), sortedJetsRan[0].py(), sortedJetsRan[0].pz(), sortedJetsRan[0].E());
725 Float_t pt = leadingJet.Pt();
728 for(int i = 1;i <= fh2NRecJetsPtRan->GetNbinsX();i++){
729 Float_t ptCut = fh2NRecJetsPtRan->GetXaxis()->GetBinCenter(i);
730 while(pt<ptCut&&iCount<nRecRan){
734 pt = sortedJetsRan[iCount].perp();
737 if(nRecOverRan<=0)break;
738 fh2NRecJetsPtRan->Fill(ptCut,nRecOverRan);
740 Float_t phi = leadingJet.Phi();
741 if(phi<0)phi+=TMath::Pi()*2.;
742 pt = leadingJet.Pt();
744 // correlation of leading jet with random tracks
746 for(unsigned int ip = 0; ip < inputParticlesRecRan.size();ip++)
748 Float_t tmpPt = inputParticlesRecRan[ip].perp();
750 Float_t tmpPhi = inputParticlesRecRan[ip].phi();
751 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
752 Float_t dPhi = phi - tmpPhi;
753 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
754 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
755 // Float_t dEta = eta - tmpRecTrack->Eta();
756 fh2TracksLeadingJetPhiPtRan->Fill(dPhi,pt);
757 fh2TracksLeadingJetPhiPtWRan->Fill(dPhi,pt,tmpPt);
762 for(int j = 0; j < nRecRan;j++){
763 AliAODJet tmpRec (sortedJetsRan[j].px(), sortedJetsRan[j].py(), sortedJetsRan[j].pz(), sortedJetsRan[j].E());
764 Float_t tmpPt = tmpRec.Pt();
765 fh1PtJetsRecInRan->Fill(tmpPt);
766 // Fill Spectra with constituents
767 vector<fastjet::PseudoJet> constituents = clustSeqRan.constituents(sortedJetsRan[j]);
768 fh1NConstRecRan->Fill(constituents.size());
769 fh2NConstPtRan->Fill(tmpPt,constituents.size());
770 fh2PtNchRan->Fill(nCh,tmpPt);
771 fh2PtNchNRan->Fill(nCh,tmpPt,constituents.size());
773 Float_t tmpPhi = tmpRec.Phi();
774 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
777 fh1PtJetsLeadingRecInRan->Fill(tmpPt);
778 fh1NConstLeadingRecRan->Fill(constituents.size());
779 fh2NConstLeadingPtRan->Fill(tmpPt,constituents.size());
786 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
787 PostData(1, fHistList);
790 void AliAnalysisTaskJetCluster::Terminate(Option_t */*option*/)
792 // Terminate analysis
794 if (fDebug > 1) printf("AnalysisJetCluster: Terminate() \n");
798 Int_t AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
800 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
804 AliAODEvent *aod = 0;
805 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
806 else aod = AODEvent();
810 for(int it = 0;it < aod->GetNumberOfTracks();++it){
811 AliAODTrack *tr = aod->GetTrack(it);
812 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
813 if(TMath::Abs(tr->Eta())>0.9)continue;
814 // if(tr->Pt()<0.3)continue;
819 else if (type == kTrackKineAll||type == kTrackKineCharged){
820 AliMCEvent* mcEvent = MCEvent();
821 if(!mcEvent)return iCount;
822 // we want to have alivpartilces so use get track
823 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
824 if(!mcEvent->IsPhysicalPrimary(it))continue;
825 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
826 if(type == kTrackKineAll){
830 else if(type == kTrackKineCharged){
831 if(part->Particle()->GetPDG()->Charge()==0)continue;
837 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
838 AliAODEvent *aod = 0;
839 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
840 else aod = AODEvent();
841 if(!aod)return iCount;
842 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
843 if(!tca)return iCount;
844 for(int it = 0;it < tca->GetEntriesFast();++it){
845 AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
846 if(!part->IsPhysicalPrimary())continue;
847 if(type == kTrackAODMCAll){
851 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
852 if(part->Charge()==0)continue;
853 if(kTrackAODMCCharged){
857 if(TMath::Abs(part->Eta())>0.9)continue;
870 Int_t AliAnalysisTaskJetCluster::AddParticlesFastJet(TList &particles,vector<fastjet::PseudoJet> &inputParticles){
871 for(int i = 0; i < particles.GetEntries(); i++){
872 AliVParticle *vp = (AliVParticle*)particles.At(i);
873 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
874 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->E());
875 jInp.set_user_index(i);
876 inputParticles.push_back(jInp);