17#ifndef ALICEO2_TPC_REGULARGRID3D_H_
18#define ALICEO2_TPC_REGULARGRID3D_H_
31template <
typename DataT =
double>
46template <
typename DataT =
double>
50 RegularGrid3D(
const DataT zmin,
const DataT rmin,
const DataT phimin,
const DataT spacingZ,
const DataT spacingR,
const DataT spacingPhi,
const ParamSpaceCharge&
params) : mParamGrid{
params}, mMin{{zmin, rmin, phimin}}, mMax{{zmin + (mParamGrid.NZVertices - 1) * spacingZ, rmin + (mParamGrid.NRVertices - 1) * spacingR, phimin + (mParamGrid.NPhiVertices - 1) * spacingPhi}}, mSpacing{{spacingZ, spacingR, spacingPhi}}, mInvSpacing{{
static_cast<DataT>(1 / spacingZ),
static_cast<DataT>(1 / spacingR),
static_cast<DataT>(1 / spacingPhi)}}
52 mRVertices.reserve(mParamGrid.NRVertices);
53 mPhiVertices.reserve(mParamGrid.NPhiVertices);
54 mZVertices.reserve(mParamGrid.NZVertices);
68 int getDeltaZDataIndex(
const int deltaZ)
const {
return deltaZ * mParamGrid.NRVertices * mParamGrid.NZVertices; }
79 bool isIndexInGrid(
const int index,
const unsigned int dim)
const {
return index < 0 ? false : (index > (sNdim[dim] - 1) ? false :
true); }
83 size_t getN(
unsigned int dim)
const {
return sNdim[dim]; }
84 size_t getNZ()
const {
return sNdim[FZ]; }
85 size_t getNR()
const {
return sNdim[FR]; }
86 size_t getNPhi()
const {
return sNdim[FPHI]; }
88 static constexpr unsigned int getDim() {
return FDIM; }
89 static constexpr unsigned int getFZ() {
return FZ; }
90 static constexpr unsigned int getFR() {
return FR; }
91 static constexpr unsigned int getFPhi() {
return FPHI; }
162 static constexpr unsigned int FDIM = 3;
163 static constexpr unsigned int FZ = 0;
164 static constexpr unsigned int FR = 1;
165 static constexpr unsigned int FPHI = 2;
166 Vector<DataT, FDIM> mMin{};
167 Vector<DataT, FDIM> mMax{};
168 Vector<DataT, FDIM> mSpacing{};
169 Vector<DataT, FDIM> mInvSpacing{};
170 Vector<DataT, FDIM> sMaxIndex{{
static_cast<DataT>(mParamGrid.NZVertices - 1.),
static_cast<DataT>(mParamGrid.NRVertices - 1),
static_cast<DataT>(mParamGrid.NPhiVertices - 1)}};
171 Vector<int, FDIM> sNdim{{
static_cast<int>(mParamGrid.NZVertices),
static_cast<int>(mParamGrid.NRVertices),
static_cast<int>(mParamGrid.NPhiVertices)}};
172 std::vector<DataT> mZVertices{};
173 std::vector<DataT> mRVertices{};
174 std::vector<DataT> mPhiVertices{};
178 ClassDefNV(RegularGrid3D, 3)
187template <
typename DataT>
190 if (mMin[dim] < mMax[dim]) {
191 if (
pos < mMin[dim]) {
193 }
else if (
pos > mMax[dim]) {
197 if (
pos > mMin[dim]) {
199 }
else if (
pos < mMax[dim]) {
206template <
typename DataT>
211 }
else if (
pos >= sMaxIndex[dim]) {
212 return sMaxIndex[dim] - 1;
217template <
typename DataT>
220 while (
pos < mMin[dim]) {
221 pos += mMax[dim] - mMin[dim] + mSpacing[dim];
223 while (
pos >= mMax[dim] + mSpacing[dim]) {
224 pos -= mMax[dim] + mSpacing[dim] - mMin[dim];
229template <
typename DataT>
235 while (
pos > sNdim[dim]) {
238 if (
pos == sNdim[dim]) {
244template <
typename DataT>
247 for (
size_t i = 0;
i < mParamGrid.NZVertices; ++
i) {
248 mZVertices.emplace_back(mMin[FZ] +
i * mSpacing[FZ]);
250 for (
size_t i = 0;
i < mParamGrid.NRVertices; ++
i) {
251 mRVertices.emplace_back(mMin[FR] +
i * mSpacing[FR]);
253 for (
size_t i = 0;
i < mParamGrid.NPhiVertices; ++
i) {
254 mPhiVertices.emplace_back(mMin[FPHI] +
i * mSpacing[FPHI]);
258template <
typename DataT>
261 const int offset[FDIM]{1, mParamGrid.NZVertices, mParamGrid.NRVertices * mParamGrid.NZVertices};
262 const int deltaIndex = delta *
offset[dim];
DataT clampToGridRel(const DataT pos, const unsigned int dim) const
static constexpr unsigned int getFPhi()
DataT clampToGridCircular(DataT pos, const unsigned int dim) const
size_t getN(unsigned int dim) const
int getDeltaYDataIndex(const int deltaY) const
DataT getGridMinZ() const
DataT getRVertex(const size_t vertexY) const
DataT getGridMinPhi() const
const Vector< DataT, 3 > & getInvSpacing() const
const auto & getParamSC() const
get max index in z direction
static constexpr unsigned int getFZ()
DataT getMaxIndexR() const
get max index in x direction
DataT getGridMaxPhi() const
DataT getPhiVertex(const size_t vertexZ) const
DataT getGridMinR() const
int getDeltaXDataIndex(const int deltaX) const
DataT getInvSpacingR() const
DataT getInvSpacingZ() const
DataT getSpacingPhi() const
unsigned short getZVertices() const
DataT getSpacingR() const
DataT getInvSpacingPhi() const
DataT clampToGridCircularRel(DataT pos, const unsigned int dim) const
DataT getSpacingZ() const
int getDeltaDataIndex(const int delta, const int dim) const
DataT getGridMaxZ() const
unsigned short getRVertices() const
int getDeltaZDataIndex(const int deltaZ) const
DataT getZVertex(const size_t vertexX) const
DataT clampToGrid(const DataT pos, const unsigned int dim) const
RegularGrid3D(const DataT zmin, const DataT rmin, const DataT phimin, const DataT spacingZ, const DataT spacingR, const DataT spacingPhi, const ParamSpaceCharge ¶ms)
RegularGridHelper< double > getHelper() const
DataT getMaxIndexZ() const
get max indices for all dimensions
static constexpr unsigned int getDim()
static constexpr unsigned int getFR()
DataT getGridMaxR() const
unsigned short getPhiVertices() const
const Vector< DataT, 3 > & getMaxIndices() const
const Vector< DataT, 3 > & getGridMin() const
DataT getMaxIndexPhi() const
get max index in y direction
bool isIndexInGrid(const int index, const unsigned int dim) const
GLenum const GLfloat * params
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
helper struct to store and set RegularGrid3D