File indexing completed on 2025-06-06 08:35:11
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::SimTrackerHit> m_sim_hits_input{this};
0037 PodioOutput<edm4eic::RawTrackerHit> m_raw_hits_output{this};
0038 PodioOutput<edm4eic::MCRecoTrackerHitAssociation> m_raw_assocs_output{this};
0039
0040 ParameterRef<std::string> m_detectorName{this, "detectorName", config().detectorName, ""};
0041 ParameterRef<std::string> m_readoutClass{this, "readoutClass", config().readoutClass, ""};
0042 ParameterRef<unsigned long> m_seed{this, "seed", config().seed, "random number generator seed"};
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()
0069 .GetReadoutGeo(config().detectorName, config().readoutClass)
0070 ->SetSeed(config().seed);
0071 m_algo->SetVisitRngCellIDs(
0072 [this](std::function<void(PhotoMultiplierHitDigi::CellIDType)> lambda, float p) {
0073 m_RichGeoSvc()
0074 .GetReadoutGeo(config().detectorName, config().readoutClass)
0075 ->VisitAllRngPixels(lambda, p);
0076 });
0077 m_algo->SetPixelGapMask(
0078 [this](PhotoMultiplierHitDigi::CellIDType cellID, dd4hep::Position pos) {
0079 return m_RichGeoSvc()
0080 .GetReadoutGeo(config().detectorName, config().readoutClass)
0081 ->PixelGapMask(cellID, pos);
0082 });
0083 }
0084
0085 m_algo->applyConfig(config());
0086 m_algo->init();
0087 }
0088
0089 void ChangeRun(int32_t ) {}
0090
0091 void Process(int32_t , uint64_t ) {
0092 m_algo->process({m_sim_hits_input()}, {m_raw_hits_output().get(), m_raw_assocs_output().get()});
0093 }
0094 };
0095
0096 }