CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/Alignment/MillePedeAlignmentAlgorithm/src/PedeLabeler.cc

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 // NOTE: Changing '+14' makes older binary files unreadable...
00021 const unsigned int PedeLabeler::theMaxNumParam = RigidBodyAlignmentParameters::N_PARAM + 14;
00022 const unsigned int PedeLabeler::theMinLabel = 1; // must be > 0
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     //throw cms::Exception("LogicError") 
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     //throw cms::Exception("LogicError") 
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; // error already given
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     // error only if not in lasBeamMap:
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; // error already given
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(); // just in case of re-use...
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   // also care about las beams
00175   myLasBeamToLabelMap.clear(); // just in case of re-use...
00176   // FIXME: Temporarily hard code values stolen from 
00177   // https://twiki.cern.ch/twiki/bin/view/CMS/TkLasTrackBasedInterface#Beam_identifier .
00178   unsigned int beamIds[] = {  0,  10,  20,  30,  40,  50,  60,  70, // TEC+ R4
00179                               1,  11,  21,  31,  41,  51,  61,  71, // TEC+ R6
00180                             100, 110, 120, 130, 140, 150, 160, 170, // TEC- R4
00181                             101, 111, 121, 131, 141, 151, 161, 171, // TEC- R6
00182                             200, 210, 220, 230, 240, 250, 260, 270};// AT
00183 
00184   const size_t nBeams = sizeof(beamIds)/sizeof(beamIds[0]);
00185   for (size_t iBeam = 0; iBeam < nBeams; ++iBeam) {
00186     //edm::LogInfo("Alignment") << "Las beam " << beamIds[iBeam] << " gets label " << id << ".";
00187     myLasBeamToLabelMap[beamIds[iBeam]] = id;
00188     id += theMaxNumParam;
00189   }
00190 
00191   // return combined size
00192   return myAlignableToIdMap.size() + myLasBeamToLabelMap.size();
00193 }
00194 
00195 //_________________________________________________________________________
00196 unsigned int PedeLabeler::buildReverseMap()
00197 {
00198 
00199   // alignables
00200   myIdToAlignableMap.clear();  // just in case of re-use...
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   // las beams
00210   myLabelToLasBeamMap.clear(); // just in case of re-use...
00211 
00212   for (UintUintMap::const_iterator it = myLasBeamToLabelMap.begin();
00213        it != myLasBeamToLabelMap.end(); ++it) {
00214     myLabelToLasBeamMap[it->second] = it->first; //revert key/value
00215   }
00216 
00217   // return combined size
00218   return myIdToAlignableMap.size() + myLabelToLasBeamMap.size();
00219 }
00220