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

◆ Det

Definition at line 20 of file CylinderBuilderFromDet.h.

◆ PositionType

Definition at line 21 of file CylinderBuilderFromDet.h.

◆ RotationType

Definition at line 22 of file CylinderBuilderFromDet.h.

◆ Vector

Definition at line 23 of file CylinderBuilderFromDet.h.

Constructor & Destructor Documentation

◆ CylinderBuilderFromDet()

CylinderBuilderFromDet::CylinderBuilderFromDet ( )
inline

Member Function Documentation

◆ build()

BoundCylinder * CylinderBuilderFromDet::build ( ) const

◆ operator()() [1/2]

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(), dqmdumpme::first, mps_fire::i, dqmdumpme::last, SiStripPI::max, SiStripPI::min, Basic3DVector< T >::perp(), makeMuonMisalignmentScenario::rot, PV3DBase< T, PVType, FrameType >::z(), SiStripMonitorCluster_cfi::zmax, and SiStripMonitorCluster_cfi::zmin.

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
ROOT::Math::Plane3D::Vector Vector
Definition: EcalHitMaker.cc:29
PositionType::BasicVectorType Vector
Surface::RotationType RotationType
Surface::PositionType PositionType
static std::vector< GlobalPoint > corners(const Plane &)
Definition: BoundingBox.cc:20
static float computeRadius(Bounds const &bounds)
Definition: Cylinder.h:28

◆ operator()() [2/2]

void CylinderBuilderFromDet::operator() ( const Det det)

Definition at line 59 of file CylinderBuilderFromDet.cc.

References Surface::bounds(), SiStripPI::max, SiStripPI::min, PV3DBase< T, PVType, FrameType >::perp(), GloballyPositioned< T >::position(), 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 }
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
T perp() const
Definition: PV3DBase.h:69
virtual float thickness() const =0
const PositionType & position() const
const Bounds & bounds() const
Definition: Surface.h:87

Member Data Documentation

◆ rmax

float CylinderBuilderFromDet::rmax
private

Definition at line 40 of file CylinderBuilderFromDet.h.

◆ rmin

float CylinderBuilderFromDet::rmin
private

Definition at line 39 of file CylinderBuilderFromDet.h.

◆ zmax

float CylinderBuilderFromDet::zmax
private

Definition at line 42 of file CylinderBuilderFromDet.h.

◆ zmin

float CylinderBuilderFromDet::zmin
private

Definition at line 41 of file CylinderBuilderFromDet.h.