00001
00002
00003 #include "BDSGlobalConstants.hh"
00004 #include "BDSDetectorSolenoidMagField.hh"
00005 #include "G4Navigator.hh"
00006 #include "G4TransportationManager.hh"
00007
00008 BDSDetectorSolenoidMagField::BDSDetectorSolenoidMagField(G4double BIn, G4double BOut, G4double radiusIn, G4double radiusOut, G4double zMin, G4double zMax):itsBIn(BIn), itsBOut(BOut), itsRadiusIn(radiusIn), itsRadiusOut(radiusOut), itsZMin(zMin), itsZMax(zMax){}
00009 BDSDetectorSolenoidMagField::~BDSDetectorSolenoidMagField(){}
00010
00011 void BDSDetectorSolenoidMagField::GetFieldValue( const G4double Point[4],
00012 G4double *Bfield ) const
00013 {
00014 G4Navigator* SolenoidNavigator=
00015 G4TransportationManager::GetTransportationManager()->
00016 GetNavigatorForTracking();
00017
00018 G4ThreeVector LocalR, GlobalR;
00019
00020 GlobalR.setX(Point[0]);
00021 GlobalR.setY(Point[1]);
00022 GlobalR.setZ(Point[2]);
00023 G4AffineTransform GlobalAffine=SolenoidNavigator->GetGlobalToLocalTransform();
00024 LocalR=GlobalAffine.TransformPoint(GlobalR);
00025
00026 Bfield[0]=0;
00027 Bfield[1]=0;
00028
00029 G4double zField=0;
00030
00031 G4double localRad = sqrt(pow(LocalR.y(),2)+pow(LocalR.x(),2));
00032
00033 if( (LocalR.z() > itsZMin) && (LocalR.z() < itsZMax) ){
00034 if(localRad<itsRadiusIn){
00035 zField = itsBIn;
00036 } else if(localRad<itsRadiusOut){
00037 zField = itsBOut;
00038 } else zField=0;
00039 } else zField=0;
00040
00041 Bfield[2]=zField;
00042 }
00043
00044
00045