1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 // task compares jets in two or three branches,
18 // written for analysis of jet embedding in HI events
29 #include "THnSparse.h"
34 #include "AliAnalysisTask.h"
35 #include "AliAnalysisManager.h"
37 #include "AliVEvent.h"
38 #include "AliESDEvent.h"
39 #include "AliESDInputHandler.h"
40 #include "AliCentrality.h"
41 #include "AliAnalysisHelperJetTasks.h"
42 #include "AliInputEventHandler.h"
43 #include "AliAODJetEventBackground.h"
44 #include "AliAnalysisTaskFastEmbedding.h"
46 #include "AliAODEvent.h"
47 #include "AliAODJet.h"
49 #include "AliAnalysisTaskJetResponseV2.h"
54 ClassImp(AliAnalysisTaskJetResponseV2)
56 AliAnalysisTaskJetResponseV2::AliAnalysisTaskJetResponseV2() :
60 fBackgroundBranch(""),
62 fOfflineTrgMask(AliVEvent::kAny),
75 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
76 fJetPtFractionMin(0.5),
84 fbJetsMismatch1(kTRUE),
85 fbJetsMismatch2(kTRUE),
91 fbJets3Branches(kFALSE),
92 fbJetsBeforeCut1(kTRUE),
93 fbJetsBeforeCut2(kTRUE),
94 fHistEvtSelection(0x0),
95 fHistJetSelection(0x0),
98 fhnJetsMismatch1(0x0),
99 fhnJetsMismatch2(0x0),
105 fhnJets3Branches(0x0),
106 fhnJetsBeforeCut1(0x0),
107 fhnJetsBeforeCut2(0x0)
109 // default Constructor
111 fJetBranchName[0] = "";
112 fJetBranchName[1] = "";
113 fJetBranchName[2] = "";
115 fListJets[0] = new TList;
116 fListJets[1] = new TList;
117 fListJets[2] = new TList;
120 AliAnalysisTaskJetResponseV2::AliAnalysisTaskJetResponseV2(const char *name) :
121 AliAnalysisTaskSE(name),
124 fBackgroundBranch(""),
126 fOfflineTrgMask(AliVEvent::kAny),
135 fNInputTracksMax(-1),
139 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
140 fJetPtFractionMin(0.5),
148 fbJetsMismatch1(kTRUE),
149 fbJetsMismatch2(kTRUE),
151 fbJetsDeltaPt(kTRUE),
155 fbJets3Branches(kFALSE),
156 fbJetsBeforeCut1(kTRUE),
157 fbJetsBeforeCut2(kTRUE),
158 fHistEvtSelection(0x0),
159 fHistJetSelection(0x0),
160 fh2JetSelection(0x0),
162 fhnJetsMismatch1(0x0),
163 fhnJetsMismatch2(0x0),
169 fhnJets3Branches(0x0),
170 fhnJetsBeforeCut1(0x0),
171 fhnJetsBeforeCut2(0x0)
175 fJetBranchName[0] = "";
176 fJetBranchName[1] = "";
177 fJetBranchName[2] = "";
179 fListJets[0] = new TList;
180 fListJets[1] = new TList;
181 fListJets[2] = new TList;
183 DefineOutput(1, TList::Class());
186 AliAnalysisTaskJetResponseV2::~AliAnalysisTaskJetResponseV2()
193 void AliAnalysisTaskJetResponseV2::SetBranchNames(const TString &branch1, const TString &branch2, const TString &branch3)
195 fJetBranchName[0] = branch1;
196 fJetBranchName[1] = branch2;
197 fJetBranchName[2] = branch3;
199 if(strlen(fJetBranchName[2].Data()) )
203 void AliAnalysisTaskJetResponseV2::Init()
206 // check for jet branches
207 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
208 AliError("Jet branch name not set.");
213 void AliAnalysisTaskJetResponseV2::UserCreateOutputObjects()
218 if(!fOutputList) fOutputList = new TList;
219 fOutputList->SetOwner(kTRUE);
221 Bool_t oldStatus = TH1::AddDirectoryStatus();
222 TH1::AddDirectory(kFALSE);
225 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
226 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
227 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
228 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
229 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
230 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
231 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
233 fHistJetSelection = new TH1I("fHistJetSelection", "jet selection", 8, -0.5, 7.5);
234 fHistJetSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
235 fHistJetSelection->GetXaxis()->SetBinLabel(2,"probes IN");
236 fHistJetSelection->GetXaxis()->SetBinLabel(3,"no matching jet");
237 fHistJetSelection->GetXaxis()->SetBinLabel(4,"not in list");
238 fHistJetSelection->GetXaxis()->SetBinLabel(5,"fraction cut");
239 fHistJetSelection->GetXaxis()->SetBinLabel(6,"acceptance cut");
240 fHistJetSelection->GetXaxis()->SetBinLabel(7,"p_{T} cut");
241 fHistJetSelection->GetXaxis()->SetBinLabel(8,"trigger exclude mask");
243 fh2JetSelection = new TH2F("fh2JetSelection", "jet selection", 8, -0.5, 7.5,100,0.,200.);
244 fh2JetSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
245 fh2JetSelection->GetXaxis()->SetBinLabel(2,"probes IN");
246 fh2JetSelection->GetXaxis()->SetBinLabel(3,"no matching jet");
247 fh2JetSelection->GetXaxis()->SetBinLabel(4,"not in list");
248 fh2JetSelection->GetXaxis()->SetBinLabel(5,"fraction cut");
249 fh2JetSelection->GetXaxis()->SetBinLabel(6,"acceptance cut");
250 fh2JetSelection->GetXaxis()->SetBinLabel(7,"p_{T} cut");
251 fh2JetSelection->GetXaxis()->SetBinLabel(8,"trigger exclude mask");
254 UInt_t entries = 0; // bit coded, see GetDimParams() below
255 UInt_t opt = 0; // bit coded, default (0) or high resolution (1)
258 entries = 1<<0 | 1<<1 | 1<<2 | 1<<26; // cent : nInpTrks : rp psi : pT hard bin
259 opt = 1<<0 | 1<<1; // centrality and nInpTrks in high resolution
260 fhnEvent = NewTHnSparseF("fhnEvent", entries, opt);
263 if(fbJetsMismatch1){ // real mismatch (no related rec jet found)
264 // cent : nInpTrks : rp bins : probe pt : probe eta : probe phi : probe area : pT hard bin
265 entries = 1<<0 | 1<<1 | 1<<3 | 1<<6 | 1<<8 | 1<<10 | 1<<12 | 1<<26;
266 opt = 1<<6 | 1<<8 | 1<<10;
267 fhnJetsMismatch1 = NewTHnSparseF("fhnJetsMismatch1", entries, opt);
270 if(fbJetsMismatch2){ // acceptance + fraction cut
271 // cent : nInpTrks : rp bins : jetPt(2x) : jetEta(2x) : deltaEta : deltaR : fraction : pT hard bin
272 entries = 1<<0 | 1<<1 | 1<<3 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<15 | 1<<17 | 1<<19 | 1<<26;
273 opt = 1<<6 | 1<<7 | 1<<8 | 1<<9;
274 fhnJetsMismatch2 = NewTHnSparseF("fhnJetsMismatch2", entries, opt);
280 // cent : nInpTrks : rp bins : rp wrt jet(2x) : probe pT : probe area: deltaPt : rp phi : rho : correction for RP : local rho
282 entries = 1<<0 | 1<<1 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<12 | 1<<14 | 1<<2 | 1<<22 | 1<<23 | 1<<24 | 1<<25;
284 // cent : nInpTrks : rp bins : rp wrt jet(2x) : probe pT : deltaPt : rp phi : rho : correction for RP | pT hard bin
285 entries = 1<<0 | 1<<1 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<14 | 1<<2 | 1<<22 | 1<<23 | 1<<26;
287 fhnJetsRp = NewTHnSparseF("fhnJetsRp", entries, opt);
290 // cent : nInpTrks : rp bins: deltaPt : jetPt(2x) : deltaArea : pT hard bin (hr delta pt)
292 entries = 1<<0 | 1<<1 | 1<<3 | 1<<14 | 1<<6 | 1<<7 | 1<<18 | 1<<26;
293 opt = 1<<1 | 1<<14 | 1<<6 | 1<<7 | 1<<18;
294 fhnJetsDeltaPt = NewTHnSparseF("fhnJetsDeltaPt", entries, opt);
297 // cent : nInpTrks : rp bins : deltaPt : jetPt(2x) : deltaR : deltaEta : jetEta(2x) : pT hard bin (hr for eta)
299 entries = 1<<0 | 1<<1 | 1<<3 | 1<<14 | 1<<6 | 1<<7 | 1<<17 | 1<<15 | 1<<8 | 1<<9 | 1<<26;
300 opt = 1<<15 | 1<<8 | 1<<9;
301 fhnJetsEta = NewTHnSparseF("fhnJetsEta", entries, opt);
304 // cent : nInpTrks : rp bins : jetPt(2x) : jetPhi(2x) : deltaPt : deltaPhi : pT hard bin
306 entries = 1<<0 | 1<<1 | 1<<3 | 1<<6 | 1<<7 | 1<<10 | 1<<11 | 1<<14 | 1<<16 | 1<<26;
308 fhnJetsPhi = NewTHnSparseF("fhnJetsPhi", entries, opt);
311 // cent : nInpTrks : rp bins : deltaArea : jetArea(2x) : deltaR : fraction : distance next rec jet : pT next jet : deltaPt : jetPt(2x) : pT hard bin (hr for area)
313 entries = 1<<0 | 1<<1 | 1<<3 | 1<<18 | 1<<12 | 1<<13 | 1<<17 | 1<<19 | 1<<20 | 1<<21 | 1<<14 | 1<<6 | 1<<7 | 1<<26;
314 opt = 1<<18 | 1<<12 | 1<<13;
315 fhnJetsArea = NewTHnSparseF("fhnJetsArea", entries, opt);
318 // cent : nInpTrks : jetPt(3x) : deltaPt : delta : jetArea(3x) : fraction(2x) : pT hard bin
320 entries = 1<<0 | 1<<1 | 1<<6 | 1<<7 | 1<<7 | 1<<14 | 1<<14 | 1<<12 | 1<<13 | 1<<13 | 1<<19 | 1<<19 | 1<<26;
321 opt = 1<<6 | 1<<7 | 1<<14;
322 fhnJets3Branches = NewTHnSparseF("fhnJets3Branches", entries, opt);
330 // cent : nInpTrks : rp bins : fraction : jetPt(2x) : jetEta(2x) : jetPhi(2x) (low resolution) (with fraction, eta, phi, pt cuts possible)
331 if(fbJetsBeforeCut1){
332 entries = 1<<0 | 1<<1 | 1<<3 | 1<<19 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<10 | 1<<11;
334 fhnJetsBeforeCut1 = NewTHnSparseF("fhnJetsBeforeCut1", entries, opt);
337 // cent : nInpTrks : rp bins : deltaPt : jetPt(2x) : deltaR : deltaEta : jetEta(2x) (low resolution)
338 if(fbJetsBeforeCut2){
339 entries = 1<<0 | 1<<1 | 1<<3 | 1<<14 | 1<<6 | 1<<7 | 1<<17 | 1<<15 | 1<<8 | 1<<9;
341 fhnJetsBeforeCut2 = NewTHnSparseF("fhnJetsBeforeCut2", entries, opt);
344 fOutputList->Add(fHistEvtSelection);
345 fOutputList->Add(fHistJetSelection);
346 fOutputList->Add(fh2JetSelection);
347 if(fbEvent) fOutputList->Add(fhnEvent);
348 if(fbJetsMismatch1) fOutputList->Add(fhnJetsMismatch1);
349 if(fbJetsMismatch2) fOutputList->Add(fhnJetsMismatch2);
350 if(fbJetsRp) fOutputList->Add(fhnJetsRp);
351 if(fbJetsDeltaPt) fOutputList->Add(fhnJetsDeltaPt);
352 if(fbJetsEta) fOutputList->Add(fhnJetsEta);
353 if(fbJetsPhi) fOutputList->Add(fhnJetsPhi);
354 if(fbJetsArea) fOutputList->Add(fhnJetsArea);
355 if(fbJets3Branches) fOutputList->Add(fhnJets3Branches);
356 if(fbJetsBeforeCut1) fOutputList->Add(fhnJetsBeforeCut1);
357 if(fbJetsBeforeCut2) fOutputList->Add(fhnJetsBeforeCut2);
359 // =========== Switch on Sumw2 for all histos ===========
360 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
361 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
366 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
371 TH1::AddDirectory(oldStatus);
373 PostData(1, fOutputList);
376 void AliAnalysisTaskJetResponseV2::UserExec(Option_t *)
378 // load events, apply event cuts, then compare leading jets
380 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
381 AliError("Jet branch name not set.");
385 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
387 AliError("ESD not available");
388 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
390 fAOD = dynamic_cast<AliAODEvent*>(AODEvent());
393 AliError("AOD not available");
397 // -- event selection --
398 fHistEvtSelection->Fill(1); // number of events before event selection
401 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
402 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
403 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
404 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
405 fHistEvtSelection->Fill(2);
406 PostData(1, fOutputList);
411 AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
412 Int_t nTracksPrim = primVtx->GetNContributors();
413 if ((nTracksPrim < fMinContribVtx) ||
414 (primVtx->GetZ() < fVtxZMin) ||
415 (primVtx->GetZ() > fVtxZMax) ){
416 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
417 fHistEvtSelection->Fill(3);
418 PostData(1, fOutputList);
422 // event class selection (from jet helper task)
423 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
424 if(fDebug) Printf("Event class %d", eventClass);
425 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
426 fHistEvtSelection->Fill(4);
427 PostData(1, fOutputList);
431 // centrality selection
432 AliCentrality *cent = 0x0;
433 Float_t centValue = 0.;
434 if(fESD) cent = fESD->GetCentrality();
435 if(cent) centValue = cent->GetCentralityPercentile("V0M");
436 if(fDebug) printf("centrality: %f\n", centValue);
437 if (centValue < fCentMin || centValue > fCentMax){
438 fHistEvtSelection->Fill(4);
439 PostData(1, fOutputList);
444 // multiplicity due to input tracks
445 Int_t nInputTracks = GetNInputTracks();
447 if (nInputTracks < fNInputTracksMin || (fNInputTracksMax > -1 && nInputTracks > fNInputTracksMax)){
448 fHistEvtSelection->Fill(5);
449 PostData(1, fOutputList);
454 fHistEvtSelection->Fill(0); // accepted events
455 // -- end event selection --
458 Double_t pthard = AliAnalysisTaskFastEmbedding::GetPtHard();
459 Int_t pthardbin = GetPtHardBin(pthard);
462 Double_t rp = AliAnalysisHelperJetTasks::ReactionPlane(kFALSE);
464 Double_t eventEntries[3] = { (Double_t)centValue, (Double_t)nInputTracks, rp };
465 fhnEvent->Fill(eventEntries);
470 AliAODJetEventBackground* externalBackground = 0;
471 if(!externalBackground&&fBackgroundBranch.Length()){
472 externalBackground = (AliAODJetEventBackground*)(fAOD->FindListObject(fBackgroundBranch.Data()));
473 //if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
476 if(externalBackground)rho = externalBackground->GetBackground(0);
480 TClonesArray *aodJets[3];
481 aodJets[0] = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fJetBranchName[0].Data())); // in general: embedded jet
482 aodJets[1] = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fJetBranchName[1].Data())); // in general: embedded jet + UE version1
483 if( strlen(fJetBranchName[2].Data()) )
484 aodJets[2] = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fJetBranchName[2].Data())); // in general: embedded jet + UE version2
486 for (Int_t iJetType = 0; iJetType < fkNbranches; iJetType++) {
487 fListJets[iJetType]->Clear();
488 if (!aodJets[iJetType]) continue;
490 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
492 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
493 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
494 if (jet) fListJets[iJetType]->Add(jet);
496 fListJets[iJetType]->Sort();
501 static TArrayI aMatchIndex(fListJets[0]->GetEntries());
502 static TArrayF aPtFraction(fListJets[0]->GetEntries());
503 if(aMatchIndex.GetSize()<fListJets[0]->GetEntries()) aMatchIndex.Set(fListJets[0]->GetEntries());
504 if(aPtFraction.GetSize()<fListJets[0]->GetEntries()) aPtFraction.Set(fListJets[0]->GetEntries());
506 // stores matched jets in 'aMatchIndex' and fraction of pT in 'aPtFraction'
507 AliAnalysisHelperJetTasks::GetJetMatching(fListJets[0], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[0]->GetEntries()),
508 fListJets[1], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[1]->GetEntries()),
509 aMatchIndex, aPtFraction, fDebug, fMatchMaxDist, fIsPbPb?1:2);
510 static TArrayI aMatchIndexv2(fListJets[0]->GetEntries());
511 static TArrayF aPtFractionv2(fListJets[0]->GetEntries());
512 if( strlen(fJetBranchName[2].Data()) ) {
513 if(aMatchIndexv2.GetSize()<fListJets[0]->GetEntries()) aMatchIndexv2.Set(fListJets[0]->GetEntries());
514 if(aPtFractionv2.GetSize()<fListJets[0]->GetEntries()) aPtFractionv2.Set(fListJets[0]->GetEntries());
515 AliAnalysisHelperJetTasks::GetJetMatching(fListJets[0], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[0]->GetEntries()), fListJets[2], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[2]->GetEntries()), aMatchIndexv2, aPtFractionv2, fDebug, fMatchMaxDist, fIsPbPb?1:2);
518 // loop over matched jets
519 Int_t ir = -1; // index of matched reconstruced jet
520 Int_t ir2 = -1; // index of matched reconstruced jet
521 Float_t fraction = -1.;
522 Float_t fraction2 = -1.;
523 AliAODJet *jet[3] = { 0x0, 0x0, 0x0 };
524 Float_t jetEta[3] = { -990., -990., -990. };
525 Float_t jetPhi[3] = { -990., -990., -990. };
526 Float_t jetPt[3] = { -990., -990., -990. };
527 Float_t jetArea[3] = { -990., -990., -990. };
528 Float_t rpJet[3] = { -990., -990., -990. };
531 for(Int_t ig=0; ig<fListJets[0]->GetEntries(); ++ig){
532 ir = aMatchIndex[ig];
533 ir2 = aMatchIndexv2[ig];
536 jet[0] = (AliAODJet*)(fListJets[0]->At(ig));
537 if(ir>=0) jet[1] = (AliAODJet*)(fListJets[1]->At(ir));
539 if(ir2>=0) jet[2] = (AliAODJet*)(fListJets[2]->At(ir2));
542 for(Int_t i=0; i<fkNbranches; ++i){
549 if(i==1) rpBin = -990;
552 jetEta[i] = jet[i]->Eta();
553 jetPhi[i] = jet[i]->Phi();
554 jetPt[i] = GetPt(jet[i], i);
555 jetArea[i] = jet[i]->EffectiveAreaCharged();
556 rpJet[i] = TVector2::Phi_mpi_pi(rp-jetPhi[i]);
557 if(i==1) rpBin = AliAnalysisHelperJetTasks::GetPhiBin(TVector2::Phi_mpi_pi(rp-jetPhi[i]), 3);
560 fraction = aPtFraction[ig];
561 fraction2 = aPtFractionv2[ig];
564 fHistJetSelection->Fill(1); // all probe jets
565 if(jet[0]) fh2JetSelection->Fill(1.,jetPt[0]); // all probe jets
568 fHistJetSelection->Fill(2);
569 if(jet[0]) fh2JetSelection->Fill(2.,jetPt[0]);
572 if(!jet[0]) continue;
573 Double_t jetEntriesMismatch1[7] = {
574 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
575 (Double_t)jetPt[0], (Double_t)jetEta[0], (Double_t)jetPhi[0], (Double_t)jetArea[0]
577 fhnJetsMismatch1->Fill(jetEntriesMismatch1);
583 if(!jet[0] || !jet[1]){
584 fHistJetSelection->Fill(3);
585 if(jet[0]) fh2JetSelection->Fill(3.,jetPt[0]);
589 // look for distance to next rec jet
590 Float_t distNextJet = -0.01; // no neighbor
591 Float_t ptNextJet = -1.;
592 for(Int_t r=0; r<fListJets[1]->GetEntries(); ++r){
594 Float_t tmpDeltaR = jet[1]->DeltaR((AliAODJet*)fListJets[1]->At(r));
595 if(distNextJet<0. || distNextJet>tmpDeltaR){
596 distNextJet = tmpDeltaR;
597 if(fKeepJets) ptNextJet = ((AliAODJet*)fListJets[1]->At(r))->GetPtSubtracted(0);
598 else ptNextJet = ((AliAODJet*)fListJets[1]->At(r))->Pt();
604 //Float_t localRho = jetArea[1]>0. ? (jetPt[1]+rho*jetArea[1] - jetPt[0]) / jetArea[1] : 0.;
605 //Float_t relRho = rho>0. ? localRho / rho : 0.;
608 // calculate parameters of associated jets
609 /* from Leticia, kT clusterizer
610 Float_t par0[4] = { 0.00409, 0.01229, 0.05, 0.26 };
611 Float_t par1[4] = { -2.97035e-03, -2.03182e-03, -1.25702e-03, -9.95107e-04 };
612 Float_t par2[4] = { 1.02865e-01, 1.49039e-01, 1.53910e-01, 1.51109e-01 };
614 // own, from embedded tracks
615 Float_t par0[4] = { 0.02841, 0.05039, 0.09092, 0.24089 };
616 Float_t par1[4] = { -4.26725e-04, -1.15273e-03, -1.56827e-03, -3.08003e-03 };
617 Float_t par2[4] = { 4.95415e-02, 9.79538e-02, 1.32814e-01, 1.71743e-01 };
621 if(eventClass>0&&eventClass<4){
622 rpCorr = par0[eventClass-1] + par1[eventClass-1] * 2*TMath::Cos(rpJet[1]) + par2[eventClass-1] * 2*TMath::Cos(2*rpJet[1]);
623 rpCorr *= rho * jetArea[1];
626 Float_t delta = jetPt[2]-jetPt[1];
627 Float_t deltaPt = jetPt[1]-jetPt[0];
628 Float_t deltaEta = jetEta[1]-jetEta[0];
629 Float_t deltaPhi = TVector2::Phi_mpi_pi(jetPhi[1]-jetPhi[0]);
630 Float_t deltaR = TMath::Sqrt(deltaEta*deltaEta+deltaPhi*deltaPhi);
631 Float_t deltaArea = jetArea[1]-jetArea[0];
634 // fill thnsparse before acceptance cut
635 if(fbJetsBeforeCut1){
636 Double_t jetBeforeCutEntries1[10] = {
637 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
638 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetEta[0], (Double_t)jetEta[1],
639 (Double_t)jetPhi[0], (Double_t)jetPhi[1], (Double_t)fraction
641 fhnJetsBeforeCut1->Fill(jetBeforeCutEntries1);
644 if(fbJetsBeforeCut2){
645 Double_t jetBeforeCutEntries2[10] = {
646 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
647 (Double_t)jetPt[0], (Double_t)jetPt[1],
648 (Double_t)jetEta[0], (Double_t)jetEta[1],
649 (Double_t)deltaPt, (Double_t)deltaEta, (Double_t)deltaR
651 fhnJetsBeforeCut2->Fill(jetBeforeCutEntries2);
655 Bool_t jetAccepted = kTRUE;
656 // minimum fraction required
657 if(fraction<fJetPtFractionMin){
658 fHistJetSelection->Fill(4);
659 fh2JetSelection->Fill(4.,jetPt[0]);
660 jetAccepted = kFALSE;
664 // jet acceptance + minimum pT check
665 if(jetEta[0]>fJetEtaMax || jetEta[0]<fJetEtaMin ||
666 jetEta[1]>fJetEtaMax || jetEta[1]<fJetEtaMin){
669 Printf("Jet not in eta acceptance.");
670 Printf("[0]: jet %d eta %.2f", ig, jetEta[0]);
671 Printf("[1]: jet %d eta %.2f", ir, jetEta[1]);
673 fHistJetSelection->Fill(5);
674 fh2JetSelection->Fill(5.,jetPt[0]);
675 jetAccepted = kFALSE;
679 if(jetPt[0] < fJetPtMin){
680 if(fDebug) Printf("Jet %d (pT %.1f GeV/c) has less than required pT.", ir, jetPt[0]);
681 fHistJetSelection->Fill(6);
682 fh2JetSelection->Fill(6.,jetPt[0]);
683 jetAccepted = kFALSE;
688 if(jet[1]->Trigger()&fJetTriggerExcludeMask){
689 fHistJetSelection->Fill(7);
690 fh2JetSelection->Fill(7.,jetPt[0]);
691 jetAccepted = kFALSE;
698 Double_t jetEntriesMismatch2[10] = {
699 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
700 (Double_t)jetPt[0], (Double_t)jetPt[1],
701 (Double_t)jetEta[0], (Double_t)jetEta[1],
702 (Double_t)deltaEta, (Double_t)deltaR,
705 fhnJetsMismatch2->Fill(jetEntriesMismatch2);
711 fHistJetSelection->Fill(0);
712 fh2JetSelection->Fill(0.,jetPt[0]);
716 Double_t jetEntriesRp[11] = {
717 (Double_t)centValue, (Double_t)nInputTracks, (Double_t) rp,
718 (Double_t)rpBin, (Double_t)rpJet[0], (Double_t)rpJet[1],
719 (Double_t)jetPt[0], (Double_t)deltaPt, (Double_t)rho, (Double_t)rpCorr,
722 fhnJetsRp->Fill(jetEntriesRp);
726 Double_t jetEntriesDeltaPt[8] = {
727 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
728 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)deltaPt, (Double_t)deltaArea,
731 fhnJetsDeltaPt->Fill(jetEntriesDeltaPt);
735 Double_t jetEntriesEta[11] = {
736 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
737 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetEta[0], (Double_t)jetEta[1],
738 (Double_t)deltaPt, (Double_t)deltaEta, (Double_t)deltaR,
741 fhnJetsEta->Fill(jetEntriesEta);
745 Double_t jetEntriesPhi[10] = {
746 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
747 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetPhi[0], (Double_t)jetPhi[1],
748 (Double_t)deltaPt, (Double_t)deltaPhi,
751 fhnJetsPhi->Fill(jetEntriesPhi);
755 Double_t jetEntriesArea[14] = {
756 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
757 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetArea[0], (Double_t)jetArea[1],
758 (Double_t)deltaPt, (Double_t)deltaR, (Double_t)deltaArea,
759 (Double_t)fraction, (Double_t)distNextJet, (Double_t)ptNextJet,
762 fhnJetsArea->Fill(jetEntriesArea);
766 Double_t jetEntries3Branches[14] = {
767 (Double_t)centValue, (Double_t)nInputTracks,
768 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetPt[2],
769 (Double_t)deltaPt, (Double_t)delta,
770 (Double_t)jetArea[0], (Double_t)jetArea[1],(Double_t)jetArea[3],
771 (Double_t)fraction, (Double_t)fraction2,
774 fhnJets3Branches->Fill(jetEntries3Branches);
779 PostData(1, fOutputList);
782 void AliAnalysisTaskJetResponseV2::Terminate(const Option_t *)
784 // Draw result to the screen
785 // Called once at the end of the query
787 if (!GetOutputData(1))
791 Int_t AliAnalysisTaskJetResponseV2::GetNInputTracks()
793 // number of tracks in the event, obtained via jet finder
795 Int_t nInputTracks = 0;
797 TString jbname(fJetBranchName[1]);
798 //needs complete event, use jets without background subtraction
799 for(Int_t i=1; i<=3; ++i){
800 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
803 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
804 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
806 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
807 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(jbname.Data()));
809 Printf("Jet branch %s not found", jbname.Data());
810 Printf("AliAnalysisTaskJetResponseV2::GetNInputTracks FAILED");
814 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
815 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
817 TRefArray *trackList = jet->GetRefTracks();
818 Int_t nTracks = trackList->GetEntriesFast();
819 nInputTracks += nTracks;
820 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
822 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
827 THnSparse* AliAnalysisTaskJetResponseV2::NewTHnSparseF(const char* name, UInt_t entries, UInt_t opt)
829 // generate new THnSparseF, axes are defined in GetDimParams()
832 UInt_t tmp = entries;
835 tmp = tmp &~ -tmp; // clear lowest bit
838 TString hnTitle(name);
839 const Int_t dim = count;
846 while(c<dim && i<32){
848 Bool_t highres = opt&(1<<i);
850 GetDimParams(i, highres, label, nbins[c], xmin[c], xmax[c]);
851 hnTitle += Form(";%s",label.Data());
859 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
862 void AliAnalysisTaskJetResponseV2::GetDimParams(Int_t iEntry, Bool_t hr, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
864 // stores label and binning of axis for THnSparse
866 const Double_t pi = TMath::Pi();
871 label = "V0 centrality (%)";
885 label = "nb. of input tracks";
905 label = "event plane #psi";
919 label = "event plane bin";
928 if(iEntry==4)label = "#Delta#phi(RP-jet) (probe)";
929 if(iEntry==5)label = "#Delta#phi(RP-jet) (rec)";
938 if(iEntry==6)label = "probe p_{T} (GeV/c)";
939 if(iEntry==7)label = "rec p_{T} (GeV/c)";
954 if(iEntry==8)label = "probe #eta";
955 if(iEntry==9)label = "rec #eta";
970 if(iEntry==10)label = "probe #phi";
971 if(iEntry==11)label = "rec #phi";
973 nbins = 90; // modulo 18 (sectors)
986 if(iEntry==12)label = "probe area";
987 if(iEntry==13)label = "rec area";
1000 label = "#Delta p_{T}";
1013 label = "#Delta#eta";
1027 label = "#Delta#phi";
1055 label = "#Deltaarea";
1083 label = "distance to closest rec jet";
1097 label = "p_{T} of closest rec jet";
1111 label = "abs. correction of #rho for RP";
1118 label = "local #rho";
1125 label = "local #rho / #rho";
1132 label = "p_{T,hard} bin";
1142 //____________________________________________________________________________
1143 Int_t AliAnalysisTaskJetResponseV2::GetPtHardBin(Double_t ptHard){
1145 // returns pt hard bin (for LHC10e14, LHC11a1x, LHC11a2x simulations)
1147 const Int_t nBins = 10;
1148 Double_t binLimits[nBins] = { 5., 11., 21., 36., 57., 84., 117., 156., 200., 249. }; // lower limits
1151 while(bin<nBins-1 && binLimits[bin+1]<ptHard){
1158 //____________________________________________________________________________
1159 Double_t AliAnalysisTaskJetResponseV2::GetPt(AliAODJet *j, Int_t mode=0){
1161 // returns jet pt, also negative pt after background subtraction if available
1165 if(fKeepJets && mode>0){ // background subtracted pt, can be negative
1166 pt = j->GetPtSubtracted(0);
1169 pt = j->Pt(); // if negative, pt=0.01