]>
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" |
d41a0b1c | 16 | |
17 | ClassImp(AliAnalysisTaskRhoAverage) | |
18 | ||
19 | //________________________________________________________________________ | |
20 | AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage() : | |
a487deae | 21 | AliAnalysisTaskRhoBase("AliAnalysisTaskRhoAverage"), |
22 | fRhoType(0), | |
a315c08c | 23 | fNExclLeadPart(0), |
24 | fUseMedian(kFALSE) | |
d41a0b1c | 25 | { |
f09b22c5 | 26 | // Default constructor. |
d41a0b1c | 27 | } |
28 | ||
29 | //________________________________________________________________________ | |
a487deae | 30 | AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage(const char *name, Bool_t histo) : |
31 | AliAnalysisTaskRhoBase(name, histo), | |
32 | fRhoType(0), | |
a315c08c | 33 | fNExclLeadPart(0), |
34 | fUseMedian(kFALSE) | |
d41a0b1c | 35 | { |
f09b22c5 | 36 | // Constructor. |
d41a0b1c | 37 | } |
38 | ||
39 | //________________________________________________________________________ | |
a487deae | 40 | Bool_t AliAnalysisTaskRhoAverage::Run() |
d41a0b1c | 41 | { |
a487deae | 42 | // Run the analysis. |
d41a0b1c | 43 | |
73e2fd59 | 44 | const Int_t NMAX = 9999; |
45 | static Double_t rhovec[NMAX]; | |
a487deae | 46 | Int_t NpartAcc = 0; |
d41a0b1c | 47 | |
a315c08c | 48 | Int_t maxPartIds[] = {0, 0}; |
49 | Float_t maxPartPts[] = {0, 0}; | |
a487deae | 50 | |
51 | // push all jets within selected acceptance into stack | |
52 | ||
53 | if (fNExclLeadPart > 0) { | |
54 | ||
55 | if (fTracks && (fRhoType == 0 || fRhoType == 1)) { | |
d41a0b1c | 56 | |
a487deae | 57 | const Int_t Ntracks = fTracks->GetEntriesFast(); |
58 | ||
59 | for (Int_t it = 0; it < Ntracks; ++it) { | |
60 | ||
61 | AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it)); | |
62 | ||
63 | if (!track) { | |
64 | AliError(Form("%s: Could not receive track %d", GetName(), it)); | |
65 | continue; | |
66 | } | |
67 | ||
68 | if (!AcceptTrack(track)) | |
69 | continue; | |
70 | ||
71 | if (track->Pt() > maxPartPts[0]) { | |
72 | maxPartPts[1] = maxPartPts[0]; | |
73 | maxPartIds[1] = maxPartIds[0]; | |
74 | maxPartPts[0] = track->Pt(); | |
75 | maxPartIds[0] = it+1; | |
76 | } | |
77 | else if (track->Pt() > maxPartPts[1]) { | |
78 | maxPartPts[1] = track->Pt(); | |
79 | maxPartIds[1] = it+1; | |
80 | } | |
81 | } | |
d41a0b1c | 82 | } |
d41a0b1c | 83 | |
a487deae | 84 | if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) { |
d41a0b1c | 85 | |
a487deae | 86 | const Int_t Nclusters = fCaloClusters->GetEntriesFast(); |
d41a0b1c | 87 | |
a487deae | 88 | for (Int_t ic = 0; ic < Nclusters; ++ic) { |
89 | ||
90 | AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic)); | |
91 | ||
92 | if (!cluster) { | |
93 | AliError(Form("%s: Could not receive cluster %d", GetName(), ic)); | |
94 | continue; | |
95 | } | |
96 | ||
97 | if (!AcceptCluster(cluster)) | |
98 | continue; | |
99 | ||
100 | TLorentzVector nPart; | |
101 | cluster->GetMomentum(nPart, fVertex); | |
102 | ||
103 | if (nPart.Pt() > maxPartPts[0]) { | |
104 | maxPartPts[1] = maxPartPts[0]; | |
105 | maxPartIds[1] = maxPartIds[0]; | |
106 | maxPartPts[0] = nPart.Pt(); | |
107 | maxPartIds[0] = -ic-1; | |
108 | } | |
109 | else if (nPart.Pt() > maxPartPts[1]) { | |
110 | maxPartPts[1] = nPart.Pt(); | |
111 | maxPartIds[1] = -ic-1; | |
112 | } | |
113 | } | |
114 | } | |
115 | ||
116 | if (fNExclLeadPart < 2) { | |
a315c08c | 117 | maxPartIds[1] = 0; |
a487deae | 118 | maxPartPts[1] = 0; |
119 | } | |
120 | } | |
d41a0b1c | 121 | |
a487deae | 122 | if (fTracks && (fRhoType == 0 || fRhoType == 1)) { |
d41a0b1c | 123 | |
a487deae | 124 | const Int_t Ntracks = fTracks->GetEntriesFast(); |
d41a0b1c | 125 | |
73e2fd59 | 126 | for (Int_t it = 0; it < Ntracks && NpartAcc < NMAX; ++it) { |
d41a0b1c | 127 | |
a487deae | 128 | // exlcuding lead particles |
129 | if (it == maxPartIds[0]-1 || it == maxPartIds[1]-1) | |
130 | continue; | |
d41a0b1c | 131 | |
a487deae | 132 | AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it)); |
d41a0b1c | 133 | |
a487deae | 134 | if (!track) { |
135 | AliError(Form("%s: Could not receive track %d", GetName(), it)); | |
136 | continue; | |
137 | } | |
d41a0b1c | 138 | |
a487deae | 139 | if (!AcceptTrack(track)) |
140 | continue; | |
d41a0b1c | 141 | |
a487deae | 142 | rhovec[NpartAcc] = track->Pt(); |
143 | ++NpartAcc; | |
144 | } | |
d41a0b1c | 145 | } |
d41a0b1c | 146 | |
a487deae | 147 | if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) { |
d41a0b1c | 148 | |
a487deae | 149 | const Int_t Nclusters = fCaloClusters->GetEntriesFast(); |
d41a0b1c | 150 | |
73e2fd59 | 151 | for (Int_t ic = 0; ic < Nclusters && NpartAcc < NMAX; ++ic) { |
f09b22c5 | 152 | |
a487deae | 153 | // exlcuding lead particles |
154 | if (ic == -maxPartIds[0]-1 || ic == -maxPartIds[1]-1) | |
155 | continue; | |
156 | ||
157 | AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic)); | |
158 | ||
159 | if (!cluster) { | |
160 | AliError(Form("%s: Could not receive cluster %d", GetName(), ic)); | |
161 | continue; | |
162 | } | |
163 | ||
164 | if (!AcceptCluster(cluster)) | |
165 | continue; | |
166 | ||
167 | TLorentzVector nPart; | |
168 | cluster->GetMomentum(nPart, fVertex); | |
f09b22c5 | 169 | |
a487deae | 170 | rhovec[NpartAcc] = nPart.Pt(); |
171 | ++NpartAcc; | |
db91838f | 172 | } |
f09b22c5 | 173 | } |
174 | ||
73e2fd59 | 175 | if (NpartAcc == NMAX) { |
176 | AliError(Form("%s: NpartAcc >= %d", GetName(), NMAX)); | |
177 | } | |
a315c08c | 178 | |
73e2fd59 | 179 | Double_t rho = 0; |
180 | ||
181 | if (NpartAcc > 0) { | |
182 | if (fUseMedian) | |
183 | rho = TMath::Median(NpartAcc, rhovec); | |
184 | else | |
185 | rho = TMath::Mean(NpartAcc, rhovec); | |
186 | ||
187 | Float_t maxEta = fTrackMaxEta; | |
188 | Float_t minEta = fTrackMinEta; | |
189 | Float_t maxPhi = fTrackMaxPhi; | |
190 | Float_t minPhi = fTrackMinPhi; | |
191 | ||
192 | if (maxPhi > TMath::Pi() * 2) maxPhi = TMath::Pi() * 2; | |
193 | if (minPhi < 0) minPhi = 0; | |
194 | ||
195 | Double_t area = (maxEta - minEta) * (maxPhi - minPhi); | |
196 | ||
197 | if (area > 0) { | |
198 | rho *= NpartAcc / area; | |
199 | } | |
200 | else { | |
201 | AliError(Form("%s: Area <= 0 %f", GetName(), area)); | |
202 | return kFALSE; | |
203 | } | |
f09b22c5 | 204 | } |
603ca74b | 205 | |
73e2fd59 | 206 | fRho->SetVal(rho); |
207 | ||
a487deae | 208 | if (fScaleFunction) { |
209 | Double_t rhoScaled = rho * GetScaleFactor(fCent); | |
210 | fRhoScaled->SetVal(rhoScaled); | |
d41a0b1c | 211 | } |
d41a0b1c | 212 | |
a487deae | 213 | return kTRUE; |
d41a0b1c | 214 | } |