]>
Commit | Line | Data |
---|---|---|
5b5bad1d | 1 | // $Id$ |
192fc3f4 | 2 | // |
f09b22c5 | 3 | // Calculation of rho from a collection of jets. |
4 | // If scale function is given the scaled rho will be exported | |
5 | // with the name as "fRhoName".apppend("_Scaled"). | |
192fc3f4 | 6 | // |
7 | // Authors: R.Reed, S.Aiola | |
8 | ||
5b5bad1d | 9 | #include "AliAnalysisTaskRho.h" |
10 | ||
020052e4 | 11 | #include <TClonesArray.h> |
192fc3f4 | 12 | #include <TF1.h> |
297edd60 | 13 | #include <TH1F.h> |
14 | #include <TH2F.h> | |
15 | #include <TList.h> | |
c60e0a21 | 16 | #include <TMath.h> |
020052e4 | 17 | |
020052e4 | 18 | #include "AliAnalysisManager.h" |
020052e4 | 19 | #include "AliCentrality.h" |
20 | #include "AliEmcalJet.h" | |
297edd60 | 21 | #include "AliLog.h" |
22 | #include "AliRhoParameter.h" | |
020052e4 | 23 | #include "AliVCluster.h" |
297edd60 | 24 | #include "AliVEventHandler.h" |
020052e4 | 25 | |
020052e4 | 26 | ClassImp(AliAnalysisTaskRho) |
27 | ||
28 | //________________________________________________________________________ | |
29 | AliAnalysisTaskRho::AliAnalysisTaskRho() : | |
192fc3f4 | 30 | AliAnalysisTaskRhoBase(), |
6a12db52 | 31 | fTracksName(), |
32 | fJetsName(), | |
192fc3f4 | 33 | fRhoScaledName(""), |
34 | fPhiMin(0), | |
35 | fPhiMax(0), | |
36 | fEtaMin(0), | |
37 | fEtaMax(0), | |
38 | fAreaCut(0), | |
6a12db52 | 39 | fAreaEmcCut(0), |
c60e0a21 | 40 | fNExclLeadJets(0), |
192fc3f4 | 41 | fScaleFunction(0), |
c60e0a21 | 42 | fCreateHisto(kFALSE), |
f09b22c5 | 43 | fTracks(0), |
44 | fJets(0), | |
020052e4 | 45 | fOutputList(0), |
46 | fHistCentrality(0), | |
47 | fHistJetPt(0), | |
192fc3f4 | 48 | fHistJetArea(0), |
020052e4 | 49 | fHistRhovsCent(0), |
192fc3f4 | 50 | fHistDeltaRhovsCent(0), |
51 | fHistDeltaRhoScalevsCent(0), | |
020052e4 | 52 | fHistJetPtvsCent(0), |
192fc3f4 | 53 | fHistJetAreavsCent(0), |
020052e4 | 54 | fHistNjetvsCent(0), |
55 | fHistRhovsNtrack(0), | |
192fc3f4 | 56 | fHistDeltaRhovsNtrack(0), |
57 | fHistDeltaRhoScalevsNtrack(0), | |
020052e4 | 58 | fHistJetPtvsNtrack(0), |
59 | fHistJetAreavsNtrack(0), | |
60 | fHistNjetvsNtrack(0), | |
c60e0a21 | 61 | fRhoScaled(0) |
020052e4 | 62 | { |
6a12db52 | 63 | // Constructor. |
020052e4 | 64 | } |
65 | ||
5d845887 | 66 | //________________________________________________________________________ |
67 | AliAnalysisTaskRho::AliAnalysisTaskRho(const char *name, Bool_t histo) : | |
68 | AliAnalysisTaskRhoBase(name), | |
69 | fTracksName("tracks"), | |
70 | fJetsName("KtJets"), | |
5d845887 | 71 | fRhoScaledName(""), |
72 | fPhiMin(0), | |
f09b22c5 | 73 | fPhiMax(TMath::TwoPi()), |
74 | fEtaMin(-0.5), | |
75 | fEtaMax(+0.5), | |
76 | fAreaCut(0.01), | |
6a12db52 | 77 | fAreaEmcCut(0), |
f09b22c5 | 78 | fNExclLeadJets(1), |
5d845887 | 79 | fScaleFunction(0), |
80 | fCreateHisto(histo), | |
f09b22c5 | 81 | fTracks(0), |
82 | fJets(0), | |
5d845887 | 83 | fOutputList(0), |
84 | fHistCentrality(0), | |
85 | fHistJetPt(0), | |
86 | fHistJetArea(0), | |
87 | fHistRhovsCent(0), | |
88 | fHistDeltaRhovsCent(0), | |
89 | fHistDeltaRhoScalevsCent(0), | |
90 | fHistJetPtvsCent(0), | |
91 | fHistJetAreavsCent(0), | |
92 | fHistNjetvsCent(0), | |
93 | fHistRhovsNtrack(0), | |
94 | fHistDeltaRhovsNtrack(0), | |
95 | fHistDeltaRhoScalevsNtrack(0), | |
96 | fHistJetPtvsNtrack(0), | |
97 | fHistJetAreavsNtrack(0), | |
98 | fHistNjetvsNtrack(0), | |
99 | fRhoScaled(0) | |
100 | { | |
6a12db52 | 101 | // Constructor. |
5d845887 | 102 | |
103 | if (fCreateHisto) | |
104 | DefineOutput(1, TList::Class()); | |
105 | } | |
106 | ||
020052e4 | 107 | //________________________________________________________________________ |
108 | void AliAnalysisTaskRho::UserCreateOutputObjects() | |
109 | { | |
5b5bad1d | 110 | // User create output objects, called at the beginning of the analysis. |
111 | ||
192fc3f4 | 112 | AliAnalysisTaskRhoBase::UserCreateOutputObjects(); |
020052e4 | 113 | |
f09b22c5 | 114 | if (fScaleFunction) { |
115 | fRhoScaledName = fRhoName; | |
116 | fRhoScaledName += "_Scaled"; | |
117 | fRhoScaled = new AliRhoParameter(fRhoScaledName, 0); | |
118 | } | |
020052e4 | 119 | |
5d845887 | 120 | if (!fCreateHisto) |
121 | return; | |
122 | ||
020052e4 | 123 | OpenFile(1); |
124 | fOutputList = new TList(); | |
125 | fOutputList->SetOwner(); | |
126 | ||
127 | fHistCentrality = new TH1F("Centrality", "Centrality", 101, -1, 100); | |
128 | fHistRhovsCent = new TH2F("RhovsCent", "RhovsCent", 101, -1, 100, 500, 0, 500); | |
129 | fHistDeltaRhovsCent = new TH2F("DeltaRhovsCent", "DetlaRhovsCent", 101, -1, 100, 500, -250, 250); | |
130 | fHistDeltaRhoScalevsCent = new TH2F("DeltaRhoScalevsCent", "DeltaRhoScalevsCent", 101, -1, 100, 500, -250, 250); | |
131 | fHistJetPtvsCent = new TH2F("JetPtvsCent", "JetPtvsCent", 101, -1, 100, 200, 0, 500); | |
132 | fHistJetAreavsCent = new TH2F("JetAreavsCent", "JetAreavsCent", 101, -1, 100, 100, 0, 1.0); | |
133 | fHistNjetvsCent = new TH2F("NjetvsCent", "NjetvsCent", 101, -1, 100, 100, 0, 100); | |
134 | ||
135 | fHistRhovsNtrack = new TH2F("RhovsNtrack", "RhovsNtrack", 500, 0, 2500, 500, 0, 500); | |
136 | fHistDeltaRhovsNtrack = new TH2F("DeltaRhovsNtrack", "DeltaRhovsNtrack", 500, 0, 2500, 500, -250, 250); | |
137 | fHistDeltaRhoScalevsNtrack = new TH2F("DeltaRhoScalevsNtrack", "DeltaRhoScalevsNtrack", 500, 0, 2500, 500, -250, 250); | |
138 | fHistJetPtvsNtrack = new TH2F("JetPtvsNtrack", "JetPtvsNtrack", 500, 0, 2500, 200, 0, 500); | |
139 | fHistJetAreavsNtrack = new TH2F("JetAreavsNtrack", "JetAreavsNtrack", 500, 0, 2500, 100, 0, 1.0); | |
140 | fHistNjetvsNtrack = new TH2F("NjetvsNtrack", "rNjetvsNtrack", 500, 0, 2500, 100, 0, 100); | |
141 | ||
142 | fHistJetPt = new TH1F("JetPt", "Jet Pt", 100, 0, 250); | |
143 | fHistJetArea = new TH1F("JetArea", "Jet Area", 100, 0.0, 1.0); | |
144 | ||
145 | fOutputList->Add(fHistCentrality); | |
146 | fOutputList->Add(fHistRhovsCent); | |
147 | fOutputList->Add(fHistJetPt); | |
148 | fOutputList->Add(fHistJetArea); | |
149 | fOutputList->Add(fHistDeltaRhovsCent); | |
150 | fOutputList->Add(fHistDeltaRhoScalevsCent); | |
151 | fOutputList->Add(fHistJetPtvsCent); | |
152 | fOutputList->Add(fHistJetAreavsCent); | |
153 | fOutputList->Add(fHistNjetvsCent); | |
154 | ||
155 | fOutputList->Add(fHistRhovsNtrack); | |
156 | fOutputList->Add(fHistDeltaRhovsNtrack); | |
157 | fOutputList->Add(fHistDeltaRhoScalevsNtrack); | |
158 | fOutputList->Add(fHistJetPtvsNtrack); | |
159 | fOutputList->Add(fHistJetAreavsNtrack); | |
160 | fOutputList->Add(fHistNjetvsNtrack); | |
161 | ||
162 | PostData(1, fOutputList); | |
020052e4 | 163 | } |
164 | ||
020052e4 | 165 | //________________________________________________________________________ |
166 | void AliAnalysisTaskRho::UserExec(Option_t *) | |
167 | { | |
168 | // Main loop, called for each event. | |
e44e8726 | 169 | |
f09b22c5 | 170 | if (!fIsInit) { |
171 | ExecOnce(); | |
172 | fIsInit = 1; | |
173 | } | |
020052e4 | 174 | |
a5621834 | 175 | fRho->SetVal(0); |
176 | if (fRhoScaled) | |
177 | fRhoScaled->SetVal(0); | |
178 | ||
e44e8726 | 179 | if (!fJets) |
180 | return; | |
181 | ||
f09b22c5 | 182 | DetermineCent(); |
020052e4 | 183 | |
f09b22c5 | 184 | const Int_t Njets = fJets->GetEntries(); |
020052e4 | 185 | |
f09b22c5 | 186 | Int_t maxJetIds[] = {-1, -1}; |
187 | Float_t maxJetPts[] = { 0, 0}; | |
c60e0a21 | 188 | |
c60e0a21 | 189 | if (fNExclLeadJets > 0) { |
f09b22c5 | 190 | for (Int_t ij = 0; ij < Njets; ++ij) { |
191 | AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(ij)); | |
c60e0a21 | 192 | if (!jet) { |
f09b22c5 | 193 | AliError(Form("%s: Could not receive jet %d", GetName(), ij)); |
c60e0a21 | 194 | continue; |
195 | } | |
ed777bb8 | 196 | |
197 | if (jet->Area() < fAreaCut) | |
198 | continue; | |
199 | if (jet->AreaEmc()<fAreaEmcCut) | |
200 | continue; | |
201 | if ((jet->Phi() < fPhiMin) || (jet->Phi() > fPhiMax)) | |
202 | continue; | |
203 | if ((jet->Eta() < fEtaMin) || (jet->Eta() > fEtaMax)) | |
204 | continue; | |
205 | ||
c60e0a21 | 206 | if (jet->Pt() > maxJetPts[0]) { |
207 | maxJetPts[1] = maxJetPts[0]; | |
5b5bad1d | 208 | maxJetIds[1] = maxJetIds[0]; |
c60e0a21 | 209 | maxJetPts[0] = jet->Pt(); |
210 | maxJetIds[0] = ij; | |
f09b22c5 | 211 | } else if (jet->Pt() > maxJetPts[1]) { |
c60e0a21 | 212 | maxJetPts[1] = jet->Pt(); |
213 | maxJetIds[1] = ij; | |
214 | } | |
215 | } | |
216 | if (fNExclLeadJets < 2) { | |
217 | maxJetIds[1] = -1; | |
218 | maxJetPts[1] = -1; | |
219 | } | |
220 | } | |
221 | ||
222 | static Double_t rhovec[999]; | |
020052e4 | 223 | Int_t NjetAcc = 0; |
224 | ||
c60e0a21 | 225 | // push all jets within selected acceptance into stack |
020052e4 | 226 | for (Int_t iJets = 0; iJets < Njets; ++iJets) { |
f09b22c5 | 227 | |
c60e0a21 | 228 | // exlcuding lead jets |
229 | if (iJets == maxJetIds[0] || iJets == maxJetIds[1]) | |
230 | continue; | |
231 | ||
f09b22c5 | 232 | AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(iJets)); |
ed777bb8 | 233 | if (!jet) { |
234 | AliError(Form("%s: Could not receive jet %d", GetName(), iJets)); | |
235 | continue; | |
236 | } | |
c60e0a21 | 237 | |
020052e4 | 238 | if (jet->Area() < fAreaCut) |
239 | continue; | |
6a12db52 | 240 | if (jet->AreaEmc()<fAreaEmcCut) |
241 | continue; | |
020052e4 | 242 | if ((jet->Phi() < fPhiMin) || (jet->Phi() > fPhiMax)) |
243 | continue; | |
244 | if ((jet->Eta() < fEtaMin) || (jet->Eta() > fEtaMax)) | |
245 | continue; | |
c60e0a21 | 246 | |
247 | rhovec[NjetAcc] = jet->Pt() / jet->Area(); | |
f09b22c5 | 248 | ++NjetAcc; |
c60e0a21 | 249 | |
250 | if (fCreateHisto) { | |
251 | // filling histograms | |
f09b22c5 | 252 | const Int_t Ntracks = fTracks->GetEntriesFast(); |
c60e0a21 | 253 | fHistJetPt->Fill(jet->Pt()); |
254 | fHistJetArea->Fill(jet->Area()); | |
255 | fHistJetPtvsCent->Fill(fCent, jet->Pt()); | |
256 | fHistJetPtvsNtrack->Fill(Ntracks, jet->Pt()); | |
257 | fHistJetAreavsCent->Fill(fCent, jet->Area()); | |
258 | fHistJetAreavsNtrack->Fill(Ntracks, jet->Area()); | |
259 | } | |
020052e4 | 260 | } |
192fc3f4 | 261 | |
f09b22c5 | 262 | if (NjetAcc > 0) { |
020052e4 | 263 | //find median value |
f09b22c5 | 264 | Double_t rho0 = TMath::Median(NjetAcc, rhovec); |
c60e0a21 | 265 | fRho->SetVal(rho0); |
f09b22c5 | 266 | Double_t rhoScaled = rho0; |
267 | if (fRhoScaled) { | |
268 | rhoScaled *= GetScaleFactor(fCent); | |
269 | fRhoScaled->SetVal(rhoScaled); | |
270 | } | |
020052e4 | 271 | |
c60e0a21 | 272 | if (fCreateHisto) { |
273 | // filling other histograms | |
f09b22c5 | 274 | Double_t rho = GetRhoFactor(fCent); |
275 | const Int_t Ntracks = fTracks->GetEntriesFast(); | |
c60e0a21 | 276 | fHistRhovsCent->Fill(fCent, rho0); |
f09b22c5 | 277 | fHistDeltaRhovsCent->Fill(fCent, rho0 - rho); |
278 | fHistDeltaRhoScalevsCent->Fill(fCent, rhoScaled - rho); | |
c60e0a21 | 279 | fHistRhovsNtrack->Fill(Ntracks, rho0); |
f09b22c5 | 280 | fHistDeltaRhovsNtrack->Fill(Ntracks, rho0 - rho); |
281 | fHistDeltaRhoScalevsNtrack->Fill(Ntracks, rhoScaled - rho); | |
020052e4 | 282 | } |
020052e4 | 283 | } |
020052e4 | 284 | |
f09b22c5 | 285 | if (fCreateHisto) { |
286 | const Int_t Ntracks = fTracks->GetEntriesFast(); | |
287 | fHistCentrality->Fill(fCent); | |
288 | fHistNjetvsCent->Fill(fCent, NjetAcc); | |
289 | fHistNjetvsNtrack->Fill(Ntracks, NjetAcc); | |
c60e0a21 | 290 | PostData(1, fOutputList); |
f09b22c5 | 291 | } |
c60e0a21 | 292 | } |
020052e4 | 293 | |
f09b22c5 | 294 | //________________________________________________________________________ |
295 | void AliAnalysisTaskRho::ExecOnce() | |
296 | { | |
297 | // Initialize some settings that need to be determined in UserExec. | |
298 | ||
299 | AliAnalysisTaskRhoBase::ExecOnce(); | |
300 | ||
301 | if (fRhoScaled) { | |
302 | // add rho to event if not yet there | |
303 | if (!(InputEvent()->FindListObject(fRhoScaledName))) { | |
304 | InputEvent()->AddObject(fRhoScaled); | |
305 | } else { | |
306 | AliFatal(Form("%s: Container with same name %s already present. Aborting", GetName(), fRhoScaledName.Data())); | |
307 | return; | |
308 | } | |
309 | } | |
310 | ||
311 | if (fCreateHisto) { | |
312 | fTracks = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksName)); | |
313 | if (!fTracks) { | |
314 | AliError(Form("%s: Pointer to tracks %s == 0", GetName(), fTracksName.Data() )); | |
315 | return; | |
316 | } | |
317 | } | |
318 | ||
319 | fJets = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetsName)); | |
320 | if (!fJets) { | |
321 | AliError(Form("%s: Pointer to jets %s == 0", GetName(), fJetsName.Data() )); | |
322 | return; | |
323 | } | |
324 | } | |
325 | ||
326 | //________________________________________________________________________ | |
327 | Double_t AliAnalysisTaskRho::GetScaleFactor(Double_t cent) | |
328 | { | |
329 | // Get scale factor. | |
330 | ||
331 | Double_t scale = 1; | |
332 | if (fScaleFunction) | |
333 | scale = fScaleFunction->Eval(cent); | |
334 | return scale; | |
335 | } |