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 **************************************************************************/
34 #include "THnSparse.h"
39 #include "AliAnalysisTask.h"
40 #include "AliAnalysisManager.h"
42 #include "AliVEvent.h"
43 #include "AliESDEvent.h"
44 #include "AliESDInputHandler.h"
45 #include "AliCentrality.h"
46 #include "AliAnalysisHelperJetTasks.h"
47 #include "AliInputEventHandler.h"
48 #include "AliAODJetEventBackground.h"
49 #include "AliAODMCParticle.h"
50 //#include "AliAnalysisTaskFastEmbedding.h"
51 #include "AliAODEvent.h"
52 #include "AliAODHandler.h"
53 #include "AliAODJet.h"
55 #include "AliAnalysisTaskJetCorePP.h"
60 ClassImp(AliAnalysisTaskJetCorePP)
62 //Filip Krizek 1st March 2013
64 //---------------------------------------------------------------------
65 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP() :
74 fSystem(0), //pp=0 pPb=1
76 fOfflineTrgMask(AliVEvent::kAny),
89 fHistEvtSelection(0x0),
101 fhContribVtxAccept(0x0),
102 fhDphiTriggerJet(0x0),
103 fhDphiTriggerJetAccept(0x0),
105 fhCentralityAccept(0x0),
106 fkAcceptance(2.0*TMath::Pi()*1.8)
108 // default Constructor
109 fListJets = new TList();
112 //---------------------------------------------------------------------
114 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const char *name) :
115 AliAnalysisTaskSE(name),
123 fSystem(0), //pp=0 pPb=1
125 fOfflineTrgMask(AliVEvent::kAny),
136 fTrackLowPtCut(0.15),
138 fHistEvtSelection(0x0),
148 fhVertexZAccept(0x0),
150 fhContribVtxAccept(0x0),
151 fhDphiTriggerJet(0x0),
152 fhDphiTriggerJetAccept(0x0),
154 fhCentralityAccept(0x0),
155 fkAcceptance(2.0*TMath::Pi()*1.8)
158 fListJets = new TList();
160 DefineOutput(1, TList::Class());
163 //--------------------------------------------------------------
164 AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const AliAnalysisTaskJetCorePP& a):
165 AliAnalysisTaskSE(a.GetName()),
169 fAODExtension(a.fAODExtension),
170 fJetBranchName(a.fJetBranchName),
171 fListJets(a.fListJets),
172 fNonStdFile(a.fNonStdFile),
174 fJetParamR(a.fJetParamR),
175 fOfflineTrgMask(a.fOfflineTrgMask),
176 fMinContribVtx(a.fMinContribVtx),
177 fVtxZMin(a.fVtxZMin),
178 fVtxZMax(a.fVtxZMax),
179 fFilterMask(a.fFilterMask),
180 fCentMin(a.fCentMin),
181 fCentMax(a.fCentMax),
182 fJetEtaMin(a.fJetEtaMin),
183 fJetEtaMax(a.fJetEtaMax),
184 fTriggerEtaCut(a.fTriggerEtaCut),
185 fTrackEtaCut(a.fTrackEtaCut),
186 fTrackLowPtCut(a.fTrackLowPtCut),
187 fOutputList(a.fOutputList),
188 fHistEvtSelection(a.fHistEvtSelection),
189 fh2Ntriggers(a.fh2Ntriggers),
190 fHJetSpec(a.fHJetSpec),
191 fHJetDensity(a.fHJetDensity),
192 fHJetDensityA4(a.fHJetDensityA4),
193 fhJetPhi(a.fhJetPhi),
194 fhTriggerPhi(a.fhTriggerPhi),
195 fhJetEta(a.fhJetEta),
196 fhTriggerEta(a.fhTriggerEta),
197 fhVertexZ(a.fhVertexZ),
198 fhVertexZAccept(a.fhVertexZAccept),
199 fhContribVtx(a.fhContribVtx),
200 fhContribVtxAccept(a.fhContribVtxAccept),
201 fhDphiTriggerJet(a.fhDphiTriggerJet),
202 fhDphiTriggerJetAccept(a.fhDphiTriggerJetAccept),
203 fhCentrality(a.fhCentrality),
204 fhCentralityAccept(a.fhCentralityAccept),
205 fkAcceptance(a.fkAcceptance)
209 //--------------------------------------------------------------
211 AliAnalysisTaskJetCorePP& AliAnalysisTaskJetCorePP::operator = (const AliAnalysisTaskJetCorePP& a){
212 // assignment operator
213 this->~AliAnalysisTaskJetCorePP();
214 new(this) AliAnalysisTaskJetCorePP(a);
217 //--------------------------------------------------------------
219 AliAnalysisTaskJetCorePP::~AliAnalysisTaskJetCorePP()
223 delete fOutputList; // ????
226 //--------------------------------------------------------------
228 void AliAnalysisTaskJetCorePP::Init()
230 // check for jet branches
231 if(!strlen(fJetBranchName.Data())){
232 AliError("Jet branch name not set.");
237 //--------------------------------------------------------------
239 void AliAnalysisTaskJetCorePP::UserCreateOutputObjects()
246 if(!fOutputList) fOutputList = new TList();
247 fOutputList->SetOwner(kTRUE);
249 Bool_t oldStatus = TH1::AddDirectoryStatus();
250 TH1::AddDirectory(kFALSE);
252 fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
253 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
254 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
255 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
256 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
257 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
258 fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
260 fOutputList->Add(fHistEvtSelection);
262 Int_t nBinsCentrality = (fSystem==0) ? 1 : 10; // pp=1 else 10
264 fh2Ntriggers = new TH2F("fh2Ntriggers","# of triggers",
265 nBinsCentrality,0.0,100.0,50,0.0,50.0);
267 //Centrality, A, pT - rho*A, pTtrigg, pT, rho*A
268 const Int_t dimSpec = 6;
269 const Int_t nBinsSpec[dimSpec] = {nBinsCentrality, 100, 140, 50, 100, 50};
270 const Double_t lowBinSpec[dimSpec] = {0.0, 0.0,-80.0, 0.0, 0.0, 0.0};
271 const Double_t hiBinSpec[dimSpec] = {100.0, 1.0,200.0,50.0, 200, 20.0};
272 fHJetSpec = new THnSparseF("fHJetSpec","Recoil jet spectrum [cent,A,pT-rho*A,pTtrig]",
273 dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
274 fOutputList->Add(fHJetSpec);
276 //------------------- HISTOS FOR DIAGNOSTIC ----------------------
277 //Jet number density histos [Trk Mult, jet density, pT trigger]
278 const Int_t dimJetDens = 3;
279 const Int_t nBinsJetDens[dimJetDens] = {100, 100, 10};
280 const Double_t lowBinJetDens[dimJetDens] = {0.0, 0.0, 0.0};
281 const Double_t hiBinJetDens[dimJetDens] = {500.0, 5.0, 50.0 };
283 fHJetDensity = new THnSparseF("fHJetDensity","Jet dens vs trk mult A>0.07",
284 dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
286 fHJetDensityA4 =new THnSparseF("fHJetDensityA4","Jet dens vs trk mult A>0.4",
287 dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
289 fOutputList->Add(fh2Ntriggers);
290 fOutputList->Add(fHJetDensity);
291 fOutputList->Add(fHJetDensityA4);
294 //inclusive azimuthal and pseudorapidity histograms
295 fhJetPhi = new TH1D("fhJetPhi","Azim dist jets",50,-TMath::Pi(),TMath::Pi());
296 fhTriggerPhi= new TH1D("fhTriggerPhi","azim dist trig had",50,-TMath::Pi(),TMath::Pi());
297 fhJetEta = new TH1D("fhJetEta","Eta dist jets",40,-0.9,0.9);
298 fhTriggerEta = new TH1D("fhTriggerEta","Eta dist trig had",40,-0.9,0.9);
299 fhVertexZ = new TH1D("fhVertexZ","z vertex",40,-20,20);
300 fhVertexZAccept = new TH1D("fhVertexZAccept","z vertex after cut",40,-20,20);
301 fhContribVtx = new TH1D("fhContribVtx","contrib to vtx",200,0,200);
302 fhContribVtxAccept = new TH1D("fhContribVtxAccept","contrib to vtx after cut",200,0,200);
303 fhDphiTriggerJet = new TH1D("fhDphiTriggerJet","Deltaphi trig-jet",50, -TMath::Pi(),TMath::Pi());
304 fhDphiTriggerJetAccept = new TH1D("fhDphiTriggerJetAccept","Deltaphi trig-jet after cut",50, -TMath::Pi(),TMath::Pi());
305 fhCentrality = new TH1D("fhCentrality","Centrality",20,0,100);
306 fhCentralityAccept = new TH1D("fhCentralityAccept","Centrality after cut",20,0,100);
308 fOutputList->Add(fhJetPhi);
309 fOutputList->Add(fhTriggerPhi);
310 fOutputList->Add(fhJetEta);
311 fOutputList->Add(fhTriggerEta);
312 fOutputList->Add(fhVertexZ);
313 fOutputList->Add(fhVertexZAccept);
314 fOutputList->Add(fhContribVtx);
315 fOutputList->Add(fhContribVtxAccept);
316 fOutputList->Add(fhDphiTriggerJet);
317 fOutputList->Add(fhDphiTriggerJetAccept);
318 fOutputList->Add(fhCentrality);
319 fOutputList->Add(fhCentralityAccept);
322 // =========== Switch on Sumw2 for all histos ===========
323 for(Int_t i=0; i<fOutputList->GetEntries(); i++){
324 TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
329 THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
334 TH1::AddDirectory(oldStatus);
336 PostData(1, fOutputList);
339 //--------------------------------------------------------------------
341 void AliAnalysisTaskJetCorePP::UserExec(Option_t *)
346 if(TMath::Abs((Float_t) fJetParamR)<0.00001){
347 AliError("Cone radius is set to zero.");
350 if(!strlen(fJetBranchName.Data())){
351 AliError("Jet branch name not set.");
355 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
357 AliError("ESD not available");
358 fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
361 fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
362 AliAODEvent* aod = NULL;
363 // take all other information from the aod we take the tracks from
365 if(!fESD) aod = fAODIn;
369 if(fNonStdFile.Length()!=0){
370 // case that we have an AOD extension we can fetch the jets from the extended output
371 AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
372 fAODExtension = aodH ? aodH->GetExtension(fNonStdFile.Data()) : 0;
374 if(fDebug>1) Printf("AODExtension found for %s",fNonStdFile.Data());
378 // ----------------- event selection --------------------------
379 fHistEvtSelection->Fill(1); // number of events before event selection
382 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
383 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
385 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
386 if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
387 fHistEvtSelection->Fill(2);
388 PostData(1, fOutputList);
394 if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
395 fHistEvtSelection->Fill(3);
396 PostData(1, fOutputList);
401 AliAODVertex* primVtx = aod->GetPrimaryVertex();
404 if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
405 fHistEvtSelection->Fill(3);
406 PostData(1, fOutputList);
410 Int_t nTracksPrim = primVtx->GetNContributors();
411 Float_t vtxz = primVtx->GetZ();
413 fhContribVtx->Fill(nTracksPrim);
414 if( nTracksPrim > 0 ) fhVertexZ->Fill(vtxz);
416 if((nTracksPrim < fMinContribVtx) ||
419 if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",
420 (char*)__FILE__,__LINE__,vtxz);
421 fHistEvtSelection->Fill(3);
422 PostData(1, fOutputList);
426 fhContribVtxAccept->Fill(nTracksPrim);
427 fhVertexZAccept->Fill(vtxz);
429 //FK// No event class selection imposed
430 // event class selection (from jet helper task)
431 //Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
432 //if(fDebug) Printf("Event class %d", eventClass);
433 //if(eventClass < fEvtClassMin || eventClass > fEvtClassMax){
434 // fHistEvtSelection->Fill(4);
435 // PostData(1, fOutputList);
439 // centrality selection
440 AliCentrality *cent = 0x0;
441 Double_t centValue = 0.0;
442 if(fSystem){ //fSystem=0 for pp, fSystem=1 for pPb
444 cent = fESD->GetCentrality();
445 if(cent) centValue = cent->GetCentralityPercentile("V0M");
447 centValue = aod->GetHeader()->GetCentrality();
449 if(fDebug) printf("centrality: %f\n", centValue);
451 fhCentrality->Fill(centValue);
453 if(centValue < fCentMin || centValue > fCentMax){
454 fHistEvtSelection->Fill(4);
455 PostData(1, fOutputList);
459 fhCentralityAccept->Fill( centValue );
463 if(fDebug) std::cout<<" ACCEPTED EVENT "<<endl;
465 fHistEvtSelection->Fill(0); // accepted events
467 // ------------------- end event selection --------------------
470 TClonesArray *aodJets = 0x0;
472 if(fAODOut && !aodJets){
473 aodJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName.Data()));
475 if(fAODExtension && !aodJets){
476 aodJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName.Data()));
478 if(fAODIn && !aodJets){
479 aodJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName.Data()));
482 // ------------- Hadron trigger --------------
483 TList particleList; //list of tracks
484 Int_t indexTrigg = GetListOfTracks(&particleList); //index of trigger hadron in Particle list
486 if(indexTrigg<0) return; // no trigger track found
488 AliVParticle *triggerHadron = (AliVParticle*) particleList.At(indexTrigg);
490 PostData(1, fOutputList);
495 fh2Ntriggers->Fill(centValue,triggerHadron->Pt()); //trigger pT
497 // if(triggerHadron->Pt() > 10.0){}
498 if(triggerHadron->Pt() > 3.0){
499 //Trigger Diagnostics---------------------------------
500 fhTriggerPhi->Fill(RelativePhi(triggerHadron->Phi(),0.0)); //phi -pi,pi
501 fhTriggerEta->Fill(triggerHadron->Eta());
504 //--------- Fill list of jets --------------
507 if(fDebug) Printf("########## %s: %d jets",fJetBranchName.Data(),
508 aodJets->GetEntriesFast());
509 for(Int_t iJet = 0; iJet < aodJets->GetEntriesFast(); iJet++) {
510 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets)[iJet]);
511 if (jet) fListJets->Add(jet);
515 Double_t etaJet = 0.0;
516 Double_t pTJet = 0.0;
517 Double_t areaJet = 0.0;
518 Double_t phiJet = 0.0;
521 //---------- jet loop ---------
522 for(Int_t ij=0; ij<fListJets->GetEntries(); ij++){
523 AliAODJet* jet = (AliAODJet*)(fListJets->At(ij));
528 if(pTJet==0) continue;
530 if((etaJet<fJetEtaMin) || (etaJet>fJetEtaMax)) continue;
531 areaJet = jet->EffectiveAreaCharged();
533 //Jet Diagnostics---------------------------------
534 fhJetPhi->Fill(RelativePhi(phiJet,0.0)); //phi -pi,pi
535 fhJetEta->Fill(etaJet);
536 if(areaJet >= 0.07) injet++;
537 if(areaJet >= 0.4) injet4++;
538 //--------------------------------------------------
540 Double_t dphi = RelativePhi(triggerHadron->Phi(), phiJet);
542 fhDphiTriggerJet->Fill(dphi); //Input
543 if(TMath::Abs((Double_t) dphi) < TMath::Pi()-0.6) continue;
544 fhDphiTriggerJetAccept->Fill(dphi); //Accepted
546 //Background w.r.t. jet axis
547 Double_t pTBckWrtJet =
548 GetBackgroundInPerpCone(fJetParamR, phiJet, etaJet, &particleList);
550 Double_t ratioOfAreas = areaJet/(TMath::Pi()*fJetParamR*fJetParamR);
551 Double_t rhoA = ratioOfAreas*pTBckWrtJet; //bg activity in a cone of similar size
552 Double_t ptcorr = pTJet - rhoA; //Pt Jet UE subtr
555 //Centrality, A, pT - rho*A, pTtrigg, pT, rho*A
556 Double_t fillspec[] = { centValue,
563 fHJetSpec->Fill(fillspec);
567 //Fill Jet Density In the Event A>0.07
569 Double_t filldens[]={ (Double_t) particleList.GetEntries(),
573 fHJetDensity->Fill(filldens);
576 //Fill Jet Density In the Event A>0.4
578 Double_t filldens4[]={ (Double_t) particleList.GetEntries(),
582 fHJetDensityA4->Fill(filldens4);
585 PostData(1, fOutputList);
588 //----------------------------------------------------------------------------
589 void AliAnalysisTaskJetCorePP::Terminate(const Option_t *)
591 // Draw result to the screen
592 // Called once at the end of the query
594 if(fDebug) printf("AliAnalysisTaskJetCorePP DONE\n");
595 if(!GetOutputData(1)) return;
599 //----------------------------------------------------------------------------
600 Int_t AliAnalysisTaskJetCorePP::GetListOfTracks(TList *list){
601 //Fill the list of accepted tracks (passed track cut)
602 //return consecutive index of the hardest ch hadron in the list
604 AliAODEvent *aodevt = NULL;
606 if(!fESD) aodevt = fAODIn;
607 else aodevt = fAODOut;
609 if(!aodevt) return -1;
611 Int_t index = -1; //index of the highest particle in the list
612 Double_t ptmax = -10;
614 for(int it = 0; it < aodevt->GetNumberOfTracks(); it++){
615 AliAODTrack *tr = aodevt->GetTrack(it);
617 //if((fFilterMask > 0) && !(tr->TestFilterBit(fFilterMask))) continue;
618 if((fFilterMask > 0) && !(tr->IsHybridGlobalConstrainedGlobal())) continue;
619 if(TMath::Abs((Float_t) tr->Eta()) > fTrackEtaCut) continue;
620 if(tr->Pt() < fTrackLowPtCut) continue;
629 if(index>-1){ //check pseudorapidity cut on trigger
630 AliAODTrack *trigger = (AliAODTrack*) list->At(index);
631 if(trigger && TMath::Abs((Float_t) trigger->Eta())< fTriggerEtaCut){ return index;}
638 //----------------------------------------------------------------------------
640 Double_t AliAnalysisTaskJetCorePP::GetBackgroundInPerpCone(Float_t jetR, Double_t jetPhi, Double_t jetEta, TList* trkList){
641 //calculate sum of track pT in the cone perpendicular in phi to the jet
643 // jetPhi, jetEta = direction of the jet
644 Int_t numberOfTrks = trkList->GetEntries();
645 Double_t pTsum = 0.0;
646 Double_t perpConePhi = jetPhi + TMath::Pi()/2;//perp cone w.r.t. jet in phi
647 for(Int_t it=0; it<numberOfTrks; it++){
648 AliVParticle *trk = (AliVParticle*) trkList->At(it);
649 Double_t dphi = RelativePhi(perpConePhi,trk->Phi());
650 Double_t deta = trk->Eta()-jetEta;
652 if( (dphi*dphi + deta*deta)< (jetR*jetR)){
660 //----------------------------------------------------------------------------
662 Double_t AliAnalysisTaskJetCorePP::RelativePhi(Double_t mphi,Double_t vphi){
663 //Get relative azimuthal angle of two particles -pi to pi
664 if (vphi < -TMath::Pi()) vphi += TMath::TwoPi();
665 else if (vphi > TMath::Pi()) vphi -= TMath::TwoPi();
667 if (mphi < -TMath::Pi()) mphi += TMath::TwoPi();
668 else if (mphi > TMath::Pi()) mphi -= TMath::TwoPi();
670 Double_t dphi = mphi - vphi;
671 if (dphi < -TMath::Pi()) dphi += TMath::TwoPi();
672 else if (dphi > TMath::Pi()) dphi -= TMath::TwoPi();
674 return dphi;//dphi in [-Pi, Pi]