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);}
507 fOutputList->Add(fh1TrigRef);
508 fOutputList->Add(fh1TrigSig);
509 fOutputList->Add(fh1TrackPhiDistance);
510 fOutputList->Add(fh1TrackRDistance);
511 fOutputList->Add(fh2Ntriggers);
512 fOutputList->Add(fh2Ntriggers2C10);
513 fOutputList->Add(fh2Ntriggers2C20);
514 fOutputList->Add(fh3JetDensity);
515 fOutputList->Add(fh3JetDensityA4);
516 fOutputList->Add(fh2RPJetsC10);
517 fOutputList->Add(fh2RPJetsC20);
518 fOutputList->Add(fh2RPTC10);
519 fOutputList->Add(fh2RPTC20);
521 const Int_t dimSpec = 5;
522 const Int_t nBinsSpec[dimSpec] = {100,6, 140, 50, fNRPBins};
523 const Double_t lowBinSpec[dimSpec] = {0,0,-80, 0, 0};
524 const Double_t hiBinSpec[dimSpec] = {100,1, 200, 50, static_cast<Double_t>(fNRPBins)};
525 fHJetSpec = new THnSparseF("fHJetSpec","Recoil jet spectrum",dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
527 //change binning in jet area
528 Double_t *xPt6 = new Double_t[7];
536 fHJetSpec->SetBinEdges(1,xPt6);
543 fOutputList->Add(fHJetSpec);
546 if(fRunAnaAzimuthalCorrelation)
548 fhTTPt = new TH2F("fhTTPt","Trigger track p_{T} vs centrality",10,0,100,100,0,100);
549 fOutputList->Add(fhTTPt);
551 const Int_t dimCor = 5;
552 const Int_t nBinsCor[dimCor] = {50, 200, 100, 8, 10};
553 const Double_t lowBinCor[dimCor] = {0, -50, -0.5*TMath::Pi(), 0, 0};
554 const Double_t hiBinCor[dimCor] = {50, 150, 1.5*TMath::Pi(), 0.8, 100};
555 fHJetPhiCorr = new THnSparseF("fHJetPhiCorr","TT p_{T} vs jet p_{T} vs dPhi vs area vs centrality",dimCor,nBinsCor,lowBinCor,hiBinCor);
556 fOutputList->Add(fHJetPhiCorr);
562 // =========== Switch on Sumw2 for all histos ===========
563 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
564 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
569 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
574 TH1::AddDirectory(oldStatus);
576 PostData(1, fOutputList);
579 void AliAnalysisTaskJetCore::UserExec(Option_t *)
583 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
584 AliError("Jet branch name not set.");
588 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
590 AliError("ESD not available");
591 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
593 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
595 static AliAODEvent* aod = 0;
596 // take all other information from the aod we take the tracks from
598 if(!fESD)aod = fAODIn;
603 if(fNonStdFile.Length()!=0){
604 // case that we have an AOD extension we need can fetch the jets from the extended output
605 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
606 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
608 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
612 // -- event selection --
613 fHistEvtSelection->Fill(1); // number of events before event selection
616 Bool_t selected=kTRUE;
617 selected = AliAnalysisHelperJetTasks::Selected();
619 // no selection by the service task, we continue
620 PostData(1,fOutputList);
625 // physics selection: this is now redundant, all should appear as accepted after service task selection
626 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
627 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
628 std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
629 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
630 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
631 fHistEvtSelection->Fill(2);
632 PostData(1, fOutputList);
640 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
641 fHistEvtSelection->Fill(3);
642 PostData(1, fOutputList);
644 AliAODVertex* primVtx = aod->GetPrimaryVertex();
647 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
648 fHistEvtSelection->Fill(3);
649 PostData(1, fOutputList);
653 Int_t nTracksPrim = primVtx->GetNContributors();
654 if ((nTracksPrim < fMinContribVtx) ||
655 (primVtx->GetZ() < fVtxZMin) ||
656 (primVtx->GetZ() > fVtxZMax) ){
657 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
658 fHistEvtSelection->Fill(3);
659 PostData(1, fOutputList);
663 // event class selection (from jet helper task)
664 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
665 if(fDebug) Printf("Event class %d", eventClass);
666 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
667 fHistEvtSelection->Fill(4);
668 PostData(1, fOutputList);
672 // centrality selection
673 AliCentrality *cent = 0x0;
674 Double_t centValue = 0.;
676 if(fESD) {cent = fESD->GetCentrality();
677 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
678 else centValue=((AliVAODHeader*)aod->GetHeader())->GetCentrality();
680 if(fDebug) printf("centrality: %f\n", centValue);
681 if (centValue < fCentMin || centValue > fCentMax){
682 fHistEvtSelection->Fill(4);
683 PostData(1, fOutputList);
688 fHistEvtSelection->Fill(0);
690 // -- end event selection --
693 AliAODJetEventBackground* externalBackground = 0;
694 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
695 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
696 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
698 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
699 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
700 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
703 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
704 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
705 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
711 if(externalBackground)rho = externalBackground->GetBackground(0);}
713 if(externalBackground)rho = externalBackground->GetBackground(2);}
715 if(externalBackground)rho = externalBackground->GetBackground(3);}
717 TClonesArray *aodJets[2];
719 if(fAODOut&&!aodJets[0]){
720 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
721 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
722 if(fAODExtension && !aodJets[0]){
723 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
724 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
725 if(fAODIn&&!aodJets[0]){
726 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
727 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
736 Double_t dice=fRandom->Uniform(0,1);
737 if(dice>fFrac){ minT=fTTLowRef;
739 if(dice<=fFrac){minT=fTTLowSig;
744 if(fHardest==1 || fHardest==2) nT = GetListOfTracks(&ParticleList);
745 if(fHardest==0) nT=SelectTrigger(&ParticleList,minT,maxT,number);
747 PostData(1, fOutputList);
750 if(dice>fFrac) fh1TrigRef->Fill(number);
751 if(dice<=fFrac)fh1TrigSig->Fill(number);
753 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
754 fListJets[iJetType]->Clear();
755 if (!aodJets[iJetType]) continue;
756 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
757 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
758 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
759 if (jet) fListJets[iJetType]->Add(jet);
761 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
770 // Double_t areasmall=0;
771 Double_t phismall=0.;
777 Int_t trigBBTrack=-1;
778 // Int_t trigInTrack=-1;
779 fRPAngle = ((AliVAODHeader*)aod->GetHeader())->GetEventplane();
781 if(fHardest==0 || fHardest==1){
782 AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
784 PostData(1, fOutputList);
787 if(fSemigoodCorrect){
788 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
789 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6){
790 PostData(1, fOutputList);
797 for(Int_t tt=0;tt<ParticleList.GetEntries();tt++){
798 if(fHardest==0||fHardest==1){if(tt!=nT) continue;}
799 AliVParticle *partback = (AliVParticle*)ParticleList.At(tt);
800 if(!partback) continue;
801 if(partback->Pt()<8) continue;
803 Double_t accep=2.*TMath::Pi()*1.8;
807 if(fSemigoodCorrect){
808 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
809 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6) continue;}
813 fh2Ntriggers->Fill(centValue,partback->Pt());
814 Double_t phiBinT = RelativePhi(partback->Phi(),fRPAngle);
815 if(centValue<20.) fh2RPTC20->Fill(TMath::Abs(phiBinT),partback->Pt());
816 if(centValue<10.) fh2RPTC10->Fill(TMath::Abs(phiBinT),partback->Pt());
820 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
821 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
822 etabig = jetbig->Eta();
823 phibig = jetbig->Phi();
824 ptbig = jetbig->Pt();
825 if(ptbig==0) continue;
826 Double_t phiBin = RelativePhi(phibig,fRPAngle);
827 areabig = jetbig->EffectiveAreaCharged();
828 Double_t ptcorr=ptbig-rho*areabig;
829 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
830 if(areabig>=0.07) injet=injet+1;
831 if(areabig>=0.4) injet4=injet4+1;
832 Double_t dphi=RelativePhi(partback->Phi(),phibig);
835 Double_t etadif= partback->Eta()-etabig;
836 if(TMath::Abs(etadif)<=0.5){
838 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
839 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
841 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
842 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
845 if(fFlagJetHadron==0){
846 if(fFlagPhiBkg==1) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
847 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
848 if(fFlagPhiBkg==2) if(TMath::Abs(dphi)<TMath::Pi()-0.7) continue;
849 if(fFlagPhiBkg==3) if(TMath::Abs(dphi)<TMath::Pi()-0.5) continue;}
851 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
854 if(centValue<10.) fh2RPJetsC10->Fill(TMath::Abs(phiBin), ptcorr);
855 if(centValue<20.) fh2RPJetsC20->Fill(TMath::Abs(phiBin), ptcorr);
856 Double_t dismin=100.;
861 Float_t phitt=partback->Phi();
862 if(phitt<0)phitt+=TMath::Pi()*2.;
863 Int_t phiBintt = GetPhiBin(phitt-fRPAngle);
865 Double_t fillspec[] = {centValue,jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt(), static_cast<Double_t>(phiBintt)};
866 fHJetSpec->Fill(fillspec);
870 if(ptcorr<=0) continue;
872 AliAODTrack* leadtrack=0;
875 if(fFlagJetHadron==0){
876 TRefArray *genTrackList = jetbig->GetRefTracks();
877 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
878 AliAODTrack* genTrack;
879 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
880 genTrack = (AliAODTrack*)(genTrackList->At(ir));
881 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
883 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
884 if(!leadtrack) continue;
889 AliVParticle* leadtrackb=0;
890 if(fFlagJetHadron!=0){
891 Int_t nTb = GetHardestTrackBackToJet(jetbig);
892 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
893 if(!leadtrackb) continue;
900 //store one trigger info
909 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
910 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
911 etasmall = jetsmall->Eta();
912 phismall = jetsmall->Phi();
913 ptsmall = jetsmall->Pt();
914 // areasmall = jetsmall->EffectiveAreaCharged();
915 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
916 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
917 //Fraction in the jet core
918 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
920 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
921 index1=j;}} //en of loop over R=0.2 jets
922 //method1:most concentric jet=core
923 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
924 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
925 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
926 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
927 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
928 //method2:hardest contained jet=core
930 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
931 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
932 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
933 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
934 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
935 if(centValue<10&&leadtrack) fh2Ntriggers2C10->Fill(leadtrack->Pt(),partback->Pt());
936 if(centValue<20&&leadtrack) fh2Ntriggers2C20->Fill(leadtrack->Pt(),partback->Pt());
937 if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
938 for(int it = 0;it<ParticleList.GetEntries();++it){
939 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
940 Double_t deltaR = jetbig->DeltaR(part);
941 Double_t deltaEta = etabig-part->Eta();
943 Double_t deltaPhi=phibig-part->Phi();
944 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
945 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
947 if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
948 if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
949 Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
950 fhnDeltaR->Fill(jetEntries);}
956 //end of track loop, we only do it if EM is switched off
967 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
968 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
974 if(fDoEventMixing>0){
975 //check before if the trigger exists
976 // fTrigBuffer[i][0] = zvtx
977 // fTrigBuffer[i][1] = phi
978 // fTrigBuffer[i][2] = eta
979 // fTrigBuffer[i][3] = pt_jet
980 // fTrigBuffer[i][4] = pt_trig
981 // fTrigBuffer[i][5]= centrality
982 if(fTindex==10) fTindex=0;
983 if(fTrigBuffer[fTindex][3]>0){
984 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
985 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
987 for(int it = 0;it<nT;++it){
988 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
989 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
990 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
991 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
992 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
993 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
994 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
995 fhnMixedEvents->Fill(triggerEntries);
998 if(fNevents==10) fTindex=fTindex+1;
1001 if(fTindex==10&&fNevents==10) fCountAgain=0;
1003 // Copy the triggers from the current event into the buffer.
1004 //again, only if the trigger exists:
1007 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
1008 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
1009 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
1010 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
1011 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
1012 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
1013 fTrigBuffer[fTrigBufferIndex][5] = centValue;
1015 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
1022 /////////////////////////////////////////////////////////////////////////////
1023 ////////////////////// Rongrong's analysis //////////////////////////////////
1024 if(fRunAnaAzimuthalCorrelation)
1026 fhTTPt->Fill(centValue,partback->Pt());
1027 for(Int_t ij=0; ij<fListJets[0]->GetEntries(); ij++)
1029 AliAODJet* jet = (AliAODJet*)(fListJets[0]->At(ij));
1030 Double_t jetPt = jet->Pt();
1031 Double_t jetEta = jet->Eta();
1032 Double_t jetPhi = jet->Phi();
1033 if(jetPt==0) continue;
1034 if((jetEta<fJetEtaMin)||(jetEta>fJetEtaMax)) continue;
1035 Double_t jetArea = jet->EffectiveAreaCharged();
1036 Double_t jetPtCorr=jetPt-rho*jetArea;
1037 Double_t dPhi=jetPhi-partback->Phi();
1038 if(dPhi>2*TMath::Pi()) dPhi -= 2*TMath::Pi();
1039 if(dPhi<-2*TMath::Pi()) dPhi += 2*TMath::Pi();
1040 if(dPhi<-0.5*TMath::Pi()) dPhi += 2*TMath::Pi();
1041 if(dPhi>1.5*TMath::Pi()) dPhi -= 2*TMath::Pi();
1043 Double_t fill[] = {partback->Pt(),jetPtCorr,dPhi,jetArea,centValue};
1044 fHJetPhiCorr->Fill(fill);
1047 /////////////////////////////////////////////////////////////////////////////
1048 /////////////////////////////////////////////////////////////////////////////
1051 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
1053 //tracks up to R=0.8 distant from the jet axis
1054 // if(fAngStructCloseTracks==1){
1055 // TList CloseTrackList;
1056 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
1057 // Double_t difR=0.04;
1058 // for(Int_t l=0;l<15;l++){
1059 // Double_t rr=l*0.1+0.1;
1060 // for(int it = 0;it<nn;++it){
1061 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
1062 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
1063 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
1064 // Double_t ptm=part1->Pt();
1065 // Double_t ptn=part2->Pt();
1066 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1067 // Rnm=TMath::Sqrt(Rnm);
1068 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1069 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1070 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1071 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1072 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1073 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1074 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1075 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1076 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1077 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
1080 // //only jet constituents
1081 // if(fAngStructCloseTracks==2){
1083 // Double_t difR=0.04;
1084 // for(Int_t l=0;l<15;l++){
1085 // Double_t rr=l*0.1+0.1;
1088 // AliAODTrack* part1;
1089 // AliAODTrack* part2;
1091 // TRefArray *genTrackListb = jetbig->GetRefTracks();
1092 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
1096 // for(Int_t it=0; it<nTracksGenJetb; ++it){
1097 // part1 = (AliAODTrack*)(genTrackListb->At(it));
1098 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
1099 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
1100 // Double_t ptm=part1->Pt();
1101 // Double_t ptn=part2->Pt();
1102 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1103 // Rnm=TMath::Sqrt(Rnm);
1104 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1105 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1106 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1107 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1108 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1109 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1110 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1111 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1112 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1113 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
1115 // //end loop over R=0.4 jets
1116 // if(fAngStructCloseTracks>0){
1117 // for(Int_t l=0;l<15;l++){
1118 // Double_t rr=l*0.1+0.1;
1120 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
1121 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
1122 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
1123 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
1125 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
1126 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
1127 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
1128 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
1130 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
1131 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
1132 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
1133 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
1135 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
1136 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
1137 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
1138 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
1146 PostData(1, fOutputList);
1149 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
1151 // Draw result to the screen
1152 // Called once at the end of the query
1154 if (!GetOutputData(1))
1163 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
1166 AliAODEvent *aod = 0;
1168 if(!fESD)aod = fAODIn;
1178 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1179 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1180 if(!tr) AliFatal("Not a standard AOD");
1181 Bool_t bGood = false;
1182 if(fFilterType == 0)bGood = true;
1183 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1184 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1185 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1186 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1187 if(bGood==false) continue;
1188 if (fApplySharedClusterCut) {
1189 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
1190 if (frac > 0.4) continue;
1192 if(TMath::Abs(tr->Eta())>0.9)continue;
1193 if(tr->Pt()<0.15)continue;
1196 if(fFilterType==2 && fFilterMaskBestPt>0){// only set the trigger track index for good quality tracks
1197 if(tr->TestFilterBit(fFilterMaskBestPt)){
1213 // else if (type == kTrackAODMCCharged) {
1214 // TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1215 // if(!tca)return iCount;
1216 // for(int it = 0;it < tca->GetEntriesFast();++it){
1217 // AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1218 // if(!part)continue;
1219 // if(part->Pt()<0.15)continue;
1220 // if(!part->IsPhysicalPrimary())continue;
1221 // if(part->Charge()==0)continue;
1222 // if(TMath::Abs(part->Eta())>0.9)continue;
1225 // if(part->Pt()>ptmax){ ptmax=part->Pt();
1226 // index=iCount-1;}}}
1233 Int_t AliAnalysisTaskJetCore::SelectTrigger(TList *list,Double_t minT,Double_t maxT,Int_t &number){
1235 AliAODEvent *aod = 0;
1236 if(!fESD)aod = fAODIn;
1240 Int_t triggers[100];
1241 Int_t triggers2[100];
1242 for(Int_t cr=0;cr<100;cr++){triggers[cr]=-1;
1246 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1247 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1248 if(!tr) AliFatal("Not a standard AOD");
1249 Bool_t bGood = false;
1250 if(fFilterType == 0)bGood = true;
1251 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1252 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1253 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1254 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1255 if(bGood==false) continue;
1256 if (fApplySharedClusterCut) {
1257 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
1258 if (frac > 0.4) continue;
1260 if(TMath::Abs(tr->Eta())>0.9)continue;
1261 if(tr->Pt()<0.15)continue;
1265 if(tr->Pt()>=minT && tr->Pt()<maxT){
1267 triggers[im]=iCount-1;
1269 if(tr->Pt()>=20.){triggers2[im2]=iCount-1;
1277 if(im2>0) rd=fRandom->Integer(im2);
1278 index=triggers2[rd];
1279 AliVParticle *tr1 = (AliVParticle*)list->At(index);
1283 for(Int_t kk=0;kk<im;kk++){
1284 //if(kk==rd) continue;
1285 if(index==triggers[kk]) continue;
1286 Int_t lab=triggers[kk];
1287 AliVParticle *tr2 = (AliVParticle*)list->At(lab);
1289 Double_t detat=tr1->Eta()-tr2->Eta();
1290 Double_t dphit=RelativePhi(tr1->Phi(),tr2->Phi());
1291 Double_t deltaRt=TMath::Sqrt(detat*detat+dphit*dphit);
1292 fh1TrackPhiDistance->Fill(TMath::Abs(dphit));
1293 fh1TrackRDistance->Fill(deltaRt);
1295 if(fDodiHadron==1) if(deltaRt>0.4) number=number-1;
1296 if(fDodiHadron==2) if((deltaRt>0.4) && (TMath::Abs(dphit)>TMath::Pi()-0.6)) number=number-1;}
1322 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
1324 AliAODEvent *aod = 0;
1325 if(!fESD)aod = fAODIn;
1332 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1333 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1334 if(!tr) AliFatal("Not a standard AOD");
1335 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1336 if(TMath::Abs(tr->Eta())>0.9)continue;
1337 if(tr->Pt()<0.15)continue;
1339 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1340 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1341 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1358 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1361 AliAODEvent *aod = 0;
1362 if(!fESD)aod = fAODIn;
1365 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1366 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1367 if(!tr) AliFatal("Not a standard AOD");
1368 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1369 if(TMath::Abs(tr->Eta())>0.9)continue;
1370 if(tr->Pt()<0.15)continue;
1371 Double_t disR=jetbig->DeltaR(tr);
1372 if(disR>0.8) continue;
1374 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1393 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1396 Int_t nInputTracks = 0;
1397 AliAODEvent *aod = 0;
1398 if(!fESD)aod = fAODIn;
1400 TString jbname(fJetBranchName[1]);
1401 //needs complete event, use jets without background subtraction
1402 for(Int_t i=1; i<=3; ++i){
1403 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1405 // use only HI event
1406 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1407 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1409 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1410 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1412 Printf("Jet branch %s not found", jbname.Data());
1413 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1417 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1418 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1420 TRefArray *trackList = jet->GetRefTracks();
1421 Int_t nTracks = trackList->GetEntriesFast();
1422 nInputTracks += nTracks;
1423 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1425 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1427 return nInputTracks;
1432 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1434 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1435 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1436 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1437 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1438 double dphi = mphi-vphi;
1439 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1440 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1441 return dphi;//dphi in [-Pi, Pi]
1444 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1447 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1448 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1449 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1450 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1457 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1459 // generate new THnSparseF, axes are defined in GetDimParams()
1462 UInt_t tmp = entries;
1465 tmp = tmp &~ -tmp; // clear lowest bit
1468 TString hnTitle(name);
1469 const Int_t dim = count;
1476 while(c<dim && i<32){
1480 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1481 hnTitle += Form(";%s",label.Data());
1489 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1492 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1494 // stores label and binning of axis for THnSparse
1496 const Double_t pi = TMath::Pi();
1501 label = "V0 centrality (%)";
1510 label = "corrected jet pt";
1553 label = "leading track";
1561 label = "trigger track";