Processing SPD Mean Vertex only in PHYSICS runs.
[u/mrichter/AliRoot.git] / STEER / 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   TObject(),
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++) fVMEScaler[i]=0;
57 }
58
59 //______________________________________________________________________________
60 AliESDZDC::AliESDZDC(const AliESDZDC& zdc) :
61   TObject(zdc),
62   fZDCN1Energy(zdc.fZDCN1Energy),
63   fZDCP1Energy(zdc.fZDCP1Energy),
64   fZDCN2Energy(zdc.fZDCN2Energy),
65   fZDCP2Energy(zdc.fZDCP2Energy),
66   fZDCEMEnergy(zdc.fZDCEMEnergy),
67   fZDCEMEnergy1(zdc.fZDCEMEnergy1),
68   fZDCParticipants(zdc.fZDCParticipants),
69   fZDCPartSideA(zdc.fZDCPartSideA),
70   fZDCPartSideC(zdc.fZDCPartSideC),
71   fImpactParameter(zdc.fImpactParameter),
72   fImpactParamSideA(zdc.fImpactParamSideA),
73   fImpactParamSideC(zdc.fImpactParamSideC),
74   fESDQuality(zdc.fESDQuality)
75 {
76   // copy constructor
77   for(Int_t i=0; i<5; i++){
78      fZN1TowerEnergy[i] = zdc.fZN1TowerEnergy[i];
79      fZN2TowerEnergy[i] = zdc.fZN2TowerEnergy[i];
80      fZP1TowerEnergy[i] = zdc.fZP1TowerEnergy[i];
81      fZP2TowerEnergy[i] = zdc.fZP2TowerEnergy[i];
82      fZN1TowerEnergyLR[i] = zdc.fZN1TowerEnergyLR[i];
83      fZN2TowerEnergyLR[i] = zdc.fZN2TowerEnergyLR[i];
84      fZP1TowerEnergyLR[i] = zdc.fZP1TowerEnergyLR[i];
85      fZP2TowerEnergyLR[i] = zdc.fZP2TowerEnergyLR[i];
86   }
87   for(Int_t i=0; i<2; i++){
88     fZNACentrCoord[i] = zdc.fZNACentrCoord[i];
89     fZNCCentrCoord[i] = zdc.fZNCCentrCoord[i];
90   }
91   for(Int_t i=0; i<32; i++) fVMEScaler[i] = zdc.fVMEScaler[i];
92 }
93
94 //______________________________________________________________________________
95 AliESDZDC& AliESDZDC::operator=(const AliESDZDC&zdc)
96 {
97   // assigment operator
98   if(this!=&zdc) {
99     TObject::operator=(zdc);
100     fZDCN1Energy = zdc.fZDCN1Energy;
101     fZDCP1Energy = zdc.fZDCP1Energy;
102     fZDCN2Energy = zdc.fZDCN2Energy;
103     fZDCP2Energy = zdc.fZDCP2Energy;
104     fZDCEMEnergy = zdc.fZDCEMEnergy;
105     fZDCEMEnergy1 = zdc.fZDCEMEnergy1;
106     for(Int_t i=0; i<5; i++){
107        fZN1TowerEnergy[i] = zdc.fZN1TowerEnergy[i];
108        fZN2TowerEnergy[i] = zdc.fZN2TowerEnergy[i];
109        fZP1TowerEnergy[i] = zdc.fZP1TowerEnergy[i];
110        fZP2TowerEnergy[i] = zdc.fZP2TowerEnergy[i];
111        fZN1TowerEnergyLR[i] = zdc.fZN1TowerEnergyLR[i];
112        fZN2TowerEnergyLR[i] = zdc.fZN2TowerEnergyLR[i];
113        fZP1TowerEnergyLR[i] = zdc.fZP1TowerEnergyLR[i];
114        fZP2TowerEnergyLR[i] = zdc.fZP2TowerEnergyLR[i];
115     }
116     //
117     fZDCParticipants = zdc.fZDCParticipants;
118     fZDCPartSideA = zdc.fZDCPartSideA;
119     fZDCPartSideC = zdc.fZDCPartSideC;
120     fImpactParameter = zdc.fImpactParameter;
121     fImpactParamSideA = zdc.fImpactParamSideA;
122     fImpactParamSideC = zdc.fImpactParamSideC;
123     //
124     for(Int_t i=0; i<2; i++){
125          fZNACentrCoord[i] = zdc.fZNACentrCoord[i];
126          fZNCCentrCoord[i] = zdc.fZNCCentrCoord[i];
127     }
128     //
129     fESDQuality = zdc.fESDQuality;
130     for(Int_t i=0; i<32; i++) fVMEScaler[i] = zdc.fVMEScaler[i];
131   } 
132   return *this;
133 }
134
135 //______________________________________________________________________________
136 void AliESDZDC::Copy(TObject &obj) const {
137   
138   // this overwrites the virtual TOBject::Copy()
139   // to allow run time copying without casting
140   // in AliESDEvent
141
142   if(this==&obj)return;
143   AliESDZDC *robj = dynamic_cast<AliESDZDC*>(&obj);
144   if(!robj)return; // not an AliESDZDC
145   *robj = *this;
146
147 }
148
149
150 //______________________________________________________________________________
151 void AliESDZDC::Reset()
152 {
153   // reset all data members
154   fZDCN1Energy=0;
155   fZDCP1Energy=0;
156   fZDCN2Energy=0;
157   fZDCP2Energy=0;
158   fZDCEMEnergy=0;
159   fZDCEMEnergy1=0;
160   for(Int_t i=0; i<5; i++){
161     fZN1TowerEnergy[i] = fZN2TowerEnergy[i] = 0.;
162     fZP1TowerEnergy[i] = fZP2TowerEnergy[i] = 0.;
163     fZN1TowerEnergyLR[i] = fZN2TowerEnergyLR[i] = 0.;
164     fZP1TowerEnergyLR[i] = fZP2TowerEnergyLR[i] = 0.;
165   }
166   fZDCParticipants=0;  
167   fZDCPartSideA=0;  
168   fZDCPartSideC=0;  
169   fImpactParameter=0;
170   fImpactParamSideA=0;
171   fImpactParamSideC=0;
172   for(Int_t i=0; i<2; i++){
173        fZNACentrCoord[i] = fZNCCentrCoord[i] = 0.;
174   }
175   fESDQuality=0;
176   for(Int_t i=0; i<32; i++) fVMEScaler[i] = 0;
177 }
178
179 //______________________________________________________________________________
180 void AliESDZDC::Print(const Option_t *) const
181 {
182   //  Print ESD for the ZDC
183   printf("\n \t E_{ZNC} = %f TeV, E_{ZPC} = %f TeV, E_{ZNA} = %f TeV, E_{ZPA} = %f TeV,"
184   " E_{ZEM} = %f GeV, Npart = %d, b = %1.2f fm\n",
185   fZDCN1Energy/1000.,fZDCP1Energy/1000.,fZDCN2Energy/1000.,fZDCP2Energy/1000.,
186   fZDCEMEnergy+fZDCEMEnergy1, fZDCParticipants,fImpactParameter);
187   //
188   printf(" ### fVMEScaler: \n");
189   for(Int_t i=0; i<32; i++) printf("\t datum %d: %d \n",i,fVMEScaler[i]);
190   printf("\n");
191 }
192
193 //______________________________________________________________________________
194 Bool_t AliESDZDC::GetZNCentroidInPbPb(Float_t beamEne, Double_t centrZNC[2], Double_t centrZNA[2]) 
195 {
196   // Provide coordinates of centroid over ZN (side C) front face
197   if(beamEne==0){
198     printf(" ZDC centroid in PbPb can't be calculated with E_beam = 0 !!!\n");
199     for(Int_t jj=0; jj<2; jj++) fZNCCentrCoord[jj] = 999.;
200     return kFALSE;
201   }
202
203   const Float_t x[4] = {-1.75, 1.75, -1.75, 1.75};
204   const Float_t y[4] = {-1.75, -1.75, 1.75, 1.75};
205   const Float_t alpha=0.395;
206   Float_t numXZNC=0., numYZNC=0., denZNC=0., cZNC, wZNC; 
207   Float_t numXZNA=0., numYZNA=0., denZNA=0., cZNA, wZNA; 
208   //
209   for(Int_t i=0; i<4; i++){
210     if(fZN1TowerEnergy[i+1]>0.) {
211       wZNC = TMath::Power(fZN1TowerEnergy[i+1], alpha);
212       numXZNC += x[i]*wZNC;
213       numYZNC += y[i]*wZNC;
214       denZNC += wZNC;
215     }
216     if(fZN2TowerEnergy[i+1]>0.) {
217       wZNA = TMath::Power(fZN1TowerEnergy[i+1], alpha);
218       numXZNA += x[i]*wZNA;
219       numYZNA += y[i]*wZNA;
220       denZNA += wZNA;
221     }
222   }
223   //
224   if(denZNC!=0){
225     Float_t nSpecnC = fZDCN1Energy/beamEne;
226     cZNC = 1.89358-0.71262/(nSpecnC+0.71789);
227     fZNCCentrCoord[0] = cZNC*numXZNC/denZNC;
228     fZNCCentrCoord[1] = cZNC*numYZNC/denZNC;
229   } 
230   else{
231     fZNCCentrCoord[0] = fZNCCentrCoord[1] = 999.;
232   }
233   if(denZNA!=0){
234     Float_t nSpecnA = fZDCN1Energy/beamEne;
235     cZNA = 1.89358-0.71262/(nSpecnA+0.71789);
236     fZNCCentrCoord[0] = cZNA*numXZNA/denZNA;
237     fZNCCentrCoord[1] = cZNA*numYZNA/denZNA;
238   } 
239   else{
240     fZNACentrCoord[0] = fZNACentrCoord[1] = 999.;
241   }
242   //
243   for(Int_t il=0; il<2; il++){
244     centrZNC[il] = fZNCCentrCoord[il];
245     centrZNA[il] = fZNACentrCoord[il];
246   }
247   
248   return kTRUE;
249 }
250
251 //______________________________________________________________________________
252 Bool_t AliESDZDC::GetZNCentroidInpp(Double_t centrZNC[2], Double_t centrZNA[2]) 
253 {
254   // Provide coordinates of centroid over ZN (side C) front face
255   const Float_t x[4] = {-1.75, 1.75, -1.75, 1.75};
256   const Float_t y[4] = {-1.75, -1.75, 1.75, 1.75};
257   const Float_t alpha=0.5;
258   Float_t numXZNC=0., numYZNC=0., denZNC=0., wZNC; 
259   Float_t numXZNA=0., numYZNA=0., denZNA=0., wZNA; 
260   //
261   for(Int_t i=0; i<4; i++){
262     if(fZN1TowerEnergy[i+1]>0.) {
263       wZNC = TMath::Power(fZN1TowerEnergy[i+1], alpha);
264       numXZNC += x[i]*wZNC;
265       numYZNC += y[i]*wZNC;
266       denZNC += wZNC;
267     }
268     if(fZN2TowerEnergy[i+1]>0.) {
269       wZNA = TMath::Power(fZN2TowerEnergy[i+1], alpha);
270       numXZNA += x[i]*wZNA;
271       numYZNA += y[i]*wZNA;
272       denZNA += wZNA;
273     }
274   }
275   //
276   if(denZNC!=0){
277     fZNCCentrCoord[0] = numXZNC/denZNC;
278     fZNCCentrCoord[1] = numYZNC/denZNC;
279   } 
280   else{
281     fZNCCentrCoord[0] = fZNCCentrCoord[1] = 999.;
282   }
283   if(denZNA!=0){
284     fZNACentrCoord[0] = numXZNA/denZNA;
285     fZNACentrCoord[1] = numYZNA/denZNA;
286   } 
287   else{
288     fZNACentrCoord[0] = fZNACentrCoord[1] = 999.;
289   }
290   //
291   for(Int_t il=0; il<2; il++){
292     centrZNC[il] = fZNCCentrCoord[il];
293     centrZNA[il] = fZNACentrCoord[il];
294   }
295   
296   return kTRUE;
297 }