00001
00002
00003
00004
00005
00006 #include "BDSGlobalConstants.hh"
00007
00008 #include "globals.hh"
00009 #include "BDSMultipoleOuterMagField.hh"
00010
00011 #include "G4Navigator.hh"
00012 #include "G4TransportationManager.hh"
00013
00014 BDSMultipoleOuterMagField::BDSMultipoleOuterMagField(G4int nPoles,
00015 G4double aField,
00016 G4double aPhiOffset)
00017 :itsNPoles(nPoles),itsIronField(aField),itsPhiOffset(aPhiOffset)
00018 {itsSectorPhi=twopi/G4double(nPoles);
00019
00020 }
00021
00022 BDSMultipoleOuterMagField::~BDSMultipoleOuterMagField(){}
00023
00024 void BDSMultipoleOuterMagField::GetFieldValue(const G4double Point[4],
00025 G4double *Bfield ) const
00026 {
00027 G4Navigator* MultipoleOuterNavigator=
00028 G4TransportationManager::GetTransportationManager()->
00029 GetNavigatorForTracking();
00030
00031
00032 G4ThreeVector GlobalPosition= G4ThreeVector( Point[0], Point[1], Point[2]);
00033 G4AffineTransform GlobalAffine=MultipoleOuterNavigator->
00034 GetGlobalToLocalTransform();
00035
00036 G4ThreeVector LocalR=GlobalAffine.TransformPoint(GlobalPosition);
00037
00038
00039 G4double BFactor=itsIronField/LocalR.mag();
00040
00041 G4double phi = LocalR.phi()-itsPhiOffset;
00042
00043
00044 if (itsNPoles==2)phi+=pi;
00045
00046
00047 phi=pi/2-phi;
00048
00049 if(phi<0)phi+=twopi;
00050 if(phi>twopi)phi-=twopi;
00051
00052 G4int nSector=G4int(phi/itsSectorPhi);
00053
00054 BFactor*=pow(-1.0,nSector);
00055
00056
00057 Bfield[0]= LocalR.y()*BFactor;
00058 Bfield[1]= -LocalR.x()*BFactor;
00059 Bfield[2]=0;
00060
00061
00062
00063 if (itsNPoles==2)Bfield[1]*=-1;
00064
00065 }
00066
00067
00068