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),
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 fApplySharedClusterCut(0),
217 fAngStructCloseTracks(0),
232 fTrackTypeRec(kTrackUndef),
245 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
246 fJetPtFractionMin(0.5),
250 fRunAnaAzimuthalCorrelation(kFALSE),
255 fHistEvtSelection(0x0),
258 fh2JetCoreMethod1C10(0x0),
259 fh2JetCoreMethod2C10(0x0),
260 fh2JetCoreMethod1C20(0x0),
261 fh2JetCoreMethod2C20(0x0),
262 fh2JetCoreMethod1C30(0x0),
263 fh2JetCoreMethod2C30(0x0),
264 fh2JetCoreMethod1C60(0x0),
265 fh2JetCoreMethod2C60(0x0),
266 fh3JetTrackC3060(0x0),
268 fh2AngStructpt1C10(0x0),
269 fh2AngStructpt2C10(0x0),
270 fh2AngStructpt3C10(0x0),
271 fh2AngStructpt4C10(0x0),
272 fh2AngStructpt1C20(0x0),
273 fh2AngStructpt2C20(0x0),
274 fh2AngStructpt3C20(0x0),
275 fh2AngStructpt4C20(0x0),
276 fh2AngStructpt1C30(0x0),
277 fh2AngStructpt2C30(0x0),
278 fh2AngStructpt3C30(0x0),
279 fh2AngStructpt4C30(0x0),
280 fh2AngStructpt1C60(0x0),
281 fh2AngStructpt2C60(0x0),
282 fh2AngStructpt3C60(0x0),
283 fh2AngStructpt4C60(0x0),
287 fh2Ntriggers2C10(0x0),
288 fh2Ntriggers2C20(0x0),
290 fh3JetDensityA4(0x0),
304 for(Int_t i=0; i<10; i++) {
305 for(Int_t j=0; j<6; j++) {
312 fJetBranchName[0] = "";
313 fJetBranchName[1] = "";
315 fListJets[0] = new TList;
316 fListJets[1] = new TList;
318 DefineOutput(1, TList::Class());
321 AliAnalysisTaskJetCore::~AliAnalysisTaskJetCore()
327 void AliAnalysisTaskJetCore::SetBranchNames(const TString &branch1, const TString &branch2)
329 fJetBranchName[0] = branch1;
330 fJetBranchName[1] = branch2;
333 void AliAnalysisTaskJetCore::Init()
336 // check for jet branches
337 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
338 AliError("Jet branch name not set.");
343 void AliAnalysisTaskJetCore::UserCreateOutputObjects()
348 if(!fOutputList) fOutputList = new TList;
349 fOutputList->SetOwner(kTRUE);
351 Bool_t oldStatus = TH1::AddDirectoryStatus();
352 TH1::AddDirectory(kFALSE);
356 fRandom = new TRandom3(0);
361 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
362 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
363 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
364 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
365 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
366 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
367 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
369 UInt_t entries = 0; // bit coded, see GetDimParams() below
370 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7;
371 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
373 //change binning in pTtrack
374 Double_t *xPt3 = new Double_t[10];
376 for(int i = 1; i<=9;i++){
377 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
378 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
379 else xPt3[i] = xPt3[i-1] + 150.; // 18
381 fhnDeltaR->SetBinEdges(2,xPt3);
384 //change binning in HTI
385 Double_t *xPt4 = new Double_t[14];
387 for(int i = 1; i<=13;i++){
388 if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 1; // 1 - 10
389 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 5; // 10 - 12
390 else xPt4[i] = xPt4[i-1] + 30.; // 13
392 fhnDeltaR->SetBinEdges(6,xPt4);
402 UInt_t cifras = 0; // bit coded, see GetDimParams() below
403 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
404 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);}
407 fh2JetCoreMethod1C10 = new TH2F("JetCoreMethod1C10","",150, 0., 150.,100, 0., 1.5);
408 fh2JetCoreMethod2C10 = new TH2F("JetCoreMethod2C10","",150, 0., 150.,100, 0., 1.5);
409 fh2JetCoreMethod1C20 = new TH2F("JetCoreMethod1C20","",150, 0., 150.,100, 0., 1.5);
410 fh2JetCoreMethod2C20 = new TH2F("JetCoreMethod2C20","",150, 0., 150.,100, 0., 1.5);
411 fh2JetCoreMethod1C30 = new TH2F("JetCoreMethod1C30","",150, 0., 150.,100, 0., 1.5);
412 fh2JetCoreMethod2C30 = new TH2F("JetCoreMethod2C30","",150, 0., 150.,100, 0., 1.5);
413 fh2JetCoreMethod1C60 = new TH2F("JetCoreMethod1C60","",150, 0., 150.,100, 0., 1.5);
414 fh2JetCoreMethod2C60 = new TH2F("JetCoreMethod2C60","",150, 0., 150.,100, 0., 1.5);}
416 fh3JetTrackC3060=new TH3F("JetTrackC3060","",50,0,50,150,0.,150.,35,0.,3.5);
417 fh3JetTrackC20=new TH3F("JetTrackC20","",50,0,50,150,0.,150.,35,0.,3.5);
418 if(fAngStructCloseTracks>0){
419 fh2AngStructpt1C10 = new TH2F("Ang struct pt1 C10","",15,0.,1.5,150,0.,10.);
420 fh2AngStructpt2C10 = new TH2F("Ang struct pt2 C10","",15,0.,1.5,150,0.,10.);
421 fh2AngStructpt3C10 = new TH2F("Ang struct pt3 C10","",15,0.,1.5,150,0.,10.);
422 fh2AngStructpt4C10 = new TH2F("Ang struct pt4 C10","",15,0.,1.5,150,0.,10.);
423 fh2AngStructpt1C20 = new TH2F("Ang struct pt1 C20","",15,0.,1.5,150,0.,10.);
424 fh2AngStructpt2C20 = new TH2F("Ang struct pt2 C20","",15,0.,1.5,150,0.,10.);
425 fh2AngStructpt3C20 = new TH2F("Ang struct pt3 C20","",15,0.,1.5,150,0.,10.);
426 fh2AngStructpt4C20 = new TH2F("Ang struct pt4 C20","",15,0.,1.5,150,0.,10.);
427 fh2AngStructpt1C30 = new TH2F("Ang struct pt1 C30","",15,0.,1.5,150,0.,10.);
428 fh2AngStructpt2C30 = new TH2F("Ang struct pt2 C30","",15,0.,1.5,150,0.,10.);
429 fh2AngStructpt3C30 = new TH2F("Ang struct pt3 C30","",15,0.,1.5,150,0.,10.);
430 fh2AngStructpt4C30 = new TH2F("Ang struct pt4 C30","",15,0.,1.5,150,0.,10.);
431 fh2AngStructpt1C60 = new TH2F("Ang struct pt1 C60","",15,0.,1.5,150,0.,10.);
432 fh2AngStructpt2C60 = new TH2F("Ang struct pt2 C60","",15,0.,1.5,150,0.,10.);
433 fh2AngStructpt3C60 = new TH2F("Ang struct pt3 C60","",15,0.,1.5,150,0.,10.);
434 fh2AngStructpt4C60 = new TH2F("Ang struct pt4 C60","",15,0.,1.5,150,0.,10.); }
437 fh1TrigRef=new TH1D("Trig Ref","",10,0.,10);
438 fh1TrigSig=new TH1D("Trig Sig","",10,0.,10);
439 fh2Ntriggers=new TH2F("# of triggers","",100,0.,100.,50,0.,50.);
440 fh2Ntriggers2C10=new TH2F("# of triggers2C10","",50,0.,50.,50,0.,50.);
441 fh2Ntriggers2C20=new TH2F("# of triggers2C20","",50,0.,50.,50,0.,50.);
442 fh3JetDensity=new TH3F("Jet density vs mutliplicity A>0.07","",100,0.,4000.,100,0.,5.,25,0.,50.);
443 fh3JetDensityA4=new TH3F("Jet density vs multiplicity A>0.4","",100,0.,4000.,100,0.,5.,25,0.,50.);
444 fh2RPJetsC10=new TH2F("RPJetC10","",35,0.,3.5,100,0.,100.);
445 fh2RPJetsC20=new TH2F("RPJetC20","",35,0.,3.5,100,0.,100.);
446 fh2RPTC10=new TH2F("RPTriggerC10","",35,0.,3.5,50,0.,50.);
447 fh2RPTC20=new TH2F("RPTriggerC20","",35,0.,3.5,50,0.,50.);
452 fOutputList->Add(fHistEvtSelection);
454 fOutputList->Add(fhnDeltaR);
456 fOutputList->Add(fhnMixedEvents);
462 fOutputList->Add(fh2JetCoreMethod1C10);
463 fOutputList->Add(fh2JetCoreMethod2C10);
464 fOutputList->Add(fh2JetCoreMethod1C20);
465 fOutputList->Add(fh2JetCoreMethod2C20);
466 fOutputList->Add(fh2JetCoreMethod1C30);
467 fOutputList->Add(fh2JetCoreMethod2C30);
468 fOutputList->Add(fh2JetCoreMethod1C60);
469 fOutputList->Add(fh2JetCoreMethod2C60);}
471 fOutputList->Add(fh3JetTrackC3060);
472 fOutputList->Add(fh3JetTrackC20);
478 if(fAngStructCloseTracks>0){
479 fOutputList->Add(fh2AngStructpt1C10);
480 fOutputList->Add(fh2AngStructpt2C10);
481 fOutputList->Add(fh2AngStructpt3C10);
482 fOutputList->Add(fh2AngStructpt4C10);
483 fOutputList->Add(fh2AngStructpt1C20);
484 fOutputList->Add(fh2AngStructpt2C20);
485 fOutputList->Add(fh2AngStructpt3C20);
486 fOutputList->Add(fh2AngStructpt4C20);
487 fOutputList->Add(fh2AngStructpt1C30);
488 fOutputList->Add(fh2AngStructpt2C30);
489 fOutputList->Add(fh2AngStructpt3C30);
490 fOutputList->Add(fh2AngStructpt4C30);
491 fOutputList->Add(fh2AngStructpt1C60);
492 fOutputList->Add(fh2AngStructpt2C60);
493 fOutputList->Add(fh2AngStructpt3C60);
494 fOutputList->Add(fh2AngStructpt4C60);}
499 fOutputList->Add(fh1TrigRef);
500 fOutputList->Add(fh1TrigSig);
501 fOutputList->Add(fh2Ntriggers);
502 fOutputList->Add(fh2Ntriggers2C10);
503 fOutputList->Add(fh2Ntriggers2C20);
504 fOutputList->Add(fh3JetDensity);
505 fOutputList->Add(fh3JetDensityA4);
506 fOutputList->Add(fh2RPJetsC10);
507 fOutputList->Add(fh2RPJetsC20);
508 fOutputList->Add(fh2RPTC10);
509 fOutputList->Add(fh2RPTC20);
511 const Int_t dimSpec = 5;
512 const Int_t nBinsSpec[dimSpec] = {100,6, 140, 50, fNRPBins};
513 const Double_t lowBinSpec[dimSpec] = {0,0,-80, 0, 0};
514 const Double_t hiBinSpec[dimSpec] = {100,1, 200, 50, static_cast<Double_t>(fNRPBins)};
515 fHJetSpec = new THnSparseF("fHJetSpec","Recoil jet spectrum",dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
517 //change binning in jet area
518 Double_t *xPt6 = new Double_t[7];
526 fHJetSpec->SetBinEdges(1,xPt6);
533 fOutputList->Add(fHJetSpec);
536 if(fRunAnaAzimuthalCorrelation)
538 fhTTPt = new TH2F("fhTTPt","Trigger track p_{T} vs centrality",10,0,100,100,0,100);
539 fOutputList->Add(fhTTPt);
541 const Int_t dimCor = 5;
542 const Int_t nBinsCor[dimCor] = {50, 200, 100, 8, 10};
543 const Double_t lowBinCor[dimCor] = {0, -50, -0.5*TMath::Pi(), 0, 0};
544 const Double_t hiBinCor[dimCor] = {50, 150, 1.5*TMath::Pi(), 0.8, 100};
545 fHJetPhiCorr = new THnSparseF("fHJetPhiCorr","TT p_{T} vs jet p_{T} vs dPhi vs area vs centrality",dimCor,nBinsCor,lowBinCor,hiBinCor);
546 fOutputList->Add(fHJetPhiCorr);
552 // =========== Switch on Sumw2 for all histos ===========
553 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
554 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
559 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
564 TH1::AddDirectory(oldStatus);
566 PostData(1, fOutputList);
569 void AliAnalysisTaskJetCore::UserExec(Option_t *)
573 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
574 AliError("Jet branch name not set.");
578 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
580 AliError("ESD not available");
581 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
583 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
585 static AliAODEvent* aod = 0;
586 // take all other information from the aod we take the tracks from
588 if(!fESD)aod = fAODIn;
593 if(fNonStdFile.Length()!=0){
594 // case that we have an AOD extension we need can fetch the jets from the extended output
595 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
596 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
598 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
602 // -- event selection --
603 fHistEvtSelection->Fill(1); // number of events before event selection
606 Bool_t selected=kTRUE;
607 selected = AliAnalysisHelperJetTasks::Selected();
609 // no selection by the service task, we continue
610 PostData(1,fOutputList);
615 // physics selection: this is now redundant, all should appear as accepted after service task selection
616 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
617 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
618 std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
619 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
620 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
621 fHistEvtSelection->Fill(2);
622 PostData(1, fOutputList);
630 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
631 fHistEvtSelection->Fill(3);
632 PostData(1, fOutputList);
634 AliAODVertex* primVtx = aod->GetPrimaryVertex();
637 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
638 fHistEvtSelection->Fill(3);
639 PostData(1, fOutputList);
643 Int_t nTracksPrim = primVtx->GetNContributors();
644 if ((nTracksPrim < fMinContribVtx) ||
645 (primVtx->GetZ() < fVtxZMin) ||
646 (primVtx->GetZ() > fVtxZMax) ){
647 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
648 fHistEvtSelection->Fill(3);
649 PostData(1, fOutputList);
653 // event class selection (from jet helper task)
654 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
655 if(fDebug) Printf("Event class %d", eventClass);
656 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
657 fHistEvtSelection->Fill(4);
658 PostData(1, fOutputList);
662 // centrality selection
663 AliCentrality *cent = 0x0;
664 Double_t centValue = 0.;
666 if(fESD) {cent = fESD->GetCentrality();
667 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
668 else centValue=((AliVAODHeader*)aod->GetHeader())->GetCentrality();
670 if(fDebug) printf("centrality: %f\n", centValue);
671 if (centValue < fCentMin || centValue > fCentMax){
672 fHistEvtSelection->Fill(4);
673 PostData(1, fOutputList);
678 fHistEvtSelection->Fill(0);
680 // -- end event selection --
683 AliAODJetEventBackground* externalBackground = 0;
684 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
685 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
686 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
688 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
689 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
690 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
693 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
694 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
695 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
701 if(externalBackground)rho = externalBackground->GetBackground(0);}
703 if(externalBackground)rho = externalBackground->GetBackground(2);}
705 if(externalBackground)rho = externalBackground->GetBackground(3);}
707 TClonesArray *aodJets[2];
709 if(fAODOut&&!aodJets[0]){
710 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
711 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
712 if(fAODExtension && !aodJets[0]){
713 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
714 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
715 if(fAODIn&&!aodJets[0]){
716 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
717 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
726 Double_t dice=fRandom->Uniform(0,1);
727 if(dice>fFrac){ minT=fTTLowRef;
729 if(dice<=fFrac){minT=fTTLowSig;
734 if(fHardest==1 || fHardest==2) nT = GetListOfTracks(&ParticleList);
735 if(fHardest==0) nT=SelectTrigger(&ParticleList,minT,maxT,number);
737 PostData(1, fOutputList);
740 if(dice>fFrac) fh1TrigRef->Fill(number);
741 if(dice<=fFrac)fh1TrigSig->Fill(number);
743 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
744 fListJets[iJetType]->Clear();
745 if (!aodJets[iJetType]) continue;
746 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
747 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
748 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
749 if (jet) fListJets[iJetType]->Add(jet);
751 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
760 // Double_t areasmall=0;
761 Double_t phismall=0.;
767 Int_t trigBBTrack=-1;
768 // Int_t trigInTrack=-1;
769 fRPAngle = ((AliVAODHeader*)aod->GetHeader())->GetEventplane();
771 if(fHardest==0 || fHardest==1){
772 AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
774 PostData(1, fOutputList);
777 if(fSemigoodCorrect){
778 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
779 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6){
780 PostData(1, fOutputList);
787 for(Int_t tt=0;tt<ParticleList.GetEntries();tt++){
788 if(fHardest==0||fHardest==1){if(tt!=nT) continue;}
789 AliVParticle *partback = (AliVParticle*)ParticleList.At(tt);
790 if(!partback) continue;
791 if(partback->Pt()<8) continue;
793 Double_t accep=2.*TMath::Pi()*1.8;
797 if(fSemigoodCorrect){
798 Double_t disthole=RelativePhi(partback->Phi(),fHolePos);
799 if(TMath::Abs(disthole)+fHoleWidth>TMath::Pi()-0.6) continue;}
803 fh2Ntriggers->Fill(centValue,partback->Pt());
804 Double_t phiBinT = RelativePhi(partback->Phi(),fRPAngle);
805 if(centValue<20.) fh2RPTC20->Fill(TMath::Abs(phiBinT),partback->Pt());
806 if(centValue<10.) fh2RPTC10->Fill(TMath::Abs(phiBinT),partback->Pt());
810 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
811 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
812 etabig = jetbig->Eta();
813 phibig = jetbig->Phi();
814 ptbig = jetbig->Pt();
815 if(ptbig==0) continue;
816 Double_t phiBin = RelativePhi(phibig,fRPAngle);
817 areabig = jetbig->EffectiveAreaCharged();
818 Double_t ptcorr=ptbig-rho*areabig;
819 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
820 if(areabig>=0.07) injet=injet+1;
821 if(areabig>=0.4) injet4=injet4+1;
822 Double_t dphi=RelativePhi(partback->Phi(),phibig);
825 Double_t etadif= partback->Eta()-etabig;
826 if(TMath::Abs(etadif)<=0.5){
828 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
829 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
831 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
832 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
835 if(fFlagJetHadron==0){
836 if(fFlagPhiBkg==1) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
837 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
838 if(fFlagPhiBkg==2) if(TMath::Abs(dphi)<TMath::Pi()-0.7) continue;
839 if(fFlagPhiBkg==3) if(TMath::Abs(dphi)<TMath::Pi()-0.5) continue;}
841 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
844 if(centValue<10.) fh2RPJetsC10->Fill(TMath::Abs(phiBin), ptcorr);
845 if(centValue<20.) fh2RPJetsC20->Fill(TMath::Abs(phiBin), ptcorr);
846 Double_t dismin=100.;
851 Float_t phitt=partback->Phi();
852 if(phitt<0)phitt+=TMath::Pi()*2.;
853 Int_t phiBintt = GetPhiBin(phitt-fRPAngle);
855 Double_t fillspec[] = {centValue,jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt(), static_cast<Double_t>(phiBintt)};
856 fHJetSpec->Fill(fillspec);
860 if(ptcorr<=0) continue;
862 AliAODTrack* leadtrack=0;
865 if(fFlagJetHadron==0){
866 TRefArray *genTrackList = jetbig->GetRefTracks();
867 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
868 AliAODTrack* genTrack;
869 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
870 genTrack = (AliAODTrack*)(genTrackList->At(ir));
871 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
873 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
874 if(!leadtrack) continue;
879 AliVParticle* leadtrackb=0;
880 if(fFlagJetHadron!=0){
881 Int_t nTb = GetHardestTrackBackToJet(jetbig);
882 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
883 if(!leadtrackb) continue;
890 //store one trigger info
899 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
900 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
901 etasmall = jetsmall->Eta();
902 phismall = jetsmall->Phi();
903 ptsmall = jetsmall->Pt();
904 // areasmall = jetsmall->EffectiveAreaCharged();
905 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
906 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
907 //Fraction in the jet core
908 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
910 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
911 index1=j;}} //en of loop over R=0.2 jets
912 //method1:most concentric jet=core
913 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
914 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
915 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
916 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
917 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
918 //method2:hardest contained jet=core
920 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
921 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
922 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
923 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
924 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
925 if(centValue<10&&leadtrack) fh2Ntriggers2C10->Fill(leadtrack->Pt(),partback->Pt());
926 if(centValue<20&&leadtrack) fh2Ntriggers2C20->Fill(leadtrack->Pt(),partback->Pt());
927 if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
928 for(int it = 0;it<ParticleList.GetEntries();++it){
929 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
930 Double_t deltaR = jetbig->DeltaR(part);
931 Double_t deltaEta = etabig-part->Eta();
933 Double_t deltaPhi=phibig-part->Phi();
934 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
935 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
937 if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
938 if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
939 Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
940 fhnDeltaR->Fill(jetEntries);}
946 //end of track loop, we only do it if EM is switched off
957 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
958 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
964 if(fDoEventMixing>0){
965 //check before if the trigger exists
966 // fTrigBuffer[i][0] = zvtx
967 // fTrigBuffer[i][1] = phi
968 // fTrigBuffer[i][2] = eta
969 // fTrigBuffer[i][3] = pt_jet
970 // fTrigBuffer[i][4] = pt_trig
971 // fTrigBuffer[i][5]= centrality
972 if(fTindex==10) fTindex=0;
973 if(fTrigBuffer[fTindex][3]>0){
974 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
975 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
977 for(int it = 0;it<nT;++it){
978 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
979 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
980 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
981 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
982 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
983 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
984 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
985 fhnMixedEvents->Fill(triggerEntries);
988 if(fNevents==10) fTindex=fTindex+1;
991 if(fTindex==10&&fNevents==10) fCountAgain=0;
993 // Copy the triggers from the current event into the buffer.
994 //again, only if the trigger exists:
997 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
998 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
999 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
1000 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
1001 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
1002 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
1003 fTrigBuffer[fTrigBufferIndex][5] = centValue;
1005 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
1012 /////////////////////////////////////////////////////////////////////////////
1013 ////////////////////// Rongrong's analysis //////////////////////////////////
1014 if(fRunAnaAzimuthalCorrelation)
1016 fhTTPt->Fill(centValue,partback->Pt());
1017 for(Int_t ij=0; ij<fListJets[0]->GetEntries(); ij++)
1019 AliAODJet* jet = (AliAODJet*)(fListJets[0]->At(ij));
1020 Double_t jetPt = jet->Pt();
1021 Double_t jetEta = jet->Eta();
1022 Double_t jetPhi = jet->Phi();
1023 if(jetPt==0) continue;
1024 if((jetEta<fJetEtaMin)||(jetEta>fJetEtaMax)) continue;
1025 Double_t jetArea = jet->EffectiveAreaCharged();
1026 Double_t jetPtCorr=jetPt-rho*jetArea;
1027 Double_t dPhi=jetPhi-partback->Phi();
1028 if(dPhi>2*TMath::Pi()) dPhi -= 2*TMath::Pi();
1029 if(dPhi<-2*TMath::Pi()) dPhi += 2*TMath::Pi();
1030 if(dPhi<-0.5*TMath::Pi()) dPhi += 2*TMath::Pi();
1031 if(dPhi>1.5*TMath::Pi()) dPhi -= 2*TMath::Pi();
1033 Double_t fill[] = {partback->Pt(),jetPtCorr,dPhi,jetArea,centValue};
1034 fHJetPhiCorr->Fill(fill);
1037 /////////////////////////////////////////////////////////////////////////////
1038 /////////////////////////////////////////////////////////////////////////////
1041 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
1043 //tracks up to R=0.8 distant from the jet axis
1044 // if(fAngStructCloseTracks==1){
1045 // TList CloseTrackList;
1046 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
1047 // Double_t difR=0.04;
1048 // for(Int_t l=0;l<15;l++){
1049 // Double_t rr=l*0.1+0.1;
1050 // for(int it = 0;it<nn;++it){
1051 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
1052 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
1053 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
1054 // Double_t ptm=part1->Pt();
1055 // Double_t ptn=part2->Pt();
1056 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1057 // Rnm=TMath::Sqrt(Rnm);
1058 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1059 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1060 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1061 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1062 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1063 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1064 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1065 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1066 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1067 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
1070 // //only jet constituents
1071 // if(fAngStructCloseTracks==2){
1073 // Double_t difR=0.04;
1074 // for(Int_t l=0;l<15;l++){
1075 // Double_t rr=l*0.1+0.1;
1078 // AliAODTrack* part1;
1079 // AliAODTrack* part2;
1081 // TRefArray *genTrackListb = jetbig->GetRefTracks();
1082 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
1086 // for(Int_t it=0; it<nTracksGenJetb; ++it){
1087 // part1 = (AliAODTrack*)(genTrackListb->At(it));
1088 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
1089 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
1090 // Double_t ptm=part1->Pt();
1091 // Double_t ptn=part2->Pt();
1092 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
1093 // Rnm=TMath::Sqrt(Rnm);
1094 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
1095 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
1096 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
1097 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
1098 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
1099 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
1100 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
1101 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
1102 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
1103 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
1105 // //end loop over R=0.4 jets
1106 // if(fAngStructCloseTracks>0){
1107 // for(Int_t l=0;l<15;l++){
1108 // Double_t rr=l*0.1+0.1;
1110 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
1111 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
1112 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
1113 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
1115 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
1116 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
1117 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
1118 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
1120 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
1121 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
1122 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
1123 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
1125 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
1126 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
1127 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
1128 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
1136 PostData(1, fOutputList);
1139 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
1141 // Draw result to the screen
1142 // Called once at the end of the query
1144 if (!GetOutputData(1))
1153 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
1156 AliAODEvent *aod = 0;
1158 if(!fESD)aod = fAODIn;
1168 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1169 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1170 if(!tr) AliFatal("Not a standard AOD");
1171 Bool_t bGood = false;
1172 if(fFilterType == 0)bGood = true;
1173 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1174 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1175 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1176 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1177 if(bGood==false) continue;
1178 if (fApplySharedClusterCut) {
1179 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
1180 if (frac > 0.4) continue;
1182 if(TMath::Abs(tr->Eta())>0.9)continue;
1183 if(tr->Pt()<0.15)continue;
1186 if(fFilterType==2 && fFilterMaskBestPt>0){// only set the trigger track index for good quality tracks
1187 if(tr->TestFilterBit(fFilterMaskBestPt)){
1203 // else if (type == kTrackAODMCCharged) {
1204 // TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1205 // if(!tca)return iCount;
1206 // for(int it = 0;it < tca->GetEntriesFast();++it){
1207 // AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1208 // if(!part)continue;
1209 // if(part->Pt()<0.15)continue;
1210 // if(!part->IsPhysicalPrimary())continue;
1211 // if(part->Charge()==0)continue;
1212 // if(TMath::Abs(part->Eta())>0.9)continue;
1215 // if(part->Pt()>ptmax){ ptmax=part->Pt();
1216 // index=iCount-1;}}}
1223 Int_t AliAnalysisTaskJetCore::SelectTrigger(TList *list,Double_t minT,Double_t maxT,Int_t &number){
1225 AliAODEvent *aod = 0;
1226 if(!fESD)aod = fAODIn;
1230 Int_t triggers[100];
1231 for(Int_t cr=0;cr<100;cr++){triggers[cr]=-1;}
1233 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1234 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1235 if(!tr) AliFatal("Not a standard AOD");
1236 Bool_t bGood = false;
1237 if(fFilterType == 0)bGood = true;
1238 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1239 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1240 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1241 if(fRequireITSRefit==1){if((tr->GetStatus()&AliESDtrack::kITSrefit)==0)continue;}
1242 if(bGood==false) continue;
1243 if (fApplySharedClusterCut) {
1244 Double_t frac = Double_t(tr->GetTPCnclsS()) /Double_t(tr->GetTPCncls());
1245 if (frac > 0.4) continue;
1247 if(TMath::Abs(tr->Eta())>0.9)continue;
1248 if(tr->Pt()<0.15)continue;
1252 if(tr->Pt()>=minT && tr->Pt()<maxT){
1253 triggers[im]=iCount-1;
1260 if(im>0) rd=fRandom->Integer(im);
1262 AliVParticle *tr1 = (AliVParticle*)list->At(index);
1266 for(Int_t kk=0;kk<number;kk++){
1267 if(kk==rd) continue;
1268 Int_t lab=triggers[kk];
1269 AliVParticle *tr2 = (AliVParticle*)list->At(lab);
1271 Double_t detat=tr1->Eta()-tr2->Eta();
1272 Double_t dphit=RelativePhi(tr1->Phi(),tr2->Phi());
1273 Double_t deltaRt=TMath::Sqrt(detat*detat+dphit*dphit);
1275 if(deltaRt>0.4) number=number-1;}
1300 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
1302 AliAODEvent *aod = 0;
1303 if(!fESD)aod = fAODIn;
1310 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1311 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1312 if(!tr) AliFatal("Not a standard AOD");
1313 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1314 if(TMath::Abs(tr->Eta())>0.9)continue;
1315 if(tr->Pt()<0.15)continue;
1317 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1318 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1319 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1336 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1339 AliAODEvent *aod = 0;
1340 if(!fESD)aod = fAODIn;
1343 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1344 AliAODTrack *tr = dynamic_cast<AliAODTrack*>(aod->GetTrack(it));
1345 if(!tr) AliFatal("Not a standard AOD");
1346 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1347 if(TMath::Abs(tr->Eta())>0.9)continue;
1348 if(tr->Pt()<0.15)continue;
1349 Double_t disR=jetbig->DeltaR(tr);
1350 if(disR>0.8) continue;
1352 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1371 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1374 Int_t nInputTracks = 0;
1375 AliAODEvent *aod = 0;
1376 if(!fESD)aod = fAODIn;
1378 TString jbname(fJetBranchName[1]);
1379 //needs complete event, use jets without background subtraction
1380 for(Int_t i=1; i<=3; ++i){
1381 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1383 // use only HI event
1384 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1385 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1387 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1388 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1390 Printf("Jet branch %s not found", jbname.Data());
1391 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1395 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1396 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1398 TRefArray *trackList = jet->GetRefTracks();
1399 Int_t nTracks = trackList->GetEntriesFast();
1400 nInputTracks += nTracks;
1401 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1403 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1405 return nInputTracks;
1410 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1412 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1413 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1414 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1415 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1416 double dphi = mphi-vphi;
1417 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1418 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1419 return dphi;//dphi in [-Pi, Pi]
1422 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1425 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1426 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1427 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1428 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1435 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1437 // generate new THnSparseF, axes are defined in GetDimParams()
1440 UInt_t tmp = entries;
1443 tmp = tmp &~ -tmp; // clear lowest bit
1446 TString hnTitle(name);
1447 const Int_t dim = count;
1454 while(c<dim && i<32){
1458 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1459 hnTitle += Form(";%s",label.Data());
1467 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1470 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1472 // stores label and binning of axis for THnSparse
1474 const Double_t pi = TMath::Pi();
1479 label = "V0 centrality (%)";
1488 label = "corrected jet pt";
1531 label = "leading track";
1539 label = "trigger track";