ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/CMSSW/Alignment/CommonAlignmentAlgorithm/src/AlignmentParameterBuilder.cc
Revision: 1.7
Committed: Fri Nov 3 13:46:40 2006 UTC (18 years, 6 months ago) by flucke
Content type: text/plain
Branch: MAIN
Changes since 1.6: +3 -2 lines
Log Message:
deselect layer selection after using it for PixelHalfBarrelLaddersLayers12

File Contents

# User Rev Content
1 flucke 1.5 /** \file AlignableParameterBuilder.cc
2     *
3 flucke 1.7 * $Date: 2006/11/03 11:00:55 $
4     * $Revision: 1.6 $
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 flucke 1.7 theSelLayers = false;
163 fronga 1.1 }
164    
165    
166     // PXEndcap
167     else if (name == "PXECDets") add(theAlignableTracker->pixelEndcapGeomDets(),sel);
168     else if (name == "PXECPetals") add(theAlignableTracker->pixelEndcapPetals(),sel);
169     else if (name == "PXECLayers") add(theAlignableTracker->pixelEndcapLayers(),sel);
170    
171     // Pixel Barrel+endcap
172     else if (name == "PixelDets") {
173     add(theAlignableTracker->pixelHalfBarrelGeomDets(),sel);
174     add(theAlignableTracker->pixelEndcapGeomDets(),sel);
175     }
176     else if (name == "PixelRods") {
177     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
178     add(theAlignableTracker->pixelEndcapPetals(),sel);
179     }
180     else if (name == "PixelLayers") {
181     add(theAlignableTracker->pixelHalfBarrelLayers(),sel);
182     add(theAlignableTracker->pixelEndcapLayers(),sel);
183     }
184    
185     // TID
186     else if (name == "TIDLayers") add(theAlignableTracker->TIDLayers(),sel);
187     else if (name == "TIDRings") add(theAlignableTracker->TIDRings(),sel);
188     else if (name == "TIDDets") add(theAlignableTracker->TIDGeomDets(),sel);
189    
190     // TEC
191     else if (name == "TECDets") add(theAlignableTracker->endcapGeomDets(),sel);
192     else if (name == "TECPetals") add(theAlignableTracker->endcapPetals(),sel);
193     else if (name == "TECLayers") add(theAlignableTracker->endcapLayers(),sel);
194    
195     // StripEndcap (TID+TEC)
196     else if (name == "EndcapDets") {
197     add(theAlignableTracker->TIDGeomDets(),sel);
198     add(theAlignableTracker->endcapGeomDets(),sel);
199     }
200     else if (name == "EndcapPetals") {
201     add(theAlignableTracker->TIDRings(),sel);
202     add(theAlignableTracker->endcapPetals(),sel);
203     }
204     else if (name == "EndcapLayers") {
205     add(theAlignableTracker->TIDLayers(),sel);
206     add(theAlignableTracker->endcapLayers(),sel);
207     }
208    
209     // Strip Barrel+endcap
210     else if (name == "StripDets") {
211     add(theAlignableTracker->barrelGeomDets(),sel);
212     add(theAlignableTracker->TIDGeomDets(),sel);
213     add(theAlignableTracker->endcapGeomDets(),sel);
214     }
215     else if (name == "StripRods") {
216     add(theAlignableTracker->barrelRods(),sel);
217     add(theAlignableTracker->TIDRings(),sel);
218     add(theAlignableTracker->endcapPetals(),sel);
219     }
220     else if (name == "StripLayers") {
221     add(theAlignableTracker->barrelLayers(),sel);
222     add(theAlignableTracker->TIDLayers(),sel);
223     add(theAlignableTracker->endcapLayers(),sel);
224     }
225    
226    
227     // Custom scenarios
228    
229     else if (name == "ScenarioA") {
230 flucke 1.5 std::vector<bool> mysel(6,false);
231 fronga 1.1 // pixel barrel dets x,y,z
232     mysel[RigidBodyAlignmentParameters::dx]=true;
233     mysel[RigidBodyAlignmentParameters::dy]=true;
234     mysel[RigidBodyAlignmentParameters::dz]=true;
235     add(theAlignableTracker->pixelHalfBarrelGeomDets(),mysel);
236     // strip barrel double sided
237     theOnlyDS = true;
238     add(theAlignableTracker->barrelRods(),mysel);
239     theOnlyDS = false;
240     // strip barrel single sided
241     mysel[RigidBodyAlignmentParameters::dy]=false;
242     theOnlySS = true;
243     add(theAlignableTracker->barrelRods(),mysel);
244     theOnlySS = false;
245     }
246    
247     else if (name == "ScenarioB") {
248 flucke 1.5 std::vector<bool> mysel(6,false);
249 fronga 1.1 // pixel barrel ladders x,y,z
250     mysel[RigidBodyAlignmentParameters::dx]=true;
251     mysel[RigidBodyAlignmentParameters::dy]=true;
252     mysel[RigidBodyAlignmentParameters::dz]=true;
253     add(theAlignableTracker->pixelHalfBarrelLadders(),mysel);
254     // strip barrel layers double sided
255     theOnlyDS = true;
256     add(theAlignableTracker->barrelLayers(),mysel);
257     theOnlyDS = false;
258     // strip barrel layers single sided
259     mysel[RigidBodyAlignmentParameters::dy]=false;
260     theOnlySS = true;
261     add(theAlignableTracker->barrelLayers(),mysel);
262     theOnlySS = false;
263     }
264    
265    
266     else if (name == "CustomStripLayers") {
267 flucke 1.5 std::vector<bool> mysel(6,false);
268 fronga 1.1 mysel[RigidBodyAlignmentParameters::dx]=true;
269     mysel[RigidBodyAlignmentParameters::dy]=true;
270     mysel[RigidBodyAlignmentParameters::dz]=true;
271     // strip barrel layers double sided
272     theOnlyDS = true;
273     add(theAlignableTracker->barrelLayers(),mysel);
274     theOnlyDS = false;
275     // strip barrel layers single sided
276     mysel[RigidBodyAlignmentParameters::dz]=false;
277     theOnlySS = true;
278     add(theAlignableTracker->barrelLayers(),mysel);
279     theOnlySS = false;
280     // TID
281     mysel[RigidBodyAlignmentParameters::dz]=true;
282     add(theAlignableTracker->TIDLayers(),mysel);
283     // TEC
284     mysel[RigidBodyAlignmentParameters::dz]=false;
285     add(theAlignableTracker->endcapLayers(),mysel);
286     }
287    
288     else if (name == "CustomStripRods") {
289 flucke 1.5 std::vector<bool> mysel(6,false);
290 fronga 1.1 mysel[RigidBodyAlignmentParameters::dx]=true;
291     mysel[RigidBodyAlignmentParameters::dy]=true;
292     mysel[RigidBodyAlignmentParameters::dz]=true;
293     // strip barrel layers double sided
294     theOnlyDS = true;
295     add(theAlignableTracker->barrelRods(),mysel);
296     theOnlyDS = false;
297     // strip barrel layers single sided
298     mysel[RigidBodyAlignmentParameters::dy]=false;
299     theOnlySS = true;
300     add(theAlignableTracker->barrelRods(),mysel);
301     theOnlySS = false;
302     // TID
303     mysel[RigidBodyAlignmentParameters::dy]=true;
304     add(theAlignableTracker->TIDRings(),mysel);
305     // TEC
306     mysel[RigidBodyAlignmentParameters::dz]=false;
307     add(theAlignableTracker->endcapPetals(),mysel);
308     }
309    
310 fpschill 1.6 else if (name == "CSA06Selection") {
311     std::vector<bool> mysel(6,false);
312     mysel[RigidBodyAlignmentParameters::dx]=true;
313     mysel[RigidBodyAlignmentParameters::dy]=true;
314     mysel[RigidBodyAlignmentParameters::dz]=true;
315     mysel[RigidBodyAlignmentParameters::dalpha]=true;
316     mysel[RigidBodyAlignmentParameters::dbeta]=true;
317     mysel[RigidBodyAlignmentParameters::dgamma]=true;
318     // TOB outermost layer (5) kept fixed
319     theSelLayers=true; theMinLayer=1; theMaxLayer=5;
320     // TOB rods double sided
321     theOnlyDS=true;
322     add(theAlignableTracker->outerBarrelRods(),mysel);
323     theOnlyDS=false;
324     // TOB rods single sided
325     mysel[RigidBodyAlignmentParameters::dy]=false;
326     mysel[RigidBodyAlignmentParameters::dz]=false;
327     theOnlySS=true;
328     add(theAlignableTracker->outerBarrelRods(),mysel);
329     theOnlySS=false;
330     mysel[RigidBodyAlignmentParameters::dy]=true;
331     mysel[RigidBodyAlignmentParameters::dz]=true;
332     //
333     theSelLayers=false;
334     // TIB dets double sided
335     theOnlyDS=true;
336     add(theAlignableTracker->innerBarrelGeomDets(),mysel);
337     theOnlyDS=false;
338     // TIB dets single sided
339     mysel[RigidBodyAlignmentParameters::dy]=false;
340     mysel[RigidBodyAlignmentParameters::dz]=false;
341     theOnlySS=true;
342     add(theAlignableTracker->innerBarrelGeomDets(),mysel);
343     theOnlySS=false;
344     }
345    
346 flucke 1.5 else { // @SUB-syntax is not supported by exception, but anyway useful information...
347     throw cms::Exception("BadConfig") <<"@SUB=AlignmentParameterBuilder::addSelection"
348     << ": Selection '" << name << "' invalid!";
349     }
350 fpschill 1.3 edm::LogInfo("Warning") << "[AlignmentParameterBuilder] Added "
351 flucke 1.5 << theAlignables.size()<< " alignables in total";
352 fronga 1.1
353     }
354    
355    
356     //__________________________________________________________________________________________________
357 flucke 1.4 void AlignmentParameterBuilder::addAllDets(const std::vector<bool> &sel)
358 fronga 1.1 {
359    
360     add(theAlignableTracker->barrelGeomDets(),sel); // TIB+TOB
361     add(theAlignableTracker->endcapGeomDets(),sel); // TEC
362     add(theAlignableTracker->TIDGeomDets(),sel); // TID
363     add(theAlignableTracker->pixelHalfBarrelGeomDets(),sel); // PixelBarrel
364     add(theAlignableTracker->pixelEndcapGeomDets(),sel); // PixelEndcap
365    
366 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
367 flucke 1.5 << theAlignables.size() << " dets";
368 fronga 1.1 }
369    
370    
371     //__________________________________________________________________________________________________
372 flucke 1.4 void AlignmentParameterBuilder::addAllRods(const std::vector<bool> &sel)
373 fronga 1.1 {
374     add(theAlignableTracker->barrelRods(),sel);
375     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
376     add(theAlignableTracker->endcapPetals(),sel);
377     add(theAlignableTracker->TIDRings(),sel);
378     add(theAlignableTracker->pixelEndcapPetals(),sel);
379    
380 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
381 flucke 1.5 << theAlignables.size() << " rods";
382 fronga 1.1 }
383    
384    
385     //__________________________________________________________________________________________________
386 flucke 1.4 void AlignmentParameterBuilder::addAllLayers(const std::vector<bool> &sel)
387 fronga 1.1 {
388     add(theAlignableTracker->barrelLayers(),sel);
389     add(theAlignableTracker->pixelHalfBarrelLayers(),sel);
390     add(theAlignableTracker->endcapLayers(),sel);
391     add(theAlignableTracker->TIDLayers(),sel);
392     add(theAlignableTracker->pixelEndcapLayers(),sel);
393    
394 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
395 flucke 1.5 << theAlignables.size() << " layers";
396 fronga 1.1
397     }
398    
399    
400     //__________________________________________________________________________________________________
401 flucke 1.4 void AlignmentParameterBuilder::addAllComponents(const std::vector<bool> &sel)
402 fronga 1.1 {
403     add(theAlignableTracker->components(),sel);
404 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
405 flucke 1.5 << theAlignables.size()
406     << " Components (HalfBarrel/Endcap)";
407 fronga 1.1 }
408    
409    
410     //__________________________________________________________________________________________________
411 flucke 1.4 void AlignmentParameterBuilder::addAllAlignables(const std::vector<bool> &sel)
412 fronga 1.1 {
413    
414     add(theAlignableTracker->barrelGeomDets(),sel);
415     add(theAlignableTracker->endcapGeomDets(),sel);
416     add(theAlignableTracker->TIDGeomDets(),sel);
417     add(theAlignableTracker->pixelHalfBarrelGeomDets(),sel);
418     add(theAlignableTracker->pixelEndcapGeomDets(),sel);
419    
420     add(theAlignableTracker->barrelRods(),sel);
421     add(theAlignableTracker->pixelHalfBarrelLadders(),sel);
422     add(theAlignableTracker->endcapPetals(),sel);
423     add(theAlignableTracker->TIDRings(),sel);
424     add(theAlignableTracker->pixelEndcapPetals(),sel);
425    
426     add(theAlignableTracker->barrelLayers(),sel);
427     add(theAlignableTracker->pixelHalfBarrelLayers(),sel);
428     add(theAlignableTracker->endcapLayers(),sel);
429     add(theAlignableTracker->TIDLayers(),sel);
430     add(theAlignableTracker->pixelEndcapLayers(),sel);
431    
432     add(theAlignableTracker->components(),sel);
433    
434    
435 fpschill 1.3 edm::LogInfo("Alignment") << "Initialized for "
436 flucke 1.5 << theAlignables.size()
437     << " Components (HalfBarrel/Endcap)";
438 fronga 1.1
439     }
440    
441    
442     //__________________________________________________________________________________________________
443 flucke 1.4 void AlignmentParameterBuilder::add(const std::vector<Alignable*> &alignables,
444     const std::vector<bool> &sel)
445 fronga 1.1 {
446    
447     int num_adu = 0;
448     int num_det = 0;
449     int num_hlo = 0;
450    
451     // loop on Alignable objects
452     for ( std::vector<Alignable*>::const_iterator ia=alignables.begin();
453     ia!=alignables.end(); ia++ ) {
454     Alignable* ali=(*ia);
455    
456     // select on single/double sided barrel layers
457     std::pair<int,int> tl=theTrackerAlignableId->typeAndLayerFromAlignable( ali );
458     int type = tl.first;
459     int layer = tl.second;
460    
461     bool keep=true;
462     if (theOnlySS) // only single sided
463 fpschill 1.6 if ( (abs(type)==3 || abs(type)==5) && layer<=2 )
464 fronga 1.1 keep=false;
465    
466     if (theOnlyDS) // only double sided
467 fpschill 1.6 if ( (abs(type)==3 || abs(type)==5) && layer>2 )
468 fronga 1.1 keep=false;
469    
470     // reject layers
471     if ( theSelLayers && (layer<theMinLayer || layer>theMaxLayer) )
472     keep=false;
473    
474    
475     if (keep) {
476    
477     AlgebraicVector par(6,0);
478     AlgebraicSymMatrix cov(6,0);
479    
480     AlignableDet* alidet = dynamic_cast<AlignableDet*>(ali);
481     if (alidet !=0) { // alignable Det
482     RigidBodyAlignmentParameters* dap =
483     new RigidBodyAlignmentParameters(ali,par,cov,sel);
484 flucke 1.4 ali->setAlignmentParameters(dap);
485 fronga 1.1 num_det++;
486 flucke 1.4 } else { // higher level object
487 fronga 1.1 CompositeRigidBodyAlignmentParameters* dap =
488     new CompositeRigidBodyAlignmentParameters(ali,par,cov,sel);
489     ali->setAlignmentParameters(dap);
490     num_hlo++;
491     }
492    
493     theAlignables.push_back(ali);
494     num_adu++;
495    
496     }
497     }
498    
499 fpschill 1.3 edm::LogWarning("Alignment") << "Added " << num_adu
500 flucke 1.5 << " Alignables, of which " << num_det << " are Dets and "
501     << num_hlo << " are higher level.";
502 fronga 1.1
503     }
504    
505    
506     //__________________________________________________________________________________________________
507     void AlignmentParameterBuilder::fixAlignables(int n)
508     {
509    
510 fpschill 1.3 if (n<1 || n>3) {
511 flucke 1.5 edm::LogError("BadArgument") << " n = " << n << " is not in [1,3]";
512 fronga 1.1 return;
513     }
514    
515     std::vector<Alignable*> theNewAlignables;
516     int i=0;
517     int imax = theAlignables.size();
518     for ( std::vector<Alignable*>::const_iterator ia=theAlignables.begin();
519     ia!=theAlignables.end(); ia++ )
520     {
521     i++;
522     if ( n==1 && i>1 )
523     theNewAlignables.push_back(*ia);
524     else if ( n==2 && i>1 && i<imax )
525     theNewAlignables.push_back(*ia);
526     else if ( n==3 && i>2 && i<imax)
527     theNewAlignables.push_back(*ia);
528     }
529    
530     theAlignables = theNewAlignables;
531    
532 fpschill 1.3 edm::LogWarning("Alignment") << "removing " << n
533 flucke 1.5 << " alignables, so that " << theAlignables.size()
534     << " alignables left";
535 fronga 1.1
536     }
537