CMS 3D CMS Logo

AlignmentParameterBuilder.cc

Go to the documentation of this file.
00001 
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00010 
00011 #include "Alignment/CommonAlignment/interface/Alignable.h"
00012 
00013 #include "Alignment/CommonAlignmentParametrization/interface/RigidBodyAlignmentParameters.h"
00014 
00015 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterSelector.h"
00016 #include "Alignment/CommonAlignmentAlgorithm/interface/SelectionUserVariables.h"
00017 
00018 // This class's header
00019 
00020 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterBuilder.h"
00021 
00022 
00023 //__________________________________________________________________________________________________
00024 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker) :
00025   theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(0)
00026 {
00027 }
00028 
00029 //__________________________________________________________________________________________________
00030 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker, 
00031                                                      AlignableMuon* alignableMuon) :
00032   theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(alignableMuon)
00033 {
00034 }
00035 
00036 
00037 //__________________________________________________________________________________________________
00038 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
00039                                                      const edm::ParameterSet &pSet) :
00040   theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(0)
00041 {
00042   this->addSelections(pSet.getParameter<edm::ParameterSet>("Selector"));
00043 }
00044 
00045 
00046 //__________________________________________________________________________________________________
00047 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
00048                                                      AlignableMuon* alignableMuon,
00049                                                      const edm::ParameterSet &pSet) :
00050   theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(alignableMuon)
00051 {
00052   this->addSelections(pSet.getParameter<edm::ParameterSet>("Selector"));
00053 }
00054 
00055 
00056 //__________________________________________________________________________________________________
00057 unsigned int AlignmentParameterBuilder::addSelections(const edm::ParameterSet &pSet)
00058 {
00059 
00060   AlignmentParameterSelector selector( theAlignableTracker, theAlignableMuon );
00061   const unsigned int addedSets = selector.addSelections(pSet);
00062 
00063   const align::Alignables &alignables = selector.selectedAlignables();
00064   const std::vector<std::vector<char> > &paramSels = selector.selectedParameters();
00065 
00066   align::Alignables::const_iterator iAli = alignables.begin();
00067   std::vector<std::vector<char> >::const_iterator iParamSel = paramSels.begin();
00068   unsigned int nHigherLevel = 0;
00069 
00070   while (iAli != alignables.end() && iParamSel != paramSels.end()) {
00071     std::vector<bool> boolParSel;
00072     bool charSelIsGeneral = this->decodeParamSel(*iParamSel, boolParSel);
00073     if (this->add(*iAli, boolParSel)) ++nHigherLevel;
00074     if (charSelIsGeneral) this->addFullParamSel((*iAli)->alignmentParameters(), *iParamSel);
00075 
00076     ++iAli;
00077     ++iParamSel;
00078   }
00079 
00080   edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::addSelections"
00081                             << " Added " << addedSets << " set(s) of alignables with "
00082                             << theAlignables.size() << " alignables in total,"
00083                             << " of which " << nHigherLevel << " are higher level.";
00084    
00085   return addedSets;
00086 }
00087 
00088 //__________________________________________________________________________________________________
00089 bool AlignmentParameterBuilder::add(Alignable *alignable, const std::vector<bool> &sel)
00090 { 
00091 
00092   const AlgebraicVector par(RigidBodyAlignmentParameters::N_PARAM, 0);
00093   const AlgebraicSymMatrix cov(RigidBodyAlignmentParameters::N_PARAM, 0);
00094 
00095   // Which kind of AlignmentParameters must be selectable once we have other parametrisations:
00096   AlignmentParameters *paras = new RigidBodyAlignmentParameters(alignable, par, cov, sel);
00097   alignable->setAlignmentParameters(paras);
00098   theAlignables.push_back(alignable);
00099 
00100   const int aliTypeId = alignable->alignableObjectId();
00101   const bool isHigherLevel = (aliTypeId != align::AlignableDet
00102                               && aliTypeId != align::AlignableDetUnit);
00103   return isHigherLevel;
00104 }
00105 
00106 
00107 //__________________________________________________________________________________________________
00108 unsigned int AlignmentParameterBuilder::add(const align::Alignables &alignables,
00109                                             const std::vector<bool> &sel)
00110 {
00111 
00112   unsigned int nHigherLevel = 0;
00113 
00114   for (align::Alignables::const_iterator iAli = alignables.begin();
00115        iAli != alignables.end(); ++iAli) {
00116     if (this->add(*iAli, sel)) ++nHigherLevel;
00117   }
00118 
00119   return nHigherLevel;
00120 }
00121 
00122 
00123 //__________________________________________________________________________________________________
00124 void AlignmentParameterBuilder::fixAlignables(int n)
00125 {
00126 
00127   if (n<1 || n>3) {
00128     edm::LogError("BadArgument") << " n = " << n << " is not in [1,3]";
00129     return;
00130   }
00131 
00132   align::Alignables theNewAlignables;
00133   int i=0;
00134   int imax = theAlignables.size();
00135   for ( align::Alignables::const_iterator ia=theAlignables.begin();
00136         ia!=theAlignables.end();  ia++ ) 
00137         {
00138           i++;
00139           if ( n==1 && i>1 ) 
00140                 theNewAlignables.push_back(*ia);
00141           else if ( n==2 && i>1 && i<imax ) 
00142                 theNewAlignables.push_back(*ia);
00143           else if ( n==3 && i>2 && i<imax) 
00144                 theNewAlignables.push_back(*ia);
00145         }
00146 
00147   theAlignables = theNewAlignables;
00148 
00149   edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::fixAlignables"
00150                             << "removing " << n << " alignables, so that " 
00151                             << theAlignables.size() << " alignables left";
00152 }
00153 
00154 //__________________________________________________________________________________________________
00155 bool AlignmentParameterBuilder::decodeParamSel(const std::vector<char> &paramSelChar,
00156                                                std::vector<bool> &result) const
00157 {
00158   result.clear();
00159   bool anyNon01 = false;
00160 
00161   for (unsigned int pos = 0; pos < paramSelChar.size(); ++pos) {
00162 
00163     switch (paramSelChar[pos]) {
00164     default:
00165       anyNon01 = true;
00166       // no break;
00167     case '1':
00168       result.push_back(true);
00169       break;
00170     case '0':
00171       result.push_back(false);
00172       break;
00173     }
00174   }
00175 
00176   return anyNon01;
00177 }
00178 
00179 //__________________________________________________________________________________________________
00180 bool AlignmentParameterBuilder::addFullParamSel(AlignmentParameters *aliParams,
00181                                                 const std::vector<char> &fullSel) const
00182 {
00183   if (!aliParams) return false;
00184 
00185   aliParams->setUserVariables(new SelectionUserVariables(fullSel));
00186 
00187   return true;
00188 }

Generated on Tue Jun 9 17:23:47 2009 for CMSSW by  doxygen 1.5.4