Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions GPU/GPUTracking/Base/GPUParam.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ struct GPUParam : public internal::GPUParam_t<GPUSettingsRec, GPUSettingsParam>
GPUd() float GetClusterError2(int yz, int type, float zDiff, float angle2, float unscaledMult, float scaledAvgInvCharge, float scaledInvCharge) const;
GPUd() void GetClusterErrors2(char sector, int row, float z, float sinPhi, float DzDs, float time, float avgInvCharge, float invCharge, float& ErrY2, float& ErrZ2) const;
GPUd() void UpdateClusterError2ByState(short clusterState, float& ErrY2, float& ErrZ2) const;
GPUd() void UpdateClusterError2WithStateAndSyst(short clusterState, float trackX, float trackY, float z, char sector, bool sideC, float& ErrY2, float& ErrZ2) const;
GPUd() float GetUnscaledMult(float time) const;

GPUd() void Slice2Global(int iSlice, float x, float y, float z, float* X, float* Y, float* Z) const;
Expand Down
12 changes: 12 additions & 0 deletions GPU/GPUTracking/Base/GPUParam.inc
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,18 @@ GPUdi() void MEM_LG(GPUParam)::UpdateClusterError2ByState(short clusterState, fl
}
}

MEM_CLASS_PRE()
GPUdi() void MEM_LG(GPUParam)::UpdateClusterError2WithStateAndSyst(short clusterState, float trackX, float trackY, float z, char sector, bool sideC, float& ErrY2, float& ErrZ2) const
{
UpdateClusterError2ByState(clusterState, ErrY2, ErrZ2);
float statErr2 = GetSystematicClusterErrorIFC2(trackX, trackY, z, sideC);
if (sector >= GPUCA_NSLICES / 2 + 1 && sector <= GPUCA_NSLICES / 2 + 2) {
statErr2 += GetSystematicClusterErrorC122(trackX, trackY, sector);
}
ErrY2 += statErr2;
ErrZ2 += statErr2;
}

