Back to home page

Project CMSSW displayed by LXR

 
 

    


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 }  // namespace ticl
0131 
0132 #endif