00001 #include "MagneticField/MucMagneticField.h"
00002 #include <iostream>
00003 #include <fstream>
00004 #include <cstdlib>
00005 #include "CLHEP/Units/PhysicalConstants.h"
00006 using namespace std;
00007 using namespace CLHEP;
00008
00009 #ifndef BEAN
00010 MucMagneticField::MucMagneticField()
00011 {
00012 path = std::string(getenv( "MAGNETICFIELDROOT" ));
00013 #else
00014 MucMagneticField::MucMagneticField(const std::string Path)
00015 {
00016 path = Path;
00017 #endif
00018 readPar();
00019 }
00020 MucMagneticField::~MucMagneticField()
00021 {
00022 }
00023 void MucMagneticField::getMucField(int part,int layer,int mat,
00024 HepPoint3D& r,HepVector3D& b)
00025 {
00026 double x,y,z,bmf,emf;
00027 x = r.x()/m;
00028 y = r.y()/m;
00029 z = r.z()/m;
00030
00031 if(part==1)
00032 {
00033 if(layer==0&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx0[i]; }
00034 if(layer==0&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx0[i]; }
00035 if(layer==1&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx1[i]; }
00036 if(layer==1&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx1[i]; }
00037 if(layer==2&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx2[i]; }
00038 if(layer==2&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx2[i]; }
00039 if(layer==3&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx3[i]; }
00040 if(layer==3&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx3[i]; }
00041 if(layer==4&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx4[i]; }
00042 if(layer==4&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx4[i]; }
00043 if(layer==5&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx5[i]; }
00044 if(layer==5&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx5[i]; }
00045 if(layer==6&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx6[i]; }
00046 if(layer==6&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx6[i]; }
00047 if(layer==7&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx7[i]; }
00048 if(layer==7&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapx7[i]; }
00049 if(layer==8&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipx8[i]; }
00050 bmf = bp[0]+bp[1]*x+bp[2]*x*x+bp[3]*z+bp[4]*z*z+bp[5]*z*z*z+bp[6]*z*z*z*z
00051 +bp[7]*z*z*z*z*z+bp[8]*z*z*z*z*z*z+bp[9]*z*z*z*z*z*z*z+bp[10]*y+bp[11]*y*y
00052 +bp[12]*y*y*y+bp[13]*x*z+bp[14]*z*y+bp[15]*x*y+bp[16]*z*y*y+bp[17]*z*z*y;
00053 b[0] = bmf*tesla;
00054
00055 if(layer==0&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy0[i]; }
00056 if(layer==0&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy0[i]; }
00057 if(layer==1&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy1[i]; }
00058 if(layer==1&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy1[i]; }
00059 if(layer==2&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy2[i]; }
00060 if(layer==2&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy2[i]; }
00061 if(layer==3&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy3[i]; }
00062 if(layer==3&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy3[i]; }
00063 if(layer==4&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy4[i]; }
00064 if(layer==4&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy4[i]; }
00065 if(layer==5&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy5[i]; }
00066 if(layer==5&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy5[i]; }
00067 if(layer==6&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy6[i]; }
00068 if(layer==6&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy6[i]; }
00069 if(layer==7&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy7[i]; }
00070 if(layer==7&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapy7[i]; }
00071 if(layer==8&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipy8[i]; }
00072 bmf = bp[0]+bp[1]*x+bp[2]*x*x+bp[3]*z+bp[4]*z*z+bp[5]*z*z*z+bp[6]*z*z*z*z
00073 +bp[7]*z*z*z*z*z+bp[8]*z*z*z*z*z*z+bp[9]*z*z*z*z*z*z*z+bp[10]*y+bp[11]*y*y
00074 +bp[12]*y*y*y+bp[13]*x*z+bp[14]*z*y+bp[15]*x*y+bp[16]*z*y*y+bp[17]*z*z*y;
00075 b[1] = bmf*tesla;
00076
00077 if(layer==0&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz0[i]; }
00078 if(layer==0&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz0[i]; }
00079 if(layer==1&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz1[i]; }
00080 if(layer==1&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz1[i]; }
00081 if(layer==2&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz2[i]; }
00082 if(layer==2&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz2[i]; }
00083 if(layer==3&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz3[i]; }
00084 if(layer==3&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz3[i]; }
00085 if(layer==4&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz4[i]; }
00086 if(layer==4&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz4[i]; }
00087 if(layer==5&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz5[i]; }
00088 if(layer==5&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz5[i]; }
00089 if(layer==6&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz6[i]; }
00090 if(layer==6&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz6[i]; }
00091 if(layer==7&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz7[i]; }
00092 if(layer==7&&mat==1) { for(int i=0; i<18; i++) bp[i] = bapz7[i]; }
00093 if(layer==8&&mat==0) { for(int i=0; i<18; i++) bp[i] = bipz8[i]; }
00094 bmf = bp[0]+bp[1]*x+bp[2]*x*x+bp[3]*z+bp[4]*z*z+bp[5]*z*z*z+bp[6]*z*z*z*z
00095 +bp[7]*z*z*z*z*z+bp[8]*z*z*z*z*z*z+bp[9]*z*z*z*z*z*z*z+bp[10]*y+bp[11]*y*y
00096 +bp[12]*y*y*y+bp[13]*x*z+bp[14]*z*y+bp[15]*x*y+bp[16]*z*y*y+bp[17]*z*z*y;
00097 b[2] = bmf*tesla;
00098 }
00099
00100 if(part==0)
00101 {
00102 if(layer==0&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx0[i]; }
00103 if(layer==0&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx0[i]; }
00104 if(layer==1&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx1[i]; }
00105 if(layer==1&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx1[i]; }
00106 if(layer==2&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx2[i]; }
00107 if(layer==2&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx2[i]; }
00108 if(layer==3&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx3[i]; }
00109 if(layer==3&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx3[i]; }
00110 if(layer==4&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx4[i]; }
00111 if(layer==4&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx4[i]; }
00112 if(layer==5&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx5[i]; }
00113 if(layer==5&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx5[i]; }
00114 if(layer==6&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx6[i]; }
00115 if(layer==6&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx6[i]; }
00116 if(layer==7&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx7[i]; }
00117 if(layer==7&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapx7[i]; }
00118 if(layer==8&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipx8[i]; }
00119 emf = ep[0]+ep[1]*x+ep[2]*x*x+ep[3]*x*x*x+ep[4]*x*x*x*x+ep[5]*x*x*x*x*x+ep[6]*x*x*x*x*x*x
00120 +ep[7]*x*x*x*x*x*x*x+ep[8]*z+ep[9]*y+ep[10]*y*y+ep[11]*y*y*y+ep[12]*x*z+ep[13]*z*y
00121 +ep[14]*y*x+ep[15]*y*x*x+ep[16]*y*y*x;
00122 b[0] = emf*tesla;
00123
00124 if(layer==0&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy0[i]; }
00125 if(layer==0&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy0[i]; }
00126 if(layer==1&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy1[i]; }
00127 if(layer==1&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy1[i]; }
00128 if(layer==2&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy2[i]; }
00129 if(layer==2&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy2[i]; }
00130 if(layer==3&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy3[i]; }
00131 if(layer==3&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy3[i]; }
00132 if(layer==4&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy4[i]; }
00133 if(layer==4&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy4[i]; }
00134 if(layer==5&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy5[i]; }
00135 if(layer==5&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy5[i]; }
00136 if(layer==6&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy6[i]; }
00137 if(layer==6&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy6[i]; }
00138 if(layer==7&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy7[i]; }
00139 if(layer==7&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapy7[i]; }
00140 if(layer==8&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipy8[i]; }
00141 emf = ep[0]+ep[1]*x+ep[2]*x*x+ep[3]*x*x*x+ep[4]*x*x*x*x+ep[5]*x*x*x*x*x+ep[6]*x*x*x*x*x*x
00142 +ep[7]*x*x*x*x*x*x*x+ep[8]*z+ep[9]*y+ep[10]*y*y+ep[11]*y*y*y+ep[12]*x*z+ep[13]*z*y
00143 +ep[14]*y*x+ep[15]*y*x*x+ep[16]*y*y*x;
00144 b[1] = emf*tesla;
00145
00146 if(layer==0&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz0[i]; }
00147 if(layer==0&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz0[i]; }
00148 if(layer==1&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz1[i]; }
00149 if(layer==1&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz1[i]; }
00150 if(layer==2&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz2[i]; }
00151 if(layer==2&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz2[i]; }
00152 if(layer==3&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz3[i]; }
00153 if(layer==3&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz3[i]; }
00154 if(layer==4&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz4[i]; }
00155 if(layer==4&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz4[i]; }
00156 if(layer==5&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz5[i]; }
00157 if(layer==5&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz5[i]; }
00158 if(layer==6&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz6[i]; }
00159 if(layer==6&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz6[i]; }
00160 if(layer==7&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz7[i]; }
00161 if(layer==7&&mat==1) { for(int i=0; i<17; i++) ep[i] = aapz7[i]; }
00162 if(layer==8&&mat==0) { for(int i=0; i<17; i++) ep[i] = aipz8[i]; }
00163 emf = ep[0]+ep[1]*x+ep[2]*x*x+ep[3]*x*x*x+ep[4]*x*x*x*x+ep[5]*x*x*x*x*x+ep[6]*x*x*x*x*x*x
00164 +ep[7]*x*x*x*x*x*x*x+ep[8]*z+ep[9]*y+ep[10]*y*y+ep[11]*y*y*y+ep[12]*x*z+ep[13]*z*y
00165 +ep[14]*y*x+ep[15]*y*x*x+ep[16]*y*y*x;
00166 b[2] = emf*tesla;
00167 }
00168 }
00169 void MucMagneticField::readPar()
00170 {
00171 filename = path +
00172 std::string( "/dat/barIronpar.txt");
00173 ifstream infile1(filename.c_str(),ios_base::in);
00174 if(infile1) cout<<"*** Read field map: "<<filename<<endl;
00175 for(int i=0; i<18; i++)
00176 {
00177 infile1>>bipx0[i]>>bipy0[i]>>bipz0[i]>>bipx1[i]>>bipy1[i]>>bipz1[i]
00178 >>bipx2[i]>>bipy2[i]>>bipz2[i]>>bipx3[i]>>bipy3[i]>>bipz3[i]
00179 >>bipx4[i]>>bipy4[i]>>bipz4[i]>>bipx5[i]>>bipy5[i]>>bipz5[i]
00180 >>bipx6[i]>>bipy6[i]>>bipz6[i]>>bipx7[i]>>bipy7[i]>>bipz7[i]
00181 >>bipx8[i]>>bipy8[i]>>bipz8[i];
00182 }
00183
00184 filename = path +
00185 std::string( "/dat/barAirpar.txt");
00186
00187 ifstream infile2(filename.c_str(),ios_base::in);
00188 if(infile2) cout<<"*** Read field map: "<<filename<<endl;
00189 for(int j=0; j<18; j++)
00190 {
00191 infile2>>bapx0[j]>>bapy0[j]>>bapz0[j]>>bapx1[j]>>bapy1[j]>>bapz1[j]
00192 >>bapx2[j]>>bapy2[j]>>bapz2[j]>>bapx3[j]>>bapy3[j]>>bapz3[j]
00193 >>bapx4[j]>>bapy4[j]>>bapz4[j]>>bapx5[j]>>bapy5[j]>>bapz5[j]
00194 >>bapx6[j]>>bapy6[j]>>bapz6[j]>>bapx7[j]>>bapy7[j]>>bapz7[j];
00195 }
00196
00197 filename = path +
00198 std::string( "/dat/endIronpar.txt");
00199
00200 ifstream infile3(filename.c_str(),ios_base::in);
00201 if(infile3) cout<<"*** Read field map: "<<filename<<endl;
00202 for(int i=0; i<17; i++)
00203 {
00204 infile3>>aipx0[i]>>aipy0[i]>>aipz0[i]>>aipx1[i]>>aipy1[i]>>aipz1[i]
00205 >>aipx2[i]>>aipy2[i]>>aipz2[i]>>aipx3[i]>>aipy3[i]>>aipz3[i]
00206 >>aipx4[i]>>aipy4[i]>>aipz4[i]>>aipx5[i]>>aipy5[i]>>aipz5[i]
00207 >>aipx6[i]>>aipy6[i]>>aipz6[i]>>aipx7[i]>>aipy7[i]>>aipz7[i]
00208 >>aipx8[i]>>aipy8[i]>>aipz8[i];
00209 }
00210
00211 filename = path +
00212 std::string( "/dat/endAirpar.txt");
00213
00214 ifstream infile4(filename.c_str(),ios_base::in);
00215 if(infile4) cout<<"*** Read field map: "<<filename<<endl;
00216 for(int j=0; j<17; j++)
00217 {
00218 infile4>>aapx0[j]>>aapy0[j]>>aapz0[j]>>aapx1[j]>>aapy1[j]>>aapz1[j]
00219 >>aapx2[j]>>aapy2[j]>>aapz2[j]>>aapx3[j]>>aapy3[j]>>aapz3[j]
00220 >>aapx4[j]>>aapy4[j]>>aapz4[j]>>aapx5[j]>>aapy5[j]>>aapz5[j]
00221 >>aapx6[j]>>aapy6[j]>>aapz6[j]>>aapx7[j]>>aapy7[j]>>aapz7[j];
00222 }
00223 }