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;
113 if (timer.IsRunning()) {
114 GPUInfo(
"Display Time: Init:\t\t%6.0f us", timer.GetCurrentElapsedTime(
true) * 1e6);
117 if (mCfgH.trackFilter) {
119 mTrackFilter.resize(nTracks);
120 std::fill(mTrackFilter.begin(), mTrackFilter.end(),
true);
121 if (buildTrackFilter()) {
122 SetInfo(
"Error running track filter from %s", mConfig.filterMacros[mCfgH.trackFilter - 1].c_str());
124 uint32_t nFiltered = 0;
125 for (uint32_t
i = 0;
i < mTrackFilter.size();
i++) {
126 nFiltered += !mTrackFilter[
i];
128 if (mUpdateTrackFilter) {
129 SetInfo(
"Applied track filter %s - filtered %u / %u", mConfig.filterMacros[mCfgH.trackFilter - 1].c_str(), nFiltered, (uint32_t)mTrackFilter.size());
133 mUpdateTrackFilter =
false;
134 if (timer.IsRunning()) {
135 GPUInfo(
"Display Time: Track Filter:\t%6.0f us", timer.GetCurrentElapsedTime(
true) * 1e6);
138 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, NSECTORS, 1),
float(0.f), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
139 for (int32_t iSector =
r.begin(); iSector <
r.end(); iSector++) {
142 for (uint32_t
i = 0;
i < nCls;
i++) {
145 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");
154 GPUTPCConvertImpl::convert(*mCalib->
fastTransform, *mParam, iSector,
row, cln.getPad(), cln.getTime(),
x,
y,
z);
155 if (mCfgH.clustersOnNominalRow) {
156 x = GPUTPCGeometry::Row2X(
row);
158 mParam->Sector2Global(iSector,
x + mCfgH.xAdd,
y,
z, &
ptr->x, &
ptr->y, &
ptr->z);
160 if (fabsf(
ptr->z) > maxClusterZ) {
161 maxClusterZ = fabsf(
ptr->z);
163 ptr->z += iSector < 18 ? mCfgH.zAdd : -mCfgH.zAdd;
164 ptr->x *= GL_SCALE_FACTOR;
165 ptr->y *= GL_SCALE_FACTOR;
166 ptr->z *= GL_SCALE_FACTOR;
171 }, [](
const float a,
const float b) {
return std::max(
a,
b); }, tbb::simple_partitioner());
172 if (timer.IsRunning()) {
173 GPUInfo(
"Display Time: Load TPC:\t\t%6.0f us", timer.GetCurrentElapsedTime(
true) * 1e6);
176 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, mCurrentSpacePointsTRD, 32),
float(mMaxClusterZ), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
177 int32_t trdTriggerRecord = -1;
178 float trdZoffset = 0;
179 for (
int i =
r.begin();
i <
r.end();
i++) {
186 int32_t iSec = trdGeometry()->GetSector(mIOPtrs->
trdTracklets[
i].GetDetector());
188 mParam->Sector2Global(iSec, sp.getX() + mCfgH.xAdd, sp.getY(), sp.getZ(), &
ptr->x, &
ptr->y, &
ptr->z);
189 ptr->
z +=
ptr->z > 0 ? trdZoffset : -trdZoffset;
190 if (fabsf(
ptr->z) > maxClusterZ) {
191 maxClusterZ = fabsf(
ptr->z);
193 ptr->x *= GL_SCALE_FACTOR;
194 ptr->y *= GL_SCALE_FACTOR;
195 ptr->z *= GL_SCALE_FACTOR;
196 ptr->w = tTRDCLUSTER;
197 ptr = &mGlobalPosTRD2[
i];
198 mParam->Sector2Global(iSec, sp.getX() + mCfgH.xAdd + 4.5f, sp.getY() + 1.5f * sp.getDy(), sp.getZ(), &
ptr->x, &
ptr->y, &
ptr->z);
199 ptr->
z +=
ptr->z > 0 ? trdZoffset : -trdZoffset;
200 if (fabsf(
ptr->z) > maxClusterZ) {
201 maxClusterZ = fabsf(
ptr->z);
203 ptr->x *= GL_SCALE_FACTOR;
204 ptr->y *= GL_SCALE_FACTOR;
205 ptr->z *= GL_SCALE_FACTOR;
206 ptr->w = tTRDCLUSTER;
209 }, [](
const float a,
const float b) {
return std::max(
a,
b); }, tbb::static_partitioner());
210 if (timer.IsRunning()) {
211 GPUInfo(
"Display Time: Load TRD:\t\t%6.0f us", timer.GetCurrentElapsedTime(
true) * 1e6);
214 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, mCurrentClustersTOF, 32),
float(mMaxClusterZ), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
215 for (int32_t
i =
r.begin();
i <
r.end();
i++) {
219 if (mParam->
par.continuousTracking) {
222 ptr->z +=
ptr->z > 0 ? ZOffset : -ZOffset;
224 if (fabsf(
ptr->z) > maxClusterZ) {
225 maxClusterZ = fabsf(
ptr->z);
227 ptr->x *= GL_SCALE_FACTOR;
228 ptr->y *= GL_SCALE_FACTOR;
229 ptr->z *= GL_SCALE_FACTOR;
230 ptr->w = tTOFCLUSTER;
233 }, [](
const float a,
const float b) {
return std::max(
a,
b); });
234 if (timer.IsRunning()) {
235 GPUInfo(
"Display Time: Load TOF:\t\t%6.0f us", timer.GetCurrentElapsedTime(
true) * 1e6);
238 if (mCurrentClustersITS) {
239 float itsROFhalfLen = 0;
241 if (mParam->
par.continuousTracking) {
249 if (mParam->
par.continuousTracking) {
255 throw std::runtime_error(
"Inconsistent ITS data, number of clusters does not match ROF content");
261 auto p = cl.getXYZGlo(*itsGeo);
265 ptr->z +=
ptr->z > 0 ? ZOffset : -ZOffset;
266 if (fabsf(
ptr->z) > mMaxClusterZ) {
267 mMaxClusterZ = fabsf(
ptr->z);
269 ptr->x *= GL_SCALE_FACTOR;
270 ptr->y *= GL_SCALE_FACTOR;
271 ptr->z *= GL_SCALE_FACTOR;
272 ptr->w = tITSCLUSTER;
277 if (timer.IsRunning()) {
278 GPUInfo(
"Display Time: Load ITS:\t\t%6.0f us", timer.GetCurrentElapsedTime(
true) * 1e6);
TRD Tracklet word for GPU tracker - 32bit tracklet info + half chamber ID + index.
Definition of the GeometryTGeo class.
static const DPLAlpideParam< N > & Instance()
const GPUSettingsProcessing & GetProcessingSettings() const
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
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]