]>
Commit | Line | Data |
---|---|---|
f3050824 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | /* $Id:$ */ | |
6ef5bfa4 | 17 | |
f3050824 | 18 | #include <TROOT.h> |
19 | #include <TSystem.h> | |
20 | #include <TChain.h> | |
21 | #include <TFile.h> | |
22 | #include <TList.h> | |
23 | #include <TH1I.h> | |
24 | #include <TH1F.h> | |
25 | #include <TH2F.h> | |
26 | #include <TCanvas.h> | |
27 | #include <TVector3.h> | |
28 | #include <TLorentzVector.h> | |
29 | #include <TMath.h> | |
6ef5bfa4 | 30 | #include <TTree.h> |
31 | #include <TBranch.h> | |
f3050824 | 32 | |
33 | #include "AliAnalysisTaskUE.h" | |
34 | #include "AliAnalysisManager.h" | |
35 | #include "AliMCEventHandler.h" | |
36 | #include "AliAODEvent.h" | |
37 | #include "AliAODInputHandler.h" | |
38 | #include "AliAODHandler.h" | |
39 | #include "AliStack.h" | |
40 | #include "AliAODJet.h" | |
41 | #include "AliAODTrack.h" | |
42 | ||
43 | #include "AliLog.h" | |
44 | ||
45 | // | |
46 | // Analysis class for Underlying Event studies | |
47 | // | |
48 | // Look for correlations on the tranverse regions to | |
49 | // the leading charged jet | |
50 | // | |
51 | // This class needs as input AOD with track and Jets | |
52 | // the output is a list of histograms | |
53 | // | |
54 | // AOD can be either connected to the InputEventHandler | |
55 | // for a chain of AOD files | |
56 | // or | |
57 | // to the OutputEventHandler | |
58 | // for a chain of ESD files, so this case class should be | |
59 | // in the train after the Jet finder | |
60 | // | |
61 | // Arian.Abrahantes.Quintana@cern.ch | |
62 | // Ernesto.Lopez.Torres@cern.ch | |
63 | // | |
64 | ||
65 | ||
66 | ClassImp( AliAnalysisTaskUE) | |
67 | ||
68 | //////////////////////////////////////////////////////////////////////// | |
69 | ||
70 | ||
71 | //____________________________________________________________________ | |
72 | AliAnalysisTaskUE:: AliAnalysisTaskUE(const char* name): | |
6ef5bfa4 | 73 | AliAnalysisTask(name, ""), |
74 | fDebug(kFALSE), | |
75 | fAOD(0x0), | |
76 | fAODjets(0x0), | |
77 | fListOfHistos(0x0), | |
78 | fBinsPtInHist(30), | |
79 | fMinJetPtInHist(0.), | |
80 | fMaxJetPtInHist(300.), | |
81 | fAnaType(1), | |
82 | fRegionType(1), | |
83 | fConeRadius(0.7), | |
84 | fAreaReg(1.5393), // Pi*0.7*0.7 | |
85 | fUseChPartJet(kFALSE), | |
86 | fUseSingleCharge(kFALSE), | |
87 | fUsePositiveCharge(kTRUE), | |
88 | fOrdering(1), | |
89 | fFilterBit(0xFF), | |
90 | fJetsOnFly(kFALSE), | |
91 | fJet1EtaCut(0.2), | |
92 | fJet2DeltaPhiCut(2.616), // 150 degrees | |
93 | fJet2RatioPtCut(0.8), | |
94 | fJet3PtCut(15.), | |
95 | fTrackPtCut(0.), | |
96 | fTrackEtaCut(0.9), | |
97 | fhNJets(0x0), | |
98 | fhEleadingPt(0x0), | |
99 | fhMinRegPtDist(0x0), | |
100 | fhRegionMultMin(0x0), | |
101 | fhMinRegAvePt(0x0), | |
102 | fhMinRegSumPt(0x0), | |
103 | fhMinRegMaxPtPart(0x0), | |
104 | fhMinRegSumPtvsMult(0x0), | |
de6f8090 | 105 | fhdNdEtaPhiDist(0x0), |
6ef5bfa4 | 106 | fhFullRegPartPtDistVsEt(0x0), |
107 | fhTransRegPartPtDistVsEt(0x0), | |
108 | fhRegionSumPtMaxVsEt(0x0), | |
109 | fhRegionMultMax(0x0), | |
110 | fhRegionMultMaxVsEt(0x0), | |
111 | fhRegionSumPtMinVsEt(0x0), //fhRegionMultMin(0x0), | |
112 | fhRegionMultMinVsEt(0x0), | |
113 | fhRegionAveSumPtVsEt(0x0), | |
114 | fhRegionDiffSumPtVsEt(0x0), | |
115 | fhRegionAvePartPtMaxVsEt(0x0), | |
116 | fhRegionAvePartPtMinVsEt(0x0), | |
117 | fhRegionMaxPartPtMaxVsEt(0x0), | |
118 | fSettingsTree(0x0)//, fhValidRegion(0x0) | |
f3050824 | 119 | { |
120 | // Default constructor | |
121 | // Define input and output slots here | |
122 | // Input slot #0 works with a TChain | |
123 | DefineInput(0, TChain::Class()); | |
124 | // Output slot #0 writes into a TList container | |
125 | DefineOutput(0, TList::Class()); | |
126 | } | |
127 | ||
f3050824 | 128 | //____________________________________________________________________ |
129 | void AliAnalysisTaskUE::ConnectInputData(Option_t* /*option*/) | |
130 | { | |
6ef5bfa4 | 131 | // Connect the input data |
f3050824 | 132 | |
6ef5bfa4 | 133 | // We need AOD with tracks and jets. |
134 | // Since AOD can be either connected to the InputEventHandler (input chain fron AOD files) | |
1e996f55 | 135 | // or to the OutputEventHandler ( AOD is create by a previus task in the train ) |
6ef5bfa4 | 136 | // we need to check where it is and get the pointer to AODEvent in the right way |
f3050824 | 137 | |
6ef5bfa4 | 138 | if (fDebug > 1) AliInfo("ConnectInputData() \n"); |
f3050824 | 139 | |
140 | TObject* handler = AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler(); | |
141 | ||
142 | if( handler && handler->InheritsFrom("AliAODInputHandler") ) { | |
6ef5bfa4 | 143 | fAOD = ((AliAODInputHandler*)handler)->GetEvent(); |
144 | if (fDebug > 1) AliInfo(" ==== Tracks from AliAODInputHandler"); | |
145 | // Case when jets are reconstructed on the fly from AOD tracks | |
146 | // (the Jet Finder is using the AliJetAODReader) of InputEventHandler | |
147 | // and put in the OutputEventHandler AOD. Useful whe you want to reconstruct jets with | |
148 | // different parameters to default ones stored in the AOD or to use a different algorithm | |
149 | if( fJetsOnFly ) { | |
f3050824 | 150 | handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler(); |
151 | if( handler && handler->InheritsFrom("AliAODHandler") ) { | |
6ef5bfa4 | 152 | fAODjets = ((AliAODHandler*)handler)->GetAOD(); |
153 | if (fDebug > 1) AliInfo(" ==== Jets from AliAODHandler"); | |
f3050824 | 154 | } |
6ef5bfa4 | 155 | } else { |
156 | fAODjets = fAOD; | |
157 | if (fDebug > 1) AliInfo(" ==== Jets from AliAODInputHandler"); | |
158 | } | |
159 | } else { | |
160 | handler = AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler(); | |
161 | if( handler && handler->InheritsFrom("AliAODHandler") ) { | |
162 | fAOD = ((AliAODHandler*)handler)->GetAOD(); | |
163 | fAODjets = fAOD; | |
164 | if (fDebug > 1) AliInfo(" ==== Tracks and Jets from AliAODHandler"); | |
165 | } else { | |
166 | AliFatal("I can't get any AOD Event Handler"); | |
167 | return; | |
168 | } | |
169 | } | |
f3050824 | 170 | } |
171 | ||
172 | //____________________________________________________________________ | |
173 | void AliAnalysisTaskUE::CreateOutputObjects() | |
174 | { | |
6ef5bfa4 | 175 | // Create the output container |
176 | // | |
f3050824 | 177 | if (fDebug > 1) AliInfo("CreateOutPutData()"); |
178 | // | |
179 | // Histograms | |
1e996f55 | 180 | |
181 | OpenFile(0); | |
f3050824 | 182 | CreateHistos(); |
1e996f55 | 183 | // fListOfHistos->SetOwner(kTRUE); |
184 | ||
185 | ||
f3050824 | 186 | } |
187 | ||
188 | ||
189 | //____________________________________________________________________ | |
190 | void AliAnalysisTaskUE::Exec(Option_t */*option*/) | |
191 | { | |
6ef5bfa4 | 192 | // Execute analysis for current event |
193 | // | |
194 | if ( fDebug > 3 ) AliInfo( " Processing event..." ); | |
195 | AnalyseUE(); | |
196 | ||
f3050824 | 197 | // Post the data |
198 | PostData(0, fListOfHistos); | |
199 | } | |
f3050824 | 200 | |
201 | //____________________________________________________________________ | |
202 | void AliAnalysisTaskUE::AnalyseUE() | |
203 | { | |
204 | // | |
205 | // Look for correlations on the tranverse regions to | |
206 | // the leading charged jet | |
207 | // | |
6ef5bfa4 | 208 | |
f3050824 | 209 | // ------------------------------------------------ |
210 | // Find Leading Jets 1,2,3 | |
211 | // (could be skipped if Jets are sort by Pt...) | |
212 | Double_t maxPtJet1 = 0.; | |
213 | Int_t index1 = -1; | |
214 | Double_t maxPtJet2 = 0.; // jet 2 need for back to back inclusive | |
215 | Int_t index2 = -1; | |
216 | Double_t maxPtJet3 = 0.; // jet 3 need for back to back exclusive | |
217 | Int_t index3 = -1; | |
6ef5bfa4 | 218 | TVector3 jetVect[3]; |
219 | Int_t nJets = 0; | |
220 | ||
221 | if( !fUseChPartJet ) { | |
222 | ||
223 | // Use AOD Jets | |
224 | nJets = fAODjets->GetNJets(); | |
225 | // printf("AOD %d jets \n", nJets); | |
226 | for( Int_t i=0; i<nJets; ++i ) { | |
227 | AliAODJet* jet = fAODjets->GetJet(i); | |
228 | Double_t jetPt = jet->Pt();//*1.666; // FIXME Jet Pt Correction ?????!!! | |
229 | if( jetPt > maxPtJet1 ) { | |
230 | maxPtJet3 = maxPtJet2; index3 = index2; | |
231 | maxPtJet2 = maxPtJet1; index2 = index1; | |
232 | maxPtJet1 = jetPt; index1 = i; | |
233 | } else if( jetPt > maxPtJet2 ) { | |
234 | maxPtJet3 = maxPtJet2; index3 = index2; | |
235 | maxPtJet2 = jetPt; index2 = i; | |
236 | } else if( jetPt > maxPtJet3 ) { | |
237 | maxPtJet3 = jetPt; index3 = i; | |
238 | } | |
239 | } | |
240 | if( index1 != -1 ) { | |
241 | AliAODJet* jet = fAODjets->GetJet(index1); | |
242 | jetVect[0].SetXYZ(jet->Px(), jet->Py(), jet->Pz()); | |
243 | } | |
244 | if( index2 != -1 ) { | |
245 | AliAODJet* jet = fAODjets->GetJet(index2); | |
246 | jetVect[1].SetXYZ(jet->Px(), jet->Py(), jet->Pz()); | |
247 | } | |
248 | if( index3 != -1 ) { | |
249 | AliAODJet* jet = fAODjets->GetJet(index3); | |
250 | jetVect[2].SetXYZ(jet->Px(), jet->Py(), jet->Pz()); | |
251 | } | |
252 | ||
253 | } else { | |
254 | ||
255 | // Use "Charged Particle Jets" | |
256 | TObjArray* jets = FindChargedParticleJets(); | |
257 | if( jets ) { | |
258 | nJets = jets->GetEntriesFast(); | |
259 | if( nJets > 0 ) { | |
260 | index1 = 0; | |
261 | AliAODJet* jet = (AliAODJet*)jets->At(0); | |
262 | maxPtJet1 = jet->Pt(); | |
263 | jetVect[0].SetXYZ(jet->Px(), jet->Py(), jet->Pz()); | |
264 | } | |
265 | if( nJets > 1 ) { | |
266 | index2 = 1; | |
267 | AliAODJet* jet = (AliAODJet*)jets->At(1); | |
268 | maxPtJet1 = jet->Pt(); | |
269 | jetVect[1].SetXYZ(jet->Px(), jet->Py(), jet->Pz()); | |
270 | } | |
271 | if( nJets > 2 ) { | |
272 | index3 = 2; | |
273 | AliAODJet* jet = (AliAODJet*)jets->At(2); | |
274 | maxPtJet1 = jet->Pt(); | |
275 | jetVect[2].SetXYZ(jet->Px(), jet->Py(), jet->Pz()); | |
276 | } | |
277 | ||
278 | jets->Delete(); | |
279 | delete jets; | |
f3050824 | 280 | } |
281 | } | |
6ef5bfa4 | 282 | |
f3050824 | 283 | |
284 | fhNJets->Fill(nJets); | |
285 | ||
6ef5bfa4 | 286 | if( fDebug > 1 ) { |
287 | if( index1 < 0 ) { | |
288 | AliInfo("\n Skipping Event, not jet found..."); | |
289 | return; | |
290 | } else | |
291 | AliInfo(Form("\n Pt Leading Jet = %6.1f eta=%5.3f ", maxPtJet1, jetVect[0].Eta() )); | |
292 | } | |
293 | ||
f3050824 | 294 | |
295 | // ---------------------------------------------- | |
6ef5bfa4 | 296 | // Cut events by jets topology |
f3050824 | 297 | // fAnaType: |
6ef5bfa4 | 298 | // 1 = inclusive, |
f3050824 | 299 | // - Jet1 |eta| < fJet1EtaCut |
300 | // 2 = back to back inclusive | |
301 | // - fulfill case 1 | |
302 | // - |Jet1.Phi - Jet2.Phi| > fJet2DeltaPhiCut | |
303 | // - Jet2.Pt/Jet1Pt > fJet2RatioPtCut | |
6ef5bfa4 | 304 | // 3 = back to back exclusive |
f3050824 | 305 | // - fulfill case 2 |
306 | // - Jet3.Pt < fJet3PtCut | |
307 | ||
6ef5bfa4 | 308 | if( index1 < 0 || TMath::Abs(jetVect[0].Eta()) > fJet1EtaCut) { |
309 | if( fDebug > 1 ) AliInfo("\n Skipping Event...Jet1 |eta| > fJet1EtaCut"); | |
f3050824 | 310 | return; |
311 | } | |
f3050824 | 312 | // back to back inclusive |
6ef5bfa4 | 313 | if( fAnaType > 1 && index2 == -1 ) { |
314 | if( fDebug > 1 ) AliInfo("\n Skipping Event... no second Jet found"); | |
315 | return; | |
316 | } | |
317 | if( fAnaType > 1 && index2 > -1 ) { | |
f3050824 | 318 | if( TMath::Abs(jetVect[0].DeltaPhi(jetVect[1])) < fJet2DeltaPhiCut || |
6ef5bfa4 | 319 | maxPtJet2/maxPtJet1 < fJet2RatioPtCut ) { |
320 | if( fDebug > 1 ) AliInfo("\n Skipping Event... |Jet1.Phi - Jet2.Phi| < fJet2DeltaPhiCut"); | |
321 | return; | |
f3050824 | 322 | } |
f3050824 | 323 | } |
f3050824 | 324 | // back to back exclusive |
6ef5bfa4 | 325 | if( fAnaType > 2 && index3 > -1 ) { |
326 | if( maxPtJet3 > fJet3PtCut ) { | |
327 | if( fDebug > 1 ) AliInfo("\n Skipping Event... Jet3.Pt > fJet3PtCut "); | |
f3050824 | 328 | return; |
329 | } | |
f3050824 | 330 | } |
f3050824 | 331 | |
f3050824 | 332 | fhEleadingPt->Fill( maxPtJet1 ); |
6ef5bfa4 | 333 | //Area for Normalization Purpose at Display histos |
334 | SetRegionArea(jetVect); | |
335 | ||
f3050824 | 336 | // ---------------------------------------------- |
337 | // Find max and min regions | |
338 | Double_t sumPtRegionPosit = 0.; | |
339 | Double_t sumPtRegionNegat = 0.; | |
340 | Double_t maxPartPtRegion = 0.; | |
341 | Int_t nTrackRegionPosit = 0; | |
342 | Int_t nTrackRegionNegat = 0; | |
343 | static const Double_t k270rad = 270.*TMath::Pi()/180.; | |
344 | ||
345 | Int_t nTracks = fAOD->GetNTracks(); | |
346 | for (Int_t ipart=0; ipart<nTracks; ++ipart) { | |
347 | AliAODTrack* part = fAOD->GetTrack( ipart ); | |
6ef5bfa4 | 348 | if ( !part->TestFilterBit(fFilterBit) ) continue; // track cut selection |
349 | // PID Selection: Reject everything but hadrons | |
350 | Bool_t isHadron = part->GetMostProbablePID()==AliAODTrack::kPion || | |
351 | part->GetMostProbablePID()==AliAODTrack::kKaon || | |
352 | part->GetMostProbablePID()==AliAODTrack::kProton; | |
353 | if ( !isHadron ) continue; | |
354 | ||
355 | if ( !part->Charge() ) continue; //Only charged | |
356 | if ( fUseSingleCharge ) { // Charge selection | |
357 | if ( fUsePositiveCharge && part->Charge() < 0.) continue; // keep Positives | |
358 | if ( !fUsePositiveCharge && part->Charge() > 0.) continue; // keep Negatives | |
359 | } | |
360 | ||
f3050824 | 361 | if ( part->Pt() < fTrackPtCut ) continue; |
6ef5bfa4 | 362 | |
f3050824 | 363 | TVector3 partVect(part->Px(), part->Py(), part->Pz()); |
364 | ||
365 | Double_t deltaPhi = jetVect[0].DeltaPhi(partVect)+k270rad; | |
366 | if( deltaPhi > 2.*TMath::Pi() ) deltaPhi-= 2.*TMath::Pi(); | |
de6f8090 | 367 | fhdNdEtaPhiDist->Fill( deltaPhi ); |
f3050824 | 368 | fhFullRegPartPtDistVsEt->Fill( part->Pt(), maxPtJet1 ); |
6ef5bfa4 | 369 | |
f3050824 | 370 | Int_t region = IsTrackInsideRegion( jetVect, &partVect ); |
371 | ||
372 | if (region > 0) { | |
6ef5bfa4 | 373 | if( maxPartPtRegion < part->Pt() ) maxPartPtRegion = part->Pt(); |
374 | sumPtRegionPosit += part->Pt(); | |
375 | nTrackRegionPosit++; | |
376 | fhTransRegPartPtDistVsEt->Fill( part->Pt(), maxPtJet1 ); | |
f3050824 | 377 | } |
378 | if (region < 0) { | |
6ef5bfa4 | 379 | if( maxPartPtRegion < part->Pt() ) maxPartPtRegion = part->Pt(); |
380 | sumPtRegionNegat += part->Pt(); | |
381 | nTrackRegionNegat++; | |
382 | fhTransRegPartPtDistVsEt->Fill( part->Pt(), maxPtJet1 ); | |
f3050824 | 383 | } |
384 | } | |
6ef5bfa4 | 385 | |
f3050824 | 386 | //How quantities will be sorted before Fill Min and Max Histogram |
387 | // 1=Plots will be CDF-like | |
388 | // 2=Plots will be Marchesini-like | |
6ef5bfa4 | 389 | if( fOrdering == 1 ) { |
390 | if( sumPtRegionPosit > sumPtRegionNegat ) { | |
391 | FillSumPtRegion( maxPtJet1, sumPtRegionPosit/fAreaReg, sumPtRegionNegat/fAreaReg ); | |
f3050824 | 392 | } else { |
6ef5bfa4 | 393 | FillSumPtRegion( maxPtJet1, sumPtRegionNegat/fAreaReg, sumPtRegionPosit/fAreaReg ); |
f3050824 | 394 | } |
395 | if (nTrackRegionPosit > nTrackRegionNegat ) { | |
6ef5bfa4 | 396 | FillMultRegion( maxPtJet1, nTrackRegionPosit/fAreaReg, nTrackRegionNegat/fAreaReg, sumPtRegionNegat/fAreaReg ); |
f3050824 | 397 | } else { |
6ef5bfa4 | 398 | FillMultRegion( maxPtJet1, nTrackRegionNegat/fAreaReg, nTrackRegionPosit/fAreaReg, sumPtRegionPosit/fAreaReg ); |
f3050824 | 399 | } |
6ef5bfa4 | 400 | } else if( fOrdering == 2 ) { |
f3050824 | 401 | if (sumPtRegionPosit > sumPtRegionNegat) { |
6ef5bfa4 | 402 | FillSumPtRegion( maxPtJet1, sumPtRegionPosit/fAreaReg, sumPtRegionNegat/fAreaReg ); |
403 | FillMultRegion( maxPtJet1, nTrackRegionPosit/fAreaReg, nTrackRegionNegat/fAreaReg, sumPtRegionNegat/fAreaReg ); | |
f3050824 | 404 | } else { |
6ef5bfa4 | 405 | FillSumPtRegion( maxPtJet1, sumPtRegionNegat/fAreaReg, sumPtRegionPosit/fAreaReg ); |
406 | FillMultRegion( maxPtJet1, nTrackRegionNegat/fAreaReg, nTrackRegionPosit/fAreaReg, sumPtRegionPosit/fAreaReg ); | |
f3050824 | 407 | } |
408 | } | |
409 | ||
410 | Double_t avePosRegion = (nTrackRegionPosit) ? sumPtRegionPosit/nTrackRegionPosit : 0.; | |
411 | Double_t aveNegRegion = (nTrackRegionNegat) ? sumPtRegionNegat/nTrackRegionNegat : 0.; | |
6ef5bfa4 | 412 | if( avePosRegion > aveNegRegion ) { |
413 | FillAvePartPtRegion( maxPtJet1, avePosRegion/fAreaReg, aveNegRegion/fAreaReg ); | |
f3050824 | 414 | } else { |
6ef5bfa4 | 415 | FillAvePartPtRegion( maxPtJet1, aveNegRegion/fAreaReg, avePosRegion/fAreaReg ); |
f3050824 | 416 | } |
6ef5bfa4 | 417 | |
f3050824 | 418 | fhRegionMaxPartPtMaxVsEt->Fill(maxPtJet1, maxPartPtRegion ); |
6ef5bfa4 | 419 | |
420 | // Compute pedestal like magnitudes | |
421 | fhRegionDiffSumPtVsEt->Fill(maxPtJet1, TMath::Abs(sumPtRegionPosit-sumPtRegionNegat)/(2.0*fAreaReg)); | |
422 | fhRegionAveSumPtVsEt->Fill(maxPtJet1, (sumPtRegionPosit+sumPtRegionNegat)/(2.0*fAreaReg)); | |
423 | ||
f3050824 | 424 | } |
425 | ||
f3050824 | 426 | //____________________________________________________________________ |
427 | void AliAnalysisTaskUE::FillSumPtRegion( Double_t leadingE, Double_t ptMax, Double_t ptMin ) | |
428 | { | |
6ef5bfa4 | 429 | // Fill sumPt of control regions |
430 | ||
431 | // Max cone | |
432 | fhRegionSumPtMaxVsEt->Fill( leadingE, ptMax ); | |
433 | // Min cone | |
434 | fhRegionSumPtMinVsEt->Fill( leadingE, ptMin ); | |
435 | // MAke distributions for UE comparison with MB data | |
436 | fhMinRegSumPt->Fill(ptMin); | |
f3050824 | 437 | } |
438 | ||
439 | //____________________________________________________________________ | |
440 | void AliAnalysisTaskUE::FillAvePartPtRegion( Double_t leadingE, Double_t ptMax, Double_t ptMin ) | |
441 | { | |
6ef5bfa4 | 442 | // Fill average particle Pt of control regions |
443 | ||
444 | // Max cone | |
445 | fhRegionAvePartPtMaxVsEt->Fill( leadingE, ptMax ); | |
446 | // Min cone | |
447 | fhRegionAvePartPtMinVsEt->Fill( leadingE, ptMin ); | |
448 | // MAke distributions for UE comparison with MB data | |
449 | fhMinRegAvePt->Fill(ptMin); | |
f3050824 | 450 | } |
451 | ||
452 | //____________________________________________________________________ | |
453 | void AliAnalysisTaskUE::FillMultRegion( Double_t leadingE, Double_t nTrackPtmax, Double_t nTrackPtmin, Double_t ptMin ) | |
454 | { | |
6ef5bfa4 | 455 | // Fill Nch multiplicity of control regions |
456 | ||
457 | // Max cone | |
458 | fhRegionMultMaxVsEt->Fill( leadingE, nTrackPtmax ); | |
459 | fhRegionMultMax->Fill( nTrackPtmax ); | |
460 | // Min cone | |
461 | fhRegionMultMinVsEt->Fill( leadingE, nTrackPtmin ); | |
462 | fhRegionMultMin->Fill( nTrackPtmin ); | |
463 | // MAke distributions for UE comparison with MB data | |
464 | fhMinRegSumPtvsMult->Fill(nTrackPtmin,ptMin); | |
f3050824 | 465 | } |
466 | ||
467 | //____________________________________________________________________ | |
468 | Int_t AliAnalysisTaskUE::IsTrackInsideRegion(TVector3 *jetVect, TVector3 *partVect) | |
469 | { | |
470 | // return de region in delta phi | |
471 | // -1 negative delta phi | |
472 | // 1 positive delta phi | |
473 | // 0 outside region | |
474 | static const Double_t k60rad = 60.*TMath::Pi()/180.; | |
475 | static const Double_t k120rad = 120.*TMath::Pi()/180.; | |
476 | ||
477 | Int_t region = 0; | |
478 | if( fRegionType == 1 ) { | |
479 | if( TMath::Abs(partVect->Eta()) > fTrackEtaCut ) return 0; | |
480 | // transverse regions | |
481 | if (jetVect[0].DeltaPhi(*partVect) < -k60rad && jetVect[0].DeltaPhi(*partVect) > -k120rad ) region = -1; | |
482 | if (jetVect[0].DeltaPhi(*partVect) > k60rad && jetVect[0].DeltaPhi(*partVect) < k120rad ) region = 1; | |
6ef5bfa4 | 483 | |
f3050824 | 484 | } else if( fRegionType == 2 ) { |
485 | // Cone regions | |
486 | Double_t deltaR = 0.; | |
487 | ||
488 | TVector3 positVect,negatVect; | |
489 | positVect.SetMagThetaPhi(1, 2.*atan(exp(-jetVect[0].Eta())), jetVect[0].Phi()+TMath::PiOver2()); | |
490 | negatVect.SetMagThetaPhi(1, 2.*atan(exp(-jetVect[0].Eta())), jetVect[0].Phi()-TMath::PiOver2()); | |
491 | ||
492 | if (TMath::Abs(positVect.DeltaPhi(*partVect)) < fConeRadius ) { | |
6ef5bfa4 | 493 | region = 1; |
494 | deltaR = positVect.DrEtaPhi(*partVect); | |
f3050824 | 495 | } else if (TMath::Abs(negatVect.DeltaPhi(*partVect)) < fConeRadius) { |
6ef5bfa4 | 496 | region = -1; |
497 | deltaR = negatVect.DrEtaPhi(*partVect); | |
f3050824 | 498 | } |
499 | ||
500 | if (deltaR > fConeRadius) region = 0; | |
6ef5bfa4 | 501 | |
f3050824 | 502 | } else |
503 | AliError("Unknow region type"); | |
6ef5bfa4 | 504 | |
f3050824 | 505 | // For debug (to be removed) |
506 | //if( region != 0 ) fhValidRegion->Fill( partVect->Eta()-jetVect[0].Eta(), jetVect[0].DeltaPhi(*partVect) ); | |
507 | ||
508 | return region; | |
509 | } | |
510 | ||
6ef5bfa4 | 511 | |
512 | //____________________________________________________________________ | |
513 | TObjArray* AliAnalysisTaskUE::FindChargedParticleJets() | |
514 | { | |
515 | // Return a TObjArray of "charged particle jets" | |
516 | // | |
517 | // Charged particle jet definition from reference: | |
518 | // | |
519 | // "Charged jet evolution and the underlying event | |
520 | // in proton-antiproton collisions at 1.8 TeV" | |
521 | // PHYSICAL REVIEW D 65 092002, CDF Collaboration | |
522 | // | |
523 | // We define "jets" as circular regions in eta-phi space with | |
524 | // radius defined by R = sqrt( (eta-eta0)^2 +(phi-phi0)^2 ). | |
525 | // Our jet algorithm is as follows: | |
526 | // 1- Order all charged particles according to their pT . | |
527 | // 2- Start with the highest pT particle and include in the jet all | |
528 | // particles within the radius R=0.7 considering each particle | |
529 | // in the order of decreasing pT and recalculating the centroid | |
530 | // of the jet after each new particle is added to the jet . | |
531 | // 3- Go to the next highest pT particle not already included in | |
532 | // a jet and add to the jet all particles not already included in | |
533 | // a jet within R=0.7. | |
534 | // 4- Continue until all particles are in a jet. | |
535 | // We define the transverse momentum of the jet to be | |
536 | // the scalar pT sum of all the particles within the jet, where pT | |
537 | // is measured with respect to the beam axis | |
538 | ||
539 | // 1 - Order all charged particles according to their pT . | |
540 | Int_t nTracks = fAOD->GetNTracks(); | |
541 | if( !nTracks ) return 0; | |
542 | TObjArray tracks(nTracks); | |
543 | ||
544 | for (Int_t ipart=0; ipart<nTracks; ++ipart) { | |
545 | AliAODTrack* part = fAOD->GetTrack( ipart ); | |
546 | if( !part->TestFilterBit(fFilterBit) ) continue; // track cut selection | |
547 | if( !part->Charge() ) continue; | |
548 | if( part->Pt() < fTrackPtCut ) continue; | |
549 | tracks.AddLast(part); | |
550 | } | |
551 | QSortTracks( tracks, 0, tracks.GetEntriesFast() ); | |
552 | ||
553 | nTracks = tracks.GetEntriesFast(); | |
554 | if( !nTracks ) return 0; | |
555 | TObjArray *jets = new TObjArray(nTracks); | |
556 | TIter itrack(&tracks); | |
557 | while( nTracks ) { | |
558 | // 2- Start with the highest pT particle ... | |
559 | Float_t px,py,pz,pt; | |
560 | AliAODTrack* track = (AliAODTrack*)itrack.Next(); | |
561 | if( !track ) continue; | |
562 | px = track->Px(); | |
563 | py = track->Py(); | |
564 | pz = track->Pz(); | |
565 | pt = track->Pt(); // Use the energy member to store Pt | |
566 | jets->AddLast( new TLorentzVector(px, py, pz, pt) ); | |
567 | tracks.Remove( track ); | |
568 | TLorentzVector* jet = (TLorentzVector*)jets->Last(); | |
569 | // 3- Go to the next highest pT particle not already included... | |
570 | AliAODTrack* track1; | |
571 | while ( (track1 = (AliAODTrack*)(itrack.Next())) ) { | |
572 | Double_t dphi = TVector2::Phi_mpi_pi(jet->Phi()-track1->Phi()); | |
573 | Double_t r = TMath::Sqrt( (jet->Eta()-track1->Eta())*(jet->Eta()-track1->Eta()) + | |
574 | dphi*dphi ); | |
575 | if( r < fConeRadius ) { | |
de6f8090 | 576 | Double_t fPt = jet->E()+track1->Pt(); // Scalar sum of Pt |
6ef5bfa4 | 577 | // recalculating the centroid |
de6f8090 | 578 | Double_t eta = jet->Eta()*jet->E()/fPt + track1->Eta()/fPt; |
579 | Double_t phi = jet->Phi()*jet->E()/fPt + track1->Phi()/fPt; | |
580 | jet->SetPtEtaPhiE( 1., eta, phi, fPt ); | |
6ef5bfa4 | 581 | tracks.Remove( track1 ); |
582 | } | |
583 | } | |
584 | ||
585 | tracks.Compress(); | |
586 | nTracks = tracks.GetEntries(); | |
587 | // 4- Continue until all particles are in a jet. | |
588 | itrack.Reset(); | |
589 | } // end while nTracks | |
590 | ||
591 | // Convert to AODjets.... | |
592 | Int_t njets = jets->GetEntriesFast(); | |
593 | TObjArray* aodjets = new TObjArray(njets); | |
594 | aodjets->SetOwner(kTRUE); | |
595 | for(Int_t ijet=0; ijet<njets; ++ijet) { | |
596 | TLorentzVector* jet = (TLorentzVector*)jets->At(ijet); | |
597 | Float_t px, py,pz,en; // convert to 4-vector | |
598 | px = jet->E() * TMath::Cos(jet->Phi()); // Pt * cos(phi) | |
599 | py = jet->E() * TMath::Sin(jet->Phi()); // Pt * sin(phi) | |
600 | pz = jet->E() / TMath::Tan(2.0 * TMath::ATan(TMath::Exp(-jet->Eta()))); | |
601 | en = TMath::Sqrt(px * px + py * py + pz * pz); | |
602 | aodjets->AddLast( new AliAODJet(px, py, pz, en) ); | |
603 | } | |
604 | // Order jets according to their pT . | |
605 | QSortTracks( *aodjets, 0, aodjets->GetEntriesFast() ); | |
606 | ||
607 | // debug | |
608 | if (fDebug>3) AliInfo(Form(" %d Charged jets found\n",njets)); | |
609 | ||
610 | return aodjets; | |
611 | } | |
612 | ||
613 | //____________________________________________________________________ | |
614 | void AliAnalysisTaskUE::QSortTracks(TObjArray &a, Int_t first, Int_t last) | |
615 | { | |
616 | // Sort array of TObjArray of tracks by Pt using a quicksort algorithm. | |
617 | ||
618 | static TObject *tmp; | |
619 | static int i; // "static" to save stack space | |
620 | int j; | |
621 | ||
622 | while (last - first > 1) { | |
623 | i = first; | |
624 | j = last; | |
625 | for (;;) { | |
626 | while (++i < last && ((AliVParticle*)a[i])->Pt() > ((AliVParticle*)a[first])->Pt() ) | |
627 | ; | |
628 | while (--j > first && ((AliVParticle*)a[j])->Pt() < ((AliVParticle*)a[first])->Pt() ) | |
629 | ; | |
630 | if (i >= j) | |
631 | break; | |
632 | ||
633 | tmp = a[i]; | |
634 | a[i] = a[j]; | |
635 | a[j] = tmp; | |
636 | } | |
637 | if (j == first) { | |
638 | ++first; | |
639 | continue; | |
640 | } | |
641 | tmp = a[first]; | |
642 | a[first] = a[j]; | |
643 | a[j] = tmp; | |
644 | if (j - first < last - (j + 1)) { | |
645 | QSortTracks(a, first, j); | |
646 | first = j + 1; // QSortTracks(j + 1, last); | |
647 | } else { | |
648 | QSortTracks(a, j + 1, last); | |
649 | last = j; // QSortTracks(first, j); | |
650 | } | |
651 | } | |
652 | } | |
653 | ||
654 | //____________________________________________________________________ | |
655 | void AliAnalysisTaskUE::SetRegionArea(TVector3 *jetVect) | |
656 | { | |
657 | Double_t fAreaCorrFactor=0.; | |
658 | Double_t deltaEta = 0.; | |
659 | if (fRegionType==1) fAreaReg = 2.*fTrackEtaCut*60.*TMath::Pi()/180.; | |
660 | else if (fRegionType==2){ | |
661 | deltaEta = 0.9-TMath::Abs(jetVect[0].Eta()); | |
662 | if (deltaEta>fConeRadius) fAreaReg = TMath::Pi()*fConeRadius*fConeRadius; | |
663 | else{ | |
664 | fAreaCorrFactor = fConeRadius*fConeRadius*TMath::ACos(deltaEta/fConeRadius) - | |
665 | (deltaEta*fConeRadius)*TMath::Sqrt( 1. - deltaEta*deltaEta/(fConeRadius*fConeRadius)); | |
666 | fAreaReg=TMath::Pi()*fConeRadius*fConeRadius-fAreaCorrFactor; | |
667 | } | |
668 | }else AliWarning("Unknown Rgion Type"); | |
669 | if (fDebug>5) AliInfo(Form("\n dEta=%5.3f Angle =%5.3f Region Area = %5.3f Corr Factor=%5.4f \n",deltaEta,TMath::ACos(deltaEta/fConeRadius),fAreaReg,fAreaCorrFactor)); | |
670 | } | |
671 | ||
f3050824 | 672 | //____________________________________________________________________ |
673 | void AliAnalysisTaskUE::CreateHistos() | |
674 | { | |
675 | fListOfHistos = new TList(); | |
676 | ||
677 | ||
678 | fhNJets = new TH1F("fhNJets", "n Jet", 10, 0, 10); | |
679 | fhNJets->SetXTitle("# of jets"); | |
680 | fhNJets->Sumw2(); | |
f3050824 | 681 | fListOfHistos->Add( fhNJets ); // At(0) |
682 | ||
683 | fhEleadingPt = new TH1F("hEleadingPt", "Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
684 | fhEleadingPt->SetXTitle("P_{T} (GeV/c)"); | |
685 | fhEleadingPt->SetYTitle("dN/dP_{T}"); | |
686 | fhEleadingPt->Sumw2(); | |
687 | fListOfHistos->Add( fhEleadingPt ); // At(1) | |
688 | ||
689 | fhMinRegPtDist = new TH1F("hMinRegPtDist", "P_{T} distribution in Min zone", 50,0.,20.); | |
690 | fhMinRegPtDist->SetXTitle("P_{T} (GeV/c)"); | |
691 | fhMinRegPtDist->SetYTitle("dN/dP_{T}"); | |
692 | fhMinRegPtDist->Sumw2(); | |
693 | fListOfHistos->Add( fhMinRegPtDist ); // At(2) | |
694 | ||
695 | fhRegionMultMin = new TH1F("hRegionMultMin", "N_{ch}^{90, min}", 21, -0.5, 20.5); | |
696 | fhRegionMultMin->SetXTitle("N_{ch tracks}"); | |
697 | fhRegionMultMin->Sumw2(); | |
698 | fListOfHistos->Add( fhRegionMultMin ); // At(3) | |
699 | ||
700 | fhMinRegAvePt = new TH1F("hMinRegAvePt", "#LTp_{T}#GT", 50, 0., 20.); | |
701 | fhMinRegAvePt->SetXTitle("P_{T} (GeV/c)"); | |
702 | fhMinRegAvePt->Sumw2(); | |
703 | fListOfHistos->Add( fhMinRegAvePt ); // At(4) | |
704 | ||
705 | fhMinRegSumPt = new TH1F("hMinRegSumPt", "#Sigma p_{T} ", 50, 0., 20.); | |
706 | fhMinRegSumPt->SetYTitle("Ed^{3}N_{tracks}/dp^{3} (c^{3}/GeV^{2})"); | |
707 | fhMinRegSumPt->SetXTitle("#Sigma p_{T} (GeV/c)"); | |
708 | fhMinRegSumPt->Sumw2(); | |
709 | fListOfHistos->Add( fhMinRegSumPt ); // At(5) | |
6ef5bfa4 | 710 | |
f3050824 | 711 | fhMinRegMaxPtPart = new TH1F("hMinRegMaxPtPart", "max(p_{T})|_{event} ", 50, 0., 20.); |
712 | fhMinRegMaxPtPart->SetYTitle("Ed^{3}N_{tracks}/dp^{3} (c^{3}/GeV^{2})"); | |
713 | fhMinRegMaxPtPart->SetXTitle("p_{T} (GeV/c)"); | |
714 | fhMinRegMaxPtPart->Sumw2(); | |
715 | fListOfHistos->Add( fhMinRegMaxPtPart ); // At(6) | |
716 | ||
717 | fhMinRegSumPtvsMult = new TH1F("hMinRegSumPtvsMult", "#Sigma p_{T} vs. Multiplicity ", 21, -0.5, 20.5); | |
718 | fhMinRegSumPtvsMult->SetYTitle("#Sigma p_{T} (GeV/c)"); | |
719 | fhMinRegSumPtvsMult->SetXTitle("N_{charge}"); | |
720 | fhMinRegSumPtvsMult->Sumw2(); | |
721 | fListOfHistos->Add( fhMinRegSumPtvsMult ); // At(7); | |
6ef5bfa4 | 722 | |
de6f8090 | 723 | fhdNdEtaPhiDist = new TH1F("hdNdEtaPhiDist", "Charge particle density |#eta|< 1 vs #Delta#phi", 120, 0., 2.*TMath::Pi()); |
724 | fhdNdEtaPhiDist->SetXTitle("#Delta#phi"); | |
725 | fhdNdEtaPhiDist->SetYTitle("dN_{ch}/d#etad#phi"); | |
726 | fhdNdEtaPhiDist->Sumw2(); | |
727 | fListOfHistos->Add( fhdNdEtaPhiDist ); // At(8) | |
6ef5bfa4 | 728 | |
f3050824 | 729 | // Can be use to get part pt distribution for differente Jet Pt bins |
730 | fhFullRegPartPtDistVsEt = new TH2F("hFullRegPartPtDistVsEt", "dN/dP_{T} |#eta|<1 vs Leading Jet P_{T}", | |
6ef5bfa4 | 731 | 50,0.,50., fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
f3050824 | 732 | fhFullRegPartPtDistVsEt->SetYTitle("Leading Jet P_{T}"); |
733 | fhFullRegPartPtDistVsEt->SetXTitle("p_{T}"); | |
734 | fhFullRegPartPtDistVsEt->Sumw2(); | |
735 | fListOfHistos->Add( fhFullRegPartPtDistVsEt ); // At(9) | |
6ef5bfa4 | 736 | |
737 | // Can be use to get part pt distribution for differente Jet Pt bins | |
f3050824 | 738 | fhTransRegPartPtDistVsEt = new TH2F("hTransRegPartPtDistVsEt", "dN/dP_{T} in tranvese regions |#eta|<1 vs Leading Jet P_{T}", |
6ef5bfa4 | 739 | 50,0.,50., fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
f3050824 | 740 | fhTransRegPartPtDistVsEt->SetYTitle("Leading Jet P_{T}"); |
741 | fhTransRegPartPtDistVsEt->SetXTitle("p_{T}"); | |
742 | fhTransRegPartPtDistVsEt->Sumw2(); | |
743 | fListOfHistos->Add( fhTransRegPartPtDistVsEt ); // At(10) | |
744 | ||
745 | ||
746 | fhRegionSumPtMaxVsEt = new TH1F("hRegionSumPtMaxVsEt", "P_{T}^{90, max} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
747 | fhRegionSumPtMaxVsEt->SetXTitle("P_{T} (GeV/c)"); | |
748 | fhRegionSumPtMaxVsEt->Sumw2(); | |
749 | fListOfHistos->Add( fhRegionSumPtMaxVsEt ); // At(11) | |
6ef5bfa4 | 750 | |
f3050824 | 751 | fhRegionSumPtMinVsEt = new TH1F("hRegionSumPtMinVsEt", "P_{T}^{90, min} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
752 | fhRegionSumPtMinVsEt->SetXTitle("P_{T} (GeV/c)"); | |
753 | fhRegionSumPtMinVsEt->Sumw2(); | |
754 | fListOfHistos->Add( fhRegionSumPtMinVsEt ); // At(12) | |
755 | ||
756 | fhRegionMultMax = new TH1I("hRegionMultMax", "N_{ch}^{90, max}", 21, -0.5, 20.5); | |
757 | fhRegionMultMax->SetXTitle("N_{ch tracks}"); | |
758 | fhRegionMultMax->Sumw2(); | |
759 | fListOfHistos->Add( fhRegionMultMax ); // At(13) | |
6ef5bfa4 | 760 | |
f3050824 | 761 | fhRegionMultMaxVsEt = new TH1F("hRegionMultMaxVsEt", "N_{ch}^{90, max} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
762 | fhRegionMultMaxVsEt->SetXTitle("E (GeV hRegionAveSumPtVsEt/c)"); | |
763 | fhRegionMultMaxVsEt->Sumw2(); | |
764 | fListOfHistos->Add( fhRegionMultMaxVsEt ); // At(14) | |
6ef5bfa4 | 765 | |
f3050824 | 766 | fhRegionMultMinVsEt = new TH1F("hRegionMultMinVsEt", "N_{ch}^{90, min} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
767 | fhRegionMultMinVsEt->SetXTitle("E (GeV/c)"); | |
768 | fhRegionMultMinVsEt->Sumw2(); | |
769 | fListOfHistos->Add( fhRegionMultMinVsEt ); // At(15) | |
6ef5bfa4 | 770 | |
f3050824 | 771 | fhRegionAveSumPtVsEt = new TH1F("hRegionAveSumPtVsEt", "(P_{T}^{90, max} + P_{T}^{90, min})/2 vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
772 | fhRegionAveSumPtVsEt->SetXTitle("P_{T} (GeV/c)"); | |
773 | fhRegionAveSumPtVsEt->Sumw2(); | |
774 | fListOfHistos->Add( fhRegionAveSumPtVsEt ); // At(16) | |
6ef5bfa4 | 775 | |
f3050824 | 776 | fhRegionDiffSumPtVsEt= new TH1F("hRegionPtDiffVsEt", "(P_{T}^{90, max} - P_{T}^{90, min}) vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
777 | fhRegionDiffSumPtVsEt->SetXTitle("P_{T} (GeV/c)"); | |
778 | fhRegionDiffSumPtVsEt->Sumw2(); | |
779 | fListOfHistos->Add( fhRegionDiffSumPtVsEt ); // At(17) | |
780 | ||
781 | fhRegionAvePartPtMaxVsEt = new TH1F("hRegionAvePartPtMaxVsEt", "#LTp_{T}#GT^{90, max} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
782 | fhRegionAvePartPtMaxVsEt->SetXTitle("P_{T} (GeV/c)"); | |
783 | fhRegionAvePartPtMaxVsEt->Sumw2(); | |
784 | fListOfHistos->Add( fhRegionAvePartPtMaxVsEt ); // At(18) | |
6ef5bfa4 | 785 | |
f3050824 | 786 | fhRegionAvePartPtMinVsEt = new TH1F("hRegionAvePartPtMinVsEt", "#LTp_{T}#GT^{90, min} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
787 | fhRegionAvePartPtMinVsEt->SetXTitle("P_{T} (GeV/c)"); | |
788 | fhRegionAvePartPtMinVsEt->Sumw2(); | |
789 | fListOfHistos->Add( fhRegionAvePartPtMinVsEt ); // At(19) | |
6ef5bfa4 | 790 | |
f3050824 | 791 | fhRegionMaxPartPtMaxVsEt = new TH1F("hRegionMaxPartPtMaxVsEt", "max(p_{T})^{90} vs Leading Jet P_{T}", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); |
792 | fhRegionMaxPartPtMaxVsEt->SetXTitle("P_{T} (GeV/c)"); | |
793 | fhRegionMaxPartPtMaxVsEt->Sumw2(); | |
794 | fListOfHistos->Add( fhRegionMaxPartPtMaxVsEt ); // At(20) | |
6ef5bfa4 | 795 | |
1e996f55 | 796 | |
6ef5bfa4 | 797 | fSettingsTree = new TTree("UEAnalysisSettings","Analysis Settings in UE estimation"); |
1e996f55 | 798 | fSettingsTree->Branch("fConeRadius", &fConeRadius,"Rad/D"); |
799 | fSettingsTree->Branch("fJet1EtaCut", &fJet1EtaCut, "LeadJetEtaCut/D"); | |
800 | fSettingsTree->Branch("fJet2DeltaPhiCut", &fJet2DeltaPhiCut, "DeltaPhi/D"); | |
801 | fSettingsTree->Branch("fJet2RatioPtCut", &fJet2RatioPtCut, "Jet2Ratio/D"); | |
802 | fSettingsTree->Branch("fJet3PtCut", &fJet3PtCut, "Jet3PtCut/D"); | |
803 | fSettingsTree->Branch("fTrackPtCut", &fTrackPtCut, "TrackPtCut/D"); | |
804 | fSettingsTree->Branch("fTrackEtaCut", &fTrackEtaCut, "TrackEtaCut/D"); | |
805 | fSettingsTree->Branch("fAnaType", &fAnaType, "Ana/I"); | |
806 | fSettingsTree->Branch("fRegionType", &fRegionType,"Reg/I"); | |
807 | fSettingsTree->Branch("fOrdering", &fOrdering,"OrderMeth/I"); | |
808 | fSettingsTree->Branch("fUseChPartJet", &fUseChPartJet,"UseChPart/O"); | |
809 | fSettingsTree->Branch("fUseSingleCharge", &fUseSingleCharge,"UseSingleCh/O"); | |
810 | fSettingsTree->Branch("fUsePositiveCharge", &fUsePositiveCharge,"UsePositiveCh/O"); | |
811 | fSettingsTree->Fill(); | |
812 | ||
813 | ||
6ef5bfa4 | 814 | fListOfHistos->Add( fSettingsTree ); // At(21) |
815 | ||
816 | /* | |
817 | // For debug region selection | |
818 | fhValidRegion = new TH2F("hValidRegion", "dN/d#eta/d#phi", | |
819 | 20, -2.,2., 62, -TMath::Pi(), TMath::Pi()); | |
820 | fhValidRegion->SetYTitle("#Delta#phi"); | |
821 | fhValidRegion->Sumw2(); | |
822 | fListOfHistos->Add( fhValidRegion ); // At(15) | |
823 | */ | |
f3050824 | 824 | } |
f3050824 | 825 | |
6ef5bfa4 | 826 | //____________________________________________________________________ |
827 | void AliAnalysisTaskUE::Terminate(Option_t */*option*/) | |
828 | { | |
829 | // Terminate analysis | |
830 | // | |
831 | ||
832 | //Save Analysis Settings | |
1e996f55 | 833 | // WriteSettings(); |
6ef5bfa4 | 834 | |
835 | // Normalize histos to region area TODO: | |
836 | // Normalization done at Analysis, taking into account | |
837 | // area variations on per-event basis (cone case) | |
838 | ||
839 | // Draw some Test plot to the screen | |
840 | if (!gROOT->IsBatch()) { | |
841 | ||
842 | // Update pointers reading them from the output slot | |
843 | fListOfHistos = dynamic_cast<TList*> (GetOutputData(0)); | |
844 | if( !fListOfHistos ) { | |
845 | AliError("Histogram List is not available"); | |
846 | return; | |
847 | } | |
848 | fhEleadingPt = (TH1F*)fListOfHistos->At(1); | |
de6f8090 | 849 | fhdNdEtaPhiDist = (TH1F*)fListOfHistos->At(8); |
6ef5bfa4 | 850 | fhRegionSumPtMaxVsEt = (TH1F*)fListOfHistos->At(11); |
851 | fhRegionSumPtMinVsEt = (TH1F*)fListOfHistos->At(12); | |
852 | fhRegionMultMaxVsEt = (TH1F*)fListOfHistos->At(14); | |
853 | fhRegionMultMinVsEt = (TH1F*)fListOfHistos->At(15); | |
854 | fhRegionAveSumPtVsEt = (TH1F*)fListOfHistos->At(16); | |
855 | ||
856 | fhNJets = (TH1F*)fListOfHistos->At(0); | |
857 | ||
858 | // Canvas | |
859 | TCanvas* c1 = new TCanvas("c1",Form("sumPt dist (%s)", GetTitle()),60,60,1200,800); | |
860 | c1->Divide(2,2); | |
861 | c1->cd(1); | |
862 | TH1F *h1r = new TH1F("hRegionEtvsSumPtMax" , "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
863 | h1r->Divide(fhRegionSumPtMaxVsEt,fhEleadingPt,1,1); | |
864 | //h1r->Scale( areafactor ); | |
865 | h1r->SetMarkerStyle(20); | |
866 | h1r->SetXTitle("P_{T} of Leading Jet (GeV/c)"); | |
867 | h1r->SetYTitle("P_{T}^{90, max}"); | |
868 | h1r->DrawCopy("p"); | |
869 | ||
870 | c1->cd(2); | |
871 | ||
872 | TH1F *h2r = new TH1F("hRegionEtvsSumPtMin" , "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
873 | h2r->Divide(fhRegionSumPtMinVsEt,fhEleadingPt,1,1); | |
874 | //h2r->Scale( areafactor ); | |
875 | h2r->SetMarkerStyle(20); | |
876 | h2r->SetXTitle("P_{T} of Leading Jet (GeV/c)"); | |
877 | h2r->SetYTitle("P_{T}^{90, min}"); | |
878 | h2r->DrawCopy("p"); | |
879 | ||
880 | c1->cd(3); | |
881 | TH1F *h4r = new TH1F("hRegionEtvsDiffPt" , "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
882 | h4r->Divide(fhRegionAveSumPtVsEt,fhEleadingPt,1,1); | |
883 | h4r->Scale(2.); // make average | |
884 | //h4r->Scale( areafactor ); | |
885 | h4r->SetYTitle("#DeltaP_{T}^{90}"); | |
886 | h4r->SetXTitle("P_{T} of Leading Jet (GeV/c)"); | |
887 | h4r->SetMarkerStyle(20); | |
888 | h4r->DrawCopy("p"); | |
889 | ||
890 | c1->cd(4); | |
891 | TH1F *h5r = new TH1F("hRegionMultMaxVsEtleading", "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
892 | TH1F *h6r = new TH1F("hRegionMultMinVsEtleading", "", fBinsPtInHist, fMinJetPtInHist, fMaxJetPtInHist); | |
893 | ||
894 | h5r->Divide(fhRegionMultMaxVsEt,fhEleadingPt,1,1); | |
895 | h6r->Divide(fhRegionMultMinVsEt,fhEleadingPt,1,1); | |
896 | //h5r->Scale( areafactor ); | |
897 | //h6r->Scale( areafactor ); | |
898 | h5r->SetYTitle("N_{Tracks}^{90}"); | |
899 | h5r->SetXTitle("P_{T} of Leading Jet (GeV/c)"); | |
900 | h5r->SetMarkerStyle(20); | |
901 | h5r->DrawCopy("p"); | |
902 | h6r->SetMarkerStyle(21); | |
903 | h6r->SetMarkerColor(2); | |
904 | h6r->SetYTitle("N_{Tracks}^{90}"); | |
905 | h6r->SetXTitle("P_{T} of Leading Jet (GeV/c)"); | |
906 | h6r->DrawCopy("p same"); | |
907 | c1->Update(); | |
908 | ||
909 | TCanvas* c2 = new TCanvas("c2","Jet Pt dist",160,160,1200,800); | |
910 | c2->Divide(2,2); | |
911 | c2->cd(1); | |
912 | fhEleadingPt->SetMarkerStyle(20); | |
913 | fhEleadingPt->SetMarkerColor(2); | |
914 | fhEleadingPt->DrawCopy("p"); | |
915 | gPad->SetLogy(); | |
916 | ||
917 | c2->cd(2); | |
de6f8090 | 918 | fhdNdEtaPhiDist->SetMarkerStyle(20); |
919 | fhdNdEtaPhiDist->SetMarkerColor(2); | |
920 | fhdNdEtaPhiDist->DrawCopy("p"); | |
6ef5bfa4 | 921 | gPad->SetLogy(); |
922 | ||
923 | c2->cd(3); | |
924 | fhNJets->DrawCopy(); | |
925 | ||
926 | //fhTransRegPartPtDist = (TH1F*)fListOfHistos->At(2); | |
927 | fhRegionMultMin = (TH1F*)fListOfHistos->At(3); | |
928 | fhMinRegAvePt = (TH1F*)fListOfHistos->At(4); | |
929 | fhMinRegSumPt = (TH1F*)fListOfHistos->At(5); | |
930 | //fhMinRegMaxPtPart = (TH1F*)fListOfHistos->At(6); | |
931 | fhMinRegSumPtvsMult = (TH1F*)fListOfHistos->At(7); | |
932 | ||
933 | // Canvas | |
934 | TCanvas* c3 = new TCanvas("c3"," p_{T} dist",160,160,1200,800); | |
935 | c3->Divide(2,2); | |
936 | c3->cd(1); | |
937 | /*fhTransRegPartPtDist->SetMarkerStyle(20); | |
938 | fhTransRegPartPtDist->SetMarkerColor(2); | |
939 | fhTransRegPartPtDist->Scale(areafactor/fhTransRegPartPtDist->GetEntries()); | |
940 | fhTransRegPartPtDist->DrawCopy("p"); | |
941 | gPad->SetLogy(); | |
942 | */ | |
943 | c3->cd(2); | |
944 | fhMinRegSumPt->SetMarkerStyle(20); | |
945 | fhMinRegSumPt->SetMarkerColor(2); | |
946 | //fhMinRegSumPt->Scale(areafactor); | |
947 | fhMinRegSumPt->DrawCopy("p"); | |
948 | gPad->SetLogy(); | |
949 | ||
950 | c3->cd(3); | |
951 | fhMinRegAvePt->SetMarkerStyle(20); | |
952 | fhMinRegAvePt->SetMarkerColor(2); | |
953 | //fhMinRegAvePt->Scale(areafactor); | |
954 | fhMinRegAvePt->DrawCopy("p"); | |
955 | gPad->SetLogy(); | |
956 | ||
957 | c3->cd(4); | |
958 | ||
959 | TH1F *h7r = new TH1F("hRegionMultMinVsMult", "", 21, -0.5, 20.5); | |
960 | ||
961 | h7r->Divide(fhMinRegSumPtvsMult,fhRegionMultMin,1,1); | |
962 | ||
963 | h7r->SetMarkerStyle(20); | |
964 | h7r->SetMarkerColor(2); | |
965 | h7r->DrawCopy("p"); | |
966 | ||
967 | c3->Update(); | |
968 | ||
969 | ||
970 | /* c2->cd(3); | |
971 | fhValidRegion->SetMarkerStyle(20); | |
972 | fhValidRegion->SetMarkerColor(2); | |
973 | fhValidRegion->DrawCopy("p"); | |
974 | */ | |
975 | c2->Update(); | |
976 | } else { | |
977 | AliInfo(" Batch mode, not histograms will be shown..."); | |
978 | } | |
979 | ||
980 | if( fDebug > 1 ) | |
981 | AliInfo("End analysis"); | |
982 | ||
983 | } | |
f3050824 | 984 | |
6ef5bfa4 | 985 | void AliAnalysisTaskUE::WriteSettings() |
1e996f55 | 986 | { |
6ef5bfa4 | 987 | if (fDebug>5){ |
988 | AliInfo(" All Analysis Settings in Saved Tree"); | |
989 | fSettingsTree->Scan(); | |
990 | } | |
991 | } |