CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_3/src/MagneticField/ParametrizedEngine/plugins/PolyFit2DParametrizedMagneticField.cc

Go to the documentation of this file.
00001 
00008 #include "PolyFit2DParametrizedMagneticField.h"
00009 #include <FWCore/ParameterSet/interface/ParameterSet.h>
00010 #include <FWCore/MessageLogger/interface/MessageLogger.h>
00011 
00012 #include "BFit.h"
00013 
00014 
00015 using namespace std;
00016 using namespace magfieldparam;
00017 
00018 PolyFit2DParametrizedMagneticField::PolyFit2DParametrizedMagneticField(double bVal) : 
00019   theParam(new BFit())
00020 {
00021   theParam->SetField(bVal);
00022 }
00023 
00024 
00025 PolyFit2DParametrizedMagneticField::PolyFit2DParametrizedMagneticField(const edm::ParameterSet& parameters) : theParam(new BFit()) {
00026   theParam->SetField(parameters.getParameter<double>("BValue"));
00027 }
00028 
00029 
00030 PolyFit2DParametrizedMagneticField::~PolyFit2DParametrizedMagneticField() {
00031   delete theParam;
00032 }
00033 
00034 
00035 GlobalVector
00036 PolyFit2DParametrizedMagneticField::inTesla(const GlobalPoint& gp) const {
00037 
00038   if (isDefined(gp)) {
00039     return inTeslaUnchecked(gp);
00040   } else {
00041     edm::LogWarning("MagneticField|FieldOutsideValidity") << " Point " << gp << " is outside the validity region of PolyFit2DParametrizedMagneticField";
00042     return GlobalVector();
00043   }
00044 }
00045 
00046 GlobalVector
00047 PolyFit2DParametrizedMagneticField::inTeslaUnchecked(const GlobalPoint& gp) const {
00048   double Br, Bz, Bphi;
00049   theParam->GetField(gp.perp()/100., gp.z()/100., gp.phi(),
00050                      Br, Bz, Bphi);
00051 
00052   double cosphi = cos(gp.phi());
00053   double sinphi = sin(gp.phi());
00054 
00055   return GlobalVector(Br*cosphi - Bphi*sinphi,
00056                       Br*sinphi + Bphi*cosphi, 
00057                       Bz);  
00058 }
00059 
00060 bool
00061 PolyFit2DParametrizedMagneticField::isDefined(const GlobalPoint& gp) const {
00062   double z = fabs(gp.z());
00063   double r = gp.perp();
00064   //"rectangle" |z|<3.5, r<1.9 _except_ the "corners" |z|+2.5*r>6.7, everything in meters
00065   if (z>350. || r>190 || z+2.5*r>670.) return false;
00066   return true;
00067 }