-
Administrator authored
The latest version of our formating rules is applied to all header and source files as well as to the macros using clang-format 11.0.
Administrator authoredThe latest version of our formating rules is applied to all header and source files as well as to the macros using clang-format 11.0.
CbmFieldMapSym2.cxx 5.88 KiB
// -------------------------------------------------------------------------
// ----- CbmFieldMapSym2 source file -----
// ----- Created 09/06/05 by E. Litvinenko (CbmFieldMapLIT.cxx) -----
// ----- Redesign 20/02/06 by V. Friese -----
// -------------------------------------------------------------------------
#include "CbmFieldMapSym2.h"
#include <TArrayF.h> // for TArrayF
// ------------- Default constructor ----------------------------------
CbmFieldMapSym2::CbmFieldMapSym2() : CbmFieldMap(), fHemiX(0.), fHemiY(0.) { fType = 2; }
// ------------------------------------------------------------------------
// ------------- Standard constructor ---------------------------------
CbmFieldMapSym2::CbmFieldMapSym2(const char* mapName, const char* fileType)
: CbmFieldMap(mapName, fileType)
, fHemiX(0.)
, fHemiY(0.)
{
fType = 2;
}
// ------------------------------------------------------------------------
// ------------ Constructor from CbmFieldPar --------------------------
CbmFieldMapSym2::CbmFieldMapSym2(CbmFieldPar* fieldPar) : CbmFieldMap(fieldPar), fHemiX(0.), fHemiY(0.) { fType = 2; }
// ------------------------------------------------------------------------
// ------------ Destructor --------------------------------------------
CbmFieldMapSym2::~CbmFieldMapSym2() {}
// ------------------------------------------------------------------------
// ----------- Get x component of the field ---------------------------
Double_t CbmFieldMapSym2::GetBx(Double_t x, Double_t y, Double_t z)
{
Int_t ix = 0;
Int_t iy = 0;
Int_t iz = 0;
Double_t dx = 0.;
Double_t dy = 0.;
Double_t dz = 0.;
if (IsInside(x, y, z, ix, iy, iz, dx, dy, dz)) {
// Get Bx field values at grid cell corners
fHa[0][0][0] = fBx->At(ix * fNy * fNz + iy * fNz + iz);
fHa[1][0][0] = fBx->At((ix + 1) * fNy * fNz + iy * fNz + iz);
fHa[0][1][0] = fBx->At(ix * fNy * fNz + (iy + 1) * fNz + iz);
fHa[1][1][0] = fBx->At((ix + 1) * fNy * fNz + (iy + 1) * fNz + iz);
fHa[0][0][1] = fBx->At(ix * fNy * fNz + iy * fNz + (iz + 1));
fHa[1][0][1] = fBx->At((ix + 1) * fNy * fNz + iy * fNz + (iz + 1));
fHa[0][1][1] = fBx->At(ix * fNy * fNz + (iy + 1) * fNz + (iz + 1));
fHa[1][1][1] = fBx->At((ix + 1) * fNy * fNz + (iy + 1) * fNz + (iz + 1));
// Return interpolated field value
return Interpolate(dx, dy, dz) * fHemiX * fHemiY;
}
return 0.;
}
// ------------------------------------------------------------------------
// ----------- Get y component of the field ---------------------------
Double_t CbmFieldMapSym2::GetBy(Double_t x, Double_t y, Double_t z)
{
Int_t ix = 0;
Int_t iy = 0;
Int_t iz = 0;
Double_t dx = 0.;
Double_t dy = 0.;
Double_t dz = 0.;
if (IsInside(x, y, z, ix, iy, iz, dx, dy, dz)) {
// Get By field values at grid cell corners
fHa[0][0][0] = fBy->At(ix * fNy * fNz + iy * fNz + iz);
fHa[1][0][0] = fBy->At((ix + 1) * fNy * fNz + iy * fNz + iz);
fHa[0][1][0] = fBy->At(ix * fNy * fNz + (iy + 1) * fNz + iz);
fHa[1][1][0] = fBy->At((ix + 1) * fNy * fNz + (iy + 1) * fNz + iz);
fHa[0][0][1] = fBy->At(ix * fNy * fNz + iy * fNz + (iz + 1));
fHa[1][0][1] = fBy->At((ix + 1) * fNy * fNz + iy * fNz + (iz + 1));
fHa[0][1][1] = fBy->At(ix * fNy * fNz + (iy + 1) * fNz + (iz + 1));
fHa[1][1][1] = fBy->At((ix + 1) * fNy * fNz + (iy + 1) * fNz + (iz + 1));
// Return interpolated field value
return Interpolate(dx, dy, dz);
}
return 0.;
}
// ------------------------------------------------------------------------
// ----------- Get z component of the field ---------------------------
Double_t CbmFieldMapSym2::GetBz(Double_t x, Double_t y, Double_t z)
{
Int_t ix = 0;
Int_t iy = 0;
Int_t iz = 0;
Double_t dx = 0.;
Double_t dy = 0.;
Double_t dz = 0.;
if (IsInside(x, y, z, ix, iy, iz, dx, dy, dz)) {
// Get Bz field values at grid cell corners
fHa[0][0][0] = fBz->At(ix * fNy * fNz + iy * fNz + iz);
fHa[1][0][0] = fBz->At((ix + 1) * fNy * fNz + iy * fNz + iz);
fHa[0][1][0] = fBz->At(ix * fNy * fNz + (iy + 1) * fNz + iz);
fHa[1][1][0] = fBz->At((ix + 1) * fNy * fNz + (iy + 1) * fNz + iz);
fHa[0][0][1] = fBz->At(ix * fNy * fNz + iy * fNz + (iz + 1));
fHa[1][0][1] = fBz->At((ix + 1) * fNy * fNz + iy * fNz + (iz + 1));
fHa[0][1][1] = fBz->At(ix * fNy * fNz + (iy + 1) * fNz + (iz + 1));
fHa[1][1][1] = fBz->At((ix + 1) * fNy * fNz + (iy + 1) * fNz + (iz + 1));
// Return interpolated field value
return Interpolate(dx, dy, dz) * fHemiY;
}
return 0.;
}
// ------------------------------------------------------------------------
// ----------- Check whether a point is inside the map ----------------
Bool_t CbmFieldMapSym2::IsInside(Double_t x, Double_t y, Double_t z, Int_t& ix, Int_t& iy, Int_t& iz, Double_t& dx,
Double_t& dy, Double_t& dz)
{
// --- Transform into local coordinate system
Double_t xl = x - fPosX;
Double_t yl = y - fPosY;
Double_t zl = z - fPosZ;
// --- Reflect w.r.t. symmetry axes
fHemiX = fHemiY = 1.;
if (xl < 0.) {
fHemiX = -1.;
xl = -1. * xl;
}
if (yl < 0.) {
fHemiY = -1.;
yl = -1. * yl;
}
// --- Check for being outside the map range
if (!(xl >= fXmin && xl < fXmax && yl >= fYmin && yl < fYmax && zl >= fZmin && zl < fZmax)) {
ix = iy = iz = 0;
dx = dy = dz = 0.;
return kFALSE;
}
// --- Determine grid cell
ix = Int_t((xl - fXmin) / fXstep);
iy = Int_t((yl - fYmin) / fYstep);
iz = Int_t((zl - fZmin) / fZstep);
// Relative distance from grid point (in units of cell size)
dx = (xl - fXmin) / fXstep - Double_t(ix);
dy = (yl - fYmin) / fYstep - Double_t(iy);
dz = (zl - fZmin) / fZstep - Double_t(iz);
return kTRUE;
}
// ------------------------------------------------------------------------
ClassImp(CbmFieldMapSym2)