MEM_CLASS_PRE()
GPUdi() float MEM_LG(GPUParam)::GetUnscaledMult(float time) const
{
Expand Down
8 changes: 1 addition & 7 deletions GPU/GPUTracking/Merger/GPUTPCGMPropagator.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -613,13 +613,7 @@ GPUd() void GPUTPCGMPropagator::GetErr2(float& GPUrestrict() err2Y, float& GPUre
{
param.GetClusterErrors2(sector, iRow, posZ, snp, tgl, time, avgCharge, charge, err2Y, err2Z);
}
param.UpdateClusterError2ByState(clusterState, err2Y, err2Z);
float statErr2 = param.GetSystematicClusterErrorIFC2(trackX, trackY, posZ, sector >= (GPUCA_NSLICES / 2));
if (sector >= GPUCA_NSLICES / 2 + 1 && sector <= GPUCA_NSLICES / 2 + 2) {
statErr2 += param.GetSystematicClusterErrorC122(trackX, trackY, sector);
}
err2Y += statErr2;
err2Z += statErr2;
param.UpdateClusterError2WithStateAndSyst(clusterState, trackX, trackY, posZ, sector, sector >= (GPUCA_NSLICES / 2), err2Y, err2Z);
}

GPUd() float GPUTPCGMPropagator::PredictChi2(float posY, float posZ, int iRow, const GPUParam& GPUrestrict() param, short clusterState, char sector, float time, float avgCharge, float charge) const
Expand Down
4 changes: 2 additions & 2 deletions GPU/GPUTracking/Merger/GPUTPCGMSliceTrack.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ GPUd() bool GPUTPCGMSliceTrack::FilterErrors(const GPUTPCGMMerger* merger, int i
float kdx205 = 2.f + kdx * kdx * 0.5f;

{
merger->Param().GetClusterErrors2(iSlice, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, mParam.mC0, mParam.mC2); // TODO: provide correct time and row
merger->Param().GetClusterErrors2(iSlice, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, mParam.mC0, mParam.mC2); // occupancy and charge contributions disabled, assuming iroc row
#ifndef GPUCA_TPC_GEOMETRY_O2
float C0a, C2a;
merger->Param().GetClusterErrorsSeeding2(iSlice, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, C0a, C2a);
Expand Down Expand Up @@ -187,7 +187,7 @@ GPUd() bool GPUTPCGMSliceTrack::FilterErrors(const GPUTPCGMMerger* merger, int i
float dz = dS * mParam.mDzDs;
float ex1i = 1.f / ex1;
{
merger->Param().GetClusterErrors2(iSlice, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, err2Y, err2Z); // TODO: Provide correct time / row
merger->Param().GetClusterErrors2(iSlice, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, 0.f, 0.f, err2Y, err2Z);
#ifndef GPUCA_TPC_GEOMETRY_O2
float C0a, C2a;
merger->Param().GetClusterErrorsSeeding2(iSlice, 0, mParam.mZ, mParam.mSinPhi, mParam.mDzDs, -1.f, C0a, C2a);
Expand Down
42 changes: 30 additions & 12 deletions GPU/GPUTracking/SliceTracker/GPUTPCTrackletConstructor.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ GPUdic(2, 1) void GPUTPCTrackletConstructor::UpdateTracklet(int /*nBlocks*/, int
tParam.SetSignCosPhi(dx);
tParam.SetDzDs(dz * ri);
float err2Y, err2Z;
tracker.GetErrors2Seeding(iRow, tParam, -1.f, err2Y, err2Z); // Use correct time
tracker.GetErrors2Seeding(iRow, tParam, -1.f, err2Y, err2Z); // No good time estimate, don't use occupancy part
tParam.SetCov(0, err2Y);
tParam.SetCov(2, err2Z);
}
Expand All @@ -201,13 +201,18 @@ GPUdic(2, 1) void GPUTPCTrackletConstructor::UpdateTracklet(int /*nBlocks*/, int
break;
}
CADEBUG(printf("%5s hits %3d: FIT PROP ROW %3d X %8.3f -", "", r.mNHits, iRow, tParam.X()); for (int i = 0; i < 5; i++) { printf(" %8.3f", tParam.Par()[i]); } printf(" -"); for (int i = 0; i < 15; i++) { printf(" %8.3f", tParam.Cov()[i]); } printf("\n"));
float err2Y, err2Z;
tracker.GetErrors2Seeding(iRow, tParam.GetZ(), sinPhi, tParam.GetDzDs(), -1.f, err2Y, err2Z); // TODO: Use correct time

float err2Y, err2Z, time = -1.f;
short clusterState = 0;
#if !defined(__OPENCL__) || defined(__OPENCLCPP__)
if (tracker.GetConstantMem()->ioPtrs.clustersNative) {
const auto& cl = tracker.GetConstantMem()->ioPtrs.clustersNative->clustersLinear[tracker.Data().ClusterDataIndex(row, seedIH) + tracker.GetConstantMem()->ioPtrs.clustersNative->clusterOffset[tracker.ISlice()][0]];
clusterState = cl.getFlags();
time = cl.getTime();
}
#endif
tracker.GetErrors2Seeding(iRow, tParam.GetZ(), sinPhi, tParam.GetDzDs(), time, err2Y, err2Z);
tracker.Param().UpdateClusterError2WithStateAndSyst(clusterState, x, tParam.GetY(), tParam.GetZ(), tracker.ISlice(), r.mNHits >= 10 && tracker.ISlice() >= (GPUCA_NSLICES / 2), err2Y, err2Z);
if (r.mNHits >= 10) {
const float sErr2 = tracker.Param().GetSystematicClusterErrorIFC2(x, tParam.GetY(), tParam.GetZ(), tracker.ISlice() >= 18);
err2Y += sErr2;
err2Z += sErr2;
const float kFactor = tracker.Param().rec.tpc.hitPickUpFactor * tracker.Param().rec.tpc.hitPickUpFactor * 3.5f * 3.5f;
float sy2 = kFactor * (tParam.Err2Y() + err2Y);
float sz2 = kFactor * (tParam.Err2Z() + err2Z);
Expand Down Expand Up @@ -310,7 +315,7 @@ GPUdic(2, 1) void GPUTPCTrackletConstructor::UpdateTracklet(int /*nBlocks*/, int
calink best = CALINK_INVAL;

float err2Y, err2Z;
tracker.GetErrors2Seeding(iRow, *((MEM_LG2(GPUTPCTrackParam)*)&tParam), -1.f, err2Y, err2Z); // TODO: Use correct time
tracker.GetErrors2Seeding(iRow, *((MEM_LG2(GPUTPCTrackParam)*)&tParam), -1.f, err2Y, err2Z);
if (r.mNHits >= 10) {
const float sErr2 = tracker.Param().GetSystematicClusterErrorIFC2(x, tParam.GetY(), tParam.GetZ(), tracker.ISlice() >= 18);
err2Y += sErr2;
Expand Down Expand Up @@ -375,9 +380,22 @@ GPUdic(2, 1) void GPUTPCTrackletConstructor::UpdateTracklet(int /*nBlocks*/, int
CADEBUG(printf("%14s: SEA Hit %5d (%8.3f %8.3f), Res %f %f\n", "", best, y, z, tParam.Y() - y, tParam.Z() - z));

calink oldHit = (r.mStage == 2 && iRow >= r.mStartRow) ? rowHit : CALINK_INVAL;
if (oldHit != best && !tParam.Filter(y, z, err2Y, err2Z, GPUCA_MAX_SIN_PHI_LOW, oldHit != CALINK_INVAL) && r.mNHits != 0) {
rowHit = CALINK_INVAL;
break;
if (oldHit != best) {
#if !defined(__OPENCL__) || defined(__OPENCLCPP__)
float time = -1.f;
short clusterState = 0;
if (tracker.GetConstantMem()->ioPtrs.clustersNative) {
const auto& cl = tracker.GetConstantMem()->ioPtrs.clustersNative->clustersLinear[tracker.Data().ClusterDataIndex(row, best) + tracker.GetConstantMem()->ioPtrs.clustersNative->clusterOffset[tracker.ISlice()][0]];
clusterState = cl.getFlags();
time = cl.getTime();
}
tracker.GetErrors2Seeding(iRow, tParam, time, err2Y, err2Z);
tracker.Param().UpdateClusterError2WithStateAndSyst(clusterState, x, tParam.GetY(), tParam.GetZ(), tracker.ISlice(), r.mNHits >= 10 && tracker.ISlice() >= (GPUCA_NSLICES / 2), err2Y, err2Z);
#endif
if (!tParam.Filter(y, z, err2Y, err2Z, GPUCA_MAX_SIN_PHI_LOW, oldHit != CALINK_INVAL) && r.mNHits != 0) {
rowHit = CALINK_INVAL;
break;
}
}
found = true;
rowHit = best;
Expand Down Expand Up @@ -480,7 +498,7 @@ GPUdic(2, 1) void GPUTPCTrackletConstructor::DoTracklet(GPUconstantref() MEM_GLO
if ((r.mGo = (tParam.TransportToX(x, tracker.Param().bzCLight, GPUCA_MAX_SIN_PHI) && tParam.Filter(r.mLastY, r.mLastZ, tParam.Err2Y() * 0.5f, tParam.Err2Z() * 0.5f, GPUCA_MAX_SIN_PHI_LOW, true)))) {
CADEBUG(printf("%14s: SEA BACK ROW %3d X %8.3f -", "", iRow, tParam.X()); for (int i = 0; i < 5; i++) { printf(" %8.3f", tParam.Par()[i]); } printf(" -"); for (int i = 0; i < 15; i++) { printf(" %8.3f", tParam.Cov()[i]); } printf("\n"));
float err2Y, err2Z;
tracker.GetErrors2Seeding(r.mEndRow, tParam, -1.f, err2Y, err2Z); // TODO: Use correct time
tracker.GetErrors2Seeding(r.mEndRow, tParam, -1.f, err2Y, err2Z);
if (tParam.GetCov(0) < err2Y) {
tParam.SetCov(0, err2Y);
}
Expand Down