File indexing completed on 2024-09-27 07:03:08
0001
0002
0003
0004 #include <DD4hep/Detector.h> // for Detector
0005 #include <DD4hep/IDDescriptor.h> // for IDDescriptor
0006 #include <DD4hep/Readout.h> // for Readout
0007 #include <Evaluator/DD4hepUnits.h> // for MeV, mm, keV, ns
0008 #include <algorithms/geo.h>
0009 #include <catch2/catch_test_macros.hpp> // for AssertionHandler, operator""_catch_sr, StringRef, REQUIRE, operator<, operator==, operator>, TEST_CASE
0010 #include <edm4eic/CalorimeterHitCollection.h> // for CalorimeterHitCollection, MutableCalorimeterHit, CalorimeterHitMutableCollectionIterator
0011 #include <edm4hep/Vector3f.h> // for Vector3f
0012 #include <spdlog/common.h> // for level_enum
0013 #include <spdlog/logger.h> // for logger
0014 #include <spdlog/spdlog.h> // for default_logger
0015 #include <stddef.h> // for size_t
0016 #include <array> // for array
0017 #include <cmath> // for sqrt, abs
0018 #include <gsl/pointers>
0019 #include <memory> // for allocator, unique_ptr, make_unique, shared_ptr, __shared_ptr_access
0020 #include <utility> // for pair
0021
0022 #include "algorithms/calorimetry/HEXPLIT.h" // for HEXPLIT
0023 #include "algorithms/calorimetry/HEXPLITConfig.h" // for HEXPLITConfig
0024
0025 using eicrecon::HEXPLIT;
0026 using eicrecon::HEXPLITConfig;
0027
0028 TEST_CASE( "the subcell-splitting algorithm runs", "[HEXPLIT]" ) {
0029 HEXPLIT algo("HEXPLIT");
0030
0031 std::shared_ptr<spdlog::logger> logger = spdlog::default_logger()->clone("HEXPLIT");
0032 logger->set_level(spdlog::level::trace);
0033
0034 HEXPLITConfig cfg;
0035 cfg.MIP = 472. * dd4hep::keV;
0036 cfg.tmax = 1000. * dd4hep::ns;
0037
0038 auto detector = algorithms::GeoSvc::instance().detector();
0039 auto id_desc = detector->readout("MockCalorimeterHits").idSpec();
0040
0041
0042 double side_length=31.3*dd4hep::mm;
0043 double layer_spacing=25.1*dd4hep::mm;
0044 double thickness=3*dd4hep::mm;
0045
0046
0047 auto dimension = edm4hep::Vector3f(2*side_length, sqrt(3)*side_length, thickness);
0048
0049 algo.applyConfig(cfg);
0050 algo.init();
0051
0052 edm4eic::CalorimeterHitCollection hits_coll;
0053
0054
0055
0056 std::array<double,5> layer={0,1,2,3,4};
0057 std::array<double,5> x={0,0.75*side_length,0,0.75*side_length,0};
0058 std::array<double,5> y={sqrt(3)/2*side_length,-0.25*sqrt(3)*side_length,0,0.25*sqrt(3)*side_length,sqrt(3)/2*side_length};
0059 std::array<double,5> E={50*dd4hep::MeV,50*dd4hep::MeV,50*dd4hep::MeV,50*dd4hep::MeV,50*dd4hep::MeV};
0060 for(size_t i=0; i<5; i++){
0061 hits_coll.create(
0062 id_desc.encode({{"system", 255}, {"x", 0}, {"y", 0}}),
0063 E[i],
0064 0.0,
0065 0.0,
0066 0.0,
0067 edm4hep::Vector3f(x[i], y[i], layer[i]*layer_spacing),
0068 dimension,
0069 0,
0070 layer[i],
0071 edm4hep::Vector3f(x[i], y[i], layer[i]*layer_spacing)
0072 );
0073 }
0074
0075 auto subcellhits_coll = std::make_unique<edm4eic::CalorimeterHitCollection>();
0076 algo.process({&hits_coll}, {subcellhits_coll.get()});
0077
0078
0079
0080
0081 REQUIRE( (*subcellhits_coll).size() == 60);
0082
0083
0084 double tol=0.001;
0085 double Esum=0;
0086 int i=0;
0087 for (auto subcell : *subcellhits_coll){
0088 Esum+=subcell.getEnergy();
0089 i++;
0090 if (i%12==0){
0091 REQUIRE(abs(Esum-E[i/12-1])/E[i/12-1]<tol);
0092 Esum=0;
0093 }
0094 }
0095
0096
0097 REQUIRE((*subcellhits_coll)[35].getEnergy()/E[2]>0.95);
0098
0099
0100 }