]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/EMCALJetTasks/AliAnalysisTaskRhoAverage.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGJE / EMCALJetTasks / AliAnalysisTaskRhoAverage.cxx
CommitLineData
d41a0b1c 1// $Id$
2//
a487deae 3// Calculation of rho, method: median all particle pt / multiplicity density.
d41a0b1c 4//
1b3d7f8f 5// Authors: S. Aiola
d41a0b1c 6
f09b22c5 7#include "AliAnalysisTaskRhoAverage.h"
8
d41a0b1c 9#include <TClonesArray.h>
10#include <TMath.h>
11
1b3d7f8f 12#include "AliLog.h"
13#include "AliRhoParameter.h"
d41a0b1c 14#include "AliVCluster.h"
1b3d7f8f 15#include "AliVTrack.h"
7cd832c7 16#include "AliParticleContainer.h"
d41a0b1c 17
18ClassImp(AliAnalysisTaskRhoAverage)
19
20//________________________________________________________________________
21AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage() :
a487deae 22 AliAnalysisTaskRhoBase("AliAnalysisTaskRhoAverage"),
23 fRhoType(0),
a315c08c 24 fNExclLeadPart(0),
7cd832c7 25 fUseMedian(kFALSE),
26 fTotalArea(1)
d41a0b1c 27{
f09b22c5 28 // Default constructor.
d41a0b1c 29}
30
31//________________________________________________________________________
a487deae 32AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage(const char *name, Bool_t histo) :
33 AliAnalysisTaskRhoBase(name, histo),
34 fRhoType(0),
a315c08c 35 fNExclLeadPart(0),
7cd832c7 36 fUseMedian(kFALSE),
37 fTotalArea(1)
d41a0b1c 38{
f09b22c5 39 // Constructor.
d41a0b1c 40}
41
42//________________________________________________________________________
a487deae 43Bool_t AliAnalysisTaskRhoAverage::Run()
d41a0b1c 44{
a487deae 45 // Run the analysis.
d41a0b1c 46
73e2fd59 47 const Int_t NMAX = 9999;
48 static Double_t rhovec[NMAX];
a487deae 49 Int_t NpartAcc = 0;
d41a0b1c 50
a315c08c 51 Int_t maxPartIds[] = {0, 0};
52 Float_t maxPartPts[] = {0, 0};
a487deae 53
54 // push all jets within selected acceptance into stack
55
56 if (fNExclLeadPart > 0) {
57
58 if (fTracks && (fRhoType == 0 || fRhoType == 1)) {
d41a0b1c 59
a487deae 60 const Int_t Ntracks = fTracks->GetEntriesFast();
61
62 for (Int_t it = 0; it < Ntracks; ++it) {
63
64 AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it));
65
66 if (!track) {
67 AliError(Form("%s: Could not receive track %d", GetName(), it));
68 continue;
69 }
70
71 if (!AcceptTrack(track))
72 continue;
73
74 if (track->Pt() > maxPartPts[0]) {
75 maxPartPts[1] = maxPartPts[0];
76 maxPartIds[1] = maxPartIds[0];
77 maxPartPts[0] = track->Pt();
78 maxPartIds[0] = it+1;
79 }
80 else if (track->Pt() > maxPartPts[1]) {
81 maxPartPts[1] = track->Pt();
82 maxPartIds[1] = it+1;
83 }
84 }
d41a0b1c 85 }
d41a0b1c 86
a487deae 87 if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) {
d41a0b1c 88
a487deae 89 const Int_t Nclusters = fCaloClusters->GetEntriesFast();
d41a0b1c 90
a487deae 91 for (Int_t ic = 0; ic < Nclusters; ++ic) {
92
93 AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic));
94
95 if (!cluster) {
96 AliError(Form("%s: Could not receive cluster %d", GetName(), ic));
97 continue;
98 }
99
100 if (!AcceptCluster(cluster))
101 continue;
102
103 TLorentzVector nPart;
104 cluster->GetMomentum(nPart, fVertex);
105
106 if (nPart.Pt() > maxPartPts[0]) {
107 maxPartPts[1] = maxPartPts[0];
108 maxPartIds[1] = maxPartIds[0];
109 maxPartPts[0] = nPart.Pt();
110 maxPartIds[0] = -ic-1;
111 }
112 else if (nPart.Pt() > maxPartPts[1]) {
113 maxPartPts[1] = nPart.Pt();
114 maxPartIds[1] = -ic-1;
115 }
116 }
117 }
118
119 if (fNExclLeadPart < 2) {
a315c08c 120 maxPartIds[1] = 0;
a487deae 121 maxPartPts[1] = 0;
122 }
123 }
d41a0b1c 124
a487deae 125 if (fTracks && (fRhoType == 0 || fRhoType == 1)) {
d41a0b1c 126
a487deae 127 const Int_t Ntracks = fTracks->GetEntriesFast();
d41a0b1c 128
73e2fd59 129 for (Int_t it = 0; it < Ntracks && NpartAcc < NMAX; ++it) {
d41a0b1c 130
a487deae 131 // exlcuding lead particles
132 if (it == maxPartIds[0]-1 || it == maxPartIds[1]-1)
133 continue;
d41a0b1c 134
a487deae 135 AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it));
d41a0b1c 136
a487deae 137 if (!track) {
138 AliError(Form("%s: Could not receive track %d", GetName(), it));
139 continue;
140 }
d41a0b1c 141
a487deae 142 if (!AcceptTrack(track))
143 continue;
d41a0b1c 144
a487deae 145 rhovec[NpartAcc] = track->Pt();
146 ++NpartAcc;
147 }
d41a0b1c 148 }
d41a0b1c 149
a487deae 150 if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) {
d41a0b1c 151
a487deae 152 const Int_t Nclusters = fCaloClusters->GetEntriesFast();
d41a0b1c 153
73e2fd59 154 for (Int_t ic = 0; ic < Nclusters && NpartAcc < NMAX; ++ic) {
f09b22c5 155
a487deae 156 // exlcuding lead particles
157 if (ic == -maxPartIds[0]-1 || ic == -maxPartIds[1]-1)
158 continue;
159
160 AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic));
161
162 if (!cluster) {
163 AliError(Form("%s: Could not receive cluster %d", GetName(), ic));
164 continue;
165 }
166
167 if (!AcceptCluster(cluster))
168 continue;
169
170 TLorentzVector nPart;
171 cluster->GetMomentum(nPart, fVertex);
f09b22c5 172
a487deae 173 rhovec[NpartAcc] = nPart.Pt();
174 ++NpartAcc;
db91838f 175 }
f09b22c5 176 }
177
73e2fd59 178 if (NpartAcc == NMAX) {
179 AliError(Form("%s: NpartAcc >= %d", GetName(), NMAX));
180 }
a315c08c 181
73e2fd59 182 Double_t rho = 0;
183
184 if (NpartAcc > 0) {
185 if (fUseMedian)
186 rho = TMath::Median(NpartAcc, rhovec);
187 else
188 rho = TMath::Mean(NpartAcc, rhovec);
189
7cd832c7 190 rho *= NpartAcc / fTotalArea;
f09b22c5 191 }
603ca74b 192
7cd832c7 193 fOutRho->SetVal(rho);
73e2fd59 194
a487deae 195 if (fScaleFunction) {
196 Double_t rhoScaled = rho * GetScaleFactor(fCent);
7cd832c7 197 fOutRhoScaled->SetVal(rhoScaled);
d41a0b1c 198 }
d41a0b1c 199
a487deae 200 return kTRUE;
d41a0b1c 201}
7cd832c7 202
203//________________________________________________________________________
204void AliAnalysisTaskRhoAverage::ExecOnce()
205{
206 AliAnalysisTaskRhoBase::ExecOnce();
207
208 AliParticleContainer *partCont = GetParticleContainer(0);
209 if (!partCont) {
210 AliError(Form("%s: No particle container found! Assuming area = 1...",GetName()));
211 fTotalArea = 1;
212 return;
213 }
214
215 Float_t maxEta = partCont->GetParticleEtaMax();
216 Float_t minEta = partCont->GetParticleEtaMin();
217 Float_t maxPhi = partCont->GetParticlePhiMax();
218 Float_t minPhi = partCont->GetParticlePhiMin();
219
220 if (maxPhi > TMath::Pi() * 2) maxPhi = TMath::Pi() * 2;
221 if (minPhi < 0) minPhi = 0;
222
223 fTotalArea = (maxEta - minEta) * (maxPhi - minPhi);
224
225 if (fTotalArea < 1e-6) {
226 AliError(Form("%s: Area = %f < 1e-6, assuming area = 1", GetName(), fTotalArea));
227 fTotalArea = 1;
228 }
229}