6 #include <Math/Transform3D.h> 7 #include <Math/EulerAngles.h> 17 : m_topology(topology), m_mergePosition(topology.getMergePositionFlag()) {
28 <<
"HcalGeometry::init() " 42 std::unique_ptr<std::vector<DetId>> p_hbIds{
new std::vector<DetId>};
43 std::unique_ptr<std::vector<DetId>> p_heIds{
new std::vector<DetId>};
44 std::unique_ptr<std::vector<DetId>> p_hoIds{
new std::vector<DetId>};
45 std::unique_ptr<std::vector<DetId>> p_hfIds{
new std::vector<DetId>};
46 std::unique_ptr<std::vector<DetId>> p_emptyIds{
new std::vector<DetId>};
49 for (
unsigned int i(0);
i != baseIds.size(); ++
i) {
52 p_hbIds->emplace_back(
id);
54 p_heIds->emplace_back(
id);
56 p_hoIds->emplace_back(
id);
58 p_hfIds->emplace_back(
id);
61 std::sort(p_hbIds->begin(), p_hbIds->end());
62 std::sort(p_heIds->begin(), p_heIds->end());
63 std::sort(p_hoIds->begin(), p_hoIds->end());
64 std::sort(p_hfIds->begin(), p_hfIds->end());
65 p_emptyIds->resize(0);
92 if (!m_mergePosition) {
111 static const double z_long = 1100.0;
112 double abseta = fabs(r.
eta());
113 double absz = fabs(r.
z());
119 }
else if (absz >= z_long) {
128 int etaring =
etaRing(bc, abseta);
130 int phibin =
phiBin(bc, etaring, r.
phi());
133 int etabin = (r.
z() > 0) ? etaring : -etaring;
136 static const double z_short = 1137.0;
140 HcalDetId bestId(bc, etabin, phibin, ((fabs(r.
z()) - z_short > -0.1) ? (2) : (1)));
144 int zside = (r.
z() > 0) ? 1 : -1;
146 double pointrz(0), drz(99999.);
147 HcalDetId currentId(bc, etabin, phibin, dbin);
154 std::shared_ptr<const CaloCellGeometry> cell =
getGeometry(currentId);
155 if (cell ==
nullptr) {
161 rz =
std::abs(cell->getPosition().z());
163 rz = cell->getPosition().mag();
174 return (ignoreCorrect ? bestId :
correctId(bestId));
190 std::vector<HcalDetId>
ids;
200 std::vector<HcalDetId>
ids;
205 for (
unsigned int k = 0;
k < 4; ++
k) {
206 mcorners[
k] = mcf[
k];
207 mcorners[
k + 4] = mcb[
k + 4];
223 if (dR >
M_PI / 2.) {
226 const double dR2(dR * dR);
227 const double reta(r.
eta());
228 const double rphi(r.
phi());
229 const double lowEta(reta - dR);
230 const double highEta(reta + dR);
231 const double lowPhi(rphi - dR);
232 const double highPhi(rphi + dR);
236 if (highEta > -hfEtaHi && lowEta < hfEtaHi) {
239 for (
unsigned int is(0); is != 4; ++is) {
240 const int sign(reta > 0 ? 1 : -1);
241 const int ieta_center(sign *
etaRing(hs[is], fabs(reta)));
242 const int ieta_lo((0 < lowEta * sign ? sign : -sign) *
etaRing(hs[is], fabs(lowEta)));
243 const int ieta_hi((0 < highEta * sign ? sign : -sign) *
etaRing(hs[is], fabs(highEta)));
244 const int iphi_lo(
phiBin(hs[is], ieta_center, lowPhi));
245 const int iphi_hi(
phiBin(hs[is], ieta_center, highPhi));
246 const int jphi_lo(iphi_lo > iphi_hi ? iphi_lo - 72 : iphi_lo);
247 const int jphi_hi(iphi_hi);
249 const int idep_lo(1 == is ? 4 : 1);
253 for (
int jphi(jphi_lo); jphi <= jphi_hi; ++jphi) {
254 const int iphi(1 > jphi ? jphi + 72 : jphi);
255 for (
int idep(idep_lo); idep <= idep_hi; ++idep) {
259 if (
nullptr != cell) {
261 const double eta(
p.eta());
262 const double phi(
p.phi());
279 unsigned int hxsize(0);
298 const int iphi(1 + (4 * i) % 72);
305 const int iphi(1 + (4 * i) % 72);
312 const int iphi(1 + (4 * i) % 72);
318 const int ring(i / 12);
319 const int ieta(0 == ring ? -11 : 1 == ring ? -5 : 2 == ring ? 1 : 3 == ring ? 5 : 11);
320 const int iphi(1 + (i - ring * 12) * 6);
340 const unsigned int iphi(hid.
iphi());
342 const unsigned int index((0 <
ieta ? nD / 2 : 0) + (
iphi + 1) % 72 / 4);
365 const unsigned int index(12 * ring + (
iphi - 1) / 6);
414 <<
" newCell subdet " << detId.
subdetId() <<
", raw ID " << detId.
rawId() <<
", hid " << hid <<
", din " 415 << din <<
", index " << std::endl;
466 return ((
nullptr == cell ||
nullptr == cell->
param()) ?
nullptr : cell);
479 for (
float iv :
pv) {
480 dVec.emplace_back(iv);
488 if (
nullptr != ptr) {
489 dinsVec.emplace_back(
i);
493 unsigned int ishape(9999);
495 for (
unsigned int ivv(0); ivv !=
parVecVec().size(); ++ivv) {
499 ok = ok && (fabs(par[
k] - pv[
k]) < 1.e-6);
506 assert(9999 != ishape);
508 const unsigned int nn((
numberOfShapes() == 1) ? (
unsigned int)1 : m_dins.size());
509 if (iVec.size() <
nn)
510 iVec.emplace_back(ishape);
512 ptr->getTransform(tr, (
Pt3DVec*)
nullptr);
516 tr = HepGeom::Translate3D(
gp.x(),
gp.y(),
gp.z());
519 const CLHEP::Hep3Vector
tt(tr.getTranslation());
520 tVec.emplace_back(
tt.x());
521 tVec.emplace_back(
tt.y());
522 tVec.emplace_back(
tt.z());
524 const CLHEP::HepRotation
rr(tr.getRotation());
525 const ROOT::Math::Transform3D rtr(
526 rr.xx(),
rr.xy(),
rr.xz(),
tt.x(),
rr.yx(),
rr.yy(),
rr.yz(),
tt.y(),
rr.zx(),
rr.zy(),
rr.zz(),
tt.z());
529 tVec.emplace_back(ea.Phi());
530 tVec.emplace_back(ea.Theta());
531 tVec.emplace_back(ea.Psi());
DetId denseId2detId(unsigned int) const override
return a linear packed id
static unsigned int numberOfBarrelAlignments()
unsigned int getHFSize() const
std::set< DetId > DetIdSet
static unsigned int alignmentTransformIndexLocal(const DetId &id)
const HcalDDDRecConstants * dddConstants() const
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.
std::vector< CCGFloat > DimVec
unsigned int getHOSize() const
CaloCellGeometry::Pt3DVec Pt3DVec
CaloSubdetectorGeometry::DetIdSet getCells(const GlobalPoint &r, double dR) const override
Get a list of all cells within a dR of the given cell.
edm::AtomicPtrCache< std::vector< DetId > > m_heIds
const CaloCellGeometry * getGeometryRawPtr(uint32_t index) const override
static unsigned int alignmentEndcapIndexLocal(const DetId &id)
HcalSubdetector subdet() const
get the subdetector
int phiBin(HcalSubdetector subdet, int etaRing, double phi) const
bool valid(const DetId &id) const override
CaloTopology const * topology(0)
unsigned int getHxSize(const int type) const
static DetId detIdFromOuterAlignmentIndex(unsigned int i)
unsigned int detId2denseId(const DetId &id) const override
return a linear packed id
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)
unsigned int numberOfShapes() 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
bool isHE(int etabin, int depth)
std::vector< CCGFloat > TrVec
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
CaloCellGeometry::Tr3D Tr3D
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)
unsigned int numberOfParametersPerShape() const override
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
int ieta() const
get the cell ieta
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)
Abs< T >::type abs(const T &t)
static DetId detIdFromBarrelAlignmentIndex(unsigned int i)
void unmergeDepthDetId(const HcalDetId &id, std::vector< HcalDetId > &ids) const
CaloCellGeometry::CCGFloat CCGFloat
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)
GlobalPoint getPosition(const DetId &id) const
void localCorners(Pt3DVec &lc, const CCGFloat *pv, unsigned int i, Pt3D &ref)
static unsigned int alignmentOuterIndexLocal(const DetId &id)
std::vector< IdealZPrism > HFCellVec
int iphi() const
get the cell iphi
~HcalGeometry() override
The HcalGeometry will delete all its cell geometries at destruction time.
bool incrementDepth(HcalDetId &id) const
static unsigned int numberOfEndcapAlignments()
CaloCellGeometry::Pt3D Pt3D
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
CaloCellGeometry::CornersMgr * cornersMgr()
static void localCorners(Pt3DVec &vec, const CCGFloat *pv, Pt3D &ref)
CaloCellGeometry::CornersVec getCorners(const DetId &id) const
HepGeom::Point3D< CCGFloat > Pt3D
bool isHF(int etabin, int depth)
std::vector< IdealObliquePrism > HBCellVec
unsigned int getHESize() const
CaloCellGeometry::Tr3D Tr3D
void increaseReserve(unsigned int extra)
void getSummary(CaloSubdetectorGeometry::TrVec &trVector, CaloSubdetectorGeometry::IVec &iVector, CaloSubdetectorGeometry::DimVec &dimVector, CaloSubdetectorGeometry::IVec &dinsVector) const override
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()
unsigned int ncells() const override
return a count of valid cells (for dense indexing use)
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()
DetId getClosestCell(const GlobalPoint &r) const override
double etaMax(HcalSubdetector subdet) const
constexpr Detector det() const
get the detector field from this detid