61 mypar.
filter(refs, attribute, value);
62 fview.mergedSpecifics(refs);
67 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Building the geometry service";
69 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"About to run through the RPC structure\n" 72 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"doSubDets = " << doSubDets;
74 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"start the loop";
76 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the Muon base Number";
78 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Start the Rpc Numbering Schema";
80 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the Unit Number";
82 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the RPC det Id " << detid;
85 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"The RPCDetid is " << rpcid;
87 DDValue numbOfStrips(
"nStrips");
91 for (
auto& spec :
specs) {
92 if (
DDfetch(spec, numbOfStrips)) {
97 LogDebug(
"RPCGeometryBuilderFromDDD") << ((nStrips == 0) ? (
"No strip found!!") : (
""));
108 rota.GetComponents(x, y, z);
122 if (dpar.size() == 3) {
127 const std::vector<float> pars = {
width, length,
float(numbOfStrips.
doubles()[0])};
130 if (tran.z() > -1500.) {
139 LogDebug(
"RPCGeometryBuilderFromDDD")
140 <<
"Barrel " << name <<
" par " << width <<
" " << length <<
" " <<
thickness;
146 const float ti = 0.4;
154 LogDebug(
"RPCGeometryBuilderFromDDD")
155 <<
"Forward " << name <<
" par " << dpar[4] <<
" " << dpar[8] <<
" " << dpar[3] <<
" " << dpar[0];
165 LogDebug(
"RPCGeometryBuilderFromDDD") <<
" Number of strips " <<
nStrips;
172 auto rls =
chids.find(chid);
173 if (rls ==
chids.end())
174 rls =
chids.insert(std::make_pair(chid, std::list<RPCRoll*>())).first;
175 rls->second.emplace_back(r);
179 for (
auto& ich :
chids) {
181 const auto& rls = ich.second;
185 const auto& refSurf = (*rls.begin())->surface();
187 float corners[6] = {0, 0, 0, 0, 0, 0};
188 for (
auto rl : rls) {
189 const double h2 = rl->surface().bounds().length() / 2;
190 const double w2 = rl->surface().bounds().width() / 2;
191 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-w2, -h2, 0)));
192 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+w2, +h2, 0)));
193 corners[0] =
std::min(corners[0], x1y1AtRef.x());
194 corners[1] =
std::min(corners[1], x1y1AtRef.y());
195 corners[2] =
std::max(corners[2], x2y2AtRef.x());
196 corners[3] =
std::max(corners[3], x2y2AtRef.y());
197 corners[4] =
std::min(corners[4], x1y1AtRef.z());
198 corners[5] =
std::max(corners[5], x1y1AtRef.z());
200 const LocalPoint lpOfCentre((corners[0] + corners[2]) / 2, (corners[1] + corners[3]) / 2, 0);
201 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
203 (corners[2] - corners[0]) / 2, (corners[3] - corners[1]) / 2, (corners[5] - corners[4]) + 0.5);
204 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
206 float cornersLo[3] = {0, 0, 0}, cornersHi[3] = {0, 0, 0};
207 float cornersZ[2] = {0, 0};
208 for (
auto rl : rls) {
210 const double w2 = rl->surface().bounds().width() / 2;
212 const double r = topo.radius();
213 const double wAtLo = w2 / r * (r - h2);
214 const double wAtHi = w2 / r * (r + h2);
216 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtLo, -h2, 0)));
217 const auto x2y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtLo, -h2, 0)));
218 const auto x1y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtHi, +h2, 0)));
219 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtHi, +h2, 0)));
221 cornersLo[0] =
std::min(cornersLo[0], x1y1AtRef.x());
222 cornersLo[1] =
std::max(cornersLo[1], x2y1AtRef.x());
223 cornersLo[2] =
std::min(cornersLo[2], x1y1AtRef.y());
225 cornersHi[0] =
std::min(cornersHi[0], x1y2AtRef.x());
226 cornersHi[1] =
std::max(cornersHi[1], x2y2AtRef.x());
227 cornersHi[2] =
std::max(cornersHi[2], x1y2AtRef.y());
229 cornersZ[0] =
std::min(cornersZ[0], x1y1AtRef.z());
230 cornersZ[1] =
std::max(cornersZ[1], x1y1AtRef.z());
232 const LocalPoint lpOfCentre((cornersHi[0] + cornersHi[1]) / 2, (cornersLo[2] + cornersHi[2]) / 2, 0);
233 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
235 (cornersHi[1] - cornersHi[0]) / 2,
236 (cornersHi[2] - cornersLo[2]) / 2,
237 (cornersZ[1] - cornersZ[0]) + 0.5);
238 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
263 int detid = rpcnum.getDetId();
270 std::vector<double> dpar = fview.
parameters();
272 std::string_view
name = fview.
name();
274 const Double_t* tran = fview.
trans();
281 rota.GetComponents(x, y, z);
295 if (fview.
isABox() == 1) {
296 const float width = dpar[0];
297 const float length = dpar[1];
302 const std::vector<float> pars = {
width, length,
float(nStrips)};
305 if (tran[2] > -1500.) {
316 const float be = dpar[0];
317 const float te = dpar[1];
318 const float ap = dpar[3];
319 const float ti = 0.4;
322 const std::vector<float> pars = {
float(dpar[0]),
float(dpar[1]),
float(dpar[3]),
float(nStrips)};
338 auto rls =
chids.find(chid);
339 if (rls ==
chids.end())
340 rls =
chids.insert(std::make_pair(chid, std::list<RPCRoll*>())).first;
341 rls->second.emplace_back(r);
344 for (
auto& ich :
chids) {
346 const auto& rls = ich.second;
350 const auto& refSurf = (*rls.begin())->surface();
352 float corners[6] = {0, 0, 0, 0, 0, 0};
353 for (
auto rl : rls) {
354 const double h2 = rl->surface().bounds().length() / 2;
355 const double w2 = rl->surface().bounds().width() / 2;
356 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-w2, -h2, 0)));
357 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+w2, +h2, 0)));
358 corners[0] =
std::min(corners[0], x1y1AtRef.x());
359 corners[1] =
std::min(corners[1], x1y1AtRef.y());
360 corners[2] =
std::max(corners[2], x2y2AtRef.x());
361 corners[3] =
std::max(corners[3], x2y2AtRef.y());
363 corners[4] =
std::min(corners[4], x1y1AtRef.z());
364 corners[5] =
std::max(corners[5], x1y1AtRef.z());
366 const LocalPoint lpOfCentre((corners[0] + corners[2]) / 2, (corners[1] + corners[3]) / 2, 0);
367 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
369 (corners[2] - corners[0]) / 2, (corners[3] - corners[1]) / 2, (corners[5] - corners[4]) + 0.5);
370 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
373 float cornersLo[3] = {0, 0, 0}, cornersHi[3] = {0, 0, 0};
374 float cornersZ[2] = {0, 0};
375 for (
auto rl : rls) {
377 const double w2 = rl->surface().bounds().width() / 2;
379 const double r = topo.radius();
380 const double wAtLo = w2 / r * (r - h2);
381 const double wAtHi = w2 / r * (r + h2);
382 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtLo, -h2, 0)));
383 const auto x2y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtLo, -h2, 0)));
384 const auto x1y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtHi, +h2, 0)));
385 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtHi, +h2, 0)));
387 cornersLo[0] =
std::min(cornersLo[0], x1y1AtRef.x());
388 cornersLo[1] =
std::max(cornersLo[1], x2y1AtRef.x());
389 cornersLo[2] =
std::min(cornersLo[2], x1y1AtRef.y());
391 cornersHi[0] =
std::min(cornersHi[0], x1y2AtRef.x());
392 cornersHi[1] =
std::max(cornersHi[1], x2y2AtRef.x());
393 cornersHi[2] =
std::max(cornersHi[2], x1y2AtRef.y());
395 cornersZ[0] =
std::min(cornersZ[0], x1y1AtRef.z());
396 cornersZ[1] =
std::max(cornersZ[1], x1y1AtRef.z());
398 const LocalPoint lpOfCentre((cornersHi[0] + cornersHi[1]) / 2, (cornersLo[2] + cornersHi[2]) / 2, 0);
399 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
401 (cornersHi[1] - cornersHi[0]) / 2,
402 (cornersHi[2] - cornersLo[2]) / 2,
403 (cornersZ[1] - cornersZ[0]) + 0.5);
404 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
void add(RPCRoll *rl)
Add Roll to the chamber which takes ownership.
~RPCGeometryBuilderFromDDD()
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
virtual float length() const =0
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the filtered-view.
const std::vector< double > & doubles() const
a reference to the double-valued values stored in the given instance of DDValue
common ppss p3p6s2 common epss epspn46 common const1 w2
int baseNumberToUnitNumber(const MuonBaseNumber &) override
bool nextSibling()
set the current node to the next sibling ...
const DDRotationMatrix & rotation() const
The absolute rotation of the current node.
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
const Bounds & bounds() const
Volume worldVolume() const
Handle to the world volume containing everything.
void filter(DDSpecParRefs &, std::string_view, std::string_view) const
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
Compact representation of the geometrical detector hierarchy.
const DDGeoHistory & geoHistory() const
The list of ancestors up to the root-node of the current node.
RPCGeometry * build(const DDCompactView *cview, const MuonDDDConstants &muonConstants)
bool DDfetch(const DDsvalues_type *, DDValue &)
helper for retrieving DDValues from DDsvalues_type *.
void add(RPCRoll *roll)
Add a RPC roll to the Geometry.
nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
TkRotation & rotateAxes(const Basic3DVector< T > &newX, const Basic3DVector< T > &newY, const Basic3DVector< T > &newZ)
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
RPCGeometry * buildGeometry(DDFilteredView &fview, const MuonDDDConstants &muonConstants)
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DD3Vector
A DD Translation is currently implemented with Root Vector3D.
const ExpandedNodes & history()
The numbering history of the current node.
const Double_t * rot() const
The absolute rotation of the current node.
const MuonBaseNumber geoHistoryToBaseNumber(const cms::ExpandedNodes &) const
std::string_view name() const
bool firstChild()
set the current node to the first child
T get(const std::string &) const
extract attribute value
RPCGeometryBuilderFromDDD(bool comp11)
const Double_t * trans() const
The absolute translation of the current node.
std::vector< const DDSpecPar * > DDSpecParRefs
DDSpecParRegistry const & specpars() const
int sector() const
Sector id: the group of chambers at same phi (and increasing r)
const MuonConstants & values() const
ESHandle< TrackerGeometry > geometry
int subsector() const
SubSector id : some sectors are divided along the phi direction in subsectors (from 1 to 4 in Barrel...
bool firstChild()
set the current node to the first child ...
constexpr NumType convertMmToCm(NumType millimeters)
const std::vector< double > parameters() const
extract shape parameters
const DDTranslation & translation() const
The absolute translation of the current node.
std::vector< const DDsvalues_type * > specifics() const
std::map< RPCDetId, std::list< RPCRoll * > > chids
void baseNumberToUnitNumber(const MuonBaseNumber &)
MuonBaseNumber geoHistoryToBaseNumber(const DDGeoHistory &history)
const std::string & name() const
Returns the name.
const cms::DDDetector * detector() const
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.