File indexing completed on 2024-09-27 07:03:06
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 private:
0033 std::unique_ptr<AlgoT> m_algo;
0034
0035 PodioInput<edm4hep::SimTrackerHit> m_sim_hits_input {this};
0036 PodioOutput<edm4eic::RawTrackerHit> m_raw_hits_output {this};
0037 PodioOutput<edm4eic::MCRecoTrackerHitAssociation> m_raw_assocs_output {this};
0038
0039 ParameterRef<unsigned long> m_seed {this, "seed", config().seed, "random number generator seed"};
0040 ParameterRef<double> m_hitTimeWindow {this, "hitTimeWindow", config().hitTimeWindow, ""};
0041 ParameterRef<double> m_timeResolution {this, "timeResolution", config().timeResolution, ""};
0042 ParameterRef<double> m_speMean {this, "speMean", config().speMean, ""};
0043 ParameterRef<double> m_speError {this, "speError", config().speError, ""};
0044 ParameterRef<double> m_pedMean {this, "pedMean", config().pedMean, ""};
0045 ParameterRef<double> m_pedError {this, "pedError", config().pedError, ""};
0046 ParameterRef<bool> m_enablePixelGaps {this, "enablePixelGaps", config().enablePixelGaps, "enable/disable removal of hits in gaps between pixels"};
0047 ParameterRef<double> m_safetyFactor {this, "safetyFactor", config().safetyFactor, "overall safety factor"};
0048 ParameterRef<bool> m_enableNoise {this, "enableNoise", config().enableNoise, ""};
0049 ParameterRef<double> m_noiseRate {this, "noiseRate", config().noiseRate, ""};
0050 ParameterRef<double> m_noiseTimeWindow {this, "noiseTimeWindow", config().noiseTimeWindow, ""};
0051
0052
0053 Service<AlgorithmsInit_service> m_algorithmsInit {this};
0054 Service<RichGeo_service> m_RichGeoSvc {this};
0055
0056 public:
0057 void Configure() {
0058 m_algo = std::make_unique<AlgoT>(GetPrefix());
0059 m_algo->level(static_cast<algorithms::LogLevel>(logger()->level()));
0060
0061
0062 if (GetPluginName() == "DRICH" || GetPluginName() == "PFRICH") {
0063 m_RichGeoSvc().GetReadoutGeo(GetPluginName())->SetSeed(config().seed);
0064 m_algo->SetVisitRngCellIDs(
0065 [this] (std::function<void(PhotoMultiplierHitDigi::CellIDType)> lambda, float p) { m_RichGeoSvc().GetReadoutGeo(GetPluginName())->VisitAllRngPixels(lambda, p); }
0066 );
0067 m_algo->SetPixelGapMask(
0068 [this] (PhotoMultiplierHitDigi::CellIDType cellID, dd4hep::Position pos) { return m_RichGeoSvc().GetReadoutGeo(GetPluginName())->PixelGapMask(cellID, pos); }
0069 );
0070 }
0071
0072 m_algo->applyConfig(config());
0073 m_algo->init();
0074 }
0075
0076 void ChangeRun(int64_t run_number) {
0077 }
0078
0079 void Process(int64_t run_number, uint64_t event_number) {
0080 m_algo->process({m_sim_hits_input()},
0081 {m_raw_hits_output().get(), m_raw_assocs_output().get()});
0082 }
0083 };
0084
0085 }