2 // ******************************************
3 // This task computes several jet observables like
4 // the fraction of energy in inner and outer coronnas,
5 // jet-track correlations,triggered jet shapes and
6 // correlation strength distribution of particles inside jets.
7 // Author: lcunquei@cern.ch
8 // *******************************************
11 /**************************************************************************
12 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
14 * Author: The ALICE Off-line Project. *
15 * Contributors are mentioned in the code where appropriate. *
17 * Permission to use, copy, modify and distribute this software and its *
18 * documentation strictly for non-commercial purposes is hereby granted *
19 * without fee, provided that the above copyright notice appears in all *
20 * copies and that both the copyright notice and this permission notice *
21 * appear in the supporting documentation. The authors make no claims *
22 * about the suitability of this software for any purpose. It is *
23 * provided "as is" without express or implied warranty. *
24 **************************************************************************/
33 #include "THnSparse.h"
38 #include "AliAnalysisTask.h"
39 #include "AliAnalysisManager.h"
41 #include "AliVEvent.h"
42 #include "AliESDEvent.h"
43 #include "AliESDInputHandler.h"
44 #include "AliCentrality.h"
45 #include "AliAnalysisHelperJetTasks.h"
46 #include "AliInputEventHandler.h"
47 #include "AliAODJetEventBackground.h"
48 #include "AliAODMCParticle.h"
49 #include "AliAnalysisTaskFastEmbedding.h"
50 #include "AliAODEvent.h"
51 #include "AliAODHandler.h"
52 #include "AliAODJet.h"
54 #include "AliAnalysisTaskJetCore.h"
59 ClassImp(AliAnalysisTaskJetCore)
61 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore() :
67 fBackgroundBranch(""),
70 fOfflineTrgMask(AliVEvent::kAny),
77 fFilterMaskBestPt(16),
85 fAngStructCloseTracks(0),
94 fTrackTypeRec(kTrackUndef),
104 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
105 fJetPtFractionMin(0.5),
113 fHistEvtSelection(0x0),
116 fh2JetCoreMethod1C10(0x0),
117 fh2JetCoreMethod2C10(0x0),
118 fh2JetCoreMethod1C20(0x0),
119 fh2JetCoreMethod2C20(0x0),
120 fh2JetCoreMethod1C30(0x0),
121 fh2JetCoreMethod2C30(0x0),
122 fh2JetCoreMethod1C60(0x0),
123 fh2JetCoreMethod2C60(0x0),
124 fh3JetTrackC3060(0x0),
126 fh2AngStructpt1C10(0x0),
127 fh2AngStructpt2C10(0x0),
128 fh2AngStructpt3C10(0x0),
129 fh2AngStructpt4C10(0x0),
130 fh2AngStructpt1C20(0x0),
131 fh2AngStructpt2C20(0x0),
132 fh2AngStructpt3C20(0x0),
133 fh2AngStructpt4C20(0x0),
134 fh2AngStructpt1C30(0x0),
135 fh2AngStructpt2C30(0x0),
136 fh2AngStructpt3C30(0x0),
137 fh2AngStructpt4C30(0x0),
138 fh2AngStructpt1C60(0x0),
139 fh2AngStructpt2C60(0x0),
140 fh2AngStructpt3C60(0x0),
141 fh2AngStructpt4C60(0x0),
145 fh3JetDensityA4(0x0),
148 fh3spectriggeredC20RP(0x0),
149 fh3spectriggeredC20(0x0),
150 fh3spectriggeredC3060(0x0)
154 // default Constructor
158 for(Int_t i=0; i<10; i++) {
159 for(Int_t j=0; j<6; j++) {
168 fJetBranchName[0] = "";
169 fJetBranchName[1] = "";
171 fListJets[0] = new TList;
172 fListJets[1] = new TList;
175 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore(const char *name) :
176 AliAnalysisTaskSE(name),
181 fBackgroundBranch(""),
184 fOfflineTrgMask(AliVEvent::kAny),
191 fFilterMaskBestPt(16),
198 fNInputTracksMax(-1),
199 fAngStructCloseTracks(0),
208 fTrackTypeRec(kTrackUndef),
218 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
219 fJetPtFractionMin(0.5),
227 fHistEvtSelection(0x0),
230 fh2JetCoreMethod1C10(0x0),
231 fh2JetCoreMethod2C10(0x0),
232 fh2JetCoreMethod1C20(0x0),
233 fh2JetCoreMethod2C20(0x0),
234 fh2JetCoreMethod1C30(0x0),
235 fh2JetCoreMethod2C30(0x0),
236 fh2JetCoreMethod1C60(0x0),
237 fh2JetCoreMethod2C60(0x0),
238 fh3JetTrackC3060(0x0),
240 fh2AngStructpt1C10(0x0),
241 fh2AngStructpt2C10(0x0),
242 fh2AngStructpt3C10(0x0),
243 fh2AngStructpt4C10(0x0),
244 fh2AngStructpt1C20(0x0),
245 fh2AngStructpt2C20(0x0),
246 fh2AngStructpt3C20(0x0),
247 fh2AngStructpt4C20(0x0),
248 fh2AngStructpt1C30(0x0),
249 fh2AngStructpt2C30(0x0),
250 fh2AngStructpt3C30(0x0),
251 fh2AngStructpt4C30(0x0),
252 fh2AngStructpt1C60(0x0),
253 fh2AngStructpt2C60(0x0),
254 fh2AngStructpt3C60(0x0),
255 fh2AngStructpt4C60(0x0),
259 fh3JetDensityA4(0x0),
262 fh3spectriggeredC20RP(0x0),
263 fh3spectriggeredC20(0x0),
264 fh3spectriggeredC3060(0x0)
270 for(Int_t i=0; i<10; i++) {
271 for(Int_t j=0; j<6; j++) {
278 fJetBranchName[0] = "";
279 fJetBranchName[1] = "";
281 fListJets[0] = new TList;
282 fListJets[1] = new TList;
284 DefineOutput(1, TList::Class());
287 AliAnalysisTaskJetCore::~AliAnalysisTaskJetCore()
293 void AliAnalysisTaskJetCore::SetBranchNames(const TString &branch1, const TString &branch2)
295 fJetBranchName[0] = branch1;
296 fJetBranchName[1] = branch2;
299 void AliAnalysisTaskJetCore::Init()
302 // check for jet branches
303 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
304 AliError("Jet branch name not set.");
309 void AliAnalysisTaskJetCore::UserCreateOutputObjects()
314 if(!fOutputList) fOutputList = new TList;
315 fOutputList->SetOwner(kTRUE);
317 Bool_t oldStatus = TH1::AddDirectoryStatus();
318 TH1::AddDirectory(kFALSE);
321 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
322 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
323 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
324 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
325 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
326 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
327 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
329 UInt_t entries = 0; // bit coded, see GetDimParams() below
330 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7;
331 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
333 //change binning in pTtrack
334 Double_t *xPt3 = new Double_t[10];
336 for(int i = 1; i<=9;i++){
337 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
338 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
339 else xPt3[i] = xPt3[i-1] + 150.; // 18
341 fhnDeltaR->SetBinEdges(2,xPt3);
344 //change binning in HTI
345 Double_t *xPt4 = new Double_t[14];
347 for(int i = 1; i<=13;i++){
348 if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 1; // 1 - 10
349 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 5; // 10 - 12
350 else xPt4[i] = xPt4[i-1] + 30.; // 13
352 fhnDeltaR->SetBinEdges(6,xPt4);
362 UInt_t cifras = 0; // bit coded, see GetDimParams() below
363 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
364 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);}
367 fh2JetCoreMethod1C10 = new TH2F("JetCoreMethod1C10","",150, 0., 150.,100, 0., 1.5);
368 fh2JetCoreMethod2C10 = new TH2F("JetCoreMethod2C10","",150, 0., 150.,100, 0., 1.5);
369 fh2JetCoreMethod1C20 = new TH2F("JetCoreMethod1C20","",150, 0., 150.,100, 0., 1.5);
370 fh2JetCoreMethod2C20 = new TH2F("JetCoreMethod2C20","",150, 0., 150.,100, 0., 1.5);
371 fh2JetCoreMethod1C30 = new TH2F("JetCoreMethod1C30","",150, 0., 150.,100, 0., 1.5);
372 fh2JetCoreMethod2C30 = new TH2F("JetCoreMethod2C30","",150, 0., 150.,100, 0., 1.5);
373 fh2JetCoreMethod1C60 = new TH2F("JetCoreMethod1C60","",150, 0., 150.,100, 0., 1.5);
374 fh2JetCoreMethod2C60 = new TH2F("JetCoreMethod2C60","",150, 0., 150.,100, 0., 1.5);}
376 fh3JetTrackC3060=new TH3F("JetTrackC3060","",50,0,50,150,0.,150.,35,0.,3.5);
377 fh3JetTrackC20=new TH3F("JetTrackC20","",50,0,50,150,0.,150.,35,0.,3.5);
378 if(fAngStructCloseTracks>0){
379 fh2AngStructpt1C10 = new TH2F("Ang struct pt1 C10","",15,0.,1.5,150,0.,10.);
380 fh2AngStructpt2C10 = new TH2F("Ang struct pt2 C10","",15,0.,1.5,150,0.,10.);
381 fh2AngStructpt3C10 = new TH2F("Ang struct pt3 C10","",15,0.,1.5,150,0.,10.);
382 fh2AngStructpt4C10 = new TH2F("Ang struct pt4 C10","",15,0.,1.5,150,0.,10.);
383 fh2AngStructpt1C20 = new TH2F("Ang struct pt1 C20","",15,0.,1.5,150,0.,10.);
384 fh2AngStructpt2C20 = new TH2F("Ang struct pt2 C20","",15,0.,1.5,150,0.,10.);
385 fh2AngStructpt3C20 = new TH2F("Ang struct pt3 C20","",15,0.,1.5,150,0.,10.);
386 fh2AngStructpt4C20 = new TH2F("Ang struct pt4 C20","",15,0.,1.5,150,0.,10.);
387 fh2AngStructpt1C30 = new TH2F("Ang struct pt1 C30","",15,0.,1.5,150,0.,10.);
388 fh2AngStructpt2C30 = new TH2F("Ang struct pt2 C30","",15,0.,1.5,150,0.,10.);
389 fh2AngStructpt3C30 = new TH2F("Ang struct pt3 C30","",15,0.,1.5,150,0.,10.);
390 fh2AngStructpt4C30 = new TH2F("Ang struct pt4 C30","",15,0.,1.5,150,0.,10.);
391 fh2AngStructpt1C60 = new TH2F("Ang struct pt1 C60","",15,0.,1.5,150,0.,10.);
392 fh2AngStructpt2C60 = new TH2F("Ang struct pt2 C60","",15,0.,1.5,150,0.,10.);
393 fh2AngStructpt3C60 = new TH2F("Ang struct pt3 C60","",15,0.,1.5,150,0.,10.);
394 fh2AngStructpt4C60 = new TH2F("Ang struct pt4 C60","",15,0.,1.5,150,0.,10.); }
398 fh2Ntriggers=new TH2F("# of triggers","",10,0.,100.,50,0.,50.);
399 fh2Ntriggers2=new TH2F("# of triggers2","",50,0.,50.,50,0.,50.);
401 fh3JetDensity=new TH3F("Jet density vs mutliplicity A>0.4","",100,0.,4000.,100,0.,5.,10,0.,50.);
402 fh3JetDensityA4=new TH3F("Jet density vs multiplicity A>0.4","",100,0.,4000.,100,0.,5.,10,0.,50.);
403 fh2RPJets=new TH2F("RPJet","",fNRPBins,0.,fNRPBins,150,0.,150.);
404 fh2RPT=new TH2F("RPTrigger","",fNRPBins,0.,fNRPBins,150,0.,150.);
405 fh3spectriggeredC20RP = new TH3F("Triggered spectrumC20RP","",3,0.,3.,140,-80.,200.,10,0.,50.);
406 fh3spectriggeredC20 = new TH3F("Triggered spectrumC20","",100,0.,1.,140,-80.,200.,10,0.,50.);
407 fh3spectriggeredC3060 = new TH3F("Triggered spectrumC3060","",100,0.,1.,140,-80.,200.,10,0.,50.);
411 fOutputList->Add(fHistEvtSelection);
413 fOutputList->Add(fhnDeltaR);
415 fOutputList->Add(fhnMixedEvents);
421 fOutputList->Add(fh2JetCoreMethod1C10);
422 fOutputList->Add(fh2JetCoreMethod2C10);
423 fOutputList->Add(fh2JetCoreMethod1C20);
424 fOutputList->Add(fh2JetCoreMethod2C20);
425 fOutputList->Add(fh2JetCoreMethod1C30);
426 fOutputList->Add(fh2JetCoreMethod2C30);
427 fOutputList->Add(fh2JetCoreMethod1C60);
428 fOutputList->Add(fh2JetCoreMethod2C60);}
430 fOutputList->Add(fh3JetTrackC3060);
431 fOutputList->Add(fh3JetTrackC20);
437 if(fAngStructCloseTracks>0){
438 fOutputList->Add(fh2AngStructpt1C10);
439 fOutputList->Add(fh2AngStructpt2C10);
440 fOutputList->Add(fh2AngStructpt3C10);
441 fOutputList->Add(fh2AngStructpt4C10);
442 fOutputList->Add(fh2AngStructpt1C20);
443 fOutputList->Add(fh2AngStructpt2C20);
444 fOutputList->Add(fh2AngStructpt3C20);
445 fOutputList->Add(fh2AngStructpt4C20);
446 fOutputList->Add(fh2AngStructpt1C30);
447 fOutputList->Add(fh2AngStructpt2C30);
448 fOutputList->Add(fh2AngStructpt3C30);
449 fOutputList->Add(fh2AngStructpt4C30);
450 fOutputList->Add(fh2AngStructpt1C60);
451 fOutputList->Add(fh2AngStructpt2C60);
452 fOutputList->Add(fh2AngStructpt3C60);
453 fOutputList->Add(fh2AngStructpt4C60);}
459 fOutputList->Add(fh2Ntriggers);
460 fOutputList->Add(fh2Ntriggers2);
461 fOutputList->Add(fh3JetDensity);
462 fOutputList->Add(fh3JetDensityA4);
463 fOutputList->Add(fh2RPJets);
464 fOutputList->Add(fh2RPT);
465 fOutputList->Add(fh3spectriggeredC20RP);
466 fOutputList->Add(fh3spectriggeredC20);
467 fOutputList->Add(fh3spectriggeredC3060);
470 // =========== Switch on Sumw2 for all histos ===========
471 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
472 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
477 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
482 TH1::AddDirectory(oldStatus);
484 PostData(1, fOutputList);
487 void AliAnalysisTaskJetCore::UserExec(Option_t *)
491 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
492 AliError("Jet branch name not set.");
496 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
498 AliError("ESD not available");
499 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
501 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
503 static AliAODEvent* aod = 0;
504 // take all other information from the aod we take the tracks from
506 if(!fESD)aod = fAODIn;
511 if(fNonStdFile.Length()!=0){
512 // case that we have an AOD extension we need can fetch the jets from the extended output
513 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
514 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
516 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
520 // -- event selection --
521 fHistEvtSelection->Fill(1); // number of events before event selection
524 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
525 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
526 std::cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<std::endl;
527 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
528 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
529 fHistEvtSelection->Fill(2);
530 PostData(1, fOutputList);
536 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
537 fHistEvtSelection->Fill(3);
538 PostData(1, fOutputList);
540 AliAODVertex* primVtx = aod->GetPrimaryVertex();
543 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
544 fHistEvtSelection->Fill(3);
545 PostData(1, fOutputList);
549 Int_t nTracksPrim = primVtx->GetNContributors();
550 if ((nTracksPrim < fMinContribVtx) ||
551 (primVtx->GetZ() < fVtxZMin) ||
552 (primVtx->GetZ() > fVtxZMax) ){
553 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
554 fHistEvtSelection->Fill(3);
555 PostData(1, fOutputList);
559 // event class selection (from jet helper task)
560 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
561 if(fDebug) Printf("Event class %d", eventClass);
562 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
563 fHistEvtSelection->Fill(4);
564 PostData(1, fOutputList);
568 // centrality selection
569 AliCentrality *cent = 0x0;
570 Double_t centValue = 0.;
572 if(fESD) {cent = fESD->GetCentrality();
573 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
574 else centValue=aod->GetHeader()->GetCentrality();
576 if(fDebug) printf("centrality: %f\n", centValue);
577 if (centValue < fCentMin || centValue > fCentMax){
578 fHistEvtSelection->Fill(4);
579 PostData(1, fOutputList);
584 fHistEvtSelection->Fill(0);
586 // -- end event selection --
589 AliAODJetEventBackground* externalBackground = 0;
590 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
591 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
592 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
594 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
595 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
596 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
599 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
600 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
601 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
607 if(externalBackground)rho = externalBackground->GetBackground(0);}
609 if(externalBackground)rho = externalBackground->GetBackground(2);}
612 TClonesArray *aodJets[2];
614 if(fAODOut&&!aodJets[0]){
615 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
616 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
617 if(fAODExtension && !aodJets[0]){
618 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
619 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
620 if(fAODIn&&!aodJets[0]){
621 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
622 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
625 //Double_t ptsub[aodJets[0]->GetEntriesFast()];
626 //Int_t inord[aodJets[0]->GetEntriesFast()];
627 //for(Int_t n=0;n<aodJets[0]->GetEntriesFast();n++){
632 Int_t nT = GetListOfTracks(&ParticleList);
633 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
634 fListJets[iJetType]->Clear();
635 if (!aodJets[iJetType]) continue;
636 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
637 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
638 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
639 if (jet) fListJets[iJetType]->Add(jet);
641 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
650 Double_t areasmall=0;
651 Double_t phismall=0.;
657 Int_t trigBBTrack=-1;
658 Int_t trigInTrack=-1;
659 fRPAngle = aod->GetHeader()->GetEventplane();
661 // AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
663 //PostData(1, fOutputList);
667 for(Int_t tt=0;tt<ParticleList.GetEntries();tt++){
669 if(fFlagOnlyHardest!=0){if(tt!=nT) continue;}
670 AliVParticle *partback = (AliVParticle*)ParticleList.At(tt);
671 fh2Ntriggers->Fill(centValue,partback->Pt());
672 Int_t phiBinT = GetPhiBin(RelativePhi(partback->Phi(),fRPAngle));
673 if(centValue<20.) fh2RPT->Fill(phiBinT,partback->Pt());
675 Double_t accep=2.*TMath::Pi()*1.8;
678 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
679 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
680 etabig = jetbig->Eta();
681 phibig = jetbig->Phi();
682 ptbig = jetbig->Pt();
683 if(ptbig==0) continue;
684 Int_t phiBin = GetPhiBin(RelativePhi(phibig,fRPAngle));
685 areabig = jetbig->EffectiveAreaCharged();
686 Double_t ptcorr=ptbig-rho*areabig;
687 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
688 if(areabig>=0.07) injet=injet+1;
689 if(areabig>=0.4) injet4=injet4+1;
690 Double_t dphi=RelativePhi(partback->Phi(),phibig);
693 Double_t etadif= partback->Eta()-etabig;
694 if(TMath::Abs(etadif)<=0.5){
696 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
697 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
699 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
700 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
703 if(fFlagJetHadron==0){
704 if(fFlagPhiBkg!=0) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
705 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;}
707 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
710 if(centValue<20.) fh2RPJets->Fill(phiBin, ptcorr);
712 Double_t dismin=100.;
717 if(centValue<20.) fh3spectriggeredC20RP->Fill(phiBin,ptcorr,partback->Pt());
718 if(centValue<20.) fh3spectriggeredC20->Fill(jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt());
719 if(centValue>30. && centValue<60.) fh3spectriggeredC3060->Fill(jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt());
721 if(ptcorr<=0) continue;
724 AliAODTrack* leadtrack=0;
727 if(fFlagJetHadron==0){
728 TRefArray *genTrackList = jetbig->GetRefTracks();
729 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
730 AliAODTrack* genTrack;
731 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
732 genTrack = (AliAODTrack*)(genTrackList->At(ir));
733 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
735 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
736 if(!leadtrack) continue;}
738 AliVParticle* leadtrackb=0;
739 if(fFlagJetHadron!=0){
740 Int_t nTb = GetHardestTrackBackToJet(jetbig);
741 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
742 if(!leadtrackb) continue;
749 //store one trigger info
758 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
759 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
760 etasmall = jetsmall->Eta();
761 phismall = jetsmall->Phi();
762 ptsmall = jetsmall->Pt();
763 areasmall = jetsmall->EffectiveAreaCharged();
764 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
765 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
766 //Fraction in the jet core
767 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
769 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
770 index1=j;}} //en of loop over R=0.2 jets
771 //method1:most concentric jet=core
772 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
773 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
774 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
775 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
776 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
777 //method2:hardest contained jet=core
779 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
780 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
781 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
782 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
783 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
787 // for(int it = 0;it<ParticleList.GetEntries();++it){
788 // AliVParticle *part = (AliVParticle*)ParticleList.At(it);
789 // Double_t deltaR = jetbig->DeltaR(part);
790 // Double_t deltaEta = etabig-part->Eta();
791 // if(centValue<20.) fh2Ntriggers2->Fill(partback->Pt(),part->Pt());
792 // if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
793 // Double_t deltaPhi=phibig-part->Phi();
794 // if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
795 // if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
796 // Double_t pTcont=0;
797 // if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
798 // if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
799 // Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
800 // fhnDeltaR->Fill(jetEntries);}
806 //end of track loop, we only do it if EM is switched off
817 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
818 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
824 if(fDoEventMixing>0){
825 //check before if the trigger exists
826 // fTrigBuffer[i][0] = zvtx
827 // fTrigBuffer[i][1] = phi
828 // fTrigBuffer[i][2] = eta
829 // fTrigBuffer[i][3] = pt_jet
830 // fTrigBuffer[i][4] = pt_trig
831 // fTrigBuffer[i][5]= centrality
832 if(fTindex==10) fTindex=0;
833 if(fTrigBuffer[fTindex][3]>0){
834 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
835 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
837 for(int it = 0;it<nT;++it){
838 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
839 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
840 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
841 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
842 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
843 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
844 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
845 fhnMixedEvents->Fill(triggerEntries);
848 if(fNevents==10) fTindex=fTindex+1;
851 if(fTindex==10&&fNevents==10) fCountAgain=0;
853 // Copy the triggers from the current event into the buffer.
854 //again, only if the trigger exists:
857 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
858 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
859 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
860 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
861 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
862 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
863 fTrigBuffer[fTrigBufferIndex][5] = centValue;
865 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
874 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
876 //tracks up to R=0.8 distant from the jet axis
877 // if(fAngStructCloseTracks==1){
878 // TList CloseTrackList;
879 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
880 // Double_t difR=0.04;
881 // for(Int_t l=0;l<15;l++){
882 // Double_t rr=l*0.1+0.1;
883 // for(int it = 0;it<nn;++it){
884 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
885 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
886 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
887 // Double_t ptm=part1->Pt();
888 // Double_t ptn=part2->Pt();
889 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
890 // Rnm=TMath::Sqrt(Rnm);
891 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
892 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
893 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
894 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
895 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
896 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
897 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
898 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
899 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
900 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
903 // //only jet constituents
904 // if(fAngStructCloseTracks==2){
906 // Double_t difR=0.04;
907 // for(Int_t l=0;l<15;l++){
908 // Double_t rr=l*0.1+0.1;
911 // AliAODTrack* part1;
912 // AliAODTrack* part2;
914 // TRefArray *genTrackListb = jetbig->GetRefTracks();
915 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
919 // for(Int_t it=0; it<nTracksGenJetb; ++it){
920 // part1 = (AliAODTrack*)(genTrackListb->At(it));
921 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
922 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
923 // Double_t ptm=part1->Pt();
924 // Double_t ptn=part2->Pt();
925 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
926 // Rnm=TMath::Sqrt(Rnm);
927 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
928 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
929 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
930 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
931 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
932 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
933 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
934 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
935 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
936 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
938 // //end loop over R=0.4 jets
939 // if(fAngStructCloseTracks>0){
940 // for(Int_t l=0;l<15;l++){
941 // Double_t rr=l*0.1+0.1;
943 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
944 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
945 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
946 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
948 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
949 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
950 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
951 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
953 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
954 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
955 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
956 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
958 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
959 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
960 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
961 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
969 PostData(1, fOutputList);
972 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
974 // Draw result to the screen
975 // Called once at the end of the query
977 if (!GetOutputData(1))
986 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
989 AliAODEvent *aod = 0;
991 if(!fESD)aod = fAODIn;
998 for(int it = 0;it < aod->GetNumberOfTracks();++it){
999 AliAODTrack *tr = aod->GetTrack(it);
1000 Bool_t bGood = false;
1001 if(fFilterType == 0)bGood = true;
1002 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
1003 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
1004 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1005 if(bGood==false) continue;
1006 if(TMath::Abs(tr->Eta())>0.9)continue;
1007 if(tr->Pt()<0.15)continue;
1010 if(fFilterMaskBestPt>0){// only set the trigger track index for good quality tracks
1011 if(tr->TestFilterBit(fFilterMaskBestPt)){
1027 // else if (type == kTrackAODMCCharged) {
1028 // TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1029 // if(!tca)return iCount;
1030 // for(int it = 0;it < tca->GetEntriesFast();++it){
1031 // AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1032 // if(!part)continue;
1033 // if(part->Pt()<0.15)continue;
1034 // if(!part->IsPhysicalPrimary())continue;
1035 // if(part->Charge()==0)continue;
1036 // if(TMath::Abs(part->Eta())>0.9)continue;
1039 // if(part->Pt()>ptmax){ ptmax=part->Pt();
1040 // index=iCount-1;}}}
1045 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
1047 AliAODEvent *aod = 0;
1048 if(!fESD)aod = fAODIn;
1055 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1056 AliAODTrack *tr = aod->GetTrack(it);
1057 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1058 if(TMath::Abs(tr->Eta())>0.9)continue;
1059 if(tr->Pt()<0.15)continue;
1061 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1062 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1063 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1079 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1082 AliAODEvent *aod = 0;
1083 if(!fESD)aod = fAODIn;
1086 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1087 AliAODTrack *tr = aod->GetTrack(it);
1088 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1089 if(TMath::Abs(tr->Eta())>0.9)continue;
1090 if(tr->Pt()<0.15)continue;
1091 Double_t disR=jetbig->DeltaR(tr);
1092 if(disR>0.8) continue;
1094 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1113 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1116 Int_t nInputTracks = 0;
1117 AliAODEvent *aod = 0;
1118 if(!fESD)aod = fAODIn;
1120 TString jbname(fJetBranchName[1]);
1121 //needs complete event, use jets without background subtraction
1122 for(Int_t i=1; i<=3; ++i){
1123 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1125 // use only HI event
1126 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1127 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1129 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1130 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1132 Printf("Jet branch %s not found", jbname.Data());
1133 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1137 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1138 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1140 TRefArray *trackList = jet->GetRefTracks();
1141 Int_t nTracks = trackList->GetEntriesFast();
1142 nInputTracks += nTracks;
1143 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1145 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1147 return nInputTracks;
1152 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1154 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1155 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1156 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1157 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1158 double dphi = mphi-vphi;
1159 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1160 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1161 return dphi;//dphi in [-Pi, Pi]
1164 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1167 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1168 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1169 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1170 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1177 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1179 // generate new THnSparseF, axes are defined in GetDimParams()
1182 UInt_t tmp = entries;
1185 tmp = tmp &~ -tmp; // clear lowest bit
1188 TString hnTitle(name);
1189 const Int_t dim = count;
1196 while(c<dim && i<32){
1200 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1201 hnTitle += Form(";%s",label.Data());
1209 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1212 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1214 // stores label and binning of axis for THnSparse
1216 const Double_t pi = TMath::Pi();
1221 label = "V0 centrality (%)";
1230 label = "corrected jet pt";
1273 label = "leading track";
1281 label = "trigger track";