7 #include <Math/Transform3D.h>
8 #include <Math/EulerAngles.h>
18 : m_topology(topology), m_mergePosition(topology.getMergePositionFlag()) {
29 <<
"HcalGeometry::init() "
43 std::unique_ptr<std::vector<DetId>> p_hbIds{
new std::vector<DetId>};
44 std::unique_ptr<std::vector<DetId>> p_heIds{
new std::vector<DetId>};
45 std::unique_ptr<std::vector<DetId>> p_hoIds{
new std::vector<DetId>};
46 std::unique_ptr<std::vector<DetId>> p_hfIds{
new std::vector<DetId>};
47 std::unique_ptr<std::vector<DetId>> p_emptyIds{
new std::vector<DetId>};
50 for (
unsigned int i(0);
i != baseIds.size(); ++
i) {
53 p_hbIds->emplace_back(
id);
55 p_heIds->emplace_back(
id);
57 p_hoIds->emplace_back(
id);
59 p_hfIds->emplace_back(
id);
62 std::sort(p_hbIds->begin(), p_hbIds->end());
63 std::sort(p_heIds->begin(), p_heIds->end());
64 std::sort(p_hoIds->begin(), p_hoIds->end());
65 std::sort(p_hfIds->begin(), p_hfIds->end());
66 p_emptyIds->resize(0);
93 if (!m_mergePosition) {
112 static const double z_long = 1100.0;
113 double abseta = fabs(r.
eta());
114 double absz = fabs(r.
z());
120 }
else if (absz >= z_long) {
129 int etaring =
etaRing(bc, abseta);
131 int phibin =
phiBin(bc, etaring, r.
phi());
134 int etabin = (r.
z() > 0) ? etaring : -etaring;
137 static const double z_short = 1137.0;
141 HcalDetId bestId(bc, etabin, phibin, ((fabs(r.
z()) - z_short > -0.1) ? (2) : (1)));
145 int zside = (r.
z() > 0) ? 1 : -1;
147 double pointrz(0), drz(99999.);
148 HcalDetId currentId(bc, etabin, phibin, dbin);
155 std::shared_ptr<const CaloCellGeometry> cell =
getGeometry(currentId);
156 if (cell ==
nullptr) {
162 rz =
std::abs(cell->getPosition().z());
164 rz = cell->getPosition().mag();
175 return (ignoreCorrect ? bestId :
correctId(bestId));
191 int sign = (z == 0) ? (-1) : (1);
193 auto hcId = ((
id.subdet ==
static_cast<int>(
HcalBarrel))
195 : ((
id.subdet ==
static_cast<int>(
HcalEndcap))
197 : ((
id.subdet ==
static_cast<int>(
HcalOuter))
212 std::vector<HcalDetId> ids;
222 int sign = (z == 0) ? (-1) : (1);
224 auto hcId = ((
id.subdet ==
static_cast<int>(
HcalBarrel))
226 : ((
id.subdet ==
static_cast<int>(
HcalEndcap))
228 : ((
id.subdet ==
static_cast<int>(
HcalOuter))
243 std::vector<HcalDetId> ids;
248 for (
unsigned int k = 0;
k < 4; ++
k) {
249 mcorners[
k] = mcf[
k];
250 mcorners[
k + 4] = mcb[
k + 4];
266 if (dR >
M_PI / 2.) {
269 const double dR2(dR * dR);
270 const double reta(r.
eta());
271 const double rphi(r.
phi());
272 const double lowEta(reta - dR);
273 const double highEta(reta + dR);
274 const double lowPhi(rphi - dR);
275 const double highPhi(rphi + dR);
279 if (highEta > -hfEtaHi && lowEta < hfEtaHi) {
282 for (
unsigned int is(0); is != 4; ++is) {
283 const int sign(reta > 0 ? 1 : -1);
284 const int ieta_center(sign *
etaRing(hs[is], fabs(reta)));
285 const int ieta_lo((0 < lowEta * sign ? sign : -sign) *
etaRing(hs[is], fabs(lowEta)));
286 const int ieta_hi((0 < highEta * sign ? sign : -sign) *
etaRing(hs[is], fabs(highEta)));
287 const int iphi_lo(
phiBin(hs[is], ieta_center, lowPhi));
288 const int iphi_hi(
phiBin(hs[is], ieta_center, highPhi));
289 const int jphi_lo(iphi_lo > iphi_hi ? iphi_lo - 72 : iphi_lo);
290 const int jphi_hi(iphi_hi);
292 const int idep_lo(1 == is ? 4 : 1);
294 for (
int ieta(ieta_lo); ieta <= ieta_hi; ++ieta) {
296 for (
int jphi(jphi_lo); jphi <= jphi_hi; ++jphi) {
297 const int iphi(1 > jphi ? jphi + 72 : jphi);
298 for (
int idep(idep_lo); idep <= idep_hi; ++idep) {
299 const HcalDetId did(hs[is], ieta, iphi, idep);
302 if (
nullptr != cell) {
304 const double eta(
p.eta());
305 const double phi(
p.phi());
322 unsigned int hxsize(0);
341 const int iphi(1 + (4 * i) % 72);
348 const int iphi(1 + (4 * i) % 72);
355 const int iphi(1 + (4 * i) % 72);
361 const int ring(i / 12);
362 const int ieta(0 == ring ? -11 : 1 == ring ? -5 : 2 == ring ? 1 : 3 == ring ? 5 : 11);
363 const int iphi(1 + (i - ring * 12) * 6);
383 const unsigned int iphi(hid.
iphi());
384 const int ieta(hid.
ieta());
385 const unsigned int index((0 < ieta ? nD / 2 : 0) + (iphi + 1) % 72 / 4);
404 const int ieta(hid.
ieta());
405 const int iphi(hid.
iphi());
406 const int ring(ieta < -10 ? 0 : (ieta < -4 ? 1 : (ieta < 5 ? 2 : (ieta < 11 ? 3 : 4))));
408 const unsigned int index(12 * ring + (iphi - 1) / 6);
457 <<
" newCell subdet " << detId.
subdetId() <<
", raw ID " << detId.
rawId() <<
", hid " << hid <<
", din "
458 << din <<
", index " << std::endl;
509 return ((
nullptr == cell ||
nullptr == cell->
param()) ?
nullptr : cell);
522 for (
float iv :
pv) {
523 dVec.emplace_back(
iv);
531 if (
nullptr != ptr) {
532 dinsVec.emplace_back(
i);
536 unsigned int ishape(9999);
538 for (
unsigned int ivv(0); ivv !=
parVecVec().size(); ++ivv) {
542 ok = ok && (fabs(par[
k] - pv[
k]) < 1.e-6);
551 const unsigned int nn((
numberOfShapes() == 1) ? (
unsigned int)1 : m_dins.size());
552 if (iVec.size() <
nn)
553 iVec.emplace_back(ishape);
555 ptr->getTransform(tr, (
Pt3DVec*)
nullptr);
559 tr = HepGeom::Translate3D(
gp.x(),
gp.y(),
gp.z());
562 const CLHEP::Hep3Vector
tt(tr.getTranslation());
563 tVec.emplace_back(
tt.x());
564 tVec.emplace_back(
tt.y());
565 tVec.emplace_back(
tt.z());
567 const CLHEP::HepRotation
rr(tr.getRotation());
568 const ROOT::Math::Transform3D rtr(
569 rr.xx(),
rr.xy(),
rr.xz(),
tt.x(),
rr.yx(),
rr.yy(),
rr.yz(),
tt.y(),
rr.zx(),
rr.zy(),
rr.zz(),
tt.z());
572 tVec.emplace_back(ea.Phi());
573 tVec.emplace_back(ea.Theta());
574 tVec.emplace_back(ea.Psi());
static unsigned int numberOfBarrelAlignments()
unsigned int getHFSize() const
std::set< DetId > DetIdSet
static unsigned int alignmentTransformIndexLocal(const DetId &id)
const HcalDDDRecConstants * dddConstants() const
std::vector< CCGFloat > DimVec
unsigned int getHOSize() const
edm::AtomicPtrCache< std::vector< DetId > > m_heIds
const std::vector< DetId > & getValidDetIds(DetId::Detector det=DetId::Detector(0), int subdet=0) const override
Get a list of valid detector ids (for the given subdetector)
static unsigned int alignmentEndcapIndexLocal(const DetId &id)
uint16_t *__restrict__ id
int phiBin(HcalSubdetector subdet, int etaRing, double phi) const
unsigned int getHxSize(const int type) const
static DetId detIdFromOuterAlignmentIndex(unsigned int i)
DetId getClosestCell(const GlobalPoint &r) const override
bool valid(const DetId &id) const override
Geom::Phi< T > phi() const
constexpr uint32_t rawId() const
get the raw id
const HcalTopology & m_topology
std::vector< unsigned int > IVec
edm::AtomicPtrCache< std::vector< DetId > > m_emptyIds
unsigned int detId2denseId(const DetId &id) const override
return a linear packed id
bool isHE(int etabin, int depth)
std::vector< CCGFloat > TrVec
std::shared_ptr< const CaloCellGeometry > getGeometry(const DetId &id) const override
Get the cell geometry of a given detector id. Should return false if not found.
HepGeom::Transform3D Tr3D
std::vector< IdealObliquePrism > HECellVec
std::vector< Pt3D > Pt3DVec
bool isHB(int etabin, int depth)
CaloCellGeometry::CCGFloat CCGFloat
bool getMergePositionFlag() const
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)
HcalDetId mergedDepthDetId(const HcalDetId &id) const
std::shared_ptr< const CaloCellGeometry > getGeometryBase(const DetId &id) const
constexpr HcalSubdetector subdet() const
get the subdetector
void newCellFast(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
CaloCellGeometry::Pt3DVec Pt3DVec
virtual std::shared_ptr< const CaloCellGeometry > cellGeomPtr(uint32_t index) const
virtual DetIdSet getCells(const GlobalPoint &r, double dR) const
Get a list of all cells within a dR of the given cell.
const CCGFloat * param() const
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
constexpr int iphi() const
get the cell iphi
void getSummary(CaloSubdetectorGeometry::TrVec &trVector, CaloSubdetectorGeometry::IVec &iVector, CaloSubdetectorGeometry::DimVec &dimVector, CaloSubdetectorGeometry::IVec &dinsVector) const override
HcalID getHCID(int subdet, int ieta, int iphi, int lay, int idepth) const
std::vector< DetId > m_validIds
std::vector< IdealObliquePrism > HOCellVec
static unsigned int numberOfOuterAlignments()
int getMinDepth(const int &itype, const int &ieta, const int &iphi, const int &zside) const
int etaRing(HcalSubdetector subdet, double eta) const
eta and phi index from eta, phi values
DetId correctId(const DetId &id) const
static DetId detIdFromForwardAlignmentIndex(unsigned int i)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
static unsigned int alignmentTransformIndexGlobal(const DetId &id)
static unsigned int alignmentBarrelIndexLocal(const DetId &id)
unsigned int numberOfParametersPerShape() const override
Abs< T >::type abs(const T &t)
static void unpackHcalIndex(const uint32_t &idx, int &det, int &z, int &depth, int &eta, int &phi, int &lay)
constexpr int ieta() const
get the cell ieta
CaloCellGeometry::CCGFloat CCGFloat
static DetId detIdFromBarrelAlignmentIndex(unsigned int i)
DetId denseId2detId(unsigned int) const override
return a linear packed id
void unmergeDepthDetId(const HcalDetId &id, std::vector< HcalDetId > &ids) const
int phiBin(HcalSubdetector bc, int etaring, double phi) const
static DetId detIdFromLocalAlignmentIndex(unsigned int i)
int etaRing(HcalSubdetector bc, double abseta) const
helper methods for getClosestCell
CaloSubdetectorGeometry::IVec m_dins
HcalGeometry(const HcalTopology &topology)
unsigned int ncells() const override
return a count of valid cells (for dense indexing use)
GlobalPoint getPosition(const DetId &id) const
void localCorners(Pt3DVec &lc, const CCGFloat *pv, unsigned int i, Pt3D &ref)
CaloSubdetectorGeometry::DetIdSet getCells(const GlobalPoint &r, double dR) const override
Get a list of all cells within a dR of the given cell.
static unsigned int alignmentOuterIndexLocal(const DetId &id)
CaloCellGeometry::Pt3D Pt3D
std::vector< IdealZPrism > HFCellVec
~HcalGeometry() override
The HcalGeometry will delete all its cell geometries at destruction time.
bool incrementDepth(HcalDetId &id) const
static unsigned int numberOfEndcapAlignments()
AlgebraicVector EulerAngles
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
void addValidID(const DetId &id)
bool set(std::unique_ptr< T > iNewValue) const
unsigned int numberOfShapes() const override
CaloCellGeometry::CornersMgr * cornersMgr()
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
CaloCellGeometry::CornersVec getCorners(const DetId &id) const
CaloCellGeometry::Pt3DVec Pt3DVec
HepGeom::Point3D< CCGFloat > Pt3D
bool isHF(int etabin, int depth)
std::vector< IdealObliquePrism > HBCellVec
unsigned int getHESize() const
CaloCellGeometry::Tr3D Tr3D
const CaloCellGeometry * getGeometryRawPtr(uint32_t index) const override
void increaseReserve(unsigned int extra)
edm::AtomicPtrCache< std::vector< DetId > > m_hfIds
void newCell(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId) override
static unsigned int numberOfForwardAlignments()
static unsigned int alignmentForwardIndexLocal(const DetId &id)
GlobalPoint getBackPosition(const DetId &id) const
HcalDetId idFront(const HcalDetId &id) const
static DetId detIdFromEndcapAlignmentIndex(unsigned int i)
static unsigned int alignmentBarEndForIndexLocal(const DetId &id, unsigned int nD)
virtual unsigned int numberOfTransformParms() const
edm::AtomicPtrCache< std::vector< DetId > > m_hoIds
CaloCellGeometry::Pt3D Pt3D
unsigned int getHBSize() const
unsigned int newCellImpl(const GlobalPoint &f1, const GlobalPoint &f2, const GlobalPoint &f3, const CCGFloat *parm, const DetId &detId)
edm::AtomicPtrCache< std::vector< DetId > > m_hbIds
static unsigned int numberOfAlignments()
double etaMax(HcalSubdetector subdet) const
constexpr Detector det() const
get the detector field from this detid