CMS 3D CMS Logo

CylinderBuilderFromDet.cc
Go to the documentation of this file.
4 #include <algorithm>
5 
6 using namespace std;
7 
8 BoundCylinder* CylinderBuilderFromDet::operator()(vector<const Det*>::const_iterator first,
9  vector<const Det*>::const_iterator last) const {
10  // find mean position and radius
12  Vector posSum(0, 0, 0);
13  float rSum = 0;
14  for (vector<const Det*>::const_iterator i = first; i != last; i++) {
15  posSum += (**i).surface().position().basicVector();
16  rSum += (**i).surface().position().perp();
17  }
18  float div(1 / float(last - first));
19  PositionType meanPos(div * posSum);
20  float meanR(div * rSum);
21 
22  // find max deviations from mean pos in Z and from mean R
23  float rmin = meanR;
24  float rmax = meanR;
25  float zmin = meanPos.z();
26  float zmax = meanPos.z();
27  for (vector<const Det*>::const_iterator i = first; i != last; i++) {
28  vector<GlobalPoint> corners = BoundingBox::corners(dynamic_cast<const Plane&>((**i).surface()));
29  for (vector<GlobalPoint>::const_iterator ic = corners.begin(); ic != corners.end(); ic++) {
30  float r = ic->perp();
31  float z = ic->z();
32  rmin = min(rmin, r);
33  rmax = max(rmax, r);
34  zmin = min(zmin, z);
35  zmax = max(zmax, z);
36  }
37  // in addition to the corners we have to check the middle of the
38  // det +/- thickness/2
39  // , since the min radius for some barrel dets is reached there
40  float rdet = (**i).surface().position().perp();
41  float halfThick = (**i).surface().bounds().thickness() / 2.F;
42  rmin = min(rmin, rdet - halfThick);
43  rmax = max(rmax, rdet + halfThick);
44  }
45 
46  // the transverse position is zero by construction.
47  // the Z position is the average between zmin and zmax, since the bounds
48  // are symmetric
49  // for the same reason the R is the average between rmin and rmax,
50  // but this is done by the Bounds anyway.
51 
52  PositionType pos(0, 0, 0.5 * (zmin + zmax));
53  RotationType rot; // only "barrel" orientation supported
54 
55  auto scp = new SimpleCylinderBounds(rmin, rmax, zmin - pos.z(), zmax - pos.z());
56  return new Cylinder(Cylinder::computeRadius(*scp), pos, rot, scp);
57 }
58 
60  BoundingBox bb(dynamic_cast<const Plane&>(det.surface()));
61  for (int nc = 0; nc < 8; ++nc) {
62  float r = bb[nc].perp();
63  float z = bb[nc].z();
64  rmin = std::min(rmin, r);
65  rmax = std::max(rmax, r);
66  zmin = std::min(zmin, z);
67  zmax = std::max(zmax, z);
68  }
69  // in addition to the corners we have to check the middle of the
70  // det +/- thickness/2
71  // , since the min radius for some barrel dets is reached there
72  float rdet = det.surface().position().perp();
73  float halfThick = det.surface().bounds().thickness() / 2.F;
74  rmin = std::min(rmin, rdet - halfThick);
75  rmax = std::max(rmax, rdet + halfThick);
76 }
77 
79  PositionType pos(0, 0, 0.5 * (zmin + zmax));
80  RotationType rot; // only "barrel" orientation supported
81 
82  auto scp = new SimpleCylinderBounds(rmin, rmax, zmin - pos.z(), zmax - pos.z());
83  return new Cylinder(Cylinder::computeRadius(*scp), pos, rot, scp);
84 }
TkRotation< float >
mps_fire.i
i
Definition: mps_fire.py:428
GeomDet
Definition: GeomDet.h:27
min
T min(T a, T b)
Definition: MathUtil.h:58
pos
Definition: PixelAliasList.h:18
CylinderBuilderFromDet.h
SimpleCylinderBounds.h
SiStripMonitorCluster_cfi.zmin
zmin
Definition: SiStripMonitorCluster_cfi.py:200
BoundingBox.h
dqmdumpme.first
first
Definition: dqmdumpme.py:55
Vector
ROOT::Math::Plane3D::Vector Vector
Definition: EcalHitMaker.cc:29
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
SimpleCylinderBounds
Definition: SimpleCylinderBounds.h:19
GeomDet::surface
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
dqmdumpme.last
last
Definition: dqmdumpme.py:56
BoundingBox
Definition: BoundingBox.h:12
SiStripMonitorCluster_cfi.zmax
zmax
Definition: SiStripMonitorCluster_cfi.py:201
Surface::bounds
const Bounds & bounds() const
Definition: Surface.h:87
Point3DBase< float, GlobalTag >
Bounds::thickness
virtual float thickness() const =0
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
CylinderBuilderFromDet::operator()
BoundCylinder * operator()(std::vector< const Det * >::const_iterator first, std::vector< const Det * >::const_iterator last) const
Definition: CylinderBuilderFromDet.cc:8
alignCSCRings.r
r
Definition: alignCSCRings.py:93
GloballyPositioned::position
const PositionType & position() const
Definition: GloballyPositioned.h:36
std
Definition: JetResolutionObject.h:76
makeMuonMisalignmentScenario.rot
rot
Definition: makeMuonMisalignmentScenario.py:322
BoundingBox::corners
static std::vector< GlobalPoint > corners(const Plane &)
Definition: BoundingBox.cc:20
BoundCylinder
Cylinder::computeRadius
static float computeRadius(Bounds const &bounds)
Definition: Cylinder.h:28
Cylinder
Definition: Cylinder.h:19
Basic3DVector::perp
T perp() const
Magnitude of transverse component.
Definition: extBasic3DVector.h:122
CylinderBuilderFromDet::build
BoundCylinder * build() const
Definition: CylinderBuilderFromDet.cc:78
PV3DBase::perp
T perp() const
Definition: PV3DBase.h:69
Basic3DVector< float >