3 // Calculation of rho, method: median all particle pt / multiplicity density.
7 #include "AliAnalysisTaskRhoAverage.h"
9 #include <TClonesArray.h>
13 #include "AliRhoParameter.h"
14 #include "AliVCluster.h"
15 #include "AliVTrack.h"
17 ClassImp(AliAnalysisTaskRhoAverage)
19 //________________________________________________________________________
20 AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage() :
21 AliAnalysisTaskRhoBase("AliAnalysisTaskRhoAverage"),
26 // Default constructor.
29 //________________________________________________________________________
30 AliAnalysisTaskRhoAverage::AliAnalysisTaskRhoAverage(const char *name, Bool_t histo) :
31 AliAnalysisTaskRhoBase(name, histo),
39 //________________________________________________________________________
40 Bool_t AliAnalysisTaskRhoAverage::Run()
44 const Int_t NMAX = 9999;
45 static Double_t rhovec[NMAX];
48 Int_t maxPartIds[] = {0, 0};
49 Float_t maxPartPts[] = {0, 0};
51 // push all jets within selected acceptance into stack
53 if (fNExclLeadPart > 0) {
55 if (fTracks && (fRhoType == 0 || fRhoType == 1)) {
57 const Int_t Ntracks = fTracks->GetEntriesFast();
59 for (Int_t it = 0; it < Ntracks; ++it) {
61 AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it));
64 AliError(Form("%s: Could not receive track %d", GetName(), it));
68 if (!AcceptTrack(track))
71 if (track->Pt() > maxPartPts[0]) {
72 maxPartPts[1] = maxPartPts[0];
73 maxPartIds[1] = maxPartIds[0];
74 maxPartPts[0] = track->Pt();
77 else if (track->Pt() > maxPartPts[1]) {
78 maxPartPts[1] = track->Pt();
84 if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) {
86 const Int_t Nclusters = fCaloClusters->GetEntriesFast();
88 for (Int_t ic = 0; ic < Nclusters; ++ic) {
90 AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic));
93 AliError(Form("%s: Could not receive cluster %d", GetName(), ic));
97 if (!AcceptCluster(cluster))
100 TLorentzVector nPart;
101 cluster->GetMomentum(nPart, fVertex);
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;
109 else if (nPart.Pt() > maxPartPts[1]) {
110 maxPartPts[1] = nPart.Pt();
111 maxPartIds[1] = -ic-1;
116 if (fNExclLeadPart < 2) {
122 if (fTracks && (fRhoType == 0 || fRhoType == 1)) {
124 const Int_t Ntracks = fTracks->GetEntriesFast();
126 for (Int_t it = 0; it < Ntracks && NpartAcc < NMAX; ++it) {
128 // exlcuding lead particles
129 if (it == maxPartIds[0]-1 || it == maxPartIds[1]-1)
132 AliVTrack *track = static_cast<AliVTrack*>(fTracks->At(it));
135 AliError(Form("%s: Could not receive track %d", GetName(), it));
139 if (!AcceptTrack(track))
142 rhovec[NpartAcc] = track->Pt();
147 if (fCaloClusters && (fRhoType == 0 || fRhoType == 2)) {
149 const Int_t Nclusters = fCaloClusters->GetEntriesFast();
151 for (Int_t ic = 0; ic < Nclusters && NpartAcc < NMAX; ++ic) {
153 // exlcuding lead particles
154 if (ic == -maxPartIds[0]-1 || ic == -maxPartIds[1]-1)
157 AliVCluster *cluster = static_cast<AliVCluster*>(fCaloClusters->At(ic));
160 AliError(Form("%s: Could not receive cluster %d", GetName(), ic));
164 if (!AcceptCluster(cluster))
167 TLorentzVector nPart;
168 cluster->GetMomentum(nPart, fVertex);
170 rhovec[NpartAcc] = nPart.Pt();
175 if (NpartAcc == NMAX) {
176 AliError(Form("%s: NpartAcc >= %d", GetName(), NMAX));
183 rho = TMath::Median(NpartAcc, rhovec);
185 rho = TMath::Mean(NpartAcc, rhovec);
187 Float_t maxEta = fTrackMaxEta;
188 Float_t minEta = fTrackMinEta;
189 Float_t maxPhi = fTrackMaxPhi;
190 Float_t minPhi = fTrackMinPhi;
192 if (maxPhi > TMath::Pi() * 2) maxPhi = TMath::Pi() * 2;
193 if (minPhi < 0) minPhi = 0;
195 Double_t area = (maxEta - minEta) * (maxPhi - minPhi);
198 rho *= NpartAcc / area;
201 AliError(Form("%s: Area <= 0 %f", GetName(), area));
208 if (fScaleFunction) {
209 Double_t rhoScaled = rho * GetScaleFactor(fCent);
210 fRhoScaled->SetVal(rhoScaled);