CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalDDDGeometry.cc
Go to the documentation of this file.
4 
5 #include <algorithm>
6 
8  : topo_(topo),
9  etaMax_(0),
10  m_hbCellVec ( topo.getHBSize() ) ,
11  m_heCellVec ( topo.getHESize() ) ,
12  m_hoCellVec ( topo.getHOSize() ) ,
13  m_hfCellVec ( topo.getHFSize() )
14 {
15 }
16 
18 {
19 }
20 
21 void
23 {
24  const std::vector<DetId>& baseIds ( CaloSubdetectorGeometry::getValidDetIds() ) ;
25  for( unsigned int i ( 0 ) ; i != baseIds.size() ; ++i )
26  {
27  const DetId id ( baseIds[i] );
28  if( id.subdetId() == HcalBarrel )
29  {
30  m_hbIds.push_back( id ) ;
31  }
32  else
33  {
34  if( id.subdetId() == HcalEndcap )
35  {
36  m_heIds.push_back( id ) ;
37  }
38  else
39  {
40  if( id.subdetId() == HcalOuter )
41  {
42  m_hoIds.push_back( id ) ;
43  }
44  else
45  {
46  if( id.subdetId() == HcalForward )
47  {
48  m_hfIds.push_back( id ) ;
49  }
50  }
51  }
52  }
53  }
54  std::sort( m_hbIds.begin(), m_hbIds.end() ) ;
55  std::sort( m_heIds.begin(), m_heIds.end() ) ;
56  std::sort( m_hoIds.begin(), m_hoIds.end() ) ;
57  std::sort( m_hfIds.begin(), m_hfIds.end() ) ;
58 
59  m_emptyIds.resize( 0 ) ;
60 }
61 
62 std::vector<DetId> const &
64  int subdet) const
65 {
66  if( 0 != subdet &&
67  0 == m_hbIds.size() ) fillDetIds() ;
68  return ( 0 == subdet ? CaloSubdetectorGeometry::getValidDetIds() :
69  ( HcalBarrel == subdet ? m_hbIds :
70  ( HcalEndcap == subdet ? m_heIds :
71  ( HcalOuter == subdet ? m_hoIds :
72  ( HcalForward == subdet ? m_hfIds : m_emptyIds ) ) ) ) ) ;
73 }
74 
75 DetId
77 {
78  constexpr double twopi = M_PI+M_PI;
79  constexpr double deg = M_PI/180.;
80 
81  // Now find the closest eta_bin, eta value of a bin i is average
82  // of eta[i] and eta[i-1]
83  double abseta = fabs(r.eta());
84  double phi = r.phi();
85  if (phi < 0) phi += twopi;
86  double radius = r.mag();
87  double z = fabs(r.z());
88 
89  LogDebug("HCalGeom") << "HcalDDDGeometry::getClosestCell for eta "
90  << r.eta() << " phi " << phi/deg << " z " << r.z()
91  << " radius " << radius;
92  HcalDetId bestId;
93  if (abseta <= etaMax_) {
94  for (unsigned int i=0; i<hcalCells_.size(); i++) {
95  if (abseta >=hcalCells_[i].etaMin() && abseta <=hcalCells_[i].etaMax()) {
96  HcalSubdetector bc = hcalCells_[i].detType();
97  int etaring = hcalCells_[i].etaBin();
98  int phibin = 0;
99  if (hcalCells_[i].unitPhi() == 4) {
100  // rings 40 and 41 are offset wrt the other phi numbering
101  // 1 1 1 2
102  // ------------------------------
103  // 72 36 36 1
104  phibin = static_cast<int>(((phi/deg)+hcalCells_[i].phiOffset()+
105  0.5*hcalCells_[i].phiBinWidth())/
106  hcalCells_[i].phiBinWidth());
107  if (phibin == 0) phibin = hcalCells_[i].nPhiBins();
108  phibin = phibin*4 - 1;
109  } else {
110  phibin = static_cast<int>(((phi/deg)+hcalCells_[i].phiOffset())/
111  hcalCells_[i].phiBinWidth()) + 1;
112  // convert to the convention of numbering 1,3,5, in 36 phi bins
113  phibin = (phibin-1)*(hcalCells_[i].unitPhi()) + 1;
114  }
115 
116  int dbin = 1;
117  int etabin = (r.z() > 0) ? etaring : -etaring;
118  if (bc == HcalForward) {
119  bestId = HcalDetId(bc, etabin, phibin, dbin);
120  break;
121  } else {
122  double rz = z;
123  if (hcalCells_[i].depthType()) rz = radius;
124  if (rz < hcalCells_[i].depthMax()) {
125  dbin = hcalCells_[i].depthSegment();
126  bestId = HcalDetId(bc, etabin, phibin, dbin);
127  break;
128  }
129  }
130  }
131  }
132  }
133 
134  LogDebug("HCalGeom") << "HcalDDDGeometry::getClosestCell " << bestId;
135 
136  return bestId;
137 }
138 
139 int
140 HcalDDDGeometry::insertCell(std::vector<HcalCellType> const & cells){
141 
142  hcalCells_.insert(hcalCells_.end(), cells.begin(), cells.end());
143  int num = static_cast<int>(hcalCells_.size());
144  for (unsigned int i=0; i<cells.size(); i++) {
145  if (cells[i].etaMax() > etaMax_ ) etaMax_ = cells[i].etaMax();
146  }
147 
148  LogDebug("HCalGeom") << "HcalDDDGeometry::insertCell " << cells.size()
149  << " cells inserted == Total " << num
150  << " EtaMax = " << etaMax_;
151  return num;
152 }
153 
154 void
156  const GlobalPoint& f2 ,
157  const GlobalPoint& f3 ,
158  const CCGFloat* parm ,
159  const DetId& detId )
160 {
161 
162  assert( detId.det()==DetId::Hcal );
163 
164  const unsigned int din(topo_.detId2denseId(detId));
165 
166  HcalDetId hId(detId);
167 
168  if( hId.subdet()==HcalBarrel )
169  {
170  m_hbCellVec[ din ] = IdealObliquePrism( f1, cornersMgr(), parm ) ;
171  }
172  else
173  {
174  if( hId.subdet()==HcalEndcap )
175  {
176  const unsigned int index ( din - m_hbCellVec.size() ) ;
177  m_heCellVec[ index ] = IdealObliquePrism( f1, cornersMgr(), parm ) ;
178  }
179  else
180  {
181  if( hId.subdet()==HcalOuter )
182  {
183  const unsigned int index ( din
184  - m_hbCellVec.size()
185  - m_heCellVec.size() ) ;
186  m_hoCellVec[ index ] = IdealObliquePrism( f1, cornersMgr(), parm ) ;
187  }
188  else
189  { // assuming HcalForward here!
190  const unsigned int index ( din
191  - m_hbCellVec.size()
192  - m_heCellVec.size()
193  - m_hoCellVec.size() ) ;
194  m_hfCellVec[ index ] = IdealZPrism( f1, cornersMgr(), parm ) ;
195  }
196  }
197  }
198  addValidID( detId ) ;
199 }
200 
201 const CaloCellGeometry*
203 {
204  const CaloCellGeometry* cell ( 0 ) ;
205  if( m_hbCellVec.size() > din )
206  {
207  cell = &m_hbCellVec[ din ] ;
208  }
209  else
210  {
211  if( m_hbCellVec.size() +
212  m_heCellVec.size() > din )
213  {
214  const unsigned int index ( din - m_hbCellVec.size() ) ;
215  cell = &m_heCellVec[ index ] ;
216  }
217  else
218  {
219  if( m_hbCellVec.size() +
220  m_heCellVec.size() +
221  m_hoCellVec.size() > din )
222  {
223  const unsigned int index ( din
224  - m_hbCellVec.size()
225  - m_heCellVec.size() ) ;
226  cell = &m_hoCellVec[ index ] ;
227  }
228  else
229  {
230  if( m_hbCellVec.size() +
231  m_heCellVec.size() +
232  m_hoCellVec.size() +
233  m_hfCellVec.size() > din )
234  {
235  const unsigned int index ( din
236  - m_hbCellVec.size()
237  - m_heCellVec.size()
238  - m_hoCellVec.size() ) ;
239  cell = &m_hfCellVec[ index ] ;
240  }
241  }
242  }
243  }
244  return ( 0 == cell || 0 == cell->param() ? 0 : cell ) ;
245 }
#define LogDebug(id)
int i
Definition: DBlmapReader.cc:9
virtual unsigned int detId2denseId(const DetId &id) const
return a linear packed id
virtual const CaloCellGeometry * cellGeomPtr(uint32_t index) const
std::vector< DetId > m_hfIds
std::vector< DetId > m_heIds
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
virtual void newCell(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
CaloCellGeometry::CCGFloat CCGFloat
virtual ~HcalDDDGeometry()
The HcalDDDGeometry will delete all its cell geometries at destruction time.
float float float 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)
const HcalTopology & topo_
const CCGFloat * param() const
T mag() const
Definition: PV3DBase.h:67
int insertCell(std::vector< HcalCellType > const &)
T z() const
Definition: PV3DBase.h:64
HcalSubdetector
Definition: HcalAssistant.h:31
HcalDDDGeometry(const HcalTopology &theTopo)
std::vector< HcalCellType > hcalCells_
std::vector< DetId > m_hbIds
HBCellVec m_hbCellVec
Definition: DetId.h:18
void fillDetIds() const
std::vector< DetId > m_emptyIds
#define M_PI
Definition: BFit3D.cc:3
void addValidID(const DetId &id)
HECellVec m_heCellVec
CaloCellGeometry::CornersMgr * cornersMgr()
Detector
Definition: DetId.h:24
HFCellVec m_hfCellVec
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 eta() const
Definition: PV3DBase.h:76
HOCellVec m_hoCellVec
virtual DetId getClosestCell(const GlobalPoint &r) const
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
std::vector< DetId > m_hoIds
#define constexpr
Definition: DDAxes.h:10