ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/CMSSW/Alignment/CommonAlignmentAlgorithm/src/AlignmentParameterBuilder.cc
Revision: 1.14
Committed: Fri Mar 2 12:16:56 2007 UTC (18 years, 2 months ago) by fronga
Content type: text/plain
Branch: MAIN
CVS Tags: CMSSW_1_4_10, CMSSW_1_4_9, CMSSW_1_4_8, CMSSW_1_4_7, CMSSW_1_5_4, CMSSW_1_5_3, CMSSW_1_4_6, CMSSW_1_6_0_pre4, CMSSW_1_5_2, CMSSW_1_6_0_pre3, CMSSW_1_6_0_pre2, CMSSW_1_6_0_pre1, CMSSW_1_5_1, CMSSW_1_4_5, CMSSW_1_5_0, V01-08-01, V01-04-00-05, CMSSW_1_4_3g483, CMSSW_1_4_4, CMSSW_1_5_0_pre6, CMSSW_1_4_3, V01-04-00-03, V01-08-00, CMSSW_1_5_0_pre5, CMSSW_1_4_2, CMSSW_1_4_1, CMSSW_1_5_0_pre4, V01-07-04, CMSSW_1_5_0_pre3, V01-07-03, V01-07-02, CMSSW_1_4_0_DAQ1, V01-06-01, V01-07-01, V01-04-00-02, CMSSW_1_4_0, CMSSW_1_5_0_pre2, CMSSW_1_4_0_pre7, CMSSW_1_4_0_pre6, CMSSW_1_4_0_pre5, V01-07-00, V01-04-00-01, CMSSW_1_5_0_pre1, CMSSW_1_4_0_pre4, V01-06-00, V01-05-00, V01-04-01, CMSSW_1_4_0_pre3, CMSSW_1_4_0_pre2, V01-04-00, V01-03-01, CMSSW_1_4_0_pre1, V01-03-00, cklae_20070314, V01-02-00, V01-01-04
Branch point for: V01-04-00-04
Changes since 1.13: +3 -3 lines
Log Message:
Changed header location (see https://hypernews.cern.ch/HyperNews/CMS/get/swDevelopment/792/1.html)

File Contents

# User Rev Content
1 flucke 1.5 /** \file AlignableParameterBuilder.cc
2     *
3 fronga 1.14 * $Date: 2007/01/23 16:07:08 $
4     * $Revision: 1.13 $
5 fronga 1.13
6     */
7 flucke 1.5
8 fronga 1.1 #include "FWCore/MessageLogger/interface/MessageLogger.h"
9 flucke 1.8 #include "FWCore/ParameterSet/interface/ParameterSet.h"
10    
11 fronga 1.14 #include "DataFormats/CLHEP/interface/AlgebraicObjects.h"
12 fronga 1.1 #include "Alignment/CommonAlignment/interface/Alignable.h"
13     #include "Alignment/CommonAlignment/interface/AlignableDet.h"
14    
15     #include "Alignment/CommonAlignmentParametrization/interface/RigidBodyAlignmentParameters.h"
16     #include "Alignment/CommonAlignmentParametrization/interface/CompositeRigidBodyAlignmentParameters.h"
17    
18 flucke 1.9 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterSelector.h"
19 flucke 1.12 #include "Alignment/CommonAlignmentAlgorithm/interface/SelectionUserVariables.h"
20 flucke 1.8
21 fronga 1.1 // This class's header
22    
23     #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterBuilder.h"
24    
25    
26     //__________________________________________________________________________________________________
27 flucke 1.8 AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker) :
28 fronga 1.13 theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(0)
29     {
30     }
31    
32     //__________________________________________________________________________________________________
33     AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
34     AlignableMuon* alignableMuon) :
35     theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(alignableMuon)
36     {
37     }
38    
39    
40     //__________________________________________________________________________________________________
41     AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
42     const edm::ParameterSet &pSet) :
43     theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(0)
44 fronga 1.1 {
45 fronga 1.13 this->addSelections(pSet.getParameter<edm::ParameterSet>("Selector"));
46 flucke 1.8 }
47 fronga 1.1
48 fronga 1.13
49 flucke 1.8 //__________________________________________________________________________________________________
50     AlignmentParameterBuilder::AlignmentParameterBuilder(AlignableTracker* alignableTracker,
51 fronga 1.13 AlignableMuon* alignableMuon,
52     const edm::ParameterSet &pSet) :
53     theAlignables(), theAlignableTracker(alignableTracker), theAlignableMuon(alignableMuon)
54 flucke 1.8 {
55 fronga 1.11 this->addSelections(pSet.getParameter<edm::ParameterSet>("Selector"));
56 fronga 1.1 }
57    
58 fronga 1.13
59 fronga 1.1 //__________________________________________________________________________________________________
60 flucke 1.8 unsigned int AlignmentParameterBuilder::addSelections(const edm::ParameterSet &pSet)
61     {
62    
63 fronga 1.13 AlignmentParameterSelector selector( theAlignableTracker, theAlignableMuon );
64     const unsigned int addedSets = selector.addSelections(pSet);
65 flucke 1.8
66 fronga 1.13 const std::vector<Alignable*> &alignables = selector.selectedAlignables();
67     const std::vector<std::vector<char> > &paramSels = selector.selectedParameters();
68    
69     std::vector<Alignable*>::const_iterator iAli = alignables.begin();
70     std::vector<std::vector<char> >::const_iterator iParamSel = paramSels.begin();
71     unsigned int nHigherLevel = 0;
72    
73     while (iAli != alignables.end() && iParamSel != paramSels.end()) {
74     std::vector<bool> boolParSel;
75     bool charSelIsGeneral = this->decodeParamSel(*iParamSel, boolParSel);
76     if (this->add(*iAli, boolParSel)) ++nHigherLevel;
77     if (charSelIsGeneral) this->addFullParamSel((*iAli)->alignmentParameters(), *iParamSel);
78    
79     ++iAli;
80     ++iParamSel;
81     }
82 flucke 1.5
83 fronga 1.13 edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::addSelections"
84     << " Added " << addedSets << " set(s) of alignables with "
85     << theAlignables.size() << " alignables in total,"
86     << " of which " << nHigherLevel << " are higher level.";
87 flucke 1.9
88 fronga 1.13 return addedSets;
89 flucke 1.5 }
90    
91     //__________________________________________________________________________________________________
92 flucke 1.9 bool AlignmentParameterBuilder::add(Alignable *alignable, const std::vector<bool> &sel)
93     {
94 flucke 1.5
95 flucke 1.9 AlgebraicVector par(RigidBodyAlignmentParameters::N_PARAM, 0);
96     AlgebraicSymMatrix cov(RigidBodyAlignmentParameters::N_PARAM, 0);
97     bool isHigherLevel = false;
98    
99     AlignableDet *alidet = dynamic_cast<AlignableDet*>(alignable);
100     AlignmentParameters *paras = 0;
101     if (alidet != 0) { // alignable Det
102     paras = new RigidBodyAlignmentParameters(alignable, par, cov, sel);
103     } else { // higher level object
104     paras = new CompositeRigidBodyAlignmentParameters(alignable, par, cov, sel);
105     isHigherLevel = true;
106 flucke 1.5 }
107    
108 flucke 1.9 alignable->setAlignmentParameters(paras);
109     theAlignables.push_back(alignable);
110    
111     return isHigherLevel;
112 flucke 1.5 }
113    
114    
115     //__________________________________________________________________________________________________
116 flucke 1.9 unsigned int AlignmentParameterBuilder::add(const std::vector<Alignable*> &alignables,
117     const std::vector<bool> &sel)
118 flucke 1.5 {
119    
120 flucke 1.9 unsigned int nHigherLevel = 0;
121 fronga 1.1
122 flucke 1.9 for (std::vector<Alignable*>::const_iterator iAli = alignables.begin();
123     iAli != alignables.end(); ++iAli) {
124     if (this->add(*iAli, sel)) ++nHigherLevel;
125 fronga 1.1 }
126    
127 flucke 1.9 return nHigherLevel;
128 fronga 1.1 }
129    
130    
131     //__________________________________________________________________________________________________
132     void AlignmentParameterBuilder::fixAlignables(int n)
133     {
134    
135 fpschill 1.3 if (n<1 || n>3) {
136 flucke 1.5 edm::LogError("BadArgument") << " n = " << n << " is not in [1,3]";
137 fronga 1.1 return;
138     }
139    
140     std::vector<Alignable*> theNewAlignables;
141     int i=0;
142     int imax = theAlignables.size();
143     for ( std::vector<Alignable*>::const_iterator ia=theAlignables.begin();
144     ia!=theAlignables.end(); ia++ )
145     {
146     i++;
147     if ( n==1 && i>1 )
148     theNewAlignables.push_back(*ia);
149     else if ( n==2 && i>1 && i<imax )
150     theNewAlignables.push_back(*ia);
151     else if ( n==3 && i>2 && i<imax)
152     theNewAlignables.push_back(*ia);
153     }
154    
155     theAlignables = theNewAlignables;
156    
157 flucke 1.10 edm::LogInfo("Alignment") << "@SUB=AlignmentParameterBuilder::fixAlignables"
158     << "removing " << n << " alignables, so that "
159     << theAlignables.size() << " alignables left";
160 fronga 1.1 }
161    
162 flucke 1.12 //__________________________________________________________________________________________________
163     bool AlignmentParameterBuilder::decodeParamSel(const std::vector<char> &paramSelChar,
164     std::vector<bool> &result) const
165     {
166     result.clear();
167     bool anyNon01 = false;
168    
169     for (unsigned int pos = 0; pos < paramSelChar.size(); ++pos) {
170    
171     switch (paramSelChar[pos]) {
172     default:
173     anyNon01 = true;
174     // no break;
175     case '1':
176     result.push_back(true);
177     break;
178     case '0':
179     result.push_back(false);
180     break;
181     }
182     }
183    
184     return anyNon01;
185     }
186    
187     //__________________________________________________________________________________________________
188     bool AlignmentParameterBuilder::addFullParamSel(AlignmentParameters *aliParams,
189     const std::vector<char> &fullSel) const
190     {
191     if (!aliParams) return false;
192    
193     aliParams->setUserVariables(new SelectionUserVariables(fullSel));
194    
195     return true;
196     }