ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/CMSSW/Alignment/CommonAlignmentAlgorithm/src/AlignmentParameterBuilder.cc
Revision: 1.6
Committed: Fri Nov 3 11:00:55 2006 UTC (18 years, 6 months ago) by fpschill
Content type: text/plain
Branch: MAIN
CVS Tags: V00-06-00
Changes since 1.5: +40 -4 lines
Log Message:
various fixes imported from csa06 version

File Contents

# User Rev Content
1 flucke 1.5 /** \file AlignableParameterBuilder.cc
2     *
3 fpschill 1.6 * $Date: 2006/10/20 13:24:55 $
4     * $Revision: 1.5 $
5 flucke 1.5 */
6    
7 fronga 1.1 #include "FWCore/MessageLogger/interface/MessageLogger.h"
8     #include "Geometry/CommonDetAlgo/interface/AlgebraicObjects.h"
9     #include "Alignment/CommonAlignment/interface/Alignable.h"
10     #include "Alignment/CommonAlignment/interface/AlignableDet.h"
11     #include "Alignment/CommonAlignment/interface/AlignableComposite.h"
12    
13     #include "Alignment/CommonAlignmentParametrization/interface/RigidBodyAlignmentParameters.h"
14     #include "Alignment/CommonAlignmentParametrization/interface/CompositeRigidBodyAlignmentParameters.h"
15    
16     // This class's header
17    
18     #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentParameterBuilder.h"
19    
20    
21     //__________________________________________________________________________________________________
22     AlignmentParameterBuilder::AlignmentParameterBuilder( AlignableTracker* alignableTracker )
23     {
24    
25     theAlignableTracker = alignableTracker;
26    
27     theTrackerAlignableId = new TrackerAlignableId();
28     theOnlyDS=false;
29     theOnlySS=false;
30     theSelLayers=false;
31     theMinLayer=-1;
32     theMaxLayer=999;
33    
34     }
35    
36     //__________________________________________________________________________________________________
37 flucke 1.5 int AlignmentParameterBuilder::addSelections(const edm::ParameterSet &pset)
38     {
39     const std::vector<std::string> selections =
40     pset.getParameter<std::vector<std::string> >("alignableParamSelector");
41     bool allOk = true;
42    
43     int addedSets = 0;
44     for (std::vector<std::string>::const_iterator itSel = selections.begin();
45     itSel != selections.end(); ++itSel) {
46     std::vector<std::string> decompSel(this->decompose(*itSel, ','));
47     if (decompSel.size() < 2) {
48     edm::LogError("Alignment") << "@SUB=AlignmentParameterBuilder::addSelections"
49     << "ignoring " << *itSel << "from alignableParamSelector: "
50     << "should have at least 2 ','-separated parts";
51     allOk = false;
52     continue;
53     }
54    
55     const std::vector<bool> paramSel(this->decodeParamSel(decompSel[1]));
56     if (paramSel.size() != RigidBodyAlignmentParameters::N_PARAM) {
57     allOk = false; // Error already from decodeParamSel
58     continue;
59     }
60     if (decompSel.size() > 2) {
61     edm::LogWarning("Alignment") << "@SUB=AlignmentParameterBuilder::addSelections"
62     << "r/phi/eta/z-range selection not yet implemented...";
63     }
64     this->addSelection(decompSel[0], paramSel);
65     ++addedSets;
66     }
67    
68     if (allOk) return addedSets;
69     else { // @SUB-syntax is not supported by exception, but anyway useful information...
70     throw cms::Exception("BadConfig") <<"@SUB=AlignmentParameterBuilder::addSelections"
71     << ": Problems decoding 'alignableParamSelector'.";
72     return -1;
73     }
74     }
75    
76     //__________________________________________________________________________________________________
77     std::vector<bool> AlignmentParameterBuilder::decodeParamSel(const std::string &selString) const
78     {
79    
80     if (selString.length() != RigidBodyAlignmentParameters::N_PARAM) {
81     edm::LogError("Alignment") <<"@SUB=AlignmentParameterBuilder::decodeSelections"
82     << "selectionString has wrong size " << selString.length()
83     << " instead of " << RigidBodyAlignmentParameters::N_PARAM;
84     return std::vector<bool>();
85     } else {
86     std::vector<bool> result(RigidBodyAlignmentParameters::N_PARAM, false);
87     // shifts
88     if (selString.substr(0,1)=="1") result[RigidBodyAlignmentParameters::dx] = true;
89     if (selString.substr(1,1)=="1") result[RigidBodyAlignmentParameters::dy] = true;
90     if (selString.substr(2,1)=="1") result[RigidBodyAlignmentParameters::dz] = true;
91     // rotations
92     if (selString.substr(3,1)=="1") result[RigidBodyAlignmentParameters::dalpha] = true;
93     if (selString.substr(4,1)=="1") result[RigidBodyAlignmentParameters::dbeta] = true;
94     if (selString.substr(5,1)=="1") result[RigidBodyAlignmentParameters::dgamma] = true;
95    
96     return result;
97     }
98    
99     }
100    
101    
102     //__________________________________________________________________________________________________
103     std::vector<std::string>
104     AlignmentParameterBuilder::decompose(const std::string &s, std::string::value_type delimiter) const
105     {
106    
107     std::vector<std::string> result;
108    
109     std::string::size_type previousPos = 0;
110     while (true) {
111     const std::string::size_type delimiterPos = s.find(delimiter, previousPos);
112     if (delimiterPos == std::string::npos) {
113     result.push_back(s.substr(previousPos)); // until end
114     break;
115     }
116     result.push_back(s.substr(previousPos, delimiterPos - previousPos));
117     previousPos = delimiterPos + 1;
118     }
119    
120     return result;
121     }
122    
123     //__________________________________________________________________________________________________
124 flucke 1.4 void AlignmentParameterBuilder::addSelection(const std::string &name, const std::vector<bool> &sel)
125 fronga 1.1 {
126    
127 fpschill 1.3 edm::LogWarning("Alignment") << "[AlignmentParameterBuilder] Called for selection >" << name<<"<";
128 fronga 1.1
129     if (name == "AllDets") addAllDets(sel);
130     else if (name == "AllRods") addAllRods(sel);
131     else if (name == "AllLayers") addAllLayers(sel);
132     else if (name == "AllComponents") addAllComponents(sel);
133     else if (name == "AllAlignables") addAllAlignables(sel);
134    
135     // TIB+TOB
136     else if (name == "BarrelRods") add(theAlignableTracker->barrelRods(),sel);
137     else if (name == "BarrelDets") add(theAlignableTracker->barrelGeomDets(),sel);
138     else if (name == "BarrelLayers") add(theAlignableTracker->barrelLayers(),sel);
139    
140 flucke 1.5 else if (name == "BarrelDSRods") {
141     theOnlyDS = true;
142     add(theAlignableTracker->barrelRods(), sel);
143     theOnlyDS = false;
144     }
145     else if (name == "BarrelSSRods") {
146     theOnlySS = true;
147     add(theAlignableTracker->barrelRods(), sel);
148     theOnlySS = false;
149     }
150 fronga 1.1
151     // PXBarrel
152     else if (name == "PixelHalfBarrelDets")
153     add(theAlignableTracker->pixelHalfBarrelGeomDets(),sel);
154     else if (name == "PixelHalfBarrelLadders")
155     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
156     else if (name == "PixelHalfBarrelLayers")
157     add(theAlignableTracker->pixelHalfBarrelLayers(),sel);
158    
159     else if (name == "PixelHalfBarrelLaddersLayers12") {
160     theSelLayers=true; theMinLayer=1; theMaxLayer=2;
161     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
162     }
163    
164    
165     // PXEndcap
166     else if (name == "PXECDets") add(theAlignableTracker->pixelEndcapGeomDets(),sel);
167     else if (name == "PXECPetals") add(theAlignableTracker->pixelEndcapPetals(),sel);
168     else if (name == "PXECLayers") add(theAlignableTracker->pixelEndcapLayers(),sel);
169    
170     // Pixel Barrel+endcap
171     else if (name == "PixelDets") {
172     add(theAlignableTracker->pixelHalfBarrelGeomDets(),sel);
173     add(theAlignableTracker->pixelEndcapGeomDets(),sel);
174     }
175     else if (name == "PixelRods") {
176     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
177     add(theAlignableTracker->pixelEndcapPetals(),sel);
178     }
179     else if (name == "PixelLayers") {
180     add(theAlignableTracker->pixelHalfBarrelLayers(),sel);
181     add(theAlignableTracker->pixelEndcapLayers(),sel);
182     }
183    
184     // TID
185     else if (name == "TIDLayers") add(theAlignableTracker->TIDLayers(),sel);
186     else if (name == "TIDRings") add(theAlignableTracker->TIDRings(),sel);
187     else if (name == "TIDDets") add(theAlignableTracker->TIDGeomDets(),sel);
188    
189     // TEC
190     else if (name == "TECDets") add(theAlignableTracker->endcapGeomDets(),sel);
191     else if (name == "TECPetals") add(theAlignableTracker->endcapPetals(),sel);
192     else if (name == "TECLayers") add(theAlignableTracker->endcapLayers(),sel);
193    
194     // StripEndcap (TID+TEC)
195     else if (name == "EndcapDets") {
196     add(theAlignableTracker->TIDGeomDets(),sel);
197     add(theAlignableTracker->endcapGeomDets(),sel);
198     }
199     else if (name == "EndcapPetals") {
200     add(theAlignableTracker->TIDRings(),sel);
201     add(theAlignableTracker->endcapPetals(),sel);
202     }
203     else if (name == "EndcapLayers") {
204     add(theAlignableTracker->TIDLayers(),sel);
205     add(theAlignableTracker->endcapLayers(),sel);
206     }
207    
208     // Strip Barrel+endcap
209     else if (name == "StripDets") {
210     add(theAlignableTracker->barrelGeomDets(),sel);
211     add(theAlignableTracker->TIDGeomDets(),sel);
212     add(theAlignableTracker->endcapGeomDets(),sel);
213     }
214     else if (name == "StripRods") {
215     add(theAlignableTracker->barrelRods(),sel);
216     add(theAlignableTracker->TIDRings(),sel);
217     add(theAlignableTracker->endcapPetals(),sel);
218     }
219     else if (name == "StripLayers") {
220     add(theAlignableTracker->barrelLayers(),sel);
221     add(theAlignableTracker->TIDLayers(),sel);
222     add(theAlignableTracker->endcapLayers(),sel);
223     }
224    
225    
226     // Custom scenarios
227    
228     else if (name == "ScenarioA") {
229 flucke 1.5 std::vector<bool> mysel(6,false);
230 fronga 1.1 // pixel barrel dets x,y,z
231     mysel[RigidBodyAlignmentParameters::dx]=true;
232     mysel[RigidBodyAlignmentParameters::dy]=true;
233     mysel[RigidBodyAlignmentParameters::dz]=true;
234     add(theAlignableTracker->pixelHalfBarrelGeomDets(),mysel);
235     // strip barrel double sided
236     theOnlyDS = true;
237     add(theAlignableTracker->barrelRods(),mysel);
238     theOnlyDS = false;
239     // strip barrel single sided
240     mysel[RigidBodyAlignmentParameters::dy]=false;
241     theOnlySS = true;
242     add(theAlignableTracker->barrelRods(),mysel);
243     theOnlySS = false;
244     }
245    
246     else if (name == "ScenarioB") {
247 flucke 1.5 std::vector<bool> mysel(6,false);
248 fronga 1.1 // pixel barrel ladders x,y,z
249     mysel[RigidBodyAlignmentParameters::dx]=true;
250     mysel[RigidBodyAlignmentParameters::dy]=true;
251     mysel[RigidBodyAlignmentParameters::dz]=true;
252     add(theAlignableTracker->pixelHalfBarrelLadders(),mysel);
253     // strip barrel layers double sided
254     theOnlyDS = true;
255     add(theAlignableTracker->barrelLayers(),mysel);
256     theOnlyDS = false;
257     // strip barrel layers single sided
258     mysel[RigidBodyAlignmentParameters::dy]=false;
259     theOnlySS = true;
260     add(theAlignableTracker->barrelLayers(),mysel);
261     theOnlySS = false;
262     }
263    
264    
265     else if (name == "CustomStripLayers") {
266 flucke 1.5 std::vector<bool> mysel(6,false);
267 fronga 1.1 mysel[RigidBodyAlignmentParameters::dx]=true;
268     mysel[RigidBodyAlignmentParameters::dy]=true;
269     mysel[RigidBodyAlignmentParameters::dz]=true;
270     // strip barrel layers double sided
271     theOnlyDS = true;
272     add(theAlignableTracker->barrelLayers(),mysel);
273     theOnlyDS = false;
274     // strip barrel layers single sided
275     mysel[RigidBodyAlignmentParameters::dz]=false;
276     theOnlySS = true;
277     add(theAlignableTracker->barrelLayers(),mysel);
278     theOnlySS = false;
279     // TID
280     mysel[RigidBodyAlignmentParameters::dz]=true;
281     add(theAlignableTracker->TIDLayers(),mysel);
282     // TEC
283     mysel[RigidBodyAlignmentParameters::dz]=false;
284     add(theAlignableTracker->endcapLayers(),mysel);
285     }
286    
287     else if (name == "CustomStripRods") {
288 flucke 1.5 std::vector<bool> mysel(6,false);
289 fronga 1.1 mysel[RigidBodyAlignmentParameters::dx]=true;
290     mysel[RigidBodyAlignmentParameters::dy]=true;
291     mysel[RigidBodyAlignmentParameters::dz]=true;
292     // strip barrel layers double sided
293     theOnlyDS = true;
294     add(theAlignableTracker->barrelRods(),mysel);
295     theOnlyDS = false;
296     // strip barrel layers single sided
297     mysel[RigidBodyAlignmentParameters::dy]=false;
298     theOnlySS = true;
299     add(theAlignableTracker->barrelRods(),mysel);
300     theOnlySS = false;
301     // TID
302     mysel[RigidBodyAlignmentParameters::dy]=true;
303     add(theAlignableTracker->TIDRings(),mysel);
304     // TEC
305     mysel[RigidBodyAlignmentParameters::dz]=false;
306     add(theAlignableTracker->endcapPetals(),mysel);
307     }
308    
309 fpschill 1.6 else if (name == "CSA06Selection") {
310     std::vector<bool> mysel(6,false);
311     mysel[RigidBodyAlignmentParameters::dx]=true;
312     mysel[RigidBodyAlignmentParameters::dy]=true;
313     mysel[RigidBodyAlignmentParameters::dz]=true;
314     mysel[RigidBodyAlignmentParameters::dalpha]=true;
315     mysel[RigidBodyAlignmentParameters::dbeta]=true;
316     mysel[RigidBodyAlignmentParameters::dgamma]=true;
317     // TOB outermost layer (5) kept fixed
318     theSelLayers=true; theMinLayer=1; theMaxLayer=5;
319     // TOB rods double sided
320     theOnlyDS=true;
321     add(theAlignableTracker->outerBarrelRods(),mysel);
322     theOnlyDS=false;
323     // TOB rods single sided
324     mysel[RigidBodyAlignmentParameters::dy]=false;
325     mysel[RigidBodyAlignmentParameters::dz]=false;
326     theOnlySS=true;
327     add(theAlignableTracker->outerBarrelRods(),mysel);
328     theOnlySS=false;
329     mysel[RigidBodyAlignmentParameters::dy]=true;
330     mysel[RigidBodyAlignmentParameters::dz]=true;
331     //
332     theSelLayers=false;
333     // TIB dets double sided
334     theOnlyDS=true;
335     add(theAlignableTracker->innerBarrelGeomDets(),mysel);
336     theOnlyDS=false;
337     // TIB dets single sided
338     mysel[RigidBodyAlignmentParameters::dy]=false;
339     mysel[RigidBodyAlignmentParameters::dz]=false;
340     theOnlySS=true;
341     add(theAlignableTracker->innerBarrelGeomDets(),mysel);
342     theOnlySS=false;
343     }
344    
345 flucke 1.5 else { // @SUB-syntax is not supported by exception, but anyway useful information...
346     throw cms::Exception("BadConfig") <<"@SUB=AlignmentParameterBuilder::addSelection"
347     << ": Selection '" << name << "' invalid!";
348     }
349 fpschill 1.3 edm::LogInfo("Warning") << "[AlignmentParameterBuilder] Added "
350 flucke 1.5 << theAlignables.size()<< " alignables in total";
351 fronga 1.1
352     }
353    
354    
355     //__________________________________________________________________________________________________
356 flucke 1.4 void AlignmentParameterBuilder::addAllDets(const std::vector<bool> &sel)
357 fronga 1.1 {
358    
359     add(theAlignableTracker->barrelGeomDets(),sel); // TIB+TOB
360     add(theAlignableTracker->endcapGeomDets(),sel); // TEC
361     add(theAlignableTracker->TIDGeomDets(),sel); // TID
362     add(theAlignableTracker->pixelHalfBarrelGeomDets(),sel); // PixelBarrel
363     add(theAlignableTracker->pixelEndcapGeomDets(),sel); // PixelEndcap
364    
365 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
366 flucke 1.5 << theAlignables.size() << " dets";
367 fronga 1.1 }
368    
369    
370     //__________________________________________________________________________________________________
371 flucke 1.4 void AlignmentParameterBuilder::addAllRods(const std::vector<bool> &sel)
372 fronga 1.1 {
373     add(theAlignableTracker->barrelRods(),sel);
374     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
375     add(theAlignableTracker->endcapPetals(),sel);
376     add(theAlignableTracker->TIDRings(),sel);
377     add(theAlignableTracker->pixelEndcapPetals(),sel);
378    
379 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
380 flucke 1.5 << theAlignables.size() << " rods";
381 fronga 1.1 }
382    
383    
384     //__________________________________________________________________________________________________
385 flucke 1.4 void AlignmentParameterBuilder::addAllLayers(const std::vector<bool> &sel)
386 fronga 1.1 {
387     add(theAlignableTracker->barrelLayers(),sel);
388     add(theAlignableTracker->pixelHalfBarrelLayers(),sel);
389     add(theAlignableTracker->endcapLayers(),sel);
390     add(theAlignableTracker->TIDLayers(),sel);
391     add(theAlignableTracker->pixelEndcapLayers(),sel);
392    
393 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
394 flucke 1.5 << theAlignables.size() << " layers";
395 fronga 1.1
396     }
397    
398    
399     //__________________________________________________________________________________________________
400 flucke 1.4 void AlignmentParameterBuilder::addAllComponents(const std::vector<bool> &sel)
401 fronga 1.1 {
402     add(theAlignableTracker->components(),sel);
403 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
404 flucke 1.5 << theAlignables.size()
405     << " Components (HalfBarrel/Endcap)";
406 fronga 1.1 }
407    
408    
409     //__________________________________________________________________________________________________
410 flucke 1.4 void AlignmentParameterBuilder::addAllAlignables(const std::vector<bool> &sel)
411 fronga 1.1 {
412    
413     add(theAlignableTracker->barrelGeomDets(),sel);
414     add(theAlignableTracker->endcapGeomDets(),sel);
415     add(theAlignableTracker->TIDGeomDets(),sel);
416     add(theAlignableTracker->pixelHalfBarrelGeomDets(),sel);
417     add(theAlignableTracker->pixelEndcapGeomDets(),sel);
418    
419     add(theAlignableTracker->barrelRods(),sel);
420     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
421     add(theAlignableTracker->endcapPetals(),sel);
422     add(theAlignableTracker->TIDRings(),sel);
423     add(theAlignableTracker->pixelEndcapPetals(),sel);
424    
425     add(theAlignableTracker->barrelLayers(),sel);
426     add(theAlignableTracker->pixelHalfBarrelLayers(),sel);
427     add(theAlignableTracker->endcapLayers(),sel);
428     add(theAlignableTracker->TIDLayers(),sel);
429     add(theAlignableTracker->pixelEndcapLayers(),sel);
430    
431     add(theAlignableTracker->components(),sel);
432    
433    
434 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
435 flucke 1.5 << theAlignables.size()
436     << " Components (HalfBarrel/Endcap)";
437 fronga 1.1
438     }
439    
440    
441     //__________________________________________________________________________________________________
442 flucke 1.4 void AlignmentParameterBuilder::add(const std::vector<Alignable*> &alignables,
443     const std::vector<bool> &sel)
444 fronga 1.1 {
445    
446     int num_adu = 0;
447     int num_det = 0;
448     int num_hlo = 0;
449    
450     // loop on Alignable objects
451     for ( std::vector<Alignable*>::const_iterator ia=alignables.begin();
452     ia!=alignables.end(); ia++ ) {
453     Alignable* ali=(*ia);
454    
455     // select on single/double sided barrel layers
456     std::pair<int,int> tl=theTrackerAlignableId->typeAndLayerFromAlignable( ali );
457     int type = tl.first;
458     int layer = tl.second;
459    
460     bool keep=true;
461     if (theOnlySS) // only single sided
462 fpschill 1.6 if ( (abs(type)==3 || abs(type)==5) && layer<=2 )
463 fronga 1.1 keep=false;
464    
465     if (theOnlyDS) // only double sided
466 fpschill 1.6 if ( (abs(type)==3 || abs(type)==5) && layer>2 )
467 fronga 1.1 keep=false;
468    
469     // reject layers
470     if ( theSelLayers && (layer<theMinLayer || layer>theMaxLayer) )
471     keep=false;
472    
473    
474     if (keep) {
475    
476     AlgebraicVector par(6,0);
477     AlgebraicSymMatrix cov(6,0);
478    
479     AlignableDet* alidet = dynamic_cast<AlignableDet*>(ali);
480     if (alidet !=0) { // alignable Det
481     RigidBodyAlignmentParameters* dap =
482     new RigidBodyAlignmentParameters(ali,par,cov,sel);
483 flucke 1.4 ali->setAlignmentParameters(dap);
484 fronga 1.1 num_det++;
485 flucke 1.4 } else { // higher level object
486 fronga 1.1 CompositeRigidBodyAlignmentParameters* dap =
487     new CompositeRigidBodyAlignmentParameters(ali,par,cov,sel);
488     ali->setAlignmentParameters(dap);
489     num_hlo++;
490     }
491    
492     theAlignables.push_back(ali);
493     num_adu++;
494    
495     }
496     }
497    
498 fpschill 1.3 edm::LogWarning("Alignment") << "Added " << num_adu
499 flucke 1.5 << " Alignables, of which " << num_det << " are Dets and "
500     << num_hlo << " are higher level.";
501 fronga 1.1
502     }
503    
504    
505     //__________________________________________________________________________________________________
506     void AlignmentParameterBuilder::fixAlignables(int n)
507     {
508    
509 fpschill 1.3 if (n<1 || n>3) {
510 flucke 1.5 edm::LogError("BadArgument") << " n = " << n << " is not in [1,3]";
511 fronga 1.1 return;
512     }
513    
514     std::vector<Alignable*> theNewAlignables;
515     int i=0;
516     int imax = theAlignables.size();
517     for ( std::vector<Alignable*>::const_iterator ia=theAlignables.begin();
518     ia!=theAlignables.end(); ia++ )
519     {
520     i++;
521     if ( n==1 && i>1 )
522     theNewAlignables.push_back(*ia);
523     else if ( n==2 && i>1 && i<imax )
524     theNewAlignables.push_back(*ia);
525     else if ( n==3 && i>2 && i<imax)
526     theNewAlignables.push_back(*ia);
527     }
528    
529     theAlignables = theNewAlignables;
530    
531 fpschill 1.3 edm::LogWarning("Alignment") << "removing " << n
532 flucke 1.5 << " alignables, so that " << theAlignables.size()
533     << " alignables left";
534 fronga 1.1
535     }
536