A base class to handle the particular shape of Ecal Xtals. Taken from ORCA Calorimetry Code. More...
#include <TruncatedPyramid.h>
A base class to handle the particular shape of Ecal Xtals. Taken from ORCA Calorimetry Code.
Definition at line 19 of file TruncatedPyramid.h.
Reimplemented from CaloCellGeometry.
Definition at line 23 of file TruncatedPyramid.h.
Reimplemented from CaloCellGeometry.
Definition at line 24 of file TruncatedPyramid.h.
Reimplemented from CaloCellGeometry.
Definition at line 25 of file TruncatedPyramid.h.
Reimplemented from CaloCellGeometry.
Definition at line 26 of file TruncatedPyramid.h.
TruncatedPyramid::TruncatedPyramid | ( | ) |
Definition at line 20 of file TruncatedPyramid.cc.
: CaloCellGeometry() , m_axis ( 0., 0., 0. ), m_corOne ( 0., 0., 0. ) { }
TruncatedPyramid::TruncatedPyramid | ( | const TruncatedPyramid & | tr | ) |
Definition at line 27 of file TruncatedPyramid.cc.
{
*this = tr ;
}
TruncatedPyramid::TruncatedPyramid | ( | const CornersMgr * | cMgr, |
const GlobalPoint & | fCtr, | ||
const GlobalPoint & | bCtr, | ||
const GlobalPoint & | cor1, | ||
const CCGFloat * | parV | ||
) |
Definition at line 44 of file TruncatedPyramid.cc.
TruncatedPyramid::TruncatedPyramid | ( | const CornersVec & | corn, |
const CCGFloat * | par | ||
) |
Definition at line 55 of file TruncatedPyramid.cc.
TruncatedPyramid::~TruncatedPyramid | ( | ) | [virtual] |
Definition at line 63 of file TruncatedPyramid.cc.
{ }
const GlobalVector & TruncatedPyramid::axis | ( | ) | const |
Definition at line 86 of file TruncatedPyramid.cc.
References m_axis.
Referenced by getTransform().
{ return m_axis ; }
const GlobalPoint TruncatedPyramid::backCtr | ( | ) | const [private] |
Definition at line 107 of file TruncatedPyramid.cc.
References getCorners(), x, detailsBasic3DVector::y, and z.
Referenced by makeAxis().
{ return GlobalPoint( 0.25*( getCorners()[4].x() + getCorners()[5].x() + getCorners()[6].x() + getCorners()[7].x() ), 0.25*( getCorners()[4].y() + getCorners()[5].y() + getCorners()[6].y() + getCorners()[7].y() ), 0.25*( getCorners()[4].z() + getCorners()[5].z() + getCorners()[6].z() + getCorners()[7].z() ) ) ; }
void TruncatedPyramid::createCorners | ( | const std::vector< CCGFloat > & | pv, |
const Tr3D & | tr, | ||
std::vector< GlobalPoint > & | co | ||
) | [static] |
Definition at line 322 of file TruncatedPyramid.cc.
References filterCSVwithJSON::copy, cross(), dot(), i, localCorners(), AlCaHLTBitMon_ParallelJobs::p, truncPyr::refl(), tmp, x, detailsBasic3DVector::y, and z.
{ assert( 11 == pv.size() ) ; assert( 8 == co.size() ) ; // to get the ordering right for fast sim, we have to use their convention // which were based on the old static geometry. Some gymnastics required here. const CCGFloat dz ( pv[0] ) ; const CCGFloat h1 ( pv[3] ) ; const CCGFloat h2 ( pv[7] ) ; Pt3DVec ko ( 8, Pt3D(0,0,0) ) ; // if reflection, different things for barrel and endcap static const Vec3D x ( 1, 0, 0 ) ; static const Vec3D y ( 0, 1, 0 ) ; static const Vec3D z ( 0, 0, 1 ) ; const bool refl ( ( ( tr*x ).cross( tr*y ) ).dot( tr*z ) < 0 ) ; // has reflection! Pt3D tmp ; Pt3DVec to ( 8, Pt3D(0,0,0) ) ; localCorners( to, &pv.front(), tmp ) ; for( unsigned int i ( 0 ) ; i != 8 ; ++i ) { ko[i] = tr * to[i] ; // apply transformation } if( refl || h1>h2 ) { if( 11.2 < dz ) //barrel { if( !refl ) { to[0] = ko[3] ; to[1] = ko[2] ; to[2] = ko[1] ; to[3] = ko[0] ; to[4] = ko[7] ; to[5] = ko[6] ; to[6] = ko[5] ; to[7] = ko[4] ; } else { to[0] = ko[0] ; to[1] = ko[1] ; to[2] = ko[2] ; to[3] = ko[3] ; to[4] = ko[4] ; to[5] = ko[5] ; to[6] = ko[6] ; to[7] = ko[7] ; } } else //endcap { to[0] = ko[0] ; to[1] = ko[3] ; to[2] = ko[2] ; to[3] = ko[1] ; to[4] = ko[4] ; to[5] = ko[7] ; to[6] = ko[6] ; to[7] = ko[5] ; } copy( to.begin(), to.end(), ko.begin() ) ; // faster than ko = to ? maybe. } for( unsigned int i ( 0 ) ; i != 8 ; ++i ) { const Pt3D & p ( ko[i] ) ; co[ i ] = GlobalPoint( p.x(), p.y(), p.z() ) ; } }
const CaloCellGeometry::CornersVec & TruncatedPyramid::getCorners | ( | ) | const [virtual] |
Implements CaloCellGeometry.
Definition at line 189 of file TruncatedPyramid.cc.
References CaloCellGeometry::getCorners(), getTransform(), i, CaloCellGeometry::setCorners(), and EZArrayFL< T >::uninitialized().
Referenced by backCtr(), and operator<<().
{ const CornersVec& co ( CaloCellGeometry::getCorners() ) ; if( co.uninitialized() ) { CornersVec& corners ( setCorners() ) ; Pt3DVec lc ; Tr3D tr ; getTransform( tr, &lc ) ; for( unsigned int i ( 0 ) ; i != 8 ; ++i ) { const Pt3D corn ( tr*lc[i] ) ; corners[i] = GlobalPoint( corn.x(), corn.y(), corn.z() ) ; } } return co ; }
CCGFloat TruncatedPyramid::getPhiAxis | ( | ) | const |
Definition at line 80 of file TruncatedPyramid.cc.
References m_axis, and PV3DBase< T, PVType, FrameType >::phi().
Referenced by operator<<().
const GlobalPoint TruncatedPyramid::getPosition | ( | CCGFloat | depth | ) | const |
Definition at line 68 of file TruncatedPyramid.cc.
References CaloCellGeometry::getPosition(), and m_axis.
Referenced by EcalSimple2007H4TBAnalyzer::analyze(), PFRecHitProducerECAL::createEcalRecHit(), and PFRecHitProducerECAL::findEcalRecHitGeometry().
{ return CaloCellGeometry::getPosition() + depth*m_axis ; }
CCGFloat TruncatedPyramid::getThetaAxis | ( | ) | const |
Definition at line 74 of file TruncatedPyramid.cc.
References m_axis, and PV3DBase< T, PVType, FrameType >::theta().
Referenced by operator<<().
Reimplemented from CaloCellGeometry.
Definition at line 118 of file TruncatedPyramid.cc.
References angle(), axis(), CaloCellGeometry::getPosition(), localCorners(), localCornersReflection(), localCornersSwap(), m_corOne, mag(), AlCaHLTBitMon_ParallelJobs::p, CaloCellGeometry::param(), csvLumiCalc::unit, PV3DBase< T, PVType, FrameType >::x(), x, PV3DBase< T, PVType, FrameType >::y(), detailsBasic3DVector::y, PV3DBase< T, PVType, FrameType >::z(), and z.
Referenced by getCorners().
{ const GlobalPoint& p ( CaloCellGeometry::getPosition() ) ; const Pt3D gFront ( p.x(), p.y(), p.z() ) ; const DPt3D dgFront ( p.x(), p.y(), p.z() ) ; const double dz ( param()[0] ) ; Pt3D lFront ; assert( 0 != param() ) ; std::vector<Pt3D > lc( 8, Pt3D(0,0,0) ) ; if( 11.2 > dz ) { localCorners( lc, param(), lFront ) ; } else { localCornersSwap( lc, param(), lFront ) ; } // figure out if reflction volume or not Pt3D lBack ( 0.25*(lc[4]+lc[5]+lc[6]+lc[7]) ) ; const double disl ( ( lFront - lc[0] ).mag() ) ; const double disr ( ( lFront - lc[3] ).mag() ) ; const double disg ( ( gFront - m_corOne ).mag() ) ; const double dell ( fabs( disg - disl ) ) ; const double delr ( fabs( disg - disr ) ) ; if( 11.2<dz && delr < dell ) // reflection volume if true { localCornersReflection( lc, param(), lFront ) ; lBack = 0.25*( lc[4] + lc[5] + lc[6] + lc[7] ) ; } const DPt3D dlFront ( lFront.x(), lFront.y(), lFront.z() ) ; const DPt3D dlBack ( lBack.x() , lBack.y() , lBack.z() ) ; const DPt3D dlOne ( lc[0].x() , lc[0].y() , lc[0].z() ) ; const Vec3D dgAxis ( axis().x(), axis().y(), axis().z() ) ; const DPt3D dmOne ( m_corOne.x(), m_corOne.y(), m_corOne.z() ) ; const DPt3D dgBack ( dgFront + ( dlBack - dlFront ).mag()*dgAxis ) ; DPt3D dgOne ( dgFront + ( dlOne - dlFront ).mag()*( dmOne - dgFront ).unit() ) ; const double dlangle ( ( dlBack - dlFront).angle( dlOne - dlFront ) ) ; const double dgangle ( ( dgBack - dgFront).angle( dgOne - dgFront ) ) ; const double dangle ( dlangle - dgangle ) ; if( 1.e-6 < fabs(dangle) )//guard against precision problems { const DPlane3D dgPl ( dgFront, dgOne, dgBack ) ; const DPt3D dp2 ( dgFront + dgPl.normal().unit() ) ; DPt3D dgOld ( dgOne ) ; dgOne = ( dgFront + HepGeom::Rotate3D( -dangle, dgFront, dp2 )* DVec3D( dgOld - dgFront ) ) ; } tr = Tr3D( dlFront , dlBack , dlOne , dgFront , dgBack , dgOne ) ; if( 0 != lptr ) (*lptr) = lc ; }
Definition at line 253 of file TruncatedPyramid.cc.
References funct::cos(), funct::sin(), and funct::tan().
Referenced by createCorners(), getTransform(), localCornersReflection(), localCornersSwap(), and vocalCorners().
{ assert( 0 != pv ) ; assert( 8 == lc.size() ) ; const CCGFloat dz ( pv[0] ) ; const CCGFloat th ( pv[1] ) ; const CCGFloat ph ( pv[2] ) ; const CCGFloat h1 ( pv[3] ) ; const CCGFloat b1 ( pv[4] ) ; const CCGFloat t1 ( pv[5] ) ; const CCGFloat a1 ( pv[6] ) ; const CCGFloat h2 ( pv[7] ) ; const CCGFloat b2 ( pv[8] ) ; const CCGFloat t2 ( pv[9] ) ; const CCGFloat a2 ( pv[10]) ; const CCGFloat ta1 ( tan( a1 ) ) ; // lower plane const CCGFloat ta2 ( tan( a2 ) ) ; // upper plane const CCGFloat tth ( tan( th ) ) ; const CCGFloat tthcp ( tth * cos( ph ) ) ; const CCGFloat tthsp ( tth * sin( ph ) ) ; const unsigned int off ( h1<h2 ? 0 : 4 ) ; lc[0+off] = Pt3D ( -dz*tthcp - h1*ta1 - b1, -dz*tthsp - h1 , -dz ); // (-,-,-) lc[1+off] = Pt3D ( -dz*tthcp + h1*ta1 - t1, -dz*tthsp + h1 , -dz ); // (-,+,-) lc[2+off] = Pt3D ( -dz*tthcp + h1*ta1 + t1, -dz*tthsp + h1 , -dz ); // (+,+,-) lc[3+off] = Pt3D ( -dz*tthcp - h1*ta1 + b1, -dz*tthsp - h1 , -dz ); // (+,-,-) lc[4-off] = Pt3D ( dz*tthcp - h2*ta2 - b2, dz*tthsp - h2 , dz ); // (-,-,+) lc[5-off] = Pt3D ( dz*tthcp + h2*ta2 - t2, dz*tthsp + h2 , dz ); // (-,+,+) lc[6-off] = Pt3D ( dz*tthcp + h2*ta2 + t2, dz*tthsp + h2 , dz ); // (+,+,+) lc[7-off] = Pt3D ( dz*tthcp - h2*ta2 + b2, dz*tthsp - h2 , dz ); // (+,-,+) ref = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ; }
void TruncatedPyramid::localCornersReflection | ( | Pt3DVec & | vec, |
const CCGFloat * | pv, | ||
Pt3D & | ref | ||
) | [static] |
Definition at line 219 of file TruncatedPyramid.cc.
References localCorners(), truncPyr::refl(), and tmp.
Referenced by getTransform(), and EcalBarrelGeometry::localCorners().
{ // using namespace truncPyr ; localCorners( lc, pv, ref ) ; Pt3D tmp ; /* tmp = lc[0] ; lc[0] = refl( lc[2] ) ; lc[2] = refl( tmp ) ; tmp = lc[1] ; lc[1] = refl( lc[3] ) ; lc[3] = refl( tmp ) ; tmp = lc[4] ; lc[4] = refl( lc[6] ) ; lc[6] = refl( tmp ) ; tmp = lc[5] ; lc[5] = refl( lc[7] ) ; lc[7] = refl( tmp ) ; */ lc[0] = truncPyr::refl( lc[0] ) ; lc[1] = truncPyr::refl( lc[1] ) ; lc[2] = truncPyr::refl( lc[2] ) ; lc[3] = truncPyr::refl( lc[3] ) ; lc[4] = truncPyr::refl( lc[4] ) ; lc[5] = truncPyr::refl( lc[5] ) ; lc[6] = truncPyr::refl( lc[6] ) ; lc[7] = truncPyr::refl( lc[7] ) ; ref = 0.25*( lc[0] + lc[1] + lc[2] + lc[3] ) ; }
Definition at line 294 of file TruncatedPyramid.cc.
References localCorners(), and tmp.
Referenced by getTransform(), and EcalBarrelGeometry::localCorners().
GlobalVector TruncatedPyramid::makeAxis | ( | ) | [private] |
Definition at line 100 of file TruncatedPyramid.cc.
References backCtr(), CaloCellGeometry::getPosition(), and Vector3DBase< T, FrameTag >::unit().
{ return GlobalVector( backCtr() - CaloCellGeometry::getPosition() ).unit() ; }
TruncatedPyramid & TruncatedPyramid::operator= | ( | const TruncatedPyramid & | tr | ) |
Definition at line 33 of file TruncatedPyramid.cc.
References m_axis, and m_corOne.
{ CaloCellGeometry::operator=( tr ) ; if( this != &tr ) { m_axis = tr.m_axis ; m_corOne = tr.m_corOne ; } return *this ; }
void TruncatedPyramid::vocalCorners | ( | Pt3DVec & | vec, |
const CCGFloat * | pv, | ||
Pt3D & | ref | ||
) | const [virtual] |
Implements CaloCellGeometry.
Definition at line 92 of file TruncatedPyramid.cc.
References localCorners().
{ localCorners( vec, pv, ref ) ; }
GlobalVector TruncatedPyramid::m_axis [private] |
Definition at line 89 of file TruncatedPyramid.h.
Referenced by axis(), getPhiAxis(), getPosition(), getThetaAxis(), and operator=().
Pt3D TruncatedPyramid::m_corOne [private] |
Definition at line 91 of file TruncatedPyramid.h.
Referenced by getTransform(), and operator=().