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"
56 ClassImp(AliAnalysisTaskJetCore)
58 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore() :
64 fBackgroundBranch(""),
67 fOfflineTrgMask(AliVEvent::kAny),
81 fAngStructCloseTracks(0),
89 fTrackTypeRec(kTrackUndef),
99 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
100 fJetPtFractionMin(0.5),
108 fHistEvtSelection(0x0),
111 fh2JetCoreMethod1C10(0x0),
112 fh2JetCoreMethod2C10(0x0),
113 fh2JetCoreMethod1C20(0x0),
114 fh2JetCoreMethod2C20(0x0),
115 fh2JetCoreMethod1C30(0x0),
116 fh2JetCoreMethod2C30(0x0),
117 fh2JetCoreMethod1C60(0x0),
118 fh2JetCoreMethod2C60(0x0),
119 fh3JetTrackC3060(0x0),
121 fh2AngStructpt1C10(0x0),
122 fh2AngStructpt2C10(0x0),
123 fh2AngStructpt3C10(0x0),
124 fh2AngStructpt4C10(0x0),
125 fh2AngStructpt1C20(0x0),
126 fh2AngStructpt2C20(0x0),
127 fh2AngStructpt3C20(0x0),
128 fh2AngStructpt4C20(0x0),
129 fh2AngStructpt1C30(0x0),
130 fh2AngStructpt2C30(0x0),
131 fh2AngStructpt3C30(0x0),
132 fh2AngStructpt4C30(0x0),
133 fh2AngStructpt1C60(0x0),
134 fh2AngStructpt2C60(0x0),
135 fh2AngStructpt3C60(0x0),
136 fh2AngStructpt4C60(0x0),
140 fh3JetDensityA4(0x0),
143 fh3spectriggeredC20RP(0x0),
144 fh3spectriggeredC20(0x0),
145 fh3spectriggeredC3060(0x0)
149 // default Constructor
153 for(Int_t i=0; i<10; i++) {
154 for(Int_t j=0; j<6; j++) {
163 fJetBranchName[0] = "";
164 fJetBranchName[1] = "";
166 fListJets[0] = new TList;
167 fListJets[1] = new TList;
170 AliAnalysisTaskJetCore::AliAnalysisTaskJetCore(const char *name) :
171 AliAnalysisTaskSE(name),
176 fBackgroundBranch(""),
179 fOfflineTrgMask(AliVEvent::kAny),
192 fNInputTracksMax(-1),
193 fAngStructCloseTracks(0),
201 fTrackTypeRec(kTrackUndef),
211 fJetTriggerExcludeMask(AliAODJet::kHighTrackPtTriggered),
212 fJetPtFractionMin(0.5),
220 fHistEvtSelection(0x0),
223 fh2JetCoreMethod1C10(0x0),
224 fh2JetCoreMethod2C10(0x0),
225 fh2JetCoreMethod1C20(0x0),
226 fh2JetCoreMethod2C20(0x0),
227 fh2JetCoreMethod1C30(0x0),
228 fh2JetCoreMethod2C30(0x0),
229 fh2JetCoreMethod1C60(0x0),
230 fh2JetCoreMethod2C60(0x0),
231 fh3JetTrackC3060(0x0),
233 fh2AngStructpt1C10(0x0),
234 fh2AngStructpt2C10(0x0),
235 fh2AngStructpt3C10(0x0),
236 fh2AngStructpt4C10(0x0),
237 fh2AngStructpt1C20(0x0),
238 fh2AngStructpt2C20(0x0),
239 fh2AngStructpt3C20(0x0),
240 fh2AngStructpt4C20(0x0),
241 fh2AngStructpt1C30(0x0),
242 fh2AngStructpt2C30(0x0),
243 fh2AngStructpt3C30(0x0),
244 fh2AngStructpt4C30(0x0),
245 fh2AngStructpt1C60(0x0),
246 fh2AngStructpt2C60(0x0),
247 fh2AngStructpt3C60(0x0),
248 fh2AngStructpt4C60(0x0),
252 fh3JetDensityA4(0x0),
255 fh3spectriggeredC20RP(0x0),
256 fh3spectriggeredC20(0x0),
257 fh3spectriggeredC3060(0x0)
263 for(Int_t i=0; i<10; i++) {
264 for(Int_t j=0; j<6; j++) {
271 fJetBranchName[0] = "";
272 fJetBranchName[1] = "";
274 fListJets[0] = new TList;
275 fListJets[1] = new TList;
277 DefineOutput(1, TList::Class());
280 AliAnalysisTaskJetCore::~AliAnalysisTaskJetCore()
286 void AliAnalysisTaskJetCore::SetBranchNames(const TString &branch1, const TString &branch2)
288 fJetBranchName[0] = branch1;
289 fJetBranchName[1] = branch2;
292 void AliAnalysisTaskJetCore::Init()
295 // check for jet branches
296 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
297 AliError("Jet branch name not set.");
302 void AliAnalysisTaskJetCore::UserCreateOutputObjects()
307 if(!fOutputList) fOutputList = new TList;
308 fOutputList->SetOwner(kTRUE);
310 Bool_t oldStatus = TH1::AddDirectoryStatus();
311 TH1::AddDirectory(kFALSE);
314 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
315 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
316 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
317 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
318 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
319 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
320 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
322 UInt_t entries = 0; // bit coded, see GetDimParams() below
323 entries = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 |1<<7;
324 fhnDeltaR = NewTHnSparseF("fhnDeltaR", entries);
326 //change binning in pTtrack
327 Double_t *xPt3 = new Double_t[10];
329 for(int i = 1; i<=9;i++){
330 if(xPt3[i-1]<2)xPt3[i] = xPt3[i-1] + 0.4; // 1 - 5
331 else if(xPt3[i-1]<11)xPt3[i] = xPt3[i-1] + 3; // 5 - 12
332 else xPt3[i] = xPt3[i-1] + 150.; // 18
334 fhnDeltaR->SetBinEdges(2,xPt3);
337 //change binning in HTI
338 Double_t *xPt4 = new Double_t[14];
340 for(int i = 1; i<=13;i++){
341 if(xPt4[i-1]<10)xPt4[i] = xPt4[i-1] + 1; // 1 - 10
342 else if(xPt4[i-1]<20)xPt4[i] = xPt4[i-1] + 5; // 10 - 12
343 else xPt4[i] = xPt4[i-1] + 30.; // 13
345 fhnDeltaR->SetBinEdges(6,xPt4);
355 UInt_t cifras = 0; // bit coded, see GetDimParams() below
356 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
357 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);}
360 fh2JetCoreMethod1C10 = new TH2F("JetCoreMethod1C10","",150, 0., 150.,100, 0., 1.5);
361 fh2JetCoreMethod2C10 = new TH2F("JetCoreMethod2C10","",150, 0., 150.,100, 0., 1.5);
362 fh2JetCoreMethod1C20 = new TH2F("JetCoreMethod1C20","",150, 0., 150.,100, 0., 1.5);
363 fh2JetCoreMethod2C20 = new TH2F("JetCoreMethod2C20","",150, 0., 150.,100, 0., 1.5);
364 fh2JetCoreMethod1C30 = new TH2F("JetCoreMethod1C30","",150, 0., 150.,100, 0., 1.5);
365 fh2JetCoreMethod2C30 = new TH2F("JetCoreMethod2C30","",150, 0., 150.,100, 0., 1.5);
366 fh2JetCoreMethod1C60 = new TH2F("JetCoreMethod1C60","",150, 0., 150.,100, 0., 1.5);
367 fh2JetCoreMethod2C60 = new TH2F("JetCoreMethod2C60","",150, 0., 150.,100, 0., 1.5);}
369 fh3JetTrackC3060=new TH3F("JetTrackC3060","",50,0,50,150,0.,150.,35,0.,3.5);
370 fh3JetTrackC20=new TH3F("JetTrackC20","",50,0,50,150,0.,150.,35,0.,3.5);
371 if(fAngStructCloseTracks>0){
372 fh2AngStructpt1C10 = new TH2F("Ang struct pt1 C10","",15,0.,1.5,150,0.,10.);
373 fh2AngStructpt2C10 = new TH2F("Ang struct pt2 C10","",15,0.,1.5,150,0.,10.);
374 fh2AngStructpt3C10 = new TH2F("Ang struct pt3 C10","",15,0.,1.5,150,0.,10.);
375 fh2AngStructpt4C10 = new TH2F("Ang struct pt4 C10","",15,0.,1.5,150,0.,10.);
376 fh2AngStructpt1C20 = new TH2F("Ang struct pt1 C20","",15,0.,1.5,150,0.,10.);
377 fh2AngStructpt2C20 = new TH2F("Ang struct pt2 C20","",15,0.,1.5,150,0.,10.);
378 fh2AngStructpt3C20 = new TH2F("Ang struct pt3 C20","",15,0.,1.5,150,0.,10.);
379 fh2AngStructpt4C20 = new TH2F("Ang struct pt4 C20","",15,0.,1.5,150,0.,10.);
380 fh2AngStructpt1C30 = new TH2F("Ang struct pt1 C30","",15,0.,1.5,150,0.,10.);
381 fh2AngStructpt2C30 = new TH2F("Ang struct pt2 C30","",15,0.,1.5,150,0.,10.);
382 fh2AngStructpt3C30 = new TH2F("Ang struct pt3 C30","",15,0.,1.5,150,0.,10.);
383 fh2AngStructpt4C30 = new TH2F("Ang struct pt4 C30","",15,0.,1.5,150,0.,10.);
384 fh2AngStructpt1C60 = new TH2F("Ang struct pt1 C60","",15,0.,1.5,150,0.,10.);
385 fh2AngStructpt2C60 = new TH2F("Ang struct pt2 C60","",15,0.,1.5,150,0.,10.);
386 fh2AngStructpt3C60 = new TH2F("Ang struct pt3 C60","",15,0.,1.5,150,0.,10.);
387 fh2AngStructpt4C60 = new TH2F("Ang struct pt4 C60","",15,0.,1.5,150,0.,10.); }
391 fh2Ntriggers=new TH2F("# of triggers","",10,0.,100.,50,0.,50.);
392 fh2Ntriggers2=new TH2F("# of triggers2","",50,0.,50.,50,0.,50.);
394 fh3JetDensity=new TH3F("Jet density vs mutliplicity A>0.4","",100,0.,4000.,100,0.,5.,10,0.,50.);
395 fh3JetDensityA4=new TH3F("Jet density vs multiplicity A>0.4","",100,0.,4000.,100,0.,5.,10,0.,50.);
396 fh2RPJets=new TH2F("RPJet","",fNRPBins,0.,fNRPBins,150,0.,150.);
397 fh2RPT=new TH2F("RPTrigger","",fNRPBins,0.,fNRPBins,150,0.,150.);
398 fh3spectriggeredC20RP = new TH3F("Triggered spectrumC20RP","",3,0.,3.,140,-80.,200.,10,0.,50.);
399 fh3spectriggeredC20 = new TH3F("Triggered spectrumC20","",100,0.,1.,140,-80.,200.,10,0.,50.);
400 fh3spectriggeredC3060 = new TH3F("Triggered spectrumC3060","",100,0.,1.,140,-80.,200.,10,0.,50.);
404 fOutputList->Add(fHistEvtSelection);
406 fOutputList->Add(fhnDeltaR);
408 fOutputList->Add(fhnMixedEvents);
414 fOutputList->Add(fh2JetCoreMethod1C10);
415 fOutputList->Add(fh2JetCoreMethod2C10);
416 fOutputList->Add(fh2JetCoreMethod1C20);
417 fOutputList->Add(fh2JetCoreMethod2C20);
418 fOutputList->Add(fh2JetCoreMethod1C30);
419 fOutputList->Add(fh2JetCoreMethod2C30);
420 fOutputList->Add(fh2JetCoreMethod1C60);
421 fOutputList->Add(fh2JetCoreMethod2C60);}
423 fOutputList->Add(fh3JetTrackC3060);
424 fOutputList->Add(fh3JetTrackC20);
430 if(fAngStructCloseTracks>0){
431 fOutputList->Add(fh2AngStructpt1C10);
432 fOutputList->Add(fh2AngStructpt2C10);
433 fOutputList->Add(fh2AngStructpt3C10);
434 fOutputList->Add(fh2AngStructpt4C10);
435 fOutputList->Add(fh2AngStructpt1C20);
436 fOutputList->Add(fh2AngStructpt2C20);
437 fOutputList->Add(fh2AngStructpt3C20);
438 fOutputList->Add(fh2AngStructpt4C20);
439 fOutputList->Add(fh2AngStructpt1C30);
440 fOutputList->Add(fh2AngStructpt2C30);
441 fOutputList->Add(fh2AngStructpt3C30);
442 fOutputList->Add(fh2AngStructpt4C30);
443 fOutputList->Add(fh2AngStructpt1C60);
444 fOutputList->Add(fh2AngStructpt2C60);
445 fOutputList->Add(fh2AngStructpt3C60);
446 fOutputList->Add(fh2AngStructpt4C60);}
452 fOutputList->Add(fh2Ntriggers);
453 fOutputList->Add(fh2Ntriggers2);
454 fOutputList->Add(fh3JetDensity);
455 fOutputList->Add(fh3JetDensityA4);
456 fOutputList->Add(fh2RPJets);
457 fOutputList->Add(fh2RPT);
458 fOutputList->Add(fh3spectriggeredC20RP);
459 fOutputList->Add(fh3spectriggeredC20);
460 fOutputList->Add(fh3spectriggeredC3060);
463 // =========== Switch on Sumw2 for all histos ===========
464 for (Int_t i=0; i<fOutputList->GetEntries(); ++i) {
465 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
470 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
475 TH1::AddDirectory(oldStatus);
477 PostData(1, fOutputList);
480 void AliAnalysisTaskJetCore::UserExec(Option_t *)
484 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
485 AliError("Jet branch name not set.");
489 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
491 AliError("ESD not available");
492 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
494 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
496 static AliAODEvent* aod = 0;
497 // take all other information from the aod we take the tracks from
499 if(!fESD)aod = fAODIn;
504 if(fNonStdFile.Length()!=0){
505 // case that we have an AOD extension we need can fetch the jets from the extended output
506 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
507 fAODExtension = (aodH?aodH->GetExtension(fNonStdFile.Data()):0);
509 if(fDebug>1)Printf("AODExtension found for %s",fNonStdFile.Data());
513 // -- event selection --
514 fHistEvtSelection->Fill(1); // number of events before event selection
517 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
518 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
519 cout<<inputHandler->IsEventSelected()<<" "<<fOfflineTrgMask<<endl;
520 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
521 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
522 fHistEvtSelection->Fill(2);
523 PostData(1, fOutputList);
529 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
530 fHistEvtSelection->Fill(3);
531 PostData(1, fOutputList);
533 AliAODVertex* primVtx = aod->GetPrimaryVertex();
536 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
537 fHistEvtSelection->Fill(3);
538 PostData(1, fOutputList);
542 Int_t nTracksPrim = primVtx->GetNContributors();
543 if ((nTracksPrim < fMinContribVtx) ||
544 (primVtx->GetZ() < fVtxZMin) ||
545 (primVtx->GetZ() > fVtxZMax) ){
546 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
547 fHistEvtSelection->Fill(3);
548 PostData(1, fOutputList);
552 // event class selection (from jet helper task)
553 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
554 if(fDebug) Printf("Event class %d", eventClass);
555 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
556 fHistEvtSelection->Fill(4);
557 PostData(1, fOutputList);
561 // centrality selection
562 AliCentrality *cent = 0x0;
563 Double_t centValue = 0.;
565 if(fESD) {cent = fESD->GetCentrality();
566 if(cent) centValue = cent->GetCentralityPercentile("V0M");}
567 else centValue=aod->GetHeader()->GetCentrality();
569 if(fDebug) printf("centrality: %f\n", centValue);
570 if (centValue < fCentMin || centValue > fCentMax){
571 fHistEvtSelection->Fill(4);
572 PostData(1, fOutputList);
577 fHistEvtSelection->Fill(0);
579 // -- end event selection --
582 AliAODJetEventBackground* externalBackground = 0;
583 if(fAODOut&&!externalBackground&&fBackgroundBranch.Length()){
584 externalBackground = (AliAODJetEventBackground*)(fAODOut->FindListObject(fBackgroundBranch.Data()));
585 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
587 if(fAODExtension&&!externalBackground&&fBackgroundBranch.Length()){
588 externalBackground = (AliAODJetEventBackground*)(fAODExtension->GetAOD()->FindListObject(fBackgroundBranch.Data()));
589 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
592 if(fAODIn&&!externalBackground&&fBackgroundBranch.Length()){
593 externalBackground = (AliAODJetEventBackground*)(fAODIn->FindListObject(fBackgroundBranch.Data()));
594 if(!externalBackground)Printf("%s:%d Background branch not found %s",(char*)__FILE__,__LINE__,fBackgroundBranch.Data());;
600 if(externalBackground)rho = externalBackground->GetBackground(0);}
602 if(externalBackground)rho = externalBackground->GetBackground(2);}
605 TClonesArray *aodJets[2];
607 if(fAODOut&&!aodJets[0]){
608 aodJets[0] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[0].Data()));
609 aodJets[1] = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName[1].Data())); }
610 if(fAODExtension && !aodJets[0]){
611 aodJets[0] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[0].Data()));
612 aodJets[1] = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName[1].Data())); }
613 if(fAODIn&&!aodJets[0]){
614 aodJets[0] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[0].Data()));
615 aodJets[1] = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName[1].Data())); }
618 //Double_t ptsub[aodJets[0]->GetEntriesFast()];
619 //Int_t inord[aodJets[0]->GetEntriesFast()];
620 //for(Int_t n=0;n<aodJets[0]->GetEntriesFast();n++){
625 Int_t nT = GetListOfTracks(&ParticleList);
626 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
627 fListJets[iJetType]->Clear();
628 if (!aodJets[iJetType]) continue;
629 if(fDebug) Printf("%s: %d jets",fJetBranchName[iJetType].Data(),aodJets[iJetType]->GetEntriesFast());
630 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
631 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
632 if (jet) fListJets[iJetType]->Add(jet);
634 // ptsub[iJet]=jet->Pt()-rho*jet->EffectiveAreaCharged();}
643 Double_t areasmall=0;
644 Double_t phismall=0.;
650 Int_t trigBBTrack=-1;
651 Int_t trigInTrack=-1;
652 fRPAngle = aod->GetHeader()->GetEventplane();
653 AliVParticle *partback = (AliVParticle*)ParticleList.At(nT);
655 PostData(1, fOutputList);
658 fh2Ntriggers->Fill(centValue,partback->Pt());
659 Int_t phiBinT = GetPhiBin(RelativePhi(partback->Phi(),fRPAngle));
660 if(centValue<20.) fh2RPT->Fill(phiBinT,partback->Pt());
662 Double_t accep=2.*TMath::Pi()*1.8;
665 for(Int_t i=0; i<fListJets[0]->GetEntries(); ++i){
666 AliAODJet* jetbig = (AliAODJet*)(fListJets[0]->At(i));
667 etabig = jetbig->Eta();
668 phibig = jetbig->Phi();
669 ptbig = jetbig->Pt();
670 if(ptbig==0) continue;
671 Int_t phiBin = GetPhiBin(RelativePhi(phibig,fRPAngle));
672 areabig = jetbig->EffectiveAreaCharged();
673 Double_t ptcorr=ptbig-rho*areabig;
674 if((etabig<fJetEtaMin)||(etabig>fJetEtaMax)) continue;
675 if(areabig>=0.07) injet=injet+1;
676 if(areabig>=0.4) injet4=injet4+1;
677 Double_t dphi=RelativePhi(partback->Phi(),phibig);
680 Double_t etadif= partback->Eta()-etabig;
681 if(TMath::Abs(etadif)<=0.5){
683 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
684 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}}
686 if(centValue<20.) fh3JetTrackC20->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));
687 if(centValue>30. && centValue<60.) fh3JetTrackC3060->Fill(partback->Pt(),ptcorr,TMath::Abs(dphi));}
690 if(fFlagJetHadron==0){
691 if(fFlagPhiBkg!=0) if((TMath::Abs(dphi)<TMath::Pi()/2.-0.1)||(TMath::Abs(dphi)>TMath::Pi()/2.+0.1)) continue;
692 if(fFlagPhiBkg==0) if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;}
694 if(fFlagJetHadron!=0) if(TMath::Abs(dphi)>0.4) continue;
697 if(centValue<20.) fh2RPJets->Fill(phiBin, ptcorr);
699 Double_t dismin=100.;
703 if(centValue<20.) fh3spectriggeredC20RP->Fill(phiBin,ptcorr,partback->Pt());
704 if(centValue<20.) fh3spectriggeredC20->Fill(jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt());
705 if(centValue>30. && centValue<60.) fh3spectriggeredC3060->Fill(jetbig->EffectiveAreaCharged(),ptcorr,partback->Pt());
707 if(ptcorr<=0) continue;
710 AliAODTrack* leadtrack=0;
713 if(fFlagJetHadron==0){
714 TRefArray *genTrackList = jetbig->GetRefTracks();
715 Int_t nTracksGenJet = genTrackList->GetEntriesFast();
716 AliAODTrack* genTrack;
717 for(Int_t ir=0; ir<nTracksGenJet; ++ir){
718 genTrack = (AliAODTrack*)(genTrackList->At(ir));
719 if(genTrack->Pt()>ppt){ppt=genTrack->Pt();
721 leadtrack=(AliAODTrack*)(genTrackList->At(ippt));
722 if(!leadtrack) continue;}
724 AliVParticle* leadtrackb=0;
725 if(fFlagJetHadron!=0){
726 Int_t nTb = GetHardestTrackBackToJet(jetbig);
727 leadtrackb = (AliVParticle*)ParticleList.At(nTb);
728 if(!leadtrackb) continue;
735 //store one trigger info
744 for(Int_t j=0; j<fListJets[1]->GetEntries(); ++j){
745 AliAODJet* jetsmall = (AliAODJet*)(fListJets[1]->At(j));
746 etasmall = jetsmall->Eta();
747 phismall = jetsmall->Phi();
748 ptsmall = jetsmall->Pt();
749 areasmall = jetsmall->EffectiveAreaCharged();
750 Double_t tmpDeltaR=(phismall-phibig)*(phismall-phibig)+(etasmall-etabig)*(etasmall-etabig);
751 tmpDeltaR=TMath::Sqrt(tmpDeltaR);
752 //Fraction in the jet core
753 if((ptsmall>ptmax)&&(tmpDeltaR<=fRadioFrac)){ptmax=ptsmall;
755 if(tmpDeltaR<=dismin){ dismin=tmpDeltaR;
756 index1=j;}} //en of loop over R=0.2 jets
757 //method1:most concentric jet=core
758 if(dismin<fMinDist){ AliAODJet* jetmethod1 = (AliAODJet*)(fListJets[1]->At(index1));
759 if(centValue<10) fh2JetCoreMethod1C10->Fill(ptcorr,jetmethod1->Pt()/ptbig);
760 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod1C20->Fill(ptcorr,jetmethod1->Pt()/ptbig);
761 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod1C30->Fill(ptcorr,jetmethod1->Pt()/ptbig);
762 if(centValue>60) fh2JetCoreMethod1C60->Fill(ptcorr,jetmethod1->Pt()/ptbig); }
763 //method2:hardest contained jet=core
765 AliAODJet* jetmethod2 = (AliAODJet*)(fListJets[1]->At(index2));
766 if(centValue<10) fh2JetCoreMethod2C10->Fill(ptcorr,jetmethod2->Pt()/ptbig);
767 if((centValue>20)&&(centValue<40)) fh2JetCoreMethod2C20->Fill(ptcorr,jetmethod2->Pt()/ptbig);
768 if((centValue>30)&&(centValue<60)) fh2JetCoreMethod2C30->Fill(ptcorr,jetmethod2->Pt()/ptbig);
769 if(centValue>60) fh2JetCoreMethod2C60->Fill(ptcorr,jetmethod2->Pt()/ptbig); }}
773 for(int it = 0;it<ParticleList.GetEntries();++it){
774 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
775 Double_t deltaR = jetbig->DeltaR(part);
776 Double_t deltaEta = etabig-part->Eta();
777 if(centValue<20.) fh2Ntriggers2->Fill(partback->Pt(),part->Pt());
778 if(fDoEventMixing==0 && fFlagOnlyRecoil==0){
779 Double_t deltaPhi=phibig-part->Phi();
780 if(deltaPhi<-0.5*TMath::Pi()) deltaPhi+=2.*TMath::Pi();
781 if(deltaPhi>3./2.*TMath::Pi()) deltaPhi-=2.*TMath::Pi();
783 if(fFlagJetHadron==0) pTcont=leadtrack->Pt();
784 if(fFlagJetHadron!=0) pTcont=leadtrackb->Pt();
785 Double_t jetEntries[8] = {centValue,ptcorr,part->Pt(),deltaR,deltaEta,deltaPhi,pTcont,partback->Pt()};
786 fhnDeltaR->Fill(jetEntries);}
792 //end of track loop, we only do it if EM is switched off
803 if(injet>0) fh3JetDensity->Fill(ParticleList.GetEntries(),injet/accep,partback->Pt());
804 if(injet4>0)fh3JetDensityA4->Fill(ParticleList.GetEntries(),injet4/accep,partback->Pt());
810 if(fDoEventMixing>0){
811 //check before if the trigger exists
812 // fTrigBuffer[i][0] = zvtx
813 // fTrigBuffer[i][1] = phi
814 // fTrigBuffer[i][2] = eta
815 // fTrigBuffer[i][3] = pt_jet
816 // fTrigBuffer[i][4] = pt_trig
817 // fTrigBuffer[i][5]= centrality
818 if(fTindex==10) fTindex=0;
819 if(fTrigBuffer[fTindex][3]>0){
820 if (TMath::Abs(fTrigBuffer[fTindex][0]-primVtx->GetZ()<2.)){
821 if (TMath::Abs(fTrigBuffer[fTindex][5]-centValue<5)){
823 for(int it = 0;it<nT;++it){
824 AliVParticle *part = (AliVParticle*)ParticleList.At(it);
825 Double_t DPhi = fTrigBuffer[fTindex][1] - part->Phi();
826 Double_t DEta = fTrigBuffer[fTindex][2] - part->Eta();
827 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
828 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
829 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
830 Double_t triggerEntries[7] = {centValue,fTrigBuffer[fTindex][3],part->Pt(),DR,DEta,DPhi,fTrigBuffer[fTindex][4]};
831 fhnMixedEvents->Fill(triggerEntries);
834 if(fNevents==10) fTindex=fTindex+1;
837 if(fTindex==10&&fNevents==10) fCountAgain=0;
839 // Copy the triggers from the current event into the buffer.
840 //again, only if the trigger exists:
843 AliAODJet* jetT = (AliAODJet*)(fListJets[0]->At(trigJet)); AliVParticle *partT = (AliVParticle*)ParticleList.At(trigBBTrack);
844 fTrigBuffer[fTrigBufferIndex][0] = primVtx->GetZ();
845 fTrigBuffer[fTrigBufferIndex][1] = jetT->Phi();
846 fTrigBuffer[fTrigBufferIndex][2] = jetT->Eta();
847 fTrigBuffer[fTrigBufferIndex][3] = jetT->Pt()-rho*jetT->EffectiveAreaCharged();
848 fTrigBuffer[fTrigBufferIndex][4] = partT->Pt();
849 fTrigBuffer[fTrigBufferIndex][5] = centValue;
851 if(fTrigBufferIndex==9) {fTrigBufferIndex=0;
860 //////////////////ANGULAR STRUCTURE//////////////////////////////////////
862 //tracks up to R=0.8 distant from the jet axis
863 // if(fAngStructCloseTracks==1){
864 // TList CloseTrackList;
865 // Int_t nn=GetListOfTracksCloseToJet(&CloseTrackList,jetbig);
866 // Double_t difR=0.04;
867 // for(Int_t l=0;l<15;l++){
868 // Double_t rr=l*0.1+0.1;
869 // for(int it = 0;it<nn;++it){
870 // AliVParticle *part1 = (AliVParticle*)CloseTrackList.At(it);
871 // for(int itu=it+1;itu<CloseTrackList.GetEntries();itu++){
872 // AliVParticle *part2 = (AliVParticle*)CloseTrackList.At(itu);
873 // Double_t ptm=part1->Pt();
874 // Double_t ptn=part2->Pt();
875 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
876 // Rnm=TMath::Sqrt(Rnm);
877 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
878 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
879 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
880 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
881 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
882 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
883 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
884 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
885 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
886 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}
889 // //only jet constituents
890 // if(fAngStructCloseTracks==2){
892 // Double_t difR=0.04;
893 // for(Int_t l=0;l<15;l++){
894 // Double_t rr=l*0.1+0.1;
897 // AliAODTrack* part1;
898 // AliAODTrack* part2;
900 // TRefArray *genTrackListb = jetbig->GetRefTracks();
901 // Int_t nTracksGenJetb = genTrackListb->GetEntriesFast();
905 // for(Int_t it=0; it<nTracksGenJetb; ++it){
906 // part1 = (AliAODTrack*)(genTrackListb->At(it));
907 // for(Int_t itu=0; itu<nTracksGenJetb; ++itu){
908 // part2 = (AliAODTrack*)(genTrackListb->At(itu));
909 // Double_t ptm=part1->Pt();
910 // Double_t ptn=part2->Pt();
911 // Double_t Rnm = (part1->Eta()-part2->Eta())*(part1->Eta()-part2->Eta())+(part1->Phi()-part2->Phi())*(part1->Phi()-part2->Phi());
912 // Rnm=TMath::Sqrt(Rnm);
913 // Double_t deltag=(1./(TMath::Sqrt(2*TMath::Pi())*difR))*TMath::Exp(-1.*(rr-Rnm)*(rr-Rnm)/(2.*difR*difR));
914 // Double_t stepf=0.5*(1.+TMath::Erf((rr-Rnm)/(TMath::Sqrt(2.)*difR)));
915 // if((ptcorr<85.) && (ptcorr>=70.)){up1[l]=up1[l]+ptm*ptn*Rnm*Rnm*deltag;
916 // down1[l]=down1[l]+ptm*ptn*Rnm*Rnm*stepf;}
917 // if((ptcorr<100.) && (ptcorr>=85.)){up2[l]=up2[l]+ptm*ptn*Rnm*Rnm*deltag;
918 // down2[l]=down2[l]+ptm*ptn*Rnm*Rnm*stepf;}
919 // if((ptcorr<120.) && (ptcorr>=100.)){up3[l]=up3[l]+ptm*ptn*Rnm*Rnm*deltag;
920 // down3[l]=down3[l]+ptm*ptn*Rnm*Rnm*stepf;}
921 // if((ptcorr<140.) && (ptcorr>=120.)){up4[l]=up4[l]+ptm*ptn*Rnm*Rnm*deltag;
922 // down4[l]=down4[l]+ptm*ptn*Rnm*Rnm*stepf;}}}}}
924 // //end loop over R=0.4 jets
925 // if(fAngStructCloseTracks>0){
926 // for(Int_t l=0;l<15;l++){
927 // Double_t rr=l*0.1+0.1;
929 // if(centValue<10.)fh2AngStructpt1C10->Fill(rr,rr*up1[l]/down1[l]);
930 // if(centValue>20. && centValue<40.) fh2AngStructpt1C20->Fill(rr,rr*up1[l]/down1[l]);
931 // if(centValue>30. && centValue<60.) fh2AngStructpt1C30->Fill(rr,rr*up1[l]/down1[l]);
932 // if(centValue>60.) fh2AngStructpt1C60->Fill(rr,rr*up1[l]/down1[l]);}
934 // if(centValue<10.) fh2AngStructpt2C10->Fill(rr,rr*up2[l]/down2[l]);
935 // if(centValue>20. && centValue<40.) fh2AngStructpt2C20->Fill(rr,rr*up2[l]/down2[l]);
936 // if(centValue>30. && centValue<60.) fh2AngStructpt2C30->Fill(rr,rr*up2[l]/down2[l]);
937 // if(centValue>60.) fh2AngStructpt2C60->Fill(rr,rr*up2[l]/down2[l]);}
939 // if(centValue<10.) fh2AngStructpt3C10->Fill(rr,rr*up3[l]/down3[l]);
940 // if(centValue>20. && centValue<40.) fh2AngStructpt3C20->Fill(rr,rr*up3[l]/down3[l]);
941 // if(centValue>30. && centValue<60.) fh2AngStructpt3C30->Fill(rr,rr*up3[l]/down3[l]);
942 // if(centValue>60.) fh2AngStructpt3C60->Fill(rr,rr*up3[l]/down3[l]);}
944 // if(centValue<10.) fh2AngStructpt4C10->Fill(rr,rr*up4[l]/down4[l]);
945 // if(centValue>20. && centValue<40.) fh2AngStructpt4C20->Fill(rr,rr*up4[l]/down4[l]);
946 // if(centValue>30. && centValue<60.) fh2AngStructpt4C30->Fill(rr,rr*up4[l]/down4[l]);
947 // if(centValue>60.) fh2AngStructpt4C60->Fill(rr,rr*up4[l]/down4[l]);}}}
955 PostData(1, fOutputList);
958 void AliAnalysisTaskJetCore::Terminate(const Option_t *)
960 // Draw result to the screen
961 // Called once at the end of the query
963 if (!GetOutputData(1))
972 Int_t AliAnalysisTaskJetCore::GetListOfTracks(TList *list){
975 AliAODEvent *aod = 0;
977 if(!fESD)aod = fAODIn;
984 for(int it = 0;it < aod->GetNumberOfTracks();++it){
985 AliAODTrack *tr = aod->GetTrack(it);
986 Bool_t bGood = false;
987 if(fFilterType == 0)bGood = true;
988 else if(fFilterType == 1)bGood = tr->IsHybridTPCConstrainedGlobal();
989 else if(fFilterType == 2)bGood = tr->IsHybridGlobalConstrainedGlobal();
990 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
991 if(bGood==false) continue;
992 if(TMath::Abs(tr->Eta())>0.9)continue;
993 if(tr->Pt()<0.15)continue;
996 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1002 // else if (type == kTrackAODMCCharged) {
1003 // TClonesArray *tca = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
1004 // if(!tca)return iCount;
1005 // for(int it = 0;it < tca->GetEntriesFast();++it){
1006 // AliAODMCParticle *part = dynamic_cast<AliAODMCParticle*>(tca->At(it));
1007 // if(!part)continue;
1008 // if(part->Pt()<0.15)continue;
1009 // if(!part->IsPhysicalPrimary())continue;
1010 // if(part->Charge()==0)continue;
1011 // if(TMath::Abs(part->Eta())>0.9)continue;
1014 // if(part->Pt()>ptmax){ ptmax=part->Pt();
1015 // index=iCount-1;}}}
1020 Int_t AliAnalysisTaskJetCore::GetHardestTrackBackToJet(AliAODJet *jetbig){
1022 AliAODEvent *aod = 0;
1023 if(!fESD)aod = fAODIn;
1030 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1031 AliAODTrack *tr = aod->GetTrack(it);
1032 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1033 if(TMath::Abs(tr->Eta())>0.9)continue;
1034 if(tr->Pt()<0.15)continue;
1036 dphi=RelativePhi(tr->Phi(),jetbig->Phi());
1037 if(TMath::Abs(dphi)<TMath::Pi()-0.6) continue;
1038 if(tr->Pt()>ptmax){ ptmax=tr->Pt();
1054 Int_t AliAnalysisTaskJetCore::GetListOfTracksCloseToJet(TList *list,AliAODJet *jetbig){
1057 AliAODEvent *aod = 0;
1058 if(!fESD)aod = fAODIn;
1061 for(int it = 0;it < aod->GetNumberOfTracks();++it){
1062 AliAODTrack *tr = aod->GetTrack(it);
1063 if((fFilterMask>0)&&!(tr->TestFilterBit(fFilterMask)))continue;
1064 if(TMath::Abs(tr->Eta())>0.9)continue;
1065 if(tr->Pt()<0.15)continue;
1066 Double_t disR=jetbig->DeltaR(tr);
1067 if(disR>0.8) continue;
1069 //cout<<fAOD->GetNumberOfTracks()<<" "<<tr->Pt()<<endl;
1088 Int_t AliAnalysisTaskJetCore::GetNInputTracks()
1091 Int_t nInputTracks = 0;
1092 AliAODEvent *aod = 0;
1093 if(!fESD)aod = fAODIn;
1095 TString jbname(fJetBranchName[1]);
1096 //needs complete event, use jets without background subtraction
1097 for(Int_t i=1; i<=3; ++i){
1098 if(jbname.Contains(Form("B%d",i))) jbname.ReplaceAll(Form("B%d",i),"B0");
1100 // use only HI event
1101 if(jbname.Contains("AODextraonly")) jbname.ReplaceAll("AODextraonly","AOD");
1102 if(jbname.Contains("AODextra")) jbname.ReplaceAll("AODextra","AOD");
1104 if(fDebug) Printf("Multiplicity from jet branch %s", jbname.Data());
1105 TClonesArray *tmpAODjets = dynamic_cast<TClonesArray*>(aod->FindListObject(jbname.Data()));
1107 Printf("Jet branch %s not found", jbname.Data());
1108 Printf("AliAnalysisTaskJetCore::GetNInputTracks FAILED");
1112 for (Int_t iJet=0; iJet<tmpAODjets->GetEntriesFast(); iJet++){
1113 AliAODJet *jet = dynamic_cast<AliAODJet*>((*tmpAODjets)[iJet]);
1115 TRefArray *trackList = jet->GetRefTracks();
1116 Int_t nTracks = trackList->GetEntriesFast();
1117 nInputTracks += nTracks;
1118 if(fDebug) Printf("#jet%d: %d tracks", iJet, nTracks);
1120 if(fDebug) Printf("---> input tracks: %d", nInputTracks);
1122 return nInputTracks;
1127 Double_t AliAnalysisTaskJetCore::RelativePhi(Double_t mphi,Double_t vphi){
1129 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1130 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1131 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1132 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1133 double dphi = mphi-vphi;
1134 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1135 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1136 return dphi;//dphi in [-Pi, Pi]
1139 Int_t AliAnalysisTaskJetCore::GetPhiBin(Double_t phi)
1142 if(!(TMath::Abs(phi)<=2*TMath::Pi())){AliError("phi w.r.t. RP out of defined range");return -1;}
1143 Double_t phiwrtrp=TMath::ACos(TMath::Abs(TMath::Cos(phi)));
1144 phibin=Int_t(fNRPBins*phiwrtrp/(0.5*TMath::Pi()));
1145 if(phibin<0||phibin>=fNRPBins){AliError("Phi Bin not defined");}
1152 THnSparse* AliAnalysisTaskJetCore::NewTHnSparseF(const char* name, UInt_t entries)
1154 // generate new THnSparseF, axes are defined in GetDimParams()
1157 UInt_t tmp = entries;
1160 tmp = tmp &~ -tmp; // clear lowest bit
1163 TString hnTitle(name);
1164 const Int_t dim = count;
1171 while(c<dim && i<32){
1175 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1176 hnTitle += Form(";%s",label.Data());
1184 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1187 void AliAnalysisTaskJetCore::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1189 // stores label and binning of axis for THnSparse
1191 const Double_t pi = TMath::Pi();
1196 label = "V0 centrality (%)";
1205 label = "corrected jet pt";
1248 label = "leading track";
1256 label = "trigger track";