Line data Source code
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 :
17 : //-------------------------------------------------------------------------
18 : // Implementation of Class AliESDZDC
19 : // This is a class that summarizes the ZDC data
20 : // for the ESD
21 : // Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch
22 : //-------------------------------------------------------------------------
23 :
24 : #include <TMath.h>
25 :
26 : #include "AliESDZDC.h"
27 :
28 172 : ClassImp(AliESDZDC)
29 :
30 : //______________________________________________________________________________
31 : AliESDZDC::AliESDZDC() :
32 20 : AliVZDC(),
33 20 : fZDCN1Energy(0),
34 20 : fZDCP1Energy(0),
35 20 : fZDCN2Energy(0),
36 20 : fZDCP2Energy(0),
37 20 : fZDCEMEnergy(0),
38 20 : fZDCEMEnergy1(0),
39 20 : fZDCParticipants(0),
40 20 : fZDCPartSideA(0),
41 20 : fZDCPartSideC(0),
42 20 : fImpactParameter(0),
43 20 : fImpactParamSideA(0),
44 20 : fImpactParamSideC(0),
45 20 : fESDQuality(0),
46 20 : fZNCTDChit(kFALSE),
47 20 : fZNATDChit(kFALSE),
48 20 : fZPCTDChit(kFALSE),
49 20 : fZPATDChit(kFALSE),
50 20 : fZEM1TDChit(kFALSE),
51 20 : fZEM2TDChit(kFALSE)
52 :
53 100 : {
54 240 : for(Int_t i=0; i<5; i++){
55 100 : fZN1TowerEnergy[i] = fZN2TowerEnergy[i] = 0.;
56 100 : fZP1TowerEnergy[i] = fZP2TowerEnergy[i] = 0.;
57 100 : fZN1TowerEnergyLR[i] = fZN2TowerEnergyLR[i] = 0.;
58 100 : fZP1TowerEnergyLR[i] = fZP2TowerEnergyLR[i] = 0.;
59 : }
60 120 : for(Int_t i=0; i<2; i++){
61 40 : fZNACentrCoord[i] = fZNCCentrCoord[i] = 0.;
62 : }
63 1320 : for(Int_t i=0; i<32; i++){
64 640 : fVMEScaler[i]=0;
65 6400 : for(Int_t y=0; y<4; y++){
66 2560 : fZDCTDCData[i][y]=0;
67 2560 : fZDCTDCCorrected[i][y]=0.;
68 : }
69 : }
70 320 : for(int it=0; it<7; it++) fZDCTDCChannels[it]=-1;
71 40 : }
72 :
73 : //______________________________________________________________________________
74 : AliESDZDC::AliESDZDC(const AliESDZDC& zdc) :
75 0 : AliVZDC(zdc),
76 0 : fZDCN1Energy(zdc.fZDCN1Energy),
77 0 : fZDCP1Energy(zdc.fZDCP1Energy),
78 0 : fZDCN2Energy(zdc.fZDCN2Energy),
79 0 : fZDCP2Energy(zdc.fZDCP2Energy),
80 0 : fZDCEMEnergy(zdc.fZDCEMEnergy),
81 0 : fZDCEMEnergy1(zdc.fZDCEMEnergy1),
82 0 : fZDCParticipants(zdc.fZDCParticipants),
83 0 : fZDCPartSideA(zdc.fZDCPartSideA),
84 0 : fZDCPartSideC(zdc.fZDCPartSideC),
85 0 : fImpactParameter(zdc.fImpactParameter),
86 0 : fImpactParamSideA(zdc.fImpactParamSideA),
87 0 : fImpactParamSideC(zdc.fImpactParamSideC),
88 0 : fESDQuality(zdc.fESDQuality),
89 0 : fZNCTDChit(zdc.fZNCTDChit),
90 0 : fZNATDChit(zdc.fZNATDChit),
91 0 : fZPCTDChit(zdc.fZPCTDChit),
92 0 : fZPATDChit(zdc.fZPATDChit),
93 0 : fZEM1TDChit(zdc.fZEM1TDChit),
94 0 : fZEM2TDChit(zdc.fZEM2TDChit)
95 :
96 0 : {
97 : // copy constructor
98 0 : for(Int_t i=0; i<5; i++){
99 0 : fZN1TowerEnergy[i] = zdc.fZN1TowerEnergy[i];
100 0 : fZN2TowerEnergy[i] = zdc.fZN2TowerEnergy[i];
101 0 : fZP1TowerEnergy[i] = zdc.fZP1TowerEnergy[i];
102 0 : fZP2TowerEnergy[i] = zdc.fZP2TowerEnergy[i];
103 0 : fZN1TowerEnergyLR[i] = zdc.fZN1TowerEnergyLR[i];
104 0 : fZN2TowerEnergyLR[i] = zdc.fZN2TowerEnergyLR[i];
105 0 : fZP1TowerEnergyLR[i] = zdc.fZP1TowerEnergyLR[i];
106 0 : fZP2TowerEnergyLR[i] = zdc.fZP2TowerEnergyLR[i];
107 : }
108 0 : for(Int_t i=0; i<2; i++){
109 0 : fZNACentrCoord[i] = zdc.fZNACentrCoord[i];
110 0 : fZNCCentrCoord[i] = zdc.fZNCCentrCoord[i];
111 : }
112 0 : for(Int_t i=0; i<32; i++){
113 0 : fVMEScaler[i] = zdc.fVMEScaler[i];
114 0 : for(Int_t y=0; y<4; y++){
115 0 : fZDCTDCData[i][y] = zdc.fZDCTDCData[i][y];
116 0 : fZDCTDCCorrected[i][y] = zdc.fZDCTDCCorrected[i][y];
117 : }
118 : }
119 0 : for(int it=0; it<7; it++) fZDCTDCChannels[it]=zdc.fZDCTDCChannels[it];
120 0 : }
121 :
122 : //______________________________________________________________________________
123 : AliESDZDC& AliESDZDC::operator=(const AliESDZDC&zdc)
124 : {
125 : // assigment operator
126 20 : if(this!=&zdc) {
127 10 : AliVZDC::operator=(zdc);
128 10 : fZDCN1Energy = zdc.fZDCN1Energy;
129 10 : fZDCP1Energy = zdc.fZDCP1Energy;
130 10 : fZDCN2Energy = zdc.fZDCN2Energy;
131 10 : fZDCP2Energy = zdc.fZDCP2Energy;
132 10 : fZDCEMEnergy = zdc.fZDCEMEnergy;
133 10 : fZDCEMEnergy1 = zdc.fZDCEMEnergy1;
134 120 : for(Int_t i=0; i<5; i++){
135 50 : fZN1TowerEnergy[i] = zdc.fZN1TowerEnergy[i];
136 50 : fZN2TowerEnergy[i] = zdc.fZN2TowerEnergy[i];
137 50 : fZP1TowerEnergy[i] = zdc.fZP1TowerEnergy[i];
138 50 : fZP2TowerEnergy[i] = zdc.fZP2TowerEnergy[i];
139 50 : fZN1TowerEnergyLR[i] = zdc.fZN1TowerEnergyLR[i];
140 50 : fZN2TowerEnergyLR[i] = zdc.fZN2TowerEnergyLR[i];
141 50 : fZP1TowerEnergyLR[i] = zdc.fZP1TowerEnergyLR[i];
142 50 : fZP2TowerEnergyLR[i] = zdc.fZP2TowerEnergyLR[i];
143 : }
144 : //
145 10 : fZDCParticipants = zdc.fZDCParticipants;
146 10 : fZDCPartSideA = zdc.fZDCPartSideA;
147 10 : fZDCPartSideC = zdc.fZDCPartSideC;
148 10 : fImpactParameter = zdc.fImpactParameter;
149 10 : fImpactParamSideA = zdc.fImpactParamSideA;
150 10 : fImpactParamSideC = zdc.fImpactParamSideC;
151 : //
152 60 : for(Int_t i=0; i<2; i++){
153 20 : fZNACentrCoord[i] = zdc.fZNACentrCoord[i];
154 20 : fZNCCentrCoord[i] = zdc.fZNCCentrCoord[i];
155 : }
156 : //
157 10 : fESDQuality = zdc.fESDQuality;
158 660 : for(Int_t i=0; i<32; i++){
159 320 : fVMEScaler[i] = zdc.fVMEScaler[i];
160 3200 : for(Int_t y=0; y<4; y++){
161 1280 : fZDCTDCData[i][y] = zdc.fZDCTDCData[i][y];
162 1280 : fZDCTDCCorrected[i][y] = zdc.fZDCTDCCorrected[i][y];
163 : }
164 : }
165 10 : }
166 10 : fZNCTDChit = zdc.fZNCTDChit;
167 10 : fZNATDChit = zdc.fZNATDChit;
168 10 : fZPCTDChit = zdc.fZPCTDChit;
169 10 : fZPATDChit = zdc.fZPATDChit;
170 10 : fZEM1TDChit = zdc.fZEM1TDChit;
171 10 : fZEM2TDChit = zdc.fZEM2TDChit;
172 :
173 160 : for(int it=0; it<7; it++) fZDCTDCChannels[it]=zdc.fZDCTDCChannels[it];
174 :
175 10 : return *this;
176 : }
177 :
178 : //______________________________________________________________________________
179 : void AliESDZDC::Copy(TObject &obj) const {
180 :
181 : // this overwrites the virtual TOBject::Copy()
182 : // to allow run time copying without casting
183 : // in AliESDEvent
184 :
185 4 : if(this==&obj)return;
186 6 : AliESDZDC *robj = dynamic_cast<AliESDZDC*>(&obj);
187 2 : if(!robj)return; // not an AliESDZDC
188 2 : *robj = *this;
189 :
190 4 : }
191 :
192 :
193 : //______________________________________________________________________________
194 : void AliESDZDC::Reset()
195 : {
196 : // reset all data members
197 66 : fZDCN1Energy=0;
198 33 : fZDCP1Energy=0;
199 33 : fZDCN2Energy=0;
200 33 : fZDCP2Energy=0;
201 33 : fZDCEMEnergy=0;
202 33 : fZDCEMEnergy1=0;
203 396 : for(Int_t i=0; i<5; i++){
204 165 : fZN1TowerEnergy[i] = fZN2TowerEnergy[i] = 0.;
205 165 : fZP1TowerEnergy[i] = fZP2TowerEnergy[i] = 0.;
206 165 : fZN1TowerEnergyLR[i] = fZN2TowerEnergyLR[i] = 0.;
207 165 : fZP1TowerEnergyLR[i] = fZP2TowerEnergyLR[i] = 0.;
208 : }
209 33 : fZDCParticipants=0;
210 33 : fZDCPartSideA=0;
211 33 : fZDCPartSideC=0;
212 33 : fImpactParameter=0;
213 33 : fImpactParamSideA=0;
214 33 : fImpactParamSideC=0;
215 198 : for(Int_t i=0; i<2; i++){
216 66 : fZNACentrCoord[i] = fZNCCentrCoord[i] = 0.;
217 : }
218 33 : fESDQuality=0;
219 2178 : for(Int_t i=0; i<32; i++){
220 1056 : fVMEScaler[i] = 0;
221 10560 : for(Int_t y=0; y<4; y++){
222 4224 : fZDCTDCData[i][y] = 0;
223 4224 : fZDCTDCCorrected[i][y] = 0.;
224 : }
225 : }
226 33 : fZNCTDChit = kFALSE;
227 33 : fZNATDChit = kFALSE;
228 33 : fZPCTDChit = kFALSE;
229 33 : fZPATDChit = kFALSE;
230 33 : fZEM1TDChit = kFALSE;
231 33 : fZEM2TDChit = kFALSE;
232 :
233 528 : for(int it=0; it<7; it++) fZDCTDCChannels[it]=-1;
234 :
235 33 : }
236 :
237 : //______________________________________________________________________________
238 : void AliESDZDC::Print(const Option_t *) const
239 : {
240 : // Print ESD for the ZDC
241 0 : printf(" ### ZDC energies: \n");
242 0 : printf("\n \t E_ZNC = %1.2f (%1.2f+%1.2f+%1.2f+%1.2f+%1.2f) GeV \n \t E_ZNA = %1.2f (%1.2f+%1.2f+%1.2f+%1.2f+%1.2f) GeV\n"
243 : " \t E_ZPC = %1.2f GeV E_ZPA = %1.2f GeV"
244 : "\n E_ZEM1 = %1.2f GeV, E_ZEM2 = %1.2f GeV\n \n",
245 0 : fZDCN1Energy, fZN1TowerEnergy[0], fZN1TowerEnergy[1], fZN1TowerEnergy[2], fZN1TowerEnergy[3], fZN1TowerEnergy[4],
246 0 : fZDCN2Energy, fZN2TowerEnergy[0], fZN2TowerEnergy[1], fZN2TowerEnergy[2], fZN2TowerEnergy[3], fZN2TowerEnergy[4],
247 0 : fZDCP1Energy,fZDCP2Energy, fZDCEMEnergy, fZDCEMEnergy1);
248 : //
249 : /*printf(" ### VMEScaler (!=0): \n");
250 : for(Int_t i=0; i<32; i++) if(fVMEScaler[i]!=0) printf("\t %d \n",fVMEScaler[i]);
251 : printf("\n");*/
252 : //
253 0 : if(TestBit(AliESDZDC::kTDCcablingSet)) printf(" ### TDC channels: ZNA %d ZPA %d ZEM1 %d ZEM2 %d ZNC %d ZPC%d L0 %d\n\n",
254 0 : fZDCTDCChannels[0],fZDCTDCChannels[1],fZDCTDCChannels[2],fZDCTDCChannels[3],fZDCTDCChannels[4],fZDCTDCChannels[5],fZDCTDCChannels[6]);
255 : /*for(Int_t i=0; i<32; i++){
256 : for(Int_t j=0; j<4; j++)
257 : if(TMath::Abs(fZDCTDCCorrected[i][j])>1e-4) printf("\t %1.0f \n",fZDCTDCCorrected[i][j]);
258 : }*/
259 0 : printf("\n");
260 0 : }
261 :
262 : //______________________________________________________________________________
263 : Bool_t AliESDZDC::GetZNCentroidInPbPb(Float_t beamEne, Double_t centrZNC[2], Double_t centrZNA[2])
264 : {
265 : // Provide coordinates of centroid over ZN (side C) front face
266 0 : if(beamEne==0){
267 0 : printf(" ZDC centroid in PbPb can't be calculated with E_beam = 0 !!!\n");
268 0 : for(Int_t jj=0; jj<2; jj++) fZNCCentrCoord[jj] = 999.;
269 0 : return kFALSE;
270 : }
271 :
272 : const Float_t x[4] = {-1.75, 1.75, -1.75, 1.75};
273 : const Float_t y[4] = {-1.75, -1.75, 1.75, 1.75};
274 : const Float_t alpha=0.395;
275 : Float_t numXZNC=0., numYZNC=0., denZNC=0., cZNC, wZNC;
276 : Float_t numXZNA=0., numYZNA=0., denZNA=0., cZNA, wZNA;
277 : //
278 0 : for(Int_t i=0; i<4; i++){
279 0 : if(fZN1TowerEnergy[i+1]>0.) {
280 0 : wZNC = TMath::Power(fZN1TowerEnergy[i+1], alpha);
281 0 : numXZNC += x[i]*wZNC;
282 0 : numYZNC += y[i]*wZNC;
283 0 : denZNC += wZNC;
284 0 : }
285 0 : if(fZN2TowerEnergy[i+1]>0.) {
286 0 : wZNA = TMath::Power(fZN2TowerEnergy[i+1], alpha);
287 0 : numXZNA += x[i]*wZNA;
288 0 : numYZNA += y[i]*wZNA;
289 0 : denZNA += wZNA;
290 0 : }
291 : }
292 : //
293 0 : if(denZNC!=0){
294 0 : Float_t nSpecnC = fZDCN1Energy/beamEne;
295 0 : cZNC = 1.89358-0.71262/(nSpecnC+0.71789);
296 0 : fZNCCentrCoord[0] = cZNC*numXZNC/denZNC;
297 0 : fZNCCentrCoord[1] = cZNC*numYZNC/denZNC;
298 0 : }
299 : else{
300 0 : fZNCCentrCoord[0] = fZNCCentrCoord[1] = 999.;
301 : }
302 0 : if(denZNA!=0){
303 0 : Float_t nSpecnA = fZDCN2Energy/beamEne;
304 0 : cZNA = 1.89358-0.71262/(nSpecnA+0.71789);
305 0 : fZNACentrCoord[0] = cZNA*numXZNA/denZNA;
306 0 : fZNACentrCoord[1] = cZNA*numYZNA/denZNA;
307 0 : }
308 : else{
309 0 : fZNACentrCoord[0] = fZNACentrCoord[1] = 999.;
310 : }
311 : //
312 0 : for(Int_t il=0; il<2; il++){
313 0 : centrZNC[il] = fZNCCentrCoord[il];
314 0 : centrZNA[il] = fZNACentrCoord[il];
315 : }
316 :
317 : return kTRUE;
318 0 : }
319 :
320 : //______________________________________________________________________________
321 : Bool_t AliESDZDC::GetZNCentroidInpp(Double_t centrZNC[2], Double_t centrZNA[2])
322 : {
323 : // Provide coordinates of centroid over ZN (side C) front face
324 : const Float_t x[4] = {-1.75, 1.75, -1.75, 1.75};
325 : const Float_t y[4] = {-1.75, -1.75, 1.75, 1.75};
326 : const Float_t alpha=0.5;
327 : Float_t numXZNC=0., numYZNC=0., denZNC=0., wZNC;
328 : Float_t numXZNA=0., numYZNA=0., denZNA=0., wZNA;
329 : //
330 0 : for(Int_t i=0; i<4; i++){
331 0 : if(fZN1TowerEnergy[i+1]>0.) {
332 0 : wZNC = TMath::Power(fZN1TowerEnergy[i+1], alpha);
333 0 : numXZNC += x[i]*wZNC;
334 0 : numYZNC += y[i]*wZNC;
335 0 : denZNC += wZNC;
336 0 : }
337 0 : if(fZN2TowerEnergy[i+1]>0.) {
338 0 : wZNA = TMath::Power(fZN2TowerEnergy[i+1], alpha);
339 0 : numXZNA += x[i]*wZNA;
340 0 : numYZNA += y[i]*wZNA;
341 0 : denZNA += wZNA;
342 0 : }
343 : }
344 : //
345 0 : if(denZNC!=0){
346 0 : fZNCCentrCoord[0] = numXZNC/denZNC;
347 0 : fZNCCentrCoord[1] = numYZNC/denZNC;
348 0 : }
349 : else{
350 0 : fZNCCentrCoord[0] = fZNCCentrCoord[1] = 999.;
351 : }
352 0 : if(denZNA!=0){
353 0 : fZNACentrCoord[0] = numXZNA/denZNA;
354 0 : fZNACentrCoord[1] = numYZNA/denZNA;
355 0 : }
356 : else{
357 0 : fZNACentrCoord[0] = fZNACentrCoord[1] = 999.;
358 : }
359 : //
360 0 : for(Int_t il=0; il<2; il++){
361 0 : centrZNC[il] = fZNCCentrCoord[il];
362 0 : centrZNA[il] = fZNACentrCoord[il];
363 : }
364 :
365 0 : return kTRUE;
366 : }
367 :
368 : //______________________________________________________________________________
369 : Float_t AliESDZDC::GetZNTDCSum(Int_t ihit) const
370 : {
371 16 : if(ihit>4 || !(AliESDZDC::kCorrectedTDCFilled)){
372 0 : return 1000.; // only up to 4 hits are stored && return sum only for calibrated TDCs
373 : }
374 : else{
375 8 : if(!(TestBit(AliESDZDC::kTDCcablingSet))){ // RUN1: data cabled ch. hardwired in the code
376 0 : if((fZDCTDCData[10][ihit]!=0) && (fZDCTDCData[12][ihit]!=0)) return (Float_t) (fZDCTDCCorrected[10][ihit]+fZDCTDCCorrected[12][ihit]);
377 0 : else return 999.;
378 : }
379 : else{ // RUN2: everything done from mapping
380 8 : if(fZDCTDCChannels[4]<0 || fZDCTDCChannels[2]<0){// RUN2 data but without signal code!!!
381 8 : if((fZDCTDCData[16][ihit]!=0) && (fZDCTDCData[18][ihit]!=0)) return (Float_t) (fZDCTDCCorrected[16][ihit]+fZDCTDCCorrected[18][ihit]);
382 8 : else return 998.;
383 : }
384 : else{
385 0 : if((fZDCTDCData[fZDCTDCChannels[4]][ihit]!=0) && (fZDCTDCData[fZDCTDCChannels[2]][ihit]!=0)) return (Float_t) (fZDCTDCCorrected[fZDCTDCChannels[4]][ihit]+fZDCTDCCorrected[fZDCTDCChannels[2]][ihit]);
386 0 : else return 997.;
387 : }
388 : }
389 : }
390 8 : }
391 :
392 : //______________________________________________________________________________
393 : Float_t AliESDZDC::GetZNTDCDiff(Int_t ihit) const
394 : {
395 16 : if(ihit>4 || !(AliESDZDC::kCorrectedTDCFilled)){
396 0 : return 1000.; // only up to 4 hits are stored && return sum only for calibrated TDCs
397 : }
398 : else{
399 8 : if(!(TestBit(AliESDZDC::kTDCcablingSet))){ // RUN1: data cabled ch. hardwired in the code
400 0 : if((fZDCTDCData[10][ihit]!=0) && (fZDCTDCData[12][ihit]!=0)) return (Float_t) (fZDCTDCCorrected[10][ihit]-fZDCTDCCorrected[12][ihit]);
401 0 : else return 999.;
402 : }
403 : else{ // RUN2: everything done from mapping
404 8 : if(fZDCTDCChannels[4]<0 || fZDCTDCChannels[2]<0){// RUN2 data but without signal code!!!
405 8 : if((fZDCTDCData[16][ihit]!=0) && (fZDCTDCData[18][ihit]!=0)) return (Float_t) (fZDCTDCCorrected[16][ihit]-fZDCTDCCorrected[18][ihit]);
406 8 : else return 998.;
407 : }
408 : else{
409 0 : if((fZDCTDCData[fZDCTDCChannels[4]][ihit]!=0) && (fZDCTDCData[fZDCTDCChannels[2]][ihit]!=0)) return (Float_t) (fZDCTDCCorrected[fZDCTDCChannels[2]][ihit]-fZDCTDCCorrected[fZDCTDCChannels[4]][ihit]);
410 0 : else return 997.;
411 : }
412 : }
413 : }
414 8 : }
|