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),
86 fAngStructCloseTracks(0),
101 fTrackTypeRec(kTrackUndef),
114 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
115 fJetPtFractionMin(0.5),
119 fRunAnaAzimuthalCorrelation(kFALSE),
124 fHistEvtSelection(0x0),
127 fh2JetCoreMethod1C10(0x0),
128 fh2JetCoreMethod2C10(0x0),
129 fh2JetCoreMethod1C20(0x0),
130 fh2JetCoreMethod2C20(0x0),
131 fh2JetCoreMethod1C30(0x0),
132 fh2JetCoreMethod2C30(0x0),
133 fh2JetCoreMethod1C60(0x0),
134 fh2JetCoreMethod2C60(0x0),
135 fh3JetTrackC3060(0x0),
137 fh2AngStructpt1C10(0x0),
138 fh2AngStructpt2C10(0x0),
139 fh2AngStructpt3C10(0x0),
140 fh2AngStructpt4C10(0x0),
141 fh2AngStructpt1C20(0x0),
142 fh2AngStructpt2C20(0x0),
143 fh2AngStructpt3C20(0x0),
144 fh2AngStructpt4C20(0x0),
145 fh2AngStructpt1C30(0x0),
146 fh2AngStructpt2C30(0x0),
147 fh2AngStructpt3C30(0x0),
148 fh2AngStructpt4C30(0x0),
149 fh2AngStructpt1C60(0x0),
150 fh2AngStructpt2C60(0x0),
151 fh2AngStructpt3C60(0x0),
152 fh2AngStructpt4C60(0x0),
156 fh2Ntriggers2C10(0x0),
157 fh2Ntriggers2C20(0x0),
159 fh3JetDensityA4(0x0),
170 // default Constructor
174 for(Int_t i=0; i<10; i++) {
175 for(Int_t j=0; j<6; j++) {
184 fJetBranchName[0] = "";
185 fJetBranchName[1] = "";
187 fListJets[0] = new TList;
188 fListJets[1] = new TList;
191 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore(const char *name) :
192 AliAnalysisTaskSE(name),
197 fBackgroundBranch(""),
200 fOfflineTrgMask(AliVEvent::kAny),
207 fFilterMaskBestPt(0),
214 fNInputTracksMax(-1),
216 fAngStructCloseTracks(0),
231 fTrackTypeRec(kTrackUndef),
244 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
245 fJetPtFractionMin(0.5),
249 fRunAnaAzimuthalCorrelation(kFALSE),
254 fHistEvtSelection(0x0),
257 fh2JetCoreMethod1C10(0x0),
258 fh2JetCoreMethod2C10(0x0),
259 fh2JetCoreMethod1C20(0x0),
260 fh2JetCoreMethod2C20(0x0),
261 fh2JetCoreMethod1C30(0x0),
262 fh2JetCoreMethod2C30(0x0),
263 fh2JetCoreMethod1C60(0x0),
264 fh2JetCoreMethod2C60(0x0),
265 fh3JetTrackC3060(0x0),
267 fh2AngStructpt1C10(0x0),
268 fh2AngStructpt2C10(0x0),
269 fh2AngStructpt3C10(0x0),
270 fh2AngStructpt4C10(0x0),
271 fh2AngStructpt1C20(0x0),
272 fh2AngStructpt2C20(0x0),
273 fh2AngStructpt3C20(0x0),
274 fh2AngStructpt4C20(0x0),
275 fh2AngStructpt1C30(0x0),
276 fh2AngStructpt2C30(0x0),
277 fh2AngStructpt3C30(0x0),
278 fh2AngStructpt4C30(0x0),
279 fh2AngStructpt1C60(0x0),
280 fh2AngStructpt2C60(0x0),
281 fh2AngStructpt3C60(0x0),
282 fh2AngStructpt4C60(0x0),
286 fh2Ntriggers2C10(0x0),
287 fh2Ntriggers2C20(0x0),
289 fh3JetDensityA4(0x0),
303 for(Int_t i=0; i<10; i++) {
304 for(Int_t j=0; j<6; j++) {
311 fJetBranchName[0] = "";
312 fJetBranchName[1] = "";
314 fListJets[0] = new TList;
315 fListJets[1] = new TList;
317 DefineOutput(1, TList::Class());
320 AliAnalysisTaskJetCore::~AliAnalysisTaskJetCore()
326 void AliAnalysisTaskJetCore::SetBranchNames(const TString &branch1, const TString &branch2)
328 fJetBranchName[0] = branch1;
329 fJetBranchName[1] = branch2;
332 void AliAnalysisTaskJetCore::Init()
335 // check for jet branches
336 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
337 AliError("Jet branch name not set.");
342 void AliAnalysisTaskJetCore::UserCreateOutputObjects()
347 if(!fOutputList) fOutputList = new TList;
348 fOutputList->SetOwner(kTRUE);
350 Bool_t oldStatus = TH1::AddDirectoryStatus();
351 TH1::AddDirectory(kFALSE);
355 fRandom = new TRandom3(0);
360 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
361 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
362 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
363 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
364 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
365 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
366 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
368 UInt_t entries = 0; // bit coded, see GetDimParams() below
369 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7;
370 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
372 //change binning in pTtrack
373 Double_t *xPt3 = new Double_t[10];
375 for(int i = 1; i<=9;i++){
376 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
377 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
378 else xPt3[i] = xPt3[i-1] + 150.; // 18
380 fhnDeltaR->SetBinEdges(2,xPt3);
383 //change binning in HTI
384 Double_t *xPt4 = new Double_t[14];
386 for(int i = 1; i<=13;i++){
387 if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 1; // 1 - 10
388 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 5; // 10 - 12
389 else xPt4[i] = xPt4[i-1] + 30.; // 13
391 fhnDeltaR->SetBinEdges(6,xPt4);
401 UInt_t cifras = 0; // bit coded, see GetDimParams() below
402 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
403 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);}
406 fh2JetCoreMethod1C10 = new TH2F("JetCoreMethod1C10","",150, 0., 150.,100, 0., 1.5);
407 fh2JetCoreMethod2C10 = new TH2F("JetCoreMethod2C10","",150, 0., 150.,100, 0., 1.5);
408 fh2JetCoreMethod1C20 = new TH2F("JetCoreMethod1C20","",150, 0., 150.,100, 0., 1.5);
409 fh2JetCoreMethod2C20 = new TH2F("JetCoreMethod2C20","",150, 0., 150.,100, 0., 1.5);
410 fh2JetCoreMethod1C30 = new TH2F("JetCoreMethod1C30","",150, 0., 150.,100, 0., 1.5);
411 fh2JetCoreMethod2C30 = new TH2F("JetCoreMethod2C30","",150, 0., 150.,100, 0., 1.5);
412 fh2JetCoreMethod1C60 = new TH2F("JetCoreMethod1C60","",150, 0., 150.,100, 0., 1.5);
413 fh2JetCoreMethod2C60 = new TH2F("JetCoreMethod2C60","",150, 0., 150.,100, 0., 1.5);}
415 fh3JetTrackC3060=new TH3F("JetTrackC3060","",50,0,50,150,0.,150.,35,0.,3.5);
416 fh3JetTrackC20=new TH3F("JetTrackC20","",50,0,50,150,0.,150.,35,0.,3.5);
417 if(fAngStructCloseTracks>0){
418 fh2AngStructpt1C10 = new TH2F("Ang struct pt1 C10","",15,0.,1.5,150,0.,10.);
419 fh2AngStructpt2C10 = new TH2F("Ang struct pt2 C10","",15,0.,1.5,150,0.,10.);
420 fh2AngStructpt3C10 = new TH2F("Ang struct pt3 C10","",15,0.,1.5,150,0.,10.);
421 fh2AngStructpt4C10 = new TH2F("Ang struct pt4 C10","",15,0.,1.5,150,0.,10.);
422 fh2AngStructpt1C20 = new TH2F("Ang struct pt1 C20","",15,0.,1.5,150,0.,10.);
423 fh2AngStructpt2C20 = new TH2F("Ang struct pt2 C20","",15,0.,1.5,150,0.,10.);
424 fh2AngStructpt3C20 = new TH2F("Ang struct pt3 C20","",15,0.,1.5,150,0.,10.);
425 fh2AngStructpt4C20 = new TH2F("Ang struct pt4 C20","",15,0.,1.5,150,0.,10.);
426 fh2AngStructpt1C30 = new TH2F("Ang struct pt1 C30","",15,0.,1.5,150,0.,10.);
427 fh2AngStructpt2C30 = new TH2F("Ang struct pt2 C30","",15,0.,1.5,150,0.,10.);
428 fh2AngStructpt3C30 = new TH2F("Ang struct pt3 C30","",15,0.,1.5,150,0.,10.);
429 fh2AngStructpt4C30 = new TH2F("Ang struct pt4 C30","",15,0.,1.5,150,0.,10.);
430 fh2AngStructpt1C60 = new TH2F("Ang struct pt1 C60","",15,0.,1.5,150,0.,10.);
431 fh2AngStructpt2C60 = new TH2F("Ang struct pt2 C60","",15,0.,1.5,150,0.,10.);
432 fh2AngStructpt3C60 = new TH2F("Ang struct pt3 C60","",15,0.,1.5,150,0.,10.);
433 fh2AngStructpt4C60 = new TH2F("Ang struct pt4 C60","",15,0.,1.5,150,0.,10.); }
436 fh1TrigRef=new TH1D("Trig Ref","",10,0.,10);
437 fh1TrigSig=new TH1D("Trig Sig","",10,0.,10);
438 fh2Ntriggers=new TH2F("# of triggers","",100,0.,100.,50,0.,50.);
439 fh2Ntriggers2C10=new TH2F("# of triggers2C10","",50,0.,50.,50,0.,50.);
440 fh2Ntriggers2C20=new TH2F("# of triggers2C20","",50,0.,50.,50,0.,50.);
441 fh3JetDensity=new TH3F("Jet density vs mutliplicity A>0.07","",100,0.,4000.,100,0.,5.,25,0.,50.);
442 fh3JetDensityA4=new TH3F("Jet density vs multiplicity A>0.4","",100,0.,4000.,100,0.,5.,25,0.,50.);
443 fh2RPJetsC10=new TH2F("RPJetC10","",35,0.,3.5,100,0.,100.);
444 fh2RPJetsC20=new TH2F("RPJetC20","",35,0.,3.5,100,0.,100.);
445 fh2RPTC10=new TH2F("RPTriggerC10","",35,0.,3.5,50,0.,50.);
446 fh2RPTC20=new TH2F("RPTriggerC20","",35,0.,3.5,50,0.,50.);
451 fOutputList->Add(fHistEvtSelection);
453 fOutputList->Add(fhnDeltaR);
455 fOutputList->Add(fhnMixedEvents);
461 fOutputList->Add(fh2JetCoreMethod1C10);
462 fOutputList->Add(fh2JetCoreMethod2C10);
463 fOutputList->Add(fh2JetCoreMethod1C20);
464 fOutputList->Add(fh2JetCoreMethod2C20);
465 fOutputList->Add(fh2JetCoreMethod1C30);
466 fOutputList->Add(fh2JetCoreMethod2C30);
467 fOutputList->Add(fh2JetCoreMethod1C60);
468 fOutputList->Add(fh2JetCoreMethod2C60);}
470 fOutputList->Add(fh3JetTrackC3060);
471 fOutputList->Add(fh3JetTrackC20);
477 if(fAngStructCloseTracks>0){
478 fOutputList->Add(fh2AngStructpt1C10);
479 fOutputList->Add(fh2AngStructpt2C10);
480 fOutputList->Add(fh2AngStructpt3C10);
481 fOutputList->Add(fh2AngStructpt4C10);
482 fOutputList->Add(fh2AngStructpt1C20);
483 fOutputList->Add(fh2AngStructpt2C20);
484 fOutputList->Add(fh2AngStructpt3C20);
485 fOutputList->Add(fh2AngStructpt4C20);
486 fOutputList->Add(fh2AngStructpt1C30);
487 fOutputList->Add(fh2AngStructpt2C30);
488 fOutputList->Add(fh2AngStructpt3C30);
489 fOutputList->Add(fh2AngStructpt4C30);
490 fOutputList->Add(fh2AngStructpt1C60);
491 fOutputList->Add(fh2AngStructpt2C60);
492 fOutputList->Add(fh2AngStructpt3C60);
493 fOutputList->Add(fh2AngStructpt4C60);}
498 fOutputList->Add(fh1TrigRef);
499 fOutputList->Add(fh1TrigSig);
500 fOutputList->Add(fh2Ntriggers);
501 fOutputList->Add(fh2Ntriggers2C10);
502 fOutputList->Add(fh2Ntriggers2C20);
503 fOutputList->Add(fh3JetDensity);
504 fOutputList->Add(fh3JetDensityA4);
505 fOutputList->Add(fh2RPJetsC10);
506 fOutputList->Add(fh2RPJetsC20);
507 fOutputList->Add(fh2RPTC10);
508 fOutputList->Add(fh2RPTC20);
510 const Int_t dimSpec = 5;
511 const Int_t nBinsSpec[dimSpec] = {100,6, 140, 50, fNRPBins};
512 const Double_t lowBinSpec[dimSpec] = {0,0,-80, 0, 0};
513 const Double_t hiBinSpec[dimSpec] = {100,1, 200, 50, fNRPBins};
514 fHJetSpec = new THnSparseF("fHJetSpec","Recoil jet spectrum",dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
516 //change binning in jet area
517 Double_t *xPt6 = new Double_t[7];
525 fHJetSpec->SetBinEdges(1,xPt6);
532 fOutputList->Add(fHJetSpec);
535 if(fRunAnaAzimuthalCorrelation)
537 fhTTPt = new TH2F("fhTTPt","Trigger track p_{T} vs centrality",10,0,100,100,0,100);
538 fOutputList->Add(fhTTPt);
540 const Int_t dimCor = 5;
541 const Int_t nBinsCor[dimCor] = {50, 200, 100, 8, 10};
542 const Double_t lowBinCor[dimCor] = {0, -50, -0.5*TMath::Pi(), 0, 0};
543 const Double_t hiBinCor[dimCor] = {50, 150, 1.5*TMath::Pi(), 0.8, 100};
544 fHJetPhiCorr = new THnSparseF("fHJetPhiCorr","TT p_{T} vs jet p_{T} vs dPhi vs area vs centrality",dimCor,nBinsCor,lowBinCor,hiBinCor);
545 fOutputList->Add(fHJetPhiCorr);
551 // =========== Switch on Sumw2 for all histos ===========
552 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
553 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
558 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
563 TH1::AddDirectory(oldStatus);
565 PostData(1, fOutputList);
568 void AliAnalysisTaskJetCore::UserExec(Option_t *)
572 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
573 AliError("Jet branch name not set.");
577 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
579 AliError("ESD not available");
580 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
582 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
584 static AliAODEvent* aod = 0;
585 // take all other information from the aod we take the tracks from
587 if(!fESD)aod = fAODIn;
592 if(fNonStdFile.Length()!=0){
593 // case that we have an AOD extension we need can fetch the jets from the extended output
594 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
595 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
597 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
601 // -- event selection --
602 fHistEvtSelection->Fill(1); // number of events before event selection
605 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
606 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
607 std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
608 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
609 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
610 fHistEvtSelection->Fill(2);
611 PostData(1, fOutputList);
617 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
618 fHistEvtSelection->Fill(3);
619 PostData(1, fOutputList);
621 AliAODVertex* primVtx = aod->GetPrimaryVertex();
624 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
625 fHistEvtSelection->Fill(3);
626 PostData(1, fOutputList);
630 Int_t nTracksPrim = primVtx->GetNContributors();
631 if ((nTracksPrim < fMinContribVtx) ||
632 (primVtx->GetZ() < fVtxZMin) ||
633 (primVtx->GetZ() > fVtxZMax) ){
634 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
635 fHistEvtSelection->Fill(3);
636 PostData(1, fOutputList);
640 // event class selection (from jet helper task)
641 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
642 if(fDebug) Printf("Event class %d", eventClass);
643 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
644 fHistEvtSelection->Fill(4);
645 PostData(1, fOutputList);
649 // centrality selection
650 AliCentrality *cent = 0x0;
651 Double_t centValue = 0.;
653 if(fESD) {cent = fESD->GetCentrality();
654 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
655 else centValue=aod->GetHeader()->GetCentrality();
657 if(fDebug) printf("centrality: %f\n", centValue);
658 if (centValue < fCentMin || centValue > fCentMax){
659 fHistEvtSelection->Fill(4);
660 PostData(1, fOutputList);
665 fHistEvtSelection->Fill(0);
667 // -- end event selection --
670 AliAODJetEventBackground* externalBackground = 0;
671 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
672 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
673 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
675 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
676 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
677 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
680 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
681 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
682 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
688 if(externalBackground)rho = externalBackground->GetBackground(0);}
690 if(externalBackground)rho = externalBackground->GetBackground(2);}
693 TClonesArray *aodJets[2];
695 if(fAODOut&&!aodJets[0]){
696 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
697 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
698 if(fAODExtension && !aodJets[0]){
699 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
700 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
701 if(fAODIn&&!aodJets[0]){
702 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
703 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
712 Double_t dice=fRandom->Uniform(0,1);
713 if(dice>fFrac){ minT=fTTLowRef;
715 if(dice<=fFrac){minT=fTTLowSig;
720 if(fHardest==1 || fHardest==2) nT = GetListOfTracks(&ParticleList);
721 if(fHardest==0) nT=SelectTrigger(&ParticleList,minT,maxT,number);
723 PostData(1, fOutputList);
726 if(dice>fFrac) fh1TrigRef->Fill(number);
727 if(dice<=fFrac)fh1TrigSig->Fill(number);
729 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
730 fListJets[iJetType]->Clear();
731 if (!aodJets[iJetType]) continue;
732 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
733 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
734 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
735 if (jet) fListJets[iJetType]->Add(jet);
737 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
746 Double_t areasmall=0;
747 Double_t phismall=0.;
753 Int_t trigBBTrack=-1;
754 Int_t trigInTrack=-1;
755 fRPAngle = aod->GetHeader()->GetEventplane();
757 if(fHardest==0 || fHardest==1){
758 AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
760 PostData(1, fOutputList);
763 if(fSemigoodCorrect){
764 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
765 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6){
766 PostData(1, fOutputList);
773 for(Int_t tt=0;tt<ParticleList.GetEntries();tt++){
774 if(fHardest==0||fHardest==1){if(tt!=nT) continue;}
775 AliVParticle *partback = (AliVParticle*)ParticleList.At(tt);
776 if(!partback) continue;
777 if(partback->Pt()<8) continue;
779 Double_t accep=2.*TMath::Pi()*1.8;
783 if(fSemigoodCorrect){
784 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
785 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6) continue;}
789 fh2Ntriggers->Fill(centValue,partback->Pt());
790 Double_t phiBinT = RelativePhi(partback->Phi(),fRPAngle);
791 if(centValue<20.) fh2RPTC20->Fill(TMath::Abs(phiBinT),partback->Pt());
792 if(centValue<10.) fh2RPTC10->Fill(TMath::Abs(phiBinT),partback->Pt());
796 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
797 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
798 etabig = jetbig->Eta();
799 phibig = jetbig->Phi();
800 ptbig = jetbig->Pt();
801 if(ptbig==0) continue;
802 Double_t phiBin = RelativePhi(phibig,fRPAngle);
803 areabig = jetbig->EffectiveAreaCharged();
804 Double_t ptcorr=ptbig-rho*areabig;
805 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
806 if(areabig>=0.07) injet=injet+1;
807 if(areabig>=0.4) injet4=injet4+1;
808 Double_t dphi=RelativePhi(partback->Phi(),phibig);
811 Double_t etadif= partback->Eta()-etabig;
812 if(TMath::Abs(etadif)<=0.5){
814 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
815 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
817 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
818 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
821 if(fFlagJetHadron==0){
822 if(fFlagPhiBkg==1) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
823 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
824 if(fFlagPhiBkg==2) if(TMath::Abs(dphi)<TMath::Pi()-0.7) continue;
825 if(fFlagPhiBkg==3) if(TMath::Abs(dphi)<TMath::Pi()-0.5) continue;}
827 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
830 if(centValue<10.) fh2RPJetsC10->Fill(TMath::Abs(phiBin), ptcorr);
831 if(centValue<20.) fh2RPJetsC20->Fill(TMath::Abs(phiBin), ptcorr);
832 Double_t dismin=100.;
837 Float_t phitt=partback->Phi();
838 if(phitt<0)phitt+=TMath::Pi()*2.;
839 Int_t phiBintt = GetPhiBin(phitt-fRPAngle);
841 Double_t fillspec[] = {centValue,jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt(),phiBintt};
842 fHJetSpec->Fill(fillspec);
846 if(ptcorr<=0) continue;
848 AliAODTrack* leadtrack=0;
851 if(fFlagJetHadron==0){
852 TRefArray *genTrackList = jetbig->GetRefTracks();
853 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
854 AliAODTrack* genTrack;
855 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
856 genTrack = (AliAODTrack*)(genTrackList->At(ir));
857 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
859 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
860 if(!leadtrack) continue;
865 AliVParticle* leadtrackb=0;
866 if(fFlagJetHadron!=0){
867 Int_t nTb = GetHardestTrackBackToJet(jetbig);
868 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
869 if(!leadtrackb) continue;
876 //store one trigger info
885 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
886 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
887 etasmall = jetsmall->Eta();
888 phismall = jetsmall->Phi();
889 ptsmall = jetsmall->Pt();
890 areasmall = jetsmall->EffectiveAreaCharged();
891 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
892 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
893 //Fraction in the jet core
894 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
896 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
897 index1=j;}} //en of loop over R=0.2 jets
898 //method1:most concentric jet=core
899 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
900 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
901 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
902 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
903 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
904 //method2:hardest contained jet=core
906 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
907 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
908 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
909 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
910 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
911 if(centValue<10&&leadtrack) fh2Ntriggers2C10->Fill(leadtrack->Pt(),partback->Pt());
912 if(centValue<20&&leadtrack) fh2Ntriggers2C20->Fill(leadtrack->Pt(),partback->Pt());
913 if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
914 for(int it = 0;it<ParticleList.GetEntries();++it){
915 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
916 Double_t deltaR = jetbig->DeltaR(part);
917 Double_t deltaEta = etabig-part->Eta();
919 Double_t deltaPhi=phibig-part->Phi();
920 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
921 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
923 if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
924 if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
925 Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
926 fhnDeltaR->Fill(jetEntries);}
932 //end of track loop, we only do it if EM is switched off
943 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
944 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
950 if(fDoEventMixing>0){
951 //check before if the trigger exists
952 // fTrigBuffer[i][0] = zvtx
953 // fTrigBuffer[i][1] = phi
954 // fTrigBuffer[i][2] = eta
955 // fTrigBuffer[i][3] = pt_jet
956 // fTrigBuffer[i][4] = pt_trig
957 // fTrigBuffer[i][5]= centrality
958 if(fTindex==10) fTindex=0;
959 if(fTrigBuffer[fTindex][3]>0){
960 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
961 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
963 for(int it = 0;it<nT;++it){
964 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
965 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
966 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
967 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
968 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
969 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
970 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
971 fhnMixedEvents->Fill(triggerEntries);
974 if(fNevents==10) fTindex=fTindex+1;
977 if(fTindex==10&&fNevents==10) fCountAgain=0;
979 // Copy the triggers from the current event into the buffer.
980 //again, only if the trigger exists:
983 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
984 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
985 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
986 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
987 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
988 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
989 fTrigBuffer[fTrigBufferIndex][5] = centValue;
991 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
998 /////////////////////////////////////////////////////////////////////////////
999 ////////////////////// Rongrong's analysis //////////////////////////////////
1000 if(fRunAnaAzimuthalCorrelation)
1002 fhTTPt->Fill(centValue,partback->Pt());
1003 for(Int_t ij=0; ij<fListJets[0]->GetEntries(); ij++)
1005 AliAODJet* jet = (AliAODJet*)(fListJets[0]->At(ij));
1006 Double_t jetPt = jet->Pt();
1007 Double_t jetEta = jet->Eta();
1008 Double_t jetPhi = jet->Phi();
1009 if(jetPt==0) continue;
1010 if((jetEta<fJetEtaMin)||(jetEta>fJetEtaMax)) continue;
1011 Double_t jetArea = jet->EffectiveAreaCharged();
1012 Double_t jetPtCorr=jetPt-rho*jetArea;
1013 Double_t dPhi=jetPhi-partback->Phi();
1014 if(dPhi>2*TMath::Pi()) dPhi -= 2*TMath::Pi();
1015 if(dPhi<-2*TMath::Pi()) dPhi += 2*TMath::Pi();
1016 if(dPhi<-0.5*TMath::Pi()) dPhi += 2*TMath::Pi();
1017 if(dPhi>1.5*TMath::Pi()) dPhi -= 2*TMath::Pi();
1019 Double_t fill[] = {partback->Pt(),jetPtCorr,dPhi,jetArea,centValue};
1020 fHJetPhiCorr->Fill(fill);
1023 /////////////////////////////////////////////////////////////////////////////
1024 /////////////////////////////////////////////////////////////////////////////
1027 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
1029 //tracks up to R=0.8 distant from the jet axis
1030 // if(fAngStructCloseTracks==1){
1031 // TList CloseTrackList;
1032 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
1033 // Double_t difR=0.04;
1034 // for(Int_t l=0;l<15;l++){
1035 // Double_t rr=l*0.1+0.1;
1036 // for(int it = 0;it<nn;++it){
1037 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
1038 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
1039 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
1040 // Double_t ptm=part1->Pt();
1041 // Double_t ptn=part2->Pt();
1042 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1043 // Rnm=TMath::Sqrt(Rnm);
1044 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1045 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1046 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1047 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1048 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1049 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1050 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1051 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1052 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1053 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
1056 // //only jet constituents
1057 // if(fAngStructCloseTracks==2){
1059 // Double_t difR=0.04;
1060 // for(Int_t l=0;l<15;l++){
1061 // Double_t rr=l*0.1+0.1;
1064 // AliAODTrack* part1;
1065 // AliAODTrack* part2;
1067 // TRefArray *genTrackListb = jetbig->GetRefTracks();
1068 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
1072 // for(Int_t it=0; it<nTracksGenJetb; ++it){
1073 // part1 = (AliAODTrack*)(genTrackListb->At(it));
1074 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
1075 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
1076 // Double_t ptm=part1->Pt();
1077 // Double_t ptn=part2->Pt();
1078 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1079 // Rnm=TMath::Sqrt(Rnm);
1080 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1081 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1082 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1083 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1084 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1085 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1086 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1087 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1088 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1089 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
1091 // //end loop over R=0.4 jets
1092 // if(fAngStructCloseTracks>0){
1093 // for(Int_t l=0;l<15;l++){
1094 // Double_t rr=l*0.1+0.1;
1096 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
1097 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
1098 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
1099 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
1101 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
1102 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
1103 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
1104 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
1106 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
1107 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
1108 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
1109 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
1111 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
1112 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
1113 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
1114 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
1122 PostData(1, fOutputList);
1125 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
1127 // Draw result to the screen
1128 // Called once at the end of the query
1130 if (!GetOutputData(1))
1139 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
1142 AliAODEvent *aod = 0;
1144 if(!fESD)aod = fAODIn;
1154 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1155 AliAODTrack *tr = aod->GetTrack(it);
1156 Bool_t bGood = false;
1157 if(fFilterType == 0)bGood = true;
1158 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1159 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1160 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1161 if(fRequireITSRefit==0){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1162 if(bGood==false) continue;
1163 if(TMath::Abs(tr->Eta())>0.9)continue;
1164 if(tr->Pt()<0.15)continue;
1167 if(fFilterType==2 && fFilterMaskBestPt>0){// only set the trigger track index for good quality tracks
1168 if(tr->TestFilterBit(fFilterMaskBestPt)){
1184 // else if (type == kTrackAODMCCharged) {
1185 // TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1186 // if(!tca)return iCount;
1187 // for(int it = 0;it < tca->GetEntriesFast();++it){
1188 // AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1189 // if(!part)continue;
1190 // if(part->Pt()<0.15)continue;
1191 // if(!part->IsPhysicalPrimary())continue;
1192 // if(part->Charge()==0)continue;
1193 // if(TMath::Abs(part->Eta())>0.9)continue;
1196 // if(part->Pt()>ptmax){ ptmax=part->Pt();
1197 // index=iCount-1;}}}
1204 Int_t AliAnalysisTaskJetCore::SelectTrigger(TList *list,Double_t minT,Double_t maxT,Int_t &number){
1206 AliAODEvent *aod = 0;
1207 if(!fESD)aod = fAODIn;
1211 Int_t triggers[100];
1212 for(Int_t cr=0;cr<100;cr++){triggers[cr]=-1;}
1214 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1215 AliAODTrack *tr = aod->GetTrack(it);
1216 Bool_t bGood = false;
1217 if(fFilterType == 0)bGood = true;
1218 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1219 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1220 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1221 if(fRequireITSRefit==0){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1222 if(bGood==false) continue;
1223 if(TMath::Abs(tr->Eta())>0.9)continue;
1224 if(tr->Pt()<0.15)continue;
1228 if(tr->Pt()>=minT && tr->Pt()<maxT){
1229 triggers[im]=iCount-1;
1236 if(im>0) rd=fRandom->Integer(im);
1262 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
1264 AliAODEvent *aod = 0;
1265 if(!fESD)aod = fAODIn;
1272 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1273 AliAODTrack *tr = aod->GetTrack(it);
1274 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1275 if(TMath::Abs(tr->Eta())>0.9)continue;
1276 if(tr->Pt()<0.15)continue;
1278 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1279 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1280 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1296 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1299 AliAODEvent *aod = 0;
1300 if(!fESD)aod = fAODIn;
1303 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1304 AliAODTrack *tr = aod->GetTrack(it);
1305 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1306 if(TMath::Abs(tr->Eta())>0.9)continue;
1307 if(tr->Pt()<0.15)continue;
1308 Double_t disR=jetbig->DeltaR(tr);
1309 if(disR>0.8) continue;
1311 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1330 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1333 Int_t nInputTracks = 0;
1334 AliAODEvent *aod = 0;
1335 if(!fESD)aod = fAODIn;
1337 TString jbname(fJetBranchName[1]);
1338 //needs complete event, use jets without background subtraction
1339 for(Int_t i=1; i<=3; ++i){
1340 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1342 // use only HI event
1343 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1344 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1346 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1347 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1349 Printf("Jet branch %s not found", jbname.Data());
1350 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1354 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1355 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1357 TRefArray *trackList = jet->GetRefTracks();
1358 Int_t nTracks = trackList->GetEntriesFast();
1359 nInputTracks += nTracks;
1360 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1362 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1364 return nInputTracks;
1369 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1371 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1372 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1373 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1374 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1375 double dphi = mphi-vphi;
1376 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1377 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1378 return dphi;//dphi in [-Pi, Pi]
1381 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1384 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1385 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1386 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1387 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1394 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1396 // generate new THnSparseF, axes are defined in GetDimParams()
1399 UInt_t tmp = entries;
1402 tmp = tmp &~ -tmp; // clear lowest bit
1405 TString hnTitle(name);
1406 const Int_t dim = count;
1413 while(c<dim && i<32){
1417 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1418 hnTitle += Form(";%s",label.Data());
1426 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1429 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1431 // stores label and binning of axis for THnSparse
1433 const Double_t pi = TMath::Pi();
1438 label = "V0 centrality (%)";
1447 label = "corrected jet pt";
1490 label = "leading track";
1498 label = "trigger track";