/scratch0/jsnuveri/BDSIM/BDSIMgit/bdsim/src/BDSMultipoleOuterMagField.cc

00001 /* BDSIM code.    Version 1.0
00002    Author: Grahame A. Blair, Royal Holloway, Univ. of London.
00003    Last modified 25.12.2003
00004    Copyright (c) 2003 by G.A.Blair.  ALL RIGHTS RESERVED. 
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=CLHEP::twopi/G4double(nPoles);
00019 // G4cout<<" BDSMultipoleOuterMagField: itsIronField="<<itsIronField/tesla<<G4endl;
00020 }
00021 
00022 BDSMultipoleOuterMagField::~BDSMultipoleOuterMagField(){}
00023 
00024 void BDSMultipoleOuterMagField::GetFieldValue(const G4double *Point,
00025                                               G4double *Bfield ) const
00026 {
00027   G4Navigator* MultipoleOuterNavigator=
00028     G4TransportationManager::GetTransportationManager()->
00029     GetNavigatorForTracking();
00030 
00031   // gab_dec03>>  
00032   G4ThreeVector GlobalPosition= G4ThreeVector( Point[0], Point[1], Point[2]);  
00033   G4AffineTransform GlobalAffine=MultipoleOuterNavigator->
00034     GetGlobalToLocalTransform();  
00035   //  G4ThreeVector LocalR = MultipoleOuterNavigator->                          //                             GetCurrentLocalCoordinate();
00036   G4ThreeVector LocalR=GlobalAffine.TransformPoint(GlobalPosition); 
00037   // gab_dec03<<
00038 
00039   G4double BFactor=itsIronField/LocalR.mag();
00040 
00041   G4double phi = LocalR.phi()-itsPhiOffset;
00042   // extra term for dipoles, because of rotation required during positioning
00043   // of trapezoids
00044   if (itsNPoles==2)phi+=CLHEP::pi;
00045 
00046   // define sectors relative to the y-axis
00047   phi=CLHEP::halfpi-phi;
00048 
00049   if(phi<0)phi+=CLHEP::twopi;
00050   if(phi>CLHEP::twopi)phi-=CLHEP::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   // extra term for dipoles, because of rotation required during positioning
00062   // of trapezoids
00063   if (itsNPoles==2)Bfield[1]*=-1;
00064 
00065 }
00066 
00067 
00068 

Generated on 28 Jun 2015 for BDSIM by  doxygen 1.4.7