00001
00002
00003
00004
00005
00006 #include "BDSGlobalConstants.hh"
00007
00008 #include "globals.hh"
00009 #include "BDSMuSpoilerMagField.hh"
00010 #include "G4Navigator.hh"
00011 #include "G4TransportationManager.hh"
00012
00013 BDSMuSpoilerMagField::BDSMuSpoilerMagField(G4double aField)
00014 :itsBField(aField)
00015 {
00016 MuSpoilerNavigator = new G4Navigator();
00017 }
00018
00019 BDSMuSpoilerMagField::~BDSMuSpoilerMagField(){
00020 delete MuSpoilerNavigator;
00021 }
00022
00023 void BDSMuSpoilerMagField::GetFieldValue(const G4double Point[4],
00024 G4double *Bfield ) const
00025 {
00026
00027 G4ThreeVector GlobalPosition= G4ThreeVector( Point[0], Point[1], Point[2]);
00028 MuSpoilerNavigator->SetWorldVolume(G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking()->GetWorldVolume());
00029 MuSpoilerNavigator->LocateGlobalPointAndSetup(GlobalPosition);
00030
00031 G4AffineTransform GlobalAffine=MuSpoilerNavigator->
00032 GetGlobalToLocalTransform();
00033 G4ThreeVector LocalR=GlobalAffine.TransformPoint(GlobalPosition);
00034
00035 G4double BFactor=itsBField/LocalR.mag();
00036
00037
00038
00039 Bfield[0]= LocalR.y()*BFactor;
00040 Bfield[1]= -LocalR.x()*BFactor;
00041 Bfield[2]=0;
00042 }
00043
00044
00045