Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-09-27 07:03:06

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 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     //ParameterRef<std::vector<std::pair<double, double>>> m_quantumEfficiency {this, "quantumEfficiency", config().quantumEfficiency, ""};
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         // Initialize richgeo ReadoutGeo and set random CellID visitor lambda (if a RICH)
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 } // eicrecon