CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/Alignment/CommonAlignmentAlgorithm/src/AlignmentParameterBuilder.cc

Go to the documentation of this file.
00001 
00008 // This class's header should be first:
00009 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterBuilder.h"
00010 
00011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00013 #include "FWCore/Utilities/interface/Exception.h"
00014 
00015 #include "Alignment/CommonAlignment/interface/Alignable.h"
00016 #include "Alignment/CommonAlignment/interface/AlignmentParameters.h"
00017 
00018 #include "Alignment/CommonAlignmentParametrization/interface/AlignmentParametersFactory.h"
00019 
00020 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterSelector.h"
00021 #include "Alignment/CommonAlignmentAlgorithm/interface/SelectionUserVariables.h"
00022 
00023 #include <algorithm>
00024 
00025 using namespace AlignmentParametersFactory;
00026 
00027 //__________________________________________________________________________________________________
00028 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
00029                                                      AlignableExtras* alignableExtras) :
00030   theAlignables(),
00031   theAlignableTracker(alignableTracker),
00032   theAlignableMuon(0),
00033   theAlignableExtras(alignableExtras)
00034 {
00035 }
00036 
00037 //__________________________________________________________________________________________________
00038 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker, 
00039                                                      AlignableMuon* alignableMuon,
00040                                                      AlignableExtras* alignableExtras) :
00041   theAlignables(), 
00042   theAlignableTracker(alignableTracker),
00043   theAlignableMuon(alignableMuon),
00044   theAlignableExtras(alignableExtras)
00045 {
00046 }
00047 
00048 
00049 //__________________________________________________________________________________________________
00050 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
00051                                                      AlignableExtras* alignableExtras,
00052                                                      const edm::ParameterSet &pSet) :
00053   theAlignables(), 
00054   theAlignableTracker(alignableTracker),
00055   theAlignableMuon(0),
00056   theAlignableExtras(alignableExtras)
00057 {
00058   this->addAllSelections(pSet);
00059 }
00060 
00061 //__________________________________________________________________________________________________
00062 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
00063                                                      AlignableMuon* alignableMuon,
00064                                                      AlignableExtras* alignableExtras,
00065                                                      const edm::ParameterSet &pSet) :
00066   theAlignables(), 
00067   theAlignableTracker(alignableTracker),
00068   theAlignableMuon(alignableMuon),
00069   theAlignableExtras(alignableExtras)
00070 {
00071   this->addAllSelections(pSet);
00072 }
00073 
00074 const AlignableTracker* AlignmentParameterBuilder::alignableTracker() const
00075 {
00076   return theAlignableTracker;
00077 }
00078 
00079 //__________________________________________________________________________________________________
00080 void AlignmentParameterBuilder::addAllSelections(const edm::ParameterSet &pSet)
00081 {
00082   AlignmentParameterSelector selector(0);
00083   std::vector<std::string> selsTypes(pSet.getParameter<std::vector<std::string> >("parameterTypes"));
00084   
00085   for (unsigned int i = 0; i < selsTypes.size(); ++i) {
00086     std::vector<std::string> selSetType(selector.decompose(selsTypes[i], ','));
00087     if (selSetType.size() != 2) {
00088       throw cms::Exception("BadConfig") << "AlignmentParameterBuilder"
00089                                         << "parameterTypes should contain 2 comma separated strings"
00090                                         << ", but found '" << selsTypes[i] << "'.";
00091     }
00092     this->addSelections(pSet.getParameter<edm::ParameterSet>(selSetType[0]),
00093                         AlignmentParametersFactory::parametersType(selSetType[1]));
00094   }
00095 }
00096 
00097 //__________________________________________________________________________________________________
00098 unsigned int AlignmentParameterBuilder::addSelections(const edm::ParameterSet &pSet,
00099                                                       ParametersType parType)
00100 {
00101 
00102   const unsigned int oldAliSize = theAlignables.size();
00103 
00104   AlignmentParameterSelector selector( theAlignableTracker, theAlignableMuon, theAlignableExtras );
00105   const unsigned int addedSets = selector.addSelections(pSet);
00106 
00107   const align::Alignables &alignables = selector.selectedAlignables();
00108   const std::vector<std::vector<char> > &paramSels = selector.selectedParameters();
00109 
00110   align::Alignables::const_iterator iAli = alignables.begin();
00111   std::vector<std::vector<char> >::const_iterator iParamSel = paramSels.begin();
00112   unsigned int nHigherLevel = 0;
00113 
00114   while (iAli != alignables.end() && iParamSel != paramSels.end()) {
00115     std::vector<bool> boolParSel;
00116     std::vector<char> parSel(*iParamSel); // copy, since decodeParamSel may manipulate
00117     bool charSelIsGeneral = this->decodeParamSel(parSel, boolParSel);
00118     if (this->add(*iAli, parType, boolParSel)) ++nHigherLevel;
00119     if (charSelIsGeneral) this->addFullParamSel((*iAli)->alignmentParameters(), parSel);
00120 
00121     ++iAli;
00122     ++iParamSel;
00123   }
00124 
00125   edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::addSelections"
00126                             << " Added " << addedSets << " set(s) of alignables with "
00127                             << theAlignables.size() - oldAliSize << " alignables in total,"
00128                             << " of which " << nHigherLevel << " are higher level "
00129                             << "(using " << parametersTypeName(parType) << "AlignmentParameters).";
00130    
00131   return addedSets;
00132 }
00133 
00134 //__________________________________________________________________________________________________
00135 bool AlignmentParameterBuilder::add(Alignable *alignable,
00136                                     ParametersType parType,
00137                                     const std::vector<bool> &sel)
00138 { 
00139   AlignmentParameters *paras = AlignmentParametersFactory::createParameters(alignable, parType, sel);
00140   alignable->setAlignmentParameters(paras);
00141   theAlignables.push_back(alignable);
00142 
00143   const int aliTypeId = alignable->alignableObjectId();
00144   const bool isHigherLevel = (aliTypeId != align::AlignableDet
00145                               && aliTypeId != align::AlignableDetUnit);
00146   return isHigherLevel;
00147 }
00148 
00149 
00150 //__________________________________________________________________________________________________
00151 unsigned int AlignmentParameterBuilder::add(const align::Alignables &alignables,
00152                                             ParametersType parType, const std::vector<bool> &sel)
00153 {
00154 
00155   unsigned int nHigherLevel = 0;
00156 
00157   for (align::Alignables::const_iterator iAli = alignables.begin();
00158        iAli != alignables.end(); ++iAli) {
00159     if (this->add(*iAli, parType, sel)) ++nHigherLevel;
00160   }
00161 
00162   return nHigherLevel;
00163 }
00164 
00165 
00166 //__________________________________________________________________________________________________
00167 void AlignmentParameterBuilder::fixAlignables(int n)
00168 {
00169 
00170   if (n<1 || n>3) {
00171     edm::LogError("BadArgument") << " n = " << n << " is not in [1,3]";
00172     return;
00173   }
00174 
00175   align::Alignables theNewAlignables;
00176   int i=0;
00177   int imax = theAlignables.size();
00178   for ( align::Alignables::const_iterator ia=theAlignables.begin();
00179         ia!=theAlignables.end();  ia++ ) 
00180         {
00181           i++;
00182           if ( n==1 && i>1 ) 
00183                 theNewAlignables.push_back(*ia);
00184           else if ( n==2 && i>1 && i<imax ) 
00185                 theNewAlignables.push_back(*ia);
00186           else if ( n==3 && i>2 && i<imax) 
00187                 theNewAlignables.push_back(*ia);
00188         }
00189 
00190   theAlignables = theNewAlignables;
00191 
00192   edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::fixAlignables"
00193                             << "removing " << n << " alignables, so that " 
00194                             << theAlignables.size() << " alignables left";
00195 }
00196 
00197 //__________________________________________________________________________________________________
00198 bool AlignmentParameterBuilder::decodeParamSel(std::vector<char> &paramSelChar,
00199                                                std::vector<bool> &result) const
00200 {
00201   result.clear();
00202   // remove all spaces from paramSelChar - useful to group the parameters if they are many
00203   paramSelChar.erase(std::remove(paramSelChar.begin(), paramSelChar.end(), ' '),
00204                      paramSelChar.end());
00205 
00206   bool anyNon01 = false;
00207 
00208   for (unsigned int pos = 0; pos < paramSelChar.size(); ++pos) {
00209 
00210     switch (paramSelChar[pos]) {
00211     default:
00212       anyNon01 = true;
00213       // no break;
00214     case '1':
00215       result.push_back(true);
00216       break;
00217     case '0':
00218       result.push_back(false);
00219       break;
00220     }
00221   }
00222 
00223   return anyNon01;
00224 }
00225 
00226 //__________________________________________________________________________________________________
00227 bool AlignmentParameterBuilder::addFullParamSel(AlignmentParameters *aliParams,
00228                                                 const std::vector<char> &fullSel) const
00229 {
00230   if (!aliParams) return false;
00231 
00232   aliParams->setUserVariables(new SelectionUserVariables(fullSel));
00233 
00234   return true;
00235 }