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
|
/**
* \file TkModuleGroupSelector.cc
*
* \author Joerg Behr
* \date May 2013
* $Revision: 1.5 $
* $Date: 2013/06/19 08:33:03 $
* (last update by $Author: jbehr $)
*/
#include "Alignment/CommonAlignmentAlgorithm/interface/TkModuleGroupSelector.h"
#include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterSelector.h"
#include "Alignment/CommonAlignment/interface/Alignable.h"
#include "DataFormats/DetId/interface/DetId.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <vector>
#include <map>
#include <set>
//============================================================================
TkModuleGroupSelector::TkModuleGroupSelector(AlignableTracker *aliTracker,
const edm::ParameterSet &cfg,
const std::vector<int> &sdets)
: nparameters_(0), subdetids_(sdets) {
//verify that all provided options are known
std::vector<std::string> parameterNames = cfg.getParameterNames();
for (std::vector<std::string>::const_iterator iParam = parameterNames.begin(); iParam != parameterNames.end();
++iParam) {
const std::string &name = (*iParam);
if (name != "RunRange" && name != "ReferenceRun" && name != "Granularity") {
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector::TkModuleGroupSelector:"
<< " Unknown parameter name '" << name << "' in PSet. Maybe a typo?";
}
}
//extract the reference run range if defined
const edm::RunNumber_t defaultReferenceRun =
(cfg.exists("ReferenceRun") ? cfg.getParameter<edm::RunNumber_t>("ReferenceRun") : 0);
//extract run range to be used for all module groups (if not locally overwritten)
const std::vector<edm::RunNumber_t> defaultRunRange =
(cfg.exists("RunRange") ? cfg.getParameter<std::vector<edm::RunNumber_t> >("RunRange")
: std::vector<edm::RunNumber_t>());
// finally create everything from configuration
this->createModuleGroups(
aliTracker, cfg.getParameter<edm::VParameterSet>("Granularity"), defaultRunRange, defaultReferenceRun);
}
//============================================================================
void TkModuleGroupSelector::fillDetIdMap(const unsigned int detid, const unsigned int groupid) {
//only add new entries
if (mapDetIdGroupId_.find(detid) == mapDetIdGroupId_.end()) {
mapDetIdGroupId_.insert(std::pair<unsigned int, unsigned int>(detid, groupid));
} else {
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector:fillDetIdMap:"
<< " Module with det ID " << detid << " configured in group " << groupid
<< " but it was already selected"
<< " in group " << mapDetIdGroupId_[detid] << ".";
}
}
//============================================================================
const bool TkModuleGroupSelector::testSplitOption(const edm::ParameterSet &pset) const {
bool split = false;
if (pset.exists("split")) {
split = pset.getParameter<bool>("split");
}
return split;
}
//============================================================================
bool TkModuleGroupSelector::createGroup(unsigned int &Id,
const std::vector<edm::RunNumber_t> &range,
const std::list<Alignable *> &selected_alis,
const edm::RunNumber_t refrun) {
bool modules_selected = false;
referenceRun_.push_back(refrun);
firstId_.push_back(Id);
runRange_.push_back(range);
for (std::list<Alignable *>::const_iterator it = selected_alis.begin(); it != selected_alis.end(); ++it) {
this->fillDetIdMap((*it)->id(), firstId_.size() - 1);
modules_selected = true;
}
if (refrun > 0 && !range.empty()) { //FIXME: last condition not really needed?
Id += range.size() - 1;
nparameters_ += range.size() - 1;
} else {
Id += range.size();
nparameters_ += range.size();
}
if (refrun > 0 && range.front() > refrun) { //range.size() > 0 checked before
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector::createGroup:\n"
<< "Invalid combination of reference run number and specified run dependence"
<< "\n in module group " << firstId_.size() << "."
<< "\n Reference run number (" << refrun << ") is smaller than starting run "
<< "\n number (" << range.front() << ") of first IOV.";
}
return modules_selected;
}
//============================================================================
void TkModuleGroupSelector::verifyParameterNames(const edm::ParameterSet &pset, unsigned int psetnr) const {
std::vector<std::string> parameterNames = pset.getParameterNames();
for (std::vector<std::string>::const_iterator iParam = parameterNames.begin(); iParam != parameterNames.end();
++iParam) {
const std::string &name = (*iParam);
if (name != "levels" && name != "RunRange" && name != "split" && name != "ReferenceRun") {
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector::verifyParameterNames:"
<< " Unknown parameter name '" << name << "' in PSet number " << psetnr
<< ". Maybe a typo?";
}
}
}
//============================================================================
void TkModuleGroupSelector::createModuleGroups(AlignableTracker *aliTracker,
const edm::VParameterSet &granularityConfig,
const std::vector<edm::RunNumber_t> &defaultRunRange,
edm::RunNumber_t defaultReferenceRun) {
std::set<edm::RunNumber_t> localRunRange;
nparameters_ = 0;
unsigned int Id = 0;
unsigned int psetnr = 0;
//loop over all LA groups
for (edm::VParameterSet::const_iterator pset = granularityConfig.begin(); pset != granularityConfig.end(); ++pset) {
//test for unknown parameters
this->verifyParameterNames((*pset), psetnr);
psetnr++;
bool modules_selected = false; //track whether at all a module has been selected in this group
const std::vector<edm::RunNumber_t> range =
((*pset).exists("RunRange") ? pset->getParameter<std::vector<edm::RunNumber_t> >("RunRange") : defaultRunRange);
if (range.empty()) {
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector::createModuleGroups:\n"
<< "Run range array empty!";
}
const bool split = this->testSplitOption((*pset));
edm::RunNumber_t refrun = 0;
if ((*pset).exists("ReferenceRun")) {
refrun = (*pset).getParameter<edm::RunNumber_t>("ReferenceRun");
} else {
refrun = defaultReferenceRun;
}
AlignmentParameterSelector selector(aliTracker);
selector.clear();
selector.addSelections((*pset).getParameter<edm::ParameterSet>("levels"));
const auto &alis = selector.selectedAlignables();
std::list<Alignable *> selected_alis;
for (const auto &it : alis) {
const auto &aliDaughts = it->deepComponents();
for (const auto &iD : aliDaughts) {
if (iD->alignableObjectId() == align::AlignableDetUnit || iD->alignableObjectId() == align::AlignableDet) {
if (split) {
modules_selected = this->createGroup(Id, range, std::list<Alignable *>(1, iD), refrun);
} else {
selected_alis.push_back(iD);
}
}
}
}
if (!split) {
modules_selected = this->createGroup(Id, range, selected_alis, refrun);
}
edm::RunNumber_t firstRun = 0;
for (std::vector<edm::RunNumber_t>::const_iterator iRun = range.begin(); iRun != range.end(); ++iRun) {
localRunRange.insert((*iRun));
if ((*iRun) > firstRun) {
firstRun = (*iRun);
} else {
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector::createModuleGroups:"
<< " Run range not sorted.";
}
}
if (!modules_selected) {
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector:createModuleGroups:"
<< " No module was selected in the module group selector in group "
<< (firstId_.size() - 1) << ".";
}
}
//copy local set into the global vector of run boundaries
for (std::set<edm::RunNumber_t>::const_iterator itRun = localRunRange.begin(); itRun != localRunRange.end();
++itRun) {
globalRunRange_.push_back((*itRun));
}
}
//============================================================================
unsigned int TkModuleGroupSelector::getNumberOfParameters() const { return nparameters_; }
//============================================================================
unsigned int TkModuleGroupSelector::numIovs() const { return globalRunRange_.size(); }
//============================================================================
edm::RunNumber_t TkModuleGroupSelector::firstRunOfIOV(unsigned int iovNum) const {
return iovNum < this->numIovs() ? globalRunRange_.at(iovNum) : 0;
}
//======================================================================
int TkModuleGroupSelector::getParameterIndexFromDetId(unsigned int detId, edm::RunNumber_t run) const {
// Return the index of the parameter that is used for this DetId.
// If this DetId is not treated, return values < 0.
const DetId temp_id(detId);
int index = -1;
bool sel = false;
for (std::vector<int>::const_iterator itSubDets = subdetids_.begin(); itSubDets != subdetids_.end(); ++itSubDets) {
if (temp_id.det() == DetId::Tracker && temp_id.subdetId() == (*itSubDets)) {
sel = true;
break;
}
}
if (temp_id.det() != DetId::Tracker || !sel)
return -1;
std::map<unsigned int, unsigned int>::const_iterator it = mapDetIdGroupId_.find(detId);
if (it != mapDetIdGroupId_.end()) {
const unsigned int iAlignableGroup = (*it).second;
const std::vector<edm::RunNumber_t> &runs = runRange_.at(iAlignableGroup);
const unsigned int id0 = firstId_.at(iAlignableGroup);
const edm::RunNumber_t refrun = referenceRun_.at(iAlignableGroup);
unsigned int iovNum = 0;
for (; iovNum < runs.size(); ++iovNum) {
if (runs[iovNum] > run)
break;
}
if (iovNum == 0) {
throw cms::Exception("BadConfig") << "@SUB=TkModuleGroupSelector::getParameterIndexFromDetId:\n"
<< "Run " << run << " not foreseen for detid '" << detId << "'"
<< " in module group " << iAlignableGroup << ".";
} else {
--iovNum;
}
//test whether the iov contains the reference run
if (refrun > 0) { //if > 0 a reference run number has been provided
if (iovNum + 1 == runs.size()) {
if (refrun >= runs[iovNum])
return -1;
} else if ((iovNum + 1) < runs.size()) {
if (refrun >= runs[iovNum] && refrun < runs[iovNum + 1]) {
return -1;
}
}
if (run > refrun) {
//iovNum > 0 due to checks in createGroup(...) and createModuleGroups(...)
//remove IOV in which the reference run can be found
iovNum -= 1;
}
}
index = id0 + iovNum;
}
return index;
}
|