25#include "GPUParam.inc"
36#include <oneapi/tbb.h>
40void GPUDisplay::DrawGLScene_updateEventData()
47 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
51 if (mNMaxClusters < mCurrentClusters) {
52 mNMaxClusters = mCurrentClusters;
53 mGlobalPosPtr.reset(
new float4[mNMaxClusters]);
54 mGlobalPos = mGlobalPosPtr.get();
58 if (mCurrentSpacePointsTRD > mNMaxSpacePointsTRD) {
59 mNMaxSpacePointsTRD = mCurrentSpacePointsTRD;
60 mGlobalPosPtrTRD.reset(
new float4[mNMaxSpacePointsTRD]);
61 mGlobalPosPtrTRD2.reset(
new float4[mNMaxSpacePointsTRD]);
62 mGlobalPosTRD = mGlobalPosPtrTRD.get();
63 mGlobalPosTRD2 = mGlobalPosPtrTRD2.get();
67 if (mNMaxClustersITS < mCurrentClustersITS) {
68 mNMaxClustersITS = mCurrentClustersITS;
69 mGlobalPosPtrITS.reset(
new float4[mNMaxClustersITS]);
70 mGlobalPosITS = mGlobalPosPtrITS.get();
74 if (mNMaxClustersTOF < mCurrentClustersTOF) {
75 mNMaxClustersTOF = mCurrentClustersTOF;
76 mGlobalPosPtrTOF.reset(
new float4[mNMaxClustersTOF]);
77 mGlobalPosTOF = mGlobalPosPtrTOF.get();
81 if ((
size_t)nTpcMergedTracks > mTRDTrackIds.size()) {
82 mTRDTrackIds.resize(nTpcMergedTracks);
84 if (mIOPtrs->
nItsTracks > mITSStandaloneTracks.size()) {
85 mITSStandaloneTracks.resize(mIOPtrs->
nItsTracks);
87 for (uint32_t
i = 0;
i < nTpcMergedTracks;
i++) {
90 auto tmpDoTRDTracklets = [&](
auto* trdTracks) {
92 if (trdTracks[
i].getNtracklets()) {
93 mTRDTrackIds[trdTracks[
i].getRefGlobalTrackIdRaw()] =
i;
103 std::fill(mITSStandaloneTracks.begin(), mITSStandaloneTracks.end(),
true);
105 for (uint32_t
i = 0;
i < nTpcMergedTracks;
i++) {
107 mITSStandaloneTracks[mIOPtrs->
tpcLinkITS[
i]] =
false;
113 if (mCfgH.trackFilter) {
115 mTrackFilter.resize(nTracks);
116 std::fill(mTrackFilter.begin(), mTrackFilter.end(),
true);
117 if (buildTrackFilter()) {
118 SetInfo(
"Error running track filter from %s", mConfig.filterMacros[mCfgH.trackFilter - 1].c_str());
120 uint32_t nFiltered = 0;
121 for (uint32_t
i = 0;
i < mTrackFilter.size();
i++) {
122 nFiltered += !mTrackFilter[
i];
124 if (mUpdateTrackFilter) {
125 SetInfo(
"Applied track filter %s - filtered %u / %u", mConfig.filterMacros[mCfgH.trackFilter - 1].c_str(), nFiltered, (uint32_t)mTrackFilter.size());
129 mUpdateTrackFilter =
false;
131 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, NSECTORS, 1),
float(0.f), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
132 for (int32_t iSector =
r.begin(); iSector <
r.end(); iSector++) {
135 for (uint32_t
i = 0;
i < nCls;
i++) {
137 if (mParam->
par.earlyTpcTransform) {
143 while (row < GPUCA_ROW_COUNT - 1 && mIOPtrs->clustersNative->clusterOffset[iSector][
row + 1] <= (uint32_t)cid) {
147 if (cid >= mNMaxClusters) {
148 throw std::runtime_error(
"Cluster Buffer Size exceeded");
151 if (mParam->
par.earlyTpcTransform) {
153 mParam->Sector2Global(iSector, (mCfgH.clustersOnNominalRow ? mParam->
tpcGeometry.Row2X(
row) : cl.
x) + mCfgH.xAdd, cl.
y, cl.
z, &
ptr->
x, &
ptr->
y, &
ptr->
z);
157 GPUTPCConvertImpl::convert(*mCalib->
fastTransform, *mParam, iSector,
row, cln.getPad(), cln.getTime(),
x,
y,
z);
158 if (mCfgH.clustersOnNominalRow) {
161 mParam->Sector2Global(iSector,
x + mCfgH.xAdd,
y,
z, &
ptr->x, &
ptr->y, &
ptr->z);
164 if (fabsf(
ptr->z) > maxClusterZ) {
165 maxClusterZ = fabsf(
ptr->z);
167 ptr->z += iSector < 18 ? mCfgH.zAdd : -mCfgH.zAdd;
168 ptr->x *= GL_SCALE_FACTOR;
169 ptr->y *= GL_SCALE_FACTOR;
170 ptr->z *= GL_SCALE_FACTOR;
175 }, [](
const float a,
const float b) {
return std::max(
a,
b); }, tbb::simple_partitioner());
177 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, mCurrentSpacePointsTRD, 32),
float(mMaxClusterZ), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
178 int32_t trdTriggerRecord = -1;
179 float trdZoffset = 0;
180 for (
int i =
r.begin();
i <
r.end();
i++) {
187 int32_t iSec = trdGeometry()->GetSector(mIOPtrs->
trdTracklets[
i].GetDetector());
189 mParam->Sector2Global(iSec, sp.getX() + mCfgH.xAdd, sp.getY(), sp.getZ(), &
ptr->x, &
ptr->y, &
ptr->z);
190 ptr->
z +=
ptr->z > 0 ? trdZoffset : -trdZoffset;
191 if (fabsf(
ptr->z) > maxClusterZ) {
192 maxClusterZ = fabsf(
ptr->z);
194 ptr->x *= GL_SCALE_FACTOR;
195 ptr->y *= GL_SCALE_FACTOR;
196 ptr->z *= GL_SCALE_FACTOR;
197 ptr->w = tTRDCLUSTER;
198 ptr = &mGlobalPosTRD2[
i];
199 mParam->Sector2Global(iSec, sp.getX() + mCfgH.xAdd + 4.5f, sp.getY() + 1.5f * sp.getDy(), sp.getZ(), &
ptr->x, &
ptr->y, &
ptr->z);
200 ptr->
z +=
ptr->z > 0 ? trdZoffset : -trdZoffset;
201 if (fabsf(
ptr->z) > maxClusterZ) {
202 maxClusterZ = fabsf(
ptr->z);
204 ptr->x *= GL_SCALE_FACTOR;
205 ptr->y *= GL_SCALE_FACTOR;
206 ptr->z *= GL_SCALE_FACTOR;
207 ptr->w = tTRDCLUSTER;
210 }, [](
const float a,
const float b) {
return std::max(
a,
b); }, tbb::static_partitioner());
212 mMaxClusterZ = tbb::parallel_reduce(tbb::blocked_range<int32_t>(0, mCurrentClustersTOF, 32),
float(mMaxClusterZ), [&](
const tbb::blocked_range<int32_t>&
r,
float maxClusterZ) {
213 for (int32_t
i =
r.begin();
i <
r.end();
i++) {
217 if (mParam->
par.continuousTracking) {
220 ptr->z +=
ptr->z > 0 ? ZOffset : -ZOffset;
222 if (fabsf(
ptr->z) > maxClusterZ) {
223 maxClusterZ = fabsf(
ptr->z);
225 ptr->x *= GL_SCALE_FACTOR;
226 ptr->y *= GL_SCALE_FACTOR;
227 ptr->z *= GL_SCALE_FACTOR;
228 ptr->w = tTOFCLUSTER;
231 }, [](
const float a,
const float b) {
return std::max(
a,
b); });
233 if (mCurrentClustersITS) {
234 float itsROFhalfLen = 0;
236 if (mParam->
par.continuousTracking) {
244 if (mParam->
par.continuousTracking) {
250 throw std::runtime_error(
"Inconsistent ITS data, number of clusters does not match ROF content");
256 auto p = cl.getXYZGlo(*itsGeo);
260 ptr->z +=
ptr->z > 0 ? ZOffset : -ZOffset;
261 if (fabsf(
ptr->z) > mMaxClusterZ) {
262 mMaxClusterZ = fabsf(
ptr->z);
264 ptr->x *= GL_SCALE_FACTOR;
265 ptr->y *= GL_SCALE_FACTOR;
266 ptr->z *= GL_SCALE_FACTOR;
267 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
GPUTPCGeometry tpcGeometry
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]