diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 444fe93852e62e35724916b54687edb00ecc16fd..56422570f04ef7c20dab511f80fdf505cc32e838 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,18 +12,18 @@ stages: compile: stage: build tags: - - sodium + - silicon before_script: - pwd && ls -lrth script: - export homedir=$(pwd) && pwd && cd /tmp && git clone --depth=1 https://eicweb.phy.anl.gov/EIC/NPDet.git && mkdir build && cd build && cmake ../NPDet/. && make -j20 install - cd /tmp && git clone --depth=1 https://eicweb.phy.anl.gov/EIC/eicd.git && mkdir eicd_build && cd eicd_build && cmake ../eicd/. && make -j20 install - - cd $homedir && ls -lrth && mkdir build && cd build && cmake .. && make -j 20 + - cd $homedir && ls -lrth && mkdir build && cd build && cmake .. && make -j10 run_example: stage: run tags: - - sodium + - silicon script: - ./build/run gaudirun.py Examples/options/hello_world.py @@ -31,6 +31,6 @@ run_example2: image: eicweb.phy.anl.gov:4567/eic/npdet/npdet:latest stage: run tags: - - sodium + - silicon script: - ./build/run gaudirun.py JugBase/tests/options/simple_reader.py diff --git a/JugDigi/src/components/HadronicCalDigi.cpp b/JugDigi/src/components/HadronicCalDigi.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9d08d5bb5e71e5e379e663be92a7c50f81aae9e7 --- /dev/null +++ b/JugDigi/src/components/HadronicCalDigi.cpp @@ -0,0 +1,88 @@ +#include <algorithm> + +#include "GaudiAlg/Transformer.h" +#include "GaudiAlg/Producer.h" +#include "GaudiAlg/GaudiTool.h" +#include "GaudiKernel/RndmGenerators.h" +#include "Gaudi/Property.h" + +// FCCSW +#include "JugBase/DataHandle.h" + +// Event Model related classes +#include "eicd/RawCalorimeterHitCollection.h" +#include "eicd/RawCalorimeterHitData.h" +#include "dd4pod/CalorimeterHitCollection.h" + +namespace Jug { + namespace Digi { + + /** Hadronic Calorimeter Digitization. + * + * \f$ \sigma/E = a/\sqrt{E} \oplus b \f$ + * + * \param a stochastic term (0.5 is 50%) + * \param b constant term (0.05 is 5%) + * + * Resolution terms are added in quadrature. + * When digitizing they are assumed to be independent random variables and are sampled as such. + * + * + */ + class HadronicCalDigi : public GaudiAlgorithm { + public: + Gaudi::Property<double> m_energyResolution_a{this, "energyResolution_a", 0.5 /*50 percent*/}; + Gaudi::Property<double> m_energyResolution_b{this, "energyResolution_b", 0.05 /* 5 percent*/}; + Rndm::Numbers m_gaussDist_a; + Rndm::Numbers m_gaussDist_b; + DataHandle<dd4pod::CalorimeterHitCollection> m_inputHitCollection{"inputHitCollection", Gaudi::DataHandle::Reader, + this}; + DataHandle<eic::RawCalorimeterHitCollection> m_outputHitCollection{"outputHitCollection", + Gaudi::DataHandle::Writer, this}; + + public: + HadronicCalDigi(const std::string& name, ISvcLocator* svcLoc) : GaudiAlgorithm(name, svcLoc) { + declareProperty("inputHitCollection", m_inputHitCollection, ""); + declareProperty("outputHitCollection", m_outputHitCollection, ""); + } + + StatusCode initialize() override { + IRndmGenSvc* randSvc = svc<IRndmGenSvc>("RndmGenSvc", true); + StatusCode sc = m_gaussDist_a.initialize(randSvc, Rndm::Gauss(0.0, m_energyResolution_a.value() )); + if (!sc.isSuccess()) { + return StatusCode::FAILURE; + } + sc = m_gaussDist_b.initialize(randSvc, Rndm::Gauss(0.0, m_energyResolution_b.value())); + if (!sc.isSuccess()) { + return StatusCode::FAILURE; + } + if (GaudiAlgorithm::initialize().isFailure()) + return StatusCode::FAILURE; + // f_counter = m_starting_value.value(); + return StatusCode::SUCCESS; + } + + StatusCode execute() override { + // input collection + const dd4pod::CalorimeterHitCollection* simhits = m_inputHitCollection.get(); + // Create output collections + auto rawhits = m_outputHitCollection.createAndPut(); + eic::RawCalorimeterHitCollection* rawHitCollection = new eic::RawCalorimeterHitCollection(); + for (const auto& ahit : *simhits) { + // std::cout << ahit << "\n"; + double sqrtE = std::sqrt(ahit.energyDeposit()) ; + double aterm = m_gaussDist_a()*sqrtE; + double bterm = ahit.energyDeposit()*m_gaussDist_b(); + // here 1000 is arbitrary scale factor + eic::RawCalorimeterHit rawhit((long long)ahit.cellID(), (long long)ahit.cellID(), + (long long)(ahit.energyDeposit() +aterm + bterm) * 1000, 0); + rawhits->push_back(rawhit); + } + return StatusCode::SUCCESS; + } + }; + DECLARE_COMPONENT(HadronicCalDigi) + + } // namespace Digi +} // namespace Jug +