#ifdef TRIPLETS_TRACK_CU_H_ #error "this file can only be included once" #endif #define TRIPLETS_TRACK_CU_H_ #include "data.h" #include "track.h" #include "util.h" #include "vec.h" #define FAST_HIT_TEST 1 // in reality, member functions should be instantiated for id_layout only template hostdevice__ float Track_flex::dist(const fvec3 &hit_pos) const { fvec3 pos = fvec3::from(hit_pos.x, hit_pos.y, 0.0f); fvec3 dist_vec = pos - center; return fabsf(len(dist_vec) - radius); } // dist hostdevice__ bool hit_in_range (const fvec3 ¢er, float radius, bool is_clockwise, const fvec2 &hit_pos, float max_dist) { fvec3 pos = fvec3::from(hit_pos.x, hit_pos.y, 0.0f); fvec3 dist_vec = pos - center, origin_vec = -center; #if FAST_HIT_TEST float rmd = radius - max_dist, rpd = radius + max_dist; float rmd2 = rmd * rmd, rpd2 = rpd * rpd; float dist_vec2 = len2(dist_vec); return rmd2 < dist_vec2 && dist_vec2 < rpd2 && dphi_same_sign(origin_vec, dist_vec) * (is_clockwise ? 1.0f : -1.0f) > 0; #else return fabsf(len(dist_vec) - radius) < max_dist && dphi(origin_vec, dist_vec) * (is_clockwise ? 1.0f : -1.0f) > 0; #endif } // hit_in_range template hostdevice__ bool Track_flex::hit_in_range (const fvec2 &hit_pos, float max_dist) const { return ::hit_in_range(center, radius, is_clockwise, hit_pos, max_dist); } // hit_in_range template hostdevice__ bool Track_flex::hit_in_range (const fvec3 &hit_pos, float max_dist) const { fvec3 pos = fvec3::from(hit_pos.x, hit_pos.y, 0.0f); fvec3 dist_vec = pos - center, origin_vec = -center; #if FAST_HIT_TEST float rmd = radius - max_dist, rpd = radius + max_dist; float rmd2 = rmd * rmd, rpd2 = rpd * rpd; float dist_vec2 = len2(dist_vec); return rmd2 < dist_vec2 && dist_vec2 < rpd2 && dphi_same_sign(origin_vec, dist_vec) * (is_clockwise ? 1.0f : -1.0f) > 0; #else return fabsf(len(dist_vec) - radius) < max_dist && dphi(origin_vec, dist_vec) * (is_clockwise ? 1.0f : -1.0f) > 0; #endif } // hit_in_range template hostdevice__ bool Track_flex::hit_sign_in_range(fvec3 &hit_pos) const { fvec3 pos = fvec3::from(hit_pos.x, hit_pos.y, 0.0f); fvec3 dist_vec = pos - center, origin_vec = -center; #if FAST_HIT_TEST return dphi_same_sign(origin_vec, dist_vec) * (is_clockwise ? 1.0f : -1.0f) > 0; #else return dphi(origin_vec, dist_vec) * (is_clockwise ? 1.0f : -1.0f) > 0; #endif } // hit_sign_in_range template hostdevice__ bool Track_flex::hit_in_range (const Hit &hit, layptr tubes, float max_dist) const { return hit_in_range(tubes[hit.tube_id].pos, max_dist); } // hit_in_range template hostdevice__ bool Track_flex::triplet_in_range (const Triplet &triplet, float max_dist) const { // HACK: sum_hit_pos really contains poca crossing position return hit_in_range(triplet.sum_hit_pos, max_dist); } // triplet_in_range template hostdevice__ void Track_flex::add_hit(const Hit &hit) { //nhits++; add_hit_time(hit.t); } // add_hit template hostdevice__ void Track_flex::add_hit_time(float t) { min_t0 = min(min_t0, t); max_t0 = max(max_t0, t); } // add_hit_time