2 // ******************************************
3 // This task computes several jet observables like
4 // the fraction of energy in inner and outer coronnas,
5 // jet-track correlations,triggered jet shapes and
6 // correlation strength distribution of particles inside jets.
7 // Author: lcunquei@cern.ch
8 // *******************************************
11 /**************************************************************************
12 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
14 * Author: The ALICE Off-line Project. *
15 * Contributors are mentioned in the code where appropriate. *
17 * Permission to use, copy, modify and distribute this software and its *
18 * documentation strictly for non-commercial purposes is hereby granted *
19 * without fee, provided that the above copyright notice appears in all *
20 * copies and that both the copyright notice and this permission notice *
21 * appear in the supporting documentation. The authors make no claims *
22 * about the suitability of this software for any purpose. It is *
23 * provided "as is" without express or implied warranty. *
24 **************************************************************************/
33 #include "THnSparse.h"
38 #include "AliAnalysisTask.h"
39 #include "AliAnalysisManager.h"
41 #include "AliVEvent.h"
42 #include "AliESDEvent.h"
43 #include "AliESDInputHandler.h"
44 #include "AliCentrality.h"
45 #include "AliAnalysisHelperJetTasks.h"
46 #include "AliInputEventHandler.h"
47 #include "AliAODJetEventBackground.h"
48 #include "AliAODMCParticle.h"
49 #include "AliAnalysisTaskFastEmbedding.h"
50 #include "AliAODEvent.h"
51 #include "AliAODHandler.h"
52 #include "AliAODJet.h"
54 #include "AliAnalysisTaskJetCore.h"
59 ClassImp(AliAnalysisTaskJetCore)
61 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore() :
67 fBackgroundBranch(""),
70 fOfflineTrgMask(AliVEvent::kAny),
85 fAngStructCloseTracks(0),
100 fTrackTypeRec(kTrackUndef),
113 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
114 fJetPtFractionMin(0.5),
118 fRunAnaAzimuthalCorrelation(kFALSE),
123 fHistEvtSelection(0x0),
126 fh2JetCoreMethod1C10(0x0),
127 fh2JetCoreMethod2C10(0x0),
128 fh2JetCoreMethod1C20(0x0),
129 fh2JetCoreMethod2C20(0x0),
130 fh2JetCoreMethod1C30(0x0),
131 fh2JetCoreMethod2C30(0x0),
132 fh2JetCoreMethod1C60(0x0),
133 fh2JetCoreMethod2C60(0x0),
134 fh3JetTrackC3060(0x0),
136 fh2AngStructpt1C10(0x0),
137 fh2AngStructpt2C10(0x0),
138 fh2AngStructpt3C10(0x0),
139 fh2AngStructpt4C10(0x0),
140 fh2AngStructpt1C20(0x0),
141 fh2AngStructpt2C20(0x0),
142 fh2AngStructpt3C20(0x0),
143 fh2AngStructpt4C20(0x0),
144 fh2AngStructpt1C30(0x0),
145 fh2AngStructpt2C30(0x0),
146 fh2AngStructpt3C30(0x0),
147 fh2AngStructpt4C30(0x0),
148 fh2AngStructpt1C60(0x0),
149 fh2AngStructpt2C60(0x0),
150 fh2AngStructpt3C60(0x0),
151 fh2AngStructpt4C60(0x0),
155 fh2Ntriggers2C10(0x0),
156 fh2Ntriggers2C20(0x0),
158 fh3JetDensityA4(0x0),
169 // default Constructor
173 for(Int_t i=0; i<10; i++) {
174 for(Int_t j=0; j<6; j++) {
183 fJetBranchName[0] = "";
184 fJetBranchName[1] = "";
186 fListJets[0] = new TList;
187 fListJets[1] = new TList;
190 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore(const char *name) :
191 AliAnalysisTaskSE(name),
196 fBackgroundBranch(""),
199 fOfflineTrgMask(AliVEvent::kAny),
206 fFilterMaskBestPt(0),
213 fNInputTracksMax(-1),
214 fAngStructCloseTracks(0),
229 fTrackTypeRec(kTrackUndef),
242 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
243 fJetPtFractionMin(0.5),
247 fRunAnaAzimuthalCorrelation(kFALSE),
252 fHistEvtSelection(0x0),
255 fh2JetCoreMethod1C10(0x0),
256 fh2JetCoreMethod2C10(0x0),
257 fh2JetCoreMethod1C20(0x0),
258 fh2JetCoreMethod2C20(0x0),
259 fh2JetCoreMethod1C30(0x0),
260 fh2JetCoreMethod2C30(0x0),
261 fh2JetCoreMethod1C60(0x0),
262 fh2JetCoreMethod2C60(0x0),
263 fh3JetTrackC3060(0x0),
265 fh2AngStructpt1C10(0x0),
266 fh2AngStructpt2C10(0x0),
267 fh2AngStructpt3C10(0x0),
268 fh2AngStructpt4C10(0x0),
269 fh2AngStructpt1C20(0x0),
270 fh2AngStructpt2C20(0x0),
271 fh2AngStructpt3C20(0x0),
272 fh2AngStructpt4C20(0x0),
273 fh2AngStructpt1C30(0x0),
274 fh2AngStructpt2C30(0x0),
275 fh2AngStructpt3C30(0x0),
276 fh2AngStructpt4C30(0x0),
277 fh2AngStructpt1C60(0x0),
278 fh2AngStructpt2C60(0x0),
279 fh2AngStructpt3C60(0x0),
280 fh2AngStructpt4C60(0x0),
284 fh2Ntriggers2C10(0x0),
285 fh2Ntriggers2C20(0x0),
287 fh3JetDensityA4(0x0),
301 for(Int_t i=0; i<10; i++) {
302 for(Int_t j=0; j<6; j++) {
309 fJetBranchName[0] = "";
310 fJetBranchName[1] = "";
312 fListJets[0] = new TList;
313 fListJets[1] = new TList;
315 DefineOutput(1, TList::Class());
318 AliAnalysisTaskJetCore::~AliAnalysisTaskJetCore()
324 void AliAnalysisTaskJetCore::SetBranchNames(const TString &branch1, const TString &branch2)
326 fJetBranchName[0] = branch1;
327 fJetBranchName[1] = branch2;
330 void AliAnalysisTaskJetCore::Init()
333 // check for jet branches
334 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
335 AliError("Jet branch name not set.");
340 void AliAnalysisTaskJetCore::UserCreateOutputObjects()
345 if(!fOutputList) fOutputList = new TList;
346 fOutputList->SetOwner(kTRUE);
348 Bool_t oldStatus = TH1::AddDirectoryStatus();
349 TH1::AddDirectory(kFALSE);
353 fRandom = new TRandom3(0);
358 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
359 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
360 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
361 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
362 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
363 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
364 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
366 UInt_t entries = 0; // bit coded, see GetDimParams() below
367 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7;
368 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
370 //change binning in pTtrack
371 Double_t *xPt3 = new Double_t[10];
373 for(int i = 1; i<=9;i++){
374 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
375 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
376 else xPt3[i] = xPt3[i-1] + 150.; // 18
378 fhnDeltaR->SetBinEdges(2,xPt3);
381 //change binning in HTI
382 Double_t *xPt4 = new Double_t[14];
384 for(int i = 1; i<=13;i++){
385 if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 1; // 1 - 10
386 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 5; // 10 - 12
387 else xPt4[i] = xPt4[i-1] + 30.; // 13
389 fhnDeltaR->SetBinEdges(6,xPt4);
399 UInt_t cifras = 0; // bit coded, see GetDimParams() below
400 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
401 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);}
404 fh2JetCoreMethod1C10 = new TH2F("JetCoreMethod1C10","",150, 0., 150.,100, 0., 1.5);
405 fh2JetCoreMethod2C10 = new TH2F("JetCoreMethod2C10","",150, 0., 150.,100, 0., 1.5);
406 fh2JetCoreMethod1C20 = new TH2F("JetCoreMethod1C20","",150, 0., 150.,100, 0., 1.5);
407 fh2JetCoreMethod2C20 = new TH2F("JetCoreMethod2C20","",150, 0., 150.,100, 0., 1.5);
408 fh2JetCoreMethod1C30 = new TH2F("JetCoreMethod1C30","",150, 0., 150.,100, 0., 1.5);
409 fh2JetCoreMethod2C30 = new TH2F("JetCoreMethod2C30","",150, 0., 150.,100, 0., 1.5);
410 fh2JetCoreMethod1C60 = new TH2F("JetCoreMethod1C60","",150, 0., 150.,100, 0., 1.5);
411 fh2JetCoreMethod2C60 = new TH2F("JetCoreMethod2C60","",150, 0., 150.,100, 0., 1.5);}
413 fh3JetTrackC3060=new TH3F("JetTrackC3060","",50,0,50,150,0.,150.,35,0.,3.5);
414 fh3JetTrackC20=new TH3F("JetTrackC20","",50,0,50,150,0.,150.,35,0.,3.5);
415 if(fAngStructCloseTracks>0){
416 fh2AngStructpt1C10 = new TH2F("Ang struct pt1 C10","",15,0.,1.5,150,0.,10.);
417 fh2AngStructpt2C10 = new TH2F("Ang struct pt2 C10","",15,0.,1.5,150,0.,10.);
418 fh2AngStructpt3C10 = new TH2F("Ang struct pt3 C10","",15,0.,1.5,150,0.,10.);
419 fh2AngStructpt4C10 = new TH2F("Ang struct pt4 C10","",15,0.,1.5,150,0.,10.);
420 fh2AngStructpt1C20 = new TH2F("Ang struct pt1 C20","",15,0.,1.5,150,0.,10.);
421 fh2AngStructpt2C20 = new TH2F("Ang struct pt2 C20","",15,0.,1.5,150,0.,10.);
422 fh2AngStructpt3C20 = new TH2F("Ang struct pt3 C20","",15,0.,1.5,150,0.,10.);
423 fh2AngStructpt4C20 = new TH2F("Ang struct pt4 C20","",15,0.,1.5,150,0.,10.);
424 fh2AngStructpt1C30 = new TH2F("Ang struct pt1 C30","",15,0.,1.5,150,0.,10.);
425 fh2AngStructpt2C30 = new TH2F("Ang struct pt2 C30","",15,0.,1.5,150,0.,10.);
426 fh2AngStructpt3C30 = new TH2F("Ang struct pt3 C30","",15,0.,1.5,150,0.,10.);
427 fh2AngStructpt4C30 = new TH2F("Ang struct pt4 C30","",15,0.,1.5,150,0.,10.);
428 fh2AngStructpt1C60 = new TH2F("Ang struct pt1 C60","",15,0.,1.5,150,0.,10.);
429 fh2AngStructpt2C60 = new TH2F("Ang struct pt2 C60","",15,0.,1.5,150,0.,10.);
430 fh2AngStructpt3C60 = new TH2F("Ang struct pt3 C60","",15,0.,1.5,150,0.,10.);
431 fh2AngStructpt4C60 = new TH2F("Ang struct pt4 C60","",15,0.,1.5,150,0.,10.); }
434 fh1TrigRef=new TH1D("Trig Ref","",10,0.,10);
435 fh1TrigSig=new TH1D("Trig Sig","",10,0.,10);
436 fh2Ntriggers=new TH2F("# of triggers","",100,0.,100.,50,0.,50.);
437 fh2Ntriggers2C10=new TH2F("# of triggers2C10","",50,0.,50.,50,0.,50.);
438 fh2Ntriggers2C20=new TH2F("# of triggers2C20","",50,0.,50.,50,0.,50.);
439 fh3JetDensity=new TH3F("Jet density vs mutliplicity A>0.07","",100,0.,4000.,100,0.,5.,25,0.,50.);
440 fh3JetDensityA4=new TH3F("Jet density vs multiplicity A>0.4","",100,0.,4000.,100,0.,5.,25,0.,50.);
441 fh2RPJetsC10=new TH2F("RPJetC10","",35,0.,3.5,100,0.,100.);
442 fh2RPJetsC20=new TH2F("RPJetC20","",35,0.,3.5,100,0.,100.);
443 fh2RPTC10=new TH2F("RPTriggerC10","",35,0.,3.5,50,0.,50.);
444 fh2RPTC20=new TH2F("RPTriggerC20","",35,0.,3.5,50,0.,50.);
449 fOutputList->Add(fHistEvtSelection);
451 fOutputList->Add(fhnDeltaR);
453 fOutputList->Add(fhnMixedEvents);
459 fOutputList->Add(fh2JetCoreMethod1C10);
460 fOutputList->Add(fh2JetCoreMethod2C10);
461 fOutputList->Add(fh2JetCoreMethod1C20);
462 fOutputList->Add(fh2JetCoreMethod2C20);
463 fOutputList->Add(fh2JetCoreMethod1C30);
464 fOutputList->Add(fh2JetCoreMethod2C30);
465 fOutputList->Add(fh2JetCoreMethod1C60);
466 fOutputList->Add(fh2JetCoreMethod2C60);}
468 fOutputList->Add(fh3JetTrackC3060);
469 fOutputList->Add(fh3JetTrackC20);
475 if(fAngStructCloseTracks>0){
476 fOutputList->Add(fh2AngStructpt1C10);
477 fOutputList->Add(fh2AngStructpt2C10);
478 fOutputList->Add(fh2AngStructpt3C10);
479 fOutputList->Add(fh2AngStructpt4C10);
480 fOutputList->Add(fh2AngStructpt1C20);
481 fOutputList->Add(fh2AngStructpt2C20);
482 fOutputList->Add(fh2AngStructpt3C20);
483 fOutputList->Add(fh2AngStructpt4C20);
484 fOutputList->Add(fh2AngStructpt1C30);
485 fOutputList->Add(fh2AngStructpt2C30);
486 fOutputList->Add(fh2AngStructpt3C30);
487 fOutputList->Add(fh2AngStructpt4C30);
488 fOutputList->Add(fh2AngStructpt1C60);
489 fOutputList->Add(fh2AngStructpt2C60);
490 fOutputList->Add(fh2AngStructpt3C60);
491 fOutputList->Add(fh2AngStructpt4C60);}
496 fOutputList->Add(fh1TrigRef);
497 fOutputList->Add(fh1TrigSig);
498 fOutputList->Add(fh2Ntriggers);
499 fOutputList->Add(fh2Ntriggers2C10);
500 fOutputList->Add(fh2Ntriggers2C20);
501 fOutputList->Add(fh3JetDensity);
502 fOutputList->Add(fh3JetDensityA4);
503 fOutputList->Add(fh2RPJetsC10);
504 fOutputList->Add(fh2RPJetsC20);
505 fOutputList->Add(fh2RPTC10);
506 fOutputList->Add(fh2RPTC20);
508 const Int_t dimSpec = 5;
509 const Int_t nBinsSpec[dimSpec] = {100,6, 140, 50, fNRPBins};
510 const Double_t lowBinSpec[dimSpec] = {0,0,-80, 0, 0};
511 const Double_t hiBinSpec[dimSpec] = {100,1, 200, 50, fNRPBins};
512 fHJetSpec = new THnSparseF("fHJetSpec","Recoil jet spectrum",dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
514 //change binning in jet area
515 Double_t *xPt6 = new Double_t[7];
523 fHJetSpec->SetBinEdges(1,xPt6);
530 fOutputList->Add(fHJetSpec);
533 if(fRunAnaAzimuthalCorrelation)
535 fhTTPt = new TH2F("fhTTPt","Trigger track p_{T} vs centrality",10,0,100,100,0,100);
536 fOutputList->Add(fhTTPt);
538 const Int_t dimCor = 5;
539 const Int_t nBinsCor[dimCor] = {50, 200, 100, 8, 10};
540 const Double_t lowBinCor[dimCor] = {0, -50, -0.5*TMath::Pi(), 0, 0};
541 const Double_t hiBinCor[dimCor] = {50, 150, 1.5*TMath::Pi(), 0.8, 100};
542 fHJetPhiCorr = new THnSparseF("fHJetPhiCorr","TT p_{T} vs jet p_{T} vs dPhi vs area vs centrality",dimCor,nBinsCor,lowBinCor,hiBinCor);
543 fOutputList->Add(fHJetPhiCorr);
549 // =========== Switch on Sumw2 for all histos ===========
550 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
551 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
556 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
561 TH1::AddDirectory(oldStatus);
563 PostData(1, fOutputList);
566 void AliAnalysisTaskJetCore::UserExec(Option_t *)
570 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
571 AliError("Jet branch name not set.");
575 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
577 AliError("ESD not available");
578 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
580 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
582 static AliAODEvent* aod = 0;
583 // take all other information from the aod we take the tracks from
585 if(!fESD)aod = fAODIn;
590 if(fNonStdFile.Length()!=0){
591 // case that we have an AOD extension we need can fetch the jets from the extended output
592 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
593 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
595 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
599 // -- event selection --
600 fHistEvtSelection->Fill(1); // number of events before event selection
603 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
604 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
605 std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
606 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
607 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
608 fHistEvtSelection->Fill(2);
609 PostData(1, fOutputList);
615 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
616 fHistEvtSelection->Fill(3);
617 PostData(1, fOutputList);
619 AliAODVertex* primVtx = aod->GetPrimaryVertex();
622 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
623 fHistEvtSelection->Fill(3);
624 PostData(1, fOutputList);
628 Int_t nTracksPrim = primVtx->GetNContributors();
629 if ((nTracksPrim < fMinContribVtx) ||
630 (primVtx->GetZ() < fVtxZMin) ||
631 (primVtx->GetZ() > fVtxZMax) ){
632 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
633 fHistEvtSelection->Fill(3);
634 PostData(1, fOutputList);
638 // event class selection (from jet helper task)
639 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
640 if(fDebug) Printf("Event class %d", eventClass);
641 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
642 fHistEvtSelection->Fill(4);
643 PostData(1, fOutputList);
647 // centrality selection
648 AliCentrality *cent = 0x0;
649 Double_t centValue = 0.;
651 if(fESD) {cent = fESD->GetCentrality();
652 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
653 else centValue=aod->GetHeader()->GetCentrality();
655 if(fDebug) printf("centrality: %f\n", centValue);
656 if (centValue < fCentMin || centValue > fCentMax){
657 fHistEvtSelection->Fill(4);
658 PostData(1, fOutputList);
663 fHistEvtSelection->Fill(0);
665 // -- end event selection --
668 AliAODJetEventBackground* externalBackground = 0;
669 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
670 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
671 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
673 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
674 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
675 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
678 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
679 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
680 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
686 if(externalBackground)rho = externalBackground->GetBackground(0);}
688 if(externalBackground)rho = externalBackground->GetBackground(2);}
691 TClonesArray *aodJets[2];
693 if(fAODOut&&!aodJets[0]){
694 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
695 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
696 if(fAODExtension && !aodJets[0]){
697 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
698 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
699 if(fAODIn&&!aodJets[0]){
700 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
701 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
710 Double_t dice=fRandom->Uniform(0,1);
711 if(dice>fFrac){ minT=fTTLowRef;
713 if(dice<=fFrac){minT=fTTLowSig;
718 if(fHardest==1 || fHardest==2) nT = GetListOfTracks(&ParticleList);
719 if(fHardest==0) nT=SelectTrigger(&ParticleList,minT,maxT,number);
721 PostData(1, fOutputList);
724 if(dice>fFrac) fh1TrigRef->Fill(number);
725 if(dice<=fFrac)fh1TrigSig->Fill(number);
727 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
728 fListJets[iJetType]->Clear();
729 if (!aodJets[iJetType]) continue;
730 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
731 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
732 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
733 if (jet) fListJets[iJetType]->Add(jet);
735 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
744 Double_t areasmall=0;
745 Double_t phismall=0.;
751 Int_t trigBBTrack=-1;
752 Int_t trigInTrack=-1;
753 fRPAngle = aod->GetHeader()->GetEventplane();
755 if(fHardest==0 || fHardest==1){
756 AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
758 PostData(1, fOutputList);
761 if(fSemigoodCorrect){
762 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
763 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6){
764 PostData(1, fOutputList);
771 for(Int_t tt=0;tt<ParticleList.GetEntries();tt++){
772 if(fHardest==0||fHardest==1){if(tt!=nT) continue;}
773 AliVParticle *partback = (AliVParticle*)ParticleList.At(tt);
774 if(!partback) continue;
775 if(partback->Pt()<8) continue;
777 Double_t accep=2.*TMath::Pi()*1.8;
781 if(fSemigoodCorrect){
782 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
783 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6) continue;}
787 fh2Ntriggers->Fill(centValue,partback->Pt());
788 Double_t phiBinT = RelativePhi(partback->Phi(),fRPAngle);
789 if(centValue<20.) fh2RPTC20->Fill(TMath::Abs(phiBinT),partback->Pt());
790 if(centValue<10.) fh2RPTC10->Fill(TMath::Abs(phiBinT),partback->Pt());
794 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
795 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
796 etabig = jetbig->Eta();
797 phibig = jetbig->Phi();
798 ptbig = jetbig->Pt();
799 if(ptbig==0) continue;
800 Double_t phiBin = RelativePhi(phibig,fRPAngle);
801 areabig = jetbig->EffectiveAreaCharged();
802 Double_t ptcorr=ptbig-rho*areabig;
803 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
804 if(areabig>=0.07) injet=injet+1;
805 if(areabig>=0.4) injet4=injet4+1;
806 Double_t dphi=RelativePhi(partback->Phi(),phibig);
809 Double_t etadif= partback->Eta()-etabig;
810 if(TMath::Abs(etadif)<=0.5){
812 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
813 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
815 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
816 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
819 if(fFlagJetHadron==0){
820 if(fFlagPhiBkg==1) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
821 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
822 if(fFlagPhiBkg==2) if(TMath::Abs(dphi)<TMath::Pi()-0.7) continue;
823 if(fFlagPhiBkg==3) if(TMath::Abs(dphi)<TMath::Pi()-0.5) continue;}
825 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
828 if(centValue<10.) fh2RPJetsC10->Fill(TMath::Abs(phiBin), ptcorr);
829 if(centValue<20.) fh2RPJetsC20->Fill(TMath::Abs(phiBin), ptcorr);
830 Double_t dismin=100.;
835 Float_t phitt=partback->Phi();
836 if(phitt<0)phitt+=TMath::Pi()*2.;
837 Int_t phiBintt = GetPhiBin(phitt-fRPAngle);
839 Double_t fillspec[] = {centValue,jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt(),phiBintt};
840 fHJetSpec->Fill(fillspec);
844 if(ptcorr<=0) continue;
846 AliAODTrack* leadtrack=0;
849 if(fFlagJetHadron==0){
850 TRefArray *genTrackList = jetbig->GetRefTracks();
851 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
852 AliAODTrack* genTrack;
853 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
854 genTrack = (AliAODTrack*)(genTrackList->At(ir));
855 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
857 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
858 if(!leadtrack) continue;
863 AliVParticle* leadtrackb=0;
864 if(fFlagJetHadron!=0){
865 Int_t nTb = GetHardestTrackBackToJet(jetbig);
866 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
867 if(!leadtrackb) continue;
874 //store one trigger info
883 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
884 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
885 etasmall = jetsmall->Eta();
886 phismall = jetsmall->Phi();
887 ptsmall = jetsmall->Pt();
888 areasmall = jetsmall->EffectiveAreaCharged();
889 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
890 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
891 //Fraction in the jet core
892 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
894 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
895 index1=j;}} //en of loop over R=0.2 jets
896 //method1:most concentric jet=core
897 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
898 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
899 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
900 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
901 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
902 //method2:hardest contained jet=core
904 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
905 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
906 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
907 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
908 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
909 if(centValue<10&&leadtrack) fh2Ntriggers2C10->Fill(leadtrack->Pt(),partback->Pt());
910 if(centValue<20&&leadtrack) fh2Ntriggers2C20->Fill(leadtrack->Pt(),partback->Pt());
911 if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
912 for(int it = 0;it<ParticleList.GetEntries();++it){
913 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
914 Double_t deltaR = jetbig->DeltaR(part);
915 Double_t deltaEta = etabig-part->Eta();
917 Double_t deltaPhi=phibig-part->Phi();
918 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
919 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
921 if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
922 if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
923 Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
924 fhnDeltaR->Fill(jetEntries);}
930 //end of track loop, we only do it if EM is switched off
941 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
942 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
948 if(fDoEventMixing>0){
949 //check before if the trigger exists
950 // fTrigBuffer[i][0] = zvtx
951 // fTrigBuffer[i][1] = phi
952 // fTrigBuffer[i][2] = eta
953 // fTrigBuffer[i][3] = pt_jet
954 // fTrigBuffer[i][4] = pt_trig
955 // fTrigBuffer[i][5]= centrality
956 if(fTindex==10) fTindex=0;
957 if(fTrigBuffer[fTindex][3]>0){
958 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
959 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
961 for(int it = 0;it<nT;++it){
962 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
963 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
964 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
965 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
966 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
967 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
968 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
969 fhnMixedEvents->Fill(triggerEntries);
972 if(fNevents==10) fTindex=fTindex+1;
975 if(fTindex==10&&fNevents==10) fCountAgain=0;
977 // Copy the triggers from the current event into the buffer.
978 //again, only if the trigger exists:
981 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
982 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
983 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
984 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
985 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
986 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
987 fTrigBuffer[fTrigBufferIndex][5] = centValue;
989 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
996 /////////////////////////////////////////////////////////////////////////////
997 ////////////////////// Rongrong's analysis //////////////////////////////////
998 if(fRunAnaAzimuthalCorrelation)
1000 fhTTPt->Fill(centValue,partback->Pt());
1001 for(Int_t ij=0; ij<fListJets[0]->GetEntries(); ij++)
1003 AliAODJet* jet = (AliAODJet*)(fListJets[0]->At(ij));
1004 Double_t jetPt = jet->Pt();
1005 Double_t jetEta = jet->Eta();
1006 Double_t jetPhi = jet->Phi();
1007 if(jetPt==0) continue;
1008 if((jetEta<fJetEtaMin)||(jetEta>fJetEtaMax)) continue;
1009 Double_t jetArea = jet->EffectiveAreaCharged();
1010 Double_t jetPtCorr=jetPt-rho*jetArea;
1011 Double_t dPhi=jetPhi-partback->Phi();
1012 if(dPhi>2*TMath::Pi()) dPhi -= 2*TMath::Pi();
1013 if(dPhi<-2*TMath::Pi()) dPhi += 2*TMath::Pi();
1014 if(dPhi<-0.5*TMath::Pi()) dPhi += 2*TMath::Pi();
1015 if(dPhi>1.5*TMath::Pi()) dPhi -= 2*TMath::Pi();
1017 Double_t fill[] = {partback->Pt(),jetPtCorr,dPhi,jetArea,centValue};
1018 fHJetPhiCorr->Fill(fill);
1021 /////////////////////////////////////////////////////////////////////////////
1022 /////////////////////////////////////////////////////////////////////////////
1025 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
1027 //tracks up to R=0.8 distant from the jet axis
1028 // if(fAngStructCloseTracks==1){
1029 // TList CloseTrackList;
1030 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
1031 // Double_t difR=0.04;
1032 // for(Int_t l=0;l<15;l++){
1033 // Double_t rr=l*0.1+0.1;
1034 // for(int it = 0;it<nn;++it){
1035 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
1036 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
1037 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
1038 // Double_t ptm=part1->Pt();
1039 // Double_t ptn=part2->Pt();
1040 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1041 // Rnm=TMath::Sqrt(Rnm);
1042 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1043 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1044 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1045 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1046 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1047 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1048 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1049 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1050 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1051 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
1054 // //only jet constituents
1055 // if(fAngStructCloseTracks==2){
1057 // Double_t difR=0.04;
1058 // for(Int_t l=0;l<15;l++){
1059 // Double_t rr=l*0.1+0.1;
1062 // AliAODTrack* part1;
1063 // AliAODTrack* part2;
1065 // TRefArray *genTrackListb = jetbig->GetRefTracks();
1066 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
1070 // for(Int_t it=0; it<nTracksGenJetb; ++it){
1071 // part1 = (AliAODTrack*)(genTrackListb->At(it));
1072 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
1073 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
1074 // Double_t ptm=part1->Pt();
1075 // Double_t ptn=part2->Pt();
1076 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1077 // Rnm=TMath::Sqrt(Rnm);
1078 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1079 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1080 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1081 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1082 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1083 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1084 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1085 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1086 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1087 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
1089 // //end loop over R=0.4 jets
1090 // if(fAngStructCloseTracks>0){
1091 // for(Int_t l=0;l<15;l++){
1092 // Double_t rr=l*0.1+0.1;
1094 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
1095 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
1096 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
1097 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
1099 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
1100 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
1101 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
1102 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
1104 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
1105 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
1106 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
1107 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
1109 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
1110 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
1111 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
1112 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
1120 PostData(1, fOutputList);
1123 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
1125 // Draw result to the screen
1126 // Called once at the end of the query
1128 if (!GetOutputData(1))
1137 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
1140 AliAODEvent *aod = 0;
1142 if(!fESD)aod = fAODIn;
1152 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1153 AliAODTrack *tr = aod->GetTrack(it);
1154 Bool_t bGood = false;
1155 if(fFilterType == 0)bGood = true;
1156 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1157 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1158 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1159 if(bGood==false) continue;
1160 if(TMath::Abs(tr->Eta())>0.9)continue;
1161 if(tr->Pt()<0.15)continue;
1164 if(fFilterType==2 && fFilterMaskBestPt>0){// only set the trigger track index for good quality tracks
1165 if(tr->TestFilterBit(fFilterMaskBestPt)){
1181 // else if (type == kTrackAODMCCharged) {
1182 // TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1183 // if(!tca)return iCount;
1184 // for(int it = 0;it < tca->GetEntriesFast();++it){
1185 // AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1186 // if(!part)continue;
1187 // if(part->Pt()<0.15)continue;
1188 // if(!part->IsPhysicalPrimary())continue;
1189 // if(part->Charge()==0)continue;
1190 // if(TMath::Abs(part->Eta())>0.9)continue;
1193 // if(part->Pt()>ptmax){ ptmax=part->Pt();
1194 // index=iCount-1;}}}
1201 Int_t AliAnalysisTaskJetCore::SelectTrigger(TList *list,Double_t minT,Double_t maxT,Int_t &number){
1203 AliAODEvent *aod = 0;
1204 if(!fESD)aod = fAODIn;
1208 Int_t triggers[100];
1209 for(Int_t cr=0;cr<100;cr++){triggers[cr]=-1;}
1211 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1212 AliAODTrack *tr = aod->GetTrack(it);
1213 Bool_t bGood = false;
1214 if(fFilterType == 0)bGood = true;
1215 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1216 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1217 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1218 if(bGood==false) continue;
1219 if(TMath::Abs(tr->Eta())>0.9)continue;
1220 if(tr->Pt()<0.15)continue;
1224 if(tr->Pt()>=minT && tr->Pt()<maxT){
1225 triggers[im]=iCount-1;
1232 if(im>0) rd=fRandom->Integer(im);
1258 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
1260 AliAODEvent *aod = 0;
1261 if(!fESD)aod = fAODIn;
1268 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1269 AliAODTrack *tr = aod->GetTrack(it);
1270 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1271 if(TMath::Abs(tr->Eta())>0.9)continue;
1272 if(tr->Pt()<0.15)continue;
1274 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1275 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1276 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1292 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1295 AliAODEvent *aod = 0;
1296 if(!fESD)aod = fAODIn;
1299 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1300 AliAODTrack *tr = aod->GetTrack(it);
1301 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1302 if(TMath::Abs(tr->Eta())>0.9)continue;
1303 if(tr->Pt()<0.15)continue;
1304 Double_t disR=jetbig->DeltaR(tr);
1305 if(disR>0.8) continue;
1307 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1326 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1329 Int_t nInputTracks = 0;
1330 AliAODEvent *aod = 0;
1331 if(!fESD)aod = fAODIn;
1333 TString jbname(fJetBranchName[1]);
1334 //needs complete event, use jets without background subtraction
1335 for(Int_t i=1; i<=3; ++i){
1336 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1338 // use only HI event
1339 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1340 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1342 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1343 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1345 Printf("Jet branch %s not found", jbname.Data());
1346 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1350 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1351 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1353 TRefArray *trackList = jet->GetRefTracks();
1354 Int_t nTracks = trackList->GetEntriesFast();
1355 nInputTracks += nTracks;
1356 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1358 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1360 return nInputTracks;
1365 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1367 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1368 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1369 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1370 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1371 double dphi = mphi-vphi;
1372 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1373 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1374 return dphi;//dphi in [-Pi, Pi]
1377 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1380 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1381 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1382 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1383 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1390 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1392 // generate new THnSparseF, axes are defined in GetDimParams()
1395 UInt_t tmp = entries;
1398 tmp = tmp &~ -tmp; // clear lowest bit
1401 TString hnTitle(name);
1402 const Int_t dim = count;
1409 while(c<dim && i<32){
1413 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1414 hnTitle += Form(";%s",label.Data());
1422 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1425 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1427 // stores label and binning of axis for THnSparse
1429 const Double_t pi = TMath::Pi();
1434 label = "V0 centrality (%)";
1443 label = "corrected jet pt";
1486 label = "leading track";
1494 label = "trigger track";