Project
Loading...
Searching...
No Matches
GPUDisplayImportEvent.cxx
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
14
15#ifndef GPUCA_NO_ROOT
16#include "Rtypes.h" // Include ROOT header first, to use ROOT and disable replacements
17#endif
18
19#include "GPUDisplay.h"
20#include "GPUO2DataTypes.h"
21#include "GPUTPCClusterData.h"
22#include "GPUTPCConvertImpl.h"
23#include "GPUTRDGeometry.h"
24#include "GPUTRDTrackletWord.h"
25#include "GPUParam.inc"
26
30#include "TOFBase/Geo.h"
32#ifdef GPUCA_O2_LIB
34#endif
35
36#include <oneapi/tbb.h>
37
38using namespace o2::gpu;
39
40void GPUDisplay::DrawGLScene_updateEventData()
41{
42 mTimerDraw.ResetStart();
43 if (mIOPtrs->clustersNative) {
44 mCurrentClusters = mIOPtrs->clustersNative->nClustersTotal;
45 } else {
46 mCurrentClusters = 0;
47 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
48 mCurrentClusters += mIOPtrs->nClusterData[iSector];
49 }
50 }
51 if (mNMaxClusters < mCurrentClusters) {
52 mNMaxClusters = mCurrentClusters;
53 mGlobalPosPtr.reset(new float4[mNMaxClusters]);
54 mGlobalPos = mGlobalPosPtr.get();
55 }
56
57 mCurrentSpacePointsTRD = mIOPtrs->nTRDTracklets;
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();
64 }
65
66 mCurrentClustersITS = mIOPtrs->itsClusters ? mIOPtrs->nItsClusters : 0;
67 if (mNMaxClustersITS < mCurrentClustersITS) {
68 mNMaxClustersITS = mCurrentClustersITS;
69 mGlobalPosPtrITS.reset(new float4[mNMaxClustersITS]);
70 mGlobalPosITS = mGlobalPosPtrITS.get();
71 }
72
73 mCurrentClustersTOF = mIOPtrs->nTOFClusters;
74 if (mNMaxClustersTOF < mCurrentClustersTOF) {
75 mNMaxClustersTOF = mCurrentClustersTOF;
76 mGlobalPosPtrTOF.reset(new float4[mNMaxClustersTOF]);
77 mGlobalPosTOF = mGlobalPosPtrTOF.get();
78 }
79
80 uint32_t nTpcMergedTracks = mConfig.showTPCTracksFromO2Format ? mIOPtrs->nOutputTracksTPCO2 : mIOPtrs->nMergedTracks;
81 if ((size_t)nTpcMergedTracks > mTRDTrackIds.size()) {
82 mTRDTrackIds.resize(nTpcMergedTracks);
83 }
84 if (mIOPtrs->nItsTracks > mITSStandaloneTracks.size()) {
85 mITSStandaloneTracks.resize(mIOPtrs->nItsTracks);
86 }
87 for (uint32_t i = 0; i < nTpcMergedTracks; i++) {
88 mTRDTrackIds[i] = -1;
89 }
90 auto tmpDoTRDTracklets = [&](auto* trdTracks) {
91 for (uint32_t i = 0; i < mIOPtrs->nTRDTracks; i++) {
92 if (trdTracks[i].getNtracklets()) {
93 mTRDTrackIds[trdTracks[i].getRefGlobalTrackIdRaw()] = i;
94 }
95 }
96 };
97 if (mIOPtrs->trdTracksO2) {
98 tmpDoTRDTracklets(mIOPtrs->trdTracksO2);
99 } else {
100 tmpDoTRDTracklets(mIOPtrs->trdTracks);
101 }
102 if (mIOPtrs->nItsTracks) {
103 std::fill(mITSStandaloneTracks.begin(), mITSStandaloneTracks.end(), true);
104 if (mIOPtrs->tpcLinkITS) {
105 for (uint32_t i = 0; i < nTpcMergedTracks; i++) {
106 if (mIOPtrs->tpcLinkITS[i] != -1) {
107 mITSStandaloneTracks[mIOPtrs->tpcLinkITS[i]] = false;
108 }
109 }
110 }
111 }
112
113 if (mCfgH.trackFilter) {
114 uint32_t nTracks = mConfig.showTPCTracksFromO2Format ? mIOPtrs->nOutputTracksTPCO2 : mIOPtrs->nMergedTracks;
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());
119 } else {
120 uint32_t nFiltered = 0;
121 for (uint32_t i = 0; i < mTrackFilter.size(); i++) {
122 nFiltered += !mTrackFilter[i];
123 }
124 if (mUpdateTrackFilter) {
125 SetInfo("Applied track filter %s - filtered %u / %u", mConfig.filterMacros[mCfgH.trackFilter - 1].c_str(), nFiltered, (uint32_t)mTrackFilter.size());
126 }
127 }
128 }
129 mUpdateTrackFilter = false;
130
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++) {
133 int32_t row = 0;
134 uint32_t nCls = mParam->par.earlyTpcTransform ? mIOPtrs->nClusterData[iSector] : (mIOPtrs->clustersNative ? mIOPtrs->clustersNative->nClustersSector[iSector] : 0);
135 for (uint32_t i = 0; i < nCls; i++) {
136 int32_t cid;
137 if (mParam->par.earlyTpcTransform) {
138 const auto& cl = mIOPtrs->clusterData[iSector][i];
139 cid = cl.id;
140 row = cl.row;
141 } else {
142 cid = mIOPtrs->clustersNative->clusterOffset[iSector][0] + i;
143 while (row < GPUCA_ROW_COUNT - 1 && mIOPtrs->clustersNative->clusterOffset[iSector][row + 1] <= (uint32_t)cid) {
144 row++;
145 }
146 }
147 if (cid >= mNMaxClusters) {
148 throw std::runtime_error("Cluster Buffer Size exceeded");
149 }
150 float4* ptr = &mGlobalPos[cid];
151 if (mParam->par.earlyTpcTransform) {
152 const auto& cl = mIOPtrs->clusterData[iSector][i];
153 mParam->Sector2Global(iSector, (mCfgH.clustersOnNominalRow ? mParam->tpcGeometry.Row2X(row) : cl.x) + mCfgH.xAdd, cl.y, cl.z, &ptr->x, &ptr->y, &ptr->z);
154 } else {
155 float x, y, z;
156 const auto& cln = mIOPtrs->clustersNative->clusters[iSector][0][i];
157 GPUTPCConvertImpl::convert(*mCalib->fastTransform, *mParam, iSector, row, cln.getPad(), cln.getTime(), x, y, z);
158 if (mCfgH.clustersOnNominalRow) {
159 x = mParam->tpcGeometry.Row2X(row);
160 }
161 mParam->Sector2Global(iSector, x + mCfgH.xAdd, y, z, &ptr->x, &ptr->y, &ptr->z);
162 }
163
164 if (fabsf(ptr->z) > maxClusterZ) {
165 maxClusterZ = fabsf(ptr->z);
166 }
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;
171 ptr->w = tCLUSTER;
172 }
173 }
174 return maxClusterZ; // clang-format off
175 }, [](const float a, const float b) { return std::max(a, b); }, tbb::simple_partitioner()); // clang-format on
176
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++) {
181 while (mParam->par.continuousTracking && trdTriggerRecord < (int32_t)mIOPtrs->nTRDTriggerRecords - 1 && mIOPtrs->trdTrackletIdxFirst[trdTriggerRecord + 1] <= i) {
182 trdTriggerRecord++; // This requires to go through the data in order I believe
183 float trdTime = mIOPtrs->trdTriggerTimes[trdTriggerRecord] * 1e3 / o2::constants::lhc::LHCBunchSpacingNS / o2::tpc::constants::LHCBCPERTIMEBIN;
184 trdZoffset = fabsf(mCalib->fastTransformHelper->getCorrMap()->convVertexTimeToZOffset(0, trdTime, mParam->continuousMaxTimeBin));
185 }
186 const auto& sp = mIOPtrs->trdSpacePoints[i];
187 int32_t iSec = trdGeometry()->GetSector(mIOPtrs->trdTracklets[i].GetDetector());
188 float4* ptr = &mGlobalPosTRD[i];
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);
193 }
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);
203 }
204 ptr->x *= GL_SCALE_FACTOR;
205 ptr->y *= GL_SCALE_FACTOR;
206 ptr->z *= GL_SCALE_FACTOR;
207 ptr->w = tTRDCLUSTER;
208 }
209 return maxClusterZ; // clang-format off
210 }, [](const float a, const float b) { return std::max(a, b); }, tbb::static_partitioner()); // clang-format on
211
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++) {
214 float4* ptr = &mGlobalPosTOF[i];
215 mParam->Sector2Global(mIOPtrs->tofClusters[i].getSector(), mIOPtrs->tofClusters[i].getX() + mCfgH.xAdd, mIOPtrs->tofClusters[i].getY(), mIOPtrs->tofClusters[i].getZ(), &ptr->x, &ptr->y, &ptr->z);
216 float ZOffset = 0;
217 if (mParam->par.continuousTracking) {
219 ZOffset = fabsf(mCalib->fastTransformHelper->getCorrMap()->convVertexTimeToZOffset(0, tofTime, mParam->continuousMaxTimeBin));
220 ptr->z += ptr->z > 0 ? ZOffset : -ZOffset;
221 }
222 if (fabsf(ptr->z) > maxClusterZ) {
223 maxClusterZ = fabsf(ptr->z);
224 }
225 ptr->x *= GL_SCALE_FACTOR;
226 ptr->y *= GL_SCALE_FACTOR;
227 ptr->z *= GL_SCALE_FACTOR;
228 ptr->w = tTOFCLUSTER;
229 }
230 return maxClusterZ; // clang-format off
231 }, [](const float a, const float b) { return std::max(a, b); }); // clang-format on
232
233 if (mCurrentClustersITS) {
234 float itsROFhalfLen = 0;
235#ifdef GPUCA_O2_LIB // Not available in standalone benchmark
236 if (mParam->par.continuousTracking) {
238 itsROFhalfLen = alpParams.roFrameLengthInBC / (float)o2::tpc::constants::LHCBCPERTIMEBIN / 2;
239 }
240#endif
241 int32_t i = 0;
242 for (uint32_t j = 0; j < mIOPtrs->nItsClusterROF; j++) {
243 float ZOffset = 0;
244 if (mParam->par.continuousTracking) {
246 float itsROFtime = mIOPtrs->itsClusterROF[j].getBCData().differenceInBC(startIR) / (float)o2::tpc::constants::LHCBCPERTIMEBIN;
247 ZOffset = fabsf(mCalib->fastTransformHelper->getCorrMap()->convVertexTimeToZOffset(0, itsROFtime + itsROFhalfLen, mParam->continuousMaxTimeBin));
248 }
249 if (i != mIOPtrs->itsClusterROF[j].getFirstEntry()) {
250 throw std::runtime_error("Inconsistent ITS data, number of clusters does not match ROF content");
251 }
252 for (int32_t k = 0; k < mIOPtrs->itsClusterROF[j].getNEntries(); k++) {
253 float4* ptr = &mGlobalPosITS[i];
254 const auto& cl = mIOPtrs->itsClusters[i];
255 auto* itsGeo = o2::its::GeometryTGeo::Instance();
256 auto p = cl.getXYZGlo(*itsGeo);
257 ptr->x = p.X();
258 ptr->y = p.Y();
259 ptr->z = p.Z();
260 ptr->z += ptr->z > 0 ? ZOffset : -ZOffset;
261 if (fabsf(ptr->z) > mMaxClusterZ) {
262 mMaxClusterZ = fabsf(ptr->z);
263 }
264 ptr->x *= GL_SCALE_FACTOR;
265 ptr->y *= GL_SCALE_FACTOR;
266 ptr->z *= GL_SCALE_FACTOR;
267 ptr->w = tITSCLUSTER;
268 i++;
269 }
270 }
271 }
272}
Definition of the TOF cluster.
int32_t i
TRD Tracklet word for GPU tracker - 32bit tracklet info + half chamber ID + index.
Definition of the GeometryTGeo class.
Definition of the ITSMFT ROFrame (trigger) record.
uint32_t j
Definition RawData.h:0
TBranch * ptr
void ResetStart()
Definition timer.cxx:63
T getX() const
Definition BaseCluster.h:62
T getY() const
Definition BaseCluster.h:63
T getZ() const
Definition BaseCluster.h:64
static GeometryTGeo * Instance()
int getNEntries() const
Definition ROFRecord.h:62
const BCData & getBCData() const
Definition ROFRecord.h:58
int getFirstEntry() const
Definition ROFRecord.h:63
std::int8_t getSector() const
Definition Cluster.h:60
double getTime() const
Definition Cluster.h:68
GLint GLenum GLint x
Definition glcorearb.h:403
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
GLint y
Definition glcorearb.h:270
GLboolean r
Definition glcorearb.h:1233
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
constexpr double LHCBunchSpacingNS
constexpr int LHCBCPERTIMEBIN
Definition Constants.h:38
int64_t differenceInBC(const InteractionRecord &other) const
S< TPCFastTransform >::type * fastTransform
S< CorrectionMapsHelper >::type * fastTransformHelper
int32_t float z
Definition GPUParam.h:100
const o2::tpc::ClusterNativeAccess * clustersNative
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 GPUTPCClusterData * clusterData[NSECTORS]
GPUTPCGeometry tpcGeometry
Definition GPUParam.h:62
unsigned int nClustersSector[constants::MAXSECTOR]
const ClusterNative * clusters[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
unsigned int clusterOffset[constants::MAXSECTOR][constants::MAXGLOBALPADROW]
std::vector< int > row