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>
28 #include <TRefArray.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 "AliESDEvent.h"
46 #include "AliAODEvent.h"
47 #include "AliAODHandler.h"
48 #include "AliAODTrack.h"
49 #include "AliAODJet.h"
50 #include "AliAODMCParticle.h"
51 #include "AliMCEventHandler.h"
52 #include "AliMCEvent.h"
54 #include "AliGenPythiaEventHeader.h"
55 #include "AliJetKineReaderHeader.h"
56 #include "AliGenCocktailEventHeader.h"
57 #include "AliInputEventHandler.h"
60 #include "fastjet/PseudoJet.hh"
61 #include "fastjet/ClusterSequenceArea.hh"
62 #include "fastjet/AreaDefinition.hh"
63 #include "fastjet/JetDefinition.hh"
64 // get info on how fastjet was configured
65 #include "fastjet/config.h"
68 ClassImp(AliAnalysisTaskJetCluster)
70 AliAnalysisTaskJetCluster::~AliAnalysisTaskJetCluster(){
74 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(): AliAnalysisTaskSE(),
78 fUseAODTrackInput(kFALSE),
79 fUseAODMCInput(kFALSE),
80 fUseGlobalSelection(kFALSE),
82 fTrackTypeRec(kTrackUndef),
83 fTrackTypeGen(kTrackUndef),
93 fAlgorithm(fastjet::kt_algorithm),
94 fStrategy(fastjet::Best),
95 fRecombScheme(fastjet::BIpt_scheme),
96 fAreaType(fastjet::active_area),
101 fh1PtHardTrials(0x0),
104 fh1NConstLeadingRec(0x0),
106 fh1PtJetsLeadingRecIn(0x0),
107 fh1PtJetConstRec(0x0),
108 fh1PtJetConstLeadingRec(0x0),
109 fh1PtTracksRecIn(0x0),
110 fh1PtTracksLeadingRecIn(0x0),
112 fh1NConstRecRan(0x0),
113 fh1PtJetsLeadingRecInRan(0x0),
114 fh1NConstLeadingRecRan(0x0),
115 fh1PtJetsRecInRan(0x0),
116 fh1PtTracksGenIn(0x0),
119 fh2NRecTracksPt(0x0),
121 fh2NConstLeadingPt(0x0),
123 fh2LeadingJetPhiEta(0x0),
125 fh2LeadingJetEtaPt(0x0),
127 fh2LeadingTrackEtaPt(0x0),
128 fh2JetsLeadingPhiEta(0x0),
129 fh2JetsLeadingPhiPt(0x0),
130 fh2TracksLeadingPhiEta(0x0),
131 fh2TracksLeadingPhiPt(0x0),
132 fh2TracksLeadingJetPhiPt(0x0),
133 fh2JetsLeadingPhiPtW(0x0),
134 fh2TracksLeadingPhiPtW(0x0),
135 fh2TracksLeadingJetPhiPtW(0x0),
136 fh2NRecJetsPtRan(0x0),
138 fh2NConstLeadingPtRan(0x0),
143 fh2TracksLeadingJetPhiPtRan(0x0),
144 fh2TracksLeadingJetPhiPtWRan(0x0),
150 AliAnalysisTaskJetCluster::AliAnalysisTaskJetCluster(const char* name):
151 AliAnalysisTaskSE(name),
155 fUseAODTrackInput(kFALSE),
156 fUseAODMCInput(kFALSE),
157 fUseGlobalSelection(kFALSE),
159 fTrackTypeRec(kTrackUndef),
160 fTrackTypeGen(kTrackUndef),
170 fAlgorithm(fastjet::kt_algorithm),
171 fStrategy(fastjet::Best),
172 fRecombScheme(fastjet::BIpt_scheme),
173 fAreaType(fastjet::active_area),
178 fh1PtHardTrials(0x0),
181 fh1NConstLeadingRec(0x0),
183 fh1PtJetsLeadingRecIn(0x0),
184 fh1PtJetConstRec(0x0),
185 fh1PtJetConstLeadingRec(0x0),
186 fh1PtTracksRecIn(0x0),
187 fh1PtTracksLeadingRecIn(0x0),
189 fh1NConstRecRan(0x0),
190 fh1PtJetsLeadingRecInRan(0x0),
191 fh1NConstLeadingRecRan(0x0),
192 fh1PtJetsRecInRan(0x0),
193 fh1PtTracksGenIn(0x0),
196 fh2NRecTracksPt(0x0),
198 fh2NConstLeadingPt(0x0),
200 fh2LeadingJetPhiEta(0x0),
202 fh2LeadingJetEtaPt(0x0),
204 fh2LeadingTrackEtaPt(0x0),
205 fh2JetsLeadingPhiEta(0x0),
206 fh2JetsLeadingPhiPt(0x0),
207 fh2TracksLeadingPhiEta(0x0),
208 fh2TracksLeadingPhiPt(0x0),
209 fh2TracksLeadingJetPhiPt(0x0),
210 fh2JetsLeadingPhiPtW(0x0),
211 fh2TracksLeadingPhiPtW(0x0),
212 fh2TracksLeadingJetPhiPtW(0x0),
213 fh2NRecJetsPtRan(0x0),
215 fh2NConstLeadingPtRan(0x0),
220 fh2TracksLeadingJetPhiPtRan(0x0),
221 fh2TracksLeadingJetPhiPtWRan(0x0),
224 DefineOutput(1, TList::Class());
229 Bool_t AliAnalysisTaskJetCluster::Notify()
232 // Implemented Notify() to read the cross sections
233 // and number of trials from pyxsec.root
238 void AliAnalysisTaskJetCluster::UserCreateOutputObjects()
242 // Create the output container
251 if (fDebug > 1) printf("AnalysisTaskJetCluster::UserCreateOutputObjects() \n");
255 if(fNonStdBranch.Length()!=0)
257 // only create the output branch if we have a name
258 // Create a new branch for jets...
259 // -> cleared in the UserExec....
260 // here we can also have the case that the brnaches are written to a separate file
262 TClonesArray *tca = new TClonesArray("AliAODJet", 0);
263 tca->SetName(fNonStdBranch.Data());
264 AddAODBranch("TClonesArray",&tca,fNonStdFile.Data());
265 if(fNonStdFile.Length()!=0){
267 // case that we have an AOD extension we need to fetch the jets from the extended output
268 // we identifay the extension aod event by looking for the branchname
269 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
270 TObjArray* extArray = aodH->GetExtensions();
272 TIter next(extArray);
273 while ((fAODExtension=(AliAODExtension*)next())){
274 TObject *obj = fAODExtension->GetAOD()->FindListObject(fNonStdBranch.Data());
276 Printf("%s:%d Dumping..",(char*)__FILE__,__LINE__);
277 fAODExtension->GetAOD()->Dump();
280 if(fDebug>1)Printf("AODExtension found for %s",fNonStdBranch.Data());
291 if(!fHistList)fHistList = new TList();
293 Bool_t oldStatus = TH1::AddDirectoryStatus();
294 TH1::AddDirectory(kFALSE);
299 const Int_t nBinPt = 200;
300 Double_t binLimitsPt[nBinPt+1];
301 for(Int_t iPt = 0;iPt <= nBinPt;iPt++){
303 binLimitsPt[iPt] = 0.0;
306 binLimitsPt[iPt] = binLimitsPt[iPt-1] + 0.5;
310 const Int_t nBinPhi = 90;
311 Double_t binLimitsPhi[nBinPhi+1];
312 for(Int_t iPhi = 0;iPhi<=nBinPhi;iPhi++){
314 binLimitsPhi[iPhi] = -1.*TMath::Pi();
317 binLimitsPhi[iPhi] = binLimitsPhi[iPhi-1] + 1/(Float_t)nBinPhi * TMath::Pi()*2;
323 const Int_t nBinEta = 40;
324 Double_t binLimitsEta[nBinEta+1];
325 for(Int_t iEta = 0;iEta<=nBinEta;iEta++){
327 binLimitsEta[iEta] = -2.0;
330 binLimitsEta[iEta] = binLimitsEta[iEta-1] + 0.1;
334 const int nChMax = 100;
336 fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
337 fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
339 fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
340 fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
343 fh1NJetsRec = new TH1F("fh1NJetsRec","N reconstructed jets",120,-0.5,119.5);
344 fh1NJetsRecRan = new TH1F("fh1NJetsRecRan","N reconstructed jets",120,-0.5,119.5);
346 fh1NConstRec = new TH1F("fh1NConstRec","# jet constituents",120,-0.5,119.5);
347 fh1NConstRecRan = new TH1F("fh1NConstRecRan","# jet constituents",120,-0.5,119.5);
348 fh1NConstLeadingRec = new TH1F("fh1NConstLeadingRec","jet constituents",120,-0.5,119.5);
349 fh1NConstLeadingRecRan = new TH1F("fh1NConstLeadingRecRan","jet constituents",120,-0.5,119.5);
352 fh1PtHard = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",nBinPt,binLimitsPt);
353 fh1PtHardNoW = new TH1F("fh1PtHardNoW","PYTHIA Pt hard no weight;p_{T,hard}",nBinPt,binLimitsPt);
354 fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",nBinPt,binLimitsPt);
356 fh1PtJetsRecIn = new TH1F("fh1PtJetsRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
357 fh1PtJetsRecInRan = new TH1F("fh1PtJetsRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
358 fh1PtJetsLeadingRecIn = new TH1F("fh1PtJetsLeadingRecIn","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
359 fh1PtJetsLeadingRecInRan = new TH1F("fh1PtJetsLeadingRecInRan","Rec jets P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
360 fh1PtJetConstRec = new TH1F("fh1PtJetsConstRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
361 fh1PtJetConstLeadingRec = new TH1F("fh1PtJetsConstLeadingRec","Rec jets constituents P_T;p_{T} (GeV/c)",nBinPt,binLimitsPt);
362 fh1PtTracksRecIn = new TH1F("fh1PtTracksRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
363 fh1PtTracksLeadingRecIn = new TH1F("fh1PtTracksLeadingRecIn","Rec tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
364 fh1PtTracksGenIn = new TH1F("fh1PtTracksGenIn","gen tracks P_T #eta < 0.9;p_{T} (GeV/c)",nBinPt,binLimitsPt);
365 fh1Nch = new TH1F("fh1Nch","charged multiplicity; N_{ch}",nChMax,-0.5,nChMax-0.5);
367 fh2NRecJetsPt = new TH2F("fh2NRecJetsPt","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
368 fh2NRecJetsPtRan = new TH2F("fh2NRecJetsPtRan","Number of jets above threshhold;p_{T,cut} (GeV/c);N_{jets}",nBinPt,binLimitsPt,50,-0.5,49.5);
369 fh2NRecTracksPt = new TH2F("fh2NRecTracksPt","Number of tracks above threshhold;p_{T,cut} (GeV/c);N_{tracks}",nBinPt,binLimitsPt,50,-0.5,49.5);
373 fh2NConstPt = new TH2F("fh2NConstPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
374 fh2NConstLeadingPt = new TH2F("fh2NConstLeadingPt","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
375 fh2NConstPtRan = new TH2F("fh2NConstPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
376 fh2NConstLeadingPtRan = new TH2F("fh2NConstLeadingPtRan","Number of constituents ;p_{T} (GeV/c);N",nBinPt,binLimitsPt,50,-0.5,49.5);
378 fh2PtNch = new TH2F("fh2PtNch","p_T of cluster vs. multiplicity; N_{ch};p_{T} (GeV/c);",nChMax,-0.5,nChMax-0.5,nBinPt,binLimitsPt);
379 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);
380 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);
381 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);
385 fh2JetPhiEta = new TH2F("fh2JetPhiEta","eta vs phi all jets;#phi;#eta",
386 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
387 fh2LeadingJetPhiEta = new TH2F("fh2LeadingJetPhiEta","eta vs phi leading jets;#phi;#eta",
388 nBinPhi,0.,2.*TMath::Pi(),nBinEta,binLimitsEta);
390 fh2JetEtaPt = new TH2F("fh2JetEtaPt","pt vs eta all jets;#eta;p_{T}",
391 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
392 fh2LeadingJetEtaPt = new TH2F("fh2LeadingJetEtaPt","pT vs eta leading jets;#eta;p_{T}",
393 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
395 fh2TrackEtaPt = new TH2F("fh2TrackEtaPt","pt vs eta all jets;#eta;p_{T}",
396 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
397 fh2LeadingTrackEtaPt = new TH2F("fh2LeadingTrackEtaPt","pT vs eta leading jets;#eta;p_{T}",
398 nBinEta,binLimitsEta,nBinPt,binLimitsPt);
402 fh2JetsLeadingPhiEta = new TH2F("fh2JetsLeadingPhiEta","delta eta vs delta phi to leading jet;#Delta#phi;#Delta#eta",
403 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
404 fh2JetsLeadingPhiPt = new TH2F("fh2JetsLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
405 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
406 fh2TracksLeadingPhiEta = new TH2F("fh2TracksLeadingPhiEta","delta eta vs delta phi to leading track;#Delta#phi;#Delta#eta",
407 nBinPhi,binLimitsPhi,nBinEta,binLimitsEta);
408 fh2TracksLeadingPhiPt = new TH2F("fh2TracksLeadingPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
409 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
410 fh2TracksLeadingJetPhiPt = new TH2F("fh2TracksLeadingJetPhiPt","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
411 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
412 fh2TracksLeadingJetPhiPtRan = new TH2F("fh2TracksLeadingJetPhiPtRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
413 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
415 fh2JetsLeadingPhiPtW = new TH2F("fh2JetsLeadingPhiPtW","leading p_T vs delta phi p_T weigted to leading jet;#Delta#phi;p_{T} (GeV/c)",
416 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
417 fh2TracksLeadingPhiPtW = new TH2F("fh2TracksLeadingPhiPtW","leading p_T vs delta phi to leading jet (p_T weighted);#Delta#phi;p_{T} (GeV/c)",
418 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
420 fh2TracksLeadingJetPhiPtW = new TH2F("fh2TracksLeadingJetPhiPtW","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
421 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
422 fh2TracksLeadingJetPhiPtWRan = new TH2F("fh2TracksLeadingJetPhiPtWRan","leading p_T vs delta phi to leading jet;#Delta#phi;p_{T} (GeV/c)",
423 nBinPhi,binLimitsPhi,nBinPt,binLimitsPt);
427 const Int_t saveLevel = 3; // large save level more histos
429 fHistList->Add(fh1Xsec);
430 fHistList->Add(fh1Trials);
432 fHistList->Add(fh1NJetsRec);
433 fHistList->Add(fh1NConstRec);
434 fHistList->Add(fh1NConstLeadingRec);
435 fHistList->Add(fh1PtJetsRecIn);
436 fHistList->Add(fh1PtJetsLeadingRecIn);
437 fHistList->Add(fh1PtTracksRecIn);
438 fHistList->Add(fh1PtTracksLeadingRecIn);
439 fHistList->Add(fh1PtJetConstRec);
440 fHistList->Add(fh1PtJetConstLeadingRec);
441 fHistList->Add(fh1NJetsRecRan);
442 fHistList->Add(fh1NConstRecRan);
443 fHistList->Add(fh1PtJetsLeadingRecInRan);
444 fHistList->Add(fh1NConstLeadingRecRan);
445 fHistList->Add(fh1PtJetsRecInRan);
446 fHistList->Add(fh1Nch);
447 fHistList->Add(fh2NRecJetsPt);
448 fHistList->Add(fh2NRecTracksPt);
449 fHistList->Add(fh2NConstPt);
450 fHistList->Add(fh2NConstLeadingPt);
451 fHistList->Add(fh2PtNch);
452 fHistList->Add(fh2PtNchRan);
453 fHistList->Add(fh2PtNchN);
454 fHistList->Add(fh2PtNchNRan);
455 fHistList->Add(fh2JetPhiEta);
456 fHistList->Add(fh2LeadingJetPhiEta);
457 fHistList->Add(fh2JetEtaPt);
458 fHistList->Add(fh2LeadingJetEtaPt);
459 fHistList->Add(fh2TrackEtaPt);
460 fHistList->Add(fh2LeadingTrackEtaPt);
461 fHistList->Add(fh2JetsLeadingPhiEta );
462 fHistList->Add(fh2JetsLeadingPhiPt);
463 fHistList->Add(fh2TracksLeadingPhiEta);
464 fHistList->Add(fh2TracksLeadingPhiPt);
465 fHistList->Add(fh2TracksLeadingJetPhiPt);
466 fHistList->Add(fh2JetsLeadingPhiPtW);
467 fHistList->Add(fh2TracksLeadingPhiPtW);
468 fHistList->Add(fh2TracksLeadingJetPhiPtW);
469 fHistList->Add(fh2NRecJetsPtRan);
470 fHistList->Add(fh2NConstPtRan);
471 fHistList->Add(fh2NConstLeadingPtRan);
472 fHistList->Add(fh2TracksLeadingJetPhiPtRan);
473 fHistList->Add(fh2TracksLeadingJetPhiPtWRan);
476 // =========== Switch on Sumw2 for all histos ===========
477 for (Int_t i=0; i<fHistList->GetEntries(); ++i) {
478 TH1 *h1 = dynamic_cast<TH1*>(fHistList->At(i));
483 THnSparse *hn = dynamic_cast<THnSparse*>(fHistList->At(i));
486 TH1::AddDirectory(oldStatus);
489 void AliAnalysisTaskJetCluster::Init()
495 if (fDebug > 1) printf("AnalysisTaskJetCluster::Init() \n");
499 void AliAnalysisTaskJetCluster::UserExec(Option_t */*option*/)
502 if(fUseGlobalSelection){
503 // no selection by the service task, we continue
504 if (fDebug > 1)Printf("Not selected %s:%d",(char*)__FILE__,__LINE__);
505 PostData(1, fHistList);
509 // handle and reset the output jet branch
510 // only need this once
511 TClonesArray* jarray = 0;
512 if(fNonStdBranch.Length()!=0) {
513 if(AODEvent())jarray = (TClonesArray*)(AODEvent()->FindListObject(fNonStdBranch.Data()));
514 if(!jarray)jarray = (TClonesArray*)(fAODExtension->GetAOD()->FindListObject(fNonStdBranch.Data()));
515 if(jarray)jarray->Delete(); // this is our responsibility, clear before filling again
519 // Execute analysis for current event
521 AliESDEvent *fESD = 0;
522 if(fUseAODTrackInput){
523 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
525 Printf("%s:%d AODEvent not found in Input Manager %d",(char*)__FILE__,__LINE__,fUseAODTrackInput);
531 // assume that the AOD is in the general output...
534 Printf("%s:%d AODEvent not found in the Output",(char*)__FILE__,__LINE__);
538 fESD = dynamic_cast<AliESDEvent*> (InputEvent());
542 Bool_t selectEvent = false;
543 Bool_t physicsSelection = true;// handled by the framework(fInputHandler->IsEventSelected()&AliVEvent::kMB)==AliVEvent::kMB;
546 const AliAODVertex *vtxAOD = fAOD->GetPrimaryVertex();
547 TString vtxTitle(vtxAOD->GetTitle());
549 if(vtxAOD->GetNContributors()>2&&!vtxTitle.Contains("TPCVertex")){
550 Float_t zvtx = vtxAOD->GetZ();
551 Float_t yvtx = vtxAOD->GetY();
552 Float_t xvtx = vtxAOD->GetX();
553 Float_t r2 = yvtx*yvtx+xvtx*xvtx;
554 if(TMath::Abs(zvtx)<8.&&r2<1.){
555 if(physicsSelection)selectEvent = true;
560 PostData(1, fHistList);
564 fh1Trials->Fill("#sum{ntrials}",1);
567 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
569 // ==== General variables needed
573 // we simply fetch the tracks/mc particles as a list of AliVParticles
578 Int_t nT = GetListOfTracks(&recParticles,fTrackTypeRec);
579 Float_t nCh = recParticles.GetEntries();
581 if(fDebug>2)Printf("%s:%d Selected Rec tracks: %d %d",(char*)__FILE__,__LINE__,nT,recParticles.GetEntries());
582 nT = GetListOfTracks(&genParticles,fTrackTypeGen);
583 if(fDebug>2)Printf("%s:%d Selected Gen tracks: %d %d",(char*)__FILE__,__LINE__,nT,genParticles.GetEntries());
587 vector<fastjet::PseudoJet> inputParticlesRec;
588 vector<fastjet::PseudoJet> inputParticlesRecRan;
589 for(int i = 0; i < recParticles.GetEntries(); i++){
590 AliVParticle *vp = (AliVParticle*)recParticles.At(i);
591 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
592 // we talk total momentum here
593 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->P());
594 jInp.set_user_index(i);
595 inputParticlesRec.push_back(jInp);
597 // the randomized input changes eta and phi, but keeps the p_T
598 if(i>=fNSkipLeadingRan){// eventually skip the leading particles
599 Double_t pT = vp->Pt();
600 Double_t eta = 1.8 * gRandom->Rndm() - 0.9;
601 Double_t phi = 2.* TMath::Pi() * gRandom->Rndm();
603 Double_t theta = 2.*TMath::ATan(TMath::Exp(-2.*eta));
604 Double_t pZ = pT/TMath::Tan(theta);
606 Double_t pX = pT * TMath::Cos(phi);
607 Double_t pY = pT * TMath::Sin(phi);
608 Double_t p = TMath::Sqrt(pT*pT+pZ*pZ);
609 fastjet::PseudoJet jInpRan(pX,pY,pZ,p);
610 jInpRan.set_user_index(i);
611 inputParticlesRecRan.push_back(jInpRan);
614 // fill the tref array, only needed when we write out jets
617 fRef->Delete(); // make sure to delete before placement new...
618 new(fRef) TRefArray(TProcessID::GetProcessWithUID(vp));
624 if(inputParticlesRec.size()==0){
625 if(fDebug)Printf("%s:%d No input particles found, skipping event",(char*)__FILE__,__LINE__);
626 PostData(1, fHistList);
631 // employ setters for these...
633 double ghostEtamax = 0.9;
634 double ghostArea = 0.01;
635 int activeAreaRepeats = 1;
636 // now create the object that holds info about ghosts
637 fastjet::GhostedAreaSpec ghostSpec(ghostEtamax, activeAreaRepeats, ghostArea)\
639 fastjet::AreaType areaType = fastjet::active_area;
640 fastjet::AreaDefinition areaDef = fastjet::AreaDefinition(areaType,ghostSpec);
642 fastjet::JetDefinition jetDef(fAlgorithm, fRparam, fRecombScheme, fStrategy);
643 vector <fastjet::PseudoJet> inclusiveJets, sortedJets;
644 fastjet::ClusterSequenceArea clustSeq(inputParticlesRec, jetDef,areaDef);
646 inclusiveJets = clustSeq.inclusive_jets();
647 sortedJets = sorted_by_pt(inclusiveJets);
649 fh1NJetsRec->Fill(sortedJets.size());
651 // loop over all jets an fill information, first on is the leading jet
653 Int_t nRecOver = inclusiveJets.size();
654 Int_t nRec = inclusiveJets.size();
655 if(inclusiveJets.size()>0){
656 AliAODJet leadingJet (sortedJets[0].px(), sortedJets[0].py(), sortedJets[0].pz(), sortedJets[0].E());
657 Float_t pt = leadingJet.Pt();
658 Int_t nAodOutJets = 0;
659 Int_t nAodOutTracks = 0;
660 AliAODJet *aodOutJet = 0;
663 for(int i = 1;i <= fh2NRecJetsPt->GetNbinsX();i++){
664 Float_t ptCut = fh2NRecJetsPt->GetXaxis()->GetBinCenter(i);
665 while(pt<ptCut&&iCount<nRec){
669 pt = sortedJets[iCount].perp();
672 if(nRecOver<=0)break;
673 fh2NRecJetsPt->Fill(ptCut,nRecOver);
675 Float_t phi = leadingJet.Phi();
676 if(phi<0)phi+=TMath::Pi()*2.;
677 Float_t eta = leadingJet.Eta();
678 pt = leadingJet.Pt();
680 // correlation of leading jet with tracks
681 TIterator *recIter = recParticles.MakeIterator();
683 AliVParticle *tmpRecTrack = 0;
684 while((tmpRecTrack = (AliVParticle*)(recIter->Next()))){
685 Float_t tmpPt = tmpRecTrack->Pt();
687 Float_t tmpPhi = tmpRecTrack->Phi();
688 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
689 Float_t dPhi = phi - tmpPhi;
690 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
691 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
692 fh2TracksLeadingJetPhiPt->Fill(dPhi,pt);
693 fh2TracksLeadingJetPhiPtW->Fill(dPhi,pt,tmpPt);
698 for(int j = 0; j < nRec;j++){
699 AliAODJet tmpRec (sortedJets[j].px(), sortedJets[j].py(), sortedJets[j].pz(), sortedJets[j].E());
702 Float_t tmpPt = tmpRec.Pt();
703 fh1PtJetsRecIn->Fill(tmpPt);
704 // Fill Spectra with constituents
705 vector<fastjet::PseudoJet> constituents = clustSeq.constituents(sortedJets[j]);
706 fh1NConstRec->Fill(constituents.size());
707 fh2PtNch->Fill(nCh,tmpPt);
708 fh2PtNchN->Fill(nCh,tmpPt,constituents.size());
709 fh2NConstPt->Fill(tmpPt,constituents.size());
710 // loop over constiutents and fill spectrum
712 // Add the jet information and the track references to the output AOD
714 if(tmpPt>fJetOutputMinPt&&jarray){
715 aodOutJet = new ((*jarray)[nAodOutJets++]) AliAODJet(tmpRec);
716 Double_t area=clustSeq.area(sortedJets[j]);
718 aodOutJet->SetEffArea(area,0);
722 for(unsigned int ic = 0; ic < constituents.size();ic++){
723 AliVParticle *part = (AliVParticle*)recParticles.At(constituents[ic].user_index());
724 fh1PtJetConstRec->Fill(part->Pt());
726 aodOutJet->AddTrack(fRef->At(constituents[ic].user_index()));
728 if(j==0)fh1PtJetConstLeadingRec->Fill(part->Pt());
739 Float_t tmpPhi = tmpRec.Phi();
740 Float_t tmpEta = tmpRec.Eta();
741 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
744 fh1PtJetsLeadingRecIn->Fill(tmpPt);
745 fh2LeadingJetPhiEta->Fill(tmpPhi,tmpEta);
746 fh2LeadingJetEtaPt->Fill(tmpEta,tmpPt);
747 fh1NConstLeadingRec->Fill(constituents.size());
748 fh2NConstLeadingPt->Fill(tmpPt,constituents.size());
751 fh2JetPhiEta->Fill(tmpRec.Phi(),tmpEta);
752 fh2JetEtaPt->Fill(tmpEta,tmpPt);
753 Float_t dPhi = phi - tmpPhi;
754 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
755 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
756 Float_t dEta = eta - tmpRec.Eta();
757 fh2JetsLeadingPhiEta->Fill(dPhi,dEta);
758 fh2JetsLeadingPhiPt->Fill(dPhi,pt);
759 fh2JetsLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
764 // fill track information
765 Int_t nTrackOver = recParticles.GetSize();
766 // do the same for tracks and jets
768 TIterator *recIter = recParticles.MakeIterator();
769 AliVParticle *tmpRec = (AliVParticle*)(recIter->Next());
770 Float_t pt = tmpRec->Pt();
771 // Printf("Leading track p_t %3.3E",pt);
772 for(int i = 1;i <= fh2NRecTracksPt->GetNbinsX();i++){
773 Float_t ptCut = fh2NRecTracksPt->GetXaxis()->GetBinCenter(i);
774 while(pt<ptCut&&tmpRec){
776 tmpRec = (AliVParticle*)(recIter->Next());
781 if(nTrackOver<=0)break;
782 fh2NRecTracksPt->Fill(ptCut,nTrackOver);
786 AliVParticle *leading = (AliVParticle*)recParticles.At(0);
787 Float_t phi = leading->Phi();
788 if(phi<0)phi+=TMath::Pi()*2.;
789 Float_t eta = leading->Eta();
791 while((tmpRec = (AliVParticle*)(recIter->Next()))){
792 Float_t tmpPt = tmpRec->Pt();
793 Float_t tmpEta = tmpRec->Eta();
794 fh1PtTracksRecIn->Fill(tmpPt);
795 fh2TrackEtaPt->Fill(tmpEta,tmpPt);
797 fh1PtTracksLeadingRecIn->Fill(tmpPt);
798 fh2LeadingTrackEtaPt->Fill(tmpEta,tmpPt);
802 Float_t tmpPhi = tmpRec->Phi();
804 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
805 Float_t dPhi = phi - tmpPhi;
806 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
807 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
808 Float_t dEta = eta - tmpRec->Eta();
809 fh2TracksLeadingPhiEta->Fill(dPhi,dEta);
810 fh2TracksLeadingPhiPt->Fill(dPhi,pt);
811 fh2TracksLeadingPhiPtW->Fill(dPhi,pt,tmpPt);
816 // find the random jets
817 vector <fastjet::PseudoJet> inclusiveJetsRan, sortedJetsRan;
818 fastjet::ClusterSequence clustSeqRan(inputParticlesRecRan, jetDef);
820 inclusiveJetsRan = clustSeqRan.inclusive_jets();
821 sortedJetsRan = sorted_by_pt(inclusiveJetsRan);
823 // fill the jet information from random track
825 fh1NJetsRecRan->Fill(sortedJetsRan.size());
827 // loop over all jets an fill information, first on is the leading jet
829 Int_t nRecOverRan = inclusiveJetsRan.size();
830 Int_t nRecRan = inclusiveJetsRan.size();
831 if(inclusiveJetsRan.size()>0){
832 AliAODJet leadingJet (sortedJetsRan[0].px(), sortedJetsRan[0].py(), sortedJetsRan[0].pz(), sortedJetsRan[0].E());
833 Float_t pt = leadingJet.Pt();
836 for(int i = 1;i <= fh2NRecJetsPtRan->GetNbinsX();i++){
837 Float_t ptCut = fh2NRecJetsPtRan->GetXaxis()->GetBinCenter(i);
838 while(pt<ptCut&&iCount<nRecRan){
842 pt = sortedJetsRan[iCount].perp();
845 if(nRecOverRan<=0)break;
846 fh2NRecJetsPtRan->Fill(ptCut,nRecOverRan);
848 Float_t phi = leadingJet.Phi();
849 if(phi<0)phi+=TMath::Pi()*2.;
850 pt = leadingJet.Pt();
852 // correlation of leading jet with random tracks
854 for(unsigned int ip = 0; ip < inputParticlesRecRan.size();ip++)
856 Float_t tmpPt = inputParticlesRecRan[ip].perp();
858 Float_t tmpPhi = inputParticlesRecRan[ip].phi();
859 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
860 Float_t dPhi = phi - tmpPhi;
861 if(dPhi>TMath::Pi())dPhi = dPhi - 2.*TMath::Pi();
862 if(dPhi<(-1.*TMath::Pi()))dPhi = dPhi + 2.*TMath::Pi();
863 fh2TracksLeadingJetPhiPtRan->Fill(dPhi,pt);
864 fh2TracksLeadingJetPhiPtWRan->Fill(dPhi,pt,tmpPt);
869 for(int j = 0; j < nRecRan;j++){
870 AliAODJet tmpRec (sortedJetsRan[j].px(), sortedJetsRan[j].py(), sortedJetsRan[j].pz(), sortedJetsRan[j].E());
871 Float_t tmpPt = tmpRec.Pt();
872 fh1PtJetsRecInRan->Fill(tmpPt);
873 // Fill Spectra with constituents
874 vector<fastjet::PseudoJet> constituents = clustSeqRan.constituents(sortedJetsRan[j]);
875 fh1NConstRecRan->Fill(constituents.size());
876 fh2NConstPtRan->Fill(tmpPt,constituents.size());
877 fh2PtNchRan->Fill(nCh,tmpPt);
878 fh2PtNchNRan->Fill(nCh,tmpPt,constituents.size());
880 Float_t tmpPhi = tmpRec.Phi();
881 if(tmpPhi<0)tmpPhi+=TMath::Pi()*2.;
884 fh1PtJetsLeadingRecInRan->Fill(tmpPt);
885 fh1NConstLeadingRecRan->Fill(constituents.size());
886 fh2NConstLeadingPtRan->Fill(tmpPt,constituents.size());
893 if (fDebug > 10)Printf("%s:%d",(char*)__FILE__,__LINE__);
894 PostData(1, fHistList);
897 void AliAnalysisTaskJetCluster::Terminate(Option_t */*option*/)
899 // Terminate analysis
901 if (fDebug > 1) printf("AnalysisJetCluster: Terminate() \n");
905 Int_t AliAnalysisTaskJetCluster::GetListOfTracks(TList *list,Int_t type){
907 if(fDebug>2)Printf("%s:%d Selecting tracks with %d",(char*)__FILE__,__LINE__,type);
911 AliAODEvent *aod = 0;
912 if(fUseAODTrackInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
913 else aod = AODEvent();
917 for(int it = 0;it < aod->GetNumberOfTracks();++it){
918 AliAODTrack *tr = aod->GetTrack(it);
919 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
920 if(TMath::Abs(tr->Eta())>0.9)continue;
921 // if(tr->Pt()<0.3)continue;
926 else if (type == kTrackKineAll||type == kTrackKineCharged){
927 AliMCEvent* mcEvent = MCEvent();
928 if(!mcEvent)return iCount;
929 // we want to have alivpartilces so use get track
930 for(int it = 0;it < mcEvent->GetNumberOfTracks();++it){
931 if(!mcEvent->IsPhysicalPrimary(it))continue;
932 AliMCParticle* part = (AliMCParticle*)mcEvent->GetTrack(it);
933 if(type == kTrackKineAll){
937 else if(type == kTrackKineCharged){
938 if(part->Particle()->GetPDG()->Charge()==0)continue;
944 else if (type == kTrackAODMCCharged || type == kTrackAODMCAll || type == kTrackAODMCChargedAcceptance) {
945 AliAODEvent *aod = 0;
946 if(fUseAODMCInput)aod = dynamic_cast<AliAODEvent*>(InputEvent());
947 else aod = AODEvent();
948 if(!aod)return iCount;
949 TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
950 if(!tca)return iCount;
951 for(int it = 0;it < tca->GetEntriesFast();++it){
952 AliAODMCParticle *part = (AliAODMCParticle*)(tca->At(it));
953 if(!part->IsPhysicalPrimary())continue;
954 if(type == kTrackAODMCAll){
958 else if (type == kTrackAODMCCharged || type == kTrackAODMCChargedAcceptance ){
959 if(part->Charge()==0)continue;
960 if(kTrackAODMCCharged){
964 if(TMath::Abs(part->Eta())>0.9)continue;
977 Int_t AliAnalysisTaskJetCluster::AddParticlesFastJet(TList &particles,vector<fastjet::PseudoJet> &inputParticles){
978 for(int i = 0; i < particles.GetEntries(); i++){
979 AliVParticle *vp = (AliVParticle*)particles.At(i);
980 // Carefull energy is not well determined in real data, should not matter for p_T scheme?
981 fastjet::PseudoJet jInp(vp->Px(),vp->Py(),vp->Pz(),vp->E());
982 jInp.set_user_index(i);
983 inputParticles.push_back(jInp);