ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/CMSSW/Alignment/CommonAlignmentAlgorithm/src/AlignmentParameterBuilder.cc
Revision: 1.20
Committed: Mon Jan 7 20:56:25 2013 UTC (12 years, 3 months ago) by wmtan
Content type: text/plain
Branch: MAIN
CVS Tags: CMSSW_6_2_0, CMSSW_6_2_0_pre7_TS133806, CMSSW_6_2_0_pre8, V04-00-14, V04-00-13, CMSSW_6_2_0_pre7_TS132947, CMSSW_6_2_0_pre7_g496p02, CMSSW_6_2_0_pre7, V04-00-12, CMSSW_6_2_0_pre6_patch1, CMSSW_6_2_0_pre6, CMSSW_6_2_0_pre5slc6, CMSSW_6_2_0_pre5, CMSSW_6_2_0_pre4, CMSSW_6_2_0_pre3, CMSSW_6_2_0_pre2, CMSSW_6_2_0_pre1, V04-00-11, HEAD
Changes since 1.19: +7 -2 lines
Log Message:
Get geometry from the EventSetup system, rather than having it hard coded in the data formats

File Contents

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