CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/src/MagneticField/ParametrizedEngine/plugins/OAE85lParametrizedMagneticField.cc

Go to the documentation of this file.
00001 
00008 #include "OAE85lParametrizedMagneticField.h"
00009 #include <FWCore/ParameterSet/interface/ParameterSet.h>
00010 #include <FWCore/MessageLogger/interface/MessageLogger.h>
00011 
00012 #include "TkBfield.h"
00013 
00014 using namespace std;
00015 using namespace magfieldparam;
00016 
00017 
00018 OAE85lParametrizedMagneticField::OAE85lParametrizedMagneticField(float b0_, 
00019                                                                  float a_,
00020                                                                  float l_) 
00021   : b0(b0_),
00022     l(l_),
00023     a(a_)    
00024 {
00025   init();
00026 }
00027 
00028 
00029 OAE85lParametrizedMagneticField::OAE85lParametrizedMagneticField(const edm::ParameterSet& parameters) {
00030   b0 =  parameters.getParameter<double>("b0");
00031   l = parameters.getParameter<double>("l");
00032   a = parameters.getParameter<double>("a");
00033   init();
00034 }
00035 
00036 void OAE85lParametrizedMagneticField::init() {
00037   ap2=4.0*a*a/(l*l);  
00038   hb0=0.5*b0*sqrt(1.0+ap2);
00039   hlova=1.0/sqrt(ap2);
00040   ainv=2.0*hlova/l;
00041 }
00042 
00043 
00044 
00045 OAE85lParametrizedMagneticField::~OAE85lParametrizedMagneticField() {}
00046 
00047 
00048 GlobalVector
00049 OAE85lParametrizedMagneticField::inTesla(const GlobalPoint& gp) const {
00050   
00051   if (isDefined(gp)) {
00052     return inTeslaUnchecked(gp);
00053   } else {
00054     edm::LogWarning("MagneticField|FieldOutsideValidity") << " Point " << gp << " is outside the validity region of OAE85lParametrizedMagneticField";
00055     return GlobalVector();
00056   }
00057 }
00058 
00059 
00060 GlobalVector 
00061 OAE85lParametrizedMagneticField::inTeslaUnchecked(const GlobalPoint& gp) const {
00062   
00063 // Method formerly named "trackerField"
00064 
00065 //
00066 //    B-field in Tracker volume
00067 //    
00068 //     In:   xyz[3]: coordinates (m)
00069 //    Out:  bxyz[3]: Bx,By,Bz    (kG)
00070 //
00071 //    Valid for r<1.2 and |z|<3.0               V.Karimäki 040301
00072 //                                 Updated for CMSSW field 070424
00073 //
00074 
00075 // b0=field at centre, l=solenoid length, a=radius (m) (phenomen. parameters) 
00076 
00077   // FIXME: beware of statics...
00078 //  static float ap2=4.0*a*a/(l*l);  
00079 //  static float hb0=0.5*b0*sqrt(1.0+ap2);
00080 //  static float hlova=1.0/sqrt(ap2);
00081 //  static float ainv=2.0*hlova/l;
00082  float xyz[3];//, bxyz[3];
00083  // convert to m (CMSSW)
00084  xyz[0]=0.01*gp.x();
00085  xyz[1]=0.01*gp.y();
00086  xyz[2]=0.01*gp.z();
00087 
00088  float r=sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
00089  float z=xyz[2];
00090  float az = fabs(z);
00091  // if (r<1.2&&az<3.0) // NOTE: check omitted, is done already by inTesla (NA)
00092  {
00093   float zainv=z*ainv;
00094   float rinv=(r>0.0) ? 1.0/r : 0.0;
00095   float u=hlova-zainv;
00096   float v=hlova+zainv;
00097   float fu[5],gv[5];
00098   ffunkti(u,fu);
00099   ffunkti(v,gv);
00100   float rat=r*ainv;
00101   float corrr=0.00894*r*z*(az-2.2221)*(az-2.2221);
00102   float corrz=-0.02996*exp(-0.5*(az-1.9820)*(az-1.9820)/(0.78915*0.78915));
00103   float br=hb0*0.5*rat*(fu[1]-gv[1]-0.125*(fu[3]-gv[3])*rat*rat)+corrr;
00104   float bz=hb0*(fu[0]+gv[0]-(fu[2]+gv[2])*0.25*rat*rat)+corrz;
00105   //bxyz[0]=br*xyz[0]*rinv;
00106   //bxyz[1]=br*xyz[1]*rinv;
00107   //bxyz[2]=bz;
00109   //  bvec.x()=0.1*br*xyz[0]*rinv;
00110   //bvec.y()=0.1*br*xyz[1]*rinv;
00111   //bvec.z()=0.1*bz;
00112   return  0.1*GlobalVector(br*xyz[0]*rinv, br*xyz[1]*rinv, bz);
00113  }
00114  // else {
00115  // cout <<"The point is outside the region r<1.2m && |z|<3.0m"<<endl;
00116  //}
00117  // return GlobalVector();
00118 }
00119 
00120 void OAE85lParametrizedMagneticField::ffunkti(float u, float* ff) const {
00121 // Function and its 3 derivatives
00122  float a,b; 
00123  a=1.0/(1.0+u*u);
00124  b=sqrt(a);
00125  ff[0]=u*b;
00126  ff[1]=a*b;
00127  ff[2]=-3.0*u*a*ff[1];
00128  ff[3]=a*ff[2]*((1.0/u)-4.0*u);
00129  return;
00130 }
00131 
00132 
00133 bool
00134 OAE85lParametrizedMagneticField::isDefined(const GlobalPoint& gp) const {
00135   return (gp.perp()<120. && fabs(gp.z())<300.);
00136 }
00137