6#include <algorithms/geo.h>
14template <
auto... MemberFunctionPtrs>
struct Chain {};
22template <auto MemberFunctionPtr>
struct ChainInvoker<MemberFunctionPtr> {
23 template <
typename T>
static auto invoke(T& instance) {
return (instance.*MemberFunctionPtr)(); }
27template <
auto FirstMemberFunctionPtr,
auto... RestMemberFunctionPtrs>
28struct ChainInvoker<FirstMemberFunctionPtr, RestMemberFunctionPtrs...> {
29 template <
typename T>
static auto invoke(T& instance) {
30 auto nested = (instance.*FirstMemberFunctionPtr)();
41template <
auto... MemberFunctionPtrs>
class RangeSplit<
Chain<MemberFunctionPtrs...>> {
43 RangeSplit(std::vector<std::pair<double, double>> ranges) : m_ranges(ranges) {};
45 template <
typename T> std::vector<int>
operator()(T& instance)
const {
49 for (std::size_t i = 0; i < m_ranges.size(); i++) {
50 if (value > m_ranges[i].first && value < m_ranges[i].second) {
58 std::vector<std::pair<double, double>> m_ranges;
66 GeometrySplit(std::vector<std::vector<long int>> ids, std::string readout,
67 std::vector<std::string> divisions)
69 , m_divisions(divisions)
71 , is_init(
std::make_shared<
std::once_flag>())
72 , m_id_dec(
std::make_shared<
dd4hep::DDSegmentation::BitFieldCoder*>())
73 , m_div_ids(
std::make_shared<
std::vector<
std::size_t>>()) {};
75 template <
typename T> std::vector<int>
operator()(T& instance)
const {
78 std::call_once(*is_init, &GeometrySplit::init,
this);
81 auto cellID = instance.getCellID();
82 std::vector<long int> det_ids;
83 for (
auto d : *m_div_ids) {
84 det_ids.push_back((*m_id_dec)->get(cellID, d));
87 auto index = std::find(m_ids.begin(), m_ids.end(), det_ids);
90 if (index != m_ids.end()) {
91 ids.push_back(std::distance(m_ids.begin(), index));
98 *m_id_dec = algorithms::GeoSvc::instance().detector()->readout(m_readout).idSpec().decoder();
99 for (
auto d : m_divisions) {
100 m_div_ids->push_back((*m_id_dec)->index(d));
104 std::vector<std::vector<long int>> m_ids;
105 std::vector<std::string> m_divisions;
106 std::string m_readout;
108 std::shared_ptr<std::once_flag> is_init;
109 std::shared_ptr<dd4hep::DDSegmentation::BitFieldCoder*> m_id_dec;
110 std::shared_ptr<std::vector<std::size_t>> m_div_ids;
118 ValueSplit(std::vector<std::vector<int>> ids) : m_ids(ids) {};
120 template <
typename T> std::vector<int>
operator()(T& instance)
const {
121 std::vector<int> ids;
123 std::vector<int> values;
124 (values.push_back((instance.*MemberFunctionPtrs)()), ...);
125 auto index = std::find(m_ids.begin(), m_ids.end(), values);
126 if (index != m_ids.end()) {
127 ids.push_back(std::distance(m_ids.begin(), index));
133 std::vector<std::vector<int>> m_ids;
Definition SubDivideFunctors.h:64
GeometrySplit(std::vector< std::vector< long int > > ids, std::string readout, std::vector< std::string > divisions)
Definition SubDivideFunctors.h:66
std::vector< int > operator()(T &instance) const
Definition SubDivideFunctors.h:75
std::vector< int > operator()(T &instance) const
Definition SubDivideFunctors.h:45
RangeSplit(std::vector< std::pair< double, double > > ranges)
Definition SubDivideFunctors.h:43
Definition SubDivideFunctors.h:38
Definition SubDivideFunctors.h:116
std::vector< int > operator()(T &instance) const
Definition SubDivideFunctors.h:120
ValueSplit(std::vector< std::vector< int > > ids)
Definition SubDivideFunctors.h:118
Definition ActsGeometryProvider.h:28
-client
Definition CalorimeterClusterRecoCoG.cc:37
Definition SimCalorimeterHitProcessor.cc:35
static auto invoke(T &instance)
Definition SubDivideFunctors.h:29
static auto invoke(T &instance)
Definition SubDivideFunctors.h:23
Definition SubDivideFunctors.h:19
Definition SubDivideFunctors.h:14