File indexing completed on 2025-02-21 09:57:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef DD4HEP_ALIGNMENTSCALCULATOR_H
0014 #define DD4HEP_ALIGNMENTSCALCULATOR_H
0015
0016
0017 #include <DD4hep/Alignments.h>
0018 #include <DD4hep/AlignmentData.h>
0019 #include <DD4hep/ConditionsMap.h>
0020
0021
0022 namespace dd4hep {
0023
0024
0025 namespace cond { class ConditionUpdateContext; }
0026
0027
0028 namespace align {
0029
0030
0031
0032
0033
0034
0035
0036 class AlignmentsCalculator {
0037 public:
0038
0039
0040
0041
0042
0043
0044
0045 class Result {
0046 public:
0047 size_t computed = 0;
0048 size_t missing = 0;
0049 size_t multiply = 0;
0050 Result() = default;
0051
0052 Result(const Result& result) = default;
0053
0054 Result& operator =(const Result& result) = default;
0055
0056 Result& operator +=(const Result& result);
0057
0058 Result& operator -=(const Result& result);
0059
0060 size_t total() const { return computed+missing; }
0061 };
0062
0063
0064
0065
0066
0067
0068
0069 class PathOrdering {
0070 public:
0071 bool operator()(const DetElement& a, const DetElement& b) const
0072 { return a.path() < b.path(); }
0073 };
0074
0075 typedef std::map<DetElement,const Delta*,PathOrdering> OrderedDeltas;
0076 typedef std::map<Condition::key_type,DetElement> ExtractContext;
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 class Scanner {
0098 public:
0099
0100 cond::ConditionUpdateContext& context;
0101
0102 OrderedDeltas& deltas;
0103
0104 IOV* iov = 0;
0105 public:
0106
0107 Scanner() = delete;
0108
0109 Scanner(cond::ConditionUpdateContext& m, OrderedDeltas& d) : context(m), deltas(d) {}
0110
0111 Scanner(cond::ConditionUpdateContext& m, OrderedDeltas& d, IOV* i) : context(m), deltas(d), iov(i) {}
0112
0113 Scanner(cond::ConditionUpdateContext& m, OrderedDeltas&& p) = delete;
0114
0115 Scanner(Scanner&& copy) = delete;
0116
0117 Scanner(const Scanner& copy) = delete;
0118
0119 ~Scanner() = default;
0120
0121 Scanner& operator=(Scanner&& copy) = delete;
0122
0123 Scanner& operator=(const Scanner& copy) = delete;
0124
0125 int operator()(DetElement de, int) const;
0126 };
0127
0128 public:
0129
0130
0131 AlignmentsCalculator() = default;
0132
0133 AlignmentsCalculator(const AlignmentsCalculator& copy) = delete;
0134
0135 AlignmentsCalculator& operator=(const AlignmentsCalculator& mgr) = delete;
0136
0137 Result compute(const std::map<DetElement, Delta>& deltas,
0138 ConditionsMap& alignments) const;
0139
0140 Result compute(const std::map<DetElement, const Delta*>& deltas,
0141 ConditionsMap& alignments) const;
0142
0143 Result compute(const OrderedDeltas& deltas, ConditionsMap& alignments) const;
0144
0145
0146 size_t extract_deltas(cond::ConditionUpdateContext& context,
0147 OrderedDeltas& deltas,
0148 IOV* effective_iov=0) const;
0149
0150 size_t extract_deltas(DetElement start,
0151 cond::ConditionUpdateContext& ctxt,
0152 OrderedDeltas& deltas,
0153 IOV* effective_iov=0) const;
0154
0155
0156
0157
0158
0159
0160
0161 size_t extract_deltas(cond::ConditionUpdateContext& context,
0162 ExtractContext& extract_context,
0163 OrderedDeltas& deltas,
0164 IOV* effective_iov=0) const;
0165
0166
0167
0168
0169
0170 size_t extract_deltas(DetElement start,
0171 cond::ConditionUpdateContext& ctxt,
0172 ExtractContext& extract_context,
0173 OrderedDeltas& deltas,
0174 IOV* effective_iov=0) const;
0175 };
0176
0177
0178 inline AlignmentsCalculator::Result&
0179 AlignmentsCalculator::Result::operator +=(const Result& result) {
0180 multiply += result.multiply;
0181 computed += result.computed;
0182 missing += result.missing;
0183 return *this;
0184 }
0185
0186 inline AlignmentsCalculator::Result&
0187 AlignmentsCalculator::Result::operator -=(const Result& result) {
0188 multiply -= result.multiply;
0189 computed -= result.computed;
0190 missing -= result.missing;
0191 return *this;
0192 }
0193
0194 }
0195 }
0196 #endif