31 theMaxNumberOfParameterInstances(0) {
59 return position->second;
61 const DetId detId(alignable->
id());
63 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::alignableLabel" 64 <<
"Alignable " <<
typeid(*alignable).name()
65 <<
" not in map, det/subdet/alignableStructureType = " << detId.det() <<
"/" 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";
91 return position->second;
94 return position->second;
97 const DetId detId(alignable->
id());
99 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::alignableLabel" 100 <<
"Alignable " <<
typeid(*alignable).name()
101 <<
" not in map, det/subdet/alignableStructureType = " << detId.det() <<
"/" 111 return position->second;
114 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::lasBeamLabel" 115 <<
"No label for beam Id " << lasBeamId;
123 throw cms::Exception(
"Alignment") <<
"@SUB=MomentumDependentPedeLabeler::parameterLabel" 124 <<
"Parameter number " << parNum <<
" out of range 0 <= num < " <<
theMaxNumParam;
126 return aliLabel + parNum;
138 throw cms::Exception(
"Alignment") <<
"@SUB=MomentumDependentPedeLabeler::parameterLabel" 139 <<
"Parameter number " << parNum <<
" out of range 0 <= num < " <<
theMaxNumParam;
146 MomentumRangeParamMap::const_iterator positionParam = (*positionAli).second.find(parNum);
147 if (positionParam != (*positionAli).second.end()) {
151 for (
const auto &iMomentum : momentumRanges) {
152 if (iMomentum.first <= mom && mom < iMomentum.second) {
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() <<
"/" 164 return position->second + parNum;
168 return position->second + parNum;
171 const DetId detId(alignable->
id());
173 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::alignableLabel" 174 <<
"Alignable " <<
typeid(*alignable).name()
175 <<
" not in map, det/subdet/alignableStructureType = " << detId.det() <<
"/" 193 size_t nMomentums = 1;
195 for (
const auto &iParam : (*positionAli).second) {
196 nMomentums =
std::max(nMomentums, iParam.second.size());
200 MomentumRangeParamMap::const_iterator iParam = (*positionAli).second.find(param);
201 if (iParam != (*positionAli).second.end()) {
202 return iParam->second.size();
215 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::paramNumFromLabel" 216 <<
"Label " << paramLabel <<
" should be >= " <<
theMinLabel;
235 return position->second;
240 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::alignableFromLabel" 241 <<
"Alignable label " << aliLabel <<
" not in map.";
255 return position->second;
257 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::lasBeamIdFromLabel" 258 <<
"Alignable label " << aliLabel <<
" not in map.";
266 std::vector<std::string>
result;
271 if (delimiterPos == std::string::npos) {
272 result.push_back(s.substr(previousPos));
275 result.push_back(s.substr(previousPos, delimiterPos - previousPos));
276 previousPos = delimiterPos + 1;
284 std::vector<unsigned int>
result;
286 if (selString[
pos] ==
'1')
287 result.push_back(
pos);
300 std::vector<char> paramSelDumthe(6,
'1');
302 const auto parameterInstancesVPSet = config.
getParameter<std::vector<edm::ParameterSet> >(
"parameterInstances");
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";
314 for (
unsigned int iMomentum = 0; iMomentum < tempMomentumRanges.size(); ++iMomentum) {
315 std::vector<std::string> tokens =
edm::tokenize(tempMomentumRanges[iMomentum],
":");
317 lower = strtod(tokens[0].c_str(),
nullptr);
318 upper = strtod(tokens[1].c_str(),
nullptr);
320 MomentumRanges.push_back(std::pair<float, float>(lower, upper));
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,
','));
327 if (decompSel.size() != 2) {
328 throw cms::Exception(
"BadConfig") <<
"@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n" 329 << iSel <<
" should have at least 2 ','-separated parts\n";
332 std::vector<unsigned int> selParam = this->
convertParamSel(decompSel[1]);
337 for (
const auto &iAli : alis) {
338 if (iAli->alignmentParameters() ==
nullptr) {
340 <<
"@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n" 341 <<
"Momentum dependence configured for alignable of type " 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";
348 for (
const auto &iParam : selParam) {
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";
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";
379 for (
const auto &iAli : alis) {
381 allComps.push_back(iAli);
382 iAli->recursiveComponents(allComps);
387 for (
const auto &iter : allComps) {
396 unsigned int beamIds[] = {0, 10, 20, 30, 40, 50, 60, 70,
397 1, 11, 21, 31, 41, 51, 61, 71,
398 100, 110, 120, 130, 140, 150, 160, 170,
399 101, 111, 121, 131, 141, 151, 161, 171,
400 200, 210, 220, 230, 240, 250, 260, 270};
402 const size_t nBeams =
sizeof(beamIds) /
sizeof(beamIds[0]);
403 for (
size_t iBeam = 0; iBeam < nBeams; ++iBeam) {
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";
424 const unsigned int key = it.second;
428 for (
unsigned int iInstance = 0; iInstance < nInstances; ++iInstance) {
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 'first' component GeomDet(Unit).
~MomentumDependentPedeLabeler() override
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
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
AlignableTracker * aliTracker_
void clear()
remove all selected Alignables and geometrical restrictions
Container::value_type value_type
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
UintUintMap theLasBeamToLabelMap
reverse map
unsigned int buildReverseMap()
returns size of map
AlignableExtras * aliExtras_
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
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
std::vector< MomentumRange > MomentumRangeVector
unsigned int addSelection(const std::string &name, const std::vector< char > ¶mSel)
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]
#define DEFINE_EDM_PLUGIN(factory, type, name)
unsigned int theMaxNumberOfParameterInstances
AlignableToIdMap theAlignableToIdMap
std::vector< unsigned int > convertParamSel(const std::string &selString) const
Constructor of the full muon geometry.
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'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