forked from cms-sw/cmssw
/
BoundSpan.cc
69 lines (58 loc) · 3.14 KB
/
BoundSpan.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "DataFormats/GeometrySurface/interface/BoundSpan.h"
#include "DataFormats/GeometrySurface/interface/Surface.h"
#include "DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h"
#include "DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h"
#include "DataFormats/GeometryVector/interface/VectorUtil.h"
void BoundSpan::compute(Surface const & plane) {
const TrapezoidalPlaneBounds* trapezoidalBounds( dynamic_cast<const TrapezoidalPlaneBounds*>(&(plane.bounds())));
const RectangularPlaneBounds* rectangularBounds( dynamic_cast<const RectangularPlaneBounds*>(&(plane.bounds())));
Surface::GlobalPoint corners[8];
if (trapezoidalBounds) {
std::array<const float, 4> const & parameters = (*trapezoidalBounds).parameters();
auto hbotedge = parameters[0];
auto htopedge = parameters[1];
auto hapothem = parameters[3];
auto thickness = (*trapezoidalBounds).thickness();
corners[0] = plane.toGlobal( LocalPoint( -htopedge, hapothem, thickness/2));
corners[1] = plane.toGlobal( LocalPoint( htopedge, hapothem, thickness/2));
corners[2] = plane.toGlobal( LocalPoint( hbotedge, -hapothem, thickness/2));
corners[3] = plane.toGlobal( LocalPoint( -hbotedge, -hapothem, thickness/2));
corners[4] = plane.toGlobal( LocalPoint( -htopedge, hapothem, -thickness/2));
corners[5] = plane.toGlobal( LocalPoint( htopedge, hapothem, -thickness/2));
corners[6] = plane.toGlobal( LocalPoint( hbotedge, -hapothem, -thickness/2));
corners[7] = plane.toGlobal( LocalPoint( -hbotedge, -hapothem, -thickness/2));
}else if(rectangularBounds) {
auto length = rectangularBounds->length();
auto width = rectangularBounds->width();
auto thickness = (*rectangularBounds).thickness();
corners[0] = plane.toGlobal( LocalPoint( -width/2, -length/2, thickness/2));
corners[1] = plane.toGlobal( LocalPoint( -width/2, +length/2, thickness/2));
corners[2] = plane.toGlobal( LocalPoint( +width/2, -length/2, thickness/2));
corners[3] = plane.toGlobal( LocalPoint( +width/2, +length/2, thickness/2));
corners[4] = plane.toGlobal( LocalPoint( -width/2, -length/2, -thickness/2));
corners[5] = plane.toGlobal( LocalPoint( -width/2, +length/2, -thickness/2));
corners[6] = plane.toGlobal( LocalPoint( +width/2, -length/2, -thickness/2));
corners[7] = plane.toGlobal( LocalPoint( +width/2, +length/2, -thickness/2));
}else{
}
float phimin = corners[0].barePhi(); float phimax = phimin;
float zmin = corners[0].z(); float zmax = zmin;
float rmin = corners[0].perp2(); float rmax = rmin;
for ( int i = 1; i < 8; i++ ) {
auto cPhi = corners[i].barePhi();
if ( Geom::phiLess( cPhi, phimin)) { phimin = cPhi; }
if ( Geom::phiLess( phimax, cPhi)) { phimax = cPhi; }
auto z = corners[i].z();
if ( z < zmin) zmin = z;
if ( z > zmax) zmax = z;
auto r = corners[i].perp2();
if ( r < rmin) rmin = r;
if ( r > rmax) rmax = r;
}
m_zSpan.first = zmin;
m_zSpan.second = zmax;
m_rSpan.first = std::sqrt(rmin);
m_rSpan.second = std::sqrt(rmax);
m_phiSpan.first = phimin;
m_phiSpan.second = phimax;
}