1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 #include <TGeoMatrix.h>
17 #include <TGeoGlobalMagField.h>
19 #include "AliESDRun.h"
20 #include "AliESDVertex.h"
24 //-------------------------------------------------------------------------
25 // Implementation Class AliESDRun
28 // Origin: Christian Klein-Boesing, CERN, Christian.Klein-Boesing@cern.ch
29 //-------------------------------------------------------------------------
33 //______________________________________________________________________________
34 AliESDRun::AliESDRun() :
44 fTriggerClasses(kNTriggerClasses),
48 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
49 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
51 fTriggerClasses.SetOwner(kTRUE);
52 for (Int_t m=0; m<kNPHOSMatrix; m++) fPHOSMatrix[m]=NULL;
53 for (Int_t sm=0; sm<kNEMCALMatrix; sm++) fEMCALMatrix[sm]=NULL;
56 //______________________________________________________________________________
57 AliESDRun::AliESDRun(const AliESDRun &esd) :
62 fMagneticField(esd.fMagneticField),
63 fPeriodNumber(esd.fPeriodNumber),
64 fRunNumber(esd.fRunNumber),
65 fRecoVersion(esd.fRecoVersion),
67 fTriggerClasses(TObjArray(kNTriggerClasses)),
72 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
73 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
75 for(Int_t i = 0; i < kNTriggerClasses; i++) {
76 TNamed *str = (TNamed *)((esd.fTriggerClasses).At(i));
77 if (str) fTriggerClasses.AddAt(new TNamed(*str),i);
80 for(Int_t m=0; m<kNPHOSMatrix; m++){
81 if(esd.fPHOSMatrix[m])
82 fPHOSMatrix[m]=new TGeoHMatrix(*(esd.fPHOSMatrix[m])) ;
87 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
88 if(esd.fEMCALMatrix[sm])
89 fEMCALMatrix[sm]=new TGeoHMatrix(*(esd.fEMCALMatrix[sm])) ;
91 fEMCALMatrix[sm]=NULL;
95 //______________________________________________________________________________
96 AliESDRun& AliESDRun::operator=(const AliESDRun &esd)
100 TObject::operator=(esd);
101 fRunNumber=esd.fRunNumber;
102 fPeriodNumber=esd.fPeriodNumber;
103 fRecoVersion=esd.fRecoVersion;
104 fMagneticField=esd.fMagneticField;
105 fBeamType = esd.fBeamType;
106 fCurrentL3 = esd.fCurrentL3;
107 fCurrentDip = esd.fCurrentDip;
108 fBeamEnergy = esd.fBeamEnergy;
109 for (Int_t i=0; i<2; i++) fDiamondXY[i]=esd.fDiamondXY[i];
110 for (Int_t i=0; i<3; i++) fDiamondCovXY[i]=esd.fDiamondCovXY[i];
111 fTriggerClasses.Clear();
112 for(Int_t i = 0; i < kNTriggerClasses; i++) {
113 TNamed *str = (TNamed *)((esd.fTriggerClasses).At(i));
114 if (str) fTriggerClasses.AddAt(new TNamed(*str),i);
117 fDetInDAQ = esd.fDetInDAQ;
118 fDetInReco = esd.fDetInReco;
120 for(Int_t m=0; m<kNPHOSMatrix; m++){
121 if(esd.fPHOSMatrix[m])
122 fPHOSMatrix[m]=new TGeoHMatrix(*(esd.fPHOSMatrix[m])) ;
127 for(Int_t sm=0; sm<kNEMCALMatrix; sm++){
128 if(esd.fEMCALMatrix[sm])
129 fEMCALMatrix[sm]=new TGeoHMatrix(*(esd.fEMCALMatrix[sm])) ;
137 void AliESDRun::Copy(TObject &obj) const{
139 // this overwrites the virtual TOBject::Copy()
140 // to allow run time copying without casting
143 if(this==&obj)return;
144 AliESDRun *robj = dynamic_cast<AliESDRun*>(&obj);
145 if(!robj)return; // not an aliesdrun
150 //______________________________________________________________________________
151 AliESDRun::~AliESDRun() {
153 // Delete PHOS position matrices
154 for(Int_t m=0; m<kNPHOSMatrix; m++) {
155 if(fPHOSMatrix[m]) delete fPHOSMatrix[m] ;
156 fPHOSMatrix[m] = NULL;
158 // Delete PHOS position matrices
159 for(Int_t sm=0; sm<kNEMCALMatrix; sm++) {
160 if(fEMCALMatrix[sm]) delete fEMCALMatrix[sm] ;
161 fEMCALMatrix[sm] = NULL;
165 void AliESDRun::SetDiamond(const AliESDVertex *vertex) {
166 // set the interaction diamond
167 fDiamondXY[0]=vertex->GetXv();
168 fDiamondXY[1]=vertex->GetYv();
170 vertex->GetCovMatrix(cov);
171 fDiamondCovXY[0]=cov[0];
172 fDiamondCovXY[1]=cov[1];
173 fDiamondCovXY[2]=cov[2];
177 //______________________________________________________________________________
178 void AliESDRun::Print(const Option_t *) const
180 // Print some data members
181 printf("Mean vertex in RUN %d: X=%.4f Y=%.4f cm\n",
182 GetRunNumber(),GetDiamondX(),GetDiamondY());
183 printf("Beam Type: %s, Energy: %.1f GeV\n",fBeamType.IsNull() ? "N/A":fBeamType.Data(),fBeamEnergy);
184 printf("Magnetic field in IP= %f T | Currents: L3:%+.1f Dipole:%+.1f %s\n",
185 GetMagneticField(),fCurrentL3,fCurrentDip,TestBit(kUniformBMap) ? "(Uniform)":"");
186 printf("Event from reconstruction version %d \n",fRecoVersion);
188 printf("List of active trigger classes: ");
189 for(Int_t i = 0; i < kNTriggerClasses; i++) {
190 TNamed *str = (TNamed *)((fTriggerClasses).At(i));
191 if (str) printf("%s ",str->GetName());
196 void AliESDRun::Reset()
198 // reset data members
207 ResetBit(kBInfoStored|kUniformBMap|kConvSqrtSHalfGeV);
208 for (Int_t i=0; i<2; i++) fDiamondXY[i]=0.;
209 fDiamondCovXY[0]=fDiamondCovXY[2]=3.*3.;
211 fTriggerClasses.Clear();
216 //______________________________________________________________________________
217 void AliESDRun::SetTriggerClass(const char*name, Int_t index)
219 // Fill the trigger class name
220 // into the corresponding array
221 if (index >= kNTriggerClasses || index < 0) {
222 AliError(Form("Index (%d) is outside the allowed range (0,49)!",index));
226 fTriggerClasses.AddAt(new TNamed(name,NULL),index);
229 //______________________________________________________________________________
230 const char* AliESDRun::GetTriggerClass(Int_t index) const
232 // Get the trigger class name at
233 // specified position in the trigger mask
234 TNamed *trclass = (TNamed *)fTriggerClasses.At(index);
236 return trclass->GetName();
241 //______________________________________________________________________________
242 TString AliESDRun::GetActiveTriggerClasses() const
244 // Construct and return
245 // the list of trigger classes
246 // which are present in the run
248 for(Int_t i = 0; i < kNTriggerClasses; i++) {
249 TNamed *str = (TNamed *)((fTriggerClasses).At(i));
252 trclasses += str->GetName();
260 //______________________________________________________________________________
261 TString AliESDRun::GetFiredTriggerClasses(ULong64_t mask) const
263 // Constructs and returns the
264 // list of trigger classes that
265 // have been fired. Uses the trigger
266 // class mask as an argument.
268 for(Int_t i = 0; i < kNTriggerClasses; i++) {
269 if (mask & (1ull << i)) {
270 TNamed *str = (TNamed *)((fTriggerClasses).At(i));
273 trclasses += str->GetName();
282 //______________________________________________________________________________
283 Bool_t AliESDRun::IsTriggerClassFired(ULong64_t mask, const char *name) const
285 // Checks if the trigger class
286 // identified by 'name' has been
287 // fired. Uses the trigger class mask.
289 TNamed *trclass = (TNamed *)fTriggerClasses.FindObject(name);
290 if (!trclass) return kFALSE;
292 Int_t iclass = fTriggerClasses.IndexOf(trclass);
293 if (iclass < 0) return kFALSE;
295 if (mask & (1ull << iclass))
301 //_____________________________________________________________________________
302 Bool_t AliESDRun::InitMagneticField() const
304 // Create mag field from stored information
306 if (!TestBit(kBInfoStored)) {
307 AliError("No information on currents, cannot create field from run header");
311 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
312 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
313 AliInfo("ExpertMode!!! Information on magnet currents will be ignored !");
314 AliInfo("ExpertMode!!! Running with the externally locked B field !");
318 AliInfo("Destroying existing B field instance!");
319 delete TGeoGlobalMagField::Instance();
323 AliMagF* fld = AliMagF::CreateFieldMap(fCurrentL3,fCurrentDip,AliMagF::kConvLHC,
324 TestBit(kUniformBMap), GetBeamEnergy(), GetBeamType());
326 TGeoGlobalMagField::Instance()->SetField( fld );
327 TGeoGlobalMagField::Instance()->Lock();
328 AliInfo("Running with the B field constructed out of the Run Header !");
332 AliError("Failed to create a B field map !");