]>
Commit | Line | Data |
---|---|---|
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 | |
18 | ClassImp(AliAnalysisTaskRhoAverage) | |
19 | ||
20 | //________________________________________________________________________ | |
21 | AliAnalysisTaskRhoAverage::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 | 32 | AliAnalysisTaskRhoAverage::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 | 43 | Bool_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 | //________________________________________________________________________ | |
204 | void 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 | } |