4 //Measure Jet-hadron correlations
5 //Does event Mixing using AliEventPoolManager
8 #include "AliAnalysisTaskEmcalJetHMEC.h"
15 #include "THnSparse.h"
17 #include <TClonesArray.h>
18 #include <TParticle.h>
19 #include "AliVTrack.h"
20 #include "TParameter.h"
22 #include "AliAODEvent.h"
23 #include "AliAnalysisTask.h"
24 #include "AliAnalysisManager.h"
26 #include "AliESDEvent.h"
27 #include "AliESDInputHandler.h"
28 #include "AliESDCaloCluster.h"
29 #include "AliESDVertex.h"
30 #include "AliCentrality.h"
31 #include "AliAODJet.h"
32 #include "AliEmcalJet.h"
33 #include "AliESDtrackCuts.h"
36 #include "AliPicoTrack.h"
37 #include "AliEventPoolManager.h"
39 ClassImp(AliAnalysisTaskEmcalJetHMEC)
41 //________________________________________________________________________
42 AliAnalysisTaskEmcalJetHMEC::AliAnalysisTaskEmcalJetHMEC() :
44 fTracksName("tracks"),
66 // Default Constructor
68 for(Int_t ipta=0; ipta<7; ipta++){
69 fHistTrackEtaPhi[ipta]=0;
73 for(Int_t icent = 0; icent<6; ++icent){
75 fHistJetPtBias[icent]=0;
76 fHistJetPtTT[icent]=0;
77 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
78 for(Int_t ieta = 0; ieta<3; ++ieta){
79 fHistJetH[icent][iptjet][ieta]=0;
80 fHistJetHBias[icent][iptjet][ieta]=0;
81 fHistJetHTT[icent][iptjet][ieta]=0;
88 //________________________________________________________________________
89 AliAnalysisTaskEmcalJetHMEC::AliAnalysisTaskEmcalJetHMEC(const char *name) :
90 AliAnalysisTaskSE(name),
91 fTracksName("tracks"),
102 fMixingTracks(50000),
114 for(Int_t ipta=0; ipta<7; ipta++){
115 fHistTrackEtaPhi[ipta]=0;
117 for(Int_t icent = 0; icent<6; ++icent){
119 fHistJetPtBias[icent]=0;
120 fHistJetPtTT[icent]=0;
121 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
122 for(Int_t ieta = 0; ieta<3; ++ieta){
123 fHistJetH[icent][iptjet][ieta]=0;
124 fHistJetHBias[icent][iptjet][ieta]=0;
125 fHistJetHTT[icent][iptjet][ieta]=0;
131 DefineInput(0, TChain::Class());
132 DefineOutput(1, TList::Class());
136 //________________________________________________________________________
137 void AliAnalysisTaskEmcalJetHMEC::UserCreateOutputObjects()
142 AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
144 AliError("Input handler not available!");
149 fOutputList = new TList();
150 fOutputList->SetOwner();
155 fHistTrackPt = new TH1F("fHistTrackPt", "P_{T} distribution", 1000, 0.0, 100.0);
159 fHistCentrality = new TH1F("fHistCentrality","centrality",100,0,100);
161 fHistJetEtaPhi = new TH2F("fHistJetEtaPhi","Jet eta-phi",900,-1.8,1.8,640,-3.2,3.2);
162 fHistJetHEtaPhi = new TH2F("fHistJetHEtaPhi","Jet-Hadron deta-dphi",900,-1.8,1.8,640,-1.6,4.8);
166 for(Int_t ipta=0; ipta<7; ++ipta){
167 sprintf(name, "fHistTrackEtaPhi_%i", ipta);
168 fHistTrackEtaPhi[ipta] = new TH2F(name,name,400,-1,1,640,0.0,2*TMath::Pi());
169 fOutputList->Add(fHistTrackEtaPhi[ipta]);
173 for(Int_t icent = 0; icent<6; ++icent){
174 sprintf(name,"fHistJetPt_%i",icent);
175 fHistJetPt[icent] = new TH1F(name,name,200,0,200);
176 fOutputList->Add(fHistJetPt[icent]);
178 sprintf(name,"fHistJetPtBias_%i",icent);
179 fHistJetPtBias[icent] = new TH1F(name,name,200,0,200);
180 fOutputList->Add(fHistJetPtBias[icent]);
182 sprintf(name,"fHistJetPtTT_%i",icent);
183 fHistJetPtTT[icent] = new TH1F(name,name,200,0,200);
184 fOutputList->Add(fHistJetPtTT[icent]);
186 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
187 for(Int_t ieta = 0; ieta<3; ++ieta){
188 sprintf(name,"fHistJetH_%i_%i_%i",icent,iptjet,ieta);
189 fHistJetH[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
190 fOutputList->Add(fHistJetH[icent][iptjet][ieta]);
192 sprintf(name,"fHistJetHBias_%i_%i_%i",icent,iptjet,ieta);
193 fHistJetHBias[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
194 fOutputList->Add(fHistJetHBias[icent][iptjet][ieta]);
196 sprintf(name,"fHistJetHTT_%i_%i_%i",icent,iptjet,ieta);
197 fHistJetHTT[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
198 fOutputList->Add(fHistJetHTT[icent][iptjet][ieta]);
206 UInt_t cifras = 0; // bit coded, see GetDimParams() below
207 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
208 fhnJH = NewTHnSparseF("fhnJH", cifras);
212 fOutputList->Add(fhnJH);
216 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7;
217 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);
219 fhnMixedEvents->Sumw2();
221 fOutputList->Add(fhnMixedEvents);
226 fOutputList->Add(fHistTrackPt);
227 fOutputList->Add(fHistCentrality);
228 fOutputList->Add(fHistJetEtaPhi);
229 fOutputList->Add(fHistJetHEtaPhi);
232 PostData(1, fOutputList);
236 Int_t trackDepth = fMixingTracks;
237 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
239 Int_t nZvtxBins = 7+1+7;
240 // bins for second buffer are shifted by 100 cm
241 Double_t vertexBins[] = { -7, -5, -3, -1, 1, 3, 5, 7, 93, 95, 97, 99, 101, 103, 105, 107 };
242 Double_t* zvtxbin = vertexBins;
244 Int_t nCentralityBins = 100;
245 Double_t centralityBins[nCentralityBins];
246 for(Int_t ic=0; ic<nCentralityBins; ic++){
247 centralityBins[ic]=1.0*ic;
250 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
256 //________________________________________________________________________
258 Double_t AliAnalysisTaskEmcalJetHMEC:: RelativePhi(Double_t mphi,Double_t vphi) {
261 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
262 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
263 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
264 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
265 Double_t dphi = vphi-mphi;
266 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
267 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
269 return dphi;//dphi in [-Pi, Pi]
273 //________________________________________________________________________
274 Int_t AliAnalysisTaskEmcalJetHMEC::GetCentBin(Double_t cent) const
276 // Get centrality bin.
279 if (cent>=0 && cent<10)
281 else if (cent>=10 && cent<20)
283 else if (cent>=20 && cent<30)
285 else if (cent>=30 && cent<40)
287 else if (cent>=40 && cent<50)
289 else if (cent>=50 && cent<90)
295 //________________________________________________________________________
296 Int_t AliAnalysisTaskEmcalJetHMEC::GetEtaBin(Double_t eta) const
298 // Get eta bin for histos.
301 if (TMath::Abs(eta)<=0.4)
303 else if (TMath::Abs(eta)>0.4 && TMath::Abs(eta)<0.8)
305 else if (TMath::Abs(eta)>=0.8)
309 //________________________________________________________________________
310 Int_t AliAnalysisTaskEmcalJetHMEC::GetpTjetBin(Double_t pt) const
312 // Get jet pt bin for histos.
317 else if (pt>=20 && pt<25)
319 else if (pt>=25 && pt<30)
321 else if (pt>=30 && pt<60)
331 //________________________________________________________________________
332 void AliAnalysisTaskEmcalJetHMEC::UserExec(Option_t *)
336 // Main loop called for each event
338 Bool_t esdMode = kTRUE;
339 if (dynamic_cast<AliAODEvent*>(InputEvent()))
344 // optimization in case autobranch loading is off
345 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
346 if (fTracksName == "Tracks")
347 am->LoadBranch("Tracks");
352 TList *list = InputEvent()->GetList();
353 AliCentrality *centrality = InputEvent()->GetCentrality() ;
356 fcent = centrality->GetCentralityPercentile("V0M");
358 fcent=99;//probably pp data
361 AliError(Form("Centrality negative: %f", fcent));
366 fHistCentrality->Fill(fcent);
367 Int_t centbin = GetCentBin(fcent);
372 TClonesArray *jets = 0;
373 TClonesArray *tracks = 0;
375 tracks = dynamic_cast<TClonesArray*>(list->FindObject(fTracksName));
377 AliError(Form("Pointer to tracks %s == 0", fTracksName.Data() ));
380 const Int_t Ntracks=tracks->GetEntries();
382 jets= dynamic_cast<TClonesArray*>(list->FindObject(fJetsName));
383 const Int_t Njets = jets->GetEntries();
385 //Leticia's loop to find hardest track
390 for (Int_t iTracks = 0; iTracks < Ntracks; iTracks++)
392 AliVTrack* track = static_cast<AliVTrack*>(tracks->At(iTracks));
394 printf("ERROR: Could not receive track %d\n", iTracks);
398 if(TMath::Abs(track->Eta())>0.9) continue;
399 if(track->Pt()<0.15)continue;
401 if(track->Pt()>ptmax){
410 Double_t highestjetpt=0.0;
414 for (Int_t ijet = 0; ijet < Njets; ijet++)
417 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
422 //pt,eta,phi,centrality
423 float jetphi = jet->Phi();
424 if (jetphi>TMath::Pi())
425 jetphi = jetphi-2*TMath::Pi();
427 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax))
429 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax))
431 //fHistAreavsRawPt[centbin]->Fill(jet->Pt(),jet->Area());
432 if (jet->Area()<fAreacut)
434 //prevents 0 area jets from sneaking by when area cut == 0
437 //exclude jets with extremely high pt tracks which are likely misreconstructed
438 if(jet->MaxTrackPt()>100)
441 Double_t jetPt = jet->Pt();
443 if(highestjetpt<jetPt){
452 //Only look at the highest pT jet in the event
455 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijethi));
457 Double_t jetphi = jet->Phi();
458 Double_t jetPt = jet->Pt();
459 Double_t jeteta=jet->Eta();
461 fHistJetPt[centbin]->Fill(jet->Pt());
463 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias))
464 fHistJetPtBias[centbin]->Fill(jet->Pt());
467 fHistJetEtaPhi->Fill(jet->Eta(),jetphi);
469 //fHistDeltaPtvsArea->Fill(jetPt,jet->Area());
472 AliVTrack* TT = static_cast<AliVTrack*>(tracks->At(iTT));
473 if(TMath::Abs(jetphi-TT->Phi()-TMath::Pi())<0.6) passedTTcut=1;
478 fHistJetPtTT[centbin]->Fill(jet->Pt());
481 if (highestjetpt>15) {
483 for (Int_t iTracks = 0; iTracks < Ntracks; iTracks++)
485 AliVTrack* track = static_cast<AliVTrack*>(tracks->At(iTracks));
487 printf("ERROR: Could not receive track %d\n", iTracks);
491 if(TMath::Abs(track->Eta())>fTrkEta) continue;
493 fHistTrackPt->Fill(track->Pt());
495 if (track->Pt()<0.15)
498 Double_t trackphi = track->Phi();
499 if (trackphi > TMath::Pi())
500 trackphi = trackphi-2*TMath::Pi();
502 Double_t tracketa=track->Eta();
503 Double_t trackpt=track->Pt();
504 Double_t deta=tracketa-jeteta;
505 Int_t ieta=GetEtaBin(deta);
507 //Jet pt, track pt, dPhi,deta,fcent
508 Double_t dphijh = RelativePhi(jetphi,trackphi);
509 if (dphijh < -0.5*TMath::Pi())
510 dphijh+= 2*TMath::Pi();
511 if (dphijh > 1.5*TMath::Pi()) dphijh-=2.*TMath::Pi();
515 iptjet=GetpTjetBin(jetPt);
517 fHistJetH[centbin][iptjet][ieta]->Fill(dphijh,track->Pt());
518 fHistJetHEtaPhi->Fill(deta,dphijh);
520 Double_t dR=sqrt(deta*deta+dphijh*dphijh);
522 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
523 fHistJetHBias[centbin][iptjet][ieta]->Fill(dphijh,trackpt);
525 Double_t triggerEntries[7] = {fcent,jetPt,track->Pt(),dR,deta,dphijh,0.0};
526 fhnJH->Fill(triggerEntries);
530 fHistJetHTT[centbin][iptjet][ieta]->Fill(dphijh,trackpt);
539 //Prepare to do event mixing
541 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
542 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
545 Double_t fvertex[3]={0,0,0};
546 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
547 Double_t zVtx=fvertex[3];
549 if(fDoEventMixing>0){
553 // 1. First get an event pool corresponding in mult (cent) and
554 // zvertex to the current event. Once initialized, the pool
555 // should contain nMix (reduced) events. This routine does not
556 // pre-scan the chain. The first several events of every chain
557 // will be skipped until the needed pools are filled to the
558 // specified depth. If the pool categories are not too rare, this
559 // should not be a problem. If they are rare, you could lose
562 // 2. Collect the whole pool's content of tracks into one TObjArray
563 // (bgTracks), which is effectively a single background super-event.
565 // 3. The reduced and bgTracks arrays must both be passed into
566 // FillCorrelations(). Also nMix should be passed in, so a weight
567 // of 1./nMix can be applied.
573 AliEventPool* pool = fPoolMgr->GetEventPool(fcent, zVtx);
576 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", fcent, zVtx));
579 //check for a trigger jet
582 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
585 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijethi));
587 Double_t jetphi = jet->Phi();
588 Double_t jetPt = jet->Pt();
589 Double_t jeteta=jet->Eta();
592 Int_t nMix = pool->GetCurrentNEvents();
594 //Fill for biased jet triggers only
595 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
597 // Fill mixed-event histos here
598 for (Int_t jMix=0; jMix<nMix; jMix++)
600 TObjArray* bgTracks = pool->GetEvent(jMix);
601 const Int_t Nbgtrks = bgTracks->GetEntries();
602 for(Int_t ibg=0; ibg<Nbgtrks; ibg++){
603 AliPicoTrack *part = static_cast<AliPicoTrack*>(bgTracks->At(ibg));
606 Double_t DPhi = jetphi - part->Phi();
607 Double_t DEta = jeteta - part->Eta();
608 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
609 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
610 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
611 Double_t triggerEntries[7] = {fcent,jetPt,part->Pt(),DR,DEta,DPhi,0.0};
612 fhnMixedEvents->Fill(triggerEntries,1./nMix);
621 //update pool if jet in event or not
622 pool->UpdatePool(tracksClone);
629 PostData(1, fOutputList);
632 //________________________________________________________________________
633 void AliAnalysisTaskEmcalJetHMEC::Terminate(Option_t *)
639 THnSparse* AliAnalysisTaskEmcalJetHMEC::NewTHnSparseF(const char* name, UInt_t entries)
641 // generate new THnSparseF, axes are defined in GetDimParams()
644 UInt_t tmp = entries;
647 tmp = tmp &~ -tmp; // clear lowest bit
650 TString hnTitle(name);
651 const Int_t dim = count;
658 while(c<dim && i<32){
662 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
663 hnTitle += Form(";%s",label.Data());
671 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
674 void AliAnalysisTaskEmcalJetHMEC::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
676 // stores label and binning of axis for THnSparse
678 const Double_t pi = TMath::Pi();
683 label = "V0 centrality (%)";
692 label = "corrected jet pt";
735 label = "leading track";
743 label = "trigger track";
757 //_________________________________________________
758 // From CF event mixing code PhiCorrelations
759 TObjArray* AliAnalysisTaskEmcalJetHMEC::CloneAndReduceTrackList(TObjArray* tracks)
761 // clones a track list by using AliPicoTrack which uses much less memory (used for event mixing)
763 TObjArray* tracksClone = new TObjArray;
764 tracksClone->SetOwner(kTRUE);
766 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
768 AliVParticle* particle = (AliVParticle*) tracks->At(i);
769 if(TMath::Abs(particle->Eta())>fTrkEta) continue;
770 if(particle->Pt()<0.15)continue;
772 Double_t trackpt=particle->Pt();
775 if(trackpt<0.5) hadbin=0;
776 else if(trackpt<1) hadbin=1;
777 else if(trackpt<2) hadbin=2;
778 else if(trackpt<3) hadbin=3;
779 else if(trackpt<5) hadbin=4;
780 else if(trackpt<8) hadbin=5;
781 else if(trackpt<20) hadbin=6;
783 if(hadbin>-1) fHistTrackEtaPhi[hadbin]->Fill(particle->Eta(),particle->Phi());
786 tracksClone->Add(new AliPicoTrack(particle->Pt(), particle->Eta(), particle->Phi(), particle->Charge(), 0, 0, 0, 0));