20#include "frontend/GPUDisplayInfo.inc"
26#include "GPUParam.inc"
37#include <oneapi/tbb.h>
41void GPUDisplay::DrawGLScene_updateEventData()
48 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
52 if (mNMaxClusters < mCurrentClusters) {
53 mNMaxClusters = mCurrentClusters;
54 mGlobalPosPtr.reset(
new float4[mNMaxClusters]);
55 mGlobalPos = mGlobalPosPtr.get();
59 if (mCurrentSpacePointsTRD > mNMaxSpacePointsTRD) {
60 mNMaxSpacePointsTRD = mCurrentSpacePointsTRD;
61 mGlobalPosPtrTRD.reset(
new float4[mNMaxSpacePointsTRD]);
62 mGlobalPosPtrTRD2.reset(
new float4[mNMaxSpacePointsTRD]);
63 mGlobalPosTRD = mGlobalPosPtrTRD.get();
64 mGlobalPosTRD2 = mGlobalPosPtrTRD2.get();
68 if (mNMaxClustersITS < mCurrentClustersITS) {
69 mNMaxClustersITS = mCurrentClustersITS;
70 mGlobalPosPtrITS.reset(
new float4[mNMaxClustersITS]);
71 mGlobalPosITS = mGlobalPosPtrITS.get();
75 if (mNMaxClustersTOF < mCurrentClustersTOF) {
76 mNMaxClustersTOF = mCurrentClustersTOF;
77 mGlobalPosPtrTOF.reset(
new float4[mNMaxClustersTOF]);
78 mGlobalPosTOF = mGlobalPosPtrTOF.get();
82 if ((
size_t)nTpcMergedTracks > mTRDTrackIds.size()) {
83 mTRDTrackIds.resize(nTpcMergedTracks);
85 if (mIOPtrs->
nItsTracks > mITSStandaloneTracks.size()) {
86 mITSStandaloneTracks.resize(mIOPtrs->
nItsTracks);
88 for (uint32_t
i = 0;
i < nTpcMergedTracks;
i++) {
91 auto tmpDoTRDTracklets = [&](
auto* trdTracks) {
93 if (trdTracks[
i].getNtracklets()) {
94 mTRDTrackIds[trdTracks[
i].getRefGlobalTrackIdRaw()] =
i;
104 std::fill(mITSStandaloneTracks.begin(), mITSStandaloneTracks.end(),
true);
106 for (uint32_t
i = 0;
i < nTpcMergedTracks;
i++) {
108 mITSStandaloneTracks[mIOPtrs->
tpcLinkITS[
i]] =
false;
114 if (mCfgH.trackFilter) {
116 mTrackFilter.resize(nTracks);
117 std::fill(mTrackFilter.begin(), mTrackFilter.end(),
true);
118 if (buildTrackFilter()) {
119 SetInfo(
"Error running track filter from %s", mConfig.filterMacros[mCfgH.trackFilter - 1].c_str());
121 uint32_t nFiltered = 0;
122 for (uint32_t
i = 0;
i < mTrackFilter.size();
i++) {
123 nFiltered += !mTrackFilter[
i];
125 if (mUpdateTrackFilter) {
126 SetInfo(
"Applied track filter %s - filtered %u / %u", mConfig.filterMacros[mCfgH.trackFilter - 1].c_str(), nFiltered, (uint32_t)mTrackFilter.size());
130 mUpdateTrackFilter =
false;
132 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, NSECTORS, 1),
float(0.f), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
133 for (int32_t iSector =
r.begin(); iSector <
r.end(); iSector++) {
136 for (uint32_t
i = 0;
i < nCls;
i++) {
138 if (mParam->
par.earlyTpcTransform) {
144 while (row < GPUCA_ROW_COUNT - 1 && mIOPtrs->clustersNative->clusterOffset[iSector][
row + 1] <= (uint32_t)cid) {
148 if (cid >= mNMaxClusters) {
149 throw std::runtime_error(
"Cluster Buffer Size exceeded");
152 if (mParam->
par.earlyTpcTransform) {
154 mParam->Sector2Global(iSector, (mCfgH.clustersOnNominalRow ? GPUTPCGeometry::Row2X(
row) : cl.
x) + mCfgH.xAdd, cl.
y, cl.
z, &
ptr->
x, &
ptr->
y, &
ptr->
z);
158 GPUTPCConvertImpl::convert(*mCalib->
fastTransform, *mParam, iSector,
row, cln.getPad(), cln.getTime(),
x,
y,
z);
159 if (mCfgH.clustersOnNominalRow) {
160 x = GPUTPCGeometry::Row2X(
row);
162 mParam->Sector2Global(iSector,
x + mCfgH.xAdd,
y,
z, &
ptr->x, &
ptr->y, &
ptr->z);
165 if (fabsf(
ptr->z) > maxClusterZ) {
166 maxClusterZ = fabsf(
ptr->z);
168 ptr->z += iSector < 18 ? mCfgH.zAdd : -mCfgH.zAdd;
169 ptr->x *= GL_SCALE_FACTOR;
170 ptr->y *= GL_SCALE_FACTOR;
171 ptr->z *= GL_SCALE_FACTOR;
176 }, [](
const float a,
const float b) {
return std::max(
a,
b); }, tbb::simple_partitioner());
178 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, mCurrentSpacePointsTRD, 32),
float(mMaxClusterZ), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
179 int32_t trdTriggerRecord = -1;
180 float trdZoffset = 0;
181 for (
int i =
r.begin();
i <
r.end();
i++) {
188 int32_t iSec = trdGeometry()->GetSector(mIOPtrs->
trdTracklets[
i].GetDetector());
190 mParam->Sector2Global(iSec, sp.getX() + mCfgH.xAdd, sp.getY(), sp.getZ(), &
ptr->x, &
ptr->y, &
ptr->z);
191 ptr->
z +=
ptr->z > 0 ? trdZoffset : -trdZoffset;
192 if (fabsf(
ptr->z) > maxClusterZ) {
193 maxClusterZ = fabsf(
ptr->z);
195 ptr->x *= GL_SCALE_FACTOR;
196 ptr->y *= GL_SCALE_FACTOR;
197 ptr->z *= GL_SCALE_FACTOR;
198 ptr->w = tTRDCLUSTER;
199 ptr = &mGlobalPosTRD2[
i];
200 mParam->Sector2Global(iSec, sp.getX() + mCfgH.xAdd + 4.5f, sp.getY() + 1.5f * sp.getDy(), sp.getZ(), &
ptr->x, &
ptr->y, &
ptr->z);
201 ptr->
z +=
ptr->z > 0 ? trdZoffset : -trdZoffset;
202 if (fabsf(
ptr->z) > maxClusterZ) {
203 maxClusterZ = fabsf(
ptr->z);
205 ptr->x *= GL_SCALE_FACTOR;
206 ptr->y *= GL_SCALE_FACTOR;
207 ptr->z *= GL_SCALE_FACTOR;
208 ptr->w = tTRDCLUSTER;
211 }, [](
const float a,
const float b) {
return std::max(
a,
b); }, tbb::static_partitioner());
213 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, mCurrentClustersTOF, 32),
float(mMaxClusterZ), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
214 for (int32_t
i =
r.begin();
i <
r.end();
i++) {
218 if (mParam->
par.continuousTracking) {
221 ptr->z +=
ptr->z > 0 ? ZOffset : -ZOffset;
223 if (fabsf(
ptr->z) > maxClusterZ) {
224 maxClusterZ = fabsf(
ptr->z);
226 ptr->x *= GL_SCALE_FACTOR;
227 ptr->y *= GL_SCALE_FACTOR;
228 ptr->z *= GL_SCALE_FACTOR;
229 ptr->w = tTOFCLUSTER;
232 }, [](
const float a,
const float b) {
return std::max(
a,
b); });
234 if (mCurrentClustersITS) {
235 float itsROFhalfLen = 0;
237 if (mParam->
par.continuousTracking) {
245 if (mParam->
par.continuousTracking) {
251 throw std::runtime_error(
"Inconsistent ITS data, number of clusters does not match ROF content");
257 auto p = cl.getXYZGlo(*itsGeo);
261 ptr->z +=
ptr->z > 0 ? ZOffset : -ZOffset;
262 if (fabsf(
ptr->z) > mMaxClusterZ) {
263 mMaxClusterZ = fabsf(
ptr->z);
265 ptr->x *= GL_SCALE_FACTOR;
266 ptr->y *= GL_SCALE_FACTOR;
267 ptr->z *= GL_SCALE_FACTOR;
268 ptr->w = tITSCLUSTER;
TRD Tracklet word for GPU tracker - 32bit tracklet info + half chamber ID + index.
Definition of the GeometryTGeo class.
static const DPLAlpideParam< N > & Instance()
static GeometryTGeo * Instance()
const BCData & getBCData() const
int getFirstEntry() const
std::int8_t getSector() const
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
GLdouble GLdouble GLdouble z
constexpr double LHCBunchSpacingNS
constexpr int LHCBCPERTIMEBIN
int64_t differenceInBC(const InteractionRecord &other) const
S< TPCFastTransform >::type * fastTransform
S< CorrectionMapsHelper >::type * fastTransformHelper
const int32_t * trdTrackletIdxFirst
const o2::tpc::ClusterNativeAccess * clustersNative
uint32_t nClusterData[NSECTORS]
const GPUTRDSpacePoint * trdSpacePoints
const o2::tof::Cluster * tofClusters
const o2::BaseCluster< float > * itsClusters
const o2::itsmft::ROFRecord * itsClusterROF
const GPUTRDTrackGPU * trdTracks
const GPUSettingsTF * settingsTF
const GPUTRDTrackletWord * trdTracklets
const GPUTRDTrack * trdTracksO2
const GPUTPCClusterData * clusterData[NSECTORS]
uint32_t nOutputTracksTPCO2
const float * trdTriggerTimes
uint32_t nTRDTriggerRecords
int32_t continuousMaxTimeBin
unsigned int nClustersSector[constants::MAXSECTOR]
unsigned int nClustersTotal
const ClusterNative * clusters[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
unsigned int clusterOffset[constants::MAXSECTOR][constants::MAXGLOBALPADROW]