31 theMaxNumberOfParameterInstances(0)
33 std::vector<Alignable*> alis;
61 if (!alignable)
return 0;
65 return position->second;
67 const DetId detId(alignable->
id());
70 <<
"@SUB=MomentumDependentPedeLabeler::alignableLabel" <<
"Alignable " 71 <<
typeid(*alignable).name() <<
" not in map, det/subdet/alignableStructureType = " 72 << detId.det() <<
"/" << detId.subdetId() <<
"/" << alignable->
alignableObjectId();
83 if (!alignable)
return 0;
89 MomentumRangeParamMap::const_iterator positionParam = (*positionAli).second.find(param);
90 if (positionParam!=(*positionAli).second.end()) {
91 if (instance>=(*positionParam).second.size()) {
92 throw cms::Exception(
"Alignment") <<
"@SUB=MomentumDependentPedeLabeler::alignableLabelFromParamAndMomentum" 93 <<
"iovIdx out of bounds";
97 return position->second;
100 return position->second;
103 const DetId detId(alignable->
id());
106 <<
"@SUB=MomentumDependentPedeLabeler::alignableLabel" <<
"Alignable " 107 <<
typeid(*alignable).name() <<
" not in map, det/subdet/alignableStructureType = " 108 << detId.det() <<
"/" << detId.subdetId() <<
"/" << alignable->
alignableObjectId();
118 return position->second;
121 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::lasBeamLabel" 122 <<
"No label for beam Id " << lasBeamId;
131 throw cms::Exception(
"Alignment") <<
"@SUB=MomentumDependentPedeLabeler::parameterLabel" 132 <<
"Parameter number " << parNum
135 return aliLabel + parNum;
143 if (!alignable)
return 0;
146 throw cms::Exception(
"Alignment") <<
"@SUB=MomentumDependentPedeLabeler::parameterLabel" 147 <<
"Parameter number " << parNum
157 MomentumRangeParamMap::const_iterator positionParam = (*positionAli).second.find(parNum);
158 if (positionParam!=(*positionAli).second.end()) {
163 for (
const auto& iMomentum: momentumRanges) {
165 if (iMomentum.first<=mom && mom<iMomentum.second) {
170 const DetId detId(alignable->
id());
172 <<
"@SUB=MomentumDependentPedeLabeler::alignableLabel" <<
"Alignable " 173 <<
typeid(*alignable).name() <<
" not in map, det/subdet/alignableStructureType = " 174 << detId.det() <<
"/" << detId.subdetId() <<
"/" << alignable->
alignableObjectId();
177 return position->second + parNum;
181 return position->second + parNum;
184 const DetId detId(alignable->
id());
187 <<
"@SUB=MomentumDependentPedeLabeler::alignableLabel" <<
"Alignable " 188 <<
typeid(*alignable).name() <<
" not in map, det/subdet/alignableStructureType = " 189 << detId.det() <<
"/" << detId.subdetId() <<
"/" << alignable->
alignableObjectId();
208 size_t nMomentums = 1;
210 for (
const auto& iParam: (*positionAli).second) {
211 nMomentums =
std::max(nMomentums, iParam.second.size());
215 MomentumRangeParamMap::const_iterator iParam = (*positionAli).second.find(param);
216 if (iParam != (*positionAli).second.end()) {
217 return iParam->second.size();
231 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::paramNumFromLabel" 232 <<
"Label " << paramLabel <<
" should be >= " <<
theMinLabel;
252 return position->second;
257 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::alignableFromLabel" 258 <<
"Alignable label " << aliLabel <<
" not in map.";
272 return position->second;
274 edm::LogError(
"LogicError") <<
"@SUB=MomentumDependentPedeLabeler::lasBeamIdFromLabel" 275 <<
"Alignable label " << aliLabel <<
" not in map.";
284 std::vector<std::string>
result;
289 if (delimiterPos == std::string::npos) {
290 result.push_back(s.substr(previousPos));
293 result.push_back(s.substr(previousPos, delimiterPos - previousPos));
294 previousPos = delimiterPos + 1;
303 std::vector<unsigned int>
result;
305 if (selString[
pos]==
'1') result.push_back(
pos);
319 std::vector<char> paramSelDumthe(6,
'1');
321 const auto parameterInstancesVPSet =
322 config.
getParameter<std::vector<edm::ParameterSet> >(
"parameterInstances");
324 for (
const auto& iter: parameterInstancesVPSet) {
326 const auto tempMomentumRanges = iter.getParameter<std::vector<std::string> >(
"momentumRanges");
327 if (tempMomentumRanges.empty()) {
328 throw cms::Exception(
"BadConfig") <<
"@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n" 329 <<
"MomentumRanges empty\n";
335 for (
unsigned int iMomentum=0;iMomentum<tempMomentumRanges.size();++iMomentum) {
336 std::vector<std::string> tokens =
edm::tokenize(tempMomentumRanges[iMomentum],
":");
338 lower = strtod(tokens[0].c_str(),
nullptr);
339 upper = strtod(tokens[1].c_str(),
nullptr);
341 MomentumRanges.push_back(std::pair<float,float>(lower, upper));
344 const auto selStrings = iter.getParameter<std::vector<std::string> >(
"selector");
345 for (
const auto& iSel: selStrings) {
346 std::vector<std::string> decompSel(this->
decompose(iSel,
','));
348 if (decompSel.size()!=2) {
349 throw cms::Exception(
"BadConfig") <<
"@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n" 350 << iSel <<
" should have at least 2 ','-separated parts\n";
353 std::vector<unsigned int> selParam = this->
convertParamSel(decompSel[1]);
358 for (
const auto& iAli: alis) {
360 if(iAli->alignmentParameters() ==
nullptr) {
362 <<
"@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n" 363 <<
"Momentum dependence configured for alignable of type " 365 <<
" at (" << iAli->globalPosition().x() <<
"," 366 << iAli->globalPosition().y() <<
"," 367 << iAli->globalPosition().z()<<
"), " 368 <<
"but that has no parameters. Please check that all run " 369 <<
"momentum parameters are also selected for alignment.\n";
372 for (
const auto& iParam: selParam) {
377 if (static_cast<int>(selParam[selParam.size()-1]) >= AliParams->
size()) {
378 throw cms::Exception(
"BadConfig") <<
"@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n" 379 <<
"mismatch in number of parameters\n";
382 MomentumRangeParamMap::const_iterator positionParam = (*positionAli).second.find(iParam);
383 if (positionParam!=(*positionAli).second.end()) {
384 throw cms::Exception(
"BadConfig") <<
"@SUB=MomentumDependentPedeLabeler::buildMomentumDependencyMap\n" 385 <<
"Momentum range for parameter specified twice\n";
403 std::vector<Alignable*> allComps;
405 for (
const auto& iAli: alis) {
407 allComps.push_back(iAli);
408 iAli->recursiveComponents(allComps);
413 for (
const auto& iter: allComps) {
422 unsigned int beamIds[] = { 0, 10, 20, 30, 40, 50, 60, 70,
423 1, 11, 21, 31, 41, 51, 61, 71,
424 100, 110, 120, 130, 140, 150, 160, 170,
425 101, 111, 121, 131, 141, 151, 161, 171,
426 200, 210, 220, 230, 240, 250, 260, 270};
428 const size_t nBeams =
sizeof(beamIds)/
sizeof(beamIds[0]);
429 for (
size_t iBeam = 0; iBeam < nBeams; ++iBeam) {
436 throw cms::Exception(
"Alignment") <<
"@SUB=MomentumDependentPedeLabeler::buildMap: " 437 <<
"Too many labels per instance (" <<
id-1 <<
") leading to double use, " 438 <<
"increase PedeLabelerBase::theParamInstanceOffset!\n";
451 const unsigned int key = it.second;
455 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
unsigned int buildMap(const std::vector< Alignable * > &alis)
returns size of map
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 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< 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)
eventInfo
add run, event number and lumi section
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