Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ModelingParameters.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28//
29// John Allison 31st December 1997.
30// Parameters associated with the modeling of GEANT4 objects.
31
33
34#include "G4ios.hh"
35#include "G4VisAttributes.hh"
37#include "G4SystemOfUnits.hh"
38#include "G4VSolid.hh"
39#include "G4DisplacedSolid.hh"
40#include "G4VPhysicalVolume.hh"
42#include "G4UnitsTable.hh"
43
44#define G4warn G4cout
45
47 fWarning (true),
48 fpDefaultVisAttributes (0),
49 fDrawingStyle (wf),
50 fNumberOfCloudPoints (10000),
51 fCulling (false),
52 fCullInvisible (false),
53 fDensityCulling (false),
54 fVisibleDensity (0.01 * g / cm3),
55 fCullCovered (false),
56 fCBDAlgorithmNumber (0),
57 fExplodeFactor (1.),
58 fNoOfSides (24),
59 fpSectionSolid (0),
60 fCutawayMode (cutawayUnion),
61 fpCutawaySolid (0),
62 fpEvent (0),
63 fSpecialMeshRendering (false)
64{}
65
67(const G4VisAttributes* pDefaultVisAttributes,
69 G4bool isCulling,
70 G4bool isCullingInvisible,
71 G4bool isDensityCulling,
72 G4double visibleDensity,
73 G4bool isCullingCovered,
74 G4int noOfSides
75 ):
76 fWarning (true),
77 fpDefaultVisAttributes (pDefaultVisAttributes),
78 fDrawingStyle (drawingStyle),
79 fNumberOfCloudPoints (10000),
80 fCulling (isCulling),
81 fCullInvisible (isCullingInvisible),
82 fDensityCulling (isDensityCulling),
83 fVisibleDensity (visibleDensity),
84 fCullCovered (isCullingCovered),
85 fCBDAlgorithmNumber (0),
86 fExplodeFactor (1.),
87 fNoOfSides (noOfSides),
88 fpSectionSolid (0),
89 fCutawayMode (cutawayUnion),
90 fpCutawaySolid (0),
91 fpEvent (0),
92 fSpecialMeshRendering (false)
93{}
94
96{
97 delete fpSectionSolid;
98 delete fpCutawaySolid;
99}
100
101//G4ModelingParameters::VisAttributesModifier::VisAttributesModifier
102//(const G4VisAttributes& visAtts,
103// G4ModelingParameters::VisAttributesSignifier signifier,
104// const std::vector<G4PhysicalVolumeModel::G4PhysicalVolumeNodeID>& path):
105//fVisAtts(visAtts), fSignifier(signifier)
106//{
107// typedef G4PhysicalVolumeModel::G4PhysicalVolumeNodeID PVNodeID;
108// typedef std::vector<PVNodeID> PVPath;
109// typedef PVPath::const_iterator PVPathConstIterator;
110// PVPathConstIterator i;
111// for (i = path.begin();
112// i != path.end();
113// ++i) {
114// fPVNameCopyNoPath.push_back
115// (PVNameCopyNo
116// (i->GetPhysicalVolume()->GetName(),
117// i->GetCopyNo()));
118// }
119//}
120
122 const G4double reasonableMaximum = 10.0 * g / cm3;
123 if (visibleDensity < 0 && fWarning) {
124 G4warn << "G4ModelingParameters::SetVisibleDensity: attempt to set negative "
125 "density - ignored." << G4endl;
126 }
127 else {
128 if (fVisibleDensity > reasonableMaximum && fWarning) {
129 G4warn << "G4ModelingParameters::SetVisibleDensity: density > "
130 << reasonableMaximum
131 << " g / cm3 - did you mean this?"
132 << G4endl;
133 }
134 fVisibleDensity = visibleDensity;
135 }
136}
137
139 const G4int nSidesMin = fpDefaultVisAttributes->GetMinLineSegmentsPerCircle();
140 if (nSides < nSidesMin) {
141 nSides = nSidesMin;
142 if (fWarning)
143 G4warn << "G4ModelingParameters::SetNoOfSides: attempt to set the"
144 "\nnumber of sides per circle < " << nSidesMin
145 << "; forced to" << nSides << G4endl;
146 }
147 fNoOfSides = nSides;
148 return fNoOfSides;
149}
150
152(G4DisplacedSolid* pSectionSolid) {
153 delete fpSectionSolid;
154 fpSectionSolid = pSectionSolid;
155}
156
158(G4DisplacedSolid* pCutawaySolid) {
159 delete fpCutawaySolid;
160 fpCutawaySolid = pCutawaySolid;
161}
162
163std::ostream& operator << (std::ostream& os, const G4ModelingParameters& mp)
164{
165 os << "Modeling parameters (warning ";
166 if (mp.fWarning) os << "true";
167 else os << "false";
168 os << "):";
169
170 const G4VisAttributes* va = mp.fpDefaultVisAttributes;
171 os << "\n Default vis. attributes: ";
172 if (va) os << *va;
173 else os << "none";
174
175 os << "\n Current requested drawing style: ";
176 switch (mp.fDrawingStyle) {
178 os << "wireframe"; break;
180 os << "hidden line removal (hlr)"; break;
182 os << "surface (hsr)"; break;
184 os << "surface and edges (hlhsr)"; break;
186 os << "cloud"; break;
187 default: os << "unrecognised"; break;
188 }
189
190 os << "\n Number of cloud points: " << mp.fNumberOfCloudPoints;
191
192 os << "\n Culling: ";
193 if (mp.fCulling) os << "on";
194 else os << "off";
195
196 os << "\n Culling invisible objects: ";
197 if (mp.fCullInvisible) os << "on";
198 else os << "off";
199
200 os << "\n Density culling: ";
201 if (mp.fDensityCulling) {
202 os << "on - invisible if density less than "
203 << mp.fVisibleDensity / (1. * g / cm3) << " g cm^-3";
204 }
205 else os << "off";
206
207 os << "\n Culling daughters covered by opaque mothers: ";
208 if (mp.fCullCovered) os << "on";
209 else os << "off";
210
211 os << "\n Colour by density: ";
212 if (mp.fCBDAlgorithmNumber <= 0) {
213 os << "inactive";
214 } else {
215 os << "Algorithm " << mp.fCBDAlgorithmNumber << ", Parameters:";
216 for (auto p: mp.fCBDParameters) {
217 os << ' ' << G4BestUnit(p,"Volumic Mass");
218 }
219 }
220
221 os << "\n Explode factor: " << mp.fExplodeFactor
222 << " about centre: " << mp.fExplodeCentre;
223
224 os << "\n No. of sides used in circle polygon approximation: "
225 << mp.fNoOfSides;
226
227 os << "\n Section (DCUT) shape (G4DisplacedSolid) pointer: ";
228 if (!mp.fpSectionSolid) os << "non-";
229 os << "null";
230
231 os << "\n Cutaway mode: ";
232 if (mp.GetCutawayMode() == G4ModelingParameters::cutawayUnion) os << "union";
233 else if (mp.GetCutawayMode() == G4ModelingParameters::cutawayIntersection) os << "intersection";
234
235 os << "\n Cutaway (DCUT) shape (G4DisplacedSolid) pointer: ";
236 if (!mp.fpCutawaySolid) os << "non-";
237 os << "null";
238
239 os << "\n Event pointer: " << mp.fpEvent;
240
241 os << "\n Vis attributes modifiers: ";
242 const std::vector<G4ModelingParameters::VisAttributesModifier>& vams =
243 mp.fVisAttributesModifiers;
244 if (vams.empty()) {
245 os << "None";
246 } else {
247 os << vams;
248 }
249
250 os << "\n Special Mesh Rendering: ";
251 if (mp.fSpecialMeshRendering) {
252 os << "on: ";
253 if (mp.fSpecialMeshVolumes.empty()) {
254 os << "all meshes";
255 } else {
256 os << "selected meshes";
257 for (const auto& vol: mp.fSpecialMeshVolumes) {
258 os << "\n " << vol.GetName() << ':' << vol.GetCopyNo();
259 }
260 }
261 } else os << "off";
262
263 return os;
264}
265
266G4bool G4ModelingParameters::operator !=
267(const G4ModelingParameters& mp) const {
268
269 if (
270 (fWarning != mp.fWarning) ||
271 (*fpDefaultVisAttributes != *mp.fpDefaultVisAttributes) ||
272 (fDrawingStyle != mp.fDrawingStyle) ||
273 (fNumberOfCloudPoints != mp.fNumberOfCloudPoints) ||
274 (fCulling != mp.fCulling) ||
275 (fCullInvisible != mp.fCullInvisible) ||
276 (fDensityCulling != mp.fDensityCulling) ||
277 (fCullCovered != mp.fCullCovered) ||
278 (fCBDAlgorithmNumber != mp.fCBDAlgorithmNumber) ||
279 (fExplodeFactor != mp.fExplodeFactor) ||
280 (fExplodeCentre != mp.fExplodeCentre) ||
281 (fNoOfSides != mp.fNoOfSides) ||
282 (fpSectionSolid != mp.fpSectionSolid) ||
283 (fCutawayMode != mp.fCutawayMode) ||
284 (fpCutawaySolid != mp.fpCutawaySolid) ||
285 (fpEvent != mp.fpEvent) ||
286 (fSpecialMeshRendering != mp.fSpecialMeshRendering)
287 )
288 return true;
289
290 if (fDensityCulling &&
291 (fVisibleDensity != mp.fVisibleDensity)) return true;
292
293 if (fCBDAlgorithmNumber > 0) {
294 if (fCBDParameters.size() != mp.fCBDParameters.size()) return true;
295 else if (fCBDParameters != mp.fCBDParameters) return true;
296 }
297
298 if (fVisAttributesModifiers != mp.fVisAttributesModifiers)
299 return true;
300
301 if (fSpecialMeshRendering) {
302 if (fSpecialMeshVolumes != mp.fSpecialMeshVolumes)
303 return true;;
304 }
305
306 return false;
307}
308
309G4bool G4ModelingParameters::VisAttributesModifier::operator!=
311{
312 if (fSignifier != rhs.fSignifier) return true;
313 if (fPVNameCopyNoPath != rhs.fPVNameCopyNoPath) return true;
314 switch (fSignifier) {
316 if (fVisAtts.IsVisible() != rhs.fVisAtts.IsVisible())
317 return true;
318 break;
320 if (fVisAtts.IsDaughtersInvisible() !=
321 rhs.fVisAtts.IsDaughtersInvisible())
322 return true;
323 break;
325 if (fVisAtts.GetColour() != rhs.fVisAtts.GetColour())
326 return true;
327 break;
329 if (fVisAtts.GetLineStyle() != rhs.fVisAtts.GetLineStyle())
330 return true;
331 break;
333 if (fVisAtts.GetLineWidth() != rhs.fVisAtts.GetLineWidth())
334 return true;
335 break;
339 if (fVisAtts.GetForcedDrawingStyle() !=
340 rhs.fVisAtts.GetForcedDrawingStyle())
341 return true;
342 break;
344 if (fVisAtts.GetForcedNumberOfCloudPoints() !=
345 rhs.fVisAtts.GetForcedNumberOfCloudPoints())
346 return true;
347 break;
349 if (fVisAtts.IsForceAuxEdgeVisible() !=
350 rhs.fVisAtts.IsForceAuxEdgeVisible() ||
351 fVisAtts.IsForcedAuxEdgeVisible() !=
352 rhs.fVisAtts.IsForcedAuxEdgeVisible())
353 return true;
354 break;
356 if (fVisAtts.GetForcedLineSegmentsPerCircle() !=
357 rhs.fVisAtts.GetForcedLineSegmentsPerCircle())
358 return true;
359 break;
360 }
361 return false;
362}
363
364G4bool G4ModelingParameters::PVNameCopyNo::operator!=
365(const G4ModelingParameters::PVNameCopyNo& rhs) const
366{
367 if (fName != rhs.fName) return true;
368 if (fCopyNo != rhs.fCopyNo) return true;
369 return false;
370}
371
372std::ostream& operator <<
373(std::ostream& os, const G4ModelingParameters::PVNameCopyNoPath& path)
374{
375 os << "Touchable path: ";
376 if (path.empty()) {
377 os << "empty";
378 } else {
379 os << "physical-volume-name:copy-number pairs:\n ";
381 for (i = path.begin(); i != path.end(); ++i) {
382 if (i != path.begin()) {
383 os << ',';
384 }
385 os << i->GetName() << ':' << i->GetCopyNo();
386 }
387 }
388 return os;
389}
390
392{
393 return fpPV->GetName();
394}
395
396G4bool G4ModelingParameters::PVPointerCopyNo::operator!=
398{
399 if (fpPV != rhs.fpPV) return true;
400 if (fCopyNo != rhs.fCopyNo) return true;
401 return false;
402}
403
404std::ostream& operator <<
405(std::ostream& os, const G4ModelingParameters::PVPointerCopyNoPath& path)
406{
407 os << "Touchable path: physical-volume-pointer:copy-number pairs:\n ";
409 for (i = path.begin(); i != path.end(); ++i) {
410 if (i != path.begin()) {
411 os << ',';
412 }
413 os << '(' << (void*)(i->GetPVPointer()) << ')' << i->GetName() << ':' << i->GetCopyNo();
414 }
415 return os;
416}
417
418std::ostream& operator <<
419(std::ostream& os,
420 const std::vector<G4ModelingParameters::VisAttributesModifier>& vams)
421{
422 std::vector<G4ModelingParameters::VisAttributesModifier>::const_iterator
423 iModifier;
424 for (iModifier = vams.begin();
425 iModifier != vams.end();
426 ++iModifier) {
428 iModifier->GetPVNameCopyNoPath();
429 os << '\n' << vamPath;
430 const G4VisAttributes& vamVisAtts = iModifier->GetVisAttributes();
431 const G4Colour& c = vamVisAtts.GetColour();
432 switch (iModifier->GetVisAttributesSignifier()) {
434 os << " visibility ";
435 if (vamVisAtts.IsVisible()) {
436 os << "true";
437 } else {
438 os << "false";
439 }
440 break;
442 os << " daughtersInvisible ";
443 if (vamVisAtts.IsDaughtersInvisible()) {
444 os << "true";
445 } else {
446 os << "false";
447 }
448 break;
450 os << " colour " << c;
451 break;
453 os << " lineStyle ";
454 switch (vamVisAtts.GetLineStyle()) {
456 os << "unbroken";
457 break;
459 os << "dashed";
460 break;
462 os << "dotted";
463 }
464 break;
466 os << " lineWidth "
467 << vamVisAtts.GetLineWidth();
468 break;
471 os << " forceWireframe ";
472 if (vamVisAtts.IsForceDrawingStyle()) {
473 os << "true";
474 } else {
475 os << "false";
476 }
477 }
478 break;
480 if (vamVisAtts.GetForcedDrawingStyle() == G4VisAttributes::solid) {
481 os << " forceSolid ";
482 if (vamVisAtts.IsForceDrawingStyle()) {
483 os << "true";
484 } else {
485 os << "false";
486 }
487 }
488 break;
490 if (vamVisAtts.GetForcedDrawingStyle() == G4VisAttributes::cloud) {
491 os << " forceCloud ";
492 if (vamVisAtts.IsForceDrawingStyle()) {
493 os << "true";
494 } else {
495 os << "false";
496 }
497 }
498 break;
500 os << " numberOfCloudPoints "
501 << vamVisAtts.GetForcedNumberOfCloudPoints();
502 break;
504 os << " forceAuxEdgeVisible: ";
505 if (!vamVisAtts.IsForceDrawingStyle()) {
506 os << "not ";
507 }
508 os << " forced";
509 if (vamVisAtts.IsForceAuxEdgeVisible()) {
510 os << ": ";
511 if (vamVisAtts.IsForcedAuxEdgeVisible()) {
512 os << "true";
513 } else {
514 os << "false";
515 }
516 }
517 break;
519 os << " lineSegmentsPerCircle "
520 << vamVisAtts.GetForcedLineSegmentsPerCircle();
521 break;
522 }
523 }
524
525 return os;
526}
527
std::ostream & operator<<(std::ostream &os, const G4ModelingParameters &mp)
#define G4warn
Definition G4Scene.cc:41
#define G4BestUnit(a, b)
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
std::vector< PVNameCopyNo > PVNameCopyNoPath
CutawayMode GetCutawayMode() const
std::vector< PVPointerCopyNo > PVPointerCopyNoPath
PVNameCopyNoPath::const_iterator PVNameCopyNoPathConstIterator
void SetCutawaySolid(G4DisplacedSolid *pCutawaySolid)
PVPointerCopyNoPath::const_iterator PVPointerCopyNoPathConstIterator
void SetSectionSolid(G4DisplacedSolid *pSectionSolid)
const G4String & GetName() const
G4int GetForcedNumberOfCloudPoints() const
G4double GetLineWidth() const
G4bool IsDaughtersInvisible() const
G4int GetForcedLineSegmentsPerCircle() const
LineStyle GetLineStyle() const
const G4Colour & GetColour() const
G4bool IsVisible() const
G4bool IsForceAuxEdgeVisible() const
G4bool IsForcedAuxEdgeVisible() const
ForcedDrawingStyle GetForcedDrawingStyle() const
static G4int GetMinLineSegmentsPerCircle()
G4bool IsForceDrawingStyle() const