File indexing completed on 2024-11-25 02:29:56
0001 #ifndef RecoHGCal_TICL_TracksterLinkingAlgoBySkeletons_H
0002 #define RecoHGCal_TICL_TracksterLinkingAlgoBySkeletons_H
0003
0004 #include "FWCore/Framework/interface/Frameworkfwd.h"
0005 #include "FWCore/Framework/interface/ESHandle.h"
0006 #include "FWCore/Framework/interface/MakerMacros.h"
0007 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0008 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
0009 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0010 #include "DataFormats/HGCalReco/interface/Trackster.h"
0011 #include "RecoLocalCalo/HGCalRecAlgos/interface/RecHitTools.h"
0012 #include "RecoHGCal/TICL/interface/TracksterLinkingAlgoBase.h"
0013 #include "Geometry/HGCalCommonData/interface/HGCalDDDConstants.h"
0014 #include "Geometry/Records/interface/IdealGeometryRecord.h"
0015 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0016 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0017 #include "DataFormats/GeometrySurface/interface/BoundDisk.h"
0018 #include "MagneticField/Engine/interface/MagneticField.h"
0019 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
0020 #include <array>
0021
0022 namespace ticl {
0023
0024 class TracksterLinkingbySkeletons : public TracksterLinkingAlgoBase {
0025 public:
0026 TracksterLinkingbySkeletons(const edm::ParameterSet& conf,
0027 edm::ConsumesCollector iC,
0028 cms::Ort::ONNXRuntime const* onnxRuntime = nullptr);
0029
0030 ~TracksterLinkingbySkeletons() override {}
0031
0032 void linkTracksters(const Inputs& input,
0033 std::vector<Trackster>& resultTracksters,
0034 std::vector<std::vector<unsigned int>>& linkedResultTracksters,
0035 std::vector<std::vector<unsigned int>>& linkedTracksterIdToInputTracksterId) override;
0036
0037 std::array<ticl::Vector, 3> findSkeletonNodes(const ticl::Trackster& trackster,
0038 float lower_percentage,
0039 float upper_percentage,
0040 const std::vector<reco::CaloCluster>& layerClusters,
0041 const hgcal::RecHitTools& rhtools);
0042
0043 bool areCompatible(const ticl::Trackster& myTrackster,
0044 const ticl::Trackster& otherTrackster,
0045 const std::array<ticl::Vector, 3>& mySkeleton,
0046 const std::array<ticl::Vector, 3>& otherSkeleton);
0047
0048 bool checkCylinderAlignment(const std::array<ticl::Vector, 3>& mySkeleton,
0049 const std::array<ticl::Vector, 3>& otherSkeleton,
0050 int isEE);
0051 bool checkSkeletonAlignment(const ticl::Trackster& myTrackster, const ticl::Trackster& otherTrackster);
0052
0053 bool checkClosestPoints(const ticl::Trackster& myTrackster,
0054 const ticl::Trackster& otherTrackster,
0055 const std::array<ticl::Vector, 3>& mySkeleton,
0056 const std::array<ticl::Vector, 3>& otherSkeleton,
0057 int isEE);
0058 bool isSplitComponent(const ticl::Trackster& myTrackster,
0059 const ticl::Trackster& otherTrackster,
0060 const std::array<ticl::Vector, 3>& mySkeleton,
0061 const std::array<ticl::Vector, 3>& otherSkeleton,
0062 float proj_distance);
0063
0064 void initialize(const HGCalDDDConstants* hgcons,
0065 const hgcal::RecHitTools rhtools,
0066 const edm::ESHandle<MagneticField> bfieldH,
0067 const edm::ESHandle<Propagator> propH) override;
0068
0069 static void fillPSetDescription(edm::ParameterSetDescription& iDesc) {
0070 iDesc.add<double>("cylinder_radius_sqr_split", 9.);
0071 iDesc.add<double>("proj_distance_split", 5.);
0072 iDesc.add<double>("track_time_quality_threshold", 0.5);
0073 iDesc.add<unsigned int>("min_num_lcs", 7);
0074 iDesc.add<double>("min_trackster_energy", 10.);
0075 iDesc.add<double>("pca_quality_th", 0.85);
0076 iDesc.add<double>("dot_prod_th", 0.97);
0077 iDesc.add<double>("deltaRxy", 4.f);
0078 iDesc.add<std::vector<double>>("lower_boundary", {10., 150.});
0079 iDesc.add<std::vector<double>>("upper_boundary", {3, 70.});
0080 iDesc.add<std::vector<double>>("upper_distance_projective_sqr", {40., 60.});
0081 iDesc.add<std::vector<double>>("lower_distance_projective_sqr", {10., 30.});
0082 iDesc.add<std::vector<double>>("min_distance_z", {35., 35.});
0083 iDesc.add<std::vector<double>>("upper_distance_projective_sqr_closest_points", {10., 30.});
0084 iDesc.add<std::vector<double>>("lower_distance_projective_sqr_closest_points", {10., 30.});
0085 iDesc.add<std::vector<double>>("max_z_distance_closest_points", {35., 35.});
0086 iDesc.add<std::vector<double>>("cylinder_radius_sqr", {10, 20});
0087
0088 TracksterLinkingAlgoBase::fillPSetDescription(iDesc);
0089 }
0090
0091 private:
0092 using Vector = ticl::Trackster::Vector;
0093
0094 void buildLayers();
0095
0096 void dumpLinksFound(std::vector<std::vector<unsigned>>& resultCollection, const char* label) const;
0097
0098 static constexpr float z_surface = 400.f;
0099 std::vector<double> lower_boundary_;
0100 std::vector<double> upper_boundary_;
0101 std::vector<double> upper_distance_projective_sqr_;
0102 std::vector<double> lower_distance_projective_sqr_;
0103 std::vector<double> min_distance_z_;
0104 std::vector<double> upper_distance_projective_sqr_closest_points_;
0105 std::vector<double> lower_distance_projective_sqr_closest_points_;
0106 std::vector<double> max_z_distance_closest_points_;
0107 std::vector<double> cylinder_radius_sqr_;
0108
0109 float cylinder_radius_sqr_split_;
0110 float proj_distance_split_;
0111 float timing_quality_threshold_;
0112 float min_trackster_energy_;
0113 float pca_quality_th_;
0114 float dot_prod_th_;
0115 float deltaRxy_;
0116 unsigned int min_num_lcs_;
0117
0118 const HGCalDDDConstants* hgcons_;
0119
0120 std::unique_ptr<GeomDet> firstDisk_[2];
0121 std::unique_ptr<GeomDet> interfaceDisk_[2];
0122
0123 hgcal::RecHitTools rhtools_;
0124
0125 edm::ESHandle<MagneticField> bfield_;
0126 edm::ESHandle<Propagator> propagator_;
0127 std::array<float, TileConstants::nEtaBins> eta_windows_;
0128 };
0129
0130 }
0131
0132 #endif