41   :fXoffset(xOffset),invertX(false),invertY(false),invertZ(false)
 
   45   double lenUnit= 
meter; 
 
   46   double fieldUnit= 
tesla;  
 
   47   G4cout << 
"\n-----------------------------------------------------------" 
   48          << 
"\n      Magnetic field" 
   49          << 
"\n-----------------------------------------------------------";
 
   52   G4cout << 
"\n ---> " "Reading the field grid from " << filename << 
" ... " << endl; 
 
   55   ifstream file( filename ); 
 
   59   file.getline(buffer,256);
 
   64   G4cout << 
"  [ Number of values x,y,z: "  
   65          << 
nx << 
" " << 
ny << 
" " << nz << 
" ] " 
   73   for (ix=0; ix<
nx; ix++) {
 
   77     for (iy=0; iy<
ny; iy++) {
 
   91   double permeability=0.; 
 
   92   for (ix=0; ix<
nx; ix++) {
 
   93     for (iy=0; iy<
ny; iy++) {
 
   94       for (iz=0; iz<
nz; iz++) {
 
   95         file >> xval >> yval >> zval >> bx >> by >> bz >> permeability;
 
   96         if ( ix==0 && iy==0 && iz==0 ) {
 
   97           minx = xval * lenUnit;
 
   98           miny = yval * lenUnit;
 
   99           minz = zval * lenUnit;
 
  101         xField[ix][iy][
iz] = bx * fieldUnit; 
 
  102         yField[ix][iy][
iz] = by * fieldUnit;
 
  103         zField[ix][iy][
iz] = bz * fieldUnit;
 
  111   maxx = xval * lenUnit;
 
  112   maxy = yval * lenUnit;
 
  113   maxz = zval * lenUnit;
 
  115   G4cout << 
"\n ---> ... done reading " << endl;
 
  118   G4cout << 
" ---> assumed the order:  x, y, z, Bx, By, Bz " 
  119          << 
"\n ---> Min values x,y,z: "  
  121          << 
"\n ---> Max values x,y,z: "  
  123          << 
"\n ---> The field will be offset by " << xOffset/
cm << 
" cm " << endl;
 
  129   G4cout << 
"\nAfter reordering if neccesary"   
  130          << 
"\n ---> Min values x,y,z: "  
  132          << 
" \n ---> Max values x,y,z: "  
  138   G4cout << 
"\n ---> Dif values x,y,z (range): "  
  140          << 
"\n-----------------------------------------------------------" << endl;
 
  144                                       double *Bfield )
 const 
  156     double xfraction = (x - 
minx) / 
dx;
 
  157     double yfraction = (y - 
miny) / 
dy; 
 
  158     double zfraction = (z - 
minz) / 
dz;
 
  160     if (
invertX) { xfraction = 1 - xfraction;}
 
  161     if (
invertY) { yfraction = 1 - yfraction;}
 
  162     if (
invertZ) { zfraction = 1 - zfraction;}
 
  166     double xdindex, ydindex, zdindex;
 
  170     double xlocal = ( std::modf(xfraction*(
nx-1), &xdindex));
 
  171     double ylocal = ( std::modf(yfraction*(
ny-1), &ydindex));
 
  172     double zlocal = ( std::modf(zfraction*(
nz-1), &zdindex));
 
  176     int xindex = 
static_cast<int>(xdindex);
 
  177     int yindex = 
static_cast<int>(ydindex);
 
  178     int zindex = 
static_cast<int>(zdindex);
 
  181 #ifdef DEBUG_INTERPOLATING_FIELD 
  182     G4cout << 
"Local x,y,z: " << xlocal << 
" " << ylocal << 
" " << zlocal << endl;
 
  183     G4cout << 
"Index x,y,z: " << xindex << 
" " << yindex << 
" " << zindex << endl;
 
  184     double valx0z0, mulx0z0, valx1z0, mulx1z0;
 
  185     double valx0z1, mulx0z1, valx1z1, mulx1z1;
 
  186     valx0z0= table[xindex  ][0][zindex];  mulx0z0=  (1-xlocal) * (1-zlocal);
 
  187     valx1z0= table[xindex+1][0][zindex];  mulx1z0=   xlocal    * (1-zlocal);
 
  188     valx0z1= table[xindex  ][0][zindex+1]; mulx0z1= (1-xlocal) * zlocal;
 
  189     valx1z1= table[xindex+1][0][zindex+1]; mulx1z1=  xlocal    * zlocal;
 
  193       xField[xindex  ][yindex  ][zindex  ] * (1-xlocal) * (1-ylocal) * (1-zlocal) +
 
  194       xField[xindex  ][yindex  ][zindex+1] * (1-xlocal) * (1-ylocal) *    zlocal  +
 
  195       xField[xindex  ][yindex+1][zindex  ] * (1-xlocal) *    ylocal  * (1-zlocal) +
 
  196       xField[xindex  ][yindex+1][zindex+1] * (1-xlocal) *    ylocal  *    zlocal  +
 
  197       xField[xindex+1][yindex  ][zindex  ] *    xlocal  * (1-ylocal) * (1-zlocal) +
 
  198       xField[xindex+1][yindex  ][zindex+1] *    xlocal  * (1-ylocal) *    zlocal  +
 
  199       xField[xindex+1][yindex+1][zindex  ] *    xlocal  *    ylocal  * (1-zlocal) +
 
  200       xField[xindex+1][yindex+1][zindex+1] *    xlocal  *    ylocal  *    zlocal ;
 
  203       yField[xindex  ][yindex  ][zindex  ] * (1-xlocal) * (1-ylocal) * (1-zlocal) +
 
  204       yField[xindex  ][yindex  ][zindex+1] * (1-xlocal) * (1-ylocal) *    zlocal  +
 
  205       yField[xindex  ][yindex+1][zindex  ] * (1-xlocal) *    ylocal  * (1-zlocal) +
 
  206       yField[xindex  ][yindex+1][zindex+1] * (1-xlocal) *    ylocal  *    zlocal  +
 
  207       yField[xindex+1][yindex  ][zindex  ] *    xlocal  * (1-ylocal) * (1-zlocal) +
 
  208       yField[xindex+1][yindex  ][zindex+1] *    xlocal  * (1-ylocal) *    zlocal  +
 
  209       yField[xindex+1][yindex+1][zindex  ] *    xlocal  *    ylocal  * (1-zlocal) +
 
  210       yField[xindex+1][yindex+1][zindex+1] *    xlocal  *    ylocal  *    zlocal ;
 
  213       zField[xindex  ][yindex  ][zindex  ] * (1-xlocal) * (1-ylocal) * (1-zlocal) +
 
  214       zField[xindex  ][yindex  ][zindex+1] * (1-xlocal) * (1-ylocal) *    zlocal  +
 
  215       zField[xindex  ][yindex+1][zindex  ] * (1-xlocal) *    ylocal  * (1-zlocal) +
 
  216       zField[xindex  ][yindex+1][zindex+1] * (1-xlocal) *    ylocal  *    zlocal  +
 
  217       zField[xindex+1][yindex  ][zindex  ] *    xlocal  * (1-ylocal) * (1-zlocal) +
 
  218       zField[xindex+1][yindex  ][zindex+1] *    xlocal  * (1-ylocal) *    zlocal  +
 
  219       zField[xindex+1][yindex+1][zindex  ] *    xlocal  *    ylocal  * (1-zlocal) +
 
  220       zField[xindex+1][yindex+1][zindex+1] *    xlocal  *    ylocal  *    zlocal ;
 
vector< vector< vector< double > > > xField
 
HadrontherapyMagneticField3D(const char *filename, double xOffset)
 
vector< vector< vector< double > > > zField
 
#define G4MUTEX_INITIALIZER
 
void GetFieldValue(const double Point[4], double *Bfield) const 
 
G4GLOB_DLL std::ostream G4cout
 
vector< vector< vector< double > > > yField
 
static const double meter
 
static const double tesla