29#include "GPUParam.inc"
41using namespace gputpcgmmergertypes;
45 std::streamsize ss = out.precision();
46 out << std::setprecision(2);
47 out <<
"\nTPC Merger Sector Tracks\n";
49 out <<
"Sector Track Info Index " << (mSectorTrackInfoIndex[
iSector + 1] - mSectorTrackInfoIndex[
iSector]) <<
" / " << (mSectorTrackInfoIndex[
NSECTORS +
iSector + 1] - mSectorTrackInfoIndex[
NSECTORS +
iSector]) <<
"\n";
50 for (int32_t iGlobal = 0; iGlobal < 2; iGlobal++) {
51 out <<
" Track type " << iGlobal <<
"\n";
53 const auto& trk = mSectorTrackInfos[
j];
54 out <<
" Track " <<
j <<
": LocalId " << (iGlobal ? (trk.LocalTrackId() >> 24) : -1) <<
"/" << (iGlobal ? (trk.LocalTrackId() & 0xFFFFFF) : -1) <<
" NCl " << trk.NClusters() <<
" X " << trk.X() <<
" offsetz " << trk.TOffset() <<
" 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";
58 out << std::setprecision(ss);
64 for (int32_t
i = 0;
i <
n;
i++) {
72 out <<
"\nBorder Tracks : i " <<
i <<
" withinSector " <<
withinSector <<
" mergeMode " <<
mergeMode <<
"\n";
73 for (int32_t k = 0; k < n1; k++) {
74 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]
75 <<
" 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";
78 for (int32_t k = 0; k <
n2; k++) {
79 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]
80 <<
" 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";
83 out <<
"\nBorder Range : i " <<
i <<
" withinSector " <<
withinSector <<
" mergeMode " <<
mergeMode <<
"\n";
84 for (int32_t k = 0; k < n1; k++) {
85 out <<
" " << k <<
": " << range1[k].
fId <<
" " << range1[k].
fMin <<
" " << range1[k].
fMax <<
"\n";
87 for (int32_t k = 0; k <
n2; k++) {
88 out <<
" " << k <<
": " << range2[k].
fId <<
" " << range2[k].
fMin <<
" " << range2[k].
fMax <<
"\n";
95 out <<
"\nTPC Merger Links " <<
type <<
"\n";
96 const int32_t
n =
output ? mMemory->nMergedTracks : SectorTrackInfoLocalTotal();
97 for (int32_t
i = 0;
i <
n;
i++) {
98 if (mTrackLinks[
i] != -1) {
99 out <<
" " <<
i <<
": " << mTrackLinks[
i] <<
"\n";
107 out <<
"\nTPC Merger Merge Within Sectors\n";
109 for (int32_t
j = mSectorTrackInfoIndex[
iSector];
j < mSectorTrackInfoIndex[
iSector + 1];
j++) {
110 const auto& trk = mSectorTrackInfos[
j];
111 if (trk.NextSegmentNeighbour() >= 0 || trk.PrevSegmentNeighbour() >= 0) {
112 out <<
" Track " <<
j <<
": Neighbour " << trk.PrevSegmentNeighbour() <<
" / " << trk.NextSegmentNeighbour() <<
"\n";
121 out <<
"\nTPC Merger Merge Between Sectors\n";
123 for (int32_t
j = mSectorTrackInfoIndex[
iSector];
j < mSectorTrackInfoIndex[
iSector + 1];
j++) {
124 const auto& trk = mSectorTrackInfos[
j];
125 if (trk.NextNeighbour() >= 0 || trk.PrevNeighbour() >= 0) {
126 out <<
" Track " <<
j <<
": Neighbour " << trk.PrevNeighbour() <<
" / " << trk.NextNeighbour() <<
"\n";
128 if (trk.PrevNeighbour() == -1 && trk.PrevSegmentNeighbour() == -1) {
129 PrintMergeGraph(&trk, out);
137 std::streamsize ss = out.precision();
138 out << std::setprecision(6);
139 out <<
"\nTPC Merger Collected Tracks\n";
140 for (uint32_t
i = 0;
i < mMemory->nMergedTracks;
i++) {
141 const auto& trk = mMergedTracks[
i];
142 const auto& p = trk.GetParam();
143 out <<
" Track " <<
i <<
": Loop " << trk.Looper() <<
" Alpha " << trk.GetAlpha() <<
" X " << p.GetX() <<
" offset " << p.GetTOffset() <<
" Y " << p.GetY() <<
" Z " << p.GetZ() <<
" SPhi " << p.GetSinPhi() <<
" Tgl " << p.GetDzDs() <<
" QPt " << p.GetQPt() <<
" NCl " << trk.NClusters() <<
"\n";
145 out << std::setprecision(ss);
151 out <<
"\nTPC Merger Merge CE\n";
152 for (uint32_t
i = 0;
i < mMemory->nMergedTracks;
i++) {
153 const auto& trk = mMergedTracks[
i];
155 out <<
" Track " <<
i <<
": CCE\n";
162 out <<
"\nTPC Merger Refit Prepare\n";
164 for (uint32_t
i = 0;
i < mMemory->nMergedTracks;
i++) {
165 out <<
" " <<
i <<
": " << mTrackOrderAttach[
i] <<
"\n";
167 out <<
" Clusters\n";
168 for (uint32_t
j = 0;
j < mMemory->nMergedTracks;
j++) {
169 const auto& trk = mMergedTracks[
j];
170 out <<
" Track " <<
j <<
": ";
171 for (uint32_t
i = trk.FirstClusterRef();
i < trk.FirstClusterRef() + trk.NClusters();
i++) {
172 out <<
j <<
"/" << (
i - trk.FirstClusterRef()) <<
": " << mClusters[
i].
num <<
"/" << (int32_t)mClusters[
i].
state <<
", ";
176 uint32_t maxId = mNMaxClusters;
178 for (uint32_t
i = 0;
i < maxId;
i++) {
181 out <<
" Cluster attachment ";
194 std::streamsize ss = out.precision();
195 out << std::setprecision(2);
196 out <<
"\nTPC Merger Refit\n";
197 for (uint32_t
i = 0;
i < mMemory->nMergedTracks;
i++) {
198 const auto& trk = mMergedTracks[
i];
199 if (trk.NClusters() == 0) {
202 const auto& p = trk.GetParam();
203 const auto&
po = trk.OuterParam();
204 out <<
" Track " <<
i <<
": OK " << trk.OK() <<
" Alpha " << trk.GetAlpha() <<
" X " << p.GetX() <<
" offset " << p.GetTOffset() <<
" 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()
205 <<
" dEdx " << (trk.OK() && Param().dodEdxEnabled ? mMergedTracksdEdx[
i].
dEdxTotTPC : -1.f) <<
"/" << (trk.OK() && Param().dodEdxEnabled ? mMergedTracksdEdx[
i].
dEdxMaxTPC : -1.f)
206 <<
" Outer " <<
po.P[0] <<
"/" <<
po.P[1] <<
"/" <<
po.P[2] <<
"/" <<
po.P[3] <<
"/" <<
po.P[4]
207 <<
" NFitted " << trk.NClustersFitted() <<
" flags " << (
int)trk.Flags() <<
"\n";
209 out << std::setprecision(ss);
214 out <<
"\n TPC Merger Looper Afterburner\n";
215 for (uint32_t
i = 0;
i < mMemory->nMergedTracks;
i++) {
216 if (
i &&
i % 100 == 0) {
219 out << (
int)mMergedTracks[
i].MergedLooperUnconnected() <<
" ";
226 out <<
"\nTPC Merger Finalized\n";
227 for (uint32_t
j = 0;
j < mMemory->nMergedTracks;
j++) {
228 const auto& trk = mMergedTracks[
j];
229 if (trk.NClusters() == 0) {
232 out <<
" Track " <<
j <<
": ";
233 for (uint32_t
i = trk.FirstClusterRef();
i < trk.FirstClusterRef() + trk.NClusters();
i++) {
234 if (mClusters[
i].
state != 0) {
235 out <<
j <<
"/" << (
i - trk.FirstClusterRef()) <<
": " << mClusters[
i].
num <<
"/" << (int32_t)mClusters[
i].
state <<
", ";
240 uint32_t maxId = mNMaxClusters;
242 for (uint32_t
i = 0;
i < maxId;
i++) {
245 out <<
" Cluster attachment ";
256template <
int32_t mergeType>
260 std::vector<int32_t> hits1(152), hits2(152);
261 for (int32_t
i = 0;
i < 152;
i++) {
262 hits1[
i] = hits2[
i] = -1;
264 const GPUTPCTracker& tracker1 = GetConstantMem()->tpcTrackers[sector1];
266 const GPUTPCTrack& inTrack1 = *sectorTrack1.OrigTrack();
267 for (int32_t
i = 0;
i < inTrack1.NHits();
i++) {
268 const GPUTPCHitId& ic1 = tracker1.TrackHits()[inTrack1.FirstHitID() +
i];
269 int32_t clusterIndex = tracker1.Data().ClusterDataIndex(tracker1.Data().Row(ic1.RowIndex()), ic1.HitIndex());
270 hits1[ic1.RowIndex()] = clusterIndex;
272 const GPUTPCTracker& tracker2 = GetConstantMem()->tpcTrackers[sector2];
274 const GPUTPCTrack& inTrack2 = *sectorTrack2.OrigTrack();
275 for (int32_t
i = 0;
i < inTrack2.NHits();
i++) {
276 const GPUTPCHitId& ic2 = tracker2.TrackHits()[inTrack2.FirstHitID() +
i];
277 int32_t clusterIndex = tracker2.Data().ClusterDataIndex(tracker2.Data().Row(ic2.RowIndex()), ic2.HitIndex());
278 hits2[ic2.RowIndex()] = clusterIndex;
281 std::string debugname = std::string(
"debug_") +
name;
282 std::string treename = std::string(
"tree_") +
name;
283 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";
300 for (int32_t
i = 0;
i <
N;
i++) {
301 if (tracks[
i].TrackID() == trackId) {
305 throw std::runtime_error(
"didn't find border track");
312 ((
GPUConstantMem*)GetConstantMem())->ioPtrs.mergedTrackHitStates = ClusterStateExt();
315 int32_t retval = refit.RefitTrackAsGPU(trk,
false,
true);
318 prop.SetMaterialTPC();
319 prop.SetPolynomialField(&Param().polynomialField);
321 prop.SetPropagateBzOnly(
false);
322 prop.SetMatLUT(Param().rec.useMatLUT ? GetConstantMem()->calibObjects.matLUT :
nullptr);
323 prop.SetTrack(&trk.Param(), trk.GetAlpha());
324 int32_t err = prop.PropagateToXAlpha(track.GetParam().GetX(), track.GetAlpha(),
false);
326 printf(
"REFIT RESULT %d, SnpDiff %f\n", retval, trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi());
327 if (retval > 20 && fabsf(trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi()) > 0.01f) {
328 printf(
"LARGE DIFF\n");
331 printf(
"PROPAGATE ERROR\n");
334 printf(
"REFIT ERROR\n");
340 static int32_t
size = getenv(
"O2_DEBUG_STREAMER_OCCUPANCY_NBINS") ? atoi(getenv(
"O2_DEBUG_STREAMER_OCCUPANCY_NBINS")) : Param().rec.tpc.occupancyMapTimeBinsAverage;
343 const int32_t bin = CAMath::Max(0.f,
time / Param().
rec.tpc.occupancyMapTimeBins);
344 for (int32_t
i = 0;
i < 1 + 2 *
size;
i++) {
345 const int32_t mybin = bin +
i -
size;
346 retVal[
i] = (mybin >= 0 && mybin < (int32_t)GPUTPCClusterOccupancyMapBin::getNBins(Param())) ? Param().occupancyMap[mybin] : 0;
354 std::vector<float>
retVal(2);
356 GetConstantMem()->calibObjects.fastTransformHelper->InverseTransformYZtoNominalYZ(
iSector, iRow, track.GetY(), track.GetZ(),
retVal[0],
retVal[1]);
361void 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
364 float time = clusterNative.getTime();
367 float invCharge = 1.f / clusterNative.
qMax;
368 int32_t iRow = cluster.
row;
369 float unscaledMult = (
time >= 0.f ? Param().GetUnscaledMult(
time) / GPUTPCGeometry::Row2X(iRow) : 0.f);
370 const float clAlpha = Param().Alpha(cluster.
sector);
371 uint32_t occupancyTotal = Param().occupancyTotal;
372 o2::utils::DebugStreamer::instance()->getStreamer(
"debug_update_track",
"UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName(
"tree_update_track").data()
378 <<
"cluster=" << cluster
379 <<
"clusterNative=" << clusterNative
381 <<
"rejectChi2=" << rejectChi2
382 <<
"interpolationhit=" << interpolation
385 <<
"occupancyBins=" << occupancyBins
386 <<
"occupancyTotal=" << occupancyTotal
387 <<
"trackUncorrectedYZ=" << uncorrectedYZ
388 <<
"avgInvCharge=" << avgInvCharge
389 <<
"invCharge=" << invCharge
390 <<
"unscaledMultiplicity=" << unscaledMult
391 <<
"alpha=" << clAlpha
395 <<
"clusterState=" << clusterState
396 <<
"retValReject=" << retValReject
Helper class to access correction maps.
#define GPUCA_MAX_SIN_PHI
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
void DumpLoopers(std::ostream &out) 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]