ATLAS Offline Software
SoVisualizeAction.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "GeoModelKernel/GeoBox.h"
7 #include "GeoModelKernel/GeoCons.h"
8 #include "GeoModelKernel/GeoPcon.h"
9 #include "GeoModelKernel/GeoTrap.h"
10 #include "GeoModelKernel/GeoTrd.h"
11 #include "GeoModelKernel/GeoTube.h"
12 #include "GeoModelKernel/GeoTubs.h"
13 #include "GeoModelKernel/GeoSimplePolygonBrep.h"
14 #include "GeoModelKernel/GeoTessellatedSolid.h"
15 #include "GeoModelKernel/GeoFacet.h"
16 #include "GeoModelKernel/GeoGenericTrap.h"
17 #include "GeoModelKernel/GeoUnidentifiedShape.h"
18 #include "VP1HEPVis/nodes/SoTubs.h"
19 #include "VP1HEPVis/nodes/SoCons.h"
23 #include "VP1HEPVis/SbPolyhedron.h"
24 #include "VP1HEPVis/nodes/SoLAr.h"
28 
29 // System of units
30 #ifdef BUILDVP1LIGHT
31  #include "GeoModelKernel/Units.h"
32  #define SYSTEM_OF_UNITS GeoModelKernelUnits // --> 'GeoModelKernelUnits::cm'
33 #else
34  #include "GaudiKernel/SystemOfUnits.h"
35  #define SYSTEM_OF_UNITS Gaudi::Units // --> 'Gaudi::Units::cm'
36 #endif
37 
38 #include <iostream>
39 
41  : m_shape(0)
42 {
44  setDepthLimit(0);
45 }
46 
48 {
49  // Don't delete. Let ref count take care of the memory.
50 }
51 
52 void SoVisualizeAction::handleShape(const GeoShape *shape)
53 {
54 #ifndef BUILDVP1LIGHT
55  const GeoUnidentifiedShape* custom = dynamic_cast< const GeoUnidentifiedShape* >( shape );
56  if( custom) {
57  std::string customName = custom->name();
58  static const double eta_hi = 3.2;
59  static const double eta_mid = 2.5;
60  static const double eta_low = 1.375;
61 
62  static const double dMechFocaltoWRP = 3691. *SYSTEM_OF_UNITS::mm; //=endg_z1
63  static const double dWRPtoFrontFace = 11. *SYSTEM_OF_UNITS::mm;
64  static const double rOuterCutoff = 2034. *SYSTEM_OF_UNITS::mm; //=endg_rlimit
65  static const double activeLength = 510*SYSTEM_OF_UNITS::mm;
66  static const double straightStartSection = 2*SYSTEM_OF_UNITS::mm;
67  static const double wheelThickness = activeLength+2*straightStartSection;
68 
70  SoLAr *solar = new SoLAr();
71  if (customName.find("Inner")!=std::string::npos) {
72  float zPlane[2],rInner[2],rOuter[2];
73  zPlane[0]=0;
74  zPlane[1]=wheelThickness;
75 
76  double tanThetaInner = 2. * exp(-eta_hi ) / (1. - exp(2.*-eta_hi ));
77  double tanThetaMid = 2. * exp(-eta_mid) / (1. - exp(2.*-eta_mid));
78  double zWheelFrontFace = dMechFocaltoWRP + dWRPtoFrontFace;
79  double zWheelBackFace = zWheelFrontFace + wheelThickness;
80  rInner[0] = zWheelFrontFace * tanThetaInner;
81  rInner[1] = zWheelBackFace * tanThetaInner;
82  // Note that there is a 3mm gap between the outer surface of the
83  // inner wheel and the inner surface of the outer wheel.
84  double HalfGapBetweenWheels = 0.15*SYSTEM_OF_UNITS::cm; // In DB EMECGEOMETRY.DCRACK
85  rOuter[0] = zWheelFrontFace * tanThetaMid - HalfGapBetweenWheels;
86  rOuter[1] = zWheelBackFace * tanThetaMid - HalfGapBetweenWheels;
87  solar->fRmin.setValues(0,2,rInner);
88  solar->fRmax.setValues(0,2,rOuter);
89  solar->fDz.setValues (0,2,zPlane);
90  }
91  else if (customName.find("Outer")!=std::string::npos) {
92  float zPlane[3], rInner[3], rOuter[3];
93  zPlane[0] = 0;
94  zPlane[2] = wheelThickness;
95  double tanThetaMid = 2. * exp(-eta_mid) / (1. - exp(2.*-eta_mid));
96  double tanThetaOuter = 2. * exp(-eta_low) / (1. - exp(2.*-eta_low));
97  double zWheelFrontFace = dMechFocaltoWRP + dWRPtoFrontFace;
98  double zWheelBackFace = zWheelFrontFace + wheelThickness;
99  // Note that there is a 3mm gap between the outer surface of the
100  // inner wheel and the inner surface of the outer wheel.
101  double HalfGapBetweenWheels = 0.15*SYSTEM_OF_UNITS::cm; // In DB! (EMECGEOMETRY.DCRACK);
102  rInner[0] = zWheelFrontFace * tanThetaMid + HalfGapBetweenWheels;
103  rInner[2] = zWheelBackFace * tanThetaMid + HalfGapBetweenWheels;
104  rOuter[0] = zWheelFrontFace * tanThetaOuter;
105  rOuter[2] = zWheelBackFace * tanThetaOuter;
106  // If we simply left it at that, the outer wheel would protrude
107  // beyond the edge of the cryostat. We have to "slice off" the lip
108  // of the outer wheel to create a shape that's roughtly like a
109  // bathtub plug.
110  // Use the endpoints of the outer arrays to define lines in the
111  // (z,r) plane.
112  double slopeMin = (rInner[2] - rInner[0]) / (zPlane[2] - zPlane[0]);
113  double slopeMax = (rOuter[2] - rOuter[0]) / (zPlane[2] - zPlane[0]);
114  double interceptMin = rInner[0] - slopeMin * zPlane[0];
115  double interceptMax = rOuter[0] - slopeMax * zPlane[0];
116  // At what value of z does the outer line hit the cutoff?
117  zPlane[1] = (rOuterCutoff - interceptMax) / slopeMax;
118  // Calculate the radii at this z:
119  rInner[1] = slopeMin * zPlane[1] + interceptMin;
120  rOuter[1] = rOuterCutoff;
121  // Now override the radius to keep the wheel inside the cryostat:
122  rOuter[2] = rOuterCutoff;
123  solar->fRmin.setValues(0,3,rInner);
124  solar->fRmax.setValues(0,3,rOuter);
125  solar->fDz.setValues (0,3,zPlane);
126  }
127 
128  solar->fSPhi= 0;
129  solar->fDPhi= 2*M_PI;
130  m_shape=solar;
131  } else {
132 #endif // not BUILDVP1LIGHT
133  // We don't recognize it. Try to polyhedrize it!
135  shape->exec(&a);
136  const SbPolyhedron *poly =a.getPolyhedron();
137  if (poly) {
138  SoPolyhedron *myPoly = new SoPolyhedron(poly);
139  m_shape=myPoly;
140  }
141 #ifndef BUILDVP1LIGHT
142  }
143 #endif // not BUILDVP1LIGHT
144 }
145 
146 void SoVisualizeAction::handleBox(const GeoBox *box)
147 {
148  //qDebug() << "SoVisualizeAction::handleBox";
149  SoGenericBox * gb = new SoGenericBox;
150  gb->setParametersForBox( box->getXHalfLength(),box->getYHalfLength(),box->getZHalfLength() );
151  m_shape=gb;
152 }
153 
154 void SoVisualizeAction::handleCons(const GeoCons *cons)
155 {
156  //qDebug() << "SoVisualizeAction::handleCons";
158  SoCons *socons= new SoCons;
159  socons->fRmin1 =cons->getRMin1();
160  socons->fRmin2 =cons->getRMin2();
161  socons->fRmax1 =cons->getRMax1();
162  socons->fRmax2 =cons->getRMax2();
163  socons->fDz =cons->getDZ();
164  socons->fSPhi =cons->getSPhi();
165  socons->fDPhi =cons->getDPhi();
166 
167  m_shape=socons;
168 }
169 
170 void SoVisualizeAction::handlePcon(const GeoPcon *pcon)
171 {
172 
173  //qDebug() << "SoVisualizeAction::handlePcon";
174 
175  //Set up temporary data arrays for profile:
176  float *z = new float[pcon->getNPlanes()];
177  float *rmn= new float[pcon->getNPlanes()];
178  float *rmx= new float[pcon->getNPlanes()];
179 
180  for (unsigned s=0;s<pcon->getNPlanes();++s) {
181  z[s]=pcon->getZPlane(s);
182  rmn[s]=pcon->getRMinPlane(s);
183  rmx[s]=pcon->getRMaxPlane(s);
184  }
185 
187  SoPcons *sopcons = new SoPcons();
188  sopcons->fSPhi = pcon->getSPhi();
189  sopcons->fDPhi = pcon->getDPhi();
190  sopcons->fRmin.setValues(0,pcon->getNPlanes(),rmn);
191  sopcons->fRmax.setValues(0,pcon->getNPlanes(),rmx);
192  sopcons->fDz.setValues (0,pcon->getNPlanes(),z);
193 
194  //Delete temporary arrays:
195  delete [] z;
196  delete [] rmn;
197  delete [] rmx;
198 
199  m_shape=sopcons;
200 
201 }
202 
203 void SoVisualizeAction::handleTrap(const GeoTrap *trap)
204 {
205  //qDebug() << "SoVisualizeAction::handleTrap";
206  SoGenericBox * gb = new SoGenericBox;
207  gb->setParametersForTrapezoid(trap->getZHalfLength(), trap->getTheta(), trap->getPhi(),
208  trap->getDydzn(), trap->getDxdyndzn(), trap->getDxdypdzn(),
209  trap->getDydzp(), trap->getDxdyndzp(), trap->getDxdypdzp(),
210  trap->getAngleydzn(), trap->getAngleydzp());
211  m_shape=gb;
212 }
213 
214 void SoVisualizeAction::handleTrd(const GeoTrd *trd)
215 {
216  //qDebug() << "SoVisualizeAction::handleTrd";
217  SoGenericBox * gb = new SoGenericBox;
218  gb->setParametersForTrd( trd->getXHalfLength1(), trd->getXHalfLength2(),
219  trd->getYHalfLength1(), trd->getYHalfLength2(),
220  trd->getZHalfLength() );
221  m_shape=gb;
222 }
223 
225 {
226  //qDebug() << "SoVisualizeAction::handleTube";
227  SoTubs *sotubs= new SoTubs;
228  sotubs->pRMin= tube->getRMin();
229  sotubs->pRMax= tube->getRMax();
230  sotubs->pDz = tube->getZHalfLength();
231  sotubs->pSPhi= 0;
232  sotubs->pDPhi= 2*M_PI;
233  m_shape=sotubs;
234 }
235 
236 void SoVisualizeAction::handleTubs(const GeoTubs *tubs)
237 {
238  //qDebug() << "SoVisualizeAction::handleTubs";
239  SoTubs *sotubs= new SoTubs;
240  sotubs->pRMin= tubs->getRMin();
241  sotubs->pRMax= tubs->getRMax();
242  sotubs->pDz = tubs->getZHalfLength();
243  sotubs->pSPhi= tubs->getSPhi();
244  sotubs->pDPhi= tubs->getDPhi();
245  m_shape=sotubs;
246 }
247 
248 void SoVisualizeAction::handleSimplePolygonBrep(const GeoSimplePolygonBrep *brep)
249 {
250  //qDebug() << "SoVisualizeAction::handleSimplePolygonBrep";
251  //Fixme: Detect if order of vertices is the wrong way around... and reorder if necessary.
252 
253  double dz = brep->getDZ();
254  std::vector<double> x, y;
255  for(unsigned int i=0; i<brep->getNVertices(); ++i)
256  {
257  x.push_back(brep->getXVertex(i));
258  y.push_back(brep->getYVertex(i));
259  }
260 
261  SbPolyhedronPolygonXSect sbPoly(x,y,dz);
262  SoPolyhedron* soPoly = new SoPolyhedron(sbPoly);
263  m_shape = soPoly;
264 }
265 
266 void SoVisualizeAction::handleTessellatedSolid (const GeoTessellatedSolid* geoTessellated)
267 {
268  //qDebug() << "SoVisualizeAction::handleTessellatedSolid";
269 
270  SoTessellated * soTessellated = new SoTessellated;
271  for(size_t i=0; i<geoTessellated->getNumberOfFacets();++i) {
272  GeoFacet* facet = geoTessellated->getFacet(i);
273  if(facet->getNumberOfVertices()==3) {
274  if(facet->getVertexType()==GeoFacet::ABSOLUTE)
275  soTessellated->addTriangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
276  facet->getVertex(1).x(),facet->getVertex(1).y(),facet->getVertex(1).z(),
277  facet->getVertex(2).x(),facet->getVertex(2).y(),facet->getVertex(2).z());
278  else
279  soTessellated->addTriangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
280  facet->getVertex(0).x()+facet->getVertex(1).x(),
281  facet->getVertex(0).y()+facet->getVertex(1).y(),
282  facet->getVertex(0).z()+facet->getVertex(1).z(),
283  facet->getVertex(0).x()+facet->getVertex(2).x(),
284  facet->getVertex(0).y()+facet->getVertex(2).y(),
285  facet->getVertex(0).z()+facet->getVertex(2).z());
286  }
287  else {
288  if(facet->getVertexType()==GeoFacet::ABSOLUTE)
289  soTessellated->addQuadrangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
290  facet->getVertex(1).x(),facet->getVertex(1).y(),facet->getVertex(1).z(),
291  facet->getVertex(2).x(),facet->getVertex(2).y(),facet->getVertex(2).z(),
292  facet->getVertex(3).x(),facet->getVertex(3).y(),facet->getVertex(3).z());
293  else
294  soTessellated->addQuadrangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
295  facet->getVertex(0).x()+facet->getVertex(1).x(),
296  facet->getVertex(0).y()+facet->getVertex(1).y(),
297  facet->getVertex(0).z()+facet->getVertex(1).z(),
298  facet->getVertex(0).x()+facet->getVertex(2).x(),
299  facet->getVertex(0).y()+facet->getVertex(2).y(),
300  facet->getVertex(0).z()+facet->getVertex(2).z(),
301  facet->getVertex(0).x()+facet->getVertex(3).x(),
302  facet->getVertex(0).y()+facet->getVertex(3).y(),
303  facet->getVertex(0).z()+facet->getVertex(3).z());
304 
305  }
306  }
307  soTessellated->finalize();
308  m_shape=soTessellated;
309 }
310 
311 void SoVisualizeAction::handleGenericTrap(const GeoGenericTrap *gentrap)
312 {
313  //qDebug() << "SoVisualizeAction::handleGenericTrap";
314  SoGenericBox * gb = new SoGenericBox;
315  const GeoGenericTrapVertices& trapVertices = gentrap->getVertices();
316  double dZ = gentrap->getZHalfLength();
317  gb->setGenericParameters(trapVertices[0].x(),trapVertices[0].y(),-dZ,
318  trapVertices[1].x(),trapVertices[1].y(),-dZ,
319  trapVertices[2].x(),trapVertices[2].y(),-dZ,
320  trapVertices[3].x(),trapVertices[3].y(),-dZ,
321  trapVertices[4].x(),trapVertices[4].y(),dZ,
322  trapVertices[5].x(),trapVertices[5].y(),dZ,
323  trapVertices[6].x(),trapVertices[6].y(),dZ,
324  trapVertices[7].x(),trapVertices[7].y(),dZ);
325  m_shape=gb;
326 }
SoVisualizeAction::handleTubs
virtual void handleTubs(const GeoTubs *tubs)
Definition: SoVisualizeAction.cxx:236
SoVisualizeAction::m_shape
SoShape * m_shape
Definition: SoVisualizeAction.h:57
SoCons::fDz
SoSFFloat fDz
Half-length along Z.
Definition: SoCons.h:76
SoGenericBox::setParametersForTrapezoid
void setParametersForTrapezoid(float dz, float theta, float phi, float dy1, float dx1, float dx2, float dy2, float dx3, float dx4, float alp1, float alp2)
Definition: SoGenericBox.cxx:293
SoCons::fRmax2
SoSFFloat fRmax2
Outside radius at +fDz.
Definition: SoCons.h:72
SoVisualizeAction::SoVisualizeAction
SoVisualizeAction()
Definition: SoVisualizeAction.cxx:40
SbPolyhedron
Definition: SbPolyhedron.h:231
SoVisualizeAction::handleShape
virtual void handleShape(const GeoShape *subtract)
Definition: SoVisualizeAction.cxx:52
SoLAr
SoLAr - Inventor version of the G4Cons Geant Geometry entity.
Definition: SoLAr.h:36
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
SoVisualizeAction::handleCons
virtual void handleCons(const GeoCons *cons)
Definition: SoVisualizeAction.cxx:154
SoVisualizeAction::handleSimplePolygonBrep
virtual void handleSimplePolygonBrep(const GeoSimplePolygonBrep *)
Definition: SoVisualizeAction.cxx:248
SoPcons
SoPcons - Inventor version of the G4Cons Geant Geometry entity.
Definition: SoPcons.h:39
SoVisualizeAction::~SoVisualizeAction
virtual ~SoVisualizeAction()
Definition: SoVisualizeAction.cxx:47
SoVisualizeAction::handleTube
virtual void handleTube(const GeoTube *tube)
Definition: SoVisualizeAction.cxx:224
SoCons.h
SoTessellated::finalize
void finalize()
Definition: SoTessellated.cxx:81
SoTubs
SoTubs - Inventor version of the G4Tubs Geant Geometry entity.
Definition: SoTubs.h:50
SoCons::fDPhi
SoSFFloat fDPhi
Delta-angle, in radians.
Definition: SoCons.h:84
SoVisualizeAction.h
SoCons::fSPhi
SoSFFloat fSPhi
Starting angle, in radians.
Definition: SoCons.h:80
M_PI
#define M_PI
Definition: ActiveFraction.h:11
SoLAr::fRmax
SoMFFloat fRmax
Outside radii.
Definition: SoLAr.h:50
SoPcons::fSPhi
SoSFFloat fSPhi
Starting angle, in radians.
Definition: SoPcons.h:61
SbPolyhedrizeAction
Definition: SbPolyhedrizeAction.h:18
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
x
#define x
VP1HEPVisUtils.h
SoPcons::fDz
SoMFFloat fDz
Z Positions.
Definition: SoPcons.h:57
VP1HEPVisUtils::initAllCustomClasses
static void initAllCustomClasses()
Definition: VP1HEPVisUtils.cxx:317
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
SoPcons.h
SoTessellated::addQuadrangularFacet
void addQuadrangularFacet(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double x4, double y4, double z4)
Definition: SoTessellated.cxx:71
SoCons::fRmin1
SoSFFloat fRmin1
Inside radius at -fDz.
Definition: SoCons.h:60
SoPolyhedron.h
SoPcons::fRmax
SoMFFloat fRmax
Outside radii.
Definition: SoPcons.h:53
SoTessellated
Definition: SoTessellated.h:24
SoVisualizeAction::handleTrap
virtual void handleTrap(const GeoTrap *trap)
Definition: SoVisualizeAction.cxx:203
SoVisualizeAction::handleTrd
virtual void handleTrd(const GeoTrd *trd)
Definition: SoVisualizeAction.cxx:214
lumiFormat.i
int i
Definition: lumiFormat.py:92
z
#define z
SoTessellated.h
SoPcons::initClass
static void initClass()
Class Initializer, required.
Definition: SoPcons.cxx:72
SoPcons::fRmin
SoMFFloat fRmin
Inside radii.
Definition: SoPcons.h:49
SoGenericBox::setParametersForBox
void setParametersForBox(float dx, float dy, float dz, float xcenter=0.0, float ycenter=0.0, float zcenter=0.0)
Definition: SoGenericBox.cxx:179
SoLAr::fDz
SoMFFloat fDz
Z Positions.
Definition: SoLAr.h:54
SoGenericBox::setGenericParameters
void setGenericParameters(float x0, float y0, float z0, float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3, float x4, float y4, float z4, float x5, float y5, float z5, float x6, float y6, float z6, float x7, float y7, float z7)
Definition: SoGenericBox.cxx:353
SbPolyhedrizeAction.h
SoVisualizeAction::handleTessellatedSolid
virtual void handleTessellatedSolid(const GeoTessellatedSolid *)
Definition: SoVisualizeAction.cxx:266
SoVisualizeAction::handlePcon
virtual void handlePcon(const GeoPcon *pcon)
Definition: SoVisualizeAction.cxx:170
SoTubs::pDPhi
SoSFFloat pDPhi
Delta-angle, in radians.
Definition: SoTubs.h:76
SoLAr::fSPhi
SoSFFloat fSPhi
Starting angle, in radians.
Definition: SoLAr.h:58
SoLAr::fDPhi
SoSFFloat fDPhi
Delta-angle, in radians.
Definition: SoLAr.h:62
SoPcons::fDPhi
SoSFFloat fDPhi
Delta-angle, in radians.
Definition: SoPcons.h:65
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
a
TList * a
Definition: liststreamerinfos.cxx:10
y
#define y
SoGenericBox
Definition: SoGenericBox.h:26
SoTessellated::addTriangularFacet
void addTriangularFacet(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3)
Definition: SoTessellated.cxx:43
SoTubs.h
SoVisualizeAction::handleGenericTrap
virtual void handleGenericTrap(const GeoGenericTrap *)
Definition: SoVisualizeAction.cxx:311
SoCons::initClass
static void initClass()
Class Initializer, required.
Definition: SoCons.cxx:63
SoCons
SoCons - Inventor version of the G4Cons Geant Geometry entity.
Definition: SoCons.h:50
SoLAr.h
SoVisualizeAction::handleBox
virtual void handleBox(const GeoBox *box)
Definition: SoVisualizeAction.cxx:146
SoPolyhedron
SoPolyhedron is an Inventor encapsulation of the HepPolyedron class written by E.Chernyaev.
Definition: SoPolyhedron.h:47
SoTubs::pDz
SoSFFloat pDz
Half-length in Z.
Definition: SoTubs.h:68
SbPolyhedron.h
calibdata.tube
tube
Definition: calibdata.py:31
SoGenericBox.h
SoLAr::fRmin
SoMFFloat fRmin
Inside radii.
Definition: SoLAr.h:46
SoTubs::pRMin
SoSFFloat pRMin
Inside radius of the tube.
Definition: SoTubs.h:60
SoTubs::pRMax
SoSFFloat pRMax
Outside radius of the tube.
Definition: SoTubs.h:64
SoTubs::pSPhi
SoSFFloat pSPhi
Starting angle, in radians.
Definition: SoTubs.h:72
SoLAr::initClass
static void initClass()
Class Initializer, required.
Definition: SoLAr.cxx:66
SoCons::fRmax1
SoSFFloat fRmax1
Outside radius at -fDz.
Definition: SoCons.h:68
SbPolyhedronPolygonXSect
Definition: SbPolyhedron.h:534
SoCons::fRmin2
SoSFFloat fRmin2
Inside radius at +fDz.
Definition: SoCons.h:64
SoGenericBox::setParametersForTrd
void setParametersForTrd(float dx1, float dx2, float dy1, float dy2, float dz)
Definition: SoGenericBox.cxx:276