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
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 float xyz[3];
00083
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
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
00106
00107
00109
00110
00111
00112 return 0.1*GlobalVector(br*xyz[0]*rinv, br*xyz[1]*rinv, bz);
00113 }
00114
00115
00116
00117
00118 }
00119
00120 void OAE85lParametrizedMagneticField::ffunkti(float u, float* ff) const {
00121
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