24#define CBMFIELDMAP_H 1
30#include <RtypesCore.h>
51 CbmFieldMap(
const char* mapName,
const char* fileType =
"R");
67 virtual void Init()
override;
81 virtual void Init(
Int_t nX, Double_t xMin, Double_t xMax,
Int_t nY, Double_t yMin, Double_t yMax,
Int_t nZ,
82 Double_t zMin, Double_t zMax, TArrayF* bx, TArrayF* by, TArrayF* bz);
89 virtual Double_t
GetBx(Double_t
x, Double_t
y, Double_t z)
override;
90 virtual Double_t
GetBy(Double_t
x, Double_t
y, Double_t z)
override;
91 virtual Double_t
GetBz(Double_t
x, Double_t
y, Double_t z)
override;
97 virtual void GetFieldValue(
const Double_t point[3], Double_t* bField)
override;
104 void WriteRootFile(
const char* fileName,
const char* mapName);
108 virtual void SetPosition(Double_t
x, Double_t
y, Double_t z);
151 virtual void Print(Option_t* =
"")
const override;
185 GridCoordinates
Local2Grid(
const LocalCoordinates& local)
const;
192 [[gnu::always_inline]] Double_t
Interpolate(
const TArrayF*
B,
const GridCoordinates& point)
const;
206 void ReadRootFile(
const char* fileName,
const char* mapName);
275 bool isValid = (ix >= 0 && ix <
fNx - 1 && iy >= 0 && iy <
fNy - 1 && iz >= 0 && iz <
fNz - 1);
278 Double_t dx =
x - (Double_t) ix;
279 Double_t dy =
y - (Double_t) iy;
280 Double_t dz = z - (Double_t) iz;
282 return {isValid, ix, iy, iz, dx, dy, dz};
288[[gnu::always_inline]]
inline Double_t
297 int ind000 = p.
ix * Nyz + p.
iy *
fNz + p.
iz;
298 int ind111 = ind000 + Nyz +
fNz + 1;
300 if (ind000 < 0 || ind111 >=
B->GetSize()) {
301 LOG(error) <<
"CbmFieldMap::Interpolate: Index out of bounds!";
305 const auto* arr =
B->GetArray();
309 Double_t H000 = arr[ind000];
310 Double_t H001 = arr[ind000 + 1];
311 Double_t H010 = arr[ind000 +
fNz];
312 Double_t H011 = arr[ind000 +
fNz + 1];
313 Double_t H100 = arr[ind000 + Nyz];
314 Double_t H101 = arr[ind000 + Nyz + 1];
315 Double_t H110 = arr[ind000 + Nyz +
fNz];
316 Double_t H111 = arr[ind111];
320 Double_t Hyz00 = H000 + (H100 - H000) * p.
dx;
321 Double_t Hyz10 = H010 + (H110 - H010) * p.
dx;
322 Double_t Hyz01 = H001 + (H101 - H001) * p.
dx;
323 Double_t Hyz11 = H011 + (H111 - H011) * p.
dx;
326 Double_t Hz0 = Hyz00 + (Hyz10 - Hyz00) * p.
dy;
327 Double_t Hz1 = Hyz01 + (Hyz11 - Hyz01) * p.
dy;
330 return Hz0 + (Hz1 - Hz0) * p.
dz;
virtual void SetPosition(Double_t x, Double_t y, Double_t z)
virtual void GetFieldValue(const Double_t point[3], Double_t *bField) override
Double_t GetXstep() const
GridCoordinates Local2Grid(const LocalCoordinates &local) const
Transform local coordinates into grid cell coordinates.
virtual void SetScale(Double_t factor)
void WriteRootFile(const char *fileName, const char *mapName)
void ReadAsciiFile(const char *fileName)
Double_t GetPositionY() const
void SetField(const CbmFieldMapData *data)
void ReadAsciiFile2018(const char *fileName)
virtual void Print(Option_t *="") const override
Double_t GetYstep() const
LocalCoordinates Global2Local(Double_t x, Double_t y, Double_t z) const
Transform global coordinates into local coordinates.
Double_t GetPositionZ() const
CbmFieldMap(const CbmFieldMap &)
z-component of the field at the origin
Double_t GetPositionX() const
GridCoordinates Global2Grid(Double_t x, Double_t y, Double_t z) const
Get grid cell coordinates for a point in global coordinates.
void ReadRootFile(const char *fileName, const char *mapName)
const char * GetFileName()
void WriteAsciiFile(const char *fileName)
CbmFieldMap & operator=(const CbmFieldMap &)
Double_t fBzOrigin
y-component of the field at the origin
Double_t GetZstep() const
Double_t Interpolate(const TArrayF *B, const GridCoordinates &point) const
Get field values by interpolation of the grid.
virtual void Init() override
Double_t fByOrigin
x-component of the field at the origin
Double_t GetScale() const
Structure to hold grid cell coordinates and relative distances.
Structure to hold local coordinates in the field map. Local coordinates are defined as the distance f...