123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- // -------------------------------------------------------------------------
- // ----- MpdFieldMapSym3 source file -----
- // ----- Created 12/01/04 by M. Al/Turany (CbmField.cxx) -----
- // ----- Redesign 13/02/06 by V. Friese -----
- // -------------------------------------------------------------------------
- #include "MpdFieldMapSym3.h"
- #include "MpdFieldPar.h"
- #include "TArrayF.h"
- // ------------- Default constructor ----------------------------------
- MpdFieldMapSym3::MpdFieldMapSym3()
- : MpdFieldMap(),
- fHemiX(0.),
- fHemiY(0.),
- fHemiZ(0.)
- {
- fType = 3;
- }
- // ------------------------------------------------------------------------
- // ------------- Standard constructor ---------------------------------
- MpdFieldMapSym3::MpdFieldMapSym3(const char* mapName,
- const char* fileType)
- : MpdFieldMap(mapName, fileType),
- fHemiX(0.),
- fHemiY(0.),
- fHemiZ(0.)
- {
- fType = 3;
- }
- // ------------------------------------------------------------------------
- // ------------- Constructor from MpdFieldPar -------------------------
- MpdFieldMapSym3::MpdFieldMapSym3(MpdFieldPar* fieldPar)
- : MpdFieldMap(fieldPar),
- fHemiX(0.),
- fHemiY(0.),
- fHemiZ(0.)
- {
- fType = 3;
- }
- // ------------------------------------------------------------------------
- // ------------ Destructor --------------------------------------------
- MpdFieldMapSym3::~MpdFieldMapSym3() { }
- // ------------------------------------------------------------------------
- // ----------- Get x component of the field ---------------------------
- Double_t MpdFieldMapSym3::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 MpdFieldMapSym3::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 MpdFieldMapSym3::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 * fHemiZ;
- }
- return 0.;
- }
- // ------------------------------------------------------------------------
- // ----------- Check whether a point is inside the map ----------------
- Bool_t MpdFieldMapSym3::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 = fHemiZ = 1.;
- if ( xl < 0. ) {
- fHemiX = -1.;
- xl = -1. * xl;
- }
- if ( yl < 0. ) {
- fHemiY = -1.;
- yl = -1. * yl;
- }
- if ( zl < 0. ) {
- fHemiZ = -1.;
- zl = -1. * zl;
- }
- // --- 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(MpdFieldMapSym3)
|