File indexing completed on 2024-04-06 11:56:37
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "Alignment/MillePedeAlignmentAlgorithm/interface/PedeLabelerBase.h"
0013
0014 #include "Alignment/CommonAlignmentParametrization/interface/RigidBodyAlignmentParameters.h"
0015 #include "Alignment/CommonAlignmentAlgorithm/interface/IntegratedCalibrationBase.h"
0016
0017 #include "Alignment/TrackerAlignment/interface/AlignableTracker.h"
0018 #include "Alignment/MuonAlignment/interface/AlignableMuon.h"
0019
0020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0021
0022
0023 const unsigned int PedeLabelerBase::theMaxNumParam = RigidBodyAlignmentParameters::N_PARAM + 14;
0024
0025 const unsigned int PedeLabelerBase::theParamInstanceOffset = 700000;
0026 const unsigned int PedeLabelerBase::theMinLabel = 1;
0027
0028 PedeLabelerBase::PedeLabelerBase(const TopLevelAlignables &alignables, const edm::ParameterSet &config)
0029 : theOpenRunRange(std::make_pair<RunNumber, RunNumber>(
0030 RunNumber(cond::timeTypeSpecs[cond::runnumber].beginValue),
0031 RunNumber(
0032 cond::timeTypeSpecs[cond::runnumber].endValue))),
0033 topLevelAlignables_(alignables),
0034 alignableObjectId_{AlignableObjectId::commonObjectIdProvider(alignables.aliTracker_, alignables.aliMuon_)} {}
0035
0036
0037 std::pair<IntegratedCalibrationBase *, unsigned int> PedeLabelerBase::calibrationParamFromLabel(
0038 unsigned int label) const {
0039
0040 if (!theCalibrationLabels.empty() && label >= theCalibrationLabels.front().second) {
0041
0042 for (auto iCal = theCalibrationLabels.begin(); iCal != theCalibrationLabels.end(); ++iCal) {
0043 if (label >= iCal->second && label < iCal->second + iCal->first->numParameters()) {
0044
0045
0046 return std::make_pair(iCal->first, label - iCal->second);
0047 }
0048 }
0049 edm::LogError("LogicError") << "@SUB=PedeLabelerBase::calibrationParamFromLabel"
0050 << "Label " << label << "larger than first calibration's label, "
0051 << "but no calibration fits!";
0052 }
0053
0054
0055 return std::pair<IntegratedCalibrationBase *, unsigned int>(nullptr, 0);
0056 }
0057
0058
0059 unsigned int PedeLabelerBase::firstFreeLabel() const {
0060 unsigned int nextId = this->firstNonAlignableLabel();
0061
0062 for (auto iCal = theCalibrationLabels.begin(); iCal != theCalibrationLabels.end(); ++iCal) {
0063 nextId += iCal->first->numParameters();
0064 }
0065
0066 return nextId;
0067 }
0068
0069
0070 unsigned int PedeLabelerBase::firstNonAlignableLabel() const {
0071 return this->parameterInstanceOffset() * this->maxNumberOfParameterInstances() + 1;
0072 }
0073
0074
0075 unsigned int PedeLabelerBase::calibrationLabel(const IntegratedCalibrationBase *calib, unsigned int paramNum) const {
0076 if (!calib) {
0077 throw cms::Exception("LogicError") << "PedeLabelerBase::calibrationLabel: "
0078 << "nullPtr passed!\n";
0079 }
0080
0081
0082 for (auto iCal = theCalibrationLabels.begin(); iCal != theCalibrationLabels.end(); ++iCal) {
0083 if (iCal->first == calib) {
0084 if (paramNum < iCal->first->numParameters()) {
0085 return iCal->second + paramNum;
0086 } else {
0087 edm::LogError("LogicError") << "@SUB=PedeLabelerBase::calibrationLabel"
0088 << "IntegratedCalibration " << calib->name() << " has only "
0089 << iCal->first->numParameters() << " parameters, but " << paramNum << "requested!";
0090 }
0091 }
0092 }
0093
0094 edm::LogError("LogicError") << "@SUB=PedeLabelerBase::calibrationLabel"
0095 << "IntegratedCalibration " << calib->name() << " not known or too few parameters.";
0096
0097 return 0;
0098 }
0099
0100
0101 void PedeLabelerBase::addCalibrations(const std::vector<IntegratedCalibrationBase *> &iCals) {
0102 unsigned int nextId = this->firstFreeLabel();
0103
0104
0105 for (auto iCal = iCals.begin(); iCal != iCals.end(); ++iCal) {
0106 if (*iCal) {
0107 theCalibrationLabels.push_back(std::make_pair(*iCal, nextId));
0108 nextId += (*iCal)->numParameters();
0109 } else {
0110 edm::LogError("LogicError") << "@SUB=PedeLabelerBase::addCalibrations"
0111 << "Ignoring nullPtr.";
0112 }
0113 }
0114 }