CMS 3D CMS Logo

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

#include <CaloCellCrossing.h>

Public Types

typedef std::vector< DetIdDetIds
 
typedef std::vector< double > Lengths
 
typedef std::vector< GlobalPointPoints
 

Public Member Functions

 CaloCellCrossing (const GlobalPoint &gp, const GlobalVector &gv, const DetIds *di, const CaloSubdetectorGeometry *sg, DetId::Detector det, int subdet, double small=1.e-10, bool onewayonly=false)
 
 CaloCellCrossing (const CaloCellCrossing &)=delete
 
const Pointscenters () const
 
const DetIdsdetIds () const
 
const Pointsentrances () const
 
const Pointsexits () const
 
const GlobalPointgp () const
 
const GlobalVectorgv () const
 
const Lengthslengths () const
 
CaloCellCrossing operator= (const CaloCellCrossing &)=delete
 
virtual ~CaloCellCrossing ()
 

Private Attributes

Points m_ctr
 
DetIds m_detId
 
Points m_entr
 
Points m_exit
 
GlobalPoint m_gp
 
GlobalVector m_gv
 
Lengths m_len
 

Detailed Description

Definition at line 12 of file CaloCellCrossing.h.

Member Typedef Documentation

typedef std::vector< DetId > CaloCellCrossing::DetIds

Definition at line 16 of file CaloCellCrossing.h.

typedef std::vector< double > CaloCellCrossing::Lengths

Definition at line 18 of file CaloCellCrossing.h.

typedef std::vector< GlobalPoint > CaloCellCrossing::Points

Definition at line 17 of file CaloCellCrossing.h.

Constructor & Destructor Documentation

CaloCellCrossing::CaloCellCrossing ( const GlobalPoint gp,
const GlobalVector gv,
const DetIds di,
const CaloSubdetectorGeometry sg,
DetId::Detector  det,
int  subdet,
double  small = 1.e-10,
bool  onewayonly = false 
)

Definition at line 5 of file CaloCellCrossing.cc.

References cuy::cv, HepLine3D::dist(), HepLine3D::dist2(), dot(), MillePedeFileConverter_cfg::e, runEdmFileComparison::found, CaloSubdetectorGeometry::getGeometry(), CaloSubdetectorGeometry::getValidDetIds(), mps_fire::i, mps_splice::line, LogDebug, m_ctr, m_detId, m_entr, m_exit, m_len, mag(), mag2(), HepLine3D::point(), EnergyCorrector::pt, HepLine3D::pt(), mathSSE::sqrt(), HepLine3D::uv(), x, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by lengths().

