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"
37 #include "AliAnalysisTask.h"
38 #include "AliAnalysisManager.h"
40 #include "AliVEvent.h"
41 #include "AliESDEvent.h"
42 #include "AliESDInputHandler.h"
43 #include "AliCentrality.h"
44 #include "AliAnalysisHelperJetTasks.h"
45 #include "AliInputEventHandler.h"
46 #include "AliAODJetEventBackground.h"
47 #include "AliAODMCParticle.h"
48 #include "AliAnalysisTaskFastEmbedding.h"
49 #include "AliAODEvent.h"
50 #include "AliAODHandler.h"
51 #include "AliAODJet.h"
53 #include "AliAnalysisTaskJetCore.h"
58 ClassImp(AliAnalysisTaskJetCore)
60 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore() :
66 fBackgroundBranch(""),
69 fOfflineTrgMask(AliVEvent::kAny),
85 fApplySharedClusterCut(0),
86 fAngStructCloseTracks(0),
102 fTrackTypeRec(kTrackUndef),
115 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
116 fJetPtFractionMin(0.5),
120 fRunAnaAzimuthalCorrelation(kFALSE),
125 fHistEvtSelection(0x0),
128 fh2JetCoreMethod1C10(0x0),
129 fh2JetCoreMethod2C10(0x0),
130 fh2JetCoreMethod1C20(0x0),
131 fh2JetCoreMethod2C20(0x0),
132 fh2JetCoreMethod1C30(0x0),
133 fh2JetCoreMethod2C30(0x0),
134 fh2JetCoreMethod1C60(0x0),
135 fh2JetCoreMethod2C60(0x0),
136 fh3JetTrackC3060(0x0),
138 fh2AngStructpt1C10(0x0),
139 fh2AngStructpt2C10(0x0),
140 fh2AngStructpt3C10(0x0),
141 fh2AngStructpt4C10(0x0),
142 fh2AngStructpt1C20(0x0),
143 fh2AngStructpt2C20(0x0),
144 fh2AngStructpt3C20(0x0),
145 fh2AngStructpt4C20(0x0),
146 fh2AngStructpt1C30(0x0),
147 fh2AngStructpt2C30(0x0),
148 fh2AngStructpt3C30(0x0),
149 fh2AngStructpt4C30(0x0),
150 fh2AngStructpt1C60(0x0),
151 fh2AngStructpt2C60(0x0),
152 fh2AngStructpt3C60(0x0),
153 fh2AngStructpt4C60(0x0),
156 fh1TrackPhiDistance(0x0),
157 fh1TrackRDistance(0x0),
159 fh2Ntriggers2C10(0x0),
160 fh2Ntriggers2C20(0x0),
162 fh3JetDensityA4(0x0),
173 // default Constructor
177 for(Int_t i=0; i<10; i++) {
178 for(Int_t j=0; j<6; j++) {
187 fJetBranchName[0] = "";
188 fJetBranchName[1] = "";
190 fListJets[0] = new TList;
191 fListJets[1] = new TList;
194 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore(const char *name) :
195 AliAnalysisTaskSE(name),
200 fBackgroundBranch(""),
203 fOfflineTrgMask(AliVEvent::kAny),
210 fFilterMaskBestPt(0),
217 fNInputTracksMax(-1),
219 fApplySharedClusterCut(0),
220 fAngStructCloseTracks(0),
236 fTrackTypeRec(kTrackUndef),
249 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
250 fJetPtFractionMin(0.5),
254 fRunAnaAzimuthalCorrelation(kFALSE),
259 fHistEvtSelection(0x0),
262 fh2JetCoreMethod1C10(0x0),
263 fh2JetCoreMethod2C10(0x0),
264 fh2JetCoreMethod1C20(0x0),
265 fh2JetCoreMethod2C20(0x0),
266 fh2JetCoreMethod1C30(0x0),
267 fh2JetCoreMethod2C30(0x0),
268 fh2JetCoreMethod1C60(0x0),
269 fh2JetCoreMethod2C60(0x0),
270 fh3JetTrackC3060(0x0),
272 fh2AngStructpt1C10(0x0),
273 fh2AngStructpt2C10(0x0),
274 fh2AngStructpt3C10(0x0),
275 fh2AngStructpt4C10(0x0),
276 fh2AngStructpt1C20(0x0),
277 fh2AngStructpt2C20(0x0),
278 fh2AngStructpt3C20(0x0),
279 fh2AngStructpt4C20(0x0),
280 fh2AngStructpt1C30(0x0),
281 fh2AngStructpt2C30(0x0),
282 fh2AngStructpt3C30(0x0),
283 fh2AngStructpt4C30(0x0),
284 fh2AngStructpt1C60(0x0),
285 fh2AngStructpt2C60(0x0),
286 fh2AngStructpt3C60(0x0),
287 fh2AngStructpt4C60(0x0),
290 fh1TrackPhiDistance(0x0),
291 fh1TrackRDistance(0x0),
293 fh2Ntriggers2C10(0x0),
294 fh2Ntriggers2C20(0x0),
296 fh3JetDensityA4(0x0),
310 for(Int_t i=0; i<10; i++) {
311 for(Int_t j=0; j<6; j++) {
318 fJetBranchName[0] = "";
319 fJetBranchName[1] = "";
321 fListJets[0] = new TList;
322 fListJets[1] = new TList;
324 DefineOutput(1, TList::Class());
327 AliAnalysisTaskJetCore::~AliAnalysisTaskJetCore()
333 void AliAnalysisTaskJetCore::SetBranchNames(const TString &branch1, const TString &branch2)
335 fJetBranchName[0] = branch1;
336 fJetBranchName[1] = branch2;
339 void AliAnalysisTaskJetCore::Init()
342 // check for jet branches
343 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
344 AliError("Jet branch name not set.");
349 void AliAnalysisTaskJetCore::UserCreateOutputObjects()
354 if(!fOutputList) fOutputList = new TList;
355 fOutputList->SetOwner(kTRUE);
357 Bool_t oldStatus = TH1::AddDirectoryStatus();
358 TH1::AddDirectory(kFALSE);
362 fRandom = new TRandom3(0);
367 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
368 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
369 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
370 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
371 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
372 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
373 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
375 UInt_t entries = 0; // bit coded, see GetDimParams() below
376 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7;
377 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
379 //change binning in pTtrack
380 Double_t *xPt3 = new Double_t[10];
382 for(int i = 1; i<=9;i++){
383 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
384 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
385 else xPt3[i] = xPt3[i-1] + 150.; // 18
387 fhnDeltaR->SetBinEdges(2,xPt3);
390 //change binning in HTI
391 Double_t *xPt4 = new Double_t[14];
393 for(int i = 1; i<=13;i++){
394 if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 1; // 1 - 10
395 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 5; // 10 - 12
396 else xPt4[i] = xPt4[i-1] + 30.; // 13
398 fhnDeltaR->SetBinEdges(6,xPt4);
408 UInt_t cifras = 0; // bit coded, see GetDimParams() below
409 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
410 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);}
413 fh2JetCoreMethod1C10 = new TH2F("JetCoreMethod1C10","",150, 0., 150.,100, 0., 1.5);
414 fh2JetCoreMethod2C10 = new TH2F("JetCoreMethod2C10","",150, 0., 150.,100, 0., 1.5);
415 fh2JetCoreMethod1C20 = new TH2F("JetCoreMethod1C20","",150, 0., 150.,100, 0., 1.5);
416 fh2JetCoreMethod2C20 = new TH2F("JetCoreMethod2C20","",150, 0., 150.,100, 0., 1.5);
417 fh2JetCoreMethod1C30 = new TH2F("JetCoreMethod1C30","",150, 0., 150.,100, 0., 1.5);
418 fh2JetCoreMethod2C30 = new TH2F("JetCoreMethod2C30","",150, 0., 150.,100, 0., 1.5);
419 fh2JetCoreMethod1C60 = new TH2F("JetCoreMethod1C60","",150, 0., 150.,100, 0., 1.5);
420 fh2JetCoreMethod2C60 = new TH2F("JetCoreMethod2C60","",150, 0., 150.,100, 0., 1.5);}
422 fh3JetTrackC3060=new TH3F("JetTrackC3060","",50,0,50,150,0.,150.,35,0.,3.5);
423 fh3JetTrackC20=new TH3F("JetTrackC20","",50,0,50,150,0.,150.,35,0.,3.5);
424 if(fAngStructCloseTracks>0){
425 fh2AngStructpt1C10 = new TH2F("Ang struct pt1 C10","",15,0.,1.5,150,0.,10.);
426 fh2AngStructpt2C10 = new TH2F("Ang struct pt2 C10","",15,0.,1.5,150,0.,10.);
427 fh2AngStructpt3C10 = new TH2F("Ang struct pt3 C10","",15,0.,1.5,150,0.,10.);
428 fh2AngStructpt4C10 = new TH2F("Ang struct pt4 C10","",15,0.,1.5,150,0.,10.);
429 fh2AngStructpt1C20 = new TH2F("Ang struct pt1 C20","",15,0.,1.5,150,0.,10.);
430 fh2AngStructpt2C20 = new TH2F("Ang struct pt2 C20","",15,0.,1.5,150,0.,10.);
431 fh2AngStructpt3C20 = new TH2F("Ang struct pt3 C20","",15,0.,1.5,150,0.,10.);
432 fh2AngStructpt4C20 = new TH2F("Ang struct pt4 C20","",15,0.,1.5,150,0.,10.);
433 fh2AngStructpt1C30 = new TH2F("Ang struct pt1 C30","",15,0.,1.5,150,0.,10.);
434 fh2AngStructpt2C30 = new TH2F("Ang struct pt2 C30","",15,0.,1.5,150,0.,10.);
435 fh2AngStructpt3C30 = new TH2F("Ang struct pt3 C30","",15,0.,1.5,150,0.,10.);
436 fh2AngStructpt4C30 = new TH2F("Ang struct pt4 C30","",15,0.,1.5,150,0.,10.);
437 fh2AngStructpt1C60 = new TH2F("Ang struct pt1 C60","",15,0.,1.5,150,0.,10.);
438 fh2AngStructpt2C60 = new TH2F("Ang struct pt2 C60","",15,0.,1.5,150,0.,10.);
439 fh2AngStructpt3C60 = new TH2F("Ang struct pt3 C60","",15,0.,1.5,150,0.,10.);
440 fh2AngStructpt4C60 = new TH2F("Ang struct pt4 C60","",15,0.,1.5,150,0.,10.); }
443 fh1TrigRef=new TH1D("Trig Ref","",10,0.,10);
444 fh1TrigSig=new TH1D("Trig Sig","",10,0.,10);
445 fh1TrackPhiDistance=new TH1D("PhiDistance","",35,0.,3.5);
446 fh1TrackRDistance=new TH1D("RDistance","",10,0.,1);
447 fh2Ntriggers=new TH2F("# of triggers","",100,0.,100.,50,0.,50.);
448 fh2Ntriggers2C10=new TH2F("# of triggers2C10","",50,0.,50.,50,0.,50.);
449 fh2Ntriggers2C20=new TH2F("# of triggers2C20","",50,0.,50.,50,0.,50.);
450 fh3JetDensity=new TH3F("Jet density vs mutliplicity A>0.07","",100,0.,4000.,100,0.,5.,25,0.,50.);
451 fh3JetDensityA4=new TH3F("Jet density vs multiplicity A>0.4","",100,0.,4000.,100,0.,5.,25,0.,50.);
452 fh2RPJetsC10=new TH2F("RPJetC10","",35,0.,3.5,100,0.,100.);
453 fh2RPJetsC20=new TH2F("RPJetC20","",35,0.,3.5,100,0.,100.);
454 fh2RPTC10=new TH2F("RPTriggerC10","",35,0.,3.5,50,0.,50.);
455 fh2RPTC20=new TH2F("RPTriggerC20","",35,0.,3.5,50,0.,50.);
460 fOutputList->Add(fHistEvtSelection);
462 fOutputList->Add(fhnDeltaR);
464 fOutputList->Add(fhnMixedEvents);
470 fOutputList->Add(fh2JetCoreMethod1C10);
471 fOutputList->Add(fh2JetCoreMethod2C10);
472 fOutputList->Add(fh2JetCoreMethod1C20);
473 fOutputList->Add(fh2JetCoreMethod2C20);
474 fOutputList->Add(fh2JetCoreMethod1C30);
475 fOutputList->Add(fh2JetCoreMethod2C30);
476 fOutputList->Add(fh2JetCoreMethod1C60);
477 fOutputList->Add(fh2JetCoreMethod2C60);}
479 fOutputList->Add(fh3JetTrackC3060);
480 fOutputList->Add(fh3JetTrackC20);
486 if(fAngStructCloseTracks>0){
487 fOutputList->Add(fh2AngStructpt1C10);
488 fOutputList->Add(fh2AngStructpt2C10);
489 fOutputList->Add(fh2AngStructpt3C10);
490 fOutputList->Add(fh2AngStructpt4C10);
491 fOutputList->Add(fh2AngStructpt1C20);
492 fOutputList->Add(fh2AngStructpt2C20);
493 fOutputList->Add(fh2AngStructpt3C20);
494 fOutputList->Add(fh2AngStructpt4C20);
495 fOutputList->Add(fh2AngStructpt1C30);
496 fOutputList->Add(fh2AngStructpt2C30);
497 fOutputList->Add(fh2AngStructpt3C30);
498 fOutputList->Add(fh2AngStructpt4C30);
499 fOutputList->Add(fh2AngStructpt1C60);
500 fOutputList->Add(fh2AngStructpt2C60);
501 fOutputList->Add(fh2AngStructpt3C60);
502 fOutputList->Add(fh2AngStructpt4C60);}
506 fOutputList->Add(fh1TrigRef);
507 fOutputList->Add(fh1TrigSig);
508 fOutputList->Add(fh1TrackPhiDistance);
509 fOutputList->Add(fh1TrackRDistance);
510 fOutputList->Add(fh2Ntriggers);
511 fOutputList->Add(fh2Ntriggers2C10);
512 fOutputList->Add(fh2Ntriggers2C20);
513 fOutputList->Add(fh3JetDensity);
514 fOutputList->Add(fh3JetDensityA4);
515 fOutputList->Add(fh2RPJetsC10);
516 fOutputList->Add(fh2RPJetsC20);
517 fOutputList->Add(fh2RPTC10);
518 fOutputList->Add(fh2RPTC20);
520 const Int_t dimSpec = 5;
521 const Int_t nBinsSpec[dimSpec] = {100,6, 140, 50, fNRPBins};
522 const Double_t lowBinSpec[dimSpec] = {0,0,-80, 0, 0};
523 const Double_t hiBinSpec[dimSpec] = {100,1, 200, 50, static_cast<Double_t>(fNRPBins)};
524 fHJetSpec = new THnSparseF("fHJetSpec","Recoil jet spectrum",dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
526 //change binning in jet area
527 Double_t *xPt6 = new Double_t[7];
535 fHJetSpec->SetBinEdges(1,xPt6);
542 fOutputList->Add(fHJetSpec);
545 if(fRunAnaAzimuthalCorrelation)
547 fhTTPt = new TH2F("fhTTPt","Trigger track p_{T} vs centrality",10,0,100,100,0,100);
548 fOutputList->Add(fhTTPt);
550 const Int_t dimCor = 5;
551 const Int_t nBinsCor[dimCor] = {50, 200, 100, 8, 10};
552 const Double_t lowBinCor[dimCor] = {0, -50, -0.5*TMath::Pi(), 0, 0};
553 const Double_t hiBinCor[dimCor] = {50, 150, 1.5*TMath::Pi(), 0.8, 100};
554 fHJetPhiCorr = new THnSparseF("fHJetPhiCorr","TT p_{T} vs jet p_{T} vs dPhi vs area vs centrality",dimCor,nBinsCor,lowBinCor,hiBinCor);
555 fOutputList->Add(fHJetPhiCorr);
561 // =========== Switch on Sumw2 for all histos ===========
562 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
563 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
568 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
573 TH1::AddDirectory(oldStatus);
575 PostData(1, fOutputList);
578 void AliAnalysisTaskJetCore::UserExec(Option_t *)
582 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
583 AliError("Jet branch name not set.");
587 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
589 AliError("ESD not available");
590 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
592 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
594 static AliAODEvent* aod = 0;
595 // take all other information from the aod we take the tracks from
597 if(!fESD)aod = fAODIn;
602 if(fNonStdFile.Length()!=0){
603 // case that we have an AOD extension we need can fetch the jets from the extended output
604 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
605 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
607 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
611 // -- event selection --
612 fHistEvtSelection->Fill(1); // number of events before event selection
615 Bool_t selected=kTRUE;
616 selected = AliAnalysisHelperJetTasks::Selected();
618 // no selection by the service task, we continue
619 PostData(1,fOutputList);
624 // physics selection: this is now redundant, all should appear as accepted after service task selection
625 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
626 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
627 std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
628 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
629 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
630 fHistEvtSelection->Fill(2);
631 PostData(1, fOutputList);
639 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
640 fHistEvtSelection->Fill(3);
641 PostData(1, fOutputList);
643 AliAODVertex* primVtx = aod->GetPrimaryVertex();
646 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
647 fHistEvtSelection->Fill(3);
648 PostData(1, fOutputList);
652 Int_t nTracksPrim = primVtx->GetNContributors();
653 if ((nTracksPrim < fMinContribVtx) ||
654 (primVtx->GetZ() < fVtxZMin) ||
655 (primVtx->GetZ() > fVtxZMax) ){
656 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
657 fHistEvtSelection->Fill(3);
658 PostData(1, fOutputList);
662 // event class selection (from jet helper task)
663 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
664 if(fDebug) Printf("Event class %d", eventClass);
665 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
666 fHistEvtSelection->Fill(4);
667 PostData(1, fOutputList);
671 // centrality selection
672 AliCentrality *cent = 0x0;
673 Double_t centValue = 0.;
675 if(fESD) {cent = fESD->GetCentrality();
676 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
677 else centValue=((AliVAODHeader*)aod->GetHeader())->GetCentrality();
679 if(fDebug) printf("centrality: %f\n", centValue);
680 if (centValue < fCentMin || centValue > fCentMax){
681 fHistEvtSelection->Fill(4);
682 PostData(1, fOutputList);
687 fHistEvtSelection->Fill(0);
689 // -- end event selection --
692 AliAODJetEventBackground* externalBackground = 0;
693 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
694 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
695 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
697 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
698 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
699 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
702 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
703 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
704 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
710 if(externalBackground)rho = externalBackground->GetBackground(0);}
712 if(externalBackground)rho = externalBackground->GetBackground(2);}
714 if(externalBackground)rho = externalBackground->GetBackground(3);}
716 TClonesArray *aodJets[2];
718 if(fAODOut&&!aodJets[0]){
719 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
720 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
721 if(fAODExtension && !aodJets[0]){
722 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
723 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
724 if(fAODIn&&!aodJets[0]){
725 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
726 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
735 Double_t dice=fRandom->Uniform(0,1);
736 if(dice>fFrac){ minT=fTTLowRef;
738 if(dice<=fFrac){minT=fTTLowSig;
743 if(fHardest==1 || fHardest==2) nT = GetListOfTracks(&ParticleList);
744 if(fHardest==0) nT=SelectTrigger(&ParticleList,minT,maxT,number);
746 PostData(1, fOutputList);
749 if(dice>fFrac) fh1TrigRef->Fill(number);
750 if(dice<=fFrac)fh1TrigSig->Fill(number);
752 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
753 fListJets[iJetType]->Clear();
754 if (!aodJets[iJetType]) continue;
755 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
756 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
757 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
758 if (jet) fListJets[iJetType]->Add(jet);
760 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
769 // Double_t areasmall=0;
770 Double_t phismall=0.;
776 Int_t trigBBTrack=-1;
777 // Int_t trigInTrack=-1;
778 fRPAngle = ((AliVAODHeader*)aod->GetHeader())->GetEventplane();
780 if(fHardest==0 || fHardest==1){
781 AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
783 PostData(1, fOutputList);
786 if(fSemigoodCorrect){
787 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
788 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6){
789 PostData(1, fOutputList);
796 for(Int_t tt=0;tt<ParticleList.GetEntries();tt++){
797 if(fHardest==0||fHardest==1){if(tt!=nT) continue;}
798 AliVParticle *partback = (AliVParticle*)ParticleList.At(tt);
799 if(!partback) continue;
800 if(partback->Pt()<8) continue;
802 Double_t accep=2.*TMath::Pi()*1.8;
806 if(fSemigoodCorrect){
807 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
808 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6) continue;}
812 fh2Ntriggers->Fill(centValue,partback->Pt());
813 Double_t phiBinT = RelativePhi(partback->Phi(),fRPAngle);
814 if(centValue<20.) fh2RPTC20->Fill(TMath::Abs(phiBinT),partback->Pt());
815 if(centValue<10.) fh2RPTC10->Fill(TMath::Abs(phiBinT),partback->Pt());
819 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
820 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
821 etabig = jetbig->Eta();
822 phibig = jetbig->Phi();
823 ptbig = jetbig->Pt();
824 if(ptbig==0) continue;
825 Double_t phiBin = RelativePhi(phibig,fRPAngle);
826 areabig = jetbig->EffectiveAreaCharged();
827 Double_t ptcorr=ptbig-rho*areabig;
828 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
829 if(areabig>=0.07) injet=injet+1;
830 if(areabig>=0.4) injet4=injet4+1;
831 Double_t dphi=RelativePhi(partback->Phi(),phibig);
834 Double_t etadif= partback->Eta()-etabig;
835 if(TMath::Abs(etadif)<=0.5){
837 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
838 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
840 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
841 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
844 if(fFlagJetHadron==0){
845 if(fFlagPhiBkg==1) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
846 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
847 if(fFlagPhiBkg==2) if(TMath::Abs(dphi)<TMath::Pi()-0.7) continue;
848 if(fFlagPhiBkg==3) if(TMath::Abs(dphi)<TMath::Pi()-0.5) continue;}
850 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
853 if(centValue<10.) fh2RPJetsC10->Fill(TMath::Abs(phiBin), ptcorr);
854 if(centValue<20.) fh2RPJetsC20->Fill(TMath::Abs(phiBin), ptcorr);
855 Double_t dismin=100.;
860 Float_t phitt=partback->Phi();
861 if(phitt<0)phitt+=TMath::Pi()*2.;
862 Int_t phiBintt = GetPhiBin(phitt-fRPAngle);
864 Double_t fillspec[] = {centValue,jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt(), static_cast<Double_t>(phiBintt)};
865 fHJetSpec->Fill(fillspec);
869 if(ptcorr<=0) continue;
871 AliAODTrack* leadtrack=0;
874 if(fFlagJetHadron==0){
875 TRefArray *genTrackList = jetbig->GetRefTracks();
876 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
877 AliAODTrack* genTrack;
878 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
879 genTrack = (AliAODTrack*)(genTrackList->At(ir));
880 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
882 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
883 if(!leadtrack) continue;
888 AliVParticle* leadtrackb=0;
889 if(fFlagJetHadron!=0){
890 Int_t nTb = GetHardestTrackBackToJet(jetbig);
891 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
892 if(!leadtrackb) continue;
899 //store one trigger info
908 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
909 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
910 etasmall = jetsmall->Eta();
911 phismall = jetsmall->Phi();
912 ptsmall = jetsmall->Pt();
913 // areasmall = jetsmall->EffectiveAreaCharged();
914 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
915 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
916 //Fraction in the jet core
917 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
919 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
920 index1=j;}} //en of loop over R=0.2 jets
921 //method1:most concentric jet=core
922 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
923 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
924 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
925 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
926 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
927 //method2:hardest contained jet=core
929 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
930 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
931 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
932 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
933 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
934 if(centValue<10&&leadtrack) fh2Ntriggers2C10->Fill(leadtrack->Pt(),partback->Pt());
935 if(centValue<20&&leadtrack) fh2Ntriggers2C20->Fill(leadtrack->Pt(),partback->Pt());
936 if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
937 for(int it = 0;it<ParticleList.GetEntries();++it){
938 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
939 Double_t deltaR = jetbig->DeltaR(part);
940 Double_t deltaEta = etabig-part->Eta();
942 Double_t deltaPhi=phibig-part->Phi();
943 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
944 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
946 if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
947 if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
948 Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
949 fhnDeltaR->Fill(jetEntries);}
955 //end of track loop, we only do it if EM is switched off
966 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
967 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
973 if(fDoEventMixing>0){
974 //check before if the trigger exists
975 // fTrigBuffer[i][0] = zvtx
976 // fTrigBuffer[i][1] = phi
977 // fTrigBuffer[i][2] = eta
978 // fTrigBuffer[i][3] = pt_jet
979 // fTrigBuffer[i][4] = pt_trig
980 // fTrigBuffer[i][5]= centrality
981 if(fTindex==10) fTindex=0;
982 if(fTrigBuffer[fTindex][3]>0){
983 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
984 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
986 for(int it = 0;it<nT;++it){
987 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
988 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
989 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
990 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
991 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
992 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
993 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
994 fhnMixedEvents->Fill(triggerEntries);
997 if(fNevents==10) fTindex=fTindex+1;
1000 if(fTindex==10&&fNevents==10) fCountAgain=0;
1002 // Copy the triggers from the current event into the buffer.
1003 //again, only if the trigger exists:
1006 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
1007 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
1008 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
1009 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
1010 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
1011 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
1012 fTrigBuffer[fTrigBufferIndex][5] = centValue;
1014 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
1021 /////////////////////////////////////////////////////////////////////////////
1022 ////////////////////// Rongrong's analysis //////////////////////////////////
1023 if(fRunAnaAzimuthalCorrelation)
1025 fhTTPt->Fill(centValue,partback->Pt());
1026 for(Int_t ij=0; ij<fListJets[0]->GetEntries(); ij++)
1028 AliAODJet* jet = (AliAODJet*)(fListJets[0]->At(ij));
1029 Double_t jetPt = jet->Pt();
1030 Double_t jetEta = jet->Eta();
1031 Double_t jetPhi = jet->Phi();
1032 if(jetPt==0) continue;
1033 if((jetEta<fJetEtaMin)||(jetEta>fJetEtaMax)) continue;
1034 Double_t jetArea = jet->EffectiveAreaCharged();
1035 Double_t jetPtCorr=jetPt-rho*jetArea;
1036 Double_t dPhi=jetPhi-partback->Phi();
1037 if(dPhi>2*TMath::Pi()) dPhi -= 2*TMath::Pi();
1038 if(dPhi<-2*TMath::Pi()) dPhi += 2*TMath::Pi();
1039 if(dPhi<-0.5*TMath::Pi()) dPhi += 2*TMath::Pi();
1040 if(dPhi>1.5*TMath::Pi()) dPhi -= 2*TMath::Pi();
1042 Double_t fill[] = {partback->Pt(),jetPtCorr,dPhi,jetArea,centValue};
1043 fHJetPhiCorr->Fill(fill);
1046 /////////////////////////////////////////////////////////////////////////////
1047 /////////////////////////////////////////////////////////////////////////////
1050 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
1052 //tracks up to R=0.8 distant from the jet axis
1053 // if(fAngStructCloseTracks==1){
1054 // TList CloseTrackList;
1055 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
1056 // Double_t difR=0.04;
1057 // for(Int_t l=0;l<15;l++){
1058 // Double_t rr=l*0.1+0.1;
1059 // for(int it = 0;it<nn;++it){
1060 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
1061 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
1062 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
1063 // Double_t ptm=part1->Pt();
1064 // Double_t ptn=part2->Pt();
1065 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1066 // Rnm=TMath::Sqrt(Rnm);
1067 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1068 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1069 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1070 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1071 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1072 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1073 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1074 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1075 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1076 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
1079 // //only jet constituents
1080 // if(fAngStructCloseTracks==2){
1082 // Double_t difR=0.04;
1083 // for(Int_t l=0;l<15;l++){
1084 // Double_t rr=l*0.1+0.1;
1087 // AliAODTrack* part1;
1088 // AliAODTrack* part2;
1090 // TRefArray *genTrackListb = jetbig->GetRefTracks();
1091 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
1095 // for(Int_t it=0; it<nTracksGenJetb; ++it){
1096 // part1 = (AliAODTrack*)(genTrackListb->At(it));
1097 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
1098 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
1099 // Double_t ptm=part1->Pt();
1100 // Double_t ptn=part2->Pt();
1101 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1102 // Rnm=TMath::Sqrt(Rnm);
1103 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1104 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1105 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1106 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1107 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1108 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1109 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1110 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1111 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1112 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
1114 // //end loop over R=0.4 jets
1115 // if(fAngStructCloseTracks>0){
1116 // for(Int_t l=0;l<15;l++){
1117 // Double_t rr=l*0.1+0.1;
1119 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
1120 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
1121 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
1122 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
1124 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
1125 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
1126 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
1127 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
1129 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
1130 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
1131 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
1132 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
1134 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
1135 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
1136 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
1137 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
1145 PostData(1, fOutputList);
1148 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
1150 // Draw result to the screen
1151 // Called once at the end of the query
1153 if (!GetOutputData(1))
1162 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
1165 AliAODEvent *aod = 0;
1167 if(!fESD)aod = fAODIn;
1177 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1178 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1179 if(!tr) AliFatal("Not a standard AOD");
1180 Bool_t bGood = false;
1181 if(fFilterType == 0)bGood = true;
1182 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1183 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1184 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1185 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1186 if(bGood==false) continue;
1187 if (fApplySharedClusterCut) {
1188 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
1189 if (frac > 0.4) continue;
1191 if(TMath::Abs(tr->Eta())>0.9)continue;
1192 if(tr->Pt()<0.15)continue;
1195 if(fFilterType==2 && fFilterMaskBestPt>0){// only set the trigger track index for good quality tracks
1196 if(tr->TestFilterBit(fFilterMaskBestPt)){
1212 // else if (type == kTrackAODMCCharged) {
1213 // TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1214 // if(!tca)return iCount;
1215 // for(int it = 0;it < tca->GetEntriesFast();++it){
1216 // AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1217 // if(!part)continue;
1218 // if(part->Pt()<0.15)continue;
1219 // if(!part->IsPhysicalPrimary())continue;
1220 // if(part->Charge()==0)continue;
1221 // if(TMath::Abs(part->Eta())>0.9)continue;
1224 // if(part->Pt()>ptmax){ ptmax=part->Pt();
1225 // index=iCount-1;}}}
1232 Int_t AliAnalysisTaskJetCore::SelectTrigger(TList *list,Double_t minT,Double_t maxT,Int_t &number){
1234 AliAODEvent *aod = 0;
1235 if(!fESD)aod = fAODIn;
1239 Int_t triggers[100];
1240 Int_t triggers2[100];
1241 for(Int_t cr=0;cr<100;cr++){triggers[cr]=-1;
1245 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1246 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1248 AliFatal("Not a standard AOD");
1251 Bool_t bGood = false;
1252 if(fFilterType == 0)bGood = true;
1253 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1254 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1255 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1256 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1257 if(bGood==false) continue;
1258 if (fApplySharedClusterCut) {
1259 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
1260 if (frac > 0.4) continue;
1262 if(TMath::Abs(tr->Eta())>0.9)continue;
1263 if(tr->Pt()<0.15)continue;
1267 if(tr->Pt()>=minT && tr->Pt()<maxT){
1269 triggers[im]=iCount-1;
1271 if(tr->Pt()>=20.){triggers2[im2]=iCount-1;
1279 if(im2>0) rd=fRandom->Integer(im2);
1280 index=triggers2[rd];
1281 if(index==-1) return index;
1282 AliVParticle *tr1 = (AliVParticle*)list->At(index);
1283 if(!tr1) return index;
1286 for(Int_t kk=0;kk<im;kk++){
1287 //if(kk==rd) continue;
1288 if(index==triggers[kk]) continue;
1289 Int_t lab=triggers[kk];
1290 AliVParticle *tr2 = (AliVParticle*)list->At(lab);
1292 Double_t detat=tr1->Eta()-tr2->Eta();
1293 Double_t dphit=RelativePhi(tr1->Phi(),tr2->Phi());
1294 Double_t deltaRt=TMath::Sqrt(detat*detat+dphit*dphit);
1295 fh1TrackPhiDistance->Fill(TMath::Abs(dphit));
1296 fh1TrackRDistance->Fill(deltaRt);
1298 if(fDodiHadron==1) if(deltaRt>0.4) number=number-1;
1299 if(fDodiHadron==2) if((deltaRt>0.4) && (TMath::Abs(dphit)>TMath::Pi()-0.6)) number=number-1;}
1325 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
1327 AliAODEvent *aod = 0;
1328 if(!fESD)aod = fAODIn;
1335 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1336 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1337 if(!tr) AliFatal("Not a standard AOD");
1338 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1339 if(TMath::Abs(tr->Eta())>0.9)continue;
1340 if(tr->Pt()<0.15)continue;
1342 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1343 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1344 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1361 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1364 AliAODEvent *aod = 0;
1365 if(!fESD)aod = fAODIn;
1368 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1369 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1370 if(!tr) AliFatal("Not a standard AOD");
1371 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1372 if(TMath::Abs(tr->Eta())>0.9)continue;
1373 if(tr->Pt()<0.15)continue;
1374 Double_t disR=jetbig->DeltaR(tr);
1375 if(disR>0.8) continue;
1377 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1396 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1399 Int_t nInputTracks = 0;
1400 AliAODEvent *aod = 0;
1401 if(!fESD)aod = fAODIn;
1403 TString jbname(fJetBranchName[1]);
1404 //needs complete event, use jets without background subtraction
1405 for(Int_t i=1; i<=3; ++i){
1406 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1408 // use only HI event
1409 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1410 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1412 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1413 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1415 Printf("Jet branch %s not found", jbname.Data());
1416 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1420 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1421 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1423 TRefArray *trackList = jet->GetRefTracks();
1424 Int_t nTracks = trackList->GetEntriesFast();
1425 nInputTracks += nTracks;
1426 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1428 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1430 return nInputTracks;
1435 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1437 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1438 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1439 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1440 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1441 double dphi = mphi-vphi;
1442 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1443 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1444 return dphi;//dphi in [-Pi, Pi]
1447 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1450 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1451 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1452 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1453 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1460 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1462 // generate new THnSparseF, axes are defined in GetDimParams()
1465 UInt_t tmp = entries;
1468 tmp = tmp &~ -tmp; // clear lowest bit
1471 TString hnTitle(name);
1472 const Int_t dim = count;
1479 while(c<dim && i<32){
1483 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1484 hnTitle += Form(";%s",label.Data());
1492 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1495 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1497 // stores label and binning of axis for THnSparse
1499 const Double_t pi = TMath::Pi();
1504 label = "V0 centrality (%)";
1513 label = "corrected jet pt";
1556 label = "leading track";
1564 label = "trigger track";