#include <BesMagneticField.hh>
Public Member Functions | |
BesMagneticField () | |
~BesMagneticField () | |
void | GetFieldValue (const double Point[3], double *Bfield) const |
void | SetStepperType (G4int i) |
void | SetStepper () |
void | SetMinStep (G4double s) |
void | InitialiseAll () |
void | CreateStepperAndChordFinder () |
void | SetDeltaOneStep (double newvalue) |
void | SetDeltaIntersection (double newvalue) |
void | SetMinimumEpsilonStep (double newvalue) |
void | SetMaximumEpsilonStep (double newvalue) |
Protected Attributes | |
G4FieldManager * | fFieldManager |
G4ChordFinder * | fChordFinder |
G4Mag_UsualEqRhs * | fEquation |
G4MagIntegratorStepper * | fStepper |
G4int | fStepperType |
G4double | fMinStep |
BesMagneticFieldMessenger * | fFieldMessenger |
IMagneticFieldSvc * | m_pIMF |
Definition at line 56 of file BesMagneticField.hh.
BesMagneticField::BesMagneticField | ( | ) |
Definition at line 83 of file BesMagneticField.cc.
References InitialiseAll(), and m_pIMF.
00084 : fChordFinder(0), fStepper(0),m_pIMF(0) 00085 { 00086 ISvcLocator* svcLocator = Gaudi::svcLocator(); 00087 StatusCode sc = svcLocator->service("MagneticFieldSvc",m_pIMF); 00088 if(sc!=StatusCode::SUCCESS) { 00089 G4cout<< "Unable to open Magnetic field service"<<G4endl; 00090 } 00091 InitialiseAll(); 00092 }
BesMagneticField::~BesMagneticField | ( | ) |
Definition at line 94 of file BesMagneticField.cc.
References fChordFinder, fEquation, fFieldMessenger, and fStepper.
00095 { 00096 if(fFieldMessenger) delete fFieldMessenger; 00097 if(fChordFinder) delete fChordFinder; 00098 if(fEquation) delete fEquation; 00099 if(fStepper) delete fStepper; 00100 }
void BesMagneticField::CreateStepperAndChordFinder | ( | ) |
Definition at line 149 of file BesMagneticField.cc.
References fChordFinder, fFieldManager, fMinStep, fStepper, and SetStepper().
Referenced by InitialiseAll(), and BesMagneticFieldMessenger::SetNewValue().
00150 { 00151 SetStepper(); 00152 G4cout<<"The minimal step is equal to "<<fMinStep/mm<<" mm"<<G4endl ; 00153 00154 fFieldManager->SetDetectorField(this ); 00155 00156 if(fChordFinder) delete fChordFinder; 00157 00158 fChordFinder = new G4ChordFinder(this , fMinStep,fStepper); 00159 00160 fChordFinder->SetDeltaChord(0.25*mm); 00161 fFieldManager->SetChordFinder( fChordFinder ); 00162 fFieldManager->SetDeltaOneStep(1.0e-2*mm); 00163 fFieldManager->SetDeltaIntersection(1.0e-3*mm); 00164 fFieldManager->SetMinimumEpsilonStep(5.0e-5); 00165 fFieldManager->SetMaximumEpsilonStep(1.0e-3); 00166 00167 G4PropagatorInField* fieldPropagator 00168 = G4TransportationManager::GetTransportationManager() 00169 ->GetPropagatorInField(); 00170 G4cout<<"LargestAcceptableStep is "<<fieldPropagator->GetLargestAcceptableStep()/m<<G4endl; 00171 //read some values 00172 G4cout<<"field has created"<<G4endl; 00173 G4cout<<"fDelta_One_Step_Value is "<<fFieldManager->GetDeltaOneStep()<<G4endl; 00174 G4cout<<"fDelta_Intersection_Val is "<<fFieldManager->GetDeltaIntersection()<<G4endl; 00175 G4cout<<"fEpsilonMin is "<<fFieldManager->GetMinimumEpsilonStep()<<G4endl; 00176 G4cout<<"fEpsilonMax is "<< fFieldManager->GetMaximumEpsilonStep()<<G4endl; 00177 return; 00178 }
void BesMagneticField::GetFieldValue | ( | const double | Point[3], | |
double * | Bfield | |||
) | const |
Definition at line 103 of file BesMagneticField.cc.
References IMagneticFieldSvc::fieldVector(), ReadBoostRoot::GetField(), m_pIMF, IMagneticFieldSvc::uniFieldVector(), and x.
00104 { 00105 double x=Point[0]; 00106 double y=Point[1]; 00107 double z=Point[2]; 00108 00109 HepPoint3D r(x,y,z); 00110 HepVector3D b; 00111 00112 if(ReadBoostRoot::GetField()==2) 00113 m_pIMF->fieldVector(r,b); 00114 else 00115 m_pIMF->uniFieldVector(r,b); 00116 00117 Bfield[0]=b.x(); 00118 Bfield[1]=b.y(); 00119 Bfield[2]=b.z(); 00120 00121 //caogf debug 00122 // ofstream haha("field_out.dat",ios_base::app); 00123 // haha<<x/mm<<" "<<y/mm<<" "<<z/mm<<" "<<Bfield[0]/tesla<<" "<<Bfield[1]/tesla<<" "<<Bfield[2]/tesla<<G4endl; 00124 // haha.close(); 00125 }
void BesMagneticField::InitialiseAll | ( | ) |
Definition at line 130 of file BesMagneticField.cc.
References CreateStepperAndChordFinder(), fEquation, fFieldManager, fFieldMessenger, fMinStep, and fStepperType.
Referenced by BesMagneticField().
00131 { 00132 00133 fFieldMessenger=new BesMagneticFieldMessenger(this); 00134 fEquation = new G4Mag_UsualEqRhs(this); 00135 00136 fMinStep = 0.01*mm ; // minimal step of 1 mm is default 00137 00138 fStepperType =4; // ClassicalRK4 is default stepper 00139 fFieldManager = G4TransportationManager::GetTransportationManager() 00140 ->GetFieldManager(); 00141 G4cout<<"before CreateStepperAndChordFinder"<<G4endl; 00142 CreateStepperAndChordFinder(); 00143 }
void BesMagneticField::SetDeltaIntersection | ( | double | newvalue | ) |
Definition at line 243 of file BesMagneticField.cc.
References fFieldManager.
Referenced by BesMagneticFieldMessenger::SetNewValue().
00244 { 00245 fFieldManager = G4TransportationManager::GetTransportationManager()->GetFieldManager(); 00246 fFieldManager->SetDeltaIntersection(newvalue); 00247 }
void BesMagneticField::SetDeltaOneStep | ( | double | newvalue | ) |
Definition at line 237 of file BesMagneticField.cc.
References fFieldManager.
Referenced by BesMagneticFieldMessenger::SetNewValue().
00238 { 00239 fFieldManager = G4TransportationManager::GetTransportationManager() 00240 ->GetFieldManager(); 00241 fFieldManager->SetDeltaOneStep(newvalue); 00242 }
void BesMagneticField::SetMaximumEpsilonStep | ( | double | newvalue | ) |
Definition at line 253 of file BesMagneticField.cc.
References fFieldManager.
Referenced by BesMagneticFieldMessenger::SetNewValue().
00254 { 00255 fFieldManager =G4TransportationManager::GetTransportationManager()->GetFieldManager(); 00256 fFieldManager->SetMaximumEpsilonStep(newvalue); 00257 }
void BesMagneticField::SetMinimumEpsilonStep | ( | double | newvalue | ) |
Definition at line 248 of file BesMagneticField.cc.
References fFieldManager.
Referenced by BesMagneticFieldMessenger::SetNewValue().
00249 { 00250 fFieldManager = G4TransportationManager::GetTransportationManager()->GetFieldManager(); 00251 fFieldManager->SetMinimumEpsilonStep(newvalue); 00252 }
void BesMagneticField::SetMinStep | ( | G4double | s | ) | [inline] |
Definition at line 71 of file BesMagneticField.hh.
References fMinStep.
Referenced by BesMagneticFieldMessenger::SetNewValue().
void BesMagneticField::SetStepper | ( | ) |
Definition at line 185 of file BesMagneticField.cc.
References fEquation, fStepper, and fStepperType.
Referenced by CreateStepperAndChordFinder().
00186 { 00187 if(fStepper) delete fStepper; 00188 00189 switch ( fStepperType ) 00190 { 00191 case 0: 00192 fStepper = new G4ExplicitEuler( fEquation ); 00193 G4cout<<"G4ExplicitEuler is called"<<G4endl; 00194 break; 00195 case 1: 00196 fStepper = new G4ImplicitEuler( fEquation ); 00197 G4cout<<"G4ImplicitEuler is called"<<G4endl; 00198 break; 00199 case 2: 00200 fStepper = new G4SimpleRunge( fEquation ); 00201 G4cout<<"G4SimpleRunge is called"<<G4endl; 00202 break; 00203 case 3: 00204 fStepper = new G4SimpleHeum( fEquation ); 00205 G4cout<<"G4SimpleHeum is called"<<G4endl; 00206 break; 00207 case 4: 00208 fStepper = new G4ClassicalRK4( fEquation ); 00209 G4cout<<"G4ClassicalRK4 (default) is called"<<G4endl; 00210 break; 00211 case 5: 00212 fStepper = new G4HelixExplicitEuler( fEquation ); 00213 G4cout<<"G4HelixExplicitEuler is called"<<G4endl; 00214 break; 00215 case 6: 00216 fStepper = new G4HelixImplicitEuler( fEquation ); 00217 G4cout<<"G4HelixImplicitEuler is called"<<G4endl; 00218 break; 00219 case 7: 00220 fStepper = new G4HelixSimpleRunge( fEquation ); 00221 G4cout<<"G4HelixSimpleRunge is called"<<G4endl; 00222 break; 00223 case 8: 00224 fStepper = new G4CashKarpRKF45( fEquation ); 00225 G4cout<<"G4CashKarpRKF45 is called"<<G4endl; 00226 break; 00227 case 9: 00228 fStepper = new G4RKG3_Stepper( fEquation ); 00229 G4cout<<"G4RKG3_Stepper is called"<<G4endl; 00230 break; 00231 default: fStepper = 0; 00232 } 00233 return; 00234 }
void BesMagneticField::SetStepperType | ( | G4int | i | ) | [inline] |
Definition at line 67 of file BesMagneticField.hh.
References fStepperType.
Referenced by BesMagneticFieldMessenger::SetNewValue().
00067 { fStepperType = i ; }
G4ChordFinder* BesMagneticField::fChordFinder [protected] |
Definition at line 85 of file BesMagneticField.hh.
Referenced by CreateStepperAndChordFinder(), and ~BesMagneticField().
G4Mag_UsualEqRhs* BesMagneticField::fEquation [protected] |
Definition at line 86 of file BesMagneticField.hh.
Referenced by InitialiseAll(), SetStepper(), and ~BesMagneticField().
G4FieldManager* BesMagneticField::fFieldManager [protected] |
Definition at line 84 of file BesMagneticField.hh.
Referenced by CreateStepperAndChordFinder(), InitialiseAll(), SetDeltaIntersection(), SetDeltaOneStep(), SetMaximumEpsilonStep(), and SetMinimumEpsilonStep().
Definition at line 94 of file BesMagneticField.hh.
Referenced by InitialiseAll(), and ~BesMagneticField().
G4double BesMagneticField::fMinStep [protected] |
Definition at line 92 of file BesMagneticField.hh.
Referenced by CreateStepperAndChordFinder(), InitialiseAll(), and SetMinStep().
G4MagIntegratorStepper* BesMagneticField::fStepper [protected] |
Definition at line 89 of file BesMagneticField.hh.
Referenced by CreateStepperAndChordFinder(), SetStepper(), and ~BesMagneticField().
G4int BesMagneticField::fStepperType [protected] |
Definition at line 90 of file BesMagneticField.hh.
Referenced by InitialiseAll(), SetStepper(), and SetStepperType().
IMagneticFieldSvc* BesMagneticField::m_pIMF [protected] |
Definition at line 95 of file BesMagneticField.hh.
Referenced by BesMagneticField(), and GetFieldValue().