CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EcalPreshowerGeometry.cc
Go to the documentation of this file.
6 #include <iostream>
7 
11 typedef HepGeom::Plane3D<CCGFloat> Pl3D ;
12 
14  m_xWidWaf ( 6.3 ) ,
15  m_xInterLadGap ( 0.05 ) , // additional gap between wafers in adj ladders
16  m_xIntraLadGap ( 0.04 ) , // gap between wafers in same ladder
17  m_yWidAct ( 6.1 ) ,
18  m_yCtrOff ( 0.05 ) , // gap at center
19  m_cellVec ( k_NumberOfCellsForCorners )
20 {
21  m_zplane[0] = 0. ;
22  m_zplane[1] = 0. ;
23  m_zplane[2] = 0. ;
24  m_zplane[3] = 0. ;
25 }
26 
27 
29 {
30 }
31 
32 unsigned int
34 {
35  const CaloGenericDetId gid ( id ) ;
36 
37  assert( gid.isES() ) ;
38 
39 // plane 2 is split into 2 dees along x=0 for both signs of z
40 
41 // plane 1 at zsign=-1 is split into 2 dees between six=19 and six=20 for siy<=20,
42 // and six=21 and 22 for siy>=21
43 
44 // plane 1 at zsign=+1 is split into 2 dees between six=20 and six=21 for siy<=20,
45 // and six=19 and 20 for siy>=21
46 
47 
48 // Desired numbering
49 // LEFT RIGHT (as one faces the Dee from the IP)
50 // ES- pl=2 0 1
51 // pl=1 2 3 the reversal of pl=2 and pl=1 is intentional here (CM Kuo)
52 // ES+ pl=1 4 5
53 // pl=2 6 7
54 
55  const ESDetId esid ( id ) ;
56  const int jx ( esid.six() - 1 ) ;
57  const int jy ( esid.siy() - 1 ) ;
58  const int jz ( esid.zside() + 1 ) ;
59  const int pl ( esid.plane() - 1 ) ;
60  const bool second ( 1 == pl ) ;
61  const bool top ( 19 < jy ) ;
62  const bool negz ( 0 == jz ) ;
63  const int lrl ( 19>jx ? 0 : 1 ) ;
64  const int lrr ( 21>jx ? 0 : 1 ) ;
65 
66  return ( second ? jx/20 + 3*jz : // 2nd plane split along middle
67  ( negz && !top ? lrl + 2 : // 1st plane at neg z and bottom half split at six=19&20
68  ( negz && top ? lrr + 2 : // 1st plane at neg z and top half split at six=21&22
69  ( !negz && !top ? lrr + 4 : lrl + 4 ) ) ) ) ; // opposite at positive z
70 }
71 
72 DetId
74 {
75  return ESDetId( 1, 10 + 20*( iLoc%2 ), 10, 2>iLoc || 5<iLoc ? 2 : 1, 2*( iLoc/4 ) - 1 ) ;
76 }
77 
78 unsigned int
80 {
81  return (unsigned int)DetId::Ecal - 1 ;
82 }
83 
84 
85 void
87 {
88  unsigned int n1minus ( 0 ) ;
89  unsigned int n2minus ( 0 ) ;
90  unsigned int n1plus ( 0 ) ;
91  unsigned int n2plus ( 0 ) ;
92  CCGFloat z1minus ( 0 ) ;
93  CCGFloat z2minus ( 0 ) ;
94  CCGFloat z1plus ( 0 ) ;
95  CCGFloat z2plus ( 0 ) ;
96  const std::vector<DetId>& esDetIds ( getValidDetIds() ) ;
97 
98  for( unsigned int i ( 0 ) ; i != esDetIds.size() ; ++i )
99  {
100  const ESDetId esid ( esDetIds[i] ) ;
101  const CaloCellGeometry* cell ( getGeometry( esid ) ) ;
102  if( 0 != cell )
103  {
104  const CCGFloat zz ( cell->getPosition().z() ) ;
105  if( 1 == esid.plane() )
106  {
107  if( 0 > esid.zside() )
108  {
109  z1minus += zz ;
110  ++n1minus ;
111  }
112  else
113  {
114  z1plus += zz ;
115  ++n1plus ;
116  }
117  }
118  if( 2 == esid.plane() )
119  {
120  if( 0 > esid.zside() )
121  {
122  z2minus += zz ;
123  ++n2minus ;
124  }
125  else
126  {
127  z2plus += zz ;
128  ++n2plus ;
129  }
130  }
131  }
132  }
133  assert( 0 != n1minus &&
134  0 != n2minus &&
135  0 != n1plus &&
136  0 != n2plus ) ;
137  z1minus /= (1.*n1minus) ;
138  z2minus /= (1.*n2minus) ;
139  z1plus /= (1.*n1plus) ;
140  z2plus /= (1.*n2plus) ;
141  assert( 0 != z1minus &&
142  0 != z2minus &&
143  0 != z1plus &&
144  0 != z2plus ) ;
145  setzPlanes( z1minus, z2minus, z1plus, z2plus ) ;
146 }
147 
148 
149 void
151  CCGFloat z2minus,
152  CCGFloat z1plus,
153  CCGFloat z2plus )
154 {
155  assert( 0 > z1minus &&
156  0 > z2minus &&
157  0 < z1plus &&
158  0 < z2plus ) ;
159 
160  m_zplane[0] = z1minus ;
161  m_zplane[1] = z2minus ;
162  m_zplane[2] = z1plus ;
163  m_zplane[3] = z2plus ;
164 }
165 
166 
167 // Get closest cell, etc...
168 DetId
170 {
171  return getClosestCellInPlane( point, 2 );
172 }
173 
174 DetId
176  int plane ) const
177 {
178  const CCGFloat x ( point.x() ) ;
179  const CCGFloat y ( point.y() ) ;
180  const CCGFloat z ( point.z() ) ;
181 
182  if( 0 == z ||
183  1 > plane ||
184  2 < plane ) return DetId( 0 ) ;
185 
186  const unsigned int iz ( ( 0>z ? 0 : 2 ) + plane - 1 ) ;
187 
188  const CCGFloat ze ( m_zplane[iz] ) ;
189  const CCGFloat xe ( x * ze/z ) ;
190  const CCGFloat ye ( y * ze/z ) ;
191 
192  const CCGFloat x0 ( 1 == plane ? xe : ye ) ;
193  const CCGFloat y0 ( 1 == plane ? ye : xe ) ;
194 
195  static const CCGFloat xWid ( m_xWidWaf + m_xIntraLadGap + m_xInterLadGap ) ;
196 
197  const int row ( 1 + int( y0 + 20.*m_yWidAct - m_yCtrOff )/m_yWidAct ) ;
198  const int col ( 1 + int( ( x0 + 20.*xWid )/xWid ) ) ;
199 
200  CCGFloat closest ( 1e9 ) ;
201 
202  DetId detId ( 0 ) ;
203 
204  const int jz ( 0 > ze ? -1 : 1 ) ;
205 
206 
207 // std::cout<<"** p="<<point<<", ("<<xe<<", "<<ye<<", "<<ze<<"), row="<<row<<", col="<<col<<std::endl;
208 
209  for( int ix ( -1 ); ix != 2 ; ++ix ) // search within +-1 in row and col
210  {
211  for( int iy ( -1 ); iy != 2 ; ++iy )
212  {
213  for( int jstrip ( ESDetId::ISTRIP_MIN ) ; jstrip <= ESDetId::ISTRIP_MAX ; ++jstrip )
214  {
215  const int jx ( 1 == plane ? col + ix : row + iy ) ;
216  const int jy ( 1 == plane ? row + iy : col + ix ) ;
217  if( ESDetId::validDetId( jstrip, jx, jy, plane, jz ) )
218  {
219  const ESDetId esId ( jstrip, jx, jy, plane, jz ) ;
220  const CaloCellGeometry* cell ( getGeometry( esId ) ) ;
221  if( 0 != cell )
222  {
223  const GlobalPoint& p ( cell->getPosition() ) ;
224  const CCGFloat dist2 ( (p.x()-xe)*(p.x()-xe) + (p.y()-ye)*(p.y()-ye) ) ;
225  if( dist2 < closest && present( esId ) )
226  {
227  closest = dist2 ;
228  detId = esId ;
229  }
230  }
231  }
232  }
233  }
234  }
235  return detId ;
236 }
237 
238 void
240  const CCGFloat* pv ,
241  unsigned int /*i*/ ,
242  Pt3D& ref )
243 {
244  PreshowerStrip::localCorners( lc, pv, ref ) ;
245 }
246 
247 void
249  const GlobalPoint& /*f2*/ ,
250  const GlobalPoint& /*f3*/ ,
251  const CCGFloat* parm ,
252  const DetId& detId )
253 {
254  const unsigned int cellIndex ( ESDetId( detId ).denseIndex() ) ;
255  m_cellVec[ cellIndex ] = PreshowerStrip( f1, cornersMgr(), parm ) ;
256  m_validIds.push_back( detId ) ;
257 }
258 
259 const CaloCellGeometry*
261 {
262  const CaloCellGeometry* cell ( &m_cellVec[ index ] ) ;
263  return ( m_cellVec.size() < index ||
264  0 == cell->param() ? 0 : cell ) ;
265 }
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
int i
Definition: DBlmapReader.cc:9
CaloCellGeometry::Pt3DVec Pt3DVec
CaloCellGeometry::Pt3D Pt3D
T y() const
Definition: PV3DBase.h:62
void setzPlanes(CCGFloat z1minus, CCGFloat z2minus, CCGFloat z1plus, CCGFloat z2plus)
virtual DetId getClosestCell(const GlobalPoint &r) const
std::vector< Pt3D > Pt3DVec
static const int ISTRIP_MAX
Definition: ESDetId.h:62
const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
CaloCellGeometry::CCGFloat CCGFloat
double double double z
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)
virtual const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
const CCGFloat * param() const
A base class to handle the shape of preshower strips.
U second(std::pair< T, U > const &p)
HepGeom::Plane3D< CCGFloat > Pl3D
virtual bool present(const DetId &id) const
is this detid present in the geometry?
static DetId detIdFromLocalAlignmentIndex(unsigned int iLoc)
std::vector< DetId > m_validIds
T z() const
Definition: PV3DBase.h:63
virtual void newCell(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
CaloCellGeometry::CCGFloat CCGFloat
virtual DetId getClosestCellInPlane(const GlobalPoint &r, int plane) const
static unsigned int alignmentTransformIndexLocal(const DetId &id)
int zside() const
Definition: ESDetId.h:33
bool isES() const
virtual ~EcalPreshowerGeometry()
The EcalPreshowerGeometry will delete all its cell geometries at destruction time.
CaloCellGeometry::Pt3D Pt3D
Definition: DetId.h:20
CaloCellGeometry::CornersMgr * cornersMgr()
static bool validDetId(int istrip, int ixs, int iys, int iplane, int iz)
check if a valid index combination
Definition: ESDetId.cc:50
CaloCellGeometry::Pt3DVec Pt3DVec
HepGeom::Point3D< CCGFloat > Pt3D
static void localCorners(Pt3DVec &lc, const CCGFloat *pv, unsigned int i, Pt3D &ref)
int plane() const
Definition: ESDetId.h:35
virtual const CaloCellGeometry * cellGeomPtr(uint32_t index) const
x
Definition: VDTMath.h:216
T x() const
Definition: PV3DBase.h:61
static unsigned int alignmentTransformIndexGlobal(const DetId &id)
static const int ISTRIP_MIN
Definition: ESDetId.h:61
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5