]>
Commit | Line | Data |
---|---|---|
c94a2509 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-2008, 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 | ///////////////////////////////////////////////////////////// | |
17 | // | |
18 | // AliAnalysisTaskSE to make AOD centrality | |
19 | // Author: Alberica Toia, CERN, Alberica.Toia@cern.ch | |
20 | // | |
21 | ///////////////////////////////////////////////////////////// | |
22 | ||
23 | #include <TROOT.h> | |
24 | #include <TSystem.h> | |
25 | ||
26 | #include "AliVEvent.h" | |
27 | #include "AliESDEvent.h" | |
28 | #include "AliAODEvent.h" | |
29 | #include "AliAODCentrality.h" | |
c94a2509 | 30 | #include "AliAnalysisManager.h" |
c94a2509 | 31 | #include "AliESDInputHandler.h" |
32 | #include "AliESDZDC.h" | |
33 | #include "AliESDFMD.h" | |
34 | #include "AliESDVZERO.h" | |
35 | #include "AliMultiplicity.h" | |
36 | #include "AliAODHandler.h" | |
42f0d071 | 37 | #include "AliAODHeader.h" |
c94a2509 | 38 | #include "AliAODEvent.h" |
39 | #include "AliAODVertex.h" | |
c94a2509 | 40 | #include "AliMCEvent.h" |
41 | #include "AliMCEventHandler.h" | |
42 | #include "AliMCParticle.h" | |
43 | #include "AliStack.h" | |
44 | #include "AliHeader.h" | |
c94a2509 | 45 | #include "AliGenEventHeader.h" |
46 | #include "AliGenHijingEventHeader.h" | |
c94a2509 | 47 | #include "AliAnalysisTaskAODCentralityMaker.h" |
9daedfd1 | 48 | #include "AliLog.h" |
c94a2509 | 49 | |
50 | ClassImp(AliAnalysisTaskAODCentralityMaker) | |
51 | ||
52 | ||
53 | //________________________________________________________________________ | |
54 | AliAnalysisTaskAODCentralityMaker::AliAnalysisTaskAODCentralityMaker(): | |
55 | AliAnalysisTaskSE(), | |
56 | fAODCentrality(0), | |
57 | fDeltaAODFileName("AliAOD.Centrality.root"), | |
42f0d071 | 58 | fAODHeader (0), |
59 | fIsMCInput (0) | |
c94a2509 | 60 | { |
61 | // Default constructor | |
c94a2509 | 62 | } |
63 | ||
64 | //________________________________________________________________________ | |
65 | AliAnalysisTaskAODCentralityMaker::AliAnalysisTaskAODCentralityMaker(const char *name): | |
66 | AliAnalysisTaskSE(name), | |
67 | fAODCentrality(0), | |
68 | fDeltaAODFileName("AliAOD.Centrality.root"), | |
42f0d071 | 69 | fAODHeader (0), |
70 | fIsMCInput (0) | |
c94a2509 | 71 | { |
72 | // Standard constructor | |
c94a2509 | 73 | } |
74 | ||
75 | ||
76 | //________________________________________________________________________ | |
77 | AliAnalysisTaskAODCentralityMaker::~AliAnalysisTaskAODCentralityMaker() | |
78 | { | |
79 | // Destructor | |
80 | } | |
81 | ||
82 | //________________________________________________________________________ | |
83 | void AliAnalysisTaskAODCentralityMaker::Init() | |
84 | { | |
85 | // Initialization | |
86 | if(fDebug > 1) printf("AnalysisTaskAODCentralityMaker::Init() \n"); | |
87 | AliAnalysisManager::GetAnalysisManager()->RegisterExtraFile(fDeltaAODFileName.Data()); | |
88 | ||
89 | return; | |
90 | } | |
91 | ||
92 | //________________________________________________________________________ | |
93 | void AliAnalysisTaskAODCentralityMaker::UserCreateOutputObjects() | |
94 | { | |
95 | ||
96 | // Create the output container | |
97 | // | |
98 | if(fDebug > 1) printf("AnalysisTaskAODCentralityMaker::UserCreateOutPutData() \n"); | |
99 | // Support both the case when the AOD + deltaAOD are produced in an ESD | |
100 | // analysis or if the deltaAOD is produced on an analysis on AOD's. (A.G. 27/04/09) | |
101 | if(!AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler()) { | |
102 | Fatal("UserCreateOutputObjects", "This task needs an AOD handler"); | |
103 | return; | |
104 | } | |
105 | TString filename = fDeltaAODFileName; | |
106 | // When running on standard AOD to produce deltas, IsStandardAOD is never set, | |
107 | // If AODEvent is NULL, new branches have to be added to the new file(s) (A.G. 15/01/10) | |
108 | if(!IsStandardAOD() && AODEvent()) filename = ""; | |
109 | ||
110 | fAODCentrality = new AliAODCentrality(); | |
111 | fAODCentrality->SetName("AODCentrality"); | |
112 | AddAODBranch("AliAODCentrality", &fAODCentrality, filename); | |
113 | ||
42f0d071 | 114 | |
115 | fAODHeader = new AliAODHeader(); | |
116 | AddAODBranch("AliAODHeader", &fAODHeader, filename); | |
c94a2509 | 117 | return; |
118 | } | |
119 | ||
42f0d071 | 120 | |
c94a2509 | 121 | //________________________________________________________________________ |
122 | void AliAnalysisTaskAODCentralityMaker::UserExec(Option_t */*option*/) | |
123 | { | |
42f0d071 | 124 | AliVEvent* event = InputEvent(); |
125 | AliESDEvent* esd = dynamic_cast<AliESDEvent*>(event); | |
9daedfd1 | 126 | if (!esd) { |
127 | AliError("No ESD Event"); | |
128 | return; | |
129 | } | |
130 | ||
42f0d071 | 131 | Float_t beamEnergy = esd->GetBeamEnergy(); |
132 | Int_t nTracks = event->GetNumberOfTracks(); | |
133 | Int_t nPmdTracks = esd->GetNumberOfPmdTracks(); | |
c94a2509 | 134 | |
135 | // ***** V0 info | |
136 | AliESDVZERO* esdV0 = esd->GetVZEROData(); | |
42f0d071 | 137 | Double_t multV0A = esdV0->GetMTotV0A(); |
138 | Double_t multV0C = esdV0->GetMTotV0C(); | |
c94a2509 | 139 | |
c94a2509 | 140 | |
141 | // ***** vertex info | |
142 | const AliESDVertex *vertex = esd->GetPrimaryVertexSPD(); | |
42f0d071 | 143 | Double_t xVertex = vertex->GetX(); |
144 | Double_t yVertex = vertex->GetY(); | |
145 | Double_t zVertex = vertex->GetZ(); | |
146 | Bool_t vertexer3d; | |
147 | ||
148 | if(vertex->IsFromVertexer3D()) vertexer3d = kTRUE; | |
149 | else vertexer3d = kFALSE; | |
c94a2509 | 150 | Double_t vertex3[3]; |
151 | vertex->GetXYZ(vertex3); | |
152 | ||
153 | // ***** CB info (tracklets, clusters, chips) | |
154 | const AliMultiplicity *mult = esd->GetMultiplicity(); | |
42f0d071 | 155 | Int_t nTracklets = mult->GetNumberOfTracklets(); |
156 | Int_t nSingleClusters; | |
157 | Int_t nClusters[6]; | |
c94a2509 | 158 | |
42f0d071 | 159 | for(Int_t ilay = 0; ilay < 6; ilay++){ |
160 | nClusters[ilay] = mult->GetNumberOfITSClusters(ilay); | |
c94a2509 | 161 | } |
42f0d071 | 162 | nSingleClusters = mult->GetNumberOfSingleClusters(); |
163 | ||
164 | Int_t nChips[2]; | |
165 | for(Int_t ilay = 0; ilay < 2; ilay++){ | |
166 | nChips[ilay] = mult->GetNumberOfFiredChips(ilay); | |
c94a2509 | 167 | } |
168 | ||
169 | // ***** FMD info | |
170 | AliESDFMD *fmd = esd->GetFMDData(); | |
171 | Float_t totalMultA = 0; | |
172 | Float_t totalMultC = 0; | |
42f0d071 | 173 | const Float_t fmdLowCut = 0.4; |
c94a2509 | 174 | |
42f0d071 | 175 | for(UShort_t det = 1;det <= 3; det++) { |
176 | Int_t nRings = (det==1 ? 1 : 2); | |
177 | for (UShort_t ir = 0; ir < nRings; ir++) { | |
178 | Char_t ring = (ir == 0 ? 'I' : 'O'); | |
179 | UShort_t nsec = (ir == 0 ? 20 : 40); | |
180 | UShort_t nstr = (ir == 0 ? 512 : 256); | |
181 | for(UShort_t sec =0; sec < nsec; sec++) { | |
182 | for(UShort_t strip = 0; strip < nstr; strip++) { | |
183 | Float_t fmdMult = fmd->Multiplicity(det,ring,sec,strip); | |
184 | if(fmdMult == 0 || fmdMult == AliESDFMD::kInvalidMult) continue; | |
185 | Float_t nParticles=0; | |
186 | if(fmdMult > fmdLowCut) { | |
187 | nParticles = 1.; | |
188 | } | |
c94a2509 | 189 | |
42f0d071 | 190 | if (det<3) totalMultA = totalMultA + nParticles; |
191 | else totalMultC = totalMultC + nParticles; | |
192 | ||
193 | } | |
c94a2509 | 194 | } |
c94a2509 | 195 | } |
c94a2509 | 196 | } |
42f0d071 | 197 | Float_t multFMDA = totalMultA; |
198 | Float_t multFMDC = totalMultC; | |
c94a2509 | 199 | |
200 | // ***** ZDC info | |
201 | AliESDZDC *esdZDC = esd->GetESDZDC(); | |
42f0d071 | 202 | UInt_t esdFlag = esdZDC->GetESDQuality(); |
c94a2509 | 203 | |
42f0d071 | 204 | Float_t znCEnergy = (Float_t) (esdZDC->GetZDCN1Energy()); |
205 | Float_t zpCEnergy = (Float_t) (esdZDC->GetZDCP1Energy()); | |
206 | Float_t znAEnergy = (Float_t) (esdZDC->GetZDCN2Energy()); | |
207 | Float_t zpAEnergy = (Float_t) (esdZDC->GetZDCP2Energy()); | |
208 | Float_t zem1Energy = (Float_t) (esdZDC->GetZDCEMEnergy(0)); | |
209 | Float_t zem2Energy = (Float_t) (esdZDC->GetZDCEMEnergy(1)); | |
c94a2509 | 210 | |
42f0d071 | 211 | Double_t bZDC = esdZDC->GetImpactParameter(); |
212 | Int_t nPartZDC = esdZDC->GetZDCParticipants(); | |
213 | Double_t bZDCA = esdZDC->GetImpactParamSideA(); | |
214 | Int_t nPartZDCA = esdZDC->GetZDCPartSideA(); | |
215 | Double_t bZDCC = esdZDC->GetImpactParamSideC(); | |
216 | Int_t nPartZDCC = esdZDC->GetZDCPartSideC(); | |
c94a2509 | 217 | |
218 | const Double_t * towZNC = esdZDC->GetZN1TowerEnergy(); | |
219 | const Double_t * towZPC = esdZDC->GetZP1TowerEnergy(); | |
220 | const Double_t * towZNA = esdZDC->GetZN2TowerEnergy(); | |
221 | const Double_t * towZPA = esdZDC->GetZP2TowerEnergy(); | |
222 | // | |
42f0d071 | 223 | Float_t znCtower[5]; // ZNC 5 tower signals |
224 | Float_t zpCtower[5]; // ZPC 5 tower signals | |
225 | Float_t znAtower[5]; // ZNA 5 tower signals | |
226 | Float_t zpAtower[5]; // ZPA 5 tower signals | |
227 | Float_t centrZNC[2]; // centroid over ZNC | |
228 | Float_t centrZNA[2]; // centroid over ZNA | |
229 | ||
230 | for(Int_t it = 0; it < 5; it++){ | |
231 | znCtower[it] = (Float_t) (towZNC[it]); | |
232 | zpCtower[it] = (Float_t) (towZPC[it]); | |
233 | znAtower[it] = (Float_t) (towZNA[it]); | |
234 | zpAtower[it] = (Float_t) (towZPA[it]); | |
c94a2509 | 235 | } |
236 | ||
42f0d071 | 237 | Double_t xyZNC[2] = {-99.,-99.}; |
238 | Double_t xyZNA[2] = {-99.,-99.}; | |
239 | ||
240 | esdZDC->GetZNCentroidInPbPb(beamEnergy, xyZNC, xyZNA); | |
241 | for(Int_t it = 0; it < 2; it++){ | |
242 | centrZNC[it] = xyZNC[it]; | |
243 | centrZNA[it] = xyZNA[it]; | |
c94a2509 | 244 | } |
245 | ||
246 | // ***** MC info | |
42f0d071 | 247 | Double_t bMC = 0.; |
248 | Int_t specNeutronProj = 0; | |
249 | Int_t specProtonProj = 0; | |
250 | Int_t specNeutronTarg = 0; | |
251 | Int_t specProtonTarg = 0; | |
252 | Int_t nPartTargMC = 0; | |
253 | Int_t nPartProjMC = 0; | |
254 | Int_t nnColl = 0; | |
255 | Int_t nnwColl = 0; | |
256 | Int_t nwNColl = 0; | |
257 | Int_t nwNwColl = 0; | |
258 | ||
c94a2509 | 259 | if(fIsMCInput){ |
260 | ||
261 | AliMCEvent* mcEvent = MCEvent(); | |
262 | if (!mcEvent) { | |
263 | printf(" Could not retrieve MC event!!!\n"); | |
264 | return; | |
265 | } | |
266 | ||
42f0d071 | 267 | Int_t nMyTracks_gen = 0; |
c94a2509 | 268 | AliStack *stack = 0x0; // needed for MC studies |
269 | stack = MCEvent()->Stack(); | |
270 | for (Int_t iTrack = 0; iTrack < MCEvent()->GetNumberOfTracks(); iTrack++) { | |
271 | //get properties of mc particle | |
272 | AliMCParticle* mcP = (AliMCParticle*) MCEvent()->GetTrack(iTrack); | |
273 | // Primaries only | |
274 | if (!(stack->IsPhysicalPrimary(mcP->Label()))) continue; | |
275 | //charged tracks only | |
276 | if (mcP->Particle()->GetPDG()->Charge() == 0) continue; | |
277 | //same cuts as on ESDtracks | |
278 | // if(TMath::Abs(mcP->Eta())>0.9)continue; | |
279 | // if(mcP->Pt()<0.2)continue; | |
280 | // if(mcP->Pt()>200)continue; | |
281 | ||
42f0d071 | 282 | nMyTracks_gen ++; |
c94a2509 | 283 | } |
284 | ||
285 | AliGenEventHeader* genHeader = mcEvent->GenEventHeader(); | |
286 | if(!genHeader){ | |
287 | printf(" Event generator header not available!!!\n"); | |
288 | return; | |
289 | } | |
290 | ||
42f0d071 | 291 | |
c94a2509 | 292 | if(genHeader->InheritsFrom(AliGenHijingEventHeader::Class())){ |
42f0d071 | 293 | bMC = ((AliGenHijingEventHeader*) genHeader)->ImpactParameter(); |
294 | specNeutronProj = ((AliGenHijingEventHeader*) genHeader)->ProjSpectatorsn(); | |
295 | specProtonProj = ((AliGenHijingEventHeader*) genHeader)->ProjSpectatorsp(); | |
296 | specNeutronTarg = ((AliGenHijingEventHeader*) genHeader)->TargSpectatorsn(); | |
297 | specProtonTarg = ((AliGenHijingEventHeader*) genHeader)->TargSpectatorsp(); | |
298 | nPartTargMC = Int_t (208.-(specNeutronTarg+specProtonTarg)); | |
299 | nPartProjMC = Int_t (208.-(specNeutronProj+specProtonProj)); | |
300 | nnColl = ((AliGenHijingEventHeader*) genHeader)->NN(); | |
301 | nnwColl = ((AliGenHijingEventHeader*) genHeader)->NNw(); | |
302 | nwNColl = ((AliGenHijingEventHeader*) genHeader)->NwN(); | |
303 | nwNwColl = ((AliGenHijingEventHeader*) genHeader)->NwNw(); | |
c94a2509 | 304 | } |
c94a2509 | 305 | } |
306 | ||
42f0d071 | 307 | fAODCentrality->SetxVertex (xVertex ); |
308 | fAODCentrality->SetyVertex (yVertex ); | |
309 | fAODCentrality->SetzVertex (zVertex ); | |
310 | fAODCentrality->SetVertexer3d (vertexer3d ); | |
311 | fAODCentrality->SetbMC (bMC); | |
312 | fAODCentrality->SetNpartTargMC (nPartTargMC); | |
313 | fAODCentrality->SetNpartProjMC (nPartProjMC); | |
314 | fAODCentrality->SetNNColl (nnColl); | |
315 | fAODCentrality->SetNNwColl (nnwColl); | |
316 | fAODCentrality->SetNwNColl (nwNColl); | |
317 | fAODCentrality->SetNwNwColl (nwNwColl); | |
318 | fAODCentrality->SetNTracklets (nTracklets); | |
319 | fAODCentrality->SetNSingleClusters (nSingleClusters); | |
c94a2509 | 320 | fAODCentrality->SetNClusters ( |
42f0d071 | 321 | nClusters[0], |
322 | nClusters[1], | |
323 | nClusters[2], | |
324 | nClusters[3], | |
325 | nClusters[4], | |
326 | nClusters[5]); | |
c94a2509 | 327 | fAODCentrality->SetNChips ( |
42f0d071 | 328 | nChips[0], |
329 | nChips[1]); | |
330 | fAODCentrality->SetbZDC (bZDC); | |
331 | fAODCentrality->SetNpartZDC (nPartZDC); | |
332 | fAODCentrality->SetbZDCA (bZDCA); | |
333 | fAODCentrality->SetNpartZDCA (nPartZDCA); | |
334 | fAODCentrality->SetbZDCC (bZDCC); | |
335 | fAODCentrality->SetNpartZDCC (nPartZDCC); | |
336 | fAODCentrality->SetESDFlag (esdFlag); | |
337 | fAODCentrality->SetZNCEnergy (znCEnergy); | |
338 | fAODCentrality->SetZPCEnergy (zpCEnergy); | |
339 | fAODCentrality->SetZNAEnergy (znAEnergy); | |
340 | fAODCentrality->SetZPAEnergy (zpAEnergy); | |
341 | fAODCentrality->SetZEM1Energy (zem1Energy); | |
342 | fAODCentrality->SetZEM2Energy (zem2Energy); | |
c94a2509 | 343 | fAODCentrality->SetZNCtower ( |
42f0d071 | 344 | znCtower[0], |
345 | znCtower[1], | |
346 | znCtower[2], | |
347 | znCtower[3], | |
348 | znCtower[4]); | |
c94a2509 | 349 | fAODCentrality->SetZPCtower ( |
42f0d071 | 350 | zpCtower[0], |
351 | zpCtower[1], | |
352 | zpCtower[2], | |
353 | zpCtower[3], | |
354 | zpCtower[4]); | |
c94a2509 | 355 | |
356 | fAODCentrality-> SetZNAtower ( | |
42f0d071 | 357 | znAtower[0], |
358 | znAtower[1], | |
359 | znAtower[2], | |
360 | znAtower[3], | |
361 | znAtower[4]); | |
c94a2509 | 362 | fAODCentrality-> SetZPAtower ( |
42f0d071 | 363 | zpAtower[0], |
364 | zpAtower[1], | |
365 | zpAtower[2], | |
366 | zpAtower[3], | |
367 | zpAtower[4]); | |
c94a2509 | 368 | fAODCentrality-> SetCentrZNC ( |
42f0d071 | 369 | centrZNC[0], |
370 | centrZNC[1]); | |
c94a2509 | 371 | fAODCentrality-> SetCentrZNA ( |
42f0d071 | 372 | centrZNA[0], |
373 | centrZNA[1]); | |
374 | fAODCentrality-> SetNTracks (nTracks); | |
375 | fAODCentrality-> SetNPmdTracks (nPmdTracks); | |
376 | fAODCentrality-> SetMultV0A (multV0A); | |
377 | fAODCentrality-> SetMultV0C (multV0C); | |
378 | fAODCentrality-> SetMultFMDA (multFMDA); | |
379 | fAODCentrality-> SetMultFMDC (multFMDC); | |
c94a2509 | 380 | |
42f0d071 | 381 | // |
382 | // Header Replication | |
383 | // | |
384 | AliAODHeader* hdr = AODEvent()->GetHeader(); | |
385 | *fAODHeader = *hdr; | |
386 | // | |
c94a2509 | 387 | return; |
388 | } | |
389 | ||
390 | //________________________________________________________________________ | |
391 | void AliAnalysisTaskAODCentralityMaker::Terminate(Option_t */*option*/) | |
392 | { | |
393 | // Terminate analysis | |
394 | // | |
395 | if(fDebug > 1) printf("AnalysisTaskAODCentralityMaker: Terminate() \n"); | |
396 | } |