00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "TROOT.h"
00012 #include "TGeoGlobalMagField.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 ClassImp(TGeoGlobalMagField)
00031
00032 TGeoGlobalMagField *TGeoGlobalMagField::fgInstance = NULL;
00033
00034
00035 TGeoGlobalMagField::TGeoGlobalMagField()
00036 {
00037
00038 fField = NULL;
00039 fLock = kFALSE;
00040 if (fgInstance) {
00041 TVirtualMagField *field = fgInstance->GetField();
00042 if (field)
00043 Fatal("TGeoGlobalMagField", "A global field manager already existing and containing a field. \
00044 \n If you want a new global field please set it via: \
00045 \n TGeoGlobalMagField::Instance()->SetField(myField).");
00046 else
00047 Warning("TGeoGlobalMagField", "A global field manager already existing. Please access via: \
00048 \n TGeoGlobalMagField::Instance().");
00049 delete fgInstance;
00050 }
00051 gROOT->GetListOfGeometries()->Add(this);
00052 fgInstance = this;
00053 }
00054
00055
00056 TGeoGlobalMagField::~TGeoGlobalMagField()
00057 {
00058
00059 gROOT->GetListOfGeometries()->Remove(this);
00060 if (fField) {
00061 TVirtualMagField *field = fField;
00062 fField = NULL;
00063 delete field;
00064 }
00065 fgInstance = NULL;
00066 }
00067
00068
00069 void TGeoGlobalMagField::SetField(TVirtualMagField *field)
00070 {
00071
00072 if (field==fField) return;
00073
00074 if (fField) {
00075 if (fLock) {
00076 Error("SetField", "Global field is already set to <%s> and locked", fField->GetName());
00077 return;
00078 }
00079
00080 Info("SetField", "Previous magnetic field <%s> will be deleted", fField->GetName());
00081 TVirtualMagField *oldfield = fField;
00082 fField = NULL;
00083 delete oldfield;
00084 }
00085 fField = field;
00086 if (fField) Info("SetField", "Global magnetic field set to <%s>", fField->GetName());
00087 }
00088
00089
00090 TGeoGlobalMagField *TGeoGlobalMagField::Instance()
00091 {
00092
00093 if (fgInstance) return fgInstance;
00094 return new TGeoGlobalMagField();
00095 }
00096
00097
00098 void TGeoGlobalMagField::Lock()
00099 {
00100
00101 if (!fField) {
00102 Warning("Lock", "Cannot lock global magnetic field since this was not set yet");
00103 return;
00104 }
00105 fLock = kTRUE;
00106 Info("Lock", "Global magnetic field <%s> is now locked", fField->GetName());
00107 }