12  :
13  m_gp ( gp ) ,
14  m_gv ( gv )
15 {
16  const double eps ( fabs( small ) > 1.e-15 ? fabs( small ) : 1.e-10 ) ;
17  static unsigned int k_rlen ( 30 ) ;
18  m_detId.reserve( k_rlen ) ;
19  m_ctr .reserve( k_rlen ) ;
20  m_entr .reserve( k_rlen ) ;
21  m_exit .reserve( k_rlen ) ;
22 //------------------------------------------------------------
23  const HepLine3D line ( HepGeom::Point3D<double> ( gp.x(), gp.y(), gp.z() ),
24  HepGeom::Vector3D<double> ( gv.x(), gv.y(), gv.z() ), eps ) ;
25 
26  LogDebug("CaloCellCrossing") << "*** Line: pt=" << line.pt() << ", unitvec=" << line.uv();
27 
28  const DetIds& ids ( nullptr == di ? sg->getValidDetIds( det, subdet ) : *di ) ;
29 //------------------------------------------------------------
30  for(auto dId : ids)
31  {
32  unsigned int found ( 0 ) ;
33  auto cg = sg->getGeometry( dId );
34  const CaloCellGeometry::CornersVec& gc ( cg->getCorners() ) ;
35  const HepGeom::Point3D<double> fr ( cg->getPosition().x(),
36  cg->getPosition().y(),
37  cg->getPosition().z() ) ;
38  const double bCut2 ( ( gc[0] - gc[6] ).mag2() ) ;
39 
40  if( ( !onewayonly ||
41  eps < HepGeom::Vector3D<double> ( fr - line.pt() ).dot( line.uv() ) ) &&
42  bCut2 > line.dist2( fr ) ) // first loose cut
43  {
44  LogDebug("CaloCellCrossing") << "*** fr=" << fr << ", bCut =" << sqrt(bCut2) << ", dis=" << line.dist(fr);
45  const HepGeom::Point3D<double> cv[8] =
46  { HepGeom::Point3D<double> ( gc[0].x(), gc[0].y(), gc[0].z() ) ,
47  HepGeom::Point3D<double> ( gc[1].x(), gc[1].y(), gc[1].z() ) ,
48  HepGeom::Point3D<double> ( gc[2].x(), gc[2].y(), gc[2].z() ) ,
49  HepGeom::Point3D<double> ( gc[3].x(), gc[3].y(), gc[3].z() ) ,
50  HepGeom::Point3D<double> ( gc[4].x(), gc[4].y(), gc[4].z() ) ,
51  HepGeom::Point3D<double> ( gc[5].x(), gc[5].y(), gc[5].z() ) ,
52  HepGeom::Point3D<double> ( gc[6].x(), gc[6].y(), gc[6].z() ) ,
53  HepGeom::Point3D<double> ( gc[7].x(), gc[7].y(), gc[7].z() ) } ;
54  const HepGeom::Point3D<double> ctr ( 0.125*(cv[0]+cv[1]+cv[2]+cv[3]+
55  cv[4]+cv[5]+cv[6]+cv[7]) ) ;
56  const double dCut2 ( bCut2/4. ) ;
57  if( dCut2 > line.dist2( ctr ) ) // tighter cut
58  {
59  LogDebug("CaloCellCrossing") << "** 2nd cut: ctr=" << ctr
60  << ", dist=" << line.dist(ctr);
61  static const unsigned int nc[6][4] =
62  { { 0,1,2,3 }, { 0,4,5,1 }, { 0,4,7,3 },
63  { 6,7,4,5 }, { 6,2,3,7 }, { 6,2,1,5 } } ;
64  for( unsigned int face ( 0 ) ; face != 6 ; ++face )
65  {
66  const unsigned int* ic ( &nc[face][0] ) ;
67  const HepGeom::Plane3D<double> pl ( cv[ic[0]], cv[ic[1]], cv[ic[2]] ) ;
68  bool parallel ;
69  const HepGeom::Point3D<double> pt ( line.point( pl, parallel ) ) ;
70  LogDebug("CaloCellCrossing")<<"***Face: "<<face<<", pt="<<pt;
71  if( !parallel )
72  {
73  LogDebug("CaloCellCrossing")<<"Not parallel";
74  const HepLine3D la ( cv[ic[0]], cv[ic[1]], eps ) ;
75  const HepLine3D lb ( cv[ic[2]], cv[ic[3]], eps ) ;
76  LogDebug("CaloCellCrossing")<<"la.point="<<la.point(pt);
77 
78 // const double dot ( ( la.point( pt ) - pt ).dot( ( lb.point( pt ) - pt ) ) ) ;
79 // LogDebug("CaloCellCrossing")<<"***Dot1="<<dot;
80  if( eps > ( la.point( pt ) - pt ).dot( ( lb.point( pt ) - pt ) ) )
81  {
82  const HepLine3D lc ( cv[ic[0]], cv[ic[3]], eps ) ;
83  const HepLine3D ld ( cv[ic[1]], cv[ic[2]], eps ) ;
84 // const double dot ( ( lc.point( pt ) - pt ).dot( ( ld.point( pt ) - pt ) ) ) ;
85 // LogDebug("CaloCellCrossing")<<"***Dot2="<<dot;
86  if( eps > ( lc.point( pt ) - pt ).dot( ( ld.point( pt ) - pt ) ) )
87  {
88  if( 0 == found )
89  {
90  ++found ;
91  m_detId.emplace_back( dId ) ;
92  m_ctr .emplace_back( GlobalPoint( ctr.x(), ctr.y(), ctr.z() ) ) ;
93  m_entr.emplace_back( GlobalPoint( pt.x(), pt.y(), pt.z() ) ) ;
94  }
95  else
96  {
97  if( 1 == found )
98  {
99  ++found ;
100  m_exit.emplace_back( GlobalPoint( pt.x(), pt.y(), pt.z() ) ) ;
101  }
102  else
103  {
104  const double dist1 (
105  ( pt - HepGeom::Point3D<double> ( m_entr.back().x(),
106  m_entr.back().y(),
107  m_entr.back().z() ) ).mag() ) ;
108  const double dist2 (
109  ( pt - HepGeom::Point3D<double> ( m_exit.back().x(),
110  m_exit.back().y(),
111  m_exit.back().z() ) ).mag() ) ;
112  if( eps < dist1 &&
113  eps < dist2 )
114  {
115  edm::LogWarning("CaloCellCrossing") << "********For DetId = " << dId
116  << " distances too big: "
117  << dist1 << ", " << dist2;
118 
119  }
120  }
121  }
122  }
123  }
124  }
125  }
126  }
127  }
128  assert( 2 >= found ) ;
129  if( 1 == found ) m_exit.emplace_back( m_entr.back() ) ;
130  }
131 //------------------------------------------------------------
132  assert( m_detId.size() == m_entr.size() &&
133  m_detId.size() == m_ctr .size() &&
134  m_detId.size() == m_exit.size() ) ;
135 
136  m_len.reserve( m_entr.size() ) ;
137  for( unsigned int i ( 0 ) ; i != m_entr.size() ; ++i )
138  {
139  m_len.emplace_back( ( m_exit[i] - m_entr[i] ).mag() ) ;
140  }
141 }
#define LogDebug(id)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
T y() const
Definition: PV3DBase.h:63
cv
Definition: cuy.py:364
virtual const std::vector< DetId > & getValidDetIds(DetId::Detector det=DetId::Detector(0), int subdet=0) const
Get a list of valid detector ids (for the given subdetector)
T sqrt(T t)
Definition: SSEVec.h:18
T z() const
Definition: PV3DBase.h:64
T mag2() const
The vector magnitude squared. Equivalent to vec.dot(vec)
virtual std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
T dot(const Basic3DVector &v) const
Scalar product, or "dot" product, with a vector of same type.
T x() const
Definition: PV3DBase.h:62
GlobalVector m_gv
std::vector< DetId > DetIds
virtual CaloCellCrossing::~CaloCellCrossing ( )
inlinevirtual

