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();
159 fHistTrackPt = new TH1F("fHistTrackPt", "P_{T} distribution", 1000, 0.0, 100.0);
163 fHistCentrality = new TH1F("fHistCentrality","centrality",100,0,100);
165 fHistJetEtaPhi = new TH2F("fHistJetEtaPhi","Jet eta-phi",900,-1.8,1.8,640,-3.2,3.2);
166 fHistJetHEtaPhi = new TH2F("fHistJetHEtaPhi","Jet-Hadron deta-dphi",900,-1.8,1.8,640,-1.6,4.8);
170 for(Int_t ipta=0; ipta<7; ++ipta){
171 sprintf(name, "fHistTrackEtaPhi_%i", ipta);
172 fHistTrackEtaPhi[ipta] = new TH2F(name,name,400,-1,1,640,0.0,2.0*TMath::Pi());
173 fOutputList->Add(fHistTrackEtaPhi[ipta]);
177 for(Int_t icent = 0; icent<6; ++icent){
178 sprintf(name,"fHistJetPt_%i",icent);
179 fHistJetPt[icent] = new TH1F(name,name,200,0,200);
180 fOutputList->Add(fHistJetPt[icent]);
182 sprintf(name,"fHistJetPtBias_%i",icent);
183 fHistJetPtBias[icent] = new TH1F(name,name,200,0,200);
184 fOutputList->Add(fHistJetPtBias[icent]);
186 sprintf(name,"fHistLeadJetPt_%i",icent);
187 fHistLeadJetPt[icent] = new TH1F(name,name,200,0,200);
188 fOutputList->Add(fHistLeadJetPt[icent]);
190 sprintf(name,"fHistLeadJetPtBias_%i",icent);
191 fHistLeadJetPtBias[icent] = new TH1F(name,name,200,0,200);
192 fOutputList->Add(fHistLeadJetPtBias[icent]);
194 sprintf(name,"fHistJetPtTT_%i",icent);
195 fHistJetPtTT[icent] = new TH1F(name,name,200,0,200);
196 fOutputList->Add(fHistJetPtTT[icent]);
198 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
199 for(Int_t ieta = 0; ieta<3; ++ieta){
200 sprintf(name,"fHistJetH_%i_%i_%i",icent,iptjet,ieta);
201 fHistJetH[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
202 fOutputList->Add(fHistJetH[icent][iptjet][ieta]);
204 sprintf(name,"fHistJetHBias_%i_%i_%i",icent,iptjet,ieta);
205 fHistJetHBias[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
206 fOutputList->Add(fHistJetHBias[icent][iptjet][ieta]);
208 sprintf(name,"fHistJetHTT_%i_%i_%i",icent,iptjet,ieta);
209 fHistJetHTT[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
210 fOutputList->Add(fHistJetHTT[icent][iptjet][ieta]);
218 UInt_t cifras = 0; // bit coded, see GetDimParams() below
219 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7 | 1<<8;
220 fhnJH = NewTHnSparseF("fhnJH", cifras);
224 fOutputList->Add(fhnJH);
228 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<7 | 1<<8;
229 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);
231 fhnMixedEvents->Sumw2();
233 fOutputList->Add(fhnMixedEvents);
238 fOutputList->Add(fHistTrackPt);
239 fOutputList->Add(fHistCentrality);
240 fOutputList->Add(fHistJetEtaPhi);
241 fOutputList->Add(fHistJetHEtaPhi);
244 PostData(1, fOutputList);
248 Int_t trackDepth = fMixingTracks;
249 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
251 Int_t nZvtxBins = 7+1+7;
252 // bins for second buffer are shifted by 100 cm
253 Double_t vertexBins[] = { -10, -5, -3, -1, 1, 3, 5, 10, 93, 95, 97, 99, 101, 103, 105, 107 };
254 Double_t* zvtxbin = vertexBins;
256 Int_t nCentralityBins = 100;
257 Double_t centralityBins[nCentralityBins];
258 for(Int_t ic=0; ic<nCentralityBins; ic++){
259 centralityBins[ic]=1.0*ic;
262 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBins, centralityBins, nZvtxBins, zvtxbin);
268 //________________________________________________________________________
270 Double_t AliAnalysisTaskEmcalJetHMEC:: RelativePhi(Double_t mphi,Double_t vphi) {
273 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
274 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
275 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
276 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
277 Double_t dphi = vphi-mphi;
278 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
279 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
281 return dphi;//dphi in [-Pi, Pi]
285 //________________________________________________________________________
286 Int_t AliAnalysisTaskEmcalJetHMEC::GetCentBin(Double_t cent) const
288 // Get centrality bin.
291 if (cent>=0 && cent<10)
293 else if (cent>=10 && cent<20)
295 else if (cent>=20 && cent<30)
297 else if (cent>=30 && cent<40)
299 else if (cent>=40 && cent<50)
301 else if (cent>=50 && cent<90)
307 //________________________________________________________________________
308 Int_t AliAnalysisTaskEmcalJetHMEC::GetEtaBin(Double_t eta) const
310 // Get eta bin for histos.
313 if (TMath::Abs(eta)<=0.4)
315 else if (TMath::Abs(eta)>0.4 && TMath::Abs(eta)<0.8)
317 else if (TMath::Abs(eta)>=0.8)
321 //________________________________________________________________________
322 Int_t AliAnalysisTaskEmcalJetHMEC::GetpTjetBin(Double_t pt) const
324 // Get jet pt bin for histos.
329 else if (pt>=20 && pt<25)
331 else if (pt>=25 && pt<30)
333 else if (pt>=30 && pt<60)
343 //________________________________________________________________________
344 void AliAnalysisTaskEmcalJetHMEC::UserExec(Option_t *)
348 // Main loop called for each event
350 Bool_t esdMode = kTRUE;
351 if (dynamic_cast<AliAODEvent*>(InputEvent()))
356 // optimization in case autobranch loading is off
357 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
358 if (fTracksName == "Tracks")
359 am->LoadBranch("Tracks");
364 TList *list = InputEvent()->GetList();
365 AliCentrality *centrality = InputEvent()->GetCentrality() ;
368 fcent = centrality->GetCentralityPercentile("V0M");
370 fcent=99;//probably pp data
373 AliError(Form("Centrality negative: %f", fcent));
378 fHistCentrality->Fill(fcent);
379 Int_t centbin = GetCentBin(fcent);
384 TClonesArray *jets = 0;
385 TClonesArray *tracks = 0;
387 tracks = dynamic_cast<TClonesArray*>(list->FindObject(fTracksName));
389 AliError(Form("Pointer to tracks %s == 0", fTracksName.Data() ));
392 const Int_t Ntracks=tracks->GetEntries();
394 jets= dynamic_cast<TClonesArray*>(list->FindObject(fJetsName));
395 const Int_t Njets = jets->GetEntries();
397 //Leticia's loop to find hardest track
402 for (Int_t iTracks = 0; iTracks < Ntracks; iTracks++)
404 AliVTrack* track = static_cast<AliVTrack*>(tracks->At(iTracks));
406 printf("ERROR: Could not receive track %d\n", iTracks);
410 if(TMath::Abs(track->Eta())>0.9) continue;
411 if(track->Pt()<0.15)continue;
413 if(track->Pt()>ptmax){
422 Double_t highestjetpt=0.0;
426 for (Int_t ijet = 0; ijet < Njets; ijet++)
429 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
437 Double_t jetPt = jet->Pt();
439 if(highestjetpt<jetPt){
448 for (Int_t ijet = 0; ijet < Njets; ijet++){
450 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
456 Double_t jetphi = jet->Phi();
457 Double_t jetPt = jet->Pt();
458 Double_t jeteta=jet->Eta();
461 if (ijet==ijethi) leadjet=1;
464 fHistJetPt[centbin]->Fill(jet->Pt());
465 fHistLeadJetPt[centbin]->Fill(jet->Pt());
467 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
468 fHistJetPtBias[centbin]->Fill(jet->Pt());
469 fHistLeadJetPtBias[centbin]->Fill(jet->Pt());
472 fHistJetEtaPhi->Fill(jet->Eta(),jetphi);
476 AliVTrack* TT = static_cast<AliVTrack*>(tracks->At(iTT));
477 if(TMath::Abs(jetphi-TT->Phi()-TMath::Pi())<0.6) passedTTcut=1;
482 fHistJetPtTT[centbin]->Fill(jet->Pt());
485 if (highestjetpt>15) {
487 for (Int_t iTracks = 0; iTracks < Ntracks; iTracks++)
489 AliVTrack* track = static_cast<AliVTrack*>(tracks->At(iTracks));
491 printf("ERROR: Could not receive track %d\n", iTracks);
495 if(TMath::Abs(track->Eta())>fTrkEta) continue;
497 fHistTrackPt->Fill(track->Pt());
499 if (track->Pt()<0.15)
502 Double_t trackphi = track->Phi();
503 if (trackphi > TMath::Pi())
504 trackphi = trackphi-2*TMath::Pi();
506 Double_t tracketa=track->Eta();
507 Double_t trackpt=track->Pt();
508 Double_t deta=tracketa-jeteta;
509 Int_t ieta=GetEtaBin(deta);
511 //Jet pt, track pt, dPhi,deta,fcent
512 Double_t dphijh = RelativePhi(jetphi,trackphi);
513 if (dphijh < -0.5*TMath::Pi())
514 dphijh+= 2*TMath::Pi();
515 if (dphijh > 1.5*TMath::Pi()) dphijh-=2.*TMath::Pi();
519 iptjet=GetpTjetBin(jetPt);
521 fHistJetH[centbin][iptjet][ieta]->Fill(dphijh,track->Pt());
522 fHistJetHEtaPhi->Fill(deta,dphijh);
524 Double_t dR=sqrt(deta*deta+dphijh*dphijh);
526 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
527 fHistJetHBias[centbin][iptjet][ieta]->Fill(dphijh,trackpt);
530 Double_t triggerEntries[8] = {fcent,jetPt,trackpt,dR,deta,dphijh,0.0,leadjet};
531 fhnJH->Fill(triggerEntries);
535 fHistJetHTT[centbin][iptjet][ieta]->Fill(dphijh,trackpt);
544 //Prepare to do event mixing
546 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
547 TObjArray* tracksClone = CloneAndReduceTrackList(tracks);
550 Double_t fvertex[3]={0,0,0};
551 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
552 Double_t zVtx=fvertex[2];
554 if(fDoEventMixing>0){
558 // 1. First get an event pool corresponding in mult (cent) and
559 // zvertex to the current event. Once initialized, the pool
560 // should contain nMix (reduced) events. This routine does not
561 // pre-scan the chain. The first several events of every chain
562 // will be skipped until the needed pools are filled to the
563 // specified depth. If the pool categories are not too rare, this
564 // should not be a problem. If they are rare, you could lose
567 // 2. Collect the whole pool's content of tracks into one TObjArray
568 // (bgTracks), which is effectively a single background super-event.
570 // 3. The reduced and bgTracks arrays must both be passed into
571 // FillCorrelations(). Also nMix should be passed in, so a weight
572 // of 1./nMix can be applied.
578 AliEventPool* pool = fPoolMgr->GetEventPool(fcent, zVtx);
581 AliFatal(Form("No pool found for centrality = %f, zVtx = %f", fcent, zVtx));
584 //check for a trigger jet
587 if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5)
590 for (Int_t ijet = 0; ijet < Njets; ijet++){
593 if (ijet==ijethi) leadjet=1;
595 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
600 Double_t jetPt = jet->Pt();
601 Double_t jetphi = jet->Phi();
602 Double_t jeteta=jet->Eta();
605 Int_t nMix = pool->GetCurrentNEvents();
607 //Fill for biased jet triggers only
608 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
610 // Fill mixed-event histos here
611 for (Int_t jMix=0; jMix<nMix; jMix++)
613 TObjArray* bgTracks = pool->GetEvent(jMix);
614 const Int_t Nbgtrks = bgTracks->GetEntries();
615 for(Int_t ibg=0; ibg<Nbgtrks; ibg++){
616 AliPicoTrack *part = static_cast<AliPicoTrack*>(bgTracks->At(ibg));
619 Double_t DPhi = jetphi - part->Phi();
620 Double_t DEta = jeteta - part->Eta();
621 Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta);
622 if(DPhi<-0.5*TMath::Pi()) DPhi+=2.*TMath::Pi();
623 if(DPhi>3./2.*TMath::Pi()) DPhi-=2.*TMath::Pi();
624 Double_t triggerEntries[8] = {fcent,jetPt,part->Pt(),DR,DEta,DPhi,0.0,leadjet};
625 fhnMixedEvents->Fill(triggerEntries,1./nMix);
634 //update pool if jet in event or not
635 pool->UpdatePool(tracksClone);
642 PostData(1, fOutputList);
645 //________________________________________________________________________
646 void AliAnalysisTaskEmcalJetHMEC::Terminate(Option_t *)
652 //________________________________________________________________________
653 Int_t AliAnalysisTaskEmcalJetHMEC::AcceptJet(AliEmcalJet *jet)
655 //applies all jet cuts except pt
656 float jetphi = jet->Phi();
657 if (jetphi>TMath::Pi())
658 jetphi = jetphi-2*TMath::Pi();
660 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax))
662 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax))
664 if (jet->Area()<fAreacut)
666 //prevents 0 area jets from sneaking by when area cut == 0
670 //exclude jets with extremely high pt tracks which are likely misreconstructed
671 if(jet->MaxTrackPt()>100)
674 //passed all above cuts
679 //________________________________________________________________________
681 THnSparse* AliAnalysisTaskEmcalJetHMEC::NewTHnSparseF(const char* name, UInt_t entries)
683 // generate new THnSparseF, axes are defined in GetDimParams()
686 UInt_t tmp = entries;
689 tmp = tmp &~ -tmp; // clear lowest bit
692 TString hnTitle(name);
693 const Int_t dim = count;
700 while(c<dim && i<32){
704 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
705 hnTitle += Form(";%s",label.Data());
713 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
716 void AliAnalysisTaskEmcalJetHMEC::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
718 // stores label and binning of axis for THnSparse
720 const Double_t pi = TMath::Pi();
725 label = "V0 centrality (%)";
734 label = "corrected jet pt";
777 label = "leading track";
785 label = "trigger track";
792 label = "leading jet";
804 //_________________________________________________
805 // From CF event mixing code PhiCorrelations
806 TObjArray* AliAnalysisTaskEmcalJetHMEC::CloneAndReduceTrackList(TObjArray* tracks)
808 // clones a track list by using AliPicoTrack which uses much less memory (used for event mixing)
810 TObjArray* tracksClone = new TObjArray;
811 tracksClone->SetOwner(kTRUE);
813 for (Int_t i=0; i<tracks->GetEntriesFast(); i++)
815 AliVParticle* particle = (AliVParticle*) tracks->At(i);
816 if(TMath::Abs(particle->Eta())>fTrkEta) continue;
817 if(particle->Pt()<0.15)continue;
819 Double_t trackpt=particle->Pt();
822 if(trackpt<0.5) hadbin=0;
823 else if(trackpt<1) hadbin=1;
824 else if(trackpt<2) hadbin=2;
825 else if(trackpt<3) hadbin=3;
826 else if(trackpt<5) hadbin=4;
827 else if(trackpt<8) hadbin=5;
828 else if(trackpt<20) hadbin=6;
830 if(hadbin>-1) fHistTrackEtaPhi[hadbin]->Fill(particle->Eta(),particle->Phi());
833 tracksClone->Add(new AliPicoTrack(particle->Pt(), particle->Eta(), particle->Phi(), particle->Charge(), 0, 0, 0, 0));