17#ifndef ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_TPCFASTTRANSFORMGEO_H
18#define ALICEO2_GPUCOMMON_TPCFASTTRANSFORMATION_TPCFASTTRANSFORMGEO_H
21#ifndef GPUCA_GPUCODE_DEVICE
54 GPUd() float getUwidth()
const {
return -2.f *
u0; }
83 void setTPCrow(int32_t iRow,
float x, int32_t nPads,
float padWidth);
88 void setTPCzLength(
float tpcZlengthSideA,
float tpcZlengthSideC);
100 bool isConstructed()
const {
return (mConstructionMask == (uint32_t)ConstructionState::Constructed); }
105 GPUd() static constexpr int32_t getNumberOfSlices() {
return NumberOfSlices; }
108 GPUd() static constexpr int32_t getNumberOfSlicesA() {
return NumberOfSlicesA; }
111 GPUd() int32_t getNumberOfRows()
const {
return mNumberOfRows; }
120 GPUd()
float getTPCzLengthA()
const {
return mTPCzLengthA; }
123 GPUd() float getTPCzLengthC()
const {
return mTPCzLengthC; }
126 GPUd() float getTPCzLength(int32_t slice)
const
128 return (slice < NumberOfSlicesA) ? mTPCzLengthA
133 GPUd() float getTPCalignmentZ()
const {
return mTPCalignmentZ; }
144 GPUd()
void convUVtoLocal(int32_t slice,
float u,
float v,
float&
y,
float&
z)
const;
148 GPUd()
void convLocalToUV(int32_t slice,
float y,
float z,
float&
u,
float&
v)
const;
151 GPUd()
void convUVtoScaledUV(int32_t slice, int32_t
row,
float u,
float v,
float&
su,
float&
sv)
const;
154 GPUd()
void convScaledUVtoUV(int32_t slice, int32_t
row,
float su,
float sv,
float&
u,
float&
v)
const;
177 static constexpr int32_t NumberOfSlices = 36;
178 static constexpr int32_t NumberOfSlicesA = NumberOfSlices / 2;
179 static constexpr int32_t MaxNumberOfRows = 160;
184 enum ConstructionState : uint32_t {
185 NotConstructed = 0x0,
192 uint32_t mConstructionMask = ConstructionState::NotConstructed;
196 int32_t mNumberOfRows = 0;
197 float mTPCzLengthA = 0.f;
198 float mTPCzLengthC = 0.f;
199 float mTPCalignmentZ = 0.f;
200 float mScaleVtoSVsideA = 0.f;
201 float mScaleVtoSVsideC = 0.f;
202 float mScaleSVtoVsideA = 0.f;
203 float mScaleSVtoVsideC = 0.f;
205 SliceInfo mSliceInfos[NumberOfSlices + 1];
206 RowInfo mRowInfos[MaxNumberOfRows + 1];
215GPUdi() const TPCFastTransformGeo::SliceInfo& TPCFastTransformGeo::getSliceInfo(int32_t slice)
const
218 if (slice < 0 || slice >= NumberOfSlices) {
219 slice = NumberOfSlices;
221 return mSliceInfos[slice];
224GPUdi() const TPCFastTransformGeo::RowInfo& TPCFastTransformGeo::getRowInfo(int32_t
row)
const
227 if (row < 0 || row >= mNumberOfRows) {
228 row = MaxNumberOfRows;
230 return mRowInfos[
row];
233GPUdi()
void TPCFastTransformGeo::convLocalToGlobal(int32_t slice,
float lx,
float ly,
float lz,
float& gx,
float& gy,
float& gz)
const
236 const SliceInfo& sliceInfo = getSliceInfo(slice);
237 gx = lx * sliceInfo.cosAlpha - ly * sliceInfo.sinAlpha;
238 gy = lx * sliceInfo.sinAlpha + ly * sliceInfo.cosAlpha;
242GPUdi()
void TPCFastTransformGeo::convGlobalToLocal(int32_t slice,
float gx,
float gy,
float gz,
float& lx,
float& ly,
float& lz)
const
245 const SliceInfo& sliceInfo = getSliceInfo(slice);
246 lx = gx * sliceInfo.cosAlpha + gy * sliceInfo.sinAlpha;
247 ly = -gx * sliceInfo.sinAlpha + gy * sliceInfo.cosAlpha;
251GPUdi()
void TPCFastTransformGeo::convVtoLocal(int32_t slice,
float v,
float& lz)
const
254 if (slice < NumberOfSlicesA) {
255 lz = mTPCzLengthA -
v;
257 lz =
v - mTPCzLengthC;
259 lz += mTPCalignmentZ;
262GPUdi()
void TPCFastTransformGeo::convUVtoLocal(int32_t slice,
float u,
float v,
float& ly,
float& lz)
const
265 if (slice < NumberOfSlicesA) {
267 lz = mTPCzLengthA -
v;
270 lz =
v - mTPCzLengthC;
272 lz += mTPCalignmentZ;
275GPUdi()
void TPCFastTransformGeo::convLocalToUV(int32_t slice,
float ly,
float lz,
float& u,
float&
v)
const
278 lz = lz - mTPCalignmentZ;
279 if (slice < NumberOfSlicesA) {
281 v = mTPCzLengthA - lz;
284 v = lz + mTPCzLengthC;
288GPUdi()
void TPCFastTransformGeo::convUVtoScaledUV(int32_t slice, int32_t
row,
float u,
float v,
float& su,
float& sv)
const
291 const RowInfo& rowInfo = getRowInfo(
row);
292 su = (u - rowInfo.u0) * rowInfo.scaleUtoSU;
293 if (slice < NumberOfSlicesA) {
294 sv =
v * mScaleVtoSVsideA;
296 sv =
v * mScaleVtoSVsideC;
300GPUdi()
void TPCFastTransformGeo::convScaledUVtoUV(int32_t slice, int32_t
row,
float su,
float sv,
float& u,
float&
v)
const
303 const RowInfo& rowInfo = getRowInfo(
row);
304 u = rowInfo.u0 + su * rowInfo.scaleSUtoU;
305 if (slice < NumberOfSlicesA) {
306 v = sv * mScaleSVtoVsideA;
308 v = sv * mScaleSVtoVsideC;
312GPUdi()
void TPCFastTransformGeo::convScaledUVtoLocal(int32_t slice, int32_t
row,
float su,
float sv,
float& ly,
float& lz)
const
316 convScaledUVtoUV(slice,
row, su, sv, u,
v);
317 convUVtoLocal(slice, u,
v, ly, lz);
320GPUdi() float TPCFastTransformGeo::convPadToU(int32_t
row,
float pad)
const
323 const RowInfo& rowInfo = getRowInfo(
row);
324 return (pad - 0.5f * rowInfo.maxPad) * rowInfo.padWidth;
327GPUdi() float TPCFastTransformGeo::convUtoPad(int32_t
row,
float u)
const
330 const RowInfo& rowInfo = getRowInfo(
row);
331 return u / rowInfo.padWidth + 0.5f * rowInfo.maxPad;
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLdouble GLdouble GLdouble z
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
FIXME: do not use data model tables.