00001
00008
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> > ¶mSels = 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);
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> ¶mSelChar,
00199 std::vector<bool> &result) const
00200 {
00201 result.clear();
00202
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
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 }