File indexing completed on 2026-08-31 08:21:24
0001 #ifndef TPCTRACKRECO_TPCCROSSINGDECISION_H
0002 #define TPCTRACKRECO_TPCCROSSINGDECISION_H
0003
0004
0005 #include <phool/PHObject.h>
0006
0007 #include <iostream>
0008 #include <limits>
0009 #include <string>
0010 #include <vector>
0011
0012 enum class TpcCrossingStatus : unsigned char
0013 {
0014 Unknown = 0,
0015 NoInttCrossings = 1,
0016 NoAllowedCrossing = 2,
0017 GarfieldInvalid = 3,
0018 OutsideTpcVolume = 4,
0019 WrongTpcSide = 5,
0020 FitFailed = 6,
0021 SelectedByContainment = 7,
0022 SelectedByVertex = 8,
0023 AmbiguousWithoutVertex = 9,
0024 AmbiguousWithVertex = 10,
0025 VertexIncompatible = 11,
0026 NoValidCrossing = 12,
0027 SelectedByVertexAmbiguous = 13,
0028 SelectedByVertexLoose = 14,
0029 SelectedByContainmentAmbiguous = 15
0030 };
0031
0032 enum class TpcCrossingCandidateStage : unsigned char
0033 {
0034 AvailableFromIntt = 0,
0035 PassedTimeWindow = 1,
0036 GarfieldValid = 2,
0037 InsideTpc = 3,
0038 CorrectSide = 4,
0039 FitValid = 5,
0040 HasVertex = 6,
0041 VertexCompatible = 7,
0042 FinalRanking = 8,
0043 Selected = 9
0044 };
0045
0046 enum TpcCrossingCandidateQABits : unsigned int
0047 {
0048 FromInttCrossing = 1U << 0,
0049 PassedTimeWindow = 1U << 1,
0050 MinEndpointGarfieldOK = 1U << 2,
0051 MaxEndpointGarfieldOK = 1U << 3,
0052 EndpointsInsideTPC = 1U << 4,
0053 EndpointsCorrectSide = 1U << 5,
0054 FitSuccessful = 1U << 6,
0055 HasSiliconVertex = 1U << 7,
0056 PassesVertexDz = 1U << 8,
0057 IsBestVertexCandidate = 1U << 9,
0058 IsSelected = 1U << 10
0059 };
0060
0061 class TpcCrossingCandidate
0062 {
0063 public:
0064 static float nan() { return std::numeric_limits<float>::quiet_NaN(); }
0065
0066 short crossing {0};
0067 bool is_available_from_intt {false};
0068 bool passes_time_window {false};
0069 bool was_tested {false};
0070 bool min_endpoint_garfield_valid {false};
0071 bool max_endpoint_garfield_valid {false};
0072 bool endpoints_inside_tpc {false};
0073 bool endpoints_on_correct_side {false};
0074 bool fit_valid {false};
0075 bool tpc_valid {false};
0076 bool has_silicon_vertex {false};
0077 bool vertex_compatible {false};
0078 bool is_selected {false};
0079 unsigned char confidence_tier {std::numeric_limits<unsigned char>::max()};
0080 float confidence_score {nan()};
0081 unsigned char rejection_status {static_cast<unsigned char>(TpcCrossingStatus::Unknown)};
0082
0083 float min_tbin_time_crossing0_ns {nan()};
0084 float max_tbin_time_crossing0_ns {nan()};
0085 float candidate_min_time_ns {nan()};
0086 float candidate_max_time_ns {nan()};
0087 float max_lookup_time_ns {nan()};
0088 float min_time_margin_ns {nan()};
0089 float max_time_margin_ns {nan()};
0090
0091 unsigned int min_time_layer {0};
0092 unsigned int min_time_side {0};
0093 unsigned int min_time_pad {0};
0094 unsigned int min_time_tbin {0};
0095 float min_time_x {nan()};
0096 float min_time_y {nan()};
0097 float min_time_z {nan()};
0098 float min_time_r {nan()};
0099 float min_time_phi {nan()};
0100
0101 unsigned int max_time_layer {0};
0102 unsigned int max_time_side {0};
0103 unsigned int max_time_pad {0};
0104 unsigned int max_time_tbin {0};
0105 float max_time_x {nan()};
0106 float max_time_y {nan()};
0107 float max_time_z {nan()};
0108 float max_time_r {nan()};
0109 float max_time_phi {nan()};
0110
0111 unsigned int inner_layer {0};
0112 unsigned int inner_tbin {0};
0113 float inner_x {nan()};
0114 float inner_y {nan()};
0115 float inner_z {nan()};
0116
0117 unsigned int outer_layer {0};
0118 unsigned int outer_tbin {0};
0119 float outer_x {nan()};
0120 float outer_y {nan()};
0121 float outer_z {nan()};
0122
0123 float min_time_distance_to_central_membrane {nan()};
0124 float max_time_distance_to_central_membrane {nan()};
0125 float min_time_distance_to_padplane {nan()};
0126 float max_time_distance_to_padplane {nan()};
0127 bool min_time_inside_tpc {false};
0128 bool max_time_inside_tpc {false};
0129 bool min_time_correct_side {false};
0130 bool max_time_correct_side {false};
0131
0132 std::vector<unsigned int> fit_point_layer;
0133 std::vector<unsigned int> fit_point_pad;
0134 std::vector<unsigned int> fit_point_tbin;
0135 std::vector<float> fit_point_x;
0136 std::vector<float> fit_point_y;
0137 std::vector<float> fit_point_z;
0138 std::vector<float> fit_point_r;
0139 std::vector<float> fit_point_s;
0140
0141 unsigned int n_fit_points {0};
0142 float z_vs_s_slope {nan()};
0143 float z_vs_s_intercept {nan()};
0144 float z_fit_chi2 {nan()};
0145 int z_fit_ndf {-1};
0146 float s_at_transverse_pca {nan()};
0147 float minimum_transverse_radius {nan()};
0148 float tpc_z_at_transverse_pca {nan()};
0149 float tpc_z_at_r0 {nan()};
0150
0151 unsigned int n_vertices_at_crossing {0};
0152 std::vector<unsigned int> candidate_vertex_ids;
0153 std::vector<float> candidate_vertex_z;
0154 std::vector<float> candidate_vertex_sigma_z;
0155 std::vector<unsigned int> candidate_vertex_ntracks;
0156 std::vector<float> candidate_vertex_delta_z;
0157 std::vector<float> candidate_vertex_pull_z;
0158
0159 unsigned int closest_vertex_id {std::numeric_limits<unsigned int>::max()};
0160 float closest_vertex_z {nan()};
0161 float closest_vertex_sigma_z {nan()};
0162 float closest_vertex_delta_z {nan()};
0163 float closest_vertex_abs_delta_z {nan()};
0164 float closest_vertex_pull_z {nan()};
0165
0166 int candidate_rank_by_abs_delta_z {-1};
0167 int candidate_rank_by_abs_collision_z {-1};
0168 unsigned int candidate_qa_bits {0};
0169 unsigned char first_failed_stage {static_cast<unsigned char>(TpcCrossingCandidateStage::AvailableFromIntt)};
0170
0171 private:
0172 ClassDefNV(TpcCrossingCandidate, 3)
0173 };
0174
0175 class TpcCrossingDecision : public PHObject
0176 {
0177 public:
0178 TpcCrossingDecision() = default;
0179 ~TpcCrossingDecision() override = default;
0180
0181 void identify(std::ostream& os = std::cout) const override
0182 {
0183 os << "TpcCrossingDecision base class" << std::endl;
0184 }
0185 void Reset() override {}
0186 int isValid() const override { return 0; }
0187
0188 virtual unsigned int get_assembled_track_id() const { return 0; }
0189 virtual void set_assembled_track_id(unsigned int) {}
0190
0191 virtual short get_selected_crossing() const { return 0; }
0192 virtual void set_selected_crossing(short) {}
0193
0194 virtual unsigned int get_silicon_vertex_id() const { return 0; }
0195 virtual void set_silicon_vertex_id(unsigned int) {}
0196
0197 virtual float get_tpc_z0() const { return 0.0F; }
0198 virtual void set_tpc_z0(float) {}
0199
0200 virtual float get_silicon_vertex_z() const { return 0.0F; }
0201 virtual void set_silicon_vertex_z(float) {}
0202
0203 virtual float get_delta_z() const { return 0.0F; }
0204 virtual void set_delta_z(float) {}
0205
0206 virtual float get_best_abs_delta_z() const { return 0.0F; }
0207 virtual void set_best_abs_delta_z(float) {}
0208
0209 virtual float get_second_best_abs_delta_z() const { return 0.0F; }
0210 virtual void set_second_best_abs_delta_z(float) {}
0211
0212 virtual unsigned char get_selected_tier() const { return std::numeric_limits<unsigned char>::max(); }
0213 virtual void set_selected_tier(unsigned char) {}
0214
0215 virtual float get_selected_score() const { return std::numeric_limits<float>::quiet_NaN(); }
0216 virtual void set_selected_score(float) {}
0217
0218 virtual unsigned short get_number_of_available_crossings() const { return 0; }
0219 virtual void set_number_of_available_crossings(unsigned short) {}
0220
0221 virtual unsigned short get_number_of_allowed_crossings() const { return 0; }
0222 virtual void set_number_of_allowed_crossings(unsigned short) {}
0223
0224 virtual unsigned short get_number_of_tested_crossings() const { return 0; }
0225 virtual void set_number_of_tested_crossings(unsigned short) {}
0226
0227 virtual unsigned short get_number_of_tpc_valid_crossings() const { return 0; }
0228 virtual void set_number_of_tpc_valid_crossings(unsigned short) {}
0229
0230 virtual unsigned short get_number_of_vertex_compatible_crossings() const { return 0; }
0231 virtual void set_number_of_vertex_compatible_crossings(unsigned short) {}
0232
0233 virtual unsigned int get_number_of_candidates() const { return 0; }
0234 virtual const TpcCrossingCandidate* get_candidate(unsigned int) const { return nullptr; }
0235 virtual void add_candidate(const TpcCrossingCandidate&) {}
0236 virtual void clear_candidates() {}
0237
0238 virtual unsigned char get_status() const { return static_cast<unsigned char>(TpcCrossingStatus::Unknown); }
0239 virtual void set_status(unsigned char) {}
0240 virtual void set_status(TpcCrossingStatus status) { set_status(static_cast<unsigned char>(status)); }
0241
0242 private:
0243 ClassDefOverride(TpcCrossingDecision, 0)
0244 };
0245
0246 #endif