62 fview.mergedSpecifics(refs);
68 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Building the geometry service";
70 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"About to run through the RPC structure\n"
73 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"doSubDets = " << doSubDets;
75 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"start the loop";
77 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the Muon base Number";
79 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Start the Rpc Numbering Schema";
81 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the Unit Number";
83 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the RPC det Id " << detid;
86 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"The RPCDetid is " << rpcid;
88 DDValue numbOfStrips(
"nStrips");
92 for (
auto& spec :
specs) {
93 if (
DDfetch(spec, numbOfStrips)) {
98 LogDebug(
"RPCGeometryBuilderFromDDD") << ((
nStrips == 0) ? (
"No strip found!!") : (
""));
109 rota.GetComponents(
x,
y,
z);
123 if (dpar.size() == 3) {
128 const std::vector<float> pars = {
width, length,
float(numbOfStrips.
doubles()[0])};
131 if (tran.z() > -1500.) {
135 rot.rotateAxes(newX, newY, newZ);
140 LogDebug(
"RPCGeometryBuilderFromDDD")
147 const float ti = 0.4;
155 LogDebug(
"RPCGeometryBuilderFromDDD")
156 <<
"Forward " <<
name <<
" par " << dpar[4] <<
" " << dpar[8] <<
" " << dpar[3] <<
" " << dpar[0];
164 rot.rotateAxes(newX, newY, newZ);
166 LogDebug(
"RPCGeometryBuilderFromDDD") <<
" Number of strips " <<
nStrips;
173 auto rls =
chids.find(chid);
174 if (rls ==
chids.end())
175 rls =
chids.insert(std::make_pair(chid, std::list<RPCRoll*>())).first;
176 rls->second.emplace_back(
r);
180 for (
auto& ich :
chids) {
182 const auto& rls = ich.second;
186 const auto& refSurf = (*rls.begin())->surface();
188 float corners[6] = {0, 0, 0, 0, 0, 0};
189 for (
auto rl : rls) {
190 const double h2 = rl->surface().bounds().length() / 2;
191 const double w2 = rl->surface().bounds().width() / 2;
192 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-
w2, -h2, 0)));
193 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+
w2, +h2, 0)));
194 corners[0] =
std::min(corners[0], x1y1AtRef.x());
195 corners[1] =
std::min(corners[1], x1y1AtRef.y());
196 corners[2] =
std::max(corners[2], x2y2AtRef.x());
197 corners[3] =
std::max(corners[3], x2y2AtRef.y());
198 corners[4] =
std::min(corners[4], x1y1AtRef.z());
199 corners[5] =
std::max(corners[5], x1y1AtRef.z());
201 const LocalPoint lpOfCentre((corners[0] + corners[2]) / 2, (corners[1] + corners[3]) / 2, 0);
202 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
204 (corners[2] - corners[0]) / 2, (corners[3] - corners[1]) / 2, (corners[5] - corners[4]) + 0.5);
205 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
207 float cornersLo[3] = {0, 0, 0}, cornersHi[3] = {0, 0, 0};
208 float cornersZ[2] = {0, 0};
209 for (
auto rl : rls) {
211 const double w2 = rl->surface().bounds().width() / 2;
212 const auto& topo = dynamic_cast<const TrapezoidalStripTopology&>(rl->specificTopology());
213 const double r = topo.radius();
214 const double wAtLo =
w2 /
r * (
r - h2);
215 const double wAtHi =
w2 /
r * (
r + h2);
217 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtLo, -h2, 0)));
218 const auto x2y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtLo, -h2, 0)));
219 const auto x1y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtHi, +h2, 0)));
220 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtHi, +h2, 0)));
222 cornersLo[0] =
std::min(cornersLo[0], x1y1AtRef.x());
223 cornersLo[1] =
std::max(cornersLo[1], x2y1AtRef.x());
224 cornersLo[2] =
std::min(cornersLo[2], x1y1AtRef.y());
226 cornersHi[0] =
std::min(cornersHi[0], x1y2AtRef.x());
227 cornersHi[1] =
std::max(cornersHi[1], x2y2AtRef.x());
228 cornersHi[2] =
std::max(cornersHi[2], x1y2AtRef.y());
230 cornersZ[0] =
std::min(cornersZ[0], x1y1AtRef.z());
231 cornersZ[1] =
std::max(cornersZ[1], x1y1AtRef.z());
233 const LocalPoint lpOfCentre((cornersHi[0] + cornersHi[1]) / 2, (cornersLo[2] + cornersHi[2]) / 2, 0);
234 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
236 (cornersHi[1] - cornersHi[0]) / 2,
237 (cornersHi[2] - cornersLo[2]) / 2,
238 (cornersZ[1] - cornersZ[0]) + 0.5);
239 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
264 int detid = rpcnum.getDetId();
271 std::vector<double> dpar = fview.
parameters();
273 std::string_view
name = fview.
name();
275 const Double_t* tran = fview.
trans();
282 rota.GetComponents(
x,
y,
z);
296 if (fview.
isABox() == 1) {
297 const float width = dpar[0];
298 const float length = dpar[1];
306 if (tran[2] > -1500.) {
310 rot.rotateAxes(newX, newY, newZ);
317 const float be = dpar[0];
318 const float te = dpar[1];
319 const float ap = dpar[3];
320 const float ti = 0.4;
331 rot.rotateAxes(newX, newY, newZ);
339 auto rls =
chids.find(chid);
340 if (rls ==
chids.end())
341 rls =
chids.insert(std::make_pair(chid, std::list<RPCRoll*>())).first;
342 rls->second.emplace_back(
r);
345 for (
auto& ich :
chids) {
347 const auto& rls = ich.second;
351 const auto& refSurf = (*rls.begin())->surface();
353 float corners[6] = {0, 0, 0, 0, 0, 0};
354 for (
auto rl : rls) {
355 const double h2 = rl->surface().bounds().length() / 2;
356 const double w2 = rl->surface().bounds().width() / 2;
357 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-
w2, -h2, 0)));
358 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+
w2, +h2, 0)));
359 corners[0] =
std::min(corners[0], x1y1AtRef.x());
360 corners[1] =
std::min(corners[1], x1y1AtRef.y());
361 corners[2] =
std::max(corners[2], x2y2AtRef.x());
362 corners[3] =
std::max(corners[3], x2y2AtRef.y());
364 corners[4] =
std::min(corners[4], x1y1AtRef.z());
365 corners[5] =
std::max(corners[5], x1y1AtRef.z());
367 const LocalPoint lpOfCentre((corners[0] + corners[2]) / 2, (corners[1] + corners[3]) / 2, 0);
368 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
370 (corners[2] - corners[0]) / 2, (corners[3] - corners[1]) / 2, (corners[5] - corners[4]) + 0.5);
371 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
374 float cornersLo[3] = {0, 0, 0}, cornersHi[3] = {0, 0, 0};
375 float cornersZ[2] = {0, 0};
376 for (
auto rl : rls) {
378 const double w2 = rl->surface().bounds().width() / 2;
379 const auto& topo = dynamic_cast<const TrapezoidalStripTopology&>(rl->specificTopology());
380 const double r = topo.radius();
381 const double wAtLo =
w2 /
r * (
r - h2);
382 const double wAtHi =
w2 /
r * (
r + h2);
383 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtLo, -h2, 0)));
384 const auto x2y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtLo, -h2, 0)));
385 const auto x1y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-wAtHi, +h2, 0)));
386 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+wAtHi, +h2, 0)));
388 cornersLo[0] =
std::min(cornersLo[0], x1y1AtRef.x());
389 cornersLo[1] =
std::max(cornersLo[1], x2y1AtRef.x());
390 cornersLo[2] =
std::min(cornersLo[2], x1y1AtRef.y());
392 cornersHi[0] =
std::min(cornersHi[0], x1y2AtRef.x());
393 cornersHi[1] =
std::max(cornersHi[1], x2y2AtRef.x());
394 cornersHi[2] =
std::max(cornersHi[2], x1y2AtRef.y());
396 cornersZ[0] =
std::min(cornersZ[0], x1y1AtRef.z());
397 cornersZ[1] =
std::max(cornersZ[1], x1y1AtRef.z());
399 const LocalPoint lpOfCentre((cornersHi[0] + cornersHi[1]) / 2, (cornersLo[2] + cornersHi[2]) / 2, 0);
400 const auto gpOfCentre = refSurf.toGlobal(lpOfCentre);
402 (cornersHi[1] - cornersHi[0]) / 2,
403 (cornersHi[2] - cornersLo[2]) / 2,
404 (cornersZ[1] - cornersZ[0]) + 0.5);
405 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);