Back to home page

sPhenix code displayed by LXR

 
 

    


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  // TPCTRACKRECO_TPCCROSSINGDECISION_H