10 #include <evioFileChannel.hxx>
11 #include <evioUtil.hxx>
17 #include "JANA/JException.h"
27 jcalib = japp->GetJCalibration(runnumber);
28 jresman = japp->GetJResourceManager(runnumber);
30 JParameterManager *jparms = japp->GetJParameterManager();
31 jparms->SetDefaultParameter(
"BFIELD_MAP", namepath);
33 int Npoints = ReadMap(namepath, runnumber);
35 _DBG_<<
"Error getting JCalibration object for magnetic field!"<<endl;
39 GetFineMeshMap(namepath,runnumber);
47 this->jcalib = jcalib;
48 GetFineMeshMap(namepath,runnumber);
74 jerr <<
"ERROR: jcalib pointer is NULL in DMagneticFieldMapFineMesh::ReadMap() !" << endl;
78 jout<<
"Reading Magnetic field map from "<<namepath<<
" ..."<<endl;
79 vector< vector<float> > Bmap;
85 vector<string> old_maps;
86 old_maps.push_back(
"Magnets/Solenoid/solenoid_1500_poisson_20090814_01");
87 old_maps.push_back(
"Magnets/Solenoid/solenoid_1050_poisson_20091123_02");
88 old_maps.push_back(
"Magnets/Solenoid/solenoid_1500_poisson_20090814_01");
89 old_maps.push_back(
"Magnets/Solenoid/solenoid_1500_20090312-2");
90 old_maps.push_back(
"Magnets/Solenoid/solenoid_1600_20090312-2");
91 old_maps.push_back(
"Magnets/Solenoid/solenoid_1500kinked");
93 bool is_old_map =
false;
94 for(
unsigned int i=0; i<old_maps.size(); i++){
95 if(old_maps[i] == namepath){
98 jcalib->Get(namepath, Bmap);
108 jresman->Get(namepath, Bmap);
112 jout<<Bmap.size()<<
" entries found (";
122 map<float, int> xvals;
123 map<float, int> yvals;
124 map<float, int> zvals;
127 for(
unsigned int i=0; i<Bmap.size(); i++){
128 vector<float> &a = Bmap[i];
155 cout<<
" ) at 0x"<<hex<<(
unsigned long)
this<<dec<<endl;
158 vector<DBfieldPoint_t> zvec(Nz);
159 vector< vector<DBfieldPoint_t> > yvec;
160 for(
int i=0; i<Ny; i++)yvec.push_back(zvec);
161 for(
int i=0; i<Nx; i++)Btable.push_back(yvec);
164 dx = (xmax-xmin)/(
double)(Nx-1);
165 dy = (
ymax-
ymin)/(
double)((Ny < 2)? 1 : Ny-1);
172 for(
unsigned int i=0; i<Bmap.size(); i++){
173 vector<float> &a = Bmap[i];
174 int xindex = (int)floor((a[0]-xmin+dx/2.0)/dx);
175 int yindex = (int)(Ny<2 ? 0:floor((a[1]-
ymin+dy/2.0)/dy));
176 int zindex = (int)floor((a[2]-
zmin+dz/2.0)/dz);
191 for(
int index_x=0; index_x<Nx; index_x++){
192 int index_x0 = index_x - (index_x>0 ? 1:0);
193 int index_x1 = index_x + (index_x<Nx-1 ? 1:0);
194 for(
int index_z=1; index_z<Nz-1; index_z++){
195 int index_z0 = index_z - (index_z>0 ? 1:0);
196 int index_z1 = index_z + (index_z<Nz-1 ? 1:0);
205 _DBG_<<
"Field map appears to be 3 dimensional. Code is currently"<<endl;
206 _DBG_<<
"unable to handle this. Exiting..."<<endl;
214 double d_index_x=double(index_x1-index_x0);
215 double d_index_z=double(index_z1-index_z0);
225 g->
dBxdx = (Bx1->
Bx - Bx0->
Bx)/d_index_x;
227 g->
dBxdz = (Bz1->
Bx - Bz0->
Bx)/d_index_z;
229 g->
dBydx = (Bx1->
By - Bx0->
By)/d_index_x;
231 g->
dBydz = (Bz1->
By - Bz0->
By)/d_index_z;
233 g->
dBzdx = (Bx1->
Bz - Bx0->
Bz)/d_index_x;
235 g->
dBzdz = (Bz1->
Bz - Bz0->
Bz)/d_index_z;
242 g->
dBxdxdz=(B11->
Bx - B01->
Bx - B10->
Bx + B00->
Bx)/d_index_x/d_index_z;
243 g->
dBzdxdz=(B11->
Bz - B01->
Bz - B10->
Bz + B00->
Bz)/d_index_x/d_index_z;
254 double &Bx_,
double &By_,
257 static const int wt[16][16]=
258 { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
259 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
260 {-3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1, 0, 0, 0, 0},
261 {2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0},
262 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
263 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
264 {0, 0, 0, 0,-3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1},
265 {0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1},
266 {-3,3, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
267 {0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0,-2,-1, 0, 0},
268 {9,-9, 9,-9, 6, 3,-3,-6, 6,-6,-3, 3, 4, 2, 1, 2},
269 {-6,6,-6, 6,-4,-2, 2, 4,-3, 3, 3,-3,-2,-1,-1,-2},
270 {2,-2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
271 {0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 1, 1, 0, 0},
272 {-6, 6,-6,6,-3,-3, 3, 3,-4, 4, 2,-2,-2,-2,-1,-1},
273 {4,-4, 4,-4, 2, 2,-2,-2, 2,-2,-2, 2, 1, 1, 1, 1}};
275 double cl[16],coeff[4][4];
278 double r =
sqrt(x*x + y*y);
284 if (z<zminFine || z>=zmaxFine || r>=rmaxFine){
286 int index_x = (int)floor((r-xmin)*one_over_dx + 0.5);
288 if (index_x>=Nx)
return;
289 else if (index_x<0) index_x=0;
290 int index_z = (int)floor((z-
zmin)*one_over_dz + 0.5);
291 if(index_z<0 || index_z>=
Nz)
return;
296 int index_x1 = index_x + (index_x<Nx-1 ? 1:0);
297 int index_z1 = index_z + (index_z<
Nz-1 ? 1:0);
321 temp[12]=B00->dBxdxdz;
328 for (k=0;k<16;k++) tmp2+=wt[i][k]*temp[k];
332 for (j=0;j<4;j++) coeff[i][j]=cl[m++];
334 double t=(z - B00->z)*one_over_dz;
335 double u=(r - B00->x)*one_over_dx;
337 Br_=t*Br_+((coeff[i][3]*u+coeff[i][2])*u+coeff[i][1])*u+coeff[i][0];
356 temp[12]=B00->dBzdxdz;
363 for (k=0;k<16;k++) tmp2+=wt[i][k]*temp[k];
368 for (j=0;j<4;j++) coeff[i][j]=cl[m++];
372 Bz_=t*Bz_+((coeff[i][3]*u+coeff[i][2])*u+coeff[i][1])*u+coeff[i][0];
376 unsigned int indr=(
unsigned int)floor((r-rminFine)*rscale);
377 unsigned int indz=(
unsigned int)floor((z-zminFine)*zscale);
379 Bz_=mBfine[indr][indz].Bz;
380 Br_=mBfine[indr][indz].Br;
385 double cos_theta = x/r;
386 double sin_theta = y/r;
400 double &Bz,
double &dBrdr,
401 double &dBrdz,
double &dBzdr,
402 double &dBzdz)
const{
404 static const int wt[16][16]=
405 { {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
406 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
407 {-3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1, 0, 0, 0, 0},
408 {2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0},
409 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
410 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
411 {0, 0, 0, 0,-3, 0, 0, 3, 0, 0, 0, 0,-2, 0, 0,-1},
412 {0, 0, 0, 0, 2, 0, 0,-2, 0, 0, 0, 0, 1, 0, 0, 1},
413 {-3,3, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
414 {0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0,-2,-1, 0, 0},
415 {9,-9, 9,-9, 6, 3,-3,-6, 6,-6,-3, 3, 4, 2, 1, 2},
416 {-6,6,-6, 6,-4,-2, 2, 4,-3, 3, 3,-3,-2,-1,-1,-2},
417 {2,-2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
418 {0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 1, 1, 0, 0},
419 {-6, 6,-6,6,-3,-3, 3, 3,-4, 4, 2,-2,-2,-2,-1,-1},
420 {4,-4, 4,-4, 2, 2,-2,-2, 2,-2,-2, 2, 1, 1, 1, 1}};
422 double cl[16],coeff[4][4];
425 int index_x = (int)floor((r-xmin)*one_over_dx + 0.5);
426 if (index_x>=Nx)
return;
427 else if (index_x<0) index_x=0;
428 int index_z = (int)floor((z-
zmin)*one_over_dz + 0.5);
429 if(index_z<0 || index_z>=
Nz)
return;
433 int index_x1 = index_x + (index_x<Nx-1 ? 1:0);
434 int index_z1 = index_z + (index_z<
Nz-1 ? 1:0);
458 temp[12]=B00->dBxdxdz;
465 for (k=0;k<16;k++) tmp2+=wt[i][k]*temp[k];
469 for (j=0;j<4;j++) coeff[i][j]=cl[m++];
471 double t=(z - B00->z)*one_over_dz;
472 double u=(r - B00->x)*one_over_dx;
475 double c3u=coeff[i][3]*
u;
476 Br=t*Br+((c3u+coeff[i][2])*u+coeff[i][1])*u+coeff[i][0];
477 dBrdr=t*dBrdr+(3.*c3u+2.*coeff[i][2])*u+coeff[i][1];
478 dBrdz=u*dBrdz+(3.*coeff[3][i]*t+2.*coeff[2][i])*t+coeff[1][i];
499 temp[12]=B00->dBzdxdz;
506 for (k=0;k<16;k++) tmp2+=wt[i][k]*temp[k];
511 for (j=0;j<4;j++) coeff[i][j]=cl[m++];
515 double c3u=coeff[i][3]*
u;
516 Bz=t*Bz+((c3u+coeff[i][2])*u+coeff[i][1])*u+coeff[i][0];
517 dBzdr=t*dBzdr+(3.*c3u+2.*coeff[i][2])*u+coeff[i][1];
518 dBzdz=u*dBzdz+(3.*coeff[3][i]*t+2.*coeff[2][i])*t+coeff[1][i];
526 double &Bx_,
double &By_,
536 double &dBzdz_)
const{
538 double r =
sqrt(x*x + y*y);
540 Bx_=0.0,By_=0.0,Bz_=0.0;
541 dBxdx_=0.0,dBxdy_=0.0,dBxdz_=0.0;
542 dBydx_=0.0,dBydy_=0.0,dBydz_=0.0;
543 dBzdx_=0.0,dBzdy_=0.0,dBzdz_=0.0;
548 double Br_=0.,dBrdx_=0.,dBrdz_=0.;
555 if (z<zminFine || z>=zmaxFine || r>=rmaxFine){
558 int index_x =
static_cast<int>(r*one_over_dx);
559 int index_z =
static_cast<int>((z-
zmin)*one_over_dz);
562 if(index_x>=0 && index_x<Nx && index_z>=0 && index_z<
Nz){
566 double ur = (r - B->
x)*one_over_dx;
567 double uz = (z - B->
z)*one_over_dz;
579 unsigned int indr=
static_cast<unsigned int>(r*rscale);
580 unsigned int indz=
static_cast<unsigned int>((z-zminFine)*zscale);
595 double cos_theta = x/r;
596 double sin_theta = y/r;
605 dBxdx_ =dBrdx_*cos_theta*cos_theta;
606 dBxdy_ =dBrdx_*cos_theta*sin_theta;
607 dBxdz_ =dBrdz_*cos_theta;
609 dBydy_ = dBrdx_*sin_theta*sin_theta;
610 dBydz_ = dBrdz_*sin_theta;
611 dBzdx_ = dBzdx_*cos_theta;
612 dBzdy_ = dBzdx_*sin_theta;
624 double &dBxdx,
double &dBxdy,
626 double &dBydx,
double &dBydy,
628 double &dBzdx,
double &dBzdy,
629 double &dBzdz)
const{
632 double r =
sqrt(x*x + y*y);
633 int index_x = (int)floor((r-xmin)*one_over_dx + 0.5);
635 if (index_x>=Nx)
return;
636 else if (index_x<0) index_x=0;
637 int index_z = (int)floor((z-
zmin)*one_over_dz + 0.5);
638 if(index_z<0 || index_z>=
Nz)
return;
645 double cos_theta = x/r;
646 double sin_theta = y/r;
653 dBxdx = B->
dBxdx*cos_theta*cos_theta*one_over_dx;
654 dBxdy = B->
dBxdx*cos_theta*sin_theta*one_over_dx;
655 dBxdz = B->
dBxdz*cos_theta*one_over_dz;
656 dBydx = B->
dBxdx*sin_theta*cos_theta*one_over_dx;
657 dBydy = B->
dBxdx*sin_theta*sin_theta*one_over_dx;
658 dBydz = B->
dBxdz*sin_theta*one_over_dz;
659 dBzdx = B->
dBzdx*cos_theta*one_over_dx;
660 dBzdy = B->
dBzdx*sin_theta*one_over_dx;
661 dBzdz = B->
dBzdz*one_over_dz;
685 _DBG_<<
"Field map appears to be 3 dimensional. Code is currently"<<endl;
686 _DBG_<<
"unable to handle this. Treating as phi symmetric using y=0."<<endl;
690 double r =
sqrt(x*x + y*y);
695 double cos_theta = x/r;
696 double sin_theta = y/r;
704 if (z<zminFine || z>=zmaxFine || r>=rmaxFine){
706 int index_x =
static_cast<int>(r*one_over_dx);
708 if (index_x>=Nx)
return;
710 int index_z =
static_cast<int>((z-
zmin)*one_over_dz);
711 if(index_z<0 || index_z>=
Nz)
return;
718 double ur = (r - B->
x)*one_over_dx;
719 double uz = (z - B->
z)*one_over_dz;
726 unsigned int indr=
static_cast<unsigned int>(r*rscale);
727 unsigned int indz=
static_cast<unsigned int>((z-zminFine)*zscale);
754 _DBG_<<
"Field map appears to be 3 dimensional. Code is currently"<<endl;
755 _DBG_<<
"unable to handle this. Treating as phi symmetric using y=0."<<endl;
759 double r = pos.Perp();
762 Bout.SetXYZ(0.0, 0.0, 0.0);
766 double cos_theta = pos.x()/r;
767 double sin_theta = pos.y()/r;
775 if (z<zminFine || z>=zmaxFine || r>=rmaxFine){
777 int index_x =
static_cast<int>(r*one_over_dx);
779 if (index_x>=Nx) {Bout.SetXYZ(0.0, 0.0, 0.0);
return;}
781 int index_z =
static_cast<int>((z-
zmin)*one_over_dz);
782 if(index_z<0 || index_z>=
Nz){Bout.SetXYZ(0.0, 0.0, 0.0);
return;}
789 double ur = (r - B->
x)*one_over_dx;
790 double uz = (z - B->
z)*one_over_dz;
797 unsigned int indr=
static_cast<unsigned int>(r*rscale);
798 unsigned int indz=
static_cast<unsigned int>((z-zminFine)*zscale);
807 Bout.SetXYZ(Br*cos_theta,Br*sin_theta,Bz);
816 double r =
sqrt(x*x + y*y);
823 if (z<zminFine || z>=zmaxFine || r>=rmaxFine){
825 int index_x =
static_cast<int>(r*one_over_dx);
827 if (index_x>=Nx)
return 0.;
829 int index_z =
static_cast<int>((z-
zmin)*one_over_dz);
830 if(index_z<0 || index_z>=
Nz)
return 0.;
837 double ur = (r - B->
x)*one_over_dx;
838 double uz = (z - B->
z)*one_over_dz;
845 unsigned int indr=
static_cast<unsigned int>(r*rscale);
846 unsigned int indz=
static_cast<unsigned int>((z-zminFine)*zscale);
848 return mBfine[indr][indz].
Bz;
855 size_t ipos = namepath.rfind(
"/");
856 if(ipos == string::npos)
857 throw JException(
"Could not parse field map: "+namepath);
858 string finemesh_namepath = namepath.substr(0,ipos) +
"/finemeshes" + namepath.substr(ipos);
860 string evioFileNameToWrite =
"";
863 evioFileName = jresman->GetResource(finemesh_namepath);
864 }
catch ( JException
e ) {
866 size_t ipos=namepath.find(
"/");
867 size_t ipos2=namepath.find(
"/",ipos+1);
868 evioFileName = namepath.substr(ipos2+1)+
".evio";
870 struct stat stFileInfo;
871 int intStat = stat(evioFileName.c_str(),&stFileInfo);
878 if(evioFileName !=
"") {
879 ReadEvioFile(evioFileName);
881 cout <<
"Fine-mesh evio file does not exist." <<endl;
882 cout <<
"Constructing the fine-mesh B-field map..." << endl;
885 WriteEvioFile(evioFileNameToWrite);
889 cout <<
" rmin: " << rminFine <<
" rmax: " << rmaxFine
890 <<
" dr: " << drFine <<
" zmin: " << zminFine <<
" zmax: "
891 << zmaxFine <<
" dz: " << dzFine <<endl;
892 cout <<
" Number of points in z = " <<NzFine <<endl;
893 cout <<
" Number of points in r = " << NrFine << endl;
905 NrFine=(
unsigned int)floor((rmaxFine-rminFine)/drFine+0.5);
906 NzFine=(
unsigned int)floor((zmaxFine-zminFine)/dzFine+0.5);
908 vector<DBfieldCylindrical_t>zrow;
909 for (
unsigned int i=0;i<NrFine;i++){
910 double x=rminFine+drFine*double(i);
911 for (
unsigned int j=0;j<NzFine;j++){
912 double z=zminFine+dzFine*double(j);
916 zrow.push_back(temp);
918 mBfine.push_back(zrow);
924 cout <<
"Writing fine-mesh B-field data to " << evioFileName <<
"..." <<endl;
933 for (
unsigned int i=0;i<NrFine;i++){
934 for (
unsigned int j=0;j<NzFine;j++){
935 Br_.push_back(mBfine[i][j].Br);
936 Bz_.push_back(mBfine[i][j].Bz);
937 dBrdr_.push_back(mBfine[i][j].dBrdr);
938 dBrdz_.push_back(mBfine[i][j].dBrdz);
939 dBzdr_.push_back(mBfine[i][j].dBzdr);
940 dBzdz_.push_back(mBfine[i][j].dBzdz);
946 uint32_t buff_size = 8;
949 buff_size += 6*(2+NrFine*NzFine);
950 uint32_t *buff =
new uint32_t[buff_size+8];
953 uint32_t *iptr = buff;
961 *iptr++ = 0xc0da0100;
964 *iptr++ = buff_size - 1 - 8;
965 *iptr++ = (0x1<<16) + (0x0E<<8) + (0);
969 *iptr++ = (0x2<<16) + (0x02<<8) + (0);
970 *(
float*)iptr++ = (
float)rminFine;
971 *(
float*)iptr++ = (
float)rmaxFine;
972 *(
float*)iptr++ = (
float)drFine;
973 *(
float*)iptr++ = (
float)zminFine;
974 *(
float*)iptr++ = (
float)zmaxFine;
975 *(
float*)iptr++ = (
float)dzFine;
978 for(uint32_t i=0; i<6; i++){
979 vector<float> *d = NULL;
981 case 0: d = &Br_;
break;
982 case 1: d = &Bz_;
break;
983 case 2: d = &dBrdr_;
break;
984 case 3: d = &dBrdz_;
break;
985 case 4: d = &dBzdr_;
break;
986 case 5: d = &dBzdz_;
break;
988 *iptr++ = 2+NrFine*NzFine - 1;
989 *iptr++ = (0x3<<16) + (0x02<<8) + (i);
990 for(
float f : *d) *(
float*)iptr++ =
f;
1000 *iptr++ = (1<<9) + 0x4;
1002 *iptr++ = 0xc0da0100;
1006 ofstream ofs(evioFileName);
1007 ofs.write((
char*)buff, (buff_size+8)*4);
1014 unsigned long bufsize=NrFine*NzFine*6*
sizeof(float)+6;
1015 evioFileChannel
chan(evioFileName,
"w",bufsize);
1019 evioDOMTree tree(1,0);
1021 float minmaxdelta[6]={(float)rminFine,(
float)rmaxFine,(float)drFine,(
float)zminFine,(float)zmaxFine,(
float)dzFine};
1022 tree.addBank(2,0,minmaxdelta,6);
1025 tree.addBank(3,0,Br_);
1026 tree.addBank(3,1,Bz_);
1027 tree.addBank(3,2,dBrdr_);
1028 tree.addBank(3,3,dBrdz_);
1029 tree.addBank(3,4,dBzdr_);
1030 tree.addBank(3,5,dBzdz_);
1039 cout <<
"Reading fine-mesh B-field data from "<< evioFileName << endl;
1042 HDEVIO hdevio(evioFileName,
false);
1044 jerr <<
" Unable to open fine-mesh B-field file!" << endl;
1051 uint32_t buff_size=10;
1052 uint32_t *buff =
new uint32_t[buff_size];
1057 buff =
new uint32_t[buff_size];
1061 jerr <<
" Problem reading fine-mesh B-field" << endl;
1062 jerr << hdevio.
err_mess.str() << endl;
1068 uint32_t *iptr = buff;
1069 uint32_t *iend = &iptr[*iptr +1];
1074 jerr <<
" Bad length for minmaxdelta bank!" <<endl;
1077 float *minmaxdelta = (
float*)&iptr[2];
1078 rminFine = minmaxdelta[0];
1079 rmaxFine = minmaxdelta[1];
1080 drFine = minmaxdelta[2];
1081 zminFine = minmaxdelta[3];
1082 zmaxFine = minmaxdelta[4];
1083 dzFine = minmaxdelta[5];
1084 iptr = &iptr[*iptr + 1];
1089 NrFine=(
unsigned int)floor((rmaxFine-rminFine)/drFine+0.5);
1090 NzFine=(
unsigned int)floor((zmaxFine-zminFine)/dzFine+0.5);
1091 mBfine.resize(NrFine);
1092 for(
auto &m : mBfine) m.resize(NzFine);
1096 for(
int num=0; num<=5; num++){
1097 uint32_t mynum = iptr[1] & 0xFF;
1098 float *fptr = (
float*)&iptr[2];
1099 uint32_t N = iptr[0] - 1;
1102 jerr <<
" Bad format of fine mesh B-field file!" << endl;
1106 for(uint32_t k=0; k<N; k++){
1107 uint32_t indr=k/NzFine;
1108 uint32_t indz=k%NzFine;
1110 case 0: mBfine[indr][indz].Br = *fptr++;
break;
1111 case 1: mBfine[indr][indz].Bz = *fptr++;
break;
1112 case 2: mBfine[indr][indz].dBrdr = *fptr++;
break;
1113 case 3: mBfine[indr][indz].dBrdz = *fptr++;
break;
1114 case 4: mBfine[indr][indz].dBzdr = *fptr++;
break;
1115 case 5: mBfine[indr][indz].dBzdz = *fptr++;
break;
void GetFieldGradient(double x, double y, double z, double &dBxdx, double &dBxdy, double &dBxdz, double &dBydx, double &dBydy, double &dBydz, double &dBzdx, double &dBzdy, double &dBzdz) const
static string evioFileName
void ReadEvioFile(string evioFileName)
static evioFileChannel * chan
bool readNoFileBuff(uint32_t *user_buff, uint32_t user_buff_len, bool allow_swap=true)
void GetFineMeshMap(string namepath, int32_t runnumber)
virtual ~DMagneticFieldMapFineMesh()
void InterpolateField(double r, double z, double &Br, double &Bz, double &dBrdr, double &dBrdz, double &dBzdr, double &dBzdz) const
int ReadMap(string namepath, int32_t runnumber=1, string context="")
void WriteEvioFile(string evioFileName)
void GetFieldBicubic(double x, double y, double z, double &Bx, double &By, double &Bz) const
void GenerateFineMesh(void)
void GetFieldAndGradient(double x, double y, double z, double &Bx, double &By, double &Bz, double &dBxdx, double &dBxdy, double &dBxdz, double &dBydx, double &dBydy, double &dBydz, double &dBzdx, double &dBzdy, double &dBzdz) const
double GetBz(double x, double y, double z) const
void GetField(const DVector3 &pos, DVector3 &Bout) const
DMagneticFieldMapFineMesh(JApplication *japp, int32_t runnumber=1, string namepath="Magnets/Solenoid/solenoid_1350_poisson_20130925")