Go to the documentation of this file.00001
00011 #include "PedeLabeler.h"
00012
00013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00014
00015 #include "Alignment/CommonAlignment/interface/Alignable.h"
00016 #include "Alignment/CommonAlignment/interface/AlignableExtras.h"
00017 #include "Alignment/CommonAlignmentParametrization/interface/RigidBodyAlignmentParameters.h"
00018
00019
00020
00021 const unsigned int PedeLabeler::theMaxNumParam = RigidBodyAlignmentParameters::N_PARAM + 14;
00022 const unsigned int PedeLabeler::theMinLabel = 1;
00023
00024
00025 PedeLabeler::PedeLabeler(const std::vector<Alignable*> &alis)
00026 {
00027 this->buildMap(alis);
00028 }
00029
00030
00031 PedeLabeler::PedeLabeler(Alignable *ali1, Alignable *ali2, AlignableExtras *extras)
00032 {
00033 std::vector<Alignable*> alis;
00034 alis.push_back(ali1);
00035 alis.push_back(ali2);
00036
00037 if (extras) {
00038 align::Alignables allExtras = extras->components();
00039 for ( std::vector<Alignable*>::iterator it = allExtras.begin(); it != allExtras.end(); ++it ) {
00040 alis.push_back(*it);
00041 }
00042 }
00043
00044 this->buildMap(alis);
00045 }
00046
00047
00048
00049 PedeLabeler::~PedeLabeler()
00050 {
00051 }
00052
00053
00055 unsigned int PedeLabeler::alignableLabel(Alignable *alignable) const
00056 {
00057 if (!alignable) return 0;
00058
00059 AlignableToIdMap::const_iterator position = myAlignableToIdMap.find(alignable);
00060 if (position != myAlignableToIdMap.end()) {
00061 return position->second;
00062 } else {
00063 const DetId detId(alignable->id());
00064
00065 edm::LogError("LogicError")
00066 << "@SUB=PedeLabeler::alignableLabel" << "Alignable "
00067 << typeid(*alignable).name() << " not in map, det/subdet/alignableStructureType = "
00068 << detId.det() << "/" << detId.subdetId() << "/" << alignable->alignableObjectId();
00069 return 0;
00070 }
00071 }
00072
00073
00074 unsigned int PedeLabeler::lasBeamLabel(unsigned int lasBeamId) const
00075 {
00076 UintUintMap::const_iterator position = myLasBeamToLabelMap.find(lasBeamId);
00077 if (position != myLasBeamToLabelMap.end()) {
00078 return position->second;
00079 } else {
00080
00081 edm::LogError("LogicError") << "@SUB=PedeLabeler::lasBeamLabel"
00082 << "No label for beam Id " << lasBeamId;
00083 return 0;
00084 }
00085 }
00086
00087
00088 unsigned int PedeLabeler::parameterLabel(unsigned int aliLabel, unsigned int parNum) const
00089 {
00090 if (parNum >= theMaxNumParam) {
00091 throw cms::Exception("Alignment") << "@SUB=PedeLabeler::parameterLabel"
00092 << "Parameter number " << parNum
00093 << " out of range 0 <= num < " << theMaxNumParam;
00094 }
00095 return aliLabel + parNum;
00096 }
00097
00098
00099 unsigned int PedeLabeler::paramNumFromLabel(unsigned int paramLabel) const
00100 {
00101 if (paramLabel < theMinLabel) {
00102 edm::LogError("LogicError") << "@SUB=PedeLabeler::paramNumFromLabel"
00103 << "Label " << paramLabel << " should be >= " << theMinLabel;
00104 return 0;
00105 }
00106 return (paramLabel - theMinLabel) % theMaxNumParam;
00107 }
00108
00109
00110 unsigned int PedeLabeler::alignableLabelFromLabel(unsigned int paramLabel) const
00111 {
00112 return paramLabel - this->paramNumFromLabel(paramLabel);
00113 }
00114
00115
00116 Alignable* PedeLabeler::alignableFromLabel(unsigned int label) const
00117 {
00118 const unsigned int aliLabel = this->alignableLabelFromLabel(label);
00119 if (aliLabel < theMinLabel) return 0;
00120
00121 if (myIdToAlignableMap.empty()) const_cast<PedeLabeler*>(this)->buildReverseMap();
00122 IdToAlignableMap::const_iterator position = myIdToAlignableMap.find(aliLabel);
00123 if (position != myIdToAlignableMap.end()) {
00124 return position->second;
00125 } else {
00126
00127 UintUintMap::const_iterator position = myLabelToLasBeamMap.find(aliLabel);
00128 if (position == myLabelToLasBeamMap.end()) {
00129 edm::LogError("LogicError") << "@SUB=PedeLabeler::alignableFromLabel"
00130 << "Alignable label " << aliLabel << " not in map.";
00131 }
00132 return 0;
00133 }
00134 }
00135
00136
00137 unsigned int PedeLabeler::lasBeamIdFromLabel(unsigned int label) const
00138 {
00139 const unsigned int aliLabel = this->alignableLabelFromLabel(label);
00140 if (aliLabel < theMinLabel) return 0;
00141
00142 if (myLabelToLasBeamMap.empty()) const_cast<PedeLabeler*>(this)->buildReverseMap();
00143 UintUintMap::const_iterator position = myLabelToLasBeamMap.find(aliLabel);
00144 if (position != myLabelToLasBeamMap.end()) {
00145 return position->second;
00146 } else {
00147 edm::LogError("LogicError") << "@SUB=PedeLabeler::lasBeamIdFromLabel"
00148 << "Alignable label " << aliLabel << " not in map.";
00149 return 0;
00150 }
00151 }
00152
00153
00154 unsigned int PedeLabeler::buildMap(const std::vector<Alignable*> &alis)
00155 {
00156 myAlignableToIdMap.clear();
00157
00158 std::vector<Alignable*> allComps;
00159
00160 for (std::vector<Alignable*>::const_iterator iAli = alis.begin(); iAli != alis.end(); ++iAli) {
00161 if (*iAli) {
00162 allComps.push_back(*iAli);
00163 (*iAli)->recursiveComponents(allComps);
00164 }
00165 }
00166
00167 unsigned int id = theMinLabel;
00168 for (std::vector<Alignable*>::const_iterator iter = allComps.begin();
00169 iter != allComps.end(); ++iter) {
00170 myAlignableToIdMap.insert(AlignableToIdPair(*iter, id));
00171 id += theMaxNumParam;
00172 }
00173
00174
00175 myLasBeamToLabelMap.clear();
00176
00177
00178 unsigned int beamIds[] = { 0, 10, 20, 30, 40, 50, 60, 70,
00179 1, 11, 21, 31, 41, 51, 61, 71,
00180 100, 110, 120, 130, 140, 150, 160, 170,
00181 101, 111, 121, 131, 141, 151, 161, 171,
00182 200, 210, 220, 230, 240, 250, 260, 270};
00183
00184 const size_t nBeams = sizeof(beamIds)/sizeof(beamIds[0]);
00185 for (size_t iBeam = 0; iBeam < nBeams; ++iBeam) {
00186
00187 myLasBeamToLabelMap[beamIds[iBeam]] = id;
00188 id += theMaxNumParam;
00189 }
00190
00191
00192 return myAlignableToIdMap.size() + myLasBeamToLabelMap.size();
00193 }
00194
00195
00196 unsigned int PedeLabeler::buildReverseMap()
00197 {
00198
00199
00200 myIdToAlignableMap.clear();
00201
00202 for (AlignableToIdMap::iterator it = myAlignableToIdMap.begin();
00203 it != myAlignableToIdMap.end(); ++it) {
00204 const unsigned int key = (*it).second;
00205 Alignable *ali = (*it).first;
00206 myIdToAlignableMap[key] = ali;
00207 }
00208
00209
00210 myLabelToLasBeamMap.clear();
00211
00212 for (UintUintMap::const_iterator it = myLasBeamToLabelMap.begin();
00213 it != myLasBeamToLabelMap.end(); ++it) {
00214 myLabelToLasBeamMap[it->second] = it->first;
00215 }
00216
00217
00218 return myIdToAlignableMap.size() + myLabelToLasBeamMap.size();
00219 }
00220