File indexing completed on 2025-02-21 09:58:00
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef DD4HEP_DETECTORPROCESSOR_H
0014 #define DD4HEP_DETECTORPROCESSOR_H
0015
0016
0017 #include <DD4hep/DetElement.h>
0018
0019
0020 #include <memory>
0021
0022
0023 namespace dd4hep {
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 class DetectorProcessor {
0037 public:
0038
0039 DetectorProcessor() = default;
0040
0041 DetectorProcessor(DetectorProcessor&& copy) = default;
0042
0043 DetectorProcessor(const DetectorProcessor& copy) = default;
0044
0045 virtual ~DetectorProcessor();
0046
0047 DetectorProcessor& operator=(const DetectorProcessor& copy) = default;
0048
0049 virtual int operator()(DetElement de, int level) const = 0;
0050
0051 virtual int process(DetElement de, int level, bool recursive) const;
0052 };
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 template <typename T> class DetElementProcessor : virtual public DetectorProcessor {
0065 public:
0066
0067 T& processor;
0068 public:
0069
0070 DetElementProcessor() = delete;
0071
0072 DetElementProcessor(T& p) : processor(p) {}
0073
0074 DetElementProcessor(T&& p) = delete;
0075
0076 DetElementProcessor(DetElementProcessor&& copy) = default;
0077
0078 DetElementProcessor(const DetElementProcessor& copy) = default;
0079
0080 virtual ~DetElementProcessor() = default;
0081
0082 DetElementProcessor& operator=(const DetElementProcessor& copy) = default;
0083
0084 virtual int operator()(DetElement de, int level) const final
0085 { return (processor)(de, level); }
0086 };
0087
0088
0089 template <typename T> inline
0090 DetElementProcessor<typename std::remove_reference<T>::type> detectorProcessor(T&& proc)
0091 { return DetElementProcessor<typename std::remove_reference<T>::type>(std::forward<T>(proc)); }
0092
0093
0094
0095
0096
0097
0098
0099
0100 template <typename T> class DetectorProcessorShared : public DetectorProcessor {
0101 public:
0102
0103 std::shared_ptr<T> processor;
0104 public:
0105
0106 DetectorProcessorShared() = delete;
0107
0108 DetectorProcessorShared(std::shared_ptr<T>& p) : processor(p) {}
0109
0110 DetectorProcessorShared(const DetectorProcessorShared& copy) = default;
0111
0112 virtual ~DetectorProcessorShared() = default;
0113
0114 DetectorProcessorShared& operator=(const DetectorProcessorShared& copy) = default;
0115
0116 virtual int operator()(DetElement de, int level) const final
0117 { return (*processor)(de, level); }
0118 };
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 template <typename T> class DetElementsCollector {
0130 public:
0131
0132 T& elements;
0133 public:
0134
0135 DetElementsCollector(T& d) : elements(d) {}
0136
0137 DetElementsCollector(T&& p) = delete;
0138
0139 DetElementsCollector(DetElementsCollector&& copy) = default;
0140
0141 DetElementsCollector(const DetElementsCollector& copy) = default;
0142
0143 ~DetElementsCollector() = default;
0144
0145 DetElementsCollector& operator=(const DetElementsCollector& copy) = default;
0146
0147
0148
0149
0150
0151
0152 virtual int operator()(DetElement de, int level) const final;
0153 };
0154
0155
0156 template <typename T> inline
0157 DetElementsCollector<typename std::remove_reference<T>::type> detElementsCollector(T&& container)
0158 { return DetElementsCollector<typename std::remove_reference<T>::type>(container); }
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173 class DetectorScanner {
0174 public:
0175
0176 DetectorScanner() = default;
0177
0178 DetectorScanner(const DetectorScanner& copy) = default;
0179
0180 DetectorScanner& operator=(const DetectorScanner& copy) = default;
0181
0182
0183 template <typename Q>
0184 DetectorScanner(Q& proc, DetElement start, int level=0, bool recursive=true)
0185 { scan(proc, start, level, recursive); }
0186
0187
0188 template <typename Q>
0189 DetectorScanner(const Q& proc, DetElement start, int level=0, bool recursive=true)
0190 { scan(proc, start, level, recursive); }
0191
0192
0193 template <typename Q>
0194 int scan(Q& p, DetElement start, int level=0, bool recursive=true) const {
0195 auto proc = detectorProcessor(p);
0196 return proc.process(start, level, recursive);
0197 }
0198
0199
0200 template <typename Q>
0201 int scan(const Q& p, DetElement start, int level=0, bool recursive=true) const {
0202 auto proc = detectorProcessor(p);
0203 return proc.process(start, level, recursive);
0204 }
0205 };
0206 }
0207 #endif