ATLAS Offline Software
Loading...
Searching...
No Matches
ProjectionSurfacesHelper.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
8#include "VP1Base/VP1Msg.h"
9
10#include <Inventor/nodes/SoMaterial.h>
11#include <Inventor/nodes/SoSeparator.h>
12#include <Inventor/nodes/SoTranslation.h>
13#include <Inventor/nodes/SoPickStyle.h>
14
15//____________________________________________________________________
33
34//____________________________________________________________________
52
53//____________________________________________________________________
71
72//____________________________________________________________________
74public:
108
110 SoSeparator * attachsep;
111 InDetProjFlags::InDetProjPartsFlags parts;
112
113 SoMaterial * material;
114 SoSeparator * sep;
115 SoShape * barrelcylshape;
119 SoShape * barrelCylShape();
120 SoShape * endcapInnerShape();
121 SoShape * endcapOuterShape();
122 SoShape * endcapZAsRCylShape();
123
124 SoSeparator * sep_barrel_central;
125 SoSeparator * sep_barrel_pos;
126 SoSeparator * sep_barrel_neg;
127 SoSeparator * sep_endcap_inner_pos;
128 SoSeparator * sep_endcap_outer_pos;
129 SoSeparator * sep_endcap_inner_neg;
130 SoSeparator * sep_endcap_outer_neg;
132 SoSeparator * sep_endcap_zasr_pos;
133 SoSeparator * sep_endcap_zasr_neg;
134
135 void initPartsSep(float zpos, SoSeparator*&sep, SoShape*);
136
137 void ensureDetached(SoSeparator*);
138 void ensureAttached(SoSeparator*);
139
140 //The parameters:
151 static const int nphi = 64;
152};
153
154//____________________________________________________________________
156 double barrel_inner_radius,
157 double barrel_outer_radius,
158 double barrel_posneg_z,
159 double endcap_surface_z,
160 double endcap_surface_length,
161 double endcap_inner_radius,
162 double endcap_outer_radius,
163 double endcap_zasr_disttobarrelcyl,
164 double endcap_zasr_squeezefact,
165 SoMaterial* mat, SoSeparator * attachsep, QObject * parent,IVP1System*sys)
166 : QObject(parent), VP1HelperClassBase(sys,"ProjectionSurfacesHelper"), m_d(new Imp(this,attachsep))
167{
168 m_d->material = mat;
169 if (m_d->material)
170 m_d->material->ref();
171 m_d->sep = 0;
172 m_d->barrelcylshape = 0;
173 m_d->endcapinnershape = 0;
174 m_d->endcapoutershape = 0;
175 m_d->endcapzasrcylshape = 0;
176 m_d->sep_barrel_central = 0;
177 m_d->sep_barrel_pos = 0;
178 m_d->sep_barrel_neg = 0;
179 m_d->sep_endcap_inner_pos = 0;
180 m_d->sep_endcap_outer_pos = 0;
181 m_d->sep_endcap_inner_neg = 0;
182 m_d->sep_endcap_outer_neg = 0;
183 m_d->sep_endcap_zasr_central = 0;
184 m_d->sep_endcap_zasr_pos = 0;
185 m_d->sep_endcap_zasr_neg = 0;
186
187 m_d->surfacethickness = surfacethickness;
188 m_d->barrel_inner_radius = barrel_inner_radius;
189 m_d->barrel_outer_radius = barrel_outer_radius;
190 m_d->barrel_posneg_z = barrel_posneg_z;
191 m_d->endcap_surface_z = endcap_surface_z;
192 m_d->endcap_surface_length = endcap_surface_length;
193 m_d->endcap_inner_radius = endcap_inner_radius;
194 m_d->endcap_outer_radius = endcap_outer_radius;
195 m_d->endcap_zasr_disttobarrelcyl = endcap_zasr_disttobarrelcyl;
196 m_d->endcap_zasr_squeezefact = endcap_zasr_squeezefact;
197}
198
199//____________________________________________________________________
201{
202 messageVerbose("destructor begin");
203 QList<SoNode*> l;
204
205 l << m_d->attachsep
206 << m_d->material
207 << m_d->sep
208 << m_d->barrelcylshape
209 << m_d->endcapinnershape
210 << m_d->endcapoutershape
211 << m_d->endcapzasrcylshape
212 << m_d->sep_barrel_central
213 << m_d->sep_barrel_pos
214 << m_d->sep_barrel_neg
215 << m_d->sep_endcap_inner_pos
216 << m_d->sep_endcap_outer_pos
217 << m_d->sep_endcap_inner_neg
218 << m_d->sep_endcap_outer_neg
219 << m_d->sep_endcap_zasr_central
220 << m_d->sep_endcap_zasr_pos
221 << m_d->sep_endcap_zasr_neg;
222
223 for(SoNode* n : l)
224 if (n)
225 n->unref();
226
227 delete m_d;
228 messageVerbose("destructor end");
229}
230
231//____________________________________________________________________
232InDetProjFlags::InDetProjPartsFlags ProjectionSurfacesHelper::shownParts() const
233{
234 if (VP1Msg::verbose())
235 messageVerbose("shownParts");
236 return m_d->parts;
237}
238
239//____________________________________________________________________
240void ProjectionSurfacesHelper::setSurfaces( InDetProjFlags::InDetProjPartsFlags newparts )
241{
242 messageVerbose("setSurfaces");
243 if (m_d->parts==newparts)
244 return;
245 messageVerbose("setSurfaces - changed");
246 InDetProjFlags::InDetProjPartsFlags changedparts(m_d->parts ^ newparts);
247 m_d->parts = newparts;
248 bool save = m_d->attachsep->enableNotify(false);
249
251
252 if (changedparts&InDetProjFlags::BarrelPositive) {
253 if (newparts&InDetProjFlags::BarrelPositive) {
254 if (!m_d->sep_barrel_pos)
255 m_d->initPartsSep(m_d->barrel_posneg_z,m_d->sep_barrel_pos,m_d->barrelCylShape());
256 m_d->ensureAttached(m_d->sep_barrel_pos);
257 } else {
258 m_d->ensureDetached(m_d->sep_barrel_pos);
259 }
260 }
261 if (changedparts&InDetProjFlags::BarrelNegative) {
262 if (newparts&InDetProjFlags::BarrelNegative) {
263 if (!m_d->sep_barrel_neg)
264 m_d->initPartsSep(-m_d->barrel_posneg_z,m_d->sep_barrel_neg,m_d->barrelCylShape());
265 m_d->ensureAttached(m_d->sep_barrel_neg);
266 } else {
267 m_d->ensureDetached(m_d->sep_barrel_neg);
268 }
269 }
270 if (changedparts&InDetProjFlags::BarrelCentral) {
271 if (newparts&InDetProjFlags::BarrelCentral) {
272 if (!m_d->sep_barrel_central)
273 m_d->initPartsSep(0.0,m_d->sep_barrel_central,m_d->barrelCylShape());
274 m_d->ensureAttached(m_d->sep_barrel_central);
275 } else {
276 m_d->ensureDetached(m_d->sep_barrel_central);
277 }
278 }
279 if (changedparts&InDetProjFlags::EndCapInnerPositive) {
281 if (!m_d->sep_endcap_inner_pos)
282 m_d->initPartsSep(m_d->endcap_surface_z,m_d->sep_endcap_inner_pos,m_d->endcapInnerShape());
283 m_d->ensureAttached(m_d->sep_endcap_inner_pos);
284 } else {
285 m_d->ensureDetached(m_d->sep_endcap_inner_pos);
286 }
287 }
288 if (changedparts&InDetProjFlags::EndCapOuterPositive) {
290 if (!m_d->sep_endcap_outer_pos)
291 m_d->initPartsSep(m_d->endcap_surface_z,m_d->sep_endcap_outer_pos,m_d->endcapOuterShape());
292 m_d->ensureAttached(m_d->sep_endcap_outer_pos);
293 } else {
294 m_d->ensureDetached(m_d->sep_endcap_outer_pos);
295 }
296 }
297 if (changedparts&InDetProjFlags::EndCapInnerNegative) {
299 if (!m_d->sep_endcap_inner_neg)
300 m_d->initPartsSep(-m_d->endcap_surface_z,m_d->sep_endcap_inner_neg,m_d->endcapInnerShape());
301 m_d->ensureAttached(m_d->sep_endcap_inner_neg);
302 } else {
303 m_d->ensureDetached(m_d->sep_endcap_inner_neg);
304 }
305 }
306 if (changedparts&InDetProjFlags::EndCapOuterNegative) {
308 if (!m_d->sep_endcap_outer_neg)
309 m_d->initPartsSep(-m_d->endcap_surface_z,m_d->sep_endcap_outer_neg,m_d->endcapOuterShape());
310 m_d->ensureAttached(m_d->sep_endcap_outer_neg);
311 } else {
312 m_d->ensureDetached(m_d->sep_endcap_outer_neg);
313 }
314 }
315 if (changedparts&InDetProjFlags::TRT_EndCapZToRCentral) {
317 if (!m_d->sep_endcap_zasr_central)
318 m_d->initPartsSep(0.0,m_d->sep_endcap_zasr_central,m_d->endcapZAsRCylShape());
319 m_d->ensureAttached(m_d->sep_endcap_zasr_central);
320 } else {
321 m_d->ensureDetached(m_d->sep_endcap_zasr_central);
322 }
323 }
326 if (!m_d->sep_endcap_zasr_pos)
327 m_d->initPartsSep(m_d->barrel_posneg_z,m_d->sep_endcap_zasr_pos,m_d->endcapZAsRCylShape());
328 m_d->ensureAttached(m_d->sep_endcap_zasr_pos);
329 } else {
330 m_d->ensureDetached(m_d->sep_endcap_zasr_pos);
331 }
332 }
335 if (!m_d->sep_endcap_zasr_neg)
336 m_d->initPartsSep(-m_d->barrel_posneg_z,m_d->sep_endcap_zasr_neg,m_d->endcapZAsRCylShape());
337 m_d->ensureAttached(m_d->sep_endcap_zasr_neg);
338 } else {
339 m_d->ensureDetached(m_d->sep_endcap_zasr_neg);
340 }
341 }
342
344 m_d->attachsep->enableNotify(save);
345 if (save)
346 m_d->attachsep->touch();
347 messageVerbose("setSurfaces - changed end");
348}
349
350//____________________________________________________________________
351void ProjectionSurfacesHelper::Imp::initPartsSep(float zpos, SoSeparator*&sep, SoShape*shape)
352{
353 theclass->messageVerbose("initPartsSep begin");
354 sep = new SoSeparator();
355 sep->ref();
356 if (zpos!=0.0f) {
357 SoTranslation * t = new SoTranslation;
358 t->translation.setValue(0.0f,0.0f,zpos);
359 sep->addChild(t);
360 }
361 sep->addChild(shape);
362 theclass->messageVerbose("initPartsSep end");
363}
364
365//____________________________________________________________________
367{
368 if (VP1Msg::verbose())
369 messageVerbose("material");
370 return m_d->material;
371}
372
373//____________________________________________________________________
375{
376 theclass->messageVerbose("barrelCylShape");
377 if (!barrelcylshape) {
379 SoTubs * disc = new SoTubs;
382 disc->pDz = 0.5*surfacethickness;
383 disc->pSPhi = 0.0;
384 disc->pDPhi = 2*M_PI;
385 disc->pOverrideNPhi = nphi;//Ignore complexity and just use a good amount of subdivisions =n*32 (its just a single surface anyway)
386 barrelcylshape = disc;
387 barrelcylshape->ref();
388 }
389 return barrelcylshape;
390}
391
392//____________________________________________________________________
394{
395 theclass->messageVerbose("endcapInnerShape");
396 if (!endcapinnershape) {
398 SoTubs * cyl = new SoTubs;
401 cyl->pDz = 0.5*endcap_surface_length;
402 cyl->pSPhi = 0.0;
403 cyl->pDPhi = 2*M_PI;
404 cyl->pOverrideNPhi = nphi;//Ignore complexity and just use a good amount of subdivisions =n*32 (its just a single surface anyway)
405 endcapinnershape = cyl;
406 endcapinnershape->ref();
407 }
408 return endcapinnershape;
409}
410
411//____________________________________________________________________
413{
414 theclass->messageVerbose("endcapOuterShape");
415 if (!endcapoutershape) {
417 SoTubs * cyl = new SoTubs;
420 cyl->pDz = 0.5*endcap_surface_length;
421 cyl->pSPhi = 0.0;
422 cyl->pDPhi = 2*M_PI;
423 cyl->pOverrideNPhi = nphi;//Ignore complexity and just use a good amount of subdivisions =n*32 (its just a single surface anyway)
424 endcapoutershape = cyl;
425 endcapoutershape->ref();
426 }
427 return endcapoutershape;
428}
429
430//____________________________________________________________________
432{
433 theclass->messageVerbose("endcapZAsRCylShape");
434 if (!endcapzasrcylshape) {
436 SoTubs * disc = new SoTubs;
438 disc->pRMin = rmin;
440 disc->pDz = 0.5*surfacethickness;
441 disc->pSPhi = 0.0;
442 disc->pDPhi = 2*M_PI;
443 disc->pOverrideNPhi = nphi;//Ignore complexity and just use a good amount of subdivisions =n*32 (its just a single surface anyway)
444 endcapzasrcylshape = disc;
445 endcapzasrcylshape->ref();
446 }
447 return endcapzasrcylshape;
448}
449
450//____________________________________________________________________
452{
453 if (VP1Msg::verbose())
454 theclass->messageVerbose("ensureDetached");
455 if (!sep||!s)
456 return;
457 if (sep->findChild(s)>-1)
458 sep->removeChild(s);
459}
460
461//____________________________________________________________________
463{
464 if (VP1Msg::verbose())
465 theclass->messageVerbose("ensureAttached");
466 if (!s)
467 return;
468 if (!sep) {
469 sep = new SoSeparator;
470 sep->ref();
471 SoPickStyle *pickStyle = new SoPickStyle;
472 pickStyle->style=SoPickStyle::UNPICKABLE;
473 sep->addChild(pickStyle);
474 if (material)
475 sep->addChild(material);
476 attachsep->addChild(sep);
477 }
478 sep->addChild(s);
479 if (VP1Msg::verbose())
480 theclass->messageVerbose("ensureAttached done");
481}
#define M_PI
static Double_t tc
static double sct_barrel_inner_radius()
static double trt_endcap_surface_z()
static double sct_endcap_zasr_squeezefact()
static double trt_barrel_posneg_z()
static double sct_endcap_surface_z()
static double pixel_endcap_outer_radius()
static double trt_endcap_inner_radius()
static double trt_endcap_surface_length()
static double sct_endcap_surface_length()
static double sct_endcap_outer_radius()
static double trt_endcap_zasr_squeezefact()
static double pixel_barrel_outer_radius()
static double sct_endcap_zasr_disttobarrelcyl()
static double pixel_endcap_zasr_disttobarrelcyl()
static double sct_barrel_posneg_z()
static double surfacethickness()
static double pixel_barrel_posneg_z()
static double pixel_endcap_inner_radius()
static double trt_barrel_outer_radius()
static double trt_endcap_zasr_disttobarrelcyl()
static double trt_endcap_outer_radius()
static double pixel_endcap_zasr_squeezefact()
static double pixel_barrel_inner_radius()
static double pixel_endcap_surface_length()
static double pixel_endcap_surface_z()
static double sct_endcap_inner_radius()
static double sct_barrel_outer_radius()
static double trt_barrel_inner_radius()
InDetProjFlags::InDetProjPartsFlags parts
void initPartsSep(float zpos, SoSeparator *&sep, SoShape *)
Imp(ProjectionSurfacesHelper *tc, SoSeparator *as)
static ProjectionSurfacesHelper * createSCTHelper(SoMaterial *, SoSeparator *attachsep, QObject *parent=0, IVP1System *sys=0)
static ProjectionSurfacesHelper * createTRTHelper(SoMaterial *, SoSeparator *attachsep, QObject *parent=0, IVP1System *sys=0)
void setSurfaces(InDetProjFlags::InDetProjPartsFlags)
static ProjectionSurfacesHelper * createPixelHelper(SoMaterial *, SoSeparator *attachsep, QObject *parent=0, IVP1System *sys=0)
ProjectionSurfacesHelper(double surfacethickness, double barrel_inner_radius, double barrel_outer_radius, double barrel_posneg_z, double endcap_surface_z, double endcap_surface_length, double endcap_inner_radius, double endcap_outer_radius, double endcap_zasr_disttobarrelcyl, double endcap_zasr_squeezefact, SoMaterial *, SoSeparator *attachsep, QObject *parent, IVP1System *sys)
InDetProjFlags::InDetProjPartsFlags shownParts() const
SoTubs - Inventor version of the G4Tubs Geant Geometry entity.
Definition SoTubs.h:52
SoSFInt32 pOverrideNPhi
Override number of phi subdivision used for rendering shape (i.e.
Definition SoTubs.h:83
SoSFFloat pDz
Half-length in Z.
Definition SoTubs.h:70
SoSFFloat pDPhi
Delta-angle, in radians.
Definition SoTubs.h:78
SoSFFloat pSPhi
Starting angle, in radians.
Definition SoTubs.h:74
static void initClass()
Class Initializer, required.
Definition SoTubs.cxx:63
SoSFFloat pRMin
Inside radius of the tube.
Definition SoTubs.h:62
SoSFFloat pRMax
Outside radius of the tube.
Definition SoTubs.h:66
VP1HelperClassBase(IVP1System *sys=0, QString helpername="")
void messageVerbose(const QString &) const
static bool verbose()
Definition VP1Msg.h:31