16#ifndef O2_ITS_TRACKING_TRACKHELPERS_H_
17#define O2_ITS_TRACKING_TRACKHELPERS_H_
38GPUhdi() bool isBetter(const auto&
a, const auto&
b)
40 return isBetter(
a.getNumberOfClusters(),
a.getChi2(),
b.getNumberOfClusters(),
b.getChi2());
57 static GPUhdi()
int getEffectiveTrackLength(LayerMask hitLayerMask, LayerMask excludedLayerMask)
59 if (hitLayerMask.empty()) {
62 return hitLayerMask.length() - (LayerMask::span(hitLayerMask.first(), hitLayerMask.last()) & excludedLayerMask).
count();
65 static GPUhdi() LayerMask getEffectiveHoleMask(LayerMask hitLayerMask, LayerMask excludedLayerMask)
67 return hitLayerMask.holeMask() & ~excludedLayerMask;
70 GPUhd() bool operator()(const TrackSeed<NLayers>&
seed)
const
72 const auto hitLayerMask =
seed.getHitLayerMask();
88 for (
int iLayer = minLayer + 1; iLayer <
maxLayer; ++iLayer) {
102 track.resetCovariance();
113 o2::gpu::CAMath::SinCos(tf3.alphaTrackingFrame, sa, ca);
114 const float sign =
reverse ? -1.f : 1.f;
115 const float x1 = (cluster1.xCoordinate * ca) + (cluster1.yCoordinate * sa);
116 const float y1 = (-cluster1.xCoordinate * sa) + (cluster1.yCoordinate * ca);
117 const float x2 = (cluster2.xCoordinate * ca) + (cluster2.yCoordinate * sa);
118 const float y2 = (-cluster2.xCoordinate * sa) + (cluster2.yCoordinate * ca);
119 const float x3 = tf3.xTrackingFrame;
120 const float y3 = tf3.positionTrackingFrame[0];
121 if (o2::gpu::CAMath::Abs(
bz) < 0.01f) {
122 const float dx = x3 -
x1;
123 const float dy = y3 -
y1;
124 snp = sign * dy / o2::gpu::CAMath::Hypot(dx, dy);
128 const float crv = math_utils::computeCurvature(x3, y3, x2, y2,
x1,
y1);
129 snp = sign * crv * (x3 - math_utils::computeCurvatureCentreX(x3, y3, x2, y2,
x1,
y1));
133 const float tgl = -0.5f * sign * (math_utils::computeTanDipAngle(
x1,
y1, x2, y2, cluster1.zCoordinate, cluster2.zCoordinate) + math_utils::computeTanDipAngle(x2, y2, x3, y3, cluster2.zCoordinate, tf3.positionTrackingFrame[1]));
135 return {x3, tf3.alphaTrackingFrame, {y3, tf3.positionTrackingFrame[1], snp, tgl, q2pt}, {tf3.covarianceTrackingFrame[0], tf3.covarianceTrackingFrame[1], tf3.covarianceTrackingFrame[2], 0.f, 0.f,
o2::track::kCSnp2max, 0.f, 0.f, 0.f,
o2::track::kCTgl2max, 0.f, 0.f, 0.f, 0.f, sg2q2pt}};
138template <
int NLayers>
150 for (
int iL{0}; iL < NLayers; ++iL) {
151 const int idx =
seed.getCluster(iL);
160 if (ncl < reseedIfShorter && ncl > 2) {
166 temporaryTrack.paramIn = buildTrackSeed(cluster2GL, cluster1GL, cluster0TF,
bz,
true);
175template <
int NLayers>
189template <
int NLayers>
198 o2::track::TrackPar* linRef =
nullptr)
200 for (
int iLayer{
start}; iLayer !=
end; iLayer +=
step) {
201 const int clsIdx = trk.getClusterIndex(iLayer);
217 if (
ctx.matCorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) {
232 if (
ctx.matCorrType == o2::base::PropagatorF::MatCorrType::USEMatCorrNONE) {
240 if ((
nCl >= 3 && predChi2 >
ctx.maxChi2ClusterAttachment) || predChi2 < 0.f) {
243 trk.setChi2(trk.getChi2() + predChi2);
247 if (linRef &&
ctx.shiftRefToCluster) {
254 return o2::gpu::CAMath::Abs(
param.getQ2Pt()) <
maxQoverPt && trk.getChi2() <
ctx.maxChi2NDF * (float)((
nCl * 2) - 5);
257template <
int NLayers>
259 const TrackFitContext<NLayers>&
ctx,
260 const
float minPt = -1.
f)
265 bool fitSuccess = fitTrack(track, track.paramIn, 0,
ctx.nLayers, 1,
271 track.paramOut = track.paramIn;
272 linRef = track.paramOut;
275 fitSuccess = fitTrack(track, track.paramIn,
ctx.nLayers - 1, -1, -1,
276 50.f, 0,
ctx, &linRef);
280 if (minPt > 0.f &&
track.getPt() < minPt) {
283 if (
ctx.repeatRefitOut) {
286 float saveChi2 =
track.getChi2();
287 track.paramOut = saveInw;
290 fitSuccess = fitTrack(track,
track.paramOut, 0,
ctx.nLayers, 1,
295 track.paramIn = saveInw;
296 track.setChi2(saveChi2);
301template <
int NLayers>
302GPUdi() bool refitTrackSeed(const TrackSeed<NLayers>& trackSeed,
304 const TrackFitContext<NLayers>&
ctx,
o2::track::TrackParCov TrackParCov
std::array< int, 64 > reverse(std::array< int, 64 > a)
Definition of the ITS track.
HMPID cluster implementation.
GLuint GLfloat GLfloat GLfloat GLfloat y1
GLuint GLfloat GLfloat GLfloat x1
GLboolean GLboolean GLboolean b
GLsizei GLsizei GLfloat distance
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean GLboolean GLboolean GLboolean a
constexpr int UnusedIndex
constexpr float UnsetValue
o2::track::TrackParCov int int int float maxQoverPt
const TrackingFrameInfo *const * foundTrackingFrameInfo
resetTrackCovariance(temporaryTrack.paramIn)
const TrackingFrameInfo *const const Cluster *const * unsortedClusters
int const float * layerRadii
GPUhdi() bool isBetter(const int nClustersA
int const float const TrackSeed< NLayers > & seed
const float const int nClustersB
o2::track::TrackParCov int int int float int const TrackFitContext< NLayers > & ctx
o2::track::TrackParCov int int end
o2::track::TrackParCov int int int step
const TrackingFrameInfo *const const Cluster *const const float const float const int reseedIfShorter
const float const int const float chi2B
o2::track::TrackParCov int int int float int nCl
const TrackingFrameInfo *const const Cluster *const const float const float bz
GPUdi() int selectReseedMidLayer(int minLayer
const bool const int TrackITSInternal< NLayers > & track
constexpr float kCTgl2max
constexpr float kCSnp2max
constexpr float kMostProbablePt
constexpr float kC1Pt2max
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
o2::track::TrackParCov paramIn
std::array< float, 2 > positionTrackingFrame
std::array< float, 3 > covarianceTrackingFrame
o2::base::PropagatorF::MatCorrType matCorrType
const TrackingFrameInfo *const * tfInfos
float maxChi2ClusterAttachment
const o2::base::Propagator * propagator
LayerMask nonSeedingLayerMask
GPUhd() TrackSeedSelector(float maxQ2Pt
std::vector< Cluster > clusters