ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/CMSSW/Alignment/CommonAlignmentAlgorithm/src/AlignmentParameterBuilder.cc
Revision: 1.18
Committed: Fri Sep 10 11:36:58 2010 UTC (14 years, 7 months ago) by mussgill
Content type: text/plain
Branch: MAIN
CVS Tags: CMSSW_3_9_9_patch1, CMSSW_3_9_9, CMSSW_3_9_8_patch2, CMSSW_3_9_8_patch1, CMSSW_3_9_8, CMSSW_3_9_7, CMSSW_3_9_6, CMSSW_3_9_5_patch2, CMSSW_3_9_5_patch1, CMSSW_3_9_5, CMSSW_3_9_4, CMSSW_3_9_3, CMSSW_3_9_2_patch5, CMSSW_3_9_2_patch4, CMSSW_3_9_2_patch3, CMSSW_3_9_2_patch2, CMSSW_3_9_2_patch1, CMSSW_3_9_2, CMSSW_3_9_1_patch1, CMSSW_3_9_1, CMSSW_3_10_0_pre2, CMSSW_3_10_0_pre1, CMSSW_3_9_0, CMSSW_3_9_0_pre7, V03-03-02, CMSSW_3_9_0_pre6, CMSSW_3_9_0_pre5, V03-03-01
Changes since 1.17: +25 -9 lines
Log Message:
added support for extra alignable container (AlignableExtras)

File Contents

