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 fHistLeadJetPt[icent]=0;
77 fHistLeadJetPtBias[icent]=0;
78 fHistJetPtTT[icent]=0;
79 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
80 for(Int_t ieta = 0; ieta<3; ++ieta){
81 fHistJetH[icent][iptjet][ieta]=0;
82 fHistJetHBias[icent][iptjet][ieta]=0;
83 fHistJetHTT[icent][iptjet][ieta]=0;
90 //________________________________________________________________________
91 AliAnalysisTaskEmcalJetHMEC::AliAnalysisTaskEmcalJetHMEC(const char *name) :
92 AliAnalysisTaskSE(name),
93 fTracksName("tracks"),
104 fMixingTracks(50000),
116 for(Int_t ipta=0; ipta<7; ipta++){
117 fHistTrackEtaPhi[ipta]=0;
119 for(Int_t icent = 0; icent<6; ++icent){
121 fHistJetPtBias[icent]=0;
122 fHistLeadJetPt[icent]=0;
123 fHistLeadJetPtBias[icent]=0;
124 fHistJetPtTT[icent]=0;
125 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
126 for(Int_t ieta = 0; ieta<3; ++ieta){
127 fHistJetH[icent][iptjet][ieta]=0;
128 fHistJetHBias[icent][iptjet][ieta]=0;
129 fHistJetHTT[icent][iptjet][ieta]=0;
135 DefineInput(0, TChain::Class());
136 DefineOutput(1, TList::Class());
140 //________________________________________________________________________
141 void AliAnalysisTaskEmcalJetHMEC::UserCreateOutputObjects()
146 AliVEventHandler* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
148 AliError("Input handler not available!");
153 fOutputList = new TList();
154 fOutputList->SetOwner();
158 fHistTrackPt = new TH1F("fHistTrackPt", "P_{T} distribution", 1000, 0.0, 100.0);
160 fHistCentrality = new TH1F("fHistCentrality","centrality",100,0,100);
162 fHistJetEtaPhi = new TH2F("fHistJetEtaPhi","Jet eta-phi",900,-1.8,1.8,720,-3.2,3.2);
163 fHistJetHEtaPhi = new TH2F("fHistJetHEtaPhi","Jet-Hadron deta-dphi",900,-1.8,1.8,720,-1.6,4.8);
167 for(Int_t ipta=0; ipta<7; ++ipta){
168 name = Form("fHistTrackEtaPhi_%i", ipta);
169 fHistTrackEtaPhi[ipta] = new TH2F(name,name,400,-1,1,720,0.0,2.0*TMath::Pi());
170 fOutputList->Add(fHistTrackEtaPhi[ipta]);
174 for(Int_t icent = 0; icent<6; ++icent){
175 name = Form("fHistJetPt_%i",icent);
176 fHistJetPt[icent] = new TH1F(name,name,200,0,200);
177 fOutputList->Add(fHistJetPt[icent]);
179 name = Form("fHistJetPtBias_%i",icent);
180 fHistJetPtBias[icent] = new TH1F(name,name,200,0,200);
181 fOutputList->Add(fHistJetPtBias[icent]);
183 name = Form("fHistLeadJetPt_%i",icent);
184 fHistLeadJetPt[icent] = new TH1F(name,name,200,0,200);
185 fOutputList->Add(fHistLeadJetPt[icent]);
187 name = Form("fHistLeadJetPtBias_%i",icent);
188 fHistLeadJetPtBias[icent] = new TH1F(name,name,200,0,200);
189 fOutputList->Add(fHistLeadJetPtBias[icent]);
191 name = Form("fHistJetPtTT_%i",icent);
192 fHistJetPtTT[icent] = new TH1F(name,name,200,0,200);
193 fOutputList->Add(fHistJetPtTT[icent]);
195 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
196 for(Int_t ieta = 0; ieta<3; ++ieta){
197 name = Form("fHistJetH_%i_%i_%i",icent,iptjet,ieta);
198 fHistJetH[icent][iptjet][ieta]=new TH2F(name,name,72,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
199 fOutputList->Add(fHistJetH[icent][iptjet][ieta]);
201 name = Form("fHistJetHBias_%i_%i_%i",icent,iptjet,ieta);
202 fHistJetHBias[icent][iptjet][ieta]=new TH2F(name,name,72,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
203 fOutputList->Add(fHistJetHBias[icent][iptjet][ieta]);
205 name = Form("fHistJetHTT_%i_%i_%i",icent,iptjet,ieta);
206 fHistJetHTT[icent][iptjet][ieta]=new TH2F(name,name,72,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
207 fOutputList->Add(fHistJetHTT[icent][iptjet][ieta]);
215 UInt_t cifras = 0; // bit coded, see GetDimParams() below
216 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7 | 1<<8;
217 fhnJH = NewTHnSparseF("fhnJH", cifras);
221 fOutputList->Add(fhnJH);
225 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7 | 1<<8;
226 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);
228 fhnMixedEvents->Sumw2();
230 fOutputList->Add(fhnMixedEvents);
235 fOutputList->Add(fHistTrackPt);
236 fOutputList->Add(fHistCentrality);
237 fOutputList->Add(fHistJetEtaPhi);
238 fOutputList->Add(fHistJetHEtaPhi);
241 PostData(1, fOutputList);
245 Int_t trackDepth = fMixingTracks;
246 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
248 Int_t nZvtxBins = 5+1+5;
249 // bins for second buffer are shifted by 100 cm
250 Double_t vertexBins[] = { -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, };
251 Double_t* zvtxbin = vertexBins;
253 Int_t nCentralityBins = 100;
254 Double_t centralityBins[nCentralityBins];
255 for(Int_t ic=0; ic<nCentralityBins; ic++){
256 centralityBins[ic]=1.0*ic;
259 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
265 //________________________________________________________________________
267 Double_t AliAnalysisTaskEmcalJetHMEC:: RelativePhi(Double_t mphi,Double_t vphi) {
270 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
271 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
272 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
273 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
274 Double_t dphi = vphi-mphi;
275 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
276 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
278 return dphi;//dphi in [-Pi, Pi]
282 //________________________________________________________________________
283 Int_t AliAnalysisTaskEmcalJetHMEC::GetCentBin(Double_t cent) const
285 // Get centrality bin.
288 if (cent>=0 && cent<10)
290 else if (cent>=10 && cent<20)
292 else if (cent>=20 && cent<30)
294 else if (cent>=30 && cent<40)
296 else if (cent>=40 && cent<50)
298 else if (cent>=50 && cent<90)
304 //________________________________________________________________________
305 Int_t AliAnalysisTaskEmcalJetHMEC::GetEtaBin(Double_t eta) const
307 // Get eta bin for histos.
310 if (TMath::Abs(eta)<=0.4)
312 else if (TMath::Abs(eta)>0.4 && TMath::Abs(eta)<0.8)
314 else if (TMath::Abs(eta)>=0.8)
318 //________________________________________________________________________
319 Int_t AliAnalysisTaskEmcalJetHMEC::GetpTjetBin(Double_t pt) const
321 // Get jet pt bin for histos.
326 else if (pt>=20 && pt<25)
328 else if (pt>=25 && pt<30)
330 else if (pt>=30 && pt<60)
340 //________________________________________________________________________
341 void AliAnalysisTaskEmcalJetHMEC::UserExec(Option_t *)
345 // Main loop called for each event
347 Bool_t esdMode = kTRUE;
348 if (dynamic_cast<AliAODEvent*>(InputEvent()))
353 // optimization in case autobranch loading is off
354 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
355 if (fTracksName == "Tracks")
356 am->LoadBranch("Tracks");
361 TList *list = InputEvent()->GetList();
362 AliCentrality *centrality = InputEvent()->GetCentrality() ;
365 fcent = centrality->GetCentralityPercentile("V0M");
367 fcent=99;//probably pp data
370 AliError(Form("Centrality negative: %f", fcent));
374 Double_t fvertex[3]={0,0,0};
375 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
376 Double_t zVtx=fvertex[2];
381 fHistCentrality->Fill(fcent);
382 Int_t centbin = GetCentBin(fcent);
387 TClonesArray *jets = 0;
388 TClonesArray *tracks = 0;
390 tracks = dynamic_cast<TClonesArray*>(list->FindObject(fTracksName));
392 AliError(Form("Pointer to tracks %s == 0", fTracksName.Data() ));
395 const Int_t Ntracks=tracks->GetEntries();
397 jets= dynamic_cast<TClonesArray*>(list->FindObject(fJetsName));
399 AliError(Form("Pointer to tracks %s == 0", fJetsName.Data() ));
403 const Int_t Njets = jets->GetEntries();
405 //Leticia's loop to find hardest track
410 for (Int_t iTracks = 0; iTracks < Ntracks; iTracks++)
412 AliVTrack* track = static_cast<AliVTrack*>(tracks->At(iTracks));
414 printf("ERROR: Could not receive track %d\n", iTracks);
418 if(TMath::Abs(track->Eta())>0.9) continue;
419 if(track->Pt()<0.15)continue;
421 if(track->Pt()>ptmax){
430 Double_t highestjetpt=0.0;
434 for (Int_t ijet = 0; ijet < Njets; ijet++)
437 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
445 Double_t jetPt = jet->Pt();
447 if(highestjetpt<jetPt){
456 for (Int_t ijet = 0; ijet < Njets; ijet++){
458 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
464 Double_t jetphi = jet->Phi();
465 Double_t jetPt = jet->Pt();
466 Double_t jeteta=jet->Eta();
469 if (ijet==ijethi) leadjet=1;
472 fHistJetPt[centbin]->Fill(jet->Pt());
473 fHistLeadJetPt[centbin]->Fill(jet->Pt());
475 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
476 fHistJetPtBias[centbin]->Fill(jet->Pt());
477 fHistLeadJetPtBias[centbin]->Fill(jet->Pt());
480 fHistJetEtaPhi->Fill(jet->Eta(),jetphi);
484 AliVTrack* TT = static_cast<AliVTrack*>(tracks->At(iTT));
485 if(TMath::Abs(jetphi-TT->Phi()-TMath::Pi())<0.6) passedTTcut=1;
490 fHistJetPtTT[centbin]->Fill(jet->Pt());
494 iptjet=GetpTjetBin(jetPt);
495 if(iptjet<0) continue;
498 if (highestjetpt>15) {
501 for (Int_t iTracks = 0; iTracks < Ntracks; iTracks++)
503 AliVTrack* track = static_cast<AliVTrack*>(tracks->At(iTracks));
505 printf("ERROR: Could not receive track %d\n", iTracks);
509 if(TMath::Abs(track->Eta())>fTrkEta) continue;
511 fHistTrackPt->Fill(track->Pt());
513 if (track->Pt()<0.15)
516 Double_t trackphi = track->Phi();
517 if (trackphi > TMath::Pi())
518 trackphi = trackphi-2*TMath::Pi();
520 Double_t tracketa=track->Eta();
521 Double_t trackpt=track->Pt();
522 Double_t deta=tracketa-jeteta;
523 Int_t ieta=GetEtaBin(deta);
525 AliError(Form("Eta Bin negative: %f", deta));
530 //Jet pt, track pt, dPhi,deta,fcent
531 Double_t dphijh = RelativePhi(jetphi,trackphi);
532 if (dphijh < -0.5*TMath::Pi())
533 dphijh+= 2*TMath::Pi();
534 if (dphijh > 1.5*TMath::Pi()) dphijh-=2.*TMath::Pi();
538 fHistJetH[centbin][iptjet][ieta]->Fill(dphijh,track->Pt());
539 fHistJetHEtaPhi->Fill(deta,dphijh);
541 Double_t dR=sqrt(deta*deta+dphijh*dphijh);
543 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
544 fHistJetHBias[centbin][iptjet][ieta]->Fill(dphijh,trackpt);
547 Double_t triggerEntries[8] = {fcent,jetPt,trackpt,dR,deta,dphijh,0.0,leadjet};
548 fhnJH->Fill(triggerEntries);
552 fHistJetHTT[centbin][iptjet][ieta]->Fill(dphijh,trackpt);
561 //Prepare to do event mixing
563 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
564 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
568 if(fDoEventMixing>0){
572 // 1. First get an event pool corresponding in mult (cent) and
573 // zvertex to the current event. Once initialized, the pool
574 // should contain nMix (reduced) events. This routine does not
575 // pre-scan the chain. The first several events of every chain
576 // will be skipped until the needed pools are filled to the
577 // specified depth. If the pool categories are not too rare, this
578 // should not be a problem. If they are rare, you could lose
581 // 2. Collect the whole pool's content of tracks into one TObjArray
582 // (bgTracks), which is effectively a single background super-event.
584 // 3. The reduced and bgTracks arrays must both be passed into
585 // FillCorrelations(). Also nMix should be passed in, so a weight
586 // of 1./nMix can be applied.
592 AliEventPool* pool = fPoolMgr->GetEventPool(fcent, zVtx);
595 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", fcent, zVtx));
599 //check for a trigger jet
602 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
605 for (Int_t ijet = 0; ijet < Njets; ijet++){
608 if (ijet==ijethi) leadjet=1;
610 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
615 Double_t jetPt = jet->Pt();
616 Double_t jetphi = jet->Phi();
617 Double_t jeteta=jet->Eta();
620 Int_t nMix = pool->GetCurrentNEvents();
622 //Fill for biased jet triggers only
623 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
625 // Fill mixed-event histos here
626 for (Int_t jMix=0; jMix<nMix; jMix++)
628 TObjArray* bgTracks = pool->GetEvent(jMix);
629 const Int_t Nbgtrks = bgTracks->GetEntries();
630 for(Int_t ibg=0; ibg<Nbgtrks; ibg++){
631 AliPicoTrack *part = static_cast<AliPicoTrack*>(bgTracks->At(ibg));
634 Double_t DEta = part->Eta()-jeteta;
635 Double_t DPhi = RelativePhi(jetphi,part->Phi());
637 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
638 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
639 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
640 Double_t triggerEntries[8] = {fcent,jetPt,part->Pt(),DR,DEta,DPhi,0.0,leadjet};
641 fhnMixedEvents->Fill(triggerEntries,1./nMix);
650 //update pool if jet in event or not
651 pool->UpdatePool(tracksClone);
658 PostData(1, fOutputList);
661 //________________________________________________________________________
662 void AliAnalysisTaskEmcalJetHMEC::Terminate(Option_t *)
668 //________________________________________________________________________
669 Int_t AliAnalysisTaskEmcalJetHMEC::AcceptJet(AliEmcalJet *jet)
671 //applies all jet cuts except pt
672 float jetphi = jet->Phi();
673 if (jetphi>TMath::Pi())
674 jetphi = jetphi-2*TMath::Pi();
676 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax))
678 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax))
680 if (jet->Area()<fAreacut)
682 //prevents 0 area jets from sneaking by when area cut == 0
686 //exclude jets with extremely high pt tracks which are likely misreconstructed
687 if(jet->MaxTrackPt()>100)
690 //passed all above cuts
695 //________________________________________________________________________
697 THnSparse* AliAnalysisTaskEmcalJetHMEC::NewTHnSparseF(const char* name, UInt_t entries)
699 // generate new THnSparseF, axes are defined in GetDimParams()
702 UInt_t tmp = entries;
705 tmp = tmp &~ -tmp; // clear lowest bit
708 TString hnTitle(name);
709 const Int_t dim = count;
716 while(c<dim && i<32){
720 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
721 hnTitle += Form(";%s",label.Data());
729 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
732 void AliAnalysisTaskEmcalJetHMEC::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
734 // stores label and binning of axis for THnSparse
736 const Double_t pi = TMath::Pi();
741 label = "V0 centrality (%)";
750 label = "corrected jet pt";
793 label = "leading track";
801 label = "trigger track";
808 label = "leading jet";
820 //_________________________________________________
821 // From CF event mixing code PhiCorrelations
822 TObjArray* AliAnalysisTaskEmcalJetHMEC::CloneAndReduceTrackList(TObjArray* tracks)
824 // clones a track list by using AliPicoTrack which uses much less memory (used for event mixing)
826 TObjArray* tracksClone = new TObjArray;
827 tracksClone->SetOwner(kTRUE);
829 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
831 AliVParticle* particle = (AliVParticle*) tracks->At(i);
832 if(TMath::Abs(particle->Eta())>fTrkEta) continue;
833 if(particle->Pt()<0.15)continue;
835 Double_t trackpt=particle->Pt();
838 if(trackpt<0.5) hadbin=0;
839 else if(trackpt<1) hadbin=1;
840 else if(trackpt<2) hadbin=2;
841 else if(trackpt<3) hadbin=3;
842 else if(trackpt<5) hadbin=4;
843 else if(trackpt<8) hadbin=5;
844 else if(trackpt<20) hadbin=6;
846 if(hadbin>-1) fHistTrackEtaPhi[hadbin]->Fill(particle->Eta(),particle->Phi());
849 tracksClone->Add(new AliPicoTrack(particle->Pt(), particle->Eta(), particle->Phi(), particle->Charge(), 0, 0, 0, 0));