CMS 3D CMS Logo

RunRangeDependentPedeLabeler.cc
Go to the documentation of this file.
1 
11 #include <algorithm>
12 #include <atomic>
13 
16 
24 
26 
27 //___________________________________________________________________________
30  : PedeLabelerBase(alignables, config),
31  theMaxNumberOfParameterInstances(0)
32 {
33  align::Alignables alis;
34  alis.push_back(alignables.aliTracker_);
35  alis.push_back(alignables.aliMuon_);
36 
37  if (alignables.aliExtras_) {
38  for (const auto& ali: alignables.aliExtras_->components()) {
39  alis.push_back(ali);
40  }
41  }
42 
43  this->buildRunRangeDependencyMap(alignables.aliTracker_,
44  alignables.aliMuon_,
45  alignables.aliExtras_,
46  config);
47  this->buildMap(alis);
48  this->buildReverseMap(); // needed already now to 'fill' theMaxNumberOfParameterInstances
49 }
50 
51 //___________________________________________________________________________
52 
54 {
55 }
56 
57 //___________________________________________________________________________
60 {
61  if (!alignable) return 0;
62 
63  AlignableToIdMap::const_iterator position = theAlignableToIdMap.find(alignable);
64  if (position != theAlignableToIdMap.end()) {
65  return position->second;
66  } else {
67  const DetId detId(alignable->id());
68  //throw cms::Exception("LogicError")
69  edm::LogError("LogicError")
70  << "@SUB=RunRangeDependentPedeLabeler::alignableLabel" << "Alignable "
71  << typeid(*alignable).name() << " not in map, det/subdet/alignableStructureType = "
72  << detId.det() << "/" << detId.subdetId() << "/" << alignable->alignableObjectId();
73  return 0;
74  }
75 }
76 
77 //___________________________________________________________________________
78 // Return 32-bit unique label for alignable, 0 indicates failure.
80  unsigned int param,
81  unsigned int instance) const
82 {
83  if (!alignable) return 0;
84 
85  AlignableToIdMap::const_iterator position = theAlignableToIdMap.find(alignable);
86  if (position != theAlignableToIdMap.end()) {
87  AlignableToRunRangeRangeMap::const_iterator positionAli = theAlignableToRunRangeRangeMap.find(alignable);
88  if (positionAli != theAlignableToRunRangeRangeMap.end()) {
89  RunRangeParamMap::const_iterator positionParam = (*positionAli).second.find(param);
90  if (positionParam!=(*positionAli).second.end()) {
91  if (instance>=(*positionParam).second.size()) {
92  throw cms::Exception("Alignment") << "RunRangeDependentPedeLabeler::alignableLabelFromParamAndRunRange: "
93  << "RunRangeIdx out of bounds.\n";
94  }
95  return position->second + instance * theParamInstanceOffset;
96  } else {
97  return position->second;
98  }
99  } else {
100  return position->second;
101  }
102  } else {
103  const DetId detId(alignable->id());
104  //throw cms::Exception("LogicError")
105  edm::LogError("LogicError")
106  << "@SUB=RunRangeDependentPedeLabeler::alignableLabel" << "Alignable "
107  << typeid(*alignable).name() << " not in map, det/subdet/alignableStructureType = "
108  << detId.det() << "/" << detId.subdetId() << "/" << alignable->alignableObjectId();
109  return 0;
110  }
111 }
112 
113 //_________________________________________________________________________
114 unsigned int RunRangeDependentPedeLabeler::lasBeamLabel(unsigned int lasBeamId) const
115 {
116  UintUintMap::const_iterator position = theLasBeamToLabelMap.find(lasBeamId);
117  if (position != theLasBeamToLabelMap.end()) {
118  return position->second;
119  } else {
120  //throw cms::Exception("LogicError")
121  edm::LogError("LogicError") << "@SUB=RunRangeDependentPedeLabeler::lasBeamLabel"
122  << "No label for beam Id " << lasBeamId;
123  return 0;
124  }
125 }
126 
127 //_________________________________________________________________________
128 unsigned int RunRangeDependentPedeLabeler::parameterLabel(unsigned int aliLabel, unsigned int parNum) const
129 {
130  if (parNum >= theMaxNumParam) {
131  throw cms::Exception("Alignment") << "@SUB=RunRangeDependentPedeLabeler::parameterLabel"
132  << "Parameter number " << parNum
133  << " out of range 0 <= num < " << theMaxNumParam;
134  }
135  return aliLabel + parNum;
136 }
137 
138 //_________________________________________________________________________
139 unsigned int RunRangeDependentPedeLabeler::parameterLabel(Alignable *alignable, unsigned int parNum,
141  const TrajectoryStateOnSurface &tsos) const
142 {
143  if (!alignable) return 0;
144 
145  if (parNum >= theMaxNumParam) {
146  throw cms::Exception("Alignment") << "@SUB=RunRangeDependentPedeLabeler::parameterLabel"
147  << "Parameter number " << parNum
148  << " out of range 0 <= num < " << theMaxNumParam;
149  }
150 
151  AlignableToIdMap::const_iterator position = theAlignableToIdMap.find(alignable);
152  if (position != theAlignableToIdMap.end()) {
153 
154  AlignableToRunRangeRangeMap::const_iterator positionAli = theAlignableToRunRangeRangeMap.find(alignable);
155  if (positionAli != theAlignableToRunRangeRangeMap.end()) {
156 
157  RunRangeParamMap::const_iterator positionParam = (*positionAli).second.find(parNum);
158  if (positionParam!=(*positionAli).second.end()) {
159 
160  int offset = 0;
161  const RunRangeVector & runRanges = (*positionParam).second;
162  for (const auto& iRunRange: runRanges) {
163  if (eventInfo.eventId().run() >= iRunRange.first &&
164  eventInfo.eventId().run() <= iRunRange.second) {
165  return position->second + offset * theParamInstanceOffset + parNum;
166  }
167  offset++;
168  }
169  const DetId detId(alignable->id());
170  edm::LogError("LogicError")
171  << "@SUB=RunRangeDependentPedeLabeler::parameterLabel" << "Instance for Alignable "
172  << typeid(*alignable).name() << " not in map, det/subdet/alignableStructureType = "
173  << detId.det() << "/" << detId.subdetId() << "/" << alignable->alignableObjectId()
174  << " for run " << eventInfo.eventId().run();
175  return 0;
176  } else {
177  return position->second + parNum;
178  }
179 
180  } else {
181  return position->second + parNum;
182  }
183  } else {
184  const DetId detId(alignable->id());
185  //throw cms::Exception("LogicError")
186  edm::LogError("LogicError")
187  << "@SUB=RunRangeDependentPedeLabeler::parameterLabel" << "Alignable "
188  << typeid(*alignable).name() << " not in map, det/subdet/alignableStructureType = "
189  << detId.det() << "/" << detId.subdetId() << "/" << alignable->alignableObjectId();
190  return 0;
191  }
192 }
193 
194 //_________________________________________________________________________
196 {
197  AlignableToRunRangeRangeMap::const_iterator positionAli = theAlignableToRunRangeRangeMap.find(alignable);
198  if (positionAli != theAlignableToRunRangeRangeMap.end()) return true;
199  return false;
200 }
201 
202 //_________________________________________________________________________
204 {
205  AlignableToRunRangeRangeMap::const_iterator positionAli = theAlignableToRunRangeRangeMap.find(alignable);
206  if (positionAli != theAlignableToRunRangeRangeMap.end()) {
207 
208  size_t nRunRanges = 1;
209  if (param==-1) {
210  for (const auto iParam: (*positionAli).second) {
211  nRunRanges = std::max(nRunRanges, iParam.second.size());
212  }
213  return nRunRanges;
214  } else {
215  RunRangeParamMap::const_iterator iParam = (*positionAli).second.find(param);
216  if (iParam != (*positionAli).second.end()) {
217  return iParam->second.size();
218  } else {
219  return 1;
220  }
221  }
222  }
223 
224  return 1;
225 }
226 
227 //___________________________________________________________________________
228 unsigned int RunRangeDependentPedeLabeler::paramNumFromLabel(unsigned int paramLabel) const
229 {
230  if (paramLabel < theMinLabel) {
231  edm::LogError("LogicError") << "@SUB=RunRangeDependentPedeLabeler::paramNumFromLabel"
232  << "Label " << paramLabel << " should be >= " << theMinLabel;
233  return 0;
234  }
235  return (paramLabel - theMinLabel) % theMaxNumParam;
236 }
237 
238 //___________________________________________________________________________
239 unsigned int RunRangeDependentPedeLabeler::alignableLabelFromLabel(unsigned int paramLabel) const
240 {
241  return paramLabel - this->paramNumFromLabel(paramLabel);
242 }
243 
244 //___________________________________________________________________________
246 {
247  const unsigned int aliLabel = this->alignableLabelFromLabel(label);
248  if (aliLabel < theMinLabel) return nullptr; // error already given
249 
250  IdToAlignableMap::const_iterator position = theIdToAlignableMap.find(aliLabel);
251  if (position != theIdToAlignableMap.end()) {
252  return position->second;
253  } else {
254  // error only if not in lasBeamMap:
255  UintUintMap::const_iterator position = theLabelToLasBeamMap.find(aliLabel);
256  if (position == theLabelToLasBeamMap.end()) {
257  edm::LogError("LogicError") << "@SUB=RunRangeDependentPedeLabeler::alignableFromLabel"
258  << "Alignable label " << aliLabel << " not in map.";
259  }
260  return nullptr;
261  }
262 }
263 
264 //___________________________________________________________________________
266 {
267  const unsigned int aliLabel = this->alignableLabelFromLabel(label);
268  if (aliLabel < theMinLabel) return 0; // error already given
269 
270  UintUintMap::const_iterator position = theLabelToLasBeamMap.find(aliLabel);
271  if (position != theLabelToLasBeamMap.end()) {
272  return position->second;
273  } else {
274  edm::LogError("LogicError") << "@SUB=RunRangeDependentPedeLabeler::lasBeamIdFromLabel"
275  << "Alignable label " << aliLabel << " not in map.";
276  return 0;
277  }
278 }
279 
281 {
282  Alignable* ali = alignableFromLabel(label);
283  unsigned int firstLabel = alignableLabel(ali);
284  return (label-firstLabel)/theMaxNumParam;
285 }
286 
289 {
290  Alignable* ali = alignableFromLabel(label);
291 
292  AlignableToRunRangeRangeMap::const_iterator positionAli = theAlignableToRunRangeRangeMap.find(ali);
293  if (positionAli==theAlignableToRunRangeRangeMap.end())
294  return theOpenRunRange;
295 
296  unsigned int firstLabel = alignableLabel(ali);
297  unsigned int runRangeIndex = (label-firstLabel)/theParamInstanceOffset;
298  unsigned int paramNum = this->paramNumFromLabel(label);
299 
300  RunRangeParamMap::const_iterator positionParam = (*positionAli).second.find(paramNum);
301  if (positionParam==(*positionAli).second.end()) {
302  return theOpenRunRange;
303  }
304 
305  return positionParam->second[runRangeIndex];
306 }
307 
308 //__________________________________________________________________________________________________
309 std::vector<std::string> RunRangeDependentPedeLabeler::decompose(const std::string &s,
311 {
312  std::vector<std::string> result;
313 
314  std::string::size_type previousPos = 0;
315  while (true) {
316  const std::string::size_type delimiterPos = s.find(delimiter, previousPos);
317  if (delimiterPos == std::string::npos) {
318  result.push_back(s.substr(previousPos)); // until end
319  break;
320  }
321  result.push_back(s.substr(previousPos, delimiterPos - previousPos));
322  previousPos = delimiterPos + 1; // +1: skip delimiter
323  }
324 
325  return result;
326 }
327 
328 //__________________________________________________________________________________________________
329 std::vector<unsigned int> RunRangeDependentPedeLabeler::convertParamSel(const std::string &selString) const
330 {
331  std::vector<unsigned int> result;
332  for (std::string::size_type pos = 0; pos < selString.size(); ++pos) {
333  if (selString[pos]=='1') result.push_back(pos);
334  }
335  return result;
336 }
337 
339  AlignableMuon* aliMuon,
340  AlignableExtras *aliExtras,
341  const edm::ParameterSet &config)
342 {
343  static std::atomic<bool> oldRunRangeSelectionWarning{ false };
344 
346 
347  AlignmentParameterSelector selector(aliTracker, aliMuon, aliExtras);
348 
349  std::vector<char> paramSelDummy(6, '1');
350 
351  const std::vector<edm::ParameterSet> RunRangeSelectionVPSet =
352  config.getUntrackedParameter<std::vector<edm::ParameterSet> >("RunRangeSelection");
353 
354  for (const auto& runRangeSel: RunRangeSelectionVPSet) {
355 
356  const auto tempRunRanges = runRangeSel.getParameter<std::vector<std::string> >("RunRanges");
357  if (tempRunRanges.empty()) {
358  throw cms::Exception("BadConfig") << "@SUB=RunRangeDependentPedeLabeler::buildRunRangeDependencyMap\n"
359  << "RunRanges empty\n";
360  }
361 
364  long int temp;
365  for (const auto& iRunRange: tempRunRanges) {
366  if (iRunRange.find(':') == std::string::npos) {
367 
369  temp = strtol(iRunRange.c_str(), nullptr, 0);
370  if (temp!=-1) first = temp;
371 
372  } else {
373 
374  bool expected = false;
375  if (oldRunRangeSelectionWarning.compare_exchange_strong(expected,true)) {
376  edm::LogWarning("BadConfig") << "@SUB=RunRangeDependentPedeLabeler::buildRunRangeDependencyMap"
377  << "Config file contains old format for 'RunRangeSelection'. Only the start run\n"
378  << "number is used internally. The number of the last run is ignored and can be\n"
379  << "safely removed from the config file.\n";
380  }
381 
382  std::vector<std::string> tokens = edm::tokenize(iRunRange, ":");
384  temp = strtol(tokens[0].c_str(), nullptr, 0);
385  if (temp!=-1) first = temp;
386 
387  }
388 
389  RunRanges.push_back(std::pair<cond::Time_t,cond::Time_t>(first, cond::timeTypeSpecs[cond::runnumber].endValue));
390  }
391 
392  for (unsigned int i = 0;i<RunRanges.size()-1;++i) {
393  RunRanges[i].second = RunRanges[i+1].first - 1;
394  if (RunRanges[i].first > RunRanges[i].second) {
395  throw cms::Exception("BadConfig") << "@SUB=RunRangeDependentPedeLabeler::buildRunRangeDependencyMap\n"
396  << "Inconsistency in 'RunRangeSelection' parameter set.";
397  }
398  }
399 
400  const auto selStrings = runRangeSel.getParameter<std::vector<std::string> >("selector");
401  for (const auto& iSel: selStrings) {
402  std::vector<std::string> decompSel(this->decompose(iSel, ','));
403 
404  if (decompSel.size()!=2) {
405  throw cms::Exception("BadConfig") << "@SUB=RunRangeDependentPedeLabeler::buildRunRangeDependencyMap\n"
406  << iSel <<" should have at least 2 ','-separated parts\n";
407  }
408 
409  std::vector<unsigned int> selParam = this->convertParamSel(decompSel[1]);
410  selector.clear();
411  selector.addSelection(decompSel[0], paramSelDummy);
412 
413  const auto& alis = selector.selectedAlignables();
414 
415  for (const auto& iAli: alis) {
416 
417  if(iAli->alignmentParameters() == nullptr) {
418  throw cms::Exception("BadConfig")
419  << "@SUB=RunRangeDependentPedeLabeler::buildRunRangeDependencyMap\n"
420  << "Run dependence configured for alignable of type "
421  << objectIdProvider().idToString(iAli->alignableObjectId())
422  << " at (" << iAli->globalPosition().x() << ","
423  << iAli->globalPosition().y() << ","
424  << iAli->globalPosition().z()<< "), "
425  << "but that has no parameters. Please check that all run "
426  << "dependent parameters are also selected for alignment.\n";
427  }
428 
429  for (const auto& iParam: selParam) {
430  AlignableToRunRangeRangeMap::const_iterator positionAli = theAlignableToRunRangeRangeMap.find(iAli);
431  if (positionAli!=theAlignableToRunRangeRangeMap.end()) {
432 
433  AlignmentParameters *AliParams = (*positionAli).first->alignmentParameters();
434  if (static_cast<int>(selParam[selParam.size()-1]) >= AliParams->size()) {
435  throw cms::Exception("BadConfig") << "@SUB=RunRangeDependentPedeLabeler::buildRunRangeDependencyMap\n"
436  << "mismatch in number of parameters\n";
437  }
438 
439  RunRangeParamMap::const_iterator positionParam = (*positionAli).second.find(iParam);
440  if (positionParam!=(*positionAli).second.end()) {
441  throw cms::Exception("BadConfig") << "@SUB=RunRangeDependentPedeLabeler::buildRunRangeDependencyMap\n"
442  << "RunRange range for parameter specified twice\n";
443  }
444  }
445 
447  }
448  }
449  }
450  }
451 
452  return theAlignableToRunRangeRangeMap.size();
453 }
454 
455 //_________________________________________________________________________
457 {
458  theAlignableToIdMap.clear(); // just in case of re-use...
459 
460  align::Alignables allComps;
461 
462  for (const auto& iAli: alis) {
463  if (iAli) {
464  allComps.push_back(iAli);
465  iAli->recursiveComponents(allComps);
466  }
467  }
468 
469  unsigned int id = theMinLabel;
470  for (const auto& iter: allComps) {
471  theAlignableToIdMap.insert(AlignableToIdPair(iter, id));
472  id += theMaxNumParam;
473  }
474 
475  // also care about las beams
476  theLasBeamToLabelMap.clear(); // just in case of re-use...
477  // FIXME: Temporarily hard code values stolen from
478  // https://twiki.cern.ch/twiki/bin/view/CMS/TkLasTrackBasedInterface#Beam_identifier .
479  unsigned int beamIds[] = { 0, 10, 20, 30, 40, 50, 60, 70, // TEC+ R4
480  1, 11, 21, 31, 41, 51, 61, 71, // TEC+ R6
481  100, 110, 120, 130, 140, 150, 160, 170, // TEC- R4
482  101, 111, 121, 131, 141, 151, 161, 171, // TEC- R6
483  200, 210, 220, 230, 240, 250, 260, 270};// AT
484 
485  const size_t nBeams = sizeof(beamIds)/sizeof(beamIds[0]);
486  for (size_t iBeam = 0; iBeam < nBeams; ++iBeam) {
487  //edm::LogInfo("Alignment") << "Las beam " << beamIds[iBeam] << " gets label " << id << ".";
488  theLasBeamToLabelMap[beamIds[iBeam]] = id;
489  id += theMaxNumParam;
490  }
491 
492  if (id > theParamInstanceOffset) { // 'overflow' per instance
493  throw cms::Exception("Alignment") << "@SUB=RunRangeDependentPedeLabeler::buildMap: "
494  << "Too many labels per instance (" << id-1 << ") leading to double use, "
495  << "increase PedeLabelerBase::theParamInstanceOffset!\n";
496  }
497  // return combined size
498  return theAlignableToIdMap.size() + theLasBeamToLabelMap.size();
499 }
500 
501 //_________________________________________________________________________
503 {
504 
505  // alignables
506  theIdToAlignableMap.clear(); // just in case of re-use...
507 
508  for (const auto& it: theAlignableToIdMap) {
509  const unsigned int key = it.second;
510  Alignable *ali = it.first;
511  const unsigned int nInstances = this->numberOfParameterInstances(ali, -1);
513  for (unsigned int iInstance=0;iInstance<nInstances;++iInstance) {
514  theIdToAlignableMap[key+iInstance*theParamInstanceOffset] = ali;
515  }
516  }
517 
518  // las beams
519  theLabelToLasBeamMap.clear(); // just in case of re-use...
520 
521  for (const auto& it: theLasBeamToLabelMap) {
522  theLabelToLasBeamMap[it.second] = it.first; //revert key/value
523  }
524 
525  // return combined size
526  return theIdToAlignableMap.size() + theLabelToLasBeamMap.size();
527 }
528 
RunNumber_t run() const
Definition: EventID.h:39
const TimeTypeSpecs timeTypeSpecs[]
Definition: Time.cc:22
align::ID id() const
Return the ID of Alignable, i.e. DetId of &#39;first&#39; component GeomDet(Unit).
Definition: Alignable.h:189
T getUntrackedParameter(std::string const &, T const &) const
AlignableToIdMap::value_type AlignableToIdPair
UintUintMap theLabelToLasBeamMap
labels for las beams
unsigned int alignableLabelFromLabel(unsigned int label) const override
alignable label from parameter label (works also for alignable label...)
Time_t beginValue
Definition: Time.h:45
static PFTauRenderPlugin instance
unsigned int paramNumFromLabel(unsigned int paramLabel) const override
parameter number, 0 <= .. < theMaxNumParam, belonging to unique parameter label
unsigned int alignableLabel(Alignable *alignable) const override
Return 32-bit unique label for alignable, 0 indicates failure.
static const unsigned int theMinLabel
unsigned int alignableLabelFromParamAndInstance(Alignable *alignable, unsigned int param, unsigned int instance) const override
Definition: config.py:1
const edm::EventID eventId() const
uint16_t size_type
const RunRange theOpenRunRange
unsigned int theMaxNumberOfParameterInstances
reverse of the above
define event information passed to algorithms
static const unsigned int theMaxNumParam
const RunRange & runRangeFromLabel(unsigned int label) const override
U second(std::pair< T, U > const &p)
char const * label
void clear()
remove all selected Alignables and geometrical restrictions
unsigned long long Time_t
Definition: Time.h:16
unsigned int buildReverseMap()
returns size of map
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
AlignableToRunRangeRangeMap theAlignableToRunRangeRangeMap
providing unique ID for alignable, space for param IDs
const Alignables & components() const
IdToAlignableMap theIdToAlignableMap
providing unique ID for alignable, space for param IDs
unsigned int parameterLabel(unsigned int aliLabel, unsigned int parNum) const override
returns the label for a given alignable parameter number combination
const align::Alignables & selectedAlignables() const
vector of alignables selected so far
Definition: DetId.h:18
unsigned int runRangeIndexFromLabel(unsigned int label) const
align::RunRange RunRange
bool hasSplitParameters(Alignable *alignable) const override
returns true if the alignable has parameters that are split into various bins
int size(void) const
Get number of parameters.
const char * idToString(align::StructureType type) const
UintUintMap theLasBeamToLabelMap
reverse map
unsigned int lasBeamLabel(unsigned int lasBeamId) const override
static const unsigned int theParamInstanceOffset
std::vector< Alignable * > Alignables
Definition: Utilities.h:32
unsigned int addSelection(const std::string &name, const std::vector< char > &paramSel)
unsigned int buildRunRangeDependencyMap(AlignableTracker *aliTracker, AlignableMuon *aliMuon, AlignableExtras *extras, const edm::ParameterSet &config)
RunRangeDependentPedeLabeler(const PedeLabelerBase::TopLevelAlignables &alignables, const edm::ParameterSet &config)
constructor from three Alignables (null pointers allowed )
static int position[264][3]
Definition: ReadPGInfo.cc:509
unsigned int lasBeamIdFromLabel(unsigned int label) const override
#define DEFINE_EDM_PLUGIN(factory, type, name)
eventInfo
add run, event number and lumi section
std::vector< unsigned int > convertParamSel(const std::string &selString) const
align::RunRanges RunRanges
Constructor of the full muon geometry.
Definition: AlignableMuon.h:37
unsigned int numberOfParameterInstances(Alignable *alignable, int param=-1) const override
returns the number of instances for a given parameter
const AlignableObjectId & objectIdProvider() const
Return tracker alignable object ID provider derived from the tracker&#39;s geometry.
std::vector< std::string > decompose(const std::string &s, std::string::value_type delimiter) const
unsigned int buildMap(const align::Alignables &)
returns size of map
Alignable * alignableFromLabel(unsigned int label) const override
std::vector< std::string > tokenize(std::string const &input, std::string const &separator)
breaks the input string into tokens, delimited by the separator