31#include "GPUParam.inc"
42using namespace gputpcgmmergertypes;
46 std::streamsize ss = out.precision();
47 out << std::setprecision(2);
48 out <<
"\nTPC Merger Sector Tracks\n";
50 out <<
"Sector Track Info Index " << (mSectorTrackInfoIndex[
iSector + 1] - mSectorTrackInfoIndex[
iSector]) <<
" / " << (mSectorTrackInfoIndex[
NSECTORS +
iSector + 1] - mSectorTrackInfoIndex[
NSECTORS +
iSector]) <<
"\n";
51 for (int32_t iGlobal = 0; iGlobal < 2; iGlobal++) {
52 out <<
" Track type " << iGlobal <<
"\n";
54 const auto& trk = mSectorTrackInfos[
j];
55 out <<
" Track " <<
j <<
": LocalId " << (iGlobal ? (trk.LocalTrackId() >> 24) : -1) <<
"/" << (iGlobal ? (trk.LocalTrackId() & 0xFFFFFF) : -1) <<
" X " << trk.X() <<
" offsetz " << trk.TZOffset() <<
" A " << trk.Alpha() <<
" Y " << trk.Y() <<
" Z " << trk.Z() <<
" SinPhi " << trk.SinPhi() <<
" CosPhi " << trk.CosPhi() <<
" SecPhi " << trk.SecPhi() <<
" Tgl " << trk.DzDs() <<
" QPt " << trk.QPt() <<
"\n";
59 out << std::setprecision(ss);
65 for (int32_t
i = 0;
i <
n;
i++) {
73 out <<
"\nBorder Tracks : i " <<
i <<
" withinSector " <<
withinSector <<
" mergeMode " <<
mergeMode <<
"\n";
74 for (int32_t k = 0; k < n1; k++) {
75 out <<
" " << k <<
": t " <<
b1[k].TrackID() <<
" ncl " <<
b1[k].NClusters() <<
" row " << (
mergeMode > 0 ?
b1[k].Row() : -1) <<
" par " <<
b1[k].Par()[0] <<
" " <<
b1[k].Par()[1] <<
" " <<
b1[k].Par()[2] <<
" " <<
b1[k].Par()[3] <<
" " <<
b1[k].Par()[4]
76 <<
" offset " <<
b1[k].ZOffsetLinear() <<
" cov " <<
b1[k].Cov()[0] <<
" " <<
b1[k].Cov()[1] <<
" " <<
b1[k].Cov()[2] <<
" " <<
b1[k].Cov()[3] <<
" " <<
b1[k].Cov()[4] <<
" covd " <<
b1[k].CovD()[0] <<
" " <<
b1[k].CovD()[1] <<
"\n";
79 for (int32_t k = 0; k <
n2; k++) {
80 out <<
" " << k <<
": t " <<
b2[k].TrackID() <<
" ncl " <<
b2[k].NClusters() <<
" row " << (
mergeMode > 0 ?
b2[k].Row() : -1) <<
" par " <<
b2[k].Par()[0] <<
" " <<
b2[k].Par()[1] <<
" " <<
b2[k].Par()[2] <<
" " <<
b2[k].Par()[3] <<
" " <<
b2[k].Par()[4]
81 <<
" offset " <<
b2[k].ZOffsetLinear() <<
" cov " <<
b2[k].Cov()[0] <<
" " <<
b2[k].Cov()[1] <<
" " <<
b2[k].Cov()[2] <<
" " <<
b2[k].Cov()[3] <<
" " <<
b2[k].Cov()[4] <<
" covd " <<
b2[k].CovD()[0] <<
" " <<
b2[k].CovD()[1] <<
"\n";
84 out <<
"\nBorder Range : i " <<
i <<
" withinSector " <<
withinSector <<
" mergeMode " <<
mergeMode <<
"\n";
85 for (int32_t k = 0; k < n1; k++) {
86 out <<
" " << k <<
": " << range1[k].
fId <<
" " << range1[k].
fMin <<
" " << range1[k].
fMax <<
"\n";
88 for (int32_t k = 0; k <
n2; k++) {
89 out <<
" " << k <<
": " << range2[k].
fId <<
" " << range2[k].
fMin <<
" " << range2[k].
fMax <<
"\n";
96 out <<
"\nTPC Merger Links " <<
type <<
"\n";
97 const int32_t
n =
output ? mMemory->nOutputTracks : SectorTrackInfoLocalTotal();
98 for (int32_t
i = 0;
i <
n;
i++) {
99 if (mTrackLinks[
i] != -1) {
100 out <<
" " <<
i <<
": " << mTrackLinks[
i] <<
"\n";
108 out <<
"\nTPC Merger Merge Within Sectors\n";
110 for (int32_t
j = mSectorTrackInfoIndex[
iSector];
j < mSectorTrackInfoIndex[
iSector + 1];
j++) {
111 const auto& trk = mSectorTrackInfos[
j];
112 if (trk.NextSegmentNeighbour() >= 0 || trk.PrevSegmentNeighbour() >= 0) {
113 out <<
" Track " <<
j <<
": Neighbour " << trk.PrevSegmentNeighbour() <<
" / " << trk.NextSegmentNeighbour() <<
"\n";
122 out <<
"\nTPC Merger Merge Between Sectors\n";
124 for (int32_t
j = mSectorTrackInfoIndex[
iSector];
j < mSectorTrackInfoIndex[
iSector + 1];
j++) {
125 const auto& trk = mSectorTrackInfos[
j];
126 if (trk.NextNeighbour() >= 0 || trk.PrevNeighbour() >= 0) {
127 out <<
" Track " <<
j <<
": Neighbour " << trk.PrevNeighbour() <<
" / " << trk.NextNeighbour() <<
"\n";
129 if (trk.PrevNeighbour() == -1 && trk.PrevSegmentNeighbour() == -1) {
130 PrintMergeGraph(&trk, out);
138 std::streamsize ss = out.precision();
139 out << std::setprecision(2);
140 out <<
"\nTPC Merger Collected Tracks\n";
141 for (uint32_t
i = 0;
i < mMemory->nOutputTracks;
i++) {
142 const auto& trk = mOutputTracks[
i];
143 const auto& p = trk.GetParam();
144 out <<
" Track " <<
i <<
": Loop " << trk.Looper() <<
" Alpha " << trk.GetAlpha() <<
" X " << p.GetX() <<
" offset " << p.GetTZOffset() <<
" Y " << p.GetY() <<
" Z " << p.GetZ() <<
" SPhi " << p.GetSinPhi() <<
" Tgl " << p.GetDzDs() <<
" QPt " << p.GetQPt() <<
" NCl " << trk.NClusters() <<
"\n";
146 out << std::setprecision(ss);
152 out <<
"\nTPC Merger Merge CE\n";
153 for (uint32_t
i = 0;
i < mMemory->nOutputTracks;
i++) {
154 const auto& trk = mOutputTracks[
i];
156 out <<
" Track " <<
i <<
": CCE\n";
163 out <<
"\nTPC Merger Refit Prepare\n";
165 for (uint32_t
i = 0;
i < mMemory->nOutputTracks;
i++) {
166 out <<
" " <<
i <<
": " << mTrackOrderAttach[
i] <<
"\n";
168 out <<
" Clusters\n";
169 for (uint32_t
j = 0;
j < mMemory->nOutputTracks;
j++) {
170 const auto& trk = mOutputTracks[
j];
171 out <<
" Track " <<
j <<
": ";
172 for (uint32_t
i = trk.FirstClusterRef();
i < trk.FirstClusterRef() + trk.NClusters();
i++) {
173 out <<
j <<
"/" << (
i - trk.FirstClusterRef()) <<
": " << mClusters[
i].
num <<
"/" << (int32_t)mClusters[
i].
state <<
", ";
177 uint32_t maxId = mNMaxClusters;
179 for (uint32_t
i = 0;
i < maxId;
i++) {
182 out <<
" Cluster attachment ";
195 std::streamsize ss = out.precision();
196 out << std::setprecision(2);
197 out <<
"\nTPC Merger Refit\n";
198 for (uint32_t
i = 0;
i < mMemory->nOutputTracks;
i++) {
199 const auto& trk = mOutputTracks[
i];
200 if (trk.NClusters() == 0) {
203 const auto& p = trk.GetParam();
204 const auto&
po = trk.OuterParam();
205 out <<
" Track " <<
i <<
": OK " << trk.OK() <<
" Alpha " << trk.GetAlpha() <<
" X " << p.GetX() <<
" offset " << p.GetTZOffset() <<
" Y " << p.GetY() <<
" Z " << p.GetZ() <<
" SPhi " << p.GetSinPhi() <<
" Tgl " << p.GetDzDs() <<
" QPt " << p.GetQPt() <<
" NCl " << trk.NClusters() <<
" / " << trk.NClustersFitted() <<
" Cov " << p.GetErr2Y() <<
"/" << p.GetErr2Z()
206 <<
" dEdx " << (trk.OK() ? mOutputTracksdEdx[
i].
dEdxTotTPC : -1.f) <<
"/" << (trk.OK() ? mOutputTracksdEdx[
i].
dEdxMaxTPC : -1.f)
207 <<
" Outer " <<
po.P[0] <<
"/" <<
po.P[1] <<
"/" <<
po.P[2] <<
"/" <<
po.P[3] <<
"/" <<
po.P[4] <<
"\n";
209 out << std::setprecision(ss);
214 out <<
"\nTPC Merger Finalized\n";
215 for (uint32_t
j = 0;
j < mMemory->nOutputTracks;
j++) {
216 const auto& trk = mOutputTracks[
j];
217 if (trk.NClusters() == 0) {
220 out <<
" Track " <<
j <<
": ";
221 for (uint32_t
i = trk.FirstClusterRef();
i < trk.FirstClusterRef() + trk.NClusters();
i++) {
222 if (mClusters[
i].
state != 0) {
223 out <<
j <<
"/" << (
i - trk.FirstClusterRef()) <<
": " << mClusters[
i].
num <<
"/" << (int32_t)mClusters[
i].
state <<
", ";
228 uint32_t maxId = mNMaxClusters;
230 for (uint32_t
i = 0;
i < maxId;
i++) {
233 out <<
" Cluster attachment ";
244template <
int32_t mergeType>
248 std::vector<int32_t> hits1(152), hits2(152);
249 for (int32_t
i = 0;
i < 152;
i++) {
250 hits1[
i] = hits2[
i] = -1;
252 const GPUTPCTracker& tracker1 = GetConstantMem()->tpcTrackers[sector1];
254 const GPUTPCTrack& inTrack1 = *sectorTrack1.OrigTrack();
255 for (int32_t
i = 0;
i < inTrack1.NHits();
i++) {
256 const GPUTPCHitId& ic1 = tracker1.TrackHits()[inTrack1.FirstHitID() +
i];
257 int32_t clusterIndex = tracker1.Data().ClusterDataIndex(tracker1.Data().Row(ic1.RowIndex()), ic1.HitIndex());
258 hits1[ic1.RowIndex()] = clusterIndex;
260 const GPUTPCTracker& tracker2 = GetConstantMem()->tpcTrackers[sector2];
262 const GPUTPCTrack& inTrack2 = *sectorTrack2.OrigTrack();
263 for (int32_t
i = 0;
i < inTrack2.NHits();
i++) {
264 const GPUTPCHitId& ic2 = tracker2.TrackHits()[inTrack2.FirstHitID() +
i];
265 int32_t clusterIndex = tracker2.Data().ClusterDataIndex(tracker2.Data().Row(ic2.RowIndex()), ic2.HitIndex());
266 hits2[ic2.RowIndex()] = clusterIndex;
269 std::string debugname = std::string(
"debug_") +
name;
270 std::string treename = std::string(
"tree_") +
name;
271 o2::utils::DebugStreamer::instance()->getStreamer(debugname.c_str(),
"UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName(treename.c_str()).data() <<
"sector1=" << sector1 <<
"sector2=" << sector2 <<
"b1=" <<
b1 <<
"b2=" <<
b2 <<
"clusters1=" << hits1 <<
"clusters2=" << hits2 <<
"sectorTrack1=" << sectorTrack1 <<
"sectorTrack2=" << sectorTrack2 <<
"mergeMode=" <<
mergeMode <<
"weight=" <<
weight <<
"fraction=" << frac <<
"\n";
288 for (int32_t
i = 0;
i <
N;
i++) {
289 if (tracks[
i].TrackID() == trackId) {
293 throw std::runtime_error(
"didn't find border track");
300 ((
GPUConstantMem*)GetConstantMem())->ioPtrs.mergedTrackHitStates = ClusterStateExt();
303 int32_t retval = refit.RefitTrackAsGPU(trk,
false,
true);
306 prop.SetMaterialTPC();
307 prop.SetPolynomialField(&
Param().polynomialField);
309 prop.SetPropagateBzOnly(
false);
310 prop.SetMatLUT(
Param().rec.useMatLUT ? GetConstantMem()->calibObjects.matLUT :
nullptr);
311 prop.SetTrack(&trk.Param(), trk.GetAlpha());
312 int32_t err = prop.PropagateToXAlpha(track.GetParam().GetX(), track.GetAlpha(),
false);
314 printf(
"REFIT RESULT %d, SnpDiff %f\n", retval, trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi());
315 if (retval > 20 && fabsf(trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi()) > 0.01f) {
316 printf(
"LARGE DIFF\n");
319 printf(
"PROPAGATE ERROR\n");
322 printf(
"REFIT ERROR\n");
328 static int32_t
size = getenv(
"O2_DEBUG_STREAMER_OCCUPANCY_NBINS") ? atoi(getenv(
"O2_DEBUG_STREAMER_OCCUPANCY_NBINS")) :
Param().rec.tpc.occupancyMapTimeBinsAverage;
331 const int32_t bin = CAMath::Max(0.f,
time /
Param().
rec.tpc.occupancyMapTimeBins);
332 for (int32_t
i = 0;
i < 1 + 2 *
size;
i++) {
333 const int32_t mybin = bin +
i -
size;
334 retVal[
i] = (mybin >= 0 && mybin < (int32_t)GPUTPCClusterOccupancyMapBin::getNBins(
Param())) ?
Param().occupancyMap[mybin] : 0;
342 std::vector<float>
retVal(2);
344 GetConstantMem()->calibObjects.fastTransformHelper->InverseTransformYZtoNominalYZ(
iSector, iRow, track.GetY(), track.GetZ(),
retVal[0],
retVal[1]);
349void GPUTPCGMMerger::DebugStreamerUpdate(int32_t iTrk, int32_t ihit,
float xx,
float yy,
float zz,
const GPUTPCGMMergedTrackHit& cluster,
const o2::tpc::ClusterNative& clusterNative,
const GPUTPCGMTrackParam& track,
const GPUTPCGMPropagator& prop,
const gputpcgmmergertypes::InterpolationErrorHit& interpolation, int8_t rejectChi2,
bool refit, int32_t
retVal,
float avgInvCharge,
float posY,
float posZ, int16_t clusterState, int32_t retValReject,
float err2Y,
float err2Z)
const
352 float time = clusterNative.getTime();
355 float invCharge = 1.f / clusterNative.
qMax;
356 int32_t iRow = cluster.
row;
357 float unscaledMult = (
time >= 0.f ?
Param().GetUnscaledMult(
time) /
Param().tpcGeometry.Row2X(iRow) : 0.f);
358 const float clAlpha =
Param().Alpha(cluster.
sector);
359 uint32_t occupancyTotal =
Param().occupancyTotal;
360 o2::utils::DebugStreamer::instance()->getStreamer(
"debug_update_track",
"UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName(
"tree_update_track").data()
366 <<
"cluster=" << cluster
367 <<
"clusterNative=" << clusterNative
369 <<
"rejectChi2=" << rejectChi2
370 <<
"interpolationhit=" << interpolation
373 <<
"occupancyBins=" << occupancyBins
374 <<
"occupancyTotal=" << occupancyTotal
375 <<
"trackUncorrectedYZ=" << uncorrectedYZ
376 <<
"avgInvCharge=" << avgInvCharge
377 <<
"invCharge=" << invCharge
378 <<
"unscaledMultiplicity=" << unscaledMult
379 <<
"alpha=" << clAlpha
383 <<
"clusterState=" << clusterState
384 <<
"retValReject=" << retValReject
Helper class to access correction maps.
#define GPUCA_MAX_SIN_PHI
const GPUTPCGMMerger::trackCluster & b1
const GPUConstantMem & GetConstantMem() const
int32_t int32_t int32_t int32_t int8_t int8_t mergeMode
void DumpMergeCE(std::ostream &out) const
void DumpMergedBetweenSectors(std::ostream &out) const
void MergedTrackStreamerInternal(const GPUTPCGMBorderTrack &b1, const GPUTPCGMBorderTrack &b2, const char *name, int32_t sector1, int32_t sector2, int32_t mergeMode, float weight, float frac) const
void DumpFitPrepare(std::ostream &out) const
static constexpr const int32_t NSECTORS
void DebugRefitMergedTrack(const GPUTPCGMMergedTrack &track) const
int32_t int32_t int32_t bool output
int32_t int32_t int32_t gputpcgmmergertypes::GPUTPCGMBorderRange int32_t N
int32_t GPUTPCGMBorderTrack GPUTPCGMBorderTrack *& b2
void DumpTrackLinks(std::ostream &out, bool output, const char *type) const
void DumpFinal(std::ostream &out) const
std::vector< float > StreamerUncorrectedZY(int32_t iSector, int32_t iRow, const GPUTPCGMTrackParam &track, const GPUTPCGMPropagator &prop) const
std::vector< uint32_t > StreamerOccupancyBin(int32_t iSector, int32_t iRow, float time) const
void DumpRefit(std::ostream &out) const
void DumpMergedWithinSectors(std::ostream &out) const
void DumpCollected(std::ostream &out) const
int32_t GPUTPCGMBorderTrack GPUTPCGMBorderTrack int32_t & jSector
const GPUTPCGMBorderTrack & MergedTrackStreamerFindBorderTrack(const GPUTPCGMBorderTrack *tracks, int32_t N, int32_t trackId) const
int32_t int32_t int32_t int32_t int8_t withinSector
void DebugStreamerUpdate(int32_t iTrk, int32_t ihit, float xx, float yy, float zz, const GPUTPCGMMergedTrackHit &cluster, const o2::tpc::ClusterNative &clusterNative, const GPUTPCGMTrackParam &track, const GPUTPCGMPropagator &prop, const gputpcgmmergertypes::InterpolationErrorHit &interpolation, int8_t rejectChi2, bool refit, int32_t retVal, float avgInvCharge, float posY, float posZ, int16_t clusterState, int32_t retValReject, float err2Y, float err2Z) const
void DumpMergeRanges(std::ostream &out, int32_t withinSector, int32_t mergeMode) const
void MergedTrackStreamer(const GPUTPCGMBorderTrack &b1, const GPUTPCGMBorderTrack &b2, const char *name, int32_t sector1, int32_t sector2, int32_t mergeMode, float weight, float frac) const
int32_t GPUTPCGMBorderTrack *& b1
void DumpSectorTracks(std::ostream &out) const
void SetPtrsFromGPUConstantMem(const GPUConstantMem *v, GPUParam *p=nullptr)
GLuint const GLchar * name
GLuint GLuint GLfloat weight
GLint GLint GLsizei GLint GLenum GLenum type
GPUTPCTracker tpcTrackers[GPUCA_NSECTORS]