# User Rev Content
1 flucke 1.5 /** \file AlignableParameterBuilder.cc
2     *
3 mussgill 1.18 * $Date: 2008/09/02 15:31:23 $
4     * $Revision: 1.17 $
5 fronga 1.13
6     */
7 flucke 1.5
8 flucke 1.17 // This class's header should be first:
9     #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterBuilder.h"
10    
11 fronga 1.1 #include "FWCore/MessageLogger/interface/MessageLogger.h"
12 flucke 1.8 #include "FWCore/ParameterSet/interface/ParameterSet.h"
13 flucke 1.17 #include "FWCore/Utilities/interface/Exception.h"
14 flucke 1.8
15 fronga 1.1 #include "Alignment/CommonAlignment/interface/Alignable.h"
16 flucke 1.17 #include "Alignment/CommonAlignment/interface/AlignmentParameters.h"
17 fronga 1.1
18 flucke 1.17 #include "Alignment/CommonAlignmentParametrization/interface/AlignmentParametersFactory.h"
19 fronga 1.1
20 flucke 1.9 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterSelector.h"
21 flucke 1.12 #include "Alignment/CommonAlignmentAlgorithm/interface/SelectionUserVariables.h"
22 flucke 1.8
23 fronga 1.1
24 flucke 1.17 using namespace AlignmentParametersFactory;
25 fronga 1.1
26     //__________________________________________________________________________________________________
27 mussgill 1.18 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
28     AlignableExtras* alignableExtras) :
29     theAlignables(),
30     theAlignableTracker(alignableTracker),
31     theAlignableMuon(0),
32     theAlignableExtras(alignableExtras)
33 fronga 1.13 {
34     }
35    
36     //__________________________________________________________________________________________________
37     AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
38 mussgill 1.18 AlignableMuon* alignableMuon,
39     AlignableExtras* alignableExtras) :
40     theAlignables(),
41     theAlignableTracker(alignableTracker),
42     theAlignableMuon(alignableMuon),
43     theAlignableExtras(alignableExtras)
44 fronga 1.13 {
45     }
46    
47    
48     //__________________________________________________________________________________________________
49     AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
50 mussgill 1.18 AlignableExtras* alignableExtras,
51 fronga 1.13 const edm::ParameterSet &pSet) :
52 mussgill 1.18 theAlignables(),
53     theAlignableTracker(alignableTracker),
54     theAlignableMuon(0),
55     theAlignableExtras(alignableExtras)
56 fronga 1.1 {
57 flucke 1.17 this->addAllSelections(pSet);
58 flucke 1.8 }
59 fronga 1.1
60 flucke 1.8 //__________________________________________________________________________________________________
61     AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
62 fronga 1.13 AlignableMuon* alignableMuon,
63 mussgill 1.18 AlignableExtras* alignableExtras,
64 fronga 1.13 const edm::ParameterSet &pSet) :
65 mussgill 1.18 theAlignables(),
66     theAlignableTracker(alignableTracker),
67     theAlignableMuon(alignableMuon),
68     theAlignableExtras(alignableExtras)
69 flucke 1.8 {
70 flucke 1.17 this->addAllSelections(pSet);
71 fronga 1.1 }
72    
73 flucke 1.17 //__________________________________________________________________________________________________
74     void AlignmentParameterBuilder::addAllSelections(const edm::ParameterSet &pSet)
75     {
76     AlignmentParameterSelector selector(0);
77     std::vector<std::string> selsTypes(pSet.getParameter<std::vector<std::string> >("parameterTypes"));
78    
79     for (unsigned int i = 0; i < selsTypes.size(); ++i) {
80     std::vector<std::string> selSetType(selector.decompose(selsTypes[i], ','));
81     if (selSetType.size() != 2) {
82     throw cms::Exception("BadConfig") << "AlignmentParameterBuilder"
83     << "parameterTypes should contain 2 comma separated strings"
84     << ", but found '" << selsTypes[i] << "'.";
85     }
86     this->addSelections(pSet.getParameter<edm::ParameterSet>(selSetType[0]),
87     AlignmentParametersFactory::parametersType(selSetType[1]));
88     }
89     }
90 fronga 1.13
91 fronga 1.1 //__________________________________________________________________________________________________
92 flucke 1.17 unsigned int AlignmentParameterBuilder::addSelections(const edm::ParameterSet &pSet,
93     ParametersType parType)
94 flucke 1.8 {
95    
96 flucke 1.17 const unsigned int oldAliSize = theAlignables.size();
97    
98 mussgill 1.18 AlignmentParameterSelector selector( theAlignableTracker, theAlignableMuon, theAlignableExtras );
99 fronga 1.13 const unsigned int addedSets = selector.addSelections(pSet);
100 flucke 1.8
101 cklae 1.16 const align::Alignables &alignables = selector.selectedAlignables();
102 fronga 1.13 const std::vector<std::vector<char> > &paramSels = selector.selectedParameters();
103    
104 cklae 1.16 align::Alignables::const_iterator iAli = alignables.begin();
105 fronga 1.13 std::vector<std::vector<char> >::const_iterator iParamSel = paramSels.begin();
106     unsigned int nHigherLevel = 0;
107    
108     while (iAli != alignables.end() && iParamSel != paramSels.end()) {
109     std::vector<bool> boolParSel;
110     bool charSelIsGeneral = this->decodeParamSel(*iParamSel, boolParSel);
111 flucke 1.17 if (this->add(*iAli, parType, boolParSel)) ++nHigherLevel;
112 fronga 1.13 if (charSelIsGeneral) this->addFullParamSel((*iAli)->alignmentParameters(), *iParamSel);
113    
114     ++iAli;
115     ++iParamSel;
116     }
117 flucke 1.5
118 fronga 1.13 edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::addSelections"
119     << " Added " << addedSets << " set(s) of alignables with "
120 flucke 1.17 << theAlignables.size() - oldAliSize << " alignables in total,"
121     << " of which " << nHigherLevel << " are higher level "
122     << "(using " << parametersTypeName(parType) << "AlignmentParameters).";
123 flucke 1.9
124 fronga 1.13 return addedSets;
125 flucke 1.5 }
126    
127     //__________________________________________________________________________________________________
128 flucke 1.17 bool AlignmentParameterBuilder::add(Alignable *alignable,
129     ParametersType parType,
130     const std::vector<bool> &sel)
131 flucke 1.9 {
132 flucke 1.17 AlignmentParameters *paras = AlignmentParametersFactory::createParameters(alignable, parType, sel);
133 flucke 1.9 alignable->setAlignmentParameters(paras);
134     theAlignables.push_back(alignable);
135    
136 flucke 1.15 const int aliTypeId = alignable->alignableObjectId();
137 cklae 1.16 const bool isHigherLevel = (aliTypeId != align::AlignableDet
138     && aliTypeId != align::AlignableDetUnit);
139 flucke 1.9 return isHigherLevel;
140 flucke 1.5 }
141    
142    
143     //__________________________________________________________________________________________________
144 cklae 1.16 unsigned int AlignmentParameterBuilder::add(const align::Alignables &alignables,
145 flucke 1.17 ParametersType parType, const std::vector<bool> &sel)
146 flucke 1.5 {
147    
148 flucke 1.9 unsigned int nHigherLevel = 0;
149 fronga 1.1
150 cklae 1.16 for (align::Alignables::const_iterator iAli = alignables.begin();
151 flucke 1.9 iAli != alignables.end(); ++iAli) {
152 flucke 1.17 if (this->add(*iAli, parType, sel)) ++nHigherLevel;
153 fronga 1.1 }
154    
155 flucke 1.9 return nHigherLevel;
156 fronga 1.1 }
157    
158    
159     //__________________________________________________________________________________________________
160     void AlignmentParameterBuilder::fixAlignables(int n)
161     {
162    
163 fpschill 1.3 if (n<1 || n>3) {
164 flucke 1.5 edm::LogError("BadArgument") << " n = " << n << " is not in [1,3]";
165 fronga 1.1 return;
166     }
167    
168 cklae 1.16 align::Alignables theNewAlignables;
169 fronga 1.1 int i=0;
170     int imax = theAlignables.size();
171 cklae 1.16 for ( align::Alignables::const_iterator ia=theAlignables.begin();
172 fronga 1.1 ia!=theAlignables.end(); ia++ )
173     {
174     i++;
175     if ( n==1 && i>1 )
176     theNewAlignables.push_back(*ia);
177     else if ( n==2 && i>1 && i<imax )
178     theNewAlignables.push_back(*ia);
179     else if ( n==3 && i>2 && i<imax)
180     theNewAlignables.push_back(*ia);
181     }
182    
183     theAlignables = theNewAlignables;
184    
185 flucke 1.10 edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::fixAlignables"
186     << "removing " << n << " alignables, so that "
187     << theAlignables.size() << " alignables left";
188 fronga 1.1 }
189    
190 flucke 1.12 //__________________________________________________________________________________________________
191     bool AlignmentParameterBuilder::decodeParamSel(const std::vector<char> &paramSelChar,
192     std::vector<bool> &result) const
193     {
194     result.clear();
195     bool anyNon01 = false;
196    
197     for (unsigned int pos = 0; pos < paramSelChar.size(); ++pos) {
198    
199     switch (paramSelChar[pos]) {
200     default:
201     anyNon01 = true;
202     // no break;
203     case '1':
204     result.push_back(true);
205     break;
206     case '0':
207     result.push_back(false);
208     break;
209     }
210     }
211    
212     return anyNon01;
213     }
214    
215     //__________________________________________________________________________________________________
216     bool AlignmentParameterBuilder::addFullParamSel(AlignmentParameters *aliParams,
217     const std::vector<char> &fullSel) const
218     {
219     if (!aliParams) return false;
220    
221     aliParams->setUserVariables(new SelectionUserVariables(fullSel));
222    
223     return true;
224     }