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 //___________________________________________________________________________
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  }
219  return (paramLabel - theMinLabel) % theParamInstanceOffset;
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
unsigned int alignableLabelFromParamAndInstance(Alignable *alignable, unsigned int param, unsigned int instance) const override
T getParameter(std::string const &) const
align::ID id() const
Return the ID of Alignable, i.e. DetId of &#39;first&#39; component GeomDet(Unit).
Definition: Alignable.h:180
static PFTauRenderPlugin instance
std::vector< std::string > decompose(const std::string &s, std::string::value_type delimiter) const
UintUintMap theLabelToLasBeamMap
labels for las beams
unsigned int paramNumFromLabel(unsigned int paramLabel) const override
parameter number, 0 <= .. < theMaxNumParam, belonging to unique parameter label
static const unsigned int theMinLabel
Definition: config.py:1
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
char const * label
void clear()
remove all selected Alignables and geometrical restrictions
T mag() const
Definition: PV3DBase.h:64
unsigned int lasBeamLabel(unsigned int lasBeamId) const override
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
unsigned int buildMap(const align::Alignables &)
returns size of map
unsigned int alignableLabel(Alignable *alignable) const override
Return 32-bit unique label for alignable, 0 indicates failure.
unsigned int lasBeamIdFromLabel(unsigned int label) const override
const Alignables & components() const
UintUintMap theLasBeamToLabelMap
reverse map
unsigned int buildReverseMap()
returns size of map
bool hasSplitParameters(Alignable *alignable) const override
returns true if the alignable has parameters that are split into various bins
const align::Alignables & selectedAlignables() const
vector of alignables selected so far
Definition: DetId.h:17
int size(void) const
Get number of parameters.
const char * idToString(align::StructureType type) const
Alignable * alignableFromLabel(unsigned int label) const override
static const unsigned int theParamInstanceOffset
std::vector< Alignable * > Alignables
Definition: Utilities.h:31
std::vector< MomentumRange > MomentumRangeVector
unsigned int addSelection(const std::string &name, const std::vector< char > &paramSel)
unsigned int numberOfParameterInstances(Alignable *alignable, int param=-1) const override
returns the number of instances for a given parameter
unsigned int buildMomentumDependencyMap(AlignableTracker *aliTracker, AlignableMuon *aliMuon, AlignableExtras *extras, const edm::ParameterSet &config)
GlobalVector globalMomentum() const
static int position[264][3]
Definition: ReadPGInfo.cc:289
#define DEFINE_EDM_PLUGIN(factory, type, name)
std::vector< unsigned int > convertParamSel(const std::string &selString) const
Constructor of the full muon geometry.
Definition: AlignableMuon.h:33
unsigned int alignableLabelFromLabel(unsigned int label) const override
alignable label from parameter label (works also for alignable label...)
AlignableToMomentumRangeMap theAlignableToMomentumRangeMap
providing unique ID for alignable, space for param IDs
const AlignableObjectId & objectIdProvider() const
Return tracker alignable object ID provider derived from the tracker&#39;s geometry.
AlignableToIdMap::value_type AlignableToIdPair
IdToAlignableMap theIdToAlignableMap
providing unique ID for alignable, space for param IDs
std::vector< std::string > tokenize(std::string const &input, std::string const &separator)
breaks the input string into tokens, delimited by the separator