CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Attributes
CylinderBuilderFromDet Class Reference

#include <CylinderBuilderFromDet.h>

Public Types

typedef GeomDet Det
 
typedef Surface::PositionType PositionType
 
typedef Surface::RotationType RotationType
 
typedef PositionType::BasicVectorType Vector
 

Public Member Functions

BoundCylinderbuild () const
 
 CylinderBuilderFromDet ()
 
BoundCylinderoperator() (std::vector< const Det * >::const_iterator first, std::vector< const Det * >::const_iterator last) const
 
void operator() (const Det &det)
 

Private Attributes

float rmax
 
float rmin
 
float zmax
 
float zmin
 

Detailed Description

Given a container of GeomDets, constructs a cylinder of minimal dimensions that contains all of the Dets completely (all corners etc.) Useful for defining a BarrelDetLayer from a group of DetUnits.

Definition at line 18 of file CylinderBuilderFromDet.h.

Member Typedef Documentation

Definition at line 20 of file CylinderBuilderFromDet.h.

Definition at line 21 of file CylinderBuilderFromDet.h.

Definition at line 22 of file CylinderBuilderFromDet.h.

Definition at line 23 of file CylinderBuilderFromDet.h.

Constructor & Destructor Documentation

CylinderBuilderFromDet::CylinderBuilderFromDet ( )
inline

Member Function Documentation

BoundCylinder * CylinderBuilderFromDet::build ( ) const
BoundCylinder * CylinderBuilderFromDet::operator() ( std::vector< const Det * >::const_iterator  first,
std::vector< const Det * >::const_iterator  last 
) const

Definition at line 8 of file CylinderBuilderFromDet.cc.

References Cylinder::computeRadius(), BoundingBox::corners(), mps_fire::i, dqmdumpme::last, SiStripPI::max, min(), Basic3DVector< T >::perp(), alignCSCRings::r, makeMuonMisalignmentScenario::rot, PV3DBase< T, PVType, FrameType >::z(), SiStripMonitorCluster_cfi::zmax, and SiStripMonitorCluster_cfi::zmin.

Referenced by CylinderBuilderFromDet().

9  {
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 }
BaseClass::BasicVectorType BasicVectorType
Definition: Point3DBase.h:17
PositionType::BasicVectorType Vector
Surface::RotationType RotationType
T min(T a, T b)
Definition: MathUtil.h:58
Surface::PositionType PositionType
static std::vector< GlobalPoint > corners(const Plane &)
Definition: BoundingBox.cc:20
static float computeRadius(Bounds const &bounds)
Definition: Cylinder.h:28
void CylinderBuilderFromDet::operator() ( const Det det)

Definition at line 59 of file CylinderBuilderFromDet.cc.

References Surface::bounds(), SiStripPI::max, min(), PV3DBase< T, PVType, FrameType >::perp(), GloballyPositioned< T >::position(), alignCSCRings::r, GeomDet::surface(), Bounds::thickness(), SiStripMonitorCluster_cfi::zmax, and SiStripMonitorCluster_cfi::zmin.

59  {
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 }
T perp() const
Definition: PV3DBase.h:69
const Bounds & bounds() const
Definition: Surface.h:89
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
T min(T a, T b)
Definition: MathUtil.h:58
virtual float thickness() const =0
const PositionType & position() const

Member Data Documentation

float CylinderBuilderFromDet::rmax
private

Definition at line 40 of file CylinderBuilderFromDet.h.

float CylinderBuilderFromDet::rmin
private

Definition at line 39 of file CylinderBuilderFromDet.h.

float CylinderBuilderFromDet::zmax
private

Definition at line 42 of file CylinderBuilderFromDet.h.

float CylinderBuilderFromDet::zmin
private

Definition at line 41 of file CylinderBuilderFromDet.h.