Geant4 9.6.0
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// $Id$
28//
29//
30// John Allison 31st December 1997.
31// Parameters associated with the modeling of GEANT4 objects.
32
34
35#include "G4ios.hh"
36#include "G4VisAttributes.hh"
38#include "G4SystemOfUnits.hh"
39#include "G4VSolid.hh"
40#include "G4VPhysicalVolume.hh"
42
44 fWarning (true),
45 fpDefaultVisAttributes (0),
46 fDrawingStyle (wf),
47 fCulling (false),
48 fCullInvisible (false),
49 fDensityCulling (false),
50 fVisibleDensity (0.01 * g / cm3),
51 fCullCovered (false),
52 fExplodeFactor (1.),
53 fNoOfSides (24),
54 fpSectionSolid (0),
55 fpCutawaySolid (0),
56 fpEvent (0)
57{}
58
60(const G4VisAttributes* pDefaultVisAttributes,
62 G4bool isCulling,
63 G4bool isCullingInvisible,
64 G4bool isDensityCulling,
65 G4double visibleDensity,
66 G4bool isCullingCovered,
67 G4int noOfSides
68 ):
69 fWarning (true),
70 fpDefaultVisAttributes (pDefaultVisAttributes),
71 fDrawingStyle (drawingStyle),
72 fCulling (isCulling),
73 fCullInvisible (isCullingInvisible),
74 fDensityCulling (isDensityCulling),
75 fVisibleDensity (visibleDensity),
76 fCullCovered (isCullingCovered),
77 fExplodeFactor (1.),
78 fNoOfSides (noOfSides),
79 fpSectionSolid (0),
80 fpCutawaySolid (0),
81 fpEvent (0)
82{}
83
85{
86 delete fpSectionSolid;
87 delete fpCutawaySolid;
88}
89
91(const G4VisAttributes& visAtts,
93 const std::vector<G4PhysicalVolumeModel::G4PhysicalVolumeNodeID>& path):
94fVisAtts(visAtts), fSignifier(signifier)
95{
97 typedef std::vector<PVNodeID> PVPath;
98 typedef PVPath::const_iterator PVPathConstIterator;
99 PVPathConstIterator i;
100 for (i = path.begin();
101 i != path.end();
102 ++i) {
103 fPVNameCopyNoPath.push_back
105 (i->GetPhysicalVolume()->GetName(),
106 i->GetCopyNo()));
107 }
108}
109
111 const G4double reasonableMaximum = 10.0 * g / cm3;
112 if (visibleDensity < 0 && fWarning) {
113 G4cout << "G4ModelingParameters::SetVisibleDensity: attempt to set negative "
114 "density - ignored." << G4endl;
115 }
116 else {
117 if (fVisibleDensity > reasonableMaximum && fWarning) {
118 G4cout << "G4ModelingParameters::SetVisibleDensity: density > "
119 << reasonableMaximum
120 << " g / cm3 - did you mean this?"
121 << G4endl;
122 }
123 fVisibleDensity = visibleDensity;
124 }
125}
126
128 const G4int nSidesMin = 12;
129 if (nSides < nSidesMin) {
130 nSides = nSidesMin;
131 if (fWarning)
132 G4cout << "G4ModelingParameters::SetNoOfSides: attempt to set the"
133 "\nnumber of sides per circle < " << nSidesMin
134 << "; forced to" << nSides << G4endl;
135 }
136 fNoOfSides = nSides;
137 return fNoOfSides;
138}
139
141(G4VSolid* pSectionSolid) {
142 delete fpSectionSolid;
143 fpSectionSolid = pSectionSolid;
144}
145
147(G4VSolid* pCutawaySolid) {
148 delete fpCutawaySolid;
149 fpCutawaySolid = pCutawaySolid;
150}
151
152std::ostream& operator << (std::ostream& os, const G4ModelingParameters& mp)
153{
154 os << "Modeling parameters (warning ";
155 if (mp.fWarning) os << "true";
156 else os << "false";
157 os << "):";
158
159 const G4VisAttributes* va = mp.fpDefaultVisAttributes;
160 os << "\n Default vis. attributes: ";
161 if (va) os << *va;
162 else os << "none";
163
164 os << "\n Current requested drawing style: ";
165 switch (mp.fDrawingStyle) {
167 os << "wireframe"; break;
169 os << "hidden line removal (hlr)"; break;
171 os << "surface (hsr)"; break;
173 os << "surface and edges (hlhsr)"; break;
174 default: os << "unrecognised"; break;
175 }
176
177 os << "\n Culling: ";
178 if (mp.fCulling) os << "on";
179 else os << "off";
180
181 os << "\n Culling invisible objects: ";
182 if (mp.fCullInvisible) os << "on";
183 else os << "off";
184
185 os << "\n Density culling: ";
186 if (mp.fDensityCulling) {
187 os << "on - invisible if density less than "
188 << mp.fVisibleDensity / (1. * g / cm3) << " g cm^-3";
189 }
190 else os << "off";
191
192 os << "\n Culling daughters covered by opaque mothers: ";
193 if (mp.fCullCovered) os << "on";
194 else os << "off";
195
196 os << "\n Explode factor: " << mp.fExplodeFactor
197 << " about centre: " << mp.fExplodeCentre;
198
199 os << "\n No. of sides used in circle polygon approximation: "
200 << mp.fNoOfSides;
201
202 os << "\n Section (DCUT) shape (G4VSolid) pointer: ";
203 if (!mp.fpSectionSolid) os << "non-";
204 os << "null";
205
206 os << "\n Cutaway (DCUT) shape (G4VSolid) pointer: ";
207 if (!mp.fpCutawaySolid) os << "non-";
208 os << "null";
209
210 os << "\n Event pointer: " << mp.fpEvent;
211
212 os << "\n Vis attributes modifiers: ";
213 const std::vector<G4ModelingParameters::VisAttributesModifier>& vams =
214 mp.fVisAttributesModifiers;
215 if (vams.empty()) {
216 os << "None";
217 } else {
218 os << vams;
219 }
220
221 return os;
222}
223
224G4bool G4ModelingParameters::operator !=
225(const G4ModelingParameters& mp) const {
226
227 if (
228 (fWarning != mp.fWarning) ||
229 (*fpDefaultVisAttributes != *mp.fpDefaultVisAttributes) ||
230 (fCulling != mp.fCulling) ||
231 (fCullInvisible != mp.fCullInvisible) ||
232 (fDensityCulling != mp.fDensityCulling) ||
233 (fCullCovered != mp.fCullCovered) ||
234 (fExplodeFactor != mp.fExplodeFactor) ||
235 (fExplodeCentre != mp.fExplodeCentre) ||
236 (fNoOfSides != mp.fNoOfSides) ||
237 (fpSectionSolid != mp.fpSectionSolid) ||
238 (fpCutawaySolid != mp.fpCutawaySolid) ||
239 (fpEvent != mp.fpEvent)
240 )
241 return true;
242
243 if (fDensityCulling &&
244 (fVisibleDensity != mp.fVisibleDensity)) return true;
245
246 if (VAMSNotEqual(fVisAttributesModifiers, mp.fVisAttributesModifiers))
247 return true;
248
249 return false;
250}
251
255{
256 if (path1.size() != path2.size()) return true;
257 if (path1.empty()) return false;
259 for (i1 = path1.begin(), i2 = path2.begin();
260 i1 != path1.end();
261 ++i1, ++i2) {
262 if (i1->GetName() != i2->GetName()) return true;
263 if (i1->GetCopyNo() != i2->GetCopyNo()) return true;
264 }
265 return false;
266}
267
269(const std::vector<G4ModelingParameters::VisAttributesModifier>& vams1,
270 const std::vector<G4ModelingParameters::VisAttributesModifier>& vams2)
271{
272 if (vams1.size() != vams2.size()) return true;
273 if (vams1.empty()) return false;
274 std::vector<VisAttributesModifier>::const_iterator i1, i2;
275 for (i1 = vams1.begin(), i2 = vams2.begin();
276 i1 != vams1.end();
277 ++i1, ++i2) {
278 const PVNameCopyNoPath& vam1Path = i1->GetPVNameCopyNoPath();
279 const PVNameCopyNoPath& vam2Path = i2->GetPVNameCopyNoPath();
280 if (PVNameCopyNoPathNotEqual(vam1Path,vam2Path)) return true;
281 if (i1->GetVisAttributesSignifier() != i2->GetVisAttributesSignifier())
282 return true;
283 const G4VisAttributes& vam1VisAtts = i1->GetVisAttributes();
284 const G4VisAttributes& vam2VisAtts = i2->GetVisAttributes();
285 const G4Colour& c1 = vam1VisAtts.GetColour();
286 const G4Colour& c2 = vam2VisAtts.GetColour();
287 switch (i1->GetVisAttributesSignifier()) {
289 if (vam1VisAtts.IsVisible() != vam2VisAtts.IsVisible())
290 return true;
291 break;
293 if (vam1VisAtts.IsDaughtersInvisible() !=
294 vam2VisAtts.IsDaughtersInvisible())
295 return true;
296 break;
298 if (c1 != c2)
299 return true;
300 break;
302 if (vam1VisAtts.GetLineStyle() != vam2VisAtts.GetLineStyle())
303 return true;
304 break;
306 if (vam1VisAtts.GetLineWidth() != vam2VisAtts.GetLineWidth())
307 return true;
308 break;
310 if (vam1VisAtts.GetForcedDrawingStyle() !=
311 vam2VisAtts.GetForcedDrawingStyle())
312 return true;
313 break;
315 if (vam1VisAtts.GetForcedDrawingStyle() !=
316 vam2VisAtts.GetForcedDrawingStyle())
317 return true;
318 break;
320 if (vam1VisAtts.IsForceAuxEdgeVisible() !=
321 vam2VisAtts.IsForceAuxEdgeVisible())
322 return true;
323 break;
325 if (vam1VisAtts.GetForcedLineSegmentsPerCircle() !=
326 vam2VisAtts.GetForcedLineSegmentsPerCircle())
327 return true;
328 break;
329 }
330 }
331 return false;
332}
333
334std::ostream& operator <<
335(std::ostream& os, const G4ModelingParameters::PVNameCopyNoPath& path)
336{
337// os << "Touchable path: physical-volume-name:copy-number pairs:\n ";
339 for (i = path.begin(); i != path.end(); ++i) {
340 if (i != path.begin()) {
341 os << ", ";
342 }
343 os << i->GetName() << ':' << i->GetCopyNo();
344 }
345 return os;
346}
347
348std::ostream& operator <<
349(std::ostream& os,
350 const std::vector<G4ModelingParameters::VisAttributesModifier>& vams)
351{
352 std::vector<G4ModelingParameters::VisAttributesModifier>::const_iterator
353 iModifier;
354 for (iModifier = vams.begin();
355 iModifier != vams.end();
356 ++iModifier) {
358 iModifier->GetPVNameCopyNoPath();
359 os << '\n' << vamPath;
360 const G4VisAttributes& vamVisAtts = iModifier->GetVisAttributes();
361 const G4Colour& c = vamVisAtts.GetColour();
362 switch (iModifier->GetVisAttributesSignifier()) {
364 os << " visibility ";
365 if (vamVisAtts.IsVisible()) {
366 os << "true";
367 } else {
368 os << "false";
369 }
370 break;
372 os << " daughtersInvisible ";
373 if (vamVisAtts.IsDaughtersInvisible()) {
374 os << "true";
375 } else {
376 os << "false";
377 }
378 break;
380 os << " colour " << c;
381 break;
383 os << " lineStyle ";
384 switch (vamVisAtts.GetLineStyle()) {
386 os << "unbroken";
387 break;
389 os << "dashed";
390 break;
392 os << "dotted";
393 }
394 break;
396 os << " lineWidth "
397 << vamVisAtts.GetLineWidth();
398 break;
401 os << " forceWireframe ";
402 if (vamVisAtts.IsForceDrawingStyle()) {
403 os << "true";
404 } else {
405 os << "false";
406 }
407 }
408 break;
410 if (vamVisAtts.GetForcedDrawingStyle() == G4VisAttributes::solid) {
411 os << " forceSolid ";
412 if (vamVisAtts.IsForceDrawingStyle()) {
413 os << "true";
414 } else {
415 os << "false";
416 }
417 }
418 break;
420 os << " forceAuxEdgeVisible ";
421 if (vamVisAtts.IsForceAuxEdgeVisible()) {
422 os << "true";
423 } else {
424 os << "false";
425 }
426 break;
428 os << " lineSegmentsPerCircle "
429 << vamVisAtts.GetForcedLineSegmentsPerCircle();
430 break;
431 }
432 }
433
434 return os;
435}
436
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
VisAttributesModifier(const G4VisAttributes &visAtts, VisAttributesSignifier signifier, const PVNameCopyNoPath &path)
void SetCutawaySolid(G4VSolid *pCutawaySolid)
void SetSectionSolid(G4VSolid *pSectionSolid)
friend std::ostream & operator<<(std::ostream &os, const G4ModelingParameters &)
PVNameCopyNoPath::const_iterator PVNameCopyNoPathConstIterator
std::vector< PVNameCopyNo > PVNameCopyNoPath
static G4bool PVNameCopyNoPathNotEqual(const PVNameCopyNoPath &, const PVNameCopyNoPath &)
static G4bool VAMSNotEqual(const std::vector< VisAttributesModifier > &, const std::vector< VisAttributesModifier > &)
void SetVisibleDensity(G4double)
G4double GetLineWidth() const
G4bool IsDaughtersInvisible() const
G4int GetForcedLineSegmentsPerCircle() const
LineStyle GetLineStyle() const
const G4Colour & GetColour() const
G4bool IsVisible() const
G4bool IsForceAuxEdgeVisible() const
ForcedDrawingStyle GetForcedDrawingStyle() const
G4bool IsForceDrawingStyle() const