Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 takes ownership of poly
139  SoPolyhedron *myPoly = new SoPolyhedron(poly);
140  m_shape=myPoly;
141  }
142 #ifndef BUILDVP1LIGHT
143  }
144 #endif // not BUILDVP1LIGHT
145 }
146 
147 void SoVisualizeAction::handleBox(const GeoBox *box)
148 {
149  //qDebug() << "SoVisualizeAction::handleBox";
150  SoGenericBox * gb = new SoGenericBox;
151  gb->setParametersForBox( box->getXHalfLength(),box->getYHalfLength(),box->getZHalfLength() );
152  m_shape=gb;
153 }
154 
155 void SoVisualizeAction::handleCons(const GeoCons *cons)
156 {
157  //qDebug() << "SoVisualizeAction::handleCons";
159  SoCons *socons= new SoCons;
160  socons->fRmin1 =cons->getRMin1();
161  socons->fRmin2 =cons->getRMin2();
162  socons->fRmax1 =cons->getRMax1();
163  socons->fRmax2 =cons->getRMax2();
164  socons->fDz =cons->getDZ();
165  socons->fSPhi =cons->getSPhi();
166  socons->fDPhi =cons->getDPhi();
167 
168  m_shape=socons;
169 }
170 
171 void SoVisualizeAction::handlePcon(const GeoPcon *pcon)
172 {
173 
174  //qDebug() << "SoVisualizeAction::handlePcon";
175 
176  //Set up temporary data arrays for profile:
177  float *z = new float[pcon->getNPlanes()];
178  float *rmn= new float[pcon->getNPlanes()];
179  float *rmx= new float[pcon->getNPlanes()];
180 
181  for (unsigned s=0;s<pcon->getNPlanes();++s) {
182  z[s]=pcon->getZPlane(s);
183  rmn[s]=pcon->getRMinPlane(s);
184  rmx[s]=pcon->getRMaxPlane(s);
185  }
186 
188  SoPcons *sopcons = new SoPcons();
189  sopcons->fSPhi = pcon->getSPhi();
190  sopcons->fDPhi = pcon->getDPhi();
191  sopcons->fRmin.setValues(0,pcon->getNPlanes(),rmn);
192  sopcons->fRmax.setValues(0,pcon->getNPlanes(),rmx);
193  sopcons->fDz.setValues (0,pcon->getNPlanes(),z);
194 
195  //Delete temporary arrays:
196  delete [] z;
197  delete [] rmn;
198  delete [] rmx;
199 
200  m_shape=sopcons;
201 
202 }
203 
204 void SoVisualizeAction::handleTrap(const GeoTrap *trap)
205 {
206  //qDebug() << "SoVisualizeAction::handleTrap";
207  SoGenericBox * gb = new SoGenericBox;
208  gb->setParametersForTrapezoid(trap->getZHalfLength(), trap->getTheta(), trap->getPhi(),
209  trap->getDydzn(), trap->getDxdyndzn(), trap->getDxdypdzn(),
210  trap->getDydzp(), trap->getDxdyndzp(), trap->getDxdypdzp(),
211  trap->getAngleydzn(), trap->getAngleydzp());
212  m_shape=gb;
213 }
214 
215 void SoVisualizeAction::handleTrd(const GeoTrd *trd)
216 {
217  //qDebug() << "SoVisualizeAction::handleTrd";
218  SoGenericBox * gb = new SoGenericBox;
219  gb->setParametersForTrd( trd->getXHalfLength1(), trd->getXHalfLength2(),
220  trd->getYHalfLength1(), trd->getYHalfLength2(),
221  trd->getZHalfLength() );
222  m_shape=gb;
223 }
224 
226 {
227  //qDebug() << "SoVisualizeAction::handleTube";
228  SoTubs *sotubs= new SoTubs;
229  sotubs->pRMin= tube->getRMin();
230  sotubs->pRMax= tube->getRMax();
231  sotubs->pDz = tube->getZHalfLength();
232  sotubs->pSPhi= 0;
233  sotubs->pDPhi= 2*M_PI;
234  m_shape=sotubs;
235 }
236 
237 void SoVisualizeAction::handleTubs(const GeoTubs *tubs)
238 {
239  //qDebug() << "SoVisualizeAction::handleTubs";
240  SoTubs *sotubs= new SoTubs;
241  sotubs->pRMin= tubs->getRMin();
242  sotubs->pRMax= tubs->getRMax();
243  sotubs->pDz = tubs->getZHalfLength();
244  sotubs->pSPhi= tubs->getSPhi();
245  sotubs->pDPhi= tubs->getDPhi();
246  m_shape=sotubs;
247 }
248 
249 void SoVisualizeAction::handleSimplePolygonBrep(const GeoSimplePolygonBrep *brep)
250 {
251  //qDebug() << "SoVisualizeAction::handleSimplePolygonBrep";
252  //Fixme: Detect if order of vertices is the wrong way around... and reorder if necessary.
253 
254  double dz = brep->getDZ();
255  std::vector<double> x, y;
256  for(unsigned int i=0; i<brep->getNVertices(); ++i)
257  {
258  x.push_back(brep->getXVertex(i));
259  y.push_back(brep->getYVertex(i));
260  }
261 
262  SbPolyhedronPolygonXSect sbPoly(x,y,dz);
263  SoPolyhedron* soPoly = new SoPolyhedron(sbPoly);
264  m_shape = soPoly;
265 }
266 
267 void SoVisualizeAction::handleTessellatedSolid (const GeoTessellatedSolid* geoTessellated)
268 {
269  //qDebug() << "SoVisualizeAction::handleTessellatedSolid";
270 
271  SoTessellated * soTessellated = new SoTessellated;
272  for(size_t i=0; i<geoTessellated->getNumberOfFacets();++i) {
273  GeoFacet* facet = geoTessellated->getFacet(i);
274  if(facet->getNumberOfVertices()==3) {
275  if(facet->getVertexType()==GeoFacet::ABSOLUTE)
276  soTessellated->addTriangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
277  facet->getVertex(1).x(),facet->getVertex(1).y(),facet->getVertex(1).z(),
278  facet->getVertex(2).x(),facet->getVertex(2).y(),facet->getVertex(2).z());
279  else
280  soTessellated->addTriangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
281  facet->getVertex(0).x()+facet->getVertex(1).x(),
282  facet->getVertex(0).y()+facet->getVertex(1).y(),
283  facet->getVertex(0).z()+facet->getVertex(1).z(),
284  facet->getVertex(0).x()+facet->getVertex(2).x(),
285  facet->getVertex(0).y()+facet->getVertex(2).y(),
286  facet->getVertex(0).z()+facet->getVertex(2).z());
287  }
288  else {
289  if(facet->getVertexType()==GeoFacet::ABSOLUTE)
290  soTessellated->addQuadrangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
291  facet->getVertex(1).x(),facet->getVertex(1).y(),facet->getVertex(1).z(),
292  facet->getVertex(2).x(),facet->getVertex(2).y(),facet->getVertex(2).z(),
293  facet->getVertex(3).x(),facet->getVertex(3).y(),facet->getVertex(3).z());
294  else
295  soTessellated->addQuadrangularFacet(facet->getVertex(0).x(),facet->getVertex(0).y(),facet->getVertex(0).z(),
296  facet->getVertex(0).x()+facet->getVertex(1).x(),
297  facet->getVertex(0).y()+facet->getVertex(1).y(),
298  facet->getVertex(0).z()+facet->getVertex(1).z(),
299  facet->getVertex(0).x()+facet->getVertex(2).x(),
300  facet->getVertex(0).y()+facet->getVertex(2).y(),
301  facet->getVertex(0).z()+facet->getVertex(2).z(),
302  facet->getVertex(0).x()+facet->getVertex(3).x(),
303  facet->getVertex(0).y()+facet->getVertex(3).y(),
304  facet->getVertex(0).z()+facet->getVertex(3).z());
305 
306  }
307  }
308  soTessellated->finalize();
309  m_shape=soTessellated;
310 }
311 
312 void SoVisualizeAction::handleGenericTrap(const GeoGenericTrap *gentrap)
313 {
314  //qDebug() << "SoVisualizeAction::handleGenericTrap";
315  SoGenericBox * gb = new SoGenericBox;
316  const GeoGenericTrapVertices& trapVertices = gentrap->getVertices();
317  double dZ = gentrap->getZHalfLength();
318  gb->setGenericParameters(trapVertices[0].x(),trapVertices[0].y(),-dZ,
319  trapVertices[1].x(),trapVertices[1].y(),-dZ,
320  trapVertices[2].x(),trapVertices[2].y(),-dZ,
321  trapVertices[3].x(),trapVertices[3].y(),-dZ,
322  trapVertices[4].x(),trapVertices[4].y(),dZ,
323  trapVertices[5].x(),trapVertices[5].y(),dZ,
324  trapVertices[6].x(),trapVertices[6].y(),dZ,
325  trapVertices[7].x(),trapVertices[7].y(),dZ);
326  m_shape=gb;
327 }
SoVisualizeAction::handleTubs
virtual void handleTubs(const GeoTubs *tubs)
Definition: SoVisualizeAction.cxx:237
SoVisualizeAction::m_shape
SoShape * m_shape
Definition: SoVisualizeAction.h:58
SoCons::fDz
SoSFFloat fDz
Half-length along Z.
Definition: SoCons.h:79
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:75
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:39
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
SoVisualizeAction::handleCons
virtual void handleCons(const GeoCons *cons)
Definition: SoVisualizeAction.cxx:155
SoVisualizeAction::handleSimplePolygonBrep
virtual void handleSimplePolygonBrep(const GeoSimplePolygonBrep *)
Definition: SoVisualizeAction.cxx:249
SoPcons
SoPcons - Inventor version of the G4Cons Geant Geometry entity.
Definition: SoPcons.h:42
SoVisualizeAction::~SoVisualizeAction
virtual ~SoVisualizeAction()
Definition: SoVisualizeAction.cxx:47
SoVisualizeAction::handleTube
virtual void handleTube(const GeoTube *tube)
Definition: SoVisualizeAction.cxx:225
SoCons.h
SoTessellated::finalize
void finalize()
Definition: SoTessellated.cxx:81
SoTubs
SoTubs - Inventor version of the G4Tubs Geant Geometry entity.
Definition: SoTubs.h:52
SoCons::fDPhi
SoSFFloat fDPhi
Delta-angle, in radians.
Definition: SoCons.h:87
SoVisualizeAction.h
SoCons::fSPhi
SoSFFloat fSPhi
Starting angle, in radians.
Definition: SoCons.h:83
M_PI
#define M_PI
Definition: ActiveFraction.h:11
SoLAr::fRmax
SoMFFloat fRmax
Outside radii.
Definition: SoLAr.h:53
SoPcons::fSPhi
SoSFFloat fSPhi
Starting angle, in radians.
Definition: SoPcons.h:64
SbPolyhedrizeAction
Definition: SbPolyhedrizeAction.h:19
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
x
#define x
VP1HEPVisUtils.h
SoPcons::fDz
SoMFFloat fDz
Z Positions.
Definition: SoPcons.h:60
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
MuonCalib::Legendre::poly
constexpr double poly(const double x)
Evaluates the n-th Legendre polynomial at x.
Definition: LegendrePoly.h:156
SoCons::fRmin1
SoSFFloat fRmin1
Inside radius at -fDz.
Definition: SoCons.h:63
SoPolyhedron.h
SoPcons::fRmax
SoMFFloat fRmax
Outside radii.
Definition: SoPcons.h:56
SoTessellated
Definition: SoTessellated.h:24
SoVisualizeAction::handleTrap
virtual void handleTrap(const GeoTrap *trap)
Definition: SoVisualizeAction.cxx:204
SoVisualizeAction::handleTrd
virtual void handleTrd(const GeoTrd *trd)
Definition: SoVisualizeAction.cxx:215
lumiFormat.i
int i
Definition: lumiFormat.py:85
z
#define z
SoTessellated.h
SoPcons::initClass
static void initClass()
Class Initializer, required.
Definition: SoPcons.cxx:67
SoPcons::fRmin
SoMFFloat fRmin
Inside radii.
Definition: SoPcons.h:52
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:57
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:267
SoVisualizeAction::handlePcon
virtual void handlePcon(const GeoPcon *pcon)
Definition: SoVisualizeAction.cxx:171
SoTubs::pDPhi
SoSFFloat pDPhi
Delta-angle, in radians.
Definition: SoTubs.h:78
SoLAr::fSPhi
SoSFFloat fSPhi
Starting angle, in radians.
Definition: SoLAr.h:61
SoLAr::fDPhi
SoSFFloat fDPhi
Delta-angle, in radians.
Definition: SoLAr.h:65
SoPcons::fDPhi
SoSFFloat fDPhi
Delta-angle, in radians.
Definition: SoPcons.h:68
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:312
SoCons::initClass
static void initClass()
Class Initializer, required.
Definition: SoCons.cxx:59
SoCons
SoCons - Inventor version of the G4Cons Geant Geometry entity.
Definition: SoCons.h:53
SoLAr.h
SoVisualizeAction::handleBox
virtual void handleBox(const GeoBox *box)
Definition: SoVisualizeAction.cxx:147
SoPolyhedron
SoPolyhedron is an Inventor encapsulation of the HepPolyedron class written by E.Chernyaev.
Definition: SoPolyhedron.h:49
SoTubs::pDz
SoSFFloat pDz
Half-length in Z.
Definition: SoTubs.h:70
SbPolyhedron.h
calibdata.tube
tube
Definition: calibdata.py:31
SoGenericBox.h
SoLAr::fRmin
SoMFFloat fRmin
Inside radii.
Definition: SoLAr.h:49
SoTubs::pRMin
SoSFFloat pRMin
Inside radius of the tube.
Definition: SoTubs.h:62
SoTubs::pRMax
SoSFFloat pRMax
Outside radius of the tube.
Definition: SoTubs.h:66
SoTubs::pSPhi
SoSFFloat pSPhi
Starting angle, in radians.
Definition: SoTubs.h:74
SoLAr::initClass
static void initClass()
Class Initializer, required.
Definition: SoLAr.cxx:62
SoCons::fRmax1
SoSFFloat fRmax1
Outside radius at -fDz.
Definition: SoCons.h:71
SbPolyhedronPolygonXSect
Definition: SbPolyhedron.h:534
SoCons::fRmin2
SoSFFloat fRmin2
Inside radius at +fDz.
Definition: SoCons.h:67
SoGenericBox::setParametersForTrd
void setParametersForTrd(float dx1, float dx2, float dy1, float dy2, float dz)
Definition: SoGenericBox.cxx:276