Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-06-06 08:35:11

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022, 2023, Christopher Dilks
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 // algorithms
0015 #include "algorithms/digi/PhotoMultiplierHitDigi.h"
0016 #include "algorithms/digi/PhotoMultiplierHitDigiConfig.h"
0017 // JANA
0018 #include "extensions/jana/JOmniFactory.h"
0019 // services
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   //ParameterRef<std::vector<std::pair<double, double>>> m_quantumEfficiency {this, "quantumEfficiency", config().quantumEfficiency, ""};
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     // Initialize richgeo ReadoutGeo and set random CellID visitor lambda (if a RICH)
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 /* run_number */) {}
0090 
0091   void Process(int32_t /* run_number */, uint64_t /* event_number */) {
0092     m_algo->process({m_sim_hits_input()}, {m_raw_hits_output().get(), m_raw_assocs_output().get()});
0093   }
0094 };
0095 
0096 } // namespace eicrecon