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
|
#include "DQM/HcalCommon/interface/ElectronicsMap.h"
#include <iomanip>
namespace hcaldqm {
namespace electronicsmap {
void ElectronicsMap::initialize(HcalElectronicsMap const *emap, ElectronicsMapType etype /*=fHcalElectronicsMap*/) {
_etype = etype;
_emap = emap;
// if we actually use a HashMap then
if (_etype != fHcalElectronicsMap) {
if (_etype == fD2EHashMap) {
std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
EMapType::iterator dit = _ids.find(did.rawId());
if (dit != _ids.end())
continue;
// if (!did.isHcalDetId())
// continue;
_ids.insert(std::make_pair(did.rawId(), it->rawId()));
}
} else if (_etype == fT2EHashMap) {
// HcalTrigTowerDetId -> HcalElectronicsId
std::vector<HcalTrigTowerDetId> tids = emap->allTriggerId();
for (std::vector<HcalTrigTowerDetId>::const_iterator it = tids.begin(); it != tids.end(); ++it) {
HcalElectronicsId eid = _emap->lookupTrigger(*it);
uint32_t hash = it->rawId();
EMapType::iterator eit = _ids.find(hash);
if (eit != _ids.end())
continue;
_ids.insert(std::make_pair(hash, eid.rawId()));
}
} else if (_etype == fE2DHashMap) {
// HcalElectronicId -> HcalDetId hash map
std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
uint32_t hash = it->rawId();
EMapType::iterator eit = _ids.find(hash);
if (eit != _ids.end())
continue;
// note, we have EChannel hashing here
_ids.insert(std::make_pair(hash, did.rawId()));
}
} else if (_etype == fE2THashMap) {
// HcalElectronicId -> HcalDetId hash map
std::vector<HcalElectronicsId> eids = emap->allElectronicsIdTrigger();
for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
HcalTrigTowerDetId tid = HcalTrigTowerDetId(_emap->lookupTrigger(*it));
EMapType::iterator eit = _ids.find(it->rawId());
if (eit != _ids.end())
continue;
// eid.rawId() -> tid.rawId()
_ids.insert(std::make_pair(it->rawId(), tid.rawId()));
}
}
}
}
void ElectronicsMap::initialize(HcalElectronicsMap const *emap,
ElectronicsMapType etype,
filter::HashFilter const &filter) {
_etype = etype;
_emap = emap;
// note this initialization has iteration over electronics not
// detector.
// Filtering is done on Electronics id - possible to have
// several electronics ids to 1 detid - not vice versa
if (_etype != fHcalElectronicsMap) {
if (_etype == fD2EHashMap) {
std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
if (filter.filter(*it))
continue;
// skip those that are not detid or calib ids
// if (!did.isHcalDetId())
// continue;
_ids.insert(std::make_pair(did.rawId(), it->rawId()));
}
} else if (_etype == fT2EHashMap) {
std::vector<HcalElectronicsId> eids = emap->allElectronicsIdTrigger();
for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
if (filter.filter(*it))
continue;
HcalTrigTowerDetId tid = emap->lookupTrigger(*it);
_ids.insert(std::make_pair(tid.rawId(), it->rawId()));
}
} else if (_etype == fE2DHashMap) {
std::vector<HcalElectronicsId> eids = emap->allElectronicsIdPrecision();
for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
HcalGenericDetId did = HcalGenericDetId(_emap->lookup(*it));
uint32_t hash = hashfunctions::hash_EChannel(*it);
if (filter.filter(*it))
continue;
// skip those that are not detid or calib ids
// if (!did.isHcalDetId())
// continue;
// note: use EChannel hashing here!
_ids.insert(std::make_pair(hash, did.rawId()));
}
} else if (_etype == fE2THashMap) {
std::vector<HcalElectronicsId> eids = emap->allElectronicsIdTrigger();
for (std::vector<HcalElectronicsId>::const_iterator it = eids.begin(); it != eids.end(); ++it) {
if (filter.filter(*it))
continue;
HcalTrigTowerDetId tid = emap->lookupTrigger(*it);
_ids.insert(std::make_pair(it->rawId(), tid.rawId()));
}
}
}
}
// 3 funcs below are only for 1->1 mappings
uint32_t ElectronicsMap::lookup(DetId const &id) {
uint32_t hash = id.rawId();
if (_etype == fHcalElectronicsMap)
return _emap->lookup(id).rawId();
else {
EMapType::iterator it = _ids.find(hash);
return it == _ids.end() ? 0 : it->second;
}
return 0;
}
uint32_t ElectronicsMap::lookup(HcalDetId const &id) {
// Turn the HcalDetId into a HcalGenericDetId to avoid newForm
uint32_t hash = (id.oldFormat() ? id.otherForm() : id.rawId());
HcalGenericDetId gdid(hash);
if (_etype == fHcalElectronicsMap)
return _emap->lookup(gdid).rawId();
else {
EMapType::iterator it = _ids.find(hash);
return it == _ids.end() ? 0 : it->second;
}
return 0;
}
uint32_t ElectronicsMap::lookup(HcalElectronicsId const &id) {
uint32_t hash = id.rawId();
if (_etype == fHcalElectronicsMap)
return _emap->lookup(id).rawId();
else {
EMapType::iterator it = _ids.find(hash);
return it == _ids.end() ? 0 : it->second;
}
return 0;
}
void ElectronicsMap::print() {
std::cout << "Electronics HashMap Type=" << _etype << std::endl;
for (auto const &v : _ids) {
std::cout << std::hex << v.first << " " << v.second << std::dec << std::endl;
}
}
} // namespace electronicsmap
} // namespace hcaldqm
|