Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-06-08 07:53:22

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2024-2025 Chun Yuen Tsang, Prithwish Tribedy, Simon Gardner
0003 //
0004 // Spread energy deposition from one strip to neighboring strips within sensor boundaries
0005 
0006 #pragma once
0007 
0008 #include <DD4hep/DetElement.h>
0009 #include <DD4hep/Objects.h>
0010 #include <DD4hep/Segmentations.h>
0011 #include <DDRec/CellIDPositionConverter.h>
0012 #include <DDSegmentation/CartesianGridXY.h>
0013 #include <TGeoMatrix.h>
0014 #include <algorithms/algorithm.h>
0015 #include <edm4hep/SimTrackerHitCollection.h>
0016 #include <string>
0017 #include <string_view>
0018 #include <unordered_map>
0019 #include <unordered_set>
0020 #include <utility>
0021 
0022 #include "algorithms/digi/SiliconChargeSharingConfig.h"
0023 #include "algorithms/interfaces/WithPodConfig.h"
0024 
0025 namespace eicrecon {
0026 
0027 using SiliconChargeSharingAlgorithm =
0028     algorithms::Algorithm<algorithms::Input<edm4hep::SimTrackerHitCollection>,
0029                           algorithms::Output<edm4hep::SimTrackerHitCollection>>;
0030 
0031 class SiliconChargeSharing : public SiliconChargeSharingAlgorithm,
0032                              public WithPodConfig<SiliconChargeSharingConfig> {
0033 
0034 public:
0035   SiliconChargeSharing(std::string_view name)
0036       : SiliconChargeSharingAlgorithm{name, {"inputHits"}, {"outputSharedHits"}, ""} {};
0037 
0038   void init() final;
0039   void process(const Input&, const Output&) const final;
0040 
0041 private:
0042   void findAllNeighborsInSensor(const dd4hep::rec::CellID testCellID,
0043                                 std::unordered_set<dd4hep::rec::CellID>& tested_cells,
0044                                 const float edep, const dd4hep::Position hitPos,
0045                                 const dd4hep::DDSegmentation::CartesianGridXY* segmentation,
0046                                 const std::pair<double, double>& xy_range,
0047                                 const edm4hep::SimTrackerHit& hit,
0048                                 edm4hep::SimTrackerHitCollection* sharedHits) const;
0049   float energyAtCell(const double xDimension, const double yDimension,
0050                      const dd4hep::Position localPos, const dd4hep::Position hitPos,
0051                      const float edep) const;
0052   static float integralGaus(float mean, float sd, float low_lim, float up_lim);
0053   dd4hep::Position cell2LocalPosition(const dd4hep::rec::CellID& cell) const;
0054   static dd4hep::Position global2Local(const dd4hep::Position& globalPosition,
0055                                        const TGeoHMatrix* transform);
0056   const dd4hep::DDSegmentation::CartesianGridXY*
0057   getLocalSegmentation(const dd4hep::rec::CellID& cellID) const;
0058 
0059   mutable std::unordered_map<const dd4hep::DetElement*, const TGeoHMatrix*> m_transform_map;
0060   mutable std::unordered_map<const dd4hep::DetElement*,
0061                              const dd4hep::DDSegmentation::CartesianGridXY*>
0062       m_segmentation_map;
0063   mutable std::unordered_map<const dd4hep::DetElement*, const std::pair<double, double>>
0064       m_xy_range_map;
0065   const dd4hep::rec::CellIDPositionConverter* m_converter = nullptr;
0066   dd4hep::Segmentation m_seg;
0067 };
0068 
0069 } // namespace eicrecon