24 #include "CLHEP/Units/GlobalSystemOfUnits.h" 49 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Building the geometry service";
52 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"About to run through the RPC structure\n" 53 <<
" First logical part " 57 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"doSubDets = " << doSubDets;
59 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"start the loop";
63 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the Muon base Number";
65 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Start the Rpc Numbering Schema";
69 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the Unit Number";
71 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Getting the RPC det Id "<<detid;
76 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"The RPCDetid is "<<rpcid;
78 DDValue numbOfStrips(
"nStrips");
80 std::vector<const DDsvalues_type* > specs(fview.
specifics());
82 for (
auto is=specs.begin();is!=specs.end(); ++is){
83 if (
DDfetch( *is, numbOfStrips)){
88 LogDebug(
"RPCGeometryBuilderFromDDD") << ((nStrips == 0 ) ? (
"No strip found!!") : (
""));
103 rota.GetComponents(x,y,z);
106 float(y.X()),
float(y.Y()),
float(y.Z()),
107 float(z.X()),
float(z.Y()),
float(z.Z()));
113 const float width = dpar[0]/cm;
114 const float length = dpar[1]/cm;
115 const float thickness = dpar[2]/cm;
118 const std::vector<float> pars = {
width, length,
float(numbOfStrips.
doubles()[0]) };
124 if (tran.z() >-1500. ){
133 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Barrel "<<name
135 <<
" "<<length<<
" "<<thickness;
138 const float be = dpar[4]/cm;
139 const float te = dpar[8]/cm;
140 const float ap = dpar[0]/cm;
141 const float ti = 0.4/cm;
144 const std::vector<float> pars = {
float(dpar[4]/cm) ,
float(dpar[8]/cm) ,
147 LogDebug(
"RPCGeometryBuilderFromDDD") <<
"Forward "<<name
148 <<
" par "<<dpar[4]/cm
149 <<
" "<<dpar[8]/cm<<
" "<<dpar[3]/cm<<
" " 162 LogDebug(
"RPCGeometryBuilderFromDDD") <<
" Number of strips "<<nStrips;
169 auto rls =
chids.find(chid);
170 if ( rls ==
chids.end() ) rls =
chids.insert(std::make_pair(chid, std::list<RPCRoll*>())).first;
171 rls->second.push_back(r);
176 for (
auto ich=
chids.begin(); ich !=
chids.end(); ++ich ) {
178 const auto& rls = ich->second;
182 if ( !rls.empty() ) {
184 const auto& refSurf = (*rls.begin())->surface();
185 if ( chid.
region() == 0 ) {
186 float corners[6] = {0,0,0,0,0,0};
187 for (
auto rl : rls ) {
188 const double h2 = rl->surface().bounds().length()/2;
189 const double w2 = rl->surface().bounds().width()/2;
190 const auto x1y1AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(-w2,-h2,0)));
191 const auto x2y2AtRef = refSurf.toLocal(rl->toGlobal(
LocalPoint(+w2,+h2,0)));
192 corners[0] =
std::min(corners[0], x1y1AtRef.x());
193 corners[1] =
std::min(corners[1], x1y1AtRef.y());
194 corners[2] =
std::max(corners[2], x2y2AtRef.x());
195 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);
202 auto bounds =
new RectangularPlaneBounds((corners[2]-corners[0])/2, (corners[3]-corners[1])/2, (corners[5]-corners[4])+0.5);
203 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);
234 auto bounds =
new TrapezoidalPlaneBounds((cornersLo[1]-cornersLo[0])/2, (cornersHi[1]-cornersHi[0])/2, (cornersHi[2]-cornersLo[2])/2, (cornersZ[1]-cornersZ[0])+0.5);
235 bp =
new BoundPlane(gpOfCentre, refSurf.rotation(), bounds);
243 for (
auto rl : rls ) ch->
add(rl);
virtual int baseNumberToUnitNumber(const MuonBaseNumber &)
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
bool nextSibling()
set the current node to the next sibling ...
const DDRotationMatrix & rotation() const
The absolute rotation of the current node.
const Bounds & bounds() const
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
type of data representation of DDCompactView
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.
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.
std::map< RPCDetId, std::list< RPCRoll * > > chids
RPCGeometryBuilderFromDDD(bool comp11)
int sector() const
Sector id: the group of chambers at same phi (and increasing r)
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 ...
const DDTranslation & translation() const
The absolute translation of the current node.
std::vector< const DDsvalues_type * > specifics() const
MuonBaseNumber geoHistoryToBaseNumber(const DDGeoHistory &history)
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
const std::string & name() const
Returns the name.
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.