]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - STEER/ESD/AliESDRun.cxx
Merge branch 'MyGitDevelopment'
[u/mrichter/AliRoot.git] / STEER / ESD / AliESDRun.cxx
... / ...
CommitLineData
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#include <TNamed.h>
16#include <TGeoMatrix.h>
17#include <TGeoGlobalMagField.h>
18
19#include "AliESDRun.h"
20#include "AliESDVertex.h"
21#include "AliLog.h"
22#include "AliMagF.h"
23
24//-------------------------------------------------------------------------
25// Implementation Class AliESDRun
26// Run by run data
27// for the ESD
28// Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch
29//-------------------------------------------------------------------------
30
31ClassImp(AliESDRun)
32
33//______________________________________________________________________________
34AliESDRun::AliESDRun() :
35 TObject(),
36 fCurrentL3(0),
37 fCurrentDip(0),
38 fBeamEnergy(0),
39 fMagneticField(0),
40 fDiamondZ(0),
41 fDiamondSig2Z(0),
42 fPeriodNumber(0),
43 fRunNumber(0),
44 fRecoVersion(0),
45 fBeamType(""),
46 fTriggerClasses(kNTriggerClasses),
47 fDetInDAQ(0),
48 fDetInReco(0)
49{
50 //
51 // default ctor
52 //
53 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
54 fBeamParticle[0] = fBeamParticle[1] = 0;
55 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
56 fDiamondCovXY[1]=0.;
57 fTriggerClasses.SetOwner(kTRUE);
58 fMeanBeamInt[0][0]=fMeanBeamInt[0][1]=fMeanBeamInt[1][0]=fMeanBeamInt[1][1]=-1;
59 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
60 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
61 for (Int_t i=0; i<kT0spreadSize;i++) fT0spread[i]=0.;
62 for (Int_t it=0; it<8; it++) fCaloTriggerType[it]=0;
63 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=-1;
64}
65
66//______________________________________________________________________________
67AliESDRun::AliESDRun(const AliESDRun &esd) :
68 TObject(esd),
69 fCurrentL3(0),
70 fCurrentDip(0),
71 fBeamEnergy(0),
72 fMagneticField(esd.fMagneticField),
73 fDiamondZ(esd.fDiamondZ),
74 fDiamondSig2Z(esd.fDiamondSig2Z),
75 fPeriodNumber(esd.fPeriodNumber),
76 fRunNumber(esd.fRunNumber),
77 fRecoVersion(esd.fRecoVersion),
78 fBeamType(""),
79 fTriggerClasses(TObjArray(kNTriggerClasses)),
80 fDetInDAQ(0),
81 fDetInReco(0)
82{
83 //
84 // Copy constructor
85 //
86 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
87 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
88 for (Int_t i=0; i<2; i++) fBeamParticle[i] = esd.fBeamParticle[i];
89 for(Int_t i = 0; i < kNTriggerClasses; i++) {
90 TNamed *str = (TNamed *)((esd.fTriggerClasses).At(i));
91 if (str) fTriggerClasses.AddAt(new TNamed(*str),i);
92 }
93
94 for(Int_t m=0; m<kNPHOSMatrix; m++){
95 if(esd.fPHOSMatrix[m])
96 fPHOSMatrix[m]=new TGeoHMatrix(*(esd.fPHOSMatrix[m])) ;
97 else
98 fPHOSMatrix[m]=NULL;
99 }
100
101 for (int ib=2;ib--;) for (int it=2;it--;) fMeanBeamInt[ib][it] = esd.fMeanBeamInt[ib][it];
102
103 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
104 if(esd.fEMCALMatrix[sm])
105 fEMCALMatrix[sm]=new TGeoHMatrix(*(esd.fEMCALMatrix[sm])) ;
106 else
107 fEMCALMatrix[sm]=NULL;
108 }
109 for (Int_t i=0; i<kT0spreadSize;i++) fT0spread[i]=esd.fT0spread[i];
110 for (Int_t it=0; it<8; it++) fCaloTriggerType[it]=esd.fCaloTriggerType[it];
111 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=esd.fVZEROEqFactors[j];
112
113}
114
115//______________________________________________________________________________
116AliESDRun& AliESDRun::operator=(const AliESDRun &esd)
117{
118 // assigment operator
119 if(this!=&esd) {
120 TObject::operator=(esd);
121 fRunNumber=esd.fRunNumber;
122 fPeriodNumber=esd.fPeriodNumber;
123 fRecoVersion=esd.fRecoVersion;
124 fMagneticField=esd.fMagneticField;
125 fDiamondZ=esd.fDiamondZ;
126 fDiamondSig2Z=esd.fDiamondSig2Z;
127 fBeamType = esd.fBeamType;
128 fCurrentL3 = esd.fCurrentL3;
129 fCurrentDip = esd.fCurrentDip;
130 fBeamEnergy = esd.fBeamEnergy;
131 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
132 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
133 for (Int_t i=0; i<2; i++) fBeamParticle[i] = esd.fBeamParticle[i];
134 fTriggerClasses.Clear();
135 for(Int_t i = 0; i < kNTriggerClasses; i++) {
136 TNamed *str = (TNamed *)((esd.fTriggerClasses).At(i));
137 if (str) fTriggerClasses.AddAt(new TNamed(*str),i);
138 }
139
140 fDetInDAQ = esd.fDetInDAQ;
141 fDetInReco = esd.fDetInReco;
142
143 for (int ib=2;ib--;) for (int it=2;it--;) fMeanBeamInt[ib][it] = esd.fMeanBeamInt[ib][it];
144
145 for(Int_t m=0; m<kNPHOSMatrix; m++){
146 delete fPHOSMatrix[m];
147 if(esd.fPHOSMatrix[m])
148 fPHOSMatrix[m]=new TGeoHMatrix(*(esd.fPHOSMatrix[m])) ;
149 else
150 fPHOSMatrix[m]=0;
151 }
152
153 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
154 delete fEMCALMatrix[sm];
155 if(esd.fEMCALMatrix[sm])
156 fEMCALMatrix[sm]=new TGeoHMatrix(*(esd.fEMCALMatrix[sm])) ;
157 else
158 fEMCALMatrix[sm]=0;
159 }
160 }
161 for (Int_t i=0; i<kT0spreadSize;i++) fT0spread[i]=esd.fT0spread[i];
162 for (Int_t it=0; it<8; it++) fCaloTriggerType[it]=esd.fCaloTriggerType[it];
163 for (Int_t j=0; j<64; ++j) fVZEROEqFactors[j]=esd.fVZEROEqFactors[j];
164 return *this;
165}
166
167void AliESDRun::Copy(TObject &obj) const{
168
169 // this overwrites the virtual TOBject::Copy()
170 // to allow run time copying without casting
171 // in AliESDEvent
172
173 if(this==&obj)return;
174 AliESDRun *robj = dynamic_cast<AliESDRun*>(&obj);
175 if(!robj)return; // not an aliesdrun
176 *robj = *this;
177
178}
179
180//______________________________________________________________________________
181AliESDRun::~AliESDRun() {
182 // Destructor
183 // Delete PHOS position matrices
184 for(Int_t m=0; m<kNPHOSMatrix; m++) {
185 if(fPHOSMatrix[m]) delete fPHOSMatrix[m] ;
186 fPHOSMatrix[m] = NULL;
187 }
188 // Delete PHOS position matrices
189 for(Int_t sm=0; sm<kNEMCALMatrix; sm++) {
190 if(fEMCALMatrix[sm]) delete fEMCALMatrix[sm] ;
191 fEMCALMatrix[sm] = NULL;
192 }
193}
194
195void AliESDRun::SetDiamond(const AliESDVertex *vertex) {
196 // set the interaction diamond
197 if (vertex) {
198 fDiamondXY[0]=vertex->GetXv();
199 fDiamondXY[1]=vertex->GetYv();
200 fDiamondZ=vertex->GetZv();
201 Double32_t cov[6];
202 vertex->GetCovMatrix(cov);
203 fDiamondCovXY[0]=cov[0];
204 fDiamondCovXY[1]=cov[1];
205 fDiamondCovXY[2]=cov[2];
206 fDiamondSig2Z=cov[5];
207 }
208}
209
210
211//______________________________________________________________________________
212void AliESDRun::Print(const Option_t *) const
213{
214 // Print some data members
215 printf("Mean vertex in RUN %d: X=%.4f Y=%.4f Z=%.4f cm\n",
216 GetRunNumber(),GetDiamondX(),GetDiamondY(),GetDiamondZ());
217 printf("Beam Type: %s (%d/%d - %d/%d), Energy: %.1f GeV\n",fBeamType.IsNull() ? "N/A":GetBeamType(),
218 GetBeamParticleA(0),GetBeamParticleZ(0),GetBeamParticleA(1),GetBeamParticleZ(1),
219 fBeamEnergy);
220 printf("Magnetic field in IP= %f T | Currents: L3:%+.1f Dipole:%+.1f %s\n",
221 GetMagneticField(),fCurrentL3,fCurrentDip,TestBit(kUniformBMap) ? "(Uniform)":"");
222 printf("Event from reconstruction version %d \n",fRecoVersion);
223
224 printf("List of active trigger classes: ");
225 for(Int_t i = 0; i < kNTriggerClasses; i++) {
226 TNamed *str = (TNamed *)((fTriggerClasses).At(i));
227 if (str) printf("%s ",str->GetName());
228 }
229 printf("Mean intenstity for interacting : beam1:%+.3e beam2:%+.3e\n",fMeanBeamInt[0][0],fMeanBeamInt[1][0]);
230 printf("Mean intenstity for non-intecting : beam1:%+.3e beam2:%+.3e\n",fMeanBeamInt[0][1],fMeanBeamInt[1][1]);
231 printf("\n");
232}
233
234void AliESDRun::Reset()
235{
236 // reset data members
237 fRunNumber = 0;
238 fPeriodNumber = 0;
239 fRecoVersion = 0;
240 fMagneticField = 0;
241 fCurrentL3 = 0;
242 fCurrentDip = 0;
243 fBeamEnergy = 0;
244 fBeamType = "";
245 ResetBit(kBInfoStored|kUniformBMap|kConvSqrtSHalfGeV);
246 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
247 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
248 fDiamondCovXY[1]=0.;
249 fDiamondZ=0.;
250 fDiamondSig2Z=10.*10.;
251 fTriggerClasses.Clear();
252 fDetInDAQ = 0;
253 fDetInReco = 0;
254}
255
256//______________________________________________________________________________
257void AliESDRun::SetTriggerClass(const char*name, Int_t index)
258{
259 // Fill the trigger class name
260 // into the corresponding array
261 if (index >= kNTriggerClasses || index < 0) {
262 AliError(Form("Index (%d) is outside the allowed range (0,49)!",index));
263 return;
264 }
265
266 fTriggerClasses.AddAt(new TNamed(name,NULL),index);
267}
268
269//______________________________________________________________________________
270const char* AliESDRun::GetTriggerClass(Int_t index) const
271{
272 // Get the trigger class name at
273 // specified position in the trigger mask
274 TNamed *trclass = (TNamed *)fTriggerClasses.At(index);
275 if (trclass)
276 return trclass->GetName();
277 else
278 return "";
279}
280
281//______________________________________________________________________________
282TString AliESDRun::GetActiveTriggerClasses() const
283{
284 // Construct and return
285 // the list of trigger classes
286 // which are present in the run
287 TString trclasses;
288 for(Int_t i = 0; i < kNTriggerClasses; i++) {
289 TNamed *str = (TNamed *)((fTriggerClasses).At(i));
290 if (str) {
291 trclasses += " ";
292 trclasses += str->GetName();
293 trclasses += " ";
294 }
295 }
296
297 return trclasses;
298}
299
300//______________________________________________________________________________
301TString AliESDRun::GetFiredTriggerClasses(ULong64_t mask) const
302{
303 // Constructs and returns the
304 // list of trigger classes that
305 // have been fired. Uses the trigger
306 // class mask as an argument.
307 TString trclasses;
308 for(Int_t i = 0; i < kNTriggerClasses; i++) {
309 if (mask & (1ull << i)) {
310 TNamed *str = (TNamed *)((fTriggerClasses).At(i));
311 if (str) {
312 trclasses += " ";
313 trclasses += str->GetName();
314 trclasses += " ";
315 }
316 }
317 }
318
319 return trclasses;
320}
321
322//______________________________________________________________________________
323Bool_t AliESDRun::IsTriggerClassFired(ULong64_t mask, const char *name) const
324{
325 // Checks if the trigger class
326 // identified by 'name' has been
327 // fired. Uses the trigger class mask.
328
329 TNamed *trclass = (TNamed *)fTriggerClasses.FindObject(name);
330 if (!trclass) return kFALSE;
331
332 Int_t iclass = fTriggerClasses.IndexOf(trclass);
333 if (iclass < 0) return kFALSE;
334
335 if (mask & (1ull << iclass))
336 return kTRUE;
337 else
338 return kFALSE;
339}
340
341//_____________________________________________________________________________
342Bool_t AliESDRun::InitMagneticField() const
343{
344 // Create mag field from stored information
345 //
346 if (!TestBit(kBInfoStored)) {
347 AliError("No information on currents, cannot create field from run header");
348 return kFALSE;
349 }
350 //
351 AliMagF* fld = (AliMagF*) TGeoGlobalMagField::Instance()->GetField();
352 if (fld) {
353 if (TGeoGlobalMagField::Instance()->IsLocked()) {
354 if (fld->TestBit(AliMagF::kOverrideGRP)) {
355 AliInfo("ExpertMode!!! Information on magnet currents will be ignored !");
356 AliInfo("ExpertMode!!! Running with the externally locked B field !");
357 return kTRUE;
358 }
359 }
360 AliInfo("Destroying existing B field instance!");
361 delete TGeoGlobalMagField::Instance();
362 }
363 //
364 fld = AliMagF::CreateFieldMap(fCurrentL3,fCurrentDip,AliMagF::kConvLHC,
365 TestBit(kUniformBMap), GetBeamEnergy(), GetBeamType());
366 if (fld) {
367 TGeoGlobalMagField::Instance()->SetField( fld );
368 TGeoGlobalMagField::Instance()->Lock();
369 AliInfo("Running with the B field constructed out of the Run Header !");
370 return kTRUE;
371 }
372 else {
373 AliError("Failed to create a B field map !");
374 return kFALSE;
375 }
376 //
377}
378
379//_____________________________________________________________________________
380void AliESDRun::SetT0spread(Int_t i,Float_t t)
381{
382 //
383 // Setting the T0 spread value at index i
384 //
385
386 if ( (i>=0) && (i<kT0spreadSize)) {
387 fT0spread[i]=t;
388 } else {
389 AliError(Form("Index %d out of bound",i));
390 }
391 return;
392}
393
394//_____________________________________________________________________________
395void AliESDRun::SetT0spread(Float_t *t)
396{
397 //
398 // Setting the T0 spread values
399 //
400 if (t == 0x0){
401 AliError(Form("Null pointer passed"));
402 }
403 else{
404 for (Int_t i=0;i<kT0spreadSize;i++) fT0spread[i]=t[i];
405 }
406 return;
407}
408