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

Definition at line 84 of file CylinderBuilderFromDet.cc.

References Cylinder::computeRadius(), makeMuonMisalignmentScenario::rot, and PV3DBase< T, PVType, FrameType >::z().

Referenced by CylinderBuilderFromDet().

84  {
85 
86  PositionType pos( 0, 0, 0.5*(zmin+zmax));
87  RotationType rot; // only "barrel" orientation supported
88 
89  auto scp = new SimpleCylinderBounds( rmin, rmax,
90  zmin-pos.z(), zmax-pos.z());
91  return new Cylinder(Cylinder::computeRadius(*scp), pos, rot, scp);
92 
93 }
Surface::RotationType RotationType
Surface::PositionType PositionType
static float computeRadius(Bounds const &bounds)
Definition: Cylinder.h:30
BoundCylinder * CylinderBuilderFromDet::operator() ( std::vector< const Det * >::const_iterator  first,
std::vector< const Det * >::const_iterator  last 
) const

Definition at line 9 of file CylinderBuilderFromDet.cc.

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

Referenced by CylinderBuilderFromDet().

11 {
12  // find mean position and radius
14  Vector posSum(0,0,0);
15  float rSum = 0;
16  for (vector<const Det*>::const_iterator i=first; i!=last; i++) {
17  posSum += (**i).surface().position().basicVector();
18  rSum += (**i).surface().position().perp();
19  }
20  float div(1/float(last-first));
21  PositionType meanPos( div*posSum);
22  float meanR( div*rSum);
23 
24  // find max deviations from mean pos in Z and from mean R
25  float rmin = meanR;
26  float rmax = meanR;
27  float zmin = meanPos.z();
28  float zmax = meanPos.z();
29  for (vector<const Det*>::const_iterator i=first; i!=last; i++) {
30  vector<GlobalPoint> corners =
31  BoundingBox::corners( dynamic_cast<const Plane&>((**i).surface()));
32  for (vector<GlobalPoint>::const_iterator ic = corners.begin();
33  ic != corners.end(); ic++) {
34  float r = ic->perp();
35  float z = ic->z();
36  rmin = min( rmin, r);
37  rmax = max( rmax, r);
38  zmin = min( zmin, z);
39  zmax = max( zmax, z);
40  }
41  // in addition to the corners we have to check the middle of the
42  // det +/- thickness/2
43  // , since the min radius for some barrel dets is reached there
44  float rdet = (**i).surface().position().perp();
45  float halfThick = (**i).surface().bounds().thickness() / 2.F;
46  rmin = min( rmin, rdet-halfThick);
47  rmax = max( rmax, rdet+halfThick);
48  }
49 
50  // the transverse position is zero by construction.
51  // the Z position is the average between zmin and zmax, since the bounds
52  // are symmetric
53  // for the same reason the R is the average between rmin and rmax,
54  // but this is done by the Bounds anyway.
55 
56  PositionType pos( 0, 0, 0.5*(zmin+zmax));
57  RotationType rot; // only "barrel" orientation supported
58 
59  auto scp = new SimpleCylinderBounds( rmin, rmax,
60  zmin-pos.z(), zmax-pos.z());
61  return new Cylinder(Cylinder::computeRadius(*scp), pos, rot, scp);
62 
63 }
BaseClass::BasicVectorType BasicVectorType
Definition: Point3DBase.h:19
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:24
static float computeRadius(Bounds const &bounds)
Definition: Cylinder.h:30
void CylinderBuilderFromDet::operator() ( const Det det)

Definition at line 65 of file CylinderBuilderFromDet.cc.

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

65  {
66  BoundingBox bb( dynamic_cast<const Plane&>(det.surface()));
67  for (int nc=0; nc<8; ++nc) {
68  float r = bb[nc].perp();
69  float z = bb[nc].z();
70  rmin = std::min( rmin, r);
71  rmax = std::max( rmax, r);
72  zmin = std::min( zmin, z);
73  zmax = std::max( zmax, z);
74  }
75  // in addition to the corners we have to check the middle of the
76  // det +/- thickness/2
77  // , since the min radius for some barrel dets is reached there
78  float rdet = det.surface().position().perp();
79  float halfThick = det.surface().bounds().thickness() / 2.F;
80  rmin = std::min( rmin, rdet-halfThick);
81  rmax = std::max( rmax, rdet+halfThick);
82 }
T perp() const
Definition: PV3DBase.h:72
const Bounds & bounds() const
Definition: Surface.h:120
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.