1 // ******************************************
2 // This task computes several jet observables like
3 // the fraction of energy in inner and outer coronnas,
4 // jet-track correlations,triggered jet shapes and
5 // correlation strength distribution of particles inside jets.
6 // Author: lcunquei@cern.ch
7 // *******************************************
10 /**************************************************************************
11 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
13 * Author: The ALICE Off-line Project. *
14 * Contributors are mentioned in the code where appropriate. *
16 * Permission to use, copy, modify and distribute this software and its *
17 * documentation strictly for non-commercial purposes is hereby granted *
18 * without fee, provided that the above copyright notice appears in all *
19 * copies and that both the copyright notice and this permission notice *
20 * appear in the supporting documentation. The authors make no claims *
21 * about the suitability of this software for any purpose. It is *
22 * provided "as is" without express or implied warranty. *
23 **************************************************************************/
32 #include "THnSparse.h"
34 #include "TMatrixDSym.h"
35 #include "TMatrixDSymEigen.h"
40 #include "AliAnalysisTask.h"
41 #include "AliAnalysisManager.h"
43 #include "AliVEvent.h"
44 #include "AliESDEvent.h"
45 #include "AliESDInputHandler.h"
46 #include "AliCentrality.h"
47 #include "AliAnalysisHelperJetTasks.h"
48 #include "AliInputEventHandler.h"
49 #include "AliAODJetEventBackground.h"
50 #include "AliAODMCParticle.h"
51 #include "AliAnalysisTaskFastEmbedding.h"
52 #include "AliAODEvent.h"
53 #include "AliAODHandler.h"
54 #include "AliAODJet.h"
56 #include "AliAnalysisTaskJetAntenna.h"
61 ClassImp(AliAnalysisTaskJetAntenna)
63 AliAnalysisTaskJetAntenna::AliAnalysisTaskJetAntenna() :
69 fBackgroundBranch(""),
72 fOfflineTrgMask(AliVEvent::kAny),
86 fApplySharedClusterCut(0),
87 fTrackTypeRec(kTrackUndef),
100 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
101 fJetPtFractionMin(0.5),
108 fHistEvtSelection(0x0),
113 // default Constructor
115 fJetBranchName[0] = "";
116 fJetBranchName[1] = "";
118 fListJets[0] = new TList;
119 fListJets[1] = new TList;
122 AliAnalysisTaskJetAntenna::AliAnalysisTaskJetAntenna(const char *name) :
123 AliAnalysisTaskSE(name),
128 fBackgroundBranch(""),
131 fOfflineTrgMask(AliVEvent::kAny),
138 fFilterMaskBestPt(0),
143 fNInputTracksMax(-1),
145 fApplySharedClusterCut(0),
146 fTrackTypeRec(kTrackUndef),
159 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
160 fJetPtFractionMin(0.5),
167 fHistEvtSelection(0x0),
175 fJetBranchName[0] = "";
176 fJetBranchName[1] = "";
178 fListJets[0] = new TList;
179 fListJets[1] = new TList;
181 DefineOutput(1, TList::Class());
184 AliAnalysisTaskJetAntenna::~AliAnalysisTaskJetAntenna()
190 void AliAnalysisTaskJetAntenna::SetBranchNames(const TString &branch1, const TString &branch2)
192 fJetBranchName[0] = branch1;
193 fJetBranchName[1] = branch2;
196 void AliAnalysisTaskJetAntenna::Init()
199 // check for jet branches
200 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
201 AliError("Jet branch name not set.");
206 void AliAnalysisTaskJetAntenna::UserCreateOutputObjects()
211 if(!fOutputList) fOutputList = new TList;
212 fOutputList->SetOwner(kTRUE);
214 Bool_t oldStatus = TH1::AddDirectoryStatus();
215 TH1::AddDirectory(kFALSE);
217 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
218 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
219 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
220 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
221 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
222 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
223 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
224 fOutputList->Add(fHistEvtSelection);
225 fh1JetEntries=new TH1F("JetEntries","",150,0,150);
226 fOutputList->Add(fh1JetEntries);
227 fh2Circularity=new TH2F("Circcularity","",10,0,1,150,0,150);
228 fOutputList->Add(fh2Circularity);
229 Int_t nbinsJet[8]={10,9,7,9,36,10,2,10};
230 Double_t binlowJet[8]= {0,0, 0, 0,-0.5*TMath::Pi(),0,0,-0.5};
231 Double_t binupJet[8]= {100,0.9, 150,150,1.5*TMath::Pi(),1,200,9.5};
232 fhnJetTM = new THnSparseF("fhnJetTM", "fhnJetTM; cent;dr;pt_jet;pt_track;phi;circ;nc;pthard",8,nbinsJet,binlowJet,binupJet);
233 Double_t *xPt3=new Double_t[10];
235 for(Int_t i = 1;i<=9;i++){
236 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
237 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
238 else xPt3[i] = xPt3[i-1] + 150.; // 18
240 fhnJetTM->SetBinEdges(3,xPt3);
242 Double_t *xPt2=new Double_t[10];
252 fhnJetTM->SetBinEdges(2,xPt2);
253 fOutputList->Add(fhnJetTM);
256 // =========== Switch on Sumw2 for all histos ===========
257 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
258 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
263 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
268 TH1::AddDirectory(oldStatus);
270 PostData(1, fOutputList);
273 void AliAnalysisTaskJetAntenna::UserExec(Option_t *)
277 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
278 AliError("Jet branch name not set.");
282 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
284 AliError("ESD not available");
285 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
287 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
289 static AliAODEvent* aod = 0;
290 // take all other information from the aod we take the tracks from
292 if(!fESD)aod = fAODIn;
297 if(fNonStdFile.Length()!=0){
298 // case that we have an AOD extension we need can fetch the jets from the extended output
299 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
300 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
302 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
307 // -- event selection --
308 fHistEvtSelection->Fill(1); // number of events before event selection
311 Bool_t selected=kTRUE;
312 selected = AliAnalysisHelperJetTasks::Selected();
314 // no selection by the service task, we continue
315 PostData(1,fOutputList);
320 // physics selection: this is now redundant, all should appear as accepted after service task selection
321 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
322 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
323 std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
324 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
325 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
326 fHistEvtSelection->Fill(2);
327 PostData(1, fOutputList);
335 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
336 fHistEvtSelection->Fill(3);
337 PostData(1, fOutputList);
339 AliAODVertex* primVtx = aod->GetPrimaryVertex();
342 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
343 fHistEvtSelection->Fill(3);
344 PostData(1, fOutputList);
348 Int_t nTracksPrim = primVtx->GetNContributors();
349 if ((nTracksPrim < fMinContribVtx) ||
350 (primVtx->GetZ() < fVtxZMin) ||
351 (primVtx->GetZ() > fVtxZMax) ){
352 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
353 fHistEvtSelection->Fill(3);
354 PostData(1, fOutputList);
360 // centrality selection
361 AliCentrality *cent = 0x0;
362 Double_t centValue = 0.;
364 if(fESD) {cent = fESD->GetCentrality();
365 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
366 else centValue=aod->GetHeader()->GetCentrality();
368 if(fDebug) printf("centrality: %f\n", centValue);
369 if (centValue < fCentMin || centValue > fCentMax){
370 fHistEvtSelection->Fill(4);
371 PostData(1, fOutputList);
376 fHistEvtSelection->Fill(0);
378 // -- end event selection --
381 Double_t pthardbin=0;
383 pthard = AliAnalysisTaskFastEmbedding::GetPtHard();
384 pthardbin = GetPtHardBin(pthard);}
386 AliAODJetEventBackground* externalBackground = 0;
387 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
388 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
389 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
391 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
392 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
393 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
396 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
397 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
398 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
404 if(externalBackground)rho = externalBackground->GetBackground(0);
407 TClonesArray *aodJets[2];
409 if(fAODOut&&!aodJets[0]){
410 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
411 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data()));
413 if(fAODExtension && !aodJets[0]){
414 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
415 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data()));
417 if(fAODIn&&!aodJets[0]){
418 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
419 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data()));
426 if(!fDoMatching) nT = GetListOfTracks(&ParticleList);
427 if(fDoMatching)nT=GetListOfTracksExtra(&ParticleList);
429 PostData(1, fOutputList);
433 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
434 fListJets[iJetType]->Clear();
435 if (!aodJets[iJetType]) continue;
436 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
437 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
438 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
439 if (jet) fListJets[iJetType]->Add(jet);
444 static TArrayI aMatchIndex(fListJets[0]->GetEntries());
445 static TArrayF aPtFraction(fListJets[0]->GetEntries());
446 if(aMatchIndex.GetSize()<fListJets[0]->GetEntries()) aMatchIndex.Set(fListJets[0]->GetEntries());
447 if(aPtFraction.GetSize()<fListJets[0]->GetEntries()) aPtFraction.Set(fListJets[0]->GetEntries());
452 // stores matched jets in 'aMatchIndex' and fraction of pT in 'aPtFraction'
453 AliAnalysisHelperJetTasks::GetJetMatching(fListJets[0], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[0]->GetEntries()),
454 fListJets[1], TMath::Min((Int_t)fNMatchJets,(Int_t)fListJets[1]->GetEntries()),
455 aMatchIndex, aPtFraction, fDebug, fMatchMaxDist, fIsPbPb?1:2);}
462 // loop over matched jets
463 Int_t ir = -1; // index of matched reconstruced jet
464 Float_t fraction = -1.;
465 AliAODJet *jetmatched =0x0;
471 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
477 Double_t pxbig,pybig,pzbig;
480 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
481 etabig = jetbig->Eta();
482 phibig = jetbig->Phi();
483 ptbig = jetbig->Pt();
484 if(ptbig==0) continue;
485 areabig = jetbig->EffectiveAreaCharged();
486 if(!fDoMatching) ptbig=ptbig-rho*areabig;
487 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
489 if(fSemigoodCorrect){
490 if((phibig>fHolePos-fHoleWidth) && (phibig<fHolePos+fHoleWidth)) continue;
497 Bool_t jetAccepted=kTRUE;
499 if(ir>=0) jetmatched = (AliAODJet*)(fListJets[1]->At(ir));
501 fraction = aPtFraction[i];
502 // minimum fraction required
504 if(fraction<fJetPtFractionMin) jetAccepted = kFALSE;
506 // jet acceptance + minimum pT check
507 if(jetmatched->Eta()>fJetEtaMax || jetmatched->Eta()<fJetEtaMin) jetAccepted = kFALSE;
510 if(!jetAccepted) continue;
511 pxbig=jetmatched->Px();
512 pybig=jetmatched->Py();
513 pzbig=jetmatched->Pz();
514 ptbig=jetmatched->Pt()-rho*jetmatched->EffectiveAreaCharged();}
519 TVector3 ppJ1(pxbig, pybig, pzbig);
520 TVector3 ppJ3(- pxbig * pzbig, - pybig * pzbig, pxbig * pxbig + pybig * pybig);
522 TVector3 ppJ2(-pybig, pxbig, 0);
534 for(int it = 0;it<ParticleList.GetEntries();++it){
535 AliVParticle *track = (AliVParticle*)ParticleList.At(it);
536 TVector3 pp(track->Px(), track->Py(), track->Pz());
537 Float_t phi = track->Phi();
538 Float_t eta = track->Eta();
539 Float_t pt = track->Pt();
540 Float_t deta = eta - etabig;
541 Float_t dphi = RelativePhi(phi,phibig);
542 if(TMath::Abs(dphi)>=0.5*TMath::Pi()) continue;
543 Float_t r = TMath::Sqrt(dphi * dphi + deta * deta);
544 if (r < 0.4 && pt>fCutTM) {
545 //longitudinal and perpendicular component of the track pT in the
547 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
548 TVector3 pPerp = pp - pLong;
549 //projection onto the two perpendicular vectors defined above
550 Float_t ppjX = pPerp.Dot(ppJ2);
551 Float_t ppjY = pPerp.Dot(ppJ3);
552 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
553 //components of the 2D symmetrical sphericity matrix
554 mxx += (ppjX * ppjX / ppjT);
555 myy += (ppjY * ppjY / ppjT);
556 mxy += (ppjX * ppjY / ppjT);
566 const Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
567 TMatrixDSym m0(2,ele);
569 TMatrixDSymEigen m(m0);
571 TMatrixD evecm = m.GetEigenVectors();
572 eval = m.GetEigenValues();
573 // Largest eigenvector
575 if (eval[0] < eval[1]) jev = 1;
578 evec0 = TMatrixDColumn(evecm, jev);
579 TVector2 evec(evec0[0], evec0[1]);
581 if(jev==1) circ=2*eval[0];
582 if(jev==0) circ=2*eval[1];
583 fh2Circularity->Fill(circ,ptbig);
584 fh1JetEntries->Fill(ptbig);
585 for (Int_t ip = 0; ip < ParticleList.GetEntries(); ip++) {
586 AliVParticle *track = (AliVParticle*)ParticleList.At(ip);
587 TVector3 pp(track->Px(), track->Py(), track->Pz());
588 Float_t phi = track->Phi();
589 Float_t eta = track->Eta();
590 Float_t pt = track->Pt();
592 Float_t deta = eta - etabig;
593 Float_t dphi = RelativePhi(phi,phibig);
594 if(TMath::Abs(dphi)>=0.5*TMath::Pi()) continue;
596 Float_t dRR = TMath::Sqrt(dphi * dphi + deta * deta);
597 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
598 TVector3 pPerp = pp - pLong;
599 Float_t ppjX = pPerp.Dot(ppJ2);
600 Float_t ppjY = pPerp.Dot(ppJ3);
601 TVector2 vr(ppjX, ppjY) ;
602 //and this is the angle between the particle and the TM axis.
603 float phistr=evec.Phi()-vr.Phi();
604 if(phistr>2*TMath::Pi()) phistr -= 2*TMath::Pi();
605 if(phistr<-2*TMath::Pi()) phistr += 2*TMath::Pi();
606 if(phistr<-0.5*TMath::Pi()) phistr += 2*TMath::Pi();
607 if(phistr>1.5*TMath::Pi()) phistr -= 2*TMath::Pi();
609 double jetEntries[8] = {centValue,dRR,ptbig,pt,phistr,circ,static_cast<double>(nc),pthardbin};
610 fhnJetTM->Fill(jetEntries);
615 PostData(1, fOutputList);
618 void AliAnalysisTaskJetAntenna::Terminate(const Option_t *)
620 // Draw result to the screen
621 // Called once at the end of the query
623 if (!GetOutputData(1))
628 Int_t AliAnalysisTaskJetAntenna::GetListOfTracks(TList *list){
631 AliAODEvent *aod = 0;
633 if(!fESD)aod = fAODIn;
638 for(int it = 0;it < aod->GetNumberOfTracks();++it){
639 AliAODTrack *tr = aod->GetTrack(it);
640 Bool_t bGood = false;
641 if(fFilterType == 0)bGood = true;
642 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
643 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
644 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
645 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
646 if(bGood==false) continue;
647 if (fApplySharedClusterCut) {
648 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
649 if (frac > 0.4) continue;
651 if(TMath::Abs(tr->Eta())>0.9)continue;
652 if(tr->Pt()<0.15)continue;
662 Int_t AliAnalysisTaskJetAntenna::GetListOfTracksExtra(TList *list){
665 AliAODEvent *aod = 0;
667 if(!fESD)aod = fAODIn;
671 for(int it = 0;it < aod->GetNumberOfTracks();++it){
672 AliAODTrack *tr = aod->GetTrack(it);
673 Bool_t bGood = false;
674 if(fFilterType == 0)bGood = true;
675 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
676 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
677 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
678 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
679 if(bGood==false) continue;
680 if (fApplySharedClusterCut) {
681 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
682 if (frac > 0.4) continue;
684 if(TMath::Abs(tr->Eta())>0.9)continue;
685 if(tr->Pt()<0.15)continue;
694 TClonesArray *aodExtraTracks = dynamic_cast<TClonesArray*>(aod->FindListObject("aodExtraTracks"));
695 if(!aodExtraTracks)return iCount;
696 for(int it =0; it<aodExtraTracks->GetEntries(); it++) {
697 AliVParticle *track = dynamic_cast<AliVParticle*> ((*aodExtraTracks)[it]);
698 if (!track) continue;
699 AliAODTrack *trackAOD = dynamic_cast<AliAODTrack*> (track);
700 if(!trackAOD)continue;
701 Bool_t bGood = false;
702 if(fFilterType == 0)bGood = true;
703 else if(fFilterType == 1)bGood = trackAOD->IsHybridTPCConstrainedGlobal();
704 else if(fFilterType == 2)bGood = trackAOD->IsHybridGlobalConstrainedGlobal();
705 if((fFilterMask>0)&&((!trackAOD->TestFilterBit(fFilterMask)||(!bGood))))continue;
706 if(fRequireITSRefit){if((trackAOD->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
707 if (fApplySharedClusterCut) {
708 Double_t frac = Double_t(trackAOD->GetTPCnclsS()) /Double_t(trackAOD->GetTPCncls());
709 if (frac > 0.4) continue;
713 if(TMath::Abs(trackAOD->Eta())>0.9) continue;
714 if(trackAOD->Pt()<0.15) continue;
715 if(fDebug) printf("pt extra track %.2f \n", trackAOD->Pt());
723 Double_t AliAnalysisTaskJetAntenna::RelativePhi(Double_t mphi,Double_t vphi){
725 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
726 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
727 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
728 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
729 double dphi = mphi-vphi;
730 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
731 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
732 return dphi;//dphi in [-Pi, Pi]
735 Int_t AliAnalysisTaskJetAntenna::GetPhiBin(Double_t phi)
738 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
739 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
740 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
741 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
745 Int_t AliAnalysisTaskJetAntenna::GetPtHardBin(Double_t ptHard){
747 const Int_t nBins = 10;
748 Double_t binLimits[nBins] = { 5., 11., 21., 36., 57., 84., 117., 156., 200., 249. }; // lower limits
751 while(bin<nBins-1 && binLimits[bin+1]<ptHard){