In AddTaskPHOSPi0Flow.C set Cent. Bin past event buffers/lists,
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDZDC.cxx
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 ClassImp(AliESDZDC)
29
30 //______________________________________________________________________________
31 AliESDZDC::AliESDZDC() :
32   AliVZDC(),
33   fZDCN1Energy(0),
34   fZDCP1Energy(0),
35   fZDCN2Energy(0),
36   fZDCP2Energy(0),
37   fZDCEMEnergy(0),
38   fZDCEMEnergy1(0),
39   fZDCParticipants(0),
40   fZDCPartSideA(0),
41   fZDCPartSideC(0),
42   fImpactParameter(0),
43   fImpactParamSideA(0),
44   fImpactParamSideC(0),
45   fESDQuality(0)
46 {
47   for(Int_t i=0; i<5; i++){
48     fZN1TowerEnergy[i] = fZN2TowerEnergy[i] = 0.;
49     fZP1TowerEnergy[i] = fZP2TowerEnergy[i] = 0.;
50     fZN1TowerEnergyLR[i] = fZN2TowerEnergyLR[i] = 0.;
51     fZP1TowerEnergyLR[i] = fZP2TowerEnergyLR[i] = 0.;
52   }
53   for(Int_t i=0; i<2; i++){
54     fZNACentrCoord[i] = fZNCCentrCoord[i] = 0.;
55   }
56   for(Int_t i=0; i<32; i++){
57     fVMEScaler[i]=0;
58     for(Int_t y=0; y<4; y++){
59       fZDCTDCData[i][y]=0;
60       fZDCTDCCorrected[i][y]=0.;
61     }
62   }
63 }
64
65 //______________________________________________________________________________
66 AliESDZDC::AliESDZDC(const AliESDZDC& zdc) :
67   AliVZDC(zdc),
68   fZDCN1Energy(zdc.fZDCN1Energy),
69   fZDCP1Energy(zdc.fZDCP1Energy),
70   fZDCN2Energy(zdc.fZDCN2Energy),
71   fZDCP2Energy(zdc.fZDCP2Energy),
72   fZDCEMEnergy(zdc.fZDCEMEnergy),
73   fZDCEMEnergy1(zdc.fZDCEMEnergy1),
74   fZDCParticipants(zdc.fZDCParticipants),
75   fZDCPartSideA(zdc.fZDCPartSideA),
76   fZDCPartSideC(zdc.fZDCPartSideC),
77   fImpactParameter(zdc.fImpactParameter),
78   fImpactParamSideA(zdc.fImpactParamSideA),
79   fImpactParamSideC(zdc.fImpactParamSideC),
80   fESDQuality(zdc.fESDQuality)
81 {
82   // copy constructor
83   for(Int_t i=0; i<5; i++){
84      fZN1TowerEnergy[i] = zdc.fZN1TowerEnergy[i];
85      fZN2TowerEnergy[i] = zdc.fZN2TowerEnergy[i];
86      fZP1TowerEnergy[i] = zdc.fZP1TowerEnergy[i];
87      fZP2TowerEnergy[i] = zdc.fZP2TowerEnergy[i];
88      fZN1TowerEnergyLR[i] = zdc.fZN1TowerEnergyLR[i];
89      fZN2TowerEnergyLR[i] = zdc.fZN2TowerEnergyLR[i];
90      fZP1TowerEnergyLR[i] = zdc.fZP1TowerEnergyLR[i];
91      fZP2TowerEnergyLR[i] = zdc.fZP2TowerEnergyLR[i];
92   }
93   for(Int_t i=0; i<2; i++){
94     fZNACentrCoord[i] = zdc.fZNACentrCoord[i];
95     fZNCCentrCoord[i] = zdc.fZNCCentrCoord[i];
96   }
97   for(Int_t i=0; i<32; i++){
98     fVMEScaler[i] = zdc.fVMEScaler[i];
99     for(Int_t y=0; y<4; y++){
100        fZDCTDCData[i][y] = zdc.fZDCTDCData[i][y];
101        fZDCTDCCorrected[i][y] = zdc.fZDCTDCCorrected[i][y];
102     }
103   }
104 }
105
106 //______________________________________________________________________________
107 AliESDZDC& AliESDZDC::operator=(const AliESDZDC&zdc)
108 {
109   // assigment operator
110   if(this!=&zdc) {
111     AliVZDC::operator=(zdc);
112     fZDCN1Energy = zdc.fZDCN1Energy;
113     fZDCP1Energy = zdc.fZDCP1Energy;
114     fZDCN2Energy = zdc.fZDCN2Energy;
115     fZDCP2Energy = zdc.fZDCP2Energy;
116     fZDCEMEnergy = zdc.fZDCEMEnergy;
117     fZDCEMEnergy1 = zdc.fZDCEMEnergy1;
118     for(Int_t i=0; i<5; i++){
119        fZN1TowerEnergy[i] = zdc.fZN1TowerEnergy[i];
120        fZN2TowerEnergy[i] = zdc.fZN2TowerEnergy[i];
121        fZP1TowerEnergy[i] = zdc.fZP1TowerEnergy[i];
122        fZP2TowerEnergy[i] = zdc.fZP2TowerEnergy[i];
123        fZN1TowerEnergyLR[i] = zdc.fZN1TowerEnergyLR[i];
124        fZN2TowerEnergyLR[i] = zdc.fZN2TowerEnergyLR[i];
125        fZP1TowerEnergyLR[i] = zdc.fZP1TowerEnergyLR[i];
126        fZP2TowerEnergyLR[i] = zdc.fZP2TowerEnergyLR[i];
127     }
128     //
129     fZDCParticipants = zdc.fZDCParticipants;
130     fZDCPartSideA = zdc.fZDCPartSideA;
131     fZDCPartSideC = zdc.fZDCPartSideC;
132     fImpactParameter = zdc.fImpactParameter;
133     fImpactParamSideA = zdc.fImpactParamSideA;
134     fImpactParamSideC = zdc.fImpactParamSideC;
135     //
136     for(Int_t i=0; i<2; i++){
137          fZNACentrCoord[i] = zdc.fZNACentrCoord[i];
138          fZNCCentrCoord[i] = zdc.fZNCCentrCoord[i];
139     }
140     //
141     fESDQuality = zdc.fESDQuality;
142     for(Int_t i=0; i<32; i++){
143       fVMEScaler[i] = zdc.fVMEScaler[i];
144       for(Int_t y=0; y<4; y++){ 
145          fZDCTDCData[i][y] = zdc.fZDCTDCData[i][y];
146          fZDCTDCCorrected[i][y] = zdc.fZDCTDCCorrected[i][y];
147       }
148     }
149   } 
150   return *this;
151 }
152
153 //______________________________________________________________________________
154 void AliESDZDC::Copy(TObject &obj) const {
155   
156   // this overwrites the virtual TOBject::Copy()
157   // to allow run time copying without casting
158   // in AliESDEvent
159
160   if(this==&obj)return;
161   AliESDZDC *robj = dynamic_cast<AliESDZDC*>(&obj);
162   if(!robj)return; // not an AliESDZDC
163   *robj = *this;
164
165 }
166
167
168 //______________________________________________________________________________
169 void AliESDZDC::Reset()
170 {
171   // reset all data members
172   fZDCN1Energy=0;
173   fZDCP1Energy=0;
174   fZDCN2Energy=0;
175   fZDCP2Energy=0;
176   fZDCEMEnergy=0;
177   fZDCEMEnergy1=0;
178   for(Int_t i=0; i<5; i++){
179     fZN1TowerEnergy[i] = fZN2TowerEnergy[i] = 0.;
180     fZP1TowerEnergy[i] = fZP2TowerEnergy[i] = 0.;
181     fZN1TowerEnergyLR[i] = fZN2TowerEnergyLR[i] = 0.;
182     fZP1TowerEnergyLR[i] = fZP2TowerEnergyLR[i] = 0.;
183   }
184   fZDCParticipants=0;  
185   fZDCPartSideA=0;  
186   fZDCPartSideC=0;  
187   fImpactParameter=0;
188   fImpactParamSideA=0;
189   fImpactParamSideC=0;
190   for(Int_t i=0; i<2; i++){
191        fZNACentrCoord[i] = fZNCCentrCoord[i] = 0.;
192   }
193   fESDQuality=0;
194   for(Int_t i=0; i<32; i++){
195      fVMEScaler[i] = 0;
196      for(Int_t y=0; y<4; y++){
197         fZDCTDCData[i][y] = 0;
198         fZDCTDCCorrected[i][y] = 0.;
199      }
200   }
201 }
202
203 //______________________________________________________________________________
204 void AliESDZDC::Print(const Option_t *) const
205 {
206   //  Print ESD for the ZDC
207   printf(" ### ZDC energies: \n");
208   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"
209   " \t E_ZPC = %1.2f GeV E_ZPA = %1.2f GeV"
210   "\n E_ZEM1 = %1.2f GeV,   E_ZEM2 = %1.2f GeV\n \t Npart = %d, b = %1.2f fm\n",
211   fZDCN1Energy, fZN1TowerEnergy[0], fZN1TowerEnergy[1], 
212   fZN1TowerEnergy[2], fZN1TowerEnergy[3], fZN1TowerEnergy[4], 
213   fZDCN2Energy,fZN2TowerEnergy[0], fZN2TowerEnergy[1], 
214   fZN2TowerEnergy[2], fZN2TowerEnergy[3], fZN2TowerEnergy[4], 
215   fZDCP1Energy,fZDCP2Energy, fZDCEMEnergy, fZDCEMEnergy1, 
216   fZDCParticipants,fImpactParameter);
217   //
218   /*printf(" ### VMEScaler (!=0): \n");
219   for(Int_t i=0; i<32; i++) if(fVMEScaler[i]!=0) printf("\t %d \n",fVMEScaler[i]);
220   printf("\n");
221   //
222   printf(" ### TDCData (!=0): \n");
223   for(Int_t i=0; i<32; i++){
224     for(Int_t j=0; j<4; j++)
225       if(TMath::Abs(fZDCTDCCorrected[i][j])>1e-4) printf("\t %1.0f \n",fZDCTDCCorrected[i][j]);
226   }*/
227   printf("\n");
228 }
229
230 //______________________________________________________________________________
231 Bool_t AliESDZDC::GetZNCentroidInPbPb(Float_t beamEne, Double_t centrZNC[2], Double_t centrZNA[2]) 
232 {
233   // Provide coordinates of centroid over ZN (side C) front face
234   if(beamEne==0){
235     printf(" ZDC centroid in PbPb can't be calculated with E_beam = 0 !!!\n");
236     for(Int_t jj=0; jj<2; jj++) fZNCCentrCoord[jj] = 999.;
237     return kFALSE;
238   }
239
240   const Float_t x[4] = {-1.75, 1.75, -1.75, 1.75};
241   const Float_t y[4] = {-1.75, -1.75, 1.75, 1.75};
242   const Float_t alpha=0.395;
243   Float_t numXZNC=0., numYZNC=0., denZNC=0., cZNC, wZNC; 
244   Float_t numXZNA=0., numYZNA=0., denZNA=0., cZNA, wZNA; 
245   //
246   for(Int_t i=0; i<4; i++){
247     if(fZN1TowerEnergy[i+1]>0.) {
248       wZNC = TMath::Power(fZN1TowerEnergy[i+1], alpha);
249       numXZNC += x[i]*wZNC;
250       numYZNC += y[i]*wZNC;
251       denZNC += wZNC;
252     }
253     if(fZN2TowerEnergy[i+1]>0.) {
254       wZNA = TMath::Power(fZN2TowerEnergy[i+1], alpha);
255       numXZNA += x[i]*wZNA;
256       numYZNA += y[i]*wZNA;
257       denZNA += wZNA;
258     }
259   }
260   //
261   if(denZNC!=0){
262     Float_t nSpecnC = fZDCN1Energy/beamEne;
263     cZNC = 1.89358-0.71262/(nSpecnC+0.71789);
264     fZNCCentrCoord[0] = cZNC*numXZNC/denZNC;
265     fZNCCentrCoord[1] = cZNC*numYZNC/denZNC;
266   } 
267   else{
268     fZNCCentrCoord[0] = fZNCCentrCoord[1] = 999.;
269   }
270   if(denZNA!=0){
271     Float_t nSpecnA = fZDCN2Energy/beamEne;
272     cZNA = 1.89358-0.71262/(nSpecnA+0.71789);
273     fZNACentrCoord[0] = cZNA*numXZNA/denZNA;
274     fZNACentrCoord[1] = cZNA*numYZNA/denZNA;
275   } 
276   else{
277     fZNACentrCoord[0] = fZNACentrCoord[1] = 999.;
278   }
279   //
280   for(Int_t il=0; il<2; il++){
281     centrZNC[il] = fZNCCentrCoord[il];
282     centrZNA[il] = fZNACentrCoord[il];
283   }
284   
285   return kTRUE;
286 }
287
288 //______________________________________________________________________________
289 Bool_t AliESDZDC::GetZNCentroidInpp(Double_t centrZNC[2], Double_t centrZNA[2]) 
290 {
291   // Provide coordinates of centroid over ZN (side C) front face
292   const Float_t x[4] = {-1.75, 1.75, -1.75, 1.75};
293   const Float_t y[4] = {-1.75, -1.75, 1.75, 1.75};
294   const Float_t alpha=0.5;
295   Float_t numXZNC=0., numYZNC=0., denZNC=0., wZNC; 
296   Float_t numXZNA=0., numYZNA=0., denZNA=0., wZNA; 
297   //
298   for(Int_t i=0; i<4; i++){
299     if(fZN1TowerEnergy[i+1]>0.) {
300       wZNC = TMath::Power(fZN1TowerEnergy[i+1], alpha);
301       numXZNC += x[i]*wZNC;
302       numYZNC += y[i]*wZNC;
303       denZNC += wZNC;
304     }
305     if(fZN2TowerEnergy[i+1]>0.) {
306       wZNA = TMath::Power(fZN2TowerEnergy[i+1], alpha);
307       numXZNA += x[i]*wZNA;
308       numYZNA += y[i]*wZNA;
309       denZNA += wZNA;
310     }
311   }
312   //
313   if(denZNC!=0){
314     fZNCCentrCoord[0] = numXZNC/denZNC;
315     fZNCCentrCoord[1] = numYZNC/denZNC;
316   } 
317   else{
318     fZNCCentrCoord[0] = fZNCCentrCoord[1] = 999.;
319   }
320   if(denZNA!=0){
321     fZNACentrCoord[0] = numXZNA/denZNA;
322     fZNACentrCoord[1] = numYZNA/denZNA;
323   } 
324   else{
325     fZNACentrCoord[0] = fZNACentrCoord[1] = 999.;
326   }
327   //
328   for(Int_t il=0; il<2; il++){
329     centrZNC[il] = fZNCCentrCoord[il];
330     centrZNA[il] = fZNACentrCoord[il];
331   }
332   
333   return kTRUE;
334 }