File indexing completed on 2025-12-16 09:28:07
0001
0002
0003
0004 #pragma once
0005
0006 #include <JANA/JEvent.h>
0007 #include <edm4eic/MCRecoTrackerHitAssociationCollection.h>
0008 #include <edm4eic/RawTrackerHitCollection.h>
0009 #include <memory>
0010 #include <string>
0011 #include <utility>
0012 #include <vector>
0013
0014
0015 #include "algorithms/digi/PhotoMultiplierHitDigi.h"
0016 #include "algorithms/digi/PhotoMultiplierHitDigiConfig.h"
0017
0018 #include "extensions/jana/JOmniFactory.h"
0019
0020 #include "services/algorithms_init/AlgorithmsInit_service.h"
0021 #include "services/geometry/dd4hep/DD4hep_service.h"
0022 #include "services/geometry/richgeo/RichGeo_service.h"
0023 #include "services/geometry/richgeo/ReadoutGeo.h"
0024
0025 namespace eicrecon {
0026
0027 class PhotoMultiplierHitDigi_factory
0028 : public JOmniFactory<PhotoMultiplierHitDigi_factory, PhotoMultiplierHitDigiConfig> {
0029
0030 public:
0031 using AlgoT = eicrecon::PhotoMultiplierHitDigi;
0032
0033 private:
0034 std::unique_ptr<AlgoT> m_algo;
0035
0036 PodioInput<edm4hep::EventHeader> m_event_headers_input{this};
0037 PodioInput<edm4hep::SimTrackerHit> m_sim_hits_input{this};
0038 PodioOutput<edm4eic::RawTrackerHit> m_raw_hits_output{this};
0039 PodioOutput<edm4eic::MCRecoTrackerHitAssociation> m_raw_assocs_output{this};
0040
0041 ParameterRef<std::string> m_detectorName{this, "detectorName", config().detectorName, ""};
0042 ParameterRef<std::string> m_readoutClass{this, "readoutClass", config().readoutClass, ""};
0043 ParameterRef<double> m_hitTimeWindow{this, "hitTimeWindow", config().hitTimeWindow, ""};
0044 ParameterRef<double> m_timeResolution{this, "timeResolution", config().timeResolution, ""};
0045 ParameterRef<double> m_speMean{this, "speMean", config().speMean, ""};
0046 ParameterRef<double> m_speError{this, "speError", config().speError, ""};
0047 ParameterRef<double> m_pedMean{this, "pedMean", config().pedMean, ""};
0048 ParameterRef<double> m_pedError{this, "pedError", config().pedError, ""};
0049 ParameterRef<bool> m_enablePixelGaps{this, "enablePixelGaps", config().enablePixelGaps,
0050 "enable/disable removal of hits in gaps between pixels"};
0051 ParameterRef<double> m_safetyFactor{this, "safetyFactor", config().safetyFactor,
0052 "overall safety factor"};
0053 ParameterRef<bool> m_enableNoise{this, "enableNoise", config().enableNoise, ""};
0054 ParameterRef<double> m_noiseRate{this, "noiseRate", config().noiseRate, ""};
0055 ParameterRef<double> m_noiseTimeWindow{this, "noiseTimeWindow", config().noiseTimeWindow, ""};
0056
0057
0058 Service<AlgorithmsInit_service> m_algorithmsInit{this};
0059 Service<RichGeo_service> m_RichGeoSvc{this};
0060
0061 public:
0062 void Configure() {
0063 m_algo = std::make_unique<AlgoT>(GetPrefix());
0064 m_algo->level(static_cast<algorithms::LogLevel>(logger()->level()));
0065
0066
0067 if (GetPluginName() == "DRICH" || GetPluginName() == "PFRICH") {
0068 m_RichGeoSvc().GetReadoutGeo(config().detectorName, config().readoutClass);
0069 m_algo->SetVisitRngCellIDs(
0070 [this](std::function<void(PhotoMultiplierHitDigi::CellIDType)> lambda, float p) {
0071 m_RichGeoSvc()
0072 .GetReadoutGeo(config().detectorName, config().readoutClass)
0073 ->VisitAllRngPixels(lambda, p);
0074 });
0075 m_algo->SetPixelGapMask(
0076 [this](PhotoMultiplierHitDigi::CellIDType cellID, dd4hep::Position pos) {
0077 return m_RichGeoSvc()
0078 .GetReadoutGeo(config().detectorName, config().readoutClass)
0079 ->PixelGapMask(cellID, pos);
0080 });
0081 }
0082
0083 m_algo->applyConfig(config());
0084 m_algo->init();
0085 }
0086
0087 void Process(int32_t , uint64_t ) {
0088 m_algo->process({m_event_headers_input(), m_sim_hits_input()},
0089 {m_raw_hits_output().get(), m_raw_assocs_output().get()});
0090 }
0091 };
0092
0093 }