CMS 3D CMS Logo

MomentumDependentPedeLabeler.cc
Go to the documentation of this file.
1 
11 #include <algorithm>
12 
15 
23 
25 
26 //___________________________________________________________________________
29  : PedeLabelerBase(alignables, config),
30  theOpenMomentumRange(std::pair<float, float>(0.0, 10000.0)),
31  theMaxNumberOfParameterInstances(0) {
32  align::Alignables alis;
33  alis.push_back(alignables.aliTracker_);
34  alis.push_back(alignables.aliMuon_);
35 
36  if (alignables.aliExtras_) {
37  for (const auto &ali : alignables.aliExtras_->components()) {
38  alis.push_back(ali);
39  }
40  }
41 
42  this->buildMomentumDependencyMap(alignables.aliTracker_, alignables.aliMuon_, alignables.aliExtras_, config);
43  this->buildMap(alis);
44  this->buildReverseMap(); // needed already now to 'fill' theMaxNumberOfParameterInstances
45 }
46 
47 //___________________________________________________________________________
48 
50 
51 //___________________________________________________________________________
53 unsigned int MomentumDependentPedeLabeler::alignableLabel(const Alignable *alignable) const {
54  if (!alignable)
55  return 0;
56 
57  AlignableToIdMap::const_iterator position = theAlignableToIdMap.find(alignable);
58  if (position != theAlignableToIdMap.end()) {
59  return position->second;
60  } else {
61  const DetId detId(alignable->id());
62  //throw cms::Exception("LogicError")
63  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::alignableLabel"
64  << "Alignable " << typeid(*alignable).name()
65  << " not in map, det/subdet/alignableStructureType = " << detId.det() << "/"
66  << detId.subdetId() << "/" << alignable->alignableObjectId();
67  return 0;
68  }
69 }
70 
71 //___________________________________________________________________________
72 // Return 32-bit unique label for alignable, 0 indicates failure.
74  unsigned int param,
75  unsigned int instance) const {
76  if (!alignable)
77  return 0;
78 
79  AlignableToIdMap::const_iterator position = theAlignableToIdMap.find(alignable);
80  if (position != theAlignableToIdMap.end()) {
81  AlignableToMomentumRangeMap::const_iterator positionAli = theAlignableToMomentumRangeMap.find(alignable);
82  if (positionAli != theAlignableToMomentumRangeMap.end()) {
83  MomentumRangeParamMap::const_iterator positionParam = (*positionAli).second.find(param);
84  if (positionParam != (*positionAli).second.end()) {
85  if (instance >= (*positionParam).second.size()) {
86  throw cms::Exception("Alignment") << "@SUB=MomentumDependentPedeLabeler::alignableLabelFromParamAndMomentum"
87  << "iovIdx out of bounds";
88  }
89  return position->second + instance * theParamInstanceOffset;
90  } else {
91  return position->second;
92  }
93  } else {
94  return position->second;
95  }
96  } else {
97  const DetId detId(alignable->id());
98  //throw cms::Exception("LogicError")
99  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::alignableLabel"
100  << "Alignable " << typeid(*alignable).name()
101  << " not in map, det/subdet/alignableStructureType = " << detId.det() << "/"
102  << detId.subdetId() << "/" << alignable->alignableObjectId();
103  return 0;
104  }
105 }
106 
107 //_________________________________________________________________________
108 unsigned int MomentumDependentPedeLabeler::lasBeamLabel(unsigned int lasBeamId) const {
109  UintUintMap::const_iterator position = theLasBeamToLabelMap.find(lasBeamId);
110  if (position != theLasBeamToLabelMap.end()) {
111  return position->second;
112  } else {
113  //throw cms::Exception("LogicError")
114  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::lasBeamLabel"
115  << "No label for beam Id " << lasBeamId;
116  return 0;
117  }
118 }
119 
120 //_________________________________________________________________________
121 unsigned int MomentumDependentPedeLabeler::parameterLabel(unsigned int aliLabel, unsigned int parNum) const {
122  if (parNum >= theMaxNumParam) {
123  throw cms::Exception("Alignment") << "@SUB=MomentumDependentPedeLabeler::parameterLabel"
124  << "Parameter number " << parNum << " out of range 0 <= num < " << theMaxNumParam;
125  }
126  return aliLabel + parNum;
127 }
128 
129 //_________________________________________________________________________
131  unsigned int parNum,
133  const TrajectoryStateOnSurface &tsos) const {
134  if (!alignable)
135  return 0;
136 
137  if (parNum >= theMaxNumParam) {
138  throw cms::Exception("Alignment") << "@SUB=MomentumDependentPedeLabeler::parameterLabel"
139  << "Parameter number " << parNum << " out of range 0 <= num < " << theMaxNumParam;
140  }
141 
142  AlignableToIdMap::const_iterator position = theAlignableToIdMap.find(alignable);
143  if (position != theAlignableToIdMap.end()) {
144  AlignableToMomentumRangeMap::const_iterator positionAli = theAlignableToMomentumRangeMap.find(alignable);
145  if (positionAli != theAlignableToMomentumRangeMap.end()) {
146  MomentumRangeParamMap::const_iterator positionParam = (*positionAli).second.find(parNum);
147  if (positionParam != (*positionAli).second.end()) {
148  int offset = 0;
149  float mom = tsos.globalMomentum().mag();
150  const MomentumRangeVector &momentumRanges = (*positionParam).second;
151  for (const auto &iMomentum : momentumRanges) {
152  if (iMomentum.first <= mom && mom < iMomentum.second) {
153  return position->second + offset * theParamInstanceOffset + parNum;
154  }
155  offset++;
156  }
157  const DetId detId(alignable->id());
158  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::alignableLabel"
159  << "Alignable " << typeid(*alignable).name()
160  << " not in map, det/subdet/alignableStructureType = " << detId.det() << "/"
161  << detId.subdetId() << "/" << alignable->alignableObjectId();
162  return 0;
163  } else {
164  return position->second + parNum;
165  }
166 
167  } else {
168  return position->second + parNum;
169  }
170  } else {
171  const DetId detId(alignable->id());
172  //throw cms::Exception("LogicError")
173  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::alignableLabel"
174  << "Alignable " << typeid(*alignable).name()
175  << " not in map, det/subdet/alignableStructureType = " << detId.det() << "/"
176  << detId.subdetId() << "/" << alignable->alignableObjectId();
177  return 0;
178  }
179 }
180 
181 //_________________________________________________________________________
183  AlignableToMomentumRangeMap::const_iterator positionAli = theAlignableToMomentumRangeMap.find(alignable);
184  if (positionAli != theAlignableToMomentumRangeMap.end())
185  return true;
186  return false;
187 }
188 
189 //_________________________________________________________________________
190 unsigned int MomentumDependentPedeLabeler::numberOfParameterInstances(Alignable *alignable, int param) const {
191  AlignableToMomentumRangeMap::const_iterator positionAli = theAlignableToMomentumRangeMap.find(alignable);
192  if (positionAli != theAlignableToMomentumRangeMap.end()) {
193  size_t nMomentums = 1;
194  if (param == -1) {
195  for (const auto &iParam : (*positionAli).second) {
196  nMomentums = std::max(nMomentums, iParam.second.size());
197  }
198  return nMomentums;
199  } else {
200  MomentumRangeParamMap::const_iterator iParam = (*positionAli).second.find(param);
201  if (iParam != (*positionAli).second.end()) {
202  return iParam->second.size();
203  } else {
204  return 1;
205  }
206  }
207  }
208 
209  return 1;
210 }
211 
212 //___________________________________________________________________________
214  if (paramLabel < theMinLabel) {
215  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::paramNumFromLabel"
216  << "Label " << paramLabel << " should be >= " << theMinLabel;
217  return 0;
218  }
220 }
221 
222 //___________________________________________________________________________
224  return paramLabel - this->paramNumFromLabel(paramLabel);
225 }
226 
227 //___________________________________________________________________________
229  const unsigned int aliLabel = this->alignableLabelFromLabel(label);
230  if (aliLabel < theMinLabel)
231  return nullptr; // error already given
232 
233  IdToAlignableMap::const_iterator position = theIdToAlignableMap.find(aliLabel);
234  if (position != theIdToAlignableMap.end()) {
235  return position->second;
236  } else {
237  // error only if not in lasBeamMap:
238  UintUintMap::const_iterator position = theLabelToLasBeamMap.find(aliLabel);
239  if (position == theLabelToLasBeamMap.end()) {
240  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::alignableFromLabel"
241  << "Alignable label " << aliLabel << " not in map.";
242  }
243  return nullptr;
244  }
245 }
246 
247 //___________________________________________________________________________
248 unsigned int MomentumDependentPedeLabeler::lasBeamIdFromLabel(unsigned int label) const {
249  const unsigned int aliLabel = this->alignableLabelFromLabel(label);
250  if (aliLabel < theMinLabel)
251  return 0; // error already given
252 
253  UintUintMap::const_iterator position = theLabelToLasBeamMap.find(aliLabel);
254  if (position != theLabelToLasBeamMap.end()) {
255  return position->second;
256  } else {
257  edm::LogError("LogicError") << "@SUB=MomentumDependentPedeLabeler::lasBeamIdFromLabel"
258  << "Alignable label " << aliLabel << " not in map.";
259  return 0;
260  }
261 }
262 
263 //__________________________________________________________________________________________________
264 std::vector<std::string> MomentumDependentPedeLabeler::decompose(const std::string &s,
266  std::vector<std::string> result;
267 
268  std::string::size_type previousPos = 0;
269  while (true) {
270  const std::string::size_type delimiterPos = s.find(delimiter, previousPos);
271  if (delimiterPos == std::string::npos) {
272  result.push_back(s.substr(previousPos)); // until end
273  break;
274  }
275  result.push_back(s.substr(previousPos, delimiterPos - previousPos));
276  previousPos = delimiterPos + 1; // +1: skip delimiter
277  }
278 
279  return result;
280 }
281 
282 //__________________________________________________________________________________________________
283 std::vector<unsigned int> MomentumDependentPedeLabeler::convertParamSel(const std::string &selString) const {
284  std::vector<unsigned int> result;
285  for (std::string::size_type pos = 0; pos < selString.size(); ++pos) {
286  if (selString[pos] == '1')
287  result.push_back(pos);
288  }
289  return result;
290 }
291 
293  AlignableMuon *aliMuon,
294  AlignableExtras *aliExtras,
295  const edm::ParameterSet &config) {
297 
298  AlignmentParameterSelector selector(aliTracker, aliMuon, aliExtras);
299 
300  std::vector<char> paramSelDumthe(6, '1');
301 
302  const auto parameterInstancesVPSet = config.getParameter<std::vector<edm::ParameterSet> >("parameterInstances");
303 
304  for (const auto &iter : parameterInstancesVPSet) {
305  const auto tempMomentumRanges = iter.getParameter<std::vector<std::string> >("momentumRanges");
306  if (tempMomentumRanges.empty()) {
307  throw cms::Exception("BadConfig") << "@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n"
308  << "MomentumRanges empty\n";
309  }
310 
311  MomentumRangeVector MomentumRanges;
312  float lower;
313  float upper;
314  for (unsigned int iMomentum = 0; iMomentum < tempMomentumRanges.size(); ++iMomentum) {
315  std::vector<std::string> tokens = edm::tokenize(tempMomentumRanges[iMomentum], ":");
316 
317  lower = strtod(tokens[0].c_str(), nullptr);
318  upper = strtod(tokens[1].c_str(), nullptr);
319 
320  MomentumRanges.push_back(std::pair<float, float>(lower, upper));
321  }
322 
323  const auto selStrings = iter.getParameter<std::vector<std::string> >("selector");
324  for (const auto &iSel : selStrings) {
325  std::vector<std::string> decompSel(this->decompose(iSel, ','));
326 
327  if (decompSel.size() != 2) {
328  throw cms::Exception("BadConfig") << "@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n"
329  << iSel << " should have at least 2 ','-separated parts\n";
330  }
331 
332  std::vector<unsigned int> selParam = this->convertParamSel(decompSel[1]);
333  selector.clear();
334  selector.addSelection(decompSel[0], paramSelDumthe);
335 
336  const auto &alis = selector.selectedAlignables();
337  for (const auto &iAli : alis) {
338  if (iAli->alignmentParameters() == nullptr) {
339  throw cms::Exception("BadConfig")
340  << "@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n"
341  << "Momentum dependence configured for alignable of type "
342  << objectIdProvider().idToString(iAli->alignableObjectId()) << " at (" << iAli->globalPosition().x()
343  << "," << iAli->globalPosition().y() << "," << iAli->globalPosition().z() << "), "
344  << "but that has no parameters. Please check that all run "
345  << "momentum parameters are also selected for alignment.\n";
346  }
347 
348  for (const auto &iParam : selParam) {
349  AlignableToMomentumRangeMap::const_iterator positionAli = theAlignableToMomentumRangeMap.find(iAli);
350  if (positionAli != theAlignableToMomentumRangeMap.end()) {
351  AlignmentParameters *AliParams = (*positionAli).first->alignmentParameters();
352  if (static_cast<int>(selParam[selParam.size() - 1]) >= AliParams->size()) {
353  throw cms::Exception("BadConfig") << "@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n"
354  << "mismatch in number of parameters\n";
355  }
356 
357  MomentumRangeParamMap::const_iterator positionParam = (*positionAli).second.find(iParam);
358  if (positionParam != (*positionAli).second.end()) {
359  throw cms::Exception("BadConfig") << "@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n"
360  << "Momentum range for parameter specified twice\n";
361  }
362  }
363 
364  theAlignableToMomentumRangeMap[iAli][iParam] = MomentumRanges;
365  }
366  }
367  }
368  }
369 
370  return theAlignableToMomentumRangeMap.size();
371 }
372 
373 //_________________________________________________________________________
375  theAlignableToIdMap.clear(); // just in case of re-use...
376 
377  align::Alignables allComps;
378 
379  for (const auto &iAli : alis) {
380  if (iAli) {
381  allComps.push_back(iAli);
382  iAli->recursiveComponents(allComps);
383  }
384  }
385 
386  unsigned int id = theMinLabel;
387  for (const auto &iter : allComps) {
388  theAlignableToIdMap.insert(AlignableToIdPair(iter, id));
389  id += theMaxNumParam;
390  }
391 
392  // also care about las beams
393  theLasBeamToLabelMap.clear(); // just in case of re-use...
394  // FIXME: Temporarily hard code values stolen from
395  // https://twiki.cern.ch/twiki/bin/view/CMS/TkLasTrackBasedInterface#Beam_identifier .
396  unsigned int beamIds[] = {0, 10, 20, 30, 40, 50, 60, 70, // TEC+ R4
397  1, 11, 21, 31, 41, 51, 61, 71, // TEC+ R6
398  100, 110, 120, 130, 140, 150, 160, 170, // TEC- R4
399  101, 111, 121, 131, 141, 151, 161, 171, // TEC- R6
400  200, 210, 220, 230, 240, 250, 260, 270}; // AT
401 
402  const size_t nBeams = sizeof(beamIds) / sizeof(beamIds[0]);
403  for (size_t iBeam = 0; iBeam < nBeams; ++iBeam) {
404  //edm::LogInfo("Alignment") << "Las beam " << beamIds[iBeam] << " gets label " << id << ".";
405  theLasBeamToLabelMap[beamIds[iBeam]] = id;
406  id += theMaxNumParam;
407  }
408 
409  if (id > theParamInstanceOffset) { // 'overflow' per instance
410  throw cms::Exception("Alignment") << "@SUB=MomentumDependentPedeLabeler::buildMap: "
411  << "Too many labels per instance (" << id - 1 << ") leading to double use, "
412  << "increase PedeLabelerBase::theParamInstanceOffset!\n";
413  }
414  // return combined size
415  return theAlignableToIdMap.size() + theLasBeamToLabelMap.size();
416 }
417 
418 //_________________________________________________________________________
420  // alignables
421  theIdToAlignableMap.clear(); // just in case of re-use...
422 
423  for (const auto &it : theAlignableToIdMap) {
424  const unsigned int key = it.second;
425  Alignable *ali = it.first;
426  const unsigned int nInstances = this->numberOfParameterInstances(ali, -1);
428  for (unsigned int iInstance = 0; iInstance < nInstances; ++iInstance) {
429  theIdToAlignableMap[key + iInstance * theParamInstanceOffset] = ali;
430  }
431  }
432 
433  // las beams
434  theLabelToLasBeamMap.clear(); // just in case of re-use...
435 
436  for (const auto &it : theLasBeamToLabelMap) {
437  theLabelToLasBeamMap[it.second] = it.first; //revert key/value
438  }
439 
440  // return combined size
441  return theIdToAlignableMap.size() + theLabelToLasBeamMap.size();
442 }
443 
unsigned int parameterLabel(unsigned int aliLabel, unsigned int parNum) const override
returns the label for a given alignable parameter number combination
const Alignables & components() const
unsigned int lasBeamIdFromLabel(unsigned int label) const override
static PFTauRenderPlugin instance
unsigned int alignableLabelFromLabel(unsigned int label) const override
alignable label from parameter label (works also for alignable label...)
UintUintMap theLabelToLasBeamMap
labels for las beams
static const unsigned int theMinLabel
Definition: config.py:1
Log< level::Error, false > LogError
uint16_t size_type
MomentumDependentPedeLabeler(const PedeLabelerBase::TopLevelAlignables &alignables, const edm::ParameterSet &config)
constructor from three Alignables (null pointers allowed )
define event information passed to algorithms
static const unsigned int theMaxNumParam
unsigned int lasBeamLabel(unsigned int lasBeamId) const override
char const * label
unsigned int alignableLabelFromParamAndInstance(const Alignable *alignable, unsigned int param, unsigned int instance) const override
unsigned int buildMap(const align::Alignables &)
returns size of map
T mag() const
Definition: PV3DBase.h:64
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
int size(void) const
Get number of parameters.
std::vector< std::string > decompose(const std::string &s, std::string::value_type delimiter) const
UintUintMap theLasBeamToLabelMap
reverse map
unsigned int buildReverseMap()
returns size of map
unsigned int alignableLabel(const Alignable *alignable) const override
Return 32-bit unique label for alignable, 0 indicates failure.
Definition: DetId.h:17
align::ID id() const
Return the ID of Alignable, i.e. DetId of &#39;first&#39; component GeomDet(Unit).
Definition: Alignable.h:180
std::vector< unsigned int > convertParamSel(const std::string &selString) const
const AlignableObjectId & objectIdProvider() const
Return tracker alignable object ID provider derived from the tracker&#39;s geometry.
const char * idToString(align::StructureType type) const
std::vector< std::string > tokenize(std::string const &input, std::string const &separator)
breaks the input string into tokens, delimited by the separator
Definition: Parse.cc:52
GlobalVector globalMomentum() const
static const unsigned int theParamInstanceOffset
Alignable * alignableFromLabel(unsigned int label) const override
std::vector< Alignable * > Alignables
Definition: Utilities.h:31
std::vector< MomentumRange > MomentumRangeVector
unsigned int paramNumFromLabel(unsigned int paramLabel) const override
parameter number, 0 <= .. < theMaxNumParam, belonging to unique parameter label
unsigned int buildMomentumDependencyMap(AlignableTracker *aliTracker, AlignableMuon *aliMuon, AlignableExtras *extras, const edm::ParameterSet &config)
static int position[264][3]
Definition: ReadPGInfo.cc:289
unsigned int numberOfParameterInstances(Alignable *alignable, int param=-1) const override
returns the number of instances for a given parameter
bool hasSplitParameters(Alignable *alignable) const override
returns true if the alignable has parameters that are split into various bins
#define DEFINE_EDM_PLUGIN(factory, type, name)
eventInfo
add run, event number and lumi section
Constructor of the full muon geometry.
Definition: AlignableMuon.h:38
AlignableToMomentumRangeMap theAlignableToMomentumRangeMap
providing unique ID for alignable, space for param IDs
AlignableToIdMap::value_type AlignableToIdPair
IdToAlignableMap theIdToAlignableMap
providing unique ID for alignable, space for param IDs