1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
|
#ifndef DD_DDMapper
#define DD_DDMapper
#include <map>
#include <string>
#include <vector>
#include <iostream>
#include "DetectorDescription/Core/interface/DDsvalues.h"
template <class KeyType, class ValueType>
class DDMapper {
public:
//! usefull typedef
typedef std::pair<KeyType, ValueType> Pair;
//! usefull typedef
typedef std::vector<Pair> Vector;
//! insert a new key-value-pair
/** any existing entry will be overridden */
void insert(const KeyType &, const ValueType &);
//! removes a key-value pair
/** non-existing keys are simply ignored */
//void remove(const KeyType &);
//! removes a key-value pair
/** non-existing values are simply ignored */
//void remove(const ValueType &);
//! fetch a value given a key
/** returns true, if sucessfull - value is assigned to result; else false */
bool value(const KeyType &key, ValueType &result);
//! fetch a key given a value
//bool keys(const ValueType & value, std::vector<KeyType> & result);
//! the number of specific parameters which are named 'name'
unsigned int noSpecifics(const KeyType &key, const std::string &name) const;
//! returns the number specific parameters named 'name' and the corrsponding double
/** of the DDLogicalPart which corresponds to the given KeyType key. The returned value
is assigned to the 'value'-reference
- if no parameters exist, 0 is returned and value is left unchanged
- if more than one parameter with the given name exists, the first is returned by default,
alternatively 'pos' can be used to address another value (note: pos=0 -> first value) */
unsigned int toDouble(const std::string &name, const KeyType &key, double &value, unsigned int pos = 0) const;
//! same as toDouble but for std::string-valued values of named parameters
unsigned int toString(const std::string &name, const KeyType &key, std::string &value, unsigned int pos = 0) const;
unsigned int toDouble(const std::string &name, const ValueType &key, double &value, unsigned int pos = 0) const;
//! same as toDouble but for std::string-valued values of named parameters
unsigned int toString(const std::string &name, const ValueType &key, std::string &value, unsigned int pos = 0) const;
//! get all std::mapped instances which have a specific 'name' with value 'value'
Vector all(const std::string &name, const std::string &value) const;
//! get all std::mapped instances which have a specific 'name' with value 'value'
Vector all(const std::string &name, const double &value) const;
//! get all std::mapped instances which have a specific 'name'
Vector all(const std::string &name) const;
private:
std::map<KeyType, ValueType> keyToValue_;
std::multimap<ValueType, KeyType> valueToKey_;
};
template <class K, class V>
void DDMapper<K, V>::insert(const K &key, const V &value) {
keyToValue_[key] = value;
valueToKey_.insert(std::make_pair(value, key));
// valueToKey_[value] = key;
}
template <class K, class V>
bool DDMapper<K, V>::value(const K &key, V &value) {
bool result = false;
typename std::map<K, V>::const_iterator it = keyToValue_.find(key);
if (it != keyToValue_.end()) {
value = it->second;
result = true;
}
return result;
}
template <class K, class V>
unsigned int DDMapper<K, V>::noSpecifics(const K &key, const std::string &name) const {
typedef std::vector<const DDsvalues_type *> sv_type;
unsigned int result = 0;
typename std::map<K, V>::const_iterator it = keyToValue_.find(key);
if (it != keyToValue_.end()) {
sv_type sv = it->second.specifics();
sv_type::const_iterator it = sv.begin();
DDValue v(name);
for (; it != sv.end(); ++it) {
if (DDfetch(*it, v)) {
result += v.size();
}
}
}
return result;
}
// to be fast, we will only return the first specific found matching the given name
template <class K, class V>
unsigned int DDMapper<K, V>::toDouble(const std::string &name, const K &key, double &value, unsigned int pos) const {
typedef std::vector<const DDsvalues_type *> sv_type;
unsigned int result = 0;
typename std::map<K, V>::const_iterator it = keyToValue_.find(key);
if (it != keyToValue_.end()) {
sv_type sv = it->second.specifics();
sv_type::const_iterator svIt = sv.begin();
sv_type::const_iterator svEd = sv.end();
DDValue v(name);
for (; svIt != svEd; ++svIt) {
if (DDfetch(*svIt, v)) {
result = v.size();
value = v.doubles()[pos];
break;
}
}
}
return result;
}
template <class K, class V>
unsigned int DDMapper<K, V>::toDouble(const std::string &name, const V &val, double &value, unsigned int pos) const {
typedef std::vector<const DDsvalues_type *> sv_type;
unsigned int result = 0;
sv_type sv = val.specifics();
sv_type::const_iterator svIt = sv.begin();
sv_type::const_iterator svEd = sv.end();
DDValue v(name);
for (; svIt != svEd; ++svIt) {
if (DDfetch(*svIt, v)) {
result = v.size();
value = v.doubles()[pos];
break;
}
}
return result;
}
template <class K, class V>
unsigned int DDMapper<K, V>::toString(const std::string &name,
const V &val,
std::string &value,
unsigned int pos) const {
typedef std::vector<const DDsvalues_type *> sv_type;
unsigned int result = 0;
sv_type sv = val.specifics();
sv_type::const_iterator svIt = sv.begin();
sv_type::const_iterator svEd = sv.end();
DDValue v(name);
for (; svIt != svEd; ++svIt) {
if (DDfetch(*svIt, v)) {
result = v.size();
value = v.strings()[pos];
break;
}
}
return result;
}
// to be fast, we will only return the first specific found matcing the given name
template <class K, class V>
unsigned int DDMapper<K, V>::toString(const std::string &name,
const K &key,
std::string &value,
unsigned int pos) const {
typedef std::vector<const DDsvalues_type *> sv_type;
unsigned int result = 0;
typename std::map<K, V>::const_iterator it = keyToValue_.find(key);
if (it != keyToValue_.end()) {
sv_type sv = it->second.specifics();
sv_type::const_iterator svIt = sv.begin();
sv_type::const_iterator svEd = sv.end();
DDValue v(name);
//std::cout << "DDValue=" << name << std::endl;
for (; svIt != svEd; ++svIt) {
//std::cout << "looping..." << **svIt << std::endl;
if (DDfetch(*svIt, v)) {
result = v.size();
//std::cout << "found!" << std::endl;
value = v.strings()[pos];
break;
}
}
}
return result;
}
template <class K, class V>
std::vector<std::pair<K, V> > DDMapper<K, V>::all(const std::string &name, const std::string &value) const {
std::vector<std::pair<K, V> > result;
typedef std::vector<const DDsvalues_type *> sv_type;
typename std::map<V, K>::const_iterator it = valueToKey_.begin();
typename std::map<V, K>::const_iterator ed = valueToKey_.end();
// loop over all registered ValueTypes
for (; it != ed; ++it) {
sv_type sv = it->first.specifics();
//std::cout << "now at: " << it->first.name() << std::endl;
sv_type::const_iterator svIt = sv.begin();
sv_type::const_iterator svEd = sv.end();
DDValue v(name);
for (; svIt != svEd; ++svIt) {
if (DDfetch(*svIt, v)) {
//std::cout << "found: ";
const std::vector<std::string> &s = v.strings();
if (!s.empty()) {
//std::cout << s[0];
if (s[0] == value) {
result.emplace_back(std::make_pair(it->second, it->first));
break;
}
}
//std::cout << std::endl;
}
}
}
return result;
}
template <class K, class V>
std::vector<std::pair<K, V> > DDMapper<K, V>::all(const std::string &name, const double &value) const {
std::vector<std::pair<K, V> > result;
typedef std::vector<const DDsvalues_type *> sv_type;
typename std::map<V, K>::const_iterator it = valueToKey_.begin();
typename std::map<V, K>::const_iterator ed = valueToKey_.end();
// loop over all registered ValueTypes
for (; it != ed; ++it) {
sv_type sv = it->first.specifics();
//std::cout << "now at: " << it->first.name() << std::endl;
sv_type::const_iterator svIt = sv.begin();
sv_type::const_iterator svEd = sv.end();
DDValue v(name);
for (; svIt != svEd; ++svIt) {
if (DDfetch(*svIt, v)) {
//std::cout << "found: ";
const std::vector<double> &s = v.doubles();
if (!s.empty()) {
//std::cout << s[0];
if (s[0] == value) {
result.emplace_back(std::make_pair(it->second, it->first));
break;
}
}
//std::cout << std::endl;
}
}
}
return result;
}
template <class K, class V>
std::vector<std::pair<K, V> > DDMapper<K, V>::all(const std::string &name) const {
std::vector<std::pair<K, V> > result;
typedef std::vector<const DDsvalues_type *> sv_type;
typename std::map<V, K>::const_iterator it = valueToKey_.begin();
typename std::map<V, K>::const_iterator ed = valueToKey_.end();
// loop over all registered ValueTypes
for (; it != ed; ++it) {
sv_type sv = it->first.specifics();
//std::cout << "now at: " << it->first.name() << std::endl;
sv_type::const_iterator svIt = sv.begin();
sv_type::const_iterator svEd = sv.end();
DDValue v(name);
for (; svIt != svEd; ++svIt) {
if (DDfetch(*svIt, v)) {
result.emplace_back(std::make_pair(it->second, it->first));
break;
}
}
}
return result;
}
#endif
|