Project
Loading...
Searching...
No Matches
RegularGrid3D.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
17#ifndef ALICEO2_TPC_REGULARGRID3D_H_
18#define ALICEO2_TPC_REGULARGRID3D_H_
19
21#include "Rtypes.h" // for ClassDefNV
23#include <vector>
24
25namespace o2
26{
27namespace tpc
28{
29
31template <typename DataT = double>
42
46template <typename DataT = double>
48
49 public:
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)}}
51 {
52 mRVertices.reserve(mParamGrid.NRVertices);
53 mPhiVertices.reserve(mParamGrid.NPhiVertices);
54 mZVertices.reserve(mParamGrid.NZVertices);
55 initLists();
56 }
57
60 int getDeltaXDataIndex(const int deltaX) const { return deltaX; }
61
64 int getDeltaYDataIndex(const int deltaY) const { return mParamGrid.NZVertices * deltaY; }
65
68 int getDeltaZDataIndex(const int deltaZ) const { return deltaZ * mParamGrid.NRVertices * mParamGrid.NZVertices; }
69
70 // same as above
74 int getDeltaDataIndex(const int delta, const int dim) const;
75
76 // check if the specified index for given dimension lies in the grid
79 bool isIndexInGrid(const int index, const unsigned int dim) const { return index < 0 ? false : (index > (sNdim[dim] - 1) ? false : true); }
80
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]; }
87
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; }
92
93 const Vector<DataT, 3>& getGridMin() const { return mMin; }
94 DataT getGridMinZ() const { return mMin[FZ]; }
95 DataT getGridMinR() const { return mMin[FR]; }
96 DataT getGridMinPhi() const { return mMin[FPHI]; }
97
98 DataT getGridMaxZ() const { return mMax[FZ]; }
99 DataT getGridMaxR() const { return mMax[FR]; }
100 DataT getGridMaxPhi() const { return mMax[FPHI]; }
101
103 const Vector<DataT, 3>& getInvSpacing() const { return mInvSpacing; }
104 DataT getInvSpacingZ() const { return mInvSpacing[FZ]; }
105 DataT getInvSpacingR() const { return mInvSpacing[FR]; }
106 DataT getInvSpacingPhi() const { return mInvSpacing[FPHI]; }
107
108 DataT getSpacingZ() const { return mSpacing[FZ]; }
109 DataT getSpacingR() const { return mSpacing[FR]; }
110 DataT getSpacingPhi() const { return mSpacing[FPHI]; }
111
112 // clamp coordinates to the grid (not circular)
115 DataT clampToGrid(const DataT pos, const unsigned int dim) const;
116
117 // clamp coordinates to the grid (not circular)
120 DataT clampToGridRel(const DataT pos, const unsigned int dim) const;
121
122 // clamp coordinates to the grid circular
125 DataT clampToGridCircular(DataT pos, const unsigned int dim) const;
126
127 // clamp coordinates to the grid circular
130 DataT clampToGridCircularRel(DataT pos, const unsigned int dim) const;
131
134 DataT getZVertex(const size_t vertexX) const { return mZVertices[vertexX]; }
135
138 DataT getRVertex(const size_t vertexY) const { return mRVertices[vertexY]; }
139
142 DataT getPhiVertex(const size_t vertexZ) const { return mPhiVertices[vertexZ]; }
143
144 const Vector<DataT, 3>& getMaxIndices() const { return sMaxIndex; }
145
146 DataT getMaxIndexZ() const { return sMaxIndex[0]; }
147 DataT getMaxIndexR() const { return sMaxIndex[1]; }
148 DataT getMaxIndexPhi() const { return sMaxIndex[2]; }
149
151 const auto& getParamSC() const { return mParamGrid; }
152
153 unsigned short getRVertices() const { return mParamGrid.NRVertices; }
154 unsigned short getZVertices() const { return mParamGrid.NZVertices; }
155 unsigned short getPhiVertices() const { return mParamGrid.NPhiVertices; }
156
158 RegularGridHelper<double> getHelper() const { return RegularGridHelper<double>{getGridMinZ(), getGridMinR(), getGridMinPhi(), getSpacingZ(), getSpacingR(), getSpacingPhi(), mParamGrid}; }
159
160 private:
161 ParamSpaceCharge mParamGrid{};
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{};
175
176 void initLists();
177
178 ClassDefNV(RegularGrid3D, 3)
179};
180
186
187template <typename DataT>
188DataT RegularGrid3D<DataT>::clampToGrid(const DataT pos, const unsigned int dim) const
189{
190 if (mMin[dim] < mMax[dim]) {
191 if (pos < mMin[dim]) {
192 return mMin[dim];
193 } else if (pos > mMax[dim]) {
194 return mMax[dim];
195 }
196 } else {
197 if (pos > mMin[dim]) {
198 return mMin[dim];
199 } else if (pos < mMax[dim]) {
200 return mMax[dim];
201 }
202 }
203 return pos;
204}
205
206template <typename DataT>
207DataT RegularGrid3D<DataT>::clampToGridRel(const DataT pos, const unsigned int dim) const
208{
209 if (pos < 0) {
210 return 0;
211 } else if (pos >= sMaxIndex[dim]) {
212 return sMaxIndex[dim] - 1; // -1 return second last index. otherwise two additional points have to be extrapolated for tricubic interpolation
213 }
214 return pos;
215}
216
217template <typename DataT>
219{
220 while (pos < mMin[dim]) {
221 pos += mMax[dim] - mMin[dim] + mSpacing[dim];
222 }
223 while (pos >= mMax[dim] + mSpacing[dim]) {
224 pos -= mMax[dim] + mSpacing[dim] - mMin[dim];
225 }
226 return pos;
227}
228
229template <typename DataT>
231{
232 while (pos < 0) {
233 pos += sNdim[dim];
234 }
235 while (pos > sNdim[dim]) {
236 pos -= sNdim[dim];
237 }
238 if (pos == sNdim[dim]) {
239 pos = 0;
240 }
241 return pos;
242}
243
244template <typename DataT>
246{
247 for (size_t i = 0; i < mParamGrid.NZVertices; ++i) {
248 mZVertices.emplace_back(mMin[FZ] + i * mSpacing[FZ]);
249 }
250 for (size_t i = 0; i < mParamGrid.NRVertices; ++i) {
251 mRVertices.emplace_back(mMin[FR] + i * mSpacing[FR]);
252 }
253 for (size_t i = 0; i < mParamGrid.NPhiVertices; ++i) {
254 mPhiVertices.emplace_back(mMin[FPHI] + i * mSpacing[FPHI]);
255 }
256}
257
258template <typename DataT>
259int RegularGrid3D<DataT>::getDeltaDataIndex(const int delta, const int dim) const
260{
261 const int offset[FDIM]{1, mParamGrid.NZVertices, mParamGrid.NRVertices * mParamGrid.NZVertices};
262 const int deltaIndex = delta * offset[dim];
263 return deltaIndex;
264}
265
266} // namespace tpc
267} // namespace o2
268
269#endif
int32_t i
uint16_t pos
Definition RawData.h:3
size_t getNPhi() const
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 &params)
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
GLuint index
Definition glcorearb.h:781
GLenum const GLfloat * params
Definition glcorearb.h:272
GLintptr offset
Definition glcorearb.h:660
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
helper struct to store and set RegularGrid3D