1 // Dihadron correlations task - simple task to read ESD or AOD input,
2 // calculate same- and mixed-event correlations, and fill THnSparse
3 // output. -A. Adare, Apr 2011
12 #include "TProfile2D.h"
15 #include "AliAODEvent.h"
16 #include "AliAODInputHandler.h"
17 #include "AliAnalysisManager.h"
18 #include "AliAnalysisTask.h"
19 #include "AliCentrality.h"
20 #include "AliDhcTask.h"
21 #include "AliESDEvent.h"
22 #include "AliESDInputHandler.h"
23 #include "AliESDtrackCuts.h"
24 #include "AliESDMuonTrack.h"
26 #include "AliVParticle.h"
34 //________________________________________________________________________
35 AliDhcTask::AliDhcTask()
36 : AliAnalysisTaskSE(), fVerbosity(0), fEtaMax(1), fZVtxMax(10), fPtMin(0.25), fPtMax(15),
37 fTrackDepth(1000), fPoolSize(200), fTracksName(), fDoWeights(kFALSE), fFillMuons(kFALSE),
38 fEtaTLo(-1.0), fEtaTHi(1.0), fEtaALo(-1.0), fEtaAHi(1.0),
39 fESD(0x0), fAOD(0x0), fOutputList(0x0), fHEvt(0x0), fHTrk(0x0),
40 fHPtAss(0x0), fHPtTrg(0x0), fHPtTrgEvt(0x0),
41 fHPtTrgNorm1S(0x0), fHPtTrgNorm1M(0x0), fHPtTrgNorm2S(0x0), fHPtTrgNorm2M(0x0),
42 fHCent(0x0), fHZvtx(0x0), fNbins(0), fHSs(0x0), fHMs(0x0), fHPts(0x0), fIndex(0x0),
43 fCentrality(99), fZVertex(99), fEsdTPCOnly(0), fPoolMgr(0),
44 fCentMethod("V0M"), fNBdeta(20), fNBdphi(36),
45 fBPtT(0x0), fBPtA(0x0), fBCent(0x0), fBZvtx(0x0),
46 fMixBCent(0x0), fMixBZvtx(0x0),
47 fHEffT(0x0), fHEffA(0x0)
52 //________________________________________________________________________
53 AliDhcTask::AliDhcTask(const char *name)
54 : AliAnalysisTaskSE(name), fVerbosity(0), fEtaMax(1), fZVtxMax(10), fPtMin(0.25), fPtMax(15),
55 fTrackDepth(1000), fPoolSize(200), fTracksName(), fDoWeights(kFALSE), fFillMuons(kFALSE),
56 fEtaTLo(-1.0), fEtaTHi(1.0), fEtaALo(-1.0), fEtaAHi(1.0),
57 fESD(0x0), fAOD(0x0), fOutputList(0x0), fHEvt(0x0), fHTrk(0x0),
58 fHPtAss(0x0), fHPtTrg(0x0), fHPtTrgEvt(0x0),
59 fHPtTrgNorm1S(0x0), fHPtTrgNorm1M(0x0), fHPtTrgNorm2S(0x0), fHPtTrgNorm2M(0x0),
60 fHCent(0x0), fHZvtx(0x0), fNbins(0), fHSs(0x0), fHMs(0x0), fHPts(0x0), fIndex(0x0),
61 fCentrality(99), fZVertex(99), fEsdTPCOnly(0), fPoolMgr(0),
62 fCentMethod("V0M"), fNBdeta(20), fNBdphi(36),
63 fBPtT(0x0), fBPtA(0x0), fBCent(0x0), fBZvtx(0x0),
64 fMixBCent(0x0), fMixBZvtx(0x0),
65 fHEffT(0x0), fHEffA(0x0)
69 // Define input and output slots here
70 // Input slot #0 works with a TChain
71 DefineInput(0, TChain::Class());
72 // Output slot #0 id reserved by the base class for AOD
73 // Output slot #1 writes into a TH1 container
74 DefineOutput(1, TList::Class());
76 fBranchNames="ESD:AliESDRun.,AliESDHeader.,PrimaryVertex.,SPDVertex.,TPCVertex.,Tracks "
77 "AOD:header,tracks,vertices,";
79 Double_t ptt[4] = {0.25, 1.0, 2.0, 15.0};
80 fBPtT = new TAxis(3,ptt);
81 Double_t pta[4] = {0.25, 1.0, 2.0, 15.0};
82 fBPtA = new TAxis(3,pta);
83 Double_t cent[2] = {-100.0, 100.0};
84 fBCent = new TAxis(1,cent);
85 Double_t zvtx[2] = {-10, 10};
86 fBZvtx = new TAxis(1,zvtx);
87 Double_t centmix[2] = {-100.0, 100.0};
88 fMixBCent = new TAxis(1,centmix);
89 Double_t zvtxmix[9] = {-10,-6,-4,-2,0,2,4,6,10};
90 fMixBZvtx = new TAxis(8,zvtxmix);
93 //________________________________________________________________________
94 void AliDhcTask::UserCreateOutputObjects()
97 // Called once (per slave on PROOF!)
99 AliInfo("Initialize Dhc Task");
100 AliInfo(Form(" efficiency correct triggers? %d", fHEffT!=0));
101 AliInfo(Form(" efficiency correct associates? %d", fHEffA!=0));
102 AliInfo(Form(" fill muons? %d", fFillMuons));
103 AliInfo(Form(" trigger eta range %f .. %f", fEtaTLo, fEtaTHi));
104 AliInfo(Form(" associate eta range %f .. %f", fEtaALo, fEtaAHi));
107 fOutputList = new TList();
108 fOutputList->SetOwner(1);
110 fEsdTPCOnly = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
111 //fEsdTPCOnly->SetMinNClustersTPC(70);
112 fEsdTPCOnly->SetMinNCrossedRowsTPC(70);
113 fEsdTPCOnly->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
117 PostData(1, fOutputList);
120 //________________________________________________________________________
121 void AliDhcTask::BookHistos()
125 if (fVerbosity > 1) {
126 AliInfo(Form("Number of pt(t) bins: %d", fBPtT->GetNbins()));
127 for (Int_t i=1; i<=fBPtT->GetNbins(); i++) {
128 AliInfo(Form("pt(t) bin %d, %f to %f", i, fBPtT->GetBinLowEdge(i), fBPtT->GetBinUpEdge(i)));
130 AliInfo(Form("Number of pt(a) bins: %d", fBPtA->GetNbins()));
131 for (Int_t i=1; i<=fBPtA->GetNbins(); i++) {
132 AliInfo(Form("pt(a) bin %d, %f to %f", i, fBPtA->GetBinLowEdge(i), fBPtA->GetBinUpEdge(i)));
136 Int_t nPtAssc=fBPtA->GetNbins();
137 Int_t nPtTrig=fBPtT->GetNbins();
138 Int_t nCent=fBCent->GetNbins();
139 Int_t nZvtx=fBZvtx->GetNbins();
140 Double_t ptt[nPtTrig+1];
141 ptt[0] = fBPtT->GetBinLowEdge(1);
142 for (Int_t i=1; i<=nPtTrig; i++) {
143 ptt[i] = fBPtT->GetBinUpEdge(i);
145 Double_t pta[nPtAssc+1];
146 pta[0] = fBPtA->GetBinLowEdge(1);
147 for (Int_t i=1; i<=nPtAssc; i++) {
148 pta[i] = fBPtA->GetBinUpEdge(i);
150 Double_t cent[nCent+1];
151 cent[0] = fBCent->GetBinLowEdge(1);
152 for (Int_t i=1; i<=nCent; i++) {
153 cent[i] = fBCent->GetBinUpEdge(i);
155 Double_t zvtx[nZvtx+1];
156 zvtx[0] = fBZvtx->GetBinLowEdge(1);
157 for (Int_t i=1; i<=nZvtx; i++) {
158 zvtx[i] = fBZvtx->GetBinUpEdge(i);
161 fHEvt = new TH2F("fHEvt", "Event-level variables; Zvtx; Cent", nZvtx, zvtx, nCent, cent);
162 fOutputList->Add(fHEvt);
163 fHTrk = new TH2F("fHTrk", "Track-level variables",
164 100, 0, TMath::TwoPi(), 100, -fEtaMax, +fEtaMax);
165 fOutputList->Add(fHTrk);
167 fHPtAss = new TH1F("fHPtAss","PtAssoc;P_{T} (GeV/c) [GeV/c]",nPtAssc,pta);
168 fOutputList->Add(fHPtAss);
169 fHPtTrg = new TH1F("fHPtTrg","PtTrig;P_{T} (GeV/c) [GeV/c]",nPtTrig,ptt);
170 fOutputList->Add(fHPtTrg);
171 fHPtTrgEvt = new TH1F("fHPtTrgEvt","PtTrig;P_{T} (GeV/c) [GeV/c]",nPtTrig,ptt);
172 fHPtTrgNorm1S = new TH3F("fHPtTrgNorm1S","PtTrig;P_{T} (GeV/c) [GeV/c];centrality;z_{vtx}",nPtTrig,ptt,nCent,cent,nZvtx,zvtx);
173 fOutputList->Add(fHPtTrgNorm1S);
174 fHPtTrgNorm1M = (TH3*) fHPtTrgNorm1S->Clone("fHPtTrgNorm1M");
175 fOutputList->Add(fHPtTrgNorm1M);
176 fHPtTrgNorm2S = (TH3*) fHPtTrgNorm1S->Clone("fHPtTrgNorm2S");
177 fOutputList->Add(fHPtTrgNorm2S);
178 fHPtTrgNorm2M = (TH3*) fHPtTrgNorm1S->Clone("fHPtTrgNorm2M");
179 fOutputList->Add(fHPtTrgNorm2M);
181 fHCent = new TH1F("fHCent","Cent;bins",nCent,cent);
182 fOutputList->Add(fHCent);
183 fHZvtx = new TH1F("fHZvtx","Zvertex;bins",nZvtx,zvtx);
184 fOutputList->Add(fHZvtx);
186 fNbins = nPtTrig*nPtAssc*nCent*nZvtx;
187 fHSs = new TH2*[fNbins];
188 fHMs = new TH2*[fNbins];
189 fHPts = new TH1*[fNbins];
191 fIndex = new TFormula("GlobIndex","(t-1)*[0]*[1]*[2]+(z-1)*[0]*[1]+(x-1)*[0]+(y-1)+0*[4]");
192 fIndex->SetParameters(nPtTrig,nPtAssc,nZvtx,nCent);
193 fIndex->SetParNames("NTrigBins","NAssocBins", "NZvertexBins", "NCentBins");
194 fOutputList->Add(fIndex);
197 for (Int_t c=1; c<=nCent; ++c) {
198 for (Int_t z=1; z<=nZvtx; ++z) {
199 for (Int_t t=1; t<=nPtTrig; ++t) {
200 for (Int_t a=1; a<=nPtAssc; ++a) {
209 TString title(Form("cen=%d (%.1f to %.1f), zVtx=%d (%.1f to %.1f)",
210 c, fBCent->GetBinLowEdge(c), fBCent->GetBinUpEdge(c),
211 z, fBZvtx->GetBinLowEdge(z), fBZvtx->GetBinUpEdge(z)));
212 fHPts[count] = new TH1F(Form("hPt%d",count), Form("Ptdist %s;p_{T} (GeV/c)",title.Data()), 200,0,20);
213 fOutputList->Add(fHPts[count]);
215 TString title(Form("cen=%d (%.1f to %.1f), zVtx=%d (%.1f to %.1f), trig=%d (%.1f to %.1f), assoc=%d (%.1f to %.1f)",
216 c, fBCent->GetBinLowEdge(c), fBCent->GetBinUpEdge(c),
217 z, fBZvtx->GetBinLowEdge(z), fBZvtx->GetBinUpEdge(z),
218 t, fBPtT->GetBinLowEdge(t), fBPtT->GetBinUpEdge(t),
219 a, fBPtA->GetBinLowEdge(a), fBPtA->GetBinUpEdge(a)));
220 fHSs[count] = new TH2F(Form("hS%d",count), Form("Signal %s;#Delta #varphi;#Delta #eta",title.Data()),
221 fNBdphi,-0.5*TMath::Pi(),1.5*TMath::Pi(),fNBdeta,-2*fEtaMax,2*fEtaMax);
222 fHMs[count] = new TH2F(Form("hM%d",count), Form("Mixed %s;#Delta #varphi;#Delta #eta",title.Data()),
223 fNBdphi,-0.5*TMath::Pi(),1.5*TMath::Pi(),fNBdeta,-2*fEtaMax,2*fEtaMax);
224 fOutputList->Add(fHSs[count]);
225 fOutputList->Add(fHMs[count]);
226 Int_t tcount = (Int_t)fIndex->Eval(t,a,z,c);
228 cout << count << " " << tcount << ": " << title << endl;
230 AliFatal(Form("Index mismatch: %d %d", count, tcount));
238 //________________________________________________________________________
239 void AliDhcTask::SetAnaMode(Int_t iAna=kHH)
242 SetFillMuons(kFALSE);
247 } else if (iAna==kMuH) {
253 } else if (iAna==kHMu) {
259 } else if (iAna==kMuMu) {
265 } else if (iAna==kPSide) {
266 SetFillMuons(kFALSE);
271 } else if (iAna==kASide) {
272 SetFillMuons(kFALSE);
278 AliInfo(Form("Unrecognized analysis option: %d", iAna));
282 //________________________________________________________________________
283 void AliDhcTask::InitEventMixer()
285 // The effective pool size in events is set by trackDepth, so more
286 // low-mult events are required to maintain the threshold than
287 // high-mult events. Centrality pools are indep. of data histogram
288 // binning, no need to match.
291 Int_t nCentBins=fMixBCent->GetNbins();
292 Double_t centBins[nCentBins+1];
293 centBins[0] = fMixBCent->GetBinLowEdge(1);
294 for (Int_t i=1; i<=nCentBins; i++) {
295 centBins[i] = fMixBCent->GetBinUpEdge(i);
299 Int_t nZvtxBins=fMixBZvtx->GetNbins();
300 Double_t zvtxbin[nZvtxBins+1];
301 zvtxbin[0] = fMixBZvtx->GetBinLowEdge(1);
302 for (Int_t i=1; i<=nZvtxBins; i++) {
303 zvtxbin[i] = fMixBZvtx->GetBinUpEdge(i);
306 fPoolMgr = new AliEvtPoolManager();
307 fPoolMgr->SetTargetTrackDepth(fTrackDepth);
309 fPoolMgr->SetDebug(1);
310 fPoolMgr->InitEventPools(fPoolSize, nCentBins, centBins, nZvtxBins, zvtxbin);
313 //________________________________________________________________________
314 void AliDhcTask::UserExec(Option_t *)
316 // Main loop, called for each event.
317 static int iEvent = -1; ++iEvent;
320 if (iEvent % 10 == 0)
321 cout << iEvent << endl;
324 Int_t dType = -1; // Will be set to kESD or kAOD.
325 MiniEvent* sTracks = new MiniEvent(0); // deleted by pool mgr.
329 // Get event pointers, check for signs of life
330 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
331 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
337 AliError("Neither fESD nor fAOD available");
342 if (fTracksName.Contains("Gen"))
345 // Centrality, vertex, other event variables...
348 TList *list = InputEvent()->GetList();
349 TClonesArray *tcaTracks = 0;
351 tcaTracks = dynamic_cast<TClonesArray*>(list->FindObject(fTracksName));
353 fCentrality = tcaTracks->GetEntries();
356 if (!VertexOk(fESD)) {
358 AliInfo(Form("Event REJECTED (ESD vertex not OK). z = %.1f", fZVertex));
361 const AliESDVertex* vertex = fESD->GetPrimaryVertex();
362 fZVertex = vertex->GetZ();
363 if(fESD->GetCentrality()) {
365 fESD->GetCentrality()->GetCentralityPercentile(fCentMethod);
369 const AliAODVertex* vertex = fAOD->GetPrimaryVertex();
370 fZVertex = vertex->GetZ();
371 if (!VertexOk(fAOD)) {
373 Info("Exec()", "Event REJECTED (AOD vertex not OK). z = %.1f", fZVertex);
376 const AliCentrality *aodCent = fAOD->GetHeader()->GetCentralityP();
378 fCentrality = aodCent->GetCentralityPercentile(fCentMethod);
383 // Fill Event histogram
384 fHEvt->Fill(fZVertex, fCentrality);
385 if (fCentrality > fBCent->GetXmax() || fCentrality < fBCent->GetXmin()) {
386 AliInfo(Form("Event REJECTED (centrality out of range). fCentrality = %.1f", fCentrality));
390 // Get array of selected tracks
392 GetESDTracks(sTracks);
395 GetAODTracks(sTracks);
398 // Get pool containing tracks from other events like this one
399 AliEvtPool* pool = fPoolMgr->GetEventPool(fCentrality, fZVertex);
401 AliWarning(Form("No pool found. Centrality %f, ZVertex %f",
402 fCentrality, fZVertex));
406 if (!pool->IsReady()) {
407 pool->UpdatePool(sTracks);
411 if (pool->IsFirstReady()) {
412 // recover events missed before the pool is ready
413 Int_t nEvs = pool->GetCurrentNEvents();
415 for (Int_t i=0; i<nEvs; ++i) {
416 MiniEvent* evI = pool->GetEvent(i);
417 for (Int_t j=0; j<nEvs; ++j) {
418 MiniEvent* evJ = pool->GetEvent(j);
420 Correlate(*evI, *evJ, kSameEvt);
422 Correlate(*evI, *evJ, kDiffEvt);
427 } else { /* standard case: same event, then mix*/
428 Correlate(*sTracks, *sTracks, kSameEvt);
429 Int_t nMix = pool->GetCurrentNEvents();
430 for (Int_t jMix=0; jMix<nMix; ++jMix) {
431 MiniEvent* bgTracks = pool->GetEvent(jMix);
432 Correlate(*sTracks, *bgTracks, kDiffEvt);
436 pool->UpdatePool(sTracks);
437 PostData(1, fOutputList);
440 //________________________________________________________________________
441 void AliDhcTask::GetESDTracks(MiniEvent* miniEvt)
443 // Loop twice: 1. Count sel. tracks. 2. Fill vector.
445 if (fTracksName.IsNull()) {
446 const AliESDVertex *vtxSPD = fESD->GetPrimaryVertexSPD();
450 Int_t nTrax = fESD->GetNumberOfTracks();
452 AliInfo(Form("%d tracks in event",nTrax));
456 TObjArray arr(nTrax);
459 for (Int_t i = 0; i < nTrax; ++i) {
460 AliESDtrack* esdtrack = fESD->GetTrack(i);
462 AliError(Form("Couldn't get ESD track %d\n", i));
465 Bool_t trkOK = fEsdTPCOnly->AcceptTrack(esdtrack);
468 Double_t pt = esdtrack->Pt();
469 Bool_t ptOK = pt >= fPtMin && pt < fPtMax;
472 Double_t eta = esdtrack->Eta();
473 if (TMath::Abs(eta) > fEtaMax)
476 // create a tpc only track
477 AliESDtrack *newtrack = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
480 if (newtrack->Pt()<=0) {
485 AliExternalTrackParam exParam;
486 Bool_t relate = newtrack->RelateToVertexTPC(vtxSPD,fESD->GetMagneticField(),kVeryBig,&exParam);
492 // set the constraint parameters to the track
493 newtrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
496 ptOK = pt >= fPtMin && pt < fPtMax;
501 eta = esdtrack->Eta();
502 if (TMath::Abs(eta) > fEtaMax) {
510 for(Int_t itrack = 0; itrack < nSelTrax; itrack++) {
511 AliVTrack *esdtrack = static_cast<AliESDtrack*>(arr.At(itrack));
513 AliError(Form("ERROR: Could not retrieve esdtrack %d",itrack));
516 Double_t pt = esdtrack->Pt();
517 Double_t eta = esdtrack->Eta();
518 Double_t phi = esdtrack->Phi();
519 Int_t sign = esdtrack->Charge() > 0 ? 1 : -1;
520 miniEvt->push_back(AliMiniTrack(pt, eta, phi, sign));
525 TList *list = InputEvent()->GetList();
526 TClonesArray *tcaTracks = dynamic_cast<TClonesArray*>(list->FindObject(fTracksName));
529 AliError("Ptr to tcaTracks zero");
533 const Int_t ntracks = tcaTracks->GetEntries();
535 miniEvt->reserve(ntracks);
537 AliError("Ptr to miniEvt zero");
541 for(Int_t itrack = 0; itrack < ntracks; itrack++) {
542 AliVTrack *esdtrack = static_cast<AliESDtrack*>(tcaTracks->At(itrack));
544 AliError(Form("ERROR: Could not retrieve esdtrack %d",itrack));
547 Double_t pt = esdtrack->Pt();
548 Double_t eta = esdtrack->Eta();
549 Double_t phi = esdtrack->Phi();
550 Int_t sign = esdtrack->Charge() > 0 ? 1 : -1;
551 miniEvt->push_back(AliMiniTrack(pt, eta, phi, sign));
555 Double_t ptMu, etaMu, phiMu;
558 Int_t nGoodMuons = 0;
559 for (Int_t iMu = 0; iMu<fESD->GetNumberOfMuonTracks(); iMu++) {
560 AliESDMuonTrack* muonTrack = fESD->GetMuonTrack(iMu);
562 if (IsGoodMUONtrack(*muonTrack)) nGoodMuons++;
565 miniEvt->reserve(miniEvt->size()+nGoodMuons);
566 // fill them into the mini event
567 for (Int_t iMu = 0; iMu<fESD->GetNumberOfMuonTracks(); iMu++) {
568 AliESDMuonTrack* muonTrack = fESD->GetMuonTrack(iMu);
570 if(!IsGoodMUONtrack(*muonTrack)) continue;
571 ptMu = muonTrack->Pt();
572 etaMu = muonTrack->Eta();
573 phiMu = muonTrack->Phi();
574 signMu = muonTrack->Charge() > 0 ? 1 : -1;
575 miniEvt->push_back(AliMiniTrack(ptMu, etaMu, phiMu, signMu));
581 //________________________________________________________________________
582 void AliDhcTask::GetAODTracks(MiniEvent* miniEvt)
584 // Loop twice: 1. Count sel. tracks. 2. Fill vector.
586 Int_t nTrax = fAOD->GetNumberOfTracks();
590 AliInfo(Form("%d tracks in event",nTrax));
593 for (Int_t i = 0; i < nTrax; ++i) {
594 AliAODTrack* aodtrack = fAOD->GetTrack(i);
596 AliError(Form("Couldn't get AOD track %d\n", i));
599 // See $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C
600 UInt_t tpcOnly = 1 << 7;
601 Bool_t trkOK = aodtrack->TestFilterBit(tpcOnly);
604 Double_t pt = aodtrack->Pt();
605 Bool_t ptOK = pt >= fPtMin && pt < fPtMax;
608 Double_t eta = aodtrack->Eta();
609 if (TMath::Abs(eta) > fEtaMax)
615 miniEvt->reserve(nSelTrax);
617 AliError("!miniEvt");
622 for (Int_t i = 0; i < nTrax; ++i) {
623 AliAODTrack* aodtrack = fAOD->GetTrack(i);
625 AliError(Form("Couldn't get AOD track %d\n", i));
629 // See $ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C
630 UInt_t tpcOnly = 1 << 7;
631 Bool_t trkOK = aodtrack->TestFilterBit(tpcOnly);
634 Double_t pt = aodtrack->Pt();
635 Bool_t ptOK = pt >= fPtMin && pt < fPtMax;
638 Double_t eta = aodtrack->Eta();
639 if (TMath::Abs(eta) > fEtaMax)
642 Double_t phi = aodtrack->Phi();
643 Int_t sign = aodtrack->Charge() > 0 ? 1 : -1;
644 miniEvt->push_back(AliMiniTrack(pt, eta, phi, sign));
648 //________________________________________________________________________
649 Double_t AliDhcTask::DeltaPhi(Double_t phia, Double_t phib,
650 Double_t rangeMin, Double_t rangeMax) const
652 Double_t dphi = -999;
653 Double_t pi = TMath::Pi();
655 if (phia < 0) phia += 2*pi;
656 else if (phia > 2*pi) phia -= 2*pi;
657 if (phib < 0) phib += 2*pi;
658 else if (phib > 2*pi) phib -= 2*pi;
660 if (dphi < rangeMin) dphi += 2*pi;
661 else if (dphi > rangeMax) dphi -= 2*pi;
666 //________________________________________________________________________
667 Int_t AliDhcTask::Correlate(const MiniEvent &evt1, const MiniEvent &evt2, Int_t pairing)
669 // Triggered angular correlations. If pairing is kSameEvt, particles
670 // within evt1 are correlated. If kDiffEvt, correlate triggers from
671 // evt1 with partners from evt2.
673 Int_t cbin = fHCent->FindBin(fCentrality);
674 if (fHCent->IsBinOverflow(cbin) ||
675 fHCent->IsBinUnderflow(cbin))
678 Int_t zbin = fHZvtx->FindBin(fZVertex);
679 if (fHZvtx->IsBinOverflow(zbin) ||
680 fHZvtx->IsBinUnderflow(zbin))
683 Int_t iMax = evt1.size();
684 Int_t jMax = evt2.size();
687 if (pairing == kSameEvt) {
689 fHCent->AddBinContent(cbin);
690 fHZvtx->AddBinContent(zbin);
693 Int_t nZvtx = fHZvtx->GetNbinsX();
694 Int_t nPtTrig = fHPtTrg->GetNbinsX();
695 Int_t nPtAssc = fHPtAss->GetNbinsX();
697 Int_t globIndex = (cbin-1)*nZvtx*nPtTrig*nPtAssc+(zbin-1)*nPtTrig*nPtAssc;
699 Int_t ptindex = (Int_t)fIndex->Eval(1,1,zbin,cbin);
702 for (Int_t i=0; i<iMax; ++i) {
703 const AliMiniTrack &a(evt1.at(i));
704 Float_t pta = a.Pt();
705 fHPtTrgEvt->Fill(pta);
706 if (pairing == kSameEvt) {
707 fHPts[ptindex]->Fill(pta);
711 Bool_t bCountTrg; // only count the trigger if an associated particle is found
713 for (Int_t i=0; i<iMax; ++i) {
715 const AliMiniTrack &a(evt1.at(i));
717 Float_t pta = a.Pt();
718 Float_t etaa = a.Eta();
719 Float_t phia = a.Phi();
720 Int_t abin = fHPtTrg->FindBin(pta);
721 if (fHPtTrg->IsBinOverflow(abin) || fHPtTrg->IsBinUnderflow(abin))
724 if (etaa<fEtaTLo || etaa>fEtaTHi)
727 // efficiency weighting
728 Double_t effWtT = 1.0;
731 const Int_t nEffDimT = fHEffT->GetNdimensions();
732 Int_t effBinT[nEffDimT];
733 effBinT[0] = fHEffT->GetAxis(0)->FindBin(etaa);
734 effBinT[1] = fHEffT->GetAxis(1)->FindBin(pta);
735 effBinT[2] = fHEffT->GetAxis(2)->FindBin(fCentrality);
736 effBinT[3] = fHEffT->GetAxis(3)->FindBin(fZVertex);
738 effBinT[4] = fHEffT->GetAxis(4)->FindBin(phia);
740 effWtT = fHEffT->GetBinContent(effBinT);
743 if (pairing == kSameEvt) {
744 fHTrk->Fill(phia,etaa);
745 fHPtTrgNorm1S->Fill(pta,fCentrality,fZVertex,effWtT);
747 fHPtTrgNorm1M->Fill(pta,fCentrality,fZVertex,effWtT);
751 for (Int_t j=0; j<jMax; ++j) {
752 // Associated particles
753 if (pairing == kSameEvt && i==j)
756 const AliMiniTrack &b(evt2.at(j));
758 Float_t ptb = b.Pt();
759 Float_t etab = b.Eta();
760 Float_t phib = b.Phi();
764 Int_t bbin = fHPtAss->FindBin(ptb);
765 if (fHPtAss->IsBinOverflow(bbin) || fHPtAss->IsBinUnderflow(bbin))
768 if (etab<fEtaALo || etab>fEtaAHi)
771 Float_t dphi = DeltaPhi(phia, phib);
772 Float_t deta = etaa - etab;
774 Int_t index = globIndex+(abin-1)*nPtAssc+(bbin-1);
775 Double_t weight = 1.0;
776 // number of trigger weight event-by-event (CMS method)
778 Double_t nTrgs = fHPtTrgEvt->GetBinContent(abin);
780 AliError(Form("Trying to work with number of triggers weight = %f",nTrgs));
786 // efficiency weighting
792 // associated particle
793 const Int_t nEffDimA = fHEffA->GetNdimensions();
794 Int_t effBinA[nEffDimA];
795 effBinA[0] = fHEffA->GetAxis(0)->FindBin(etab);
796 effBinA[1] = fHEffA->GetAxis(1)->FindBin(ptb);
797 effBinA[2] = fHEffA->GetAxis(2)->FindBin(fCentrality);
798 effBinA[3] = fHEffA->GetAxis(3)->FindBin(fZVertex);
800 effBinA[4] = fHEffA->GetAxis(4)->FindBin(phib);
802 weight *= fHEffA->GetBinContent(effBinA);
804 hist[index]->Fill(dphi,deta,weight);
807 if (pairing == kSameEvt) {
808 fHPtAss->AddBinContent(bbin);
812 if (pairing == kSameEvt) {
813 fHPtTrgNorm2S->Fill(pta,fCentrality,fZVertex,effWtT);
815 fHPtTrgNorm2M->Fill(pta,fCentrality,fZVertex,effWtT);
823 //________________________________________________________________________
824 void AliDhcTask::Terminate(Option_t *)
826 // Draw result to the screen
827 // Called once at the end of the query
830 fHCent->SetEntries(fHCent->Integral());
831 fHZvtx->SetEntries(fHZvtx->Integral());
832 fHPtTrg->SetEntries(fHPtTrg->Integral());
833 fHPtAss->SetEntries(fHPtAss->Integral());
836 //________________________________________________________________________
837 Bool_t AliDhcTask::VertexOk(TObject* obj) const
839 // Modified from AliAnalyseLeadingTrackUE::VertexSelection()
841 Int_t nContributors = 0;
842 Double_t zVertex = 999;
845 if (obj->InheritsFrom("AliESDEvent")) {
846 AliESDEvent* esdevt = (AliESDEvent*) obj;
847 const AliESDVertex* vtx = esdevt->GetPrimaryVertex();
850 nContributors = vtx->GetNContributors();
851 zVertex = vtx->GetZ();
852 name = vtx->GetName();
854 else if (obj->InheritsFrom("AliAODEvent")) {
855 AliAODEvent* aodevt = (AliAODEvent*) obj;
856 if (aodevt->GetNumberOfVertices() < 1)
858 const AliAODVertex* vtx = aodevt->GetPrimaryVertex();
859 nContributors = vtx->GetNContributors();
860 zVertex = vtx->GetZ();
861 name = vtx->GetName();
864 // Reject if TPC-only vertex
865 if (name.CompareTo("TPCVertex")==0)
868 // Check # contributors and range...
869 if( nContributors < 1 || TMath::Abs(zVertex) > fZVtxMax ) {
876 //________________________________________________________________________
877 Bool_t AliDhcTask::IsGoodMUONtrack(AliESDMuonTrack &track)
879 // Applying track cuts for MUON tracks
880 if(!track.ContainTrackerData()) return kFALSE;
881 if(!track.ContainTriggerData()) return kFALSE;
882 Double_t thetaTrackAbsEnd = TMath::ATan(track.GetRAtAbsorberEnd()/505.) * TMath::RadToDeg();
883 Double_t eta = track.Eta();
884 if(!(thetaTrackAbsEnd >= 2. && thetaTrackAbsEnd <= 10. && eta >= -4. && eta <= -2.5)) return kFALSE;
885 if(track.GetMatchTrigger() <= 0) return kFALSE;
886 // if(track.Pt() <= 1.0) return kFALSE;
887 // if(track.GetNormalizedChi2() >= 4.0) return kFALSE;