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
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> > ¶mSels = 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
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> ¶mSelChar,
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
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 }