12 #include "AliAnalysisTask.h"
13 #include "AliAnalysisManager.h"
15 #include "AliVEvent.h"
16 #include "AliESDEvent.h"
17 #include "AliESDInputHandler.h"
18 #include "AliCentrality.h"
19 #include "AliAnalysisHelperJetTasks.h"
20 #include "AliInputEventHandler.h"
21 #include "AliAODJetEventBackground.h"
23 #include "AliAODEvent.h"
24 #include "AliAODJet.h"
26 #include "AliAnalysisTaskJetResponseV2.h"
28 ClassImp(AliAnalysisTaskJetResponseV2)
30 AliAnalysisTaskJetResponseV2::AliAnalysisTaskJetResponseV2() :
34 fBackgroundBranch(""),
36 fOfflineTrgMask(AliVEvent::kAny),
49 fJetPtFractionMin(0.5),
56 fbJetsMismatch1(kTRUE),
57 fbJetsMismatch2(kTRUE),
63 fbJetsBeforeCut1(kTRUE),
64 fbJetsBeforeCut2(kTRUE),
65 fHistEvtSelection(0x0),
66 fHistJetSelection(0x0),
68 fhnJetsMismatch1(0x0),
69 fhnJetsMismatch2(0x0),
75 fhnJetsBeforeCut1(0x0),
76 fhnJetsBeforeCut2(0x0)
78 // default Constructor
80 fJetBranchName[0] = "";
81 fJetBranchName[1] = "";
83 fListJets[0] = new TList;
84 fListJets[1] = new TList;
87 AliAnalysisTaskJetResponseV2::AliAnalysisTaskJetResponseV2(const char *name) :
88 AliAnalysisTaskSE(name),
91 fBackgroundBranch(""),
93 fOfflineTrgMask(AliVEvent::kAny),
102 fNInputTracksMax(-1),
106 fJetPtFractionMin(0.5),
113 fbJetsMismatch1(kTRUE),
114 fbJetsMismatch2(kTRUE),
116 fbJetsDeltaPt(kTRUE),
120 fbJetsBeforeCut1(kTRUE),
121 fbJetsBeforeCut2(kTRUE),
122 fHistEvtSelection(0x0),
123 fHistJetSelection(0x0),
125 fhnJetsMismatch1(0x0),
126 fhnJetsMismatch2(0x0),
132 fhnJetsBeforeCut1(0x0),
133 fhnJetsBeforeCut2(0x0)
137 fJetBranchName[0] = "";
138 fJetBranchName[1] = "";
140 fListJets[0] = new TList;
141 fListJets[1] = new TList;
143 DefineOutput(1, TList::Class());
146 AliAnalysisTaskJetResponseV2::~AliAnalysisTaskJetResponseV2()
152 void AliAnalysisTaskJetResponseV2::SetBranchNames(const TString &branch1, const TString &branch2)
154 fJetBranchName[0] = branch1;
155 fJetBranchName[1] = branch2;
158 void AliAnalysisTaskJetResponseV2::Init()
161 // check for jet branches
162 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
163 AliError("Jet branch name not set.");
168 void AliAnalysisTaskJetResponseV2::UserCreateOutputObjects()
173 if(!fOutputList) fOutputList = new TList;
174 fOutputList->SetOwner(kTRUE);
176 Bool_t oldStatus = TH1::AddDirectoryStatus();
177 TH1::AddDirectory(kFALSE);
180 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
181 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
182 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
183 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
184 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
185 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
186 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
188 fHistJetSelection = new TH1I("fHistJetSelection", "jet selection", 7, -0.5, 6.5);
189 fHistJetSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
190 fHistJetSelection->GetXaxis()->SetBinLabel(2,"probes IN");
191 fHistJetSelection->GetXaxis()->SetBinLabel(3,"no matching jet");
192 fHistJetSelection->GetXaxis()->SetBinLabel(4,"not in list");
193 fHistJetSelection->GetXaxis()->SetBinLabel(5,"fraction cut");
194 fHistJetSelection->GetXaxis()->SetBinLabel(6,"acceptance cut");
195 fHistJetSelection->GetXaxis()->SetBinLabel(7,"p_{T} cut");
198 UInt_t entries = 0; // bit coded, see GetDimParams() below
199 UInt_t opt = 0; // bit coded, default (0) or high resolution (1)
202 entries = 1<<0 | 1<<1 | 1<<2; // cent : nInpTrks : rp psi
203 opt = 1<<0 | 1<<1; // centrality and nInpTrks in high resolution
204 fhnEvent = NewTHnSparseF("fhnEvent", entries, opt);
207 if(fbJetsMismatch1){ // real mismatch (no related rec jet found)
208 // cent : nInpTrks : rp bins : probe pt : probe eta : probe phi : probe area
209 entries = 1<<0 | 1<<1 | 1<<3 | 1<<6 | 1<<8 | 1<<10 | 1<<12;
210 opt = 1<<6 | 1<<8 | 1<<10;
211 fhnJetsMismatch1 = NewTHnSparseF("fhnJetsMismatch1", entries, opt);
214 if(fbJetsMismatch2){ // acceptance + fraction cut
215 // cent : nInpTrks : rp bins : jetPt(2x) : jetEta(2x) : deltaEta : deltaR : fraction
216 entries = 1<<0 | 1<<1 | 1<<3 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<15 | 1<<17 | 1<<19;
217 opt = 1<<6 | 1<<7 | 1<<8 | 1<<9;
218 fhnJetsMismatch2 = NewTHnSparseF("fhnJetsMismatch2", entries, opt);
224 // cent : nInpTrks : rp bins : rp wrt jet(2x) : probe pT : probe area: deltaPt : rp phi : rho : correction for RP : local rho
226 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;
228 // cent : nInpTrks : rp bins : rp wrt jet(2x) : probe pT : deltaPt : rp phi : rho : correction for RP
229 entries = 1<<0 | 1<<1 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<14 | 1<<2 | 1<<22 | 1<<23;
231 fhnJetsRp = NewTHnSparseF("fhnJetsRp", entries, opt);
234 // cent : nInpTrks : rp bins: deltaPt : jetPt(2x) : deltaArea (hr delta pt)
236 entries = 1<<0 | 1<<1 | 1<<3 | 1<<14 | 1<<6 | 1<<7 | 1<<18;
237 opt = 1<<1 | 1<<14 | 1<<6 | 1<<7 | 1<<18;
238 fhnJetsDeltaPt = NewTHnSparseF("fhnJetsDeltaPt", entries, opt);
241 // cent : nInpTrks : rp bins : deltaPt : jetPt(2x) : deltaR : deltaEta : jetEta(2x) (hr for eta)
243 entries = 1<<0 | 1<<1 | 1<<3 | 1<<14 | 1<<6 | 1<<7 | 1<<17 | 1<<15 | 1<<8 | 1<<9;
244 opt = 1<<15 | 1<<8 | 1<<9;
245 fhnJetsEta = NewTHnSparseF("fhnJetsEta", entries, opt);
248 // cent : nInpTrks : rp bins : jetPt(2x) : jetPhi(2x) : deltaPt : deltaPhi
250 entries = 1<<0 | 1<<1 | 1<<3 | 1<<6 | 1<<7 | 1<<10 | 1<<11 | 1<<14 | 1<<16;
252 fhnJetsPhi = NewTHnSparseF("fhnJetsPhi", entries, opt);
255 // cent : nInpTrks : rp bins : deltaArea : jetArea(2x) : deltaR : fraction : distance next rec jet : pT next jet : deltaPt : jetPt(2x) (hr for area)
257 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;
258 opt = 1<<18 | 1<<12 | 1<<13;
259 fhnJetsArea = NewTHnSparseF("fhnJetsArea", entries, opt);
265 // cent : nInpTrks : rp bins : fraction : jetPt(2x) : jetEta(2x) : jetPhi(2x) (low resolution) (with fraction, eta, phi, pt cuts possible)
266 if(fbJetsBeforeCut1){
267 entries = 1<<0 | 1<<1 | 1<<3 | 1<<19 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<10 | 1<<11;
269 fhnJetsBeforeCut1 = NewTHnSparseF("fhnJetsBeforeCut1", entries, opt);
272 // cent : nInpTrks : rp bins : deltaPt : jetPt(2x) : deltaR : deltaEta : jetEta(2x) (low resolution)
273 if(fbJetsBeforeCut2){
274 entries = 1<<0 | 1<<1 | 1<<3 | 1<<14 | 1<<6 | 1<<7 | 1<<17 | 1<<15 | 1<<8 | 1<<9;
276 fhnJetsBeforeCut2 = NewTHnSparseF("fhnJetsBeforeCut2", entries, opt);
279 fOutputList->Add(fHistEvtSelection);
280 fOutputList->Add(fHistJetSelection);
281 if(fbEvent) fOutputList->Add(fhnEvent);
282 if(fbJetsMismatch1) fOutputList->Add(fhnJetsMismatch1);
283 if(fbJetsMismatch2) fOutputList->Add(fhnJetsMismatch2);
284 if(fbJetsRp) fOutputList->Add(fhnJetsRp);
285 if(fbJetsDeltaPt) fOutputList->Add(fhnJetsDeltaPt);
286 if(fbJetsEta) fOutputList->Add(fhnJetsEta);
287 if(fbJetsPhi) fOutputList->Add(fhnJetsPhi);
288 if(fbJetsArea) fOutputList->Add(fhnJetsArea);
289 if(fbJetsBeforeCut1) fOutputList->Add(fhnJetsBeforeCut1);
290 if(fbJetsBeforeCut2) fOutputList->Add(fhnJetsBeforeCut2);
292 // =========== Switch on Sumw2 for all histos ===========
293 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
294 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
299 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
304 TH1::AddDirectory(oldStatus);
306 PostData(1, fOutputList);
309 void AliAnalysisTaskJetResponseV2::UserExec(Option_t *)
311 // load events, apply event cuts, then compare leading jets
313 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
314 AliError("Jet branch name not set.");
318 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
320 AliError("ESD not available");
321 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
323 fAOD = dynamic_cast<AliAODEvent*>(AODEvent());
326 AliError("AOD not available");
330 // -- event selection --
331 fHistEvtSelection->Fill(1); // number of events before event selection
334 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
335 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
336 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
337 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
338 fHistEvtSelection->Fill(2);
339 PostData(1, fOutputList);
344 AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
345 Int_t nTracksPrim = primVtx->GetNContributors();
346 if ((nTracksPrim < fMinContribVtx) ||
347 (primVtx->GetZ() < fVtxZMin) ||
348 (primVtx->GetZ() > fVtxZMax) ){
349 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
350 fHistEvtSelection->Fill(3);
351 PostData(1, fOutputList);
355 // event class selection (from jet helper task)
356 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
357 if(fDebug) Printf("Event class %d", eventClass);
358 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
359 fHistEvtSelection->Fill(4);
360 PostData(1, fOutputList);
364 // centrality selection
365 AliCentrality *cent = 0x0;
366 Float_t centValue = 0.;
367 if(fESD) cent = fESD->GetCentrality();
368 if(cent) centValue = cent->GetCentralityPercentile("V0M");
369 if(fDebug) printf("centrality: %f\n", centValue);
370 if (centValue < fCentMin || centValue > fCentMax){
371 fHistEvtSelection->Fill(4);
372 PostData(1, fOutputList);
377 // multiplicity due to input tracks
378 Int_t nInputTracks = GetNInputTracks();
380 if (nInputTracks < fNInputTracksMin || (fNInputTracksMax > -1 && nInputTracks > fNInputTracksMax)){
381 fHistEvtSelection->Fill(5);
382 PostData(1, fOutputList);
387 fHistEvtSelection->Fill(0); // accepted events
388 // -- end event selection --
390 Double_t rp = AliAnalysisHelperJetTasks::ReactionPlane(kFALSE);
392 Double_t eventEntries[3] = { (Double_t)centValue, (Double_t)nInputTracks, rp };
393 fhnEvent->Fill(eventEntries);
398 AliAODJetEventBackground* externalBackground = 0;
399 if(!externalBackground&&fBackgroundBranch.Length()){
400 externalBackground = (AliAODJetEventBackground*)(fAOD->FindListObject(fBackgroundBranch.Data()));
401 //if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
404 if(externalBackground)rho = externalBackground->GetBackground(0);
408 TClonesArray *aodJets[2];
409 aodJets[0] = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fJetBranchName[0].Data())); // in general: embedded jet
410 aodJets[1] = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fJetBranchName[1].Data())); // in general: embedded jet + UE
414 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
415 fListJets[iJetType]->Clear();
416 if (!aodJets[iJetType]) continue;
418 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
420 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
421 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
422 if (jet) fListJets[iJetType]->Add(jet);
424 fListJets[iJetType]->Sort();
429 static TArrayI aMatchIndex(fListJets[0]->GetEntries());
430 static TArrayF aPtFraction(fListJets[0]->GetEntries());
431 if(aMatchIndex.GetSize()<fListJets[0]->GetEntries()) aMatchIndex.Set(fListJets[0]->GetEntries());
432 if(aPtFraction.GetSize()<fListJets[0]->GetEntries()) aPtFraction.Set(fListJets[0]->GetEntries());
434 // stores matched jets in 'aMatchIndex' and fraction of pT in 'aPtFraction'
435 AliAnalysisHelperJetTasks::GetJetMatching(fListJets[0], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[0]->GetEntries()),
436 fListJets[1], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[1]->GetEntries()),
437 aMatchIndex, aPtFraction, fDebug, fMatchMaxDist, fIsPbPb?1:2);
439 // loop over matched jets
440 Int_t ir = -1; // index of matched reconstruced jet
441 Float_t fraction = -1.;
442 AliAODJet *jet[2] = { 0x0, 0x0 };
443 Float_t jetEta[2] = { -990., -990. };
444 Float_t jetPhi[2] = { -990., -990. };
445 Float_t jetPt[2] = { -990., -990. };
446 Float_t jetArea[2] = { -990., -990. };
447 Float_t rpJet[2] = { -990., -990. };
449 for(Int_t ig=0; ig<fListJets[0]->GetEntries(); ++ig){
450 fHistJetSelection->Fill(1); // all probe jets
451 ir = aMatchIndex[ig];
453 fHistJetSelection->Fill(2);
456 jet[0] = (AliAODJet*)(fListJets[0]->At(ig));
457 if(!jet[0]) continue;
458 jetEta[0] = jet[0]->Eta();
459 jetPhi[0] = jet[0]->Phi();
460 jetPt[0] = jet[0]->Pt();
461 jetArea[0] = jet[0]->EffectiveAreaCharged();
462 rpJet[0] = TVector2::Phi_mpi_pi(rp-jetPhi[0]);
464 Int_t rpBin = AliAnalysisHelperJetTasks::GetPhiBin(TVector2::Phi_mpi_pi(rp-jetPhi[0]), 3);
466 Double_t jetEntriesMismatch1[7] = {
467 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
468 (Double_t)jetPt[0], (Double_t)jetEta[0], (Double_t)jetPhi[0], (Double_t)jetArea[0]
470 fhnJetsMismatch1->Fill(jetEntriesMismatch1);
475 fraction = aPtFraction[ig];
478 jet[0] = (AliAODJet*)(fListJets[0]->At(ig));
479 jet[1] = (AliAODJet*)(fListJets[1]->At(ir));
480 if(!jet[0] || !jet[1]){
481 fHistJetSelection->Fill(3);
485 // look for distance to next rec jet
486 Float_t distNextJet = -0.01; // no neighbor
487 Float_t ptNextJet = -1.;
488 for(Int_t r=0; r<fListJets[1]->GetEntries(); ++r){
490 Float_t tmpDeltaR = jet[1]->DeltaR((AliAODJet*)fListJets[1]->At(r));
491 if(distNextJet<0. || distNextJet>tmpDeltaR){
492 distNextJet = tmpDeltaR;
493 ptNextJet = ((AliAODJet*)fListJets[1]->At(r))->Pt();
498 for(Int_t i=0; i<fkNbranches; ++i){
499 jetEta[i] = jet[i]->Eta();
500 jetPhi[i] = jet[i]->Phi();
501 jetPt[i] = jet[i]->Pt();
502 jetArea[i] = jet[i]->EffectiveAreaCharged();
503 rpJet[i] = TVector2::Phi_mpi_pi(rp-jetPhi[i]);
505 Int_t rpBin = AliAnalysisHelperJetTasks::GetPhiBin(TVector2::Phi_mpi_pi(rp-jetPhi[1]), 3);
506 //Float_t localRho = jetArea[1]>0. ? (jetPt[1]+rho*jetArea[1] - jetPt[0]) / jetArea[1] : 0.;
507 //Float_t relRho = rho>0. ? localRho / rho : 0.;
510 // calculate parameters of associated jets
511 /* from Leticia, kT clusterizer
512 Float_t par0[4] = { 0.00409, 0.01229, 0.05, 0.26 };
513 Float_t par1[4] = { -2.97035e-03, -2.03182e-03, -1.25702e-03, -9.95107e-04 };
514 Float_t par2[4] = { 1.02865e-01, 1.49039e-01, 1.53910e-01, 1.51109e-01 };
516 // own, from embedded tracks
517 Float_t par0[4] = { 0.02841, 0.05039, 0.09092, 0.24089 };
518 Float_t par1[4] = { -4.26725e-04, -1.15273e-03, -1.56827e-03, -3.08003e-03 };
519 Float_t par2[4] = { 4.95415e-02, 9.79538e-02, 1.32814e-01, 1.71743e-01 };
523 if(eventClass>0&&eventClass<4){
524 rpCorr = par0[eventClass-1] + par1[eventClass-1] * 2*TMath::Cos(rpJet[1]) + par2[eventClass-1] * 2*TMath::Cos(2*rpJet[1]);
525 rpCorr *= rho * jetArea[1];
528 Float_t deltaPt = jetPt[1]-jetPt[0];
529 Float_t deltaEta = jetEta[1]-jetEta[0];
530 Float_t deltaPhi = TVector2::Phi_mpi_pi(jetPhi[1]-jetPhi[0]);
531 Float_t deltaR = TMath::Sqrt(deltaEta*deltaEta+deltaPhi*deltaPhi);
532 Float_t deltaArea = jetArea[1]-jetArea[0];
535 // fill thnsparse before acceptance cut
536 if(fbJetsBeforeCut1){
537 Double_t jetBeforeCutEntries1[10] = {
538 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
539 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetEta[0], (Double_t)jetEta[1],
540 (Double_t)jetPhi[0], (Double_t)jetPhi[1], (Double_t)fraction
542 fhnJetsBeforeCut1->Fill(jetBeforeCutEntries1);
545 if(fbJetsBeforeCut2){
546 Double_t jetBeforeCutEntries2[10] = {
547 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
548 (Double_t)jetPt[0], (Double_t)jetPt[1],
549 (Double_t)jetEta[0], (Double_t)jetEta[1],
550 (Double_t)deltaPt, (Double_t)deltaEta, (Double_t)deltaR
552 fhnJetsBeforeCut2->Fill(jetBeforeCutEntries2);
555 Bool_t jetAccepted = kTRUE;
556 // minimum fraction required
557 if(fraction<fJetPtFractionMin){
558 fHistJetSelection->Fill(4);
559 jetAccepted = kFALSE;
563 // jet acceptance + minimum pT check
564 if(jetEta[0]>fJetEtaMax || jetEta[0]<fJetEtaMin ||
565 jetEta[1]>fJetEtaMax || jetEta[1]<fJetEtaMin){
568 Printf("Jet not in eta acceptance.");
569 Printf("[0]: jet %d eta %.2f", ig, jetEta[0]);
570 Printf("[1]: jet %d eta %.2f", ir, jetEta[1]);
572 fHistJetSelection->Fill(5);
573 jetAccepted = kFALSE;
577 if(jetPt[1] < fJetPtMin){
578 if(fDebug) Printf("Jet %d (pT %.1f GeV/c) has less than required pT.", ir, jetPt[1]);
579 fHistJetSelection->Fill(6);
580 jetAccepted = kFALSE;
586 Double_t jetEntriesMismatch2[10] = {
587 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
588 (Double_t)jetPt[0], (Double_t)jetPt[1],
589 (Double_t)jetEta[0], (Double_t)jetEta[1],
590 (Double_t)deltaEta, (Double_t)deltaR,
593 fhnJetsMismatch2->Fill(jetEntriesMismatch2);
599 fHistJetSelection->Fill(0);
603 Double_t jetEntriesRp[10] = {
604 (Double_t)centValue, (Double_t)nInputTracks, (Double_t) rp,
605 (Double_t)rpBin, (Double_t)rpJet[0], (Double_t)rpJet[1],
606 (Double_t)jetPt[0], (Double_t)deltaPt, (Double_t)rho, (Double_t)rpCorr
608 fhnJetsRp->Fill(jetEntriesRp);
612 Double_t jetEntriesDeltaPt[7] = {
613 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
614 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)deltaPt, (Double_t)deltaArea
616 fhnJetsDeltaPt->Fill(jetEntriesDeltaPt);
620 Double_t jetEntriesEta[10] = {
621 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
622 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetEta[0], (Double_t)jetEta[1],
623 (Double_t)deltaPt, (Double_t)deltaEta, (Double_t)deltaR
625 fhnJetsEta->Fill(jetEntriesEta);
629 Double_t jetEntriesPhi[9] = {
630 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
631 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetPhi[0], (Double_t)jetPhi[1],
632 (Double_t)deltaPt, (Double_t)deltaPhi
634 fhnJetsPhi->Fill(jetEntriesPhi);
638 Double_t jetEntriesArea[13] = {
639 (Double_t)centValue, (Double_t)nInputTracks, (Double_t)rpBin,
640 (Double_t)jetPt[0], (Double_t)jetPt[1], (Double_t)jetArea[0], (Double_t)jetArea[1],
641 (Double_t)deltaPt, (Double_t)deltaR, (Double_t)deltaArea,
642 (Double_t)fraction, (Double_t)distNextJet, (Double_t)ptNextJet
644 fhnJetsArea->Fill(jetEntriesArea);
649 PostData(1, fOutputList);
652 void AliAnalysisTaskJetResponseV2::Terminate(const Option_t *)
654 // Draw result to the screen
655 // Called once at the end of the query
657 if (!GetOutputData(1))
661 Int_t AliAnalysisTaskJetResponseV2::GetNInputTracks()
664 Int_t nInputTracks = 0;
666 TString jbname(fJetBranchName[1]);
667 //needs complete event, use jets without background subtraction
668 for(Int_t i=1; i<=3; ++i){
669 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
672 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
673 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
675 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
676 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(fAOD->FindListObject(jbname.Data()));
678 Printf("Jet branch %s not found", jbname.Data());
679 Printf("AliAnalysisTaskJetResponseV2::GetNInputTracks FAILED");
683 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
684 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
686 TRefArray *trackList = jet->GetRefTracks();
687 Int_t nTracks = trackList->GetEntriesFast();
688 nInputTracks += nTracks;
689 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
691 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
696 THnSparse* AliAnalysisTaskJetResponseV2::NewTHnSparseF(const char* name, UInt_t entries, UInt_t opt)
699 UInt_t tmp = entries;
702 tmp = tmp &~ -tmp; // clear lowest bit
705 TString hnTitle(name);
706 const Int_t dim = count;
713 while(c<dim && i<32){
715 Bool_t highres = opt&(1<<i);
717 GetDimParams(i, highres, label, nbins[c], xmin[c], xmax[c]);
718 hnTitle += Form(";%s",label.Data());
726 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
729 void AliAnalysisTaskJetResponseV2::GetDimParams(Int_t iEntry, Bool_t hr, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
732 const Double_t pi = TMath::Pi();
737 label = "V0 centrality (%)";
751 label = "nb. of input tracks";
771 label = "event plane #psi";
785 label = "event plane bin";
794 if(iEntry==4)label = "#Delta#phi(RP-jet) (probe)";
795 if(iEntry==5)label = "#Delta#phi(RP-jet) (rec)";
804 if(iEntry==6)label = "probe p_{T} (GeV/c)";
805 if(iEntry==7)label = "rec p_{T} (GeV/c)";
820 if(iEntry==8)label = "probe #eta";
821 if(iEntry==9)label = "rec #eta";
836 if(iEntry==10)label = "probe #phi";
837 if(iEntry==11)label = "rec #phi";
839 nbins = 90; // modulo 18 (sectors)
852 if(iEntry==12)label = "probe area";
853 if(iEntry==13)label = "rec area";
866 label = "#Delta p_{T}";
879 label = "#Delta#eta";
893 label = "#Delta#phi";
921 label = "#Deltaarea";
949 label = "distance to closest rec jet";
963 label = "p_{T} of closest rec jet";
977 label = "abs. correction of #rho for RP";
984 label = "local #rho";
991 label = "local #rho / #rho";