Definition at line 29 of file CaloCellCrossing.h.

29 {} ;
CaloCellCrossing::CaloCellCrossing ( const CaloCellCrossing )
delete

Member Function Documentation

const Points& CaloCellCrossing::centers ( ) const
inline

Definition at line 35 of file CaloCellCrossing.h.

References m_ctr.

35 { return m_ctr ; }
const DetIds& CaloCellCrossing::detIds ( ) const
inline

Definition at line 34 of file CaloCellCrossing.h.

References m_detId.

34 { return m_detId ; }
const Points& CaloCellCrossing::entrances ( ) const
inline

Definition at line 36 of file CaloCellCrossing.h.

References m_entr.

36 { return m_entr ; }
const Points& CaloCellCrossing::exits ( ) const
inline

Definition at line 37 of file CaloCellCrossing.h.

References m_exit.

37 { return m_exit ; }
const GlobalPoint& CaloCellCrossing::gp ( ) const
inline

Definition at line 31 of file CaloCellCrossing.h.

References m_gp.

31 { return m_gp ; }
const GlobalVector& CaloCellCrossing::gv ( ) const
inline

Definition at line 32 of file CaloCellCrossing.h.

References m_gv.

32 { return m_gv ; }
GlobalVector m_gv
const Lengths& CaloCellCrossing::lengths ( ) const
inline

Definition at line 38 of file CaloCellCrossing.h.

References CaloCellCrossing(), m_len, and operator=().

38 { return m_len ; }
CaloCellCrossing CaloCellCrossing::operator= ( const CaloCellCrossing )
delete

Referenced by lengths().

Member Data Documentation

Points CaloCellCrossing::m_ctr
private

Definition at line 50 of file CaloCellCrossing.h.

Referenced by CaloCellCrossing(), and centers().

DetIds CaloCellCrossing::m_detId
private

Definition at line 48 of file CaloCellCrossing.h.

Referenced by CaloCellCrossing(), and detIds().

Points CaloCellCrossing::m_entr
private

Definition at line 52 of file CaloCellCrossing.h.

Referenced by CaloCellCrossing(), and entrances().

Points CaloCellCrossing::m_exit
private

Definition at line 53 of file CaloCellCrossing.h.

Referenced by CaloCellCrossing(), and exits().

GlobalPoint CaloCellCrossing::m_gp
private

Definition at line 45 of file CaloCellCrossing.h.

Referenced by gp().

GlobalVector CaloCellCrossing::m_gv
private

Definition at line 46 of file CaloCellCrossing.h.

Referenced by gv().

Lengths CaloCellCrossing::m_len
private

Definition at line 54 of file CaloCellCrossing.h.

Referenced by CaloCellCrossing(), and lengths().