Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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: G4ModelingParameters.cc 71534 2013-06-17 16:07:53Z gcosmo $
28 //
29 //
30 // John Allison 31st December 1997.
31 // Parameters associated with the modeling of GEANT4 objects.
32 
33 #include "G4ModelingParameters.hh"
34 
35 #include "G4ios.hh"
36 #include "G4VisAttributes.hh"
37 #include "G4ExceptionSeverity.hh"
38 #include "G4SystemOfUnits.hh"
39 #include "G4VSolid.hh"
40 #include "G4VPhysicalVolume.hh"
41 #include "G4PhysicalVolumeModel.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):
94 fVisAtts(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
104  (PVNameCopyNo
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 
152 std::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 
224 G4bool 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 (fVisAttributesModifiers != mp.fVisAttributesModifiers)
247  return true;
248 
249  return false;
250 }
251 
252 G4bool G4ModelingParameters::PVNameCopyNo::operator!=
254 {
255  if (fName != rhs.fName) return true;
256  if (fCopyNo != rhs.fCopyNo) return true;
257  return false;
258 }
259 
260 G4bool G4ModelingParameters::VisAttributesModifier::operator!=
262 {
263  if (fSignifier != rhs.fSignifier) return true;
264  if (fPVNameCopyNoPath != rhs.fPVNameCopyNoPath) return true;
265  switch (fSignifier) {
267  if (fVisAtts.IsVisible() != rhs.fVisAtts.IsVisible())
268  return true;
269  break;
271  if (fVisAtts.IsDaughtersInvisible() !=
272  rhs.fVisAtts.IsDaughtersInvisible())
273  return true;
274  break;
276  if (fVisAtts.GetColour() != rhs.fVisAtts.GetColour())
277  return true;
278  break;
280  if (fVisAtts.GetLineStyle() != rhs.fVisAtts.GetLineStyle())
281  return true;
282  break;
284  if (fVisAtts.GetLineWidth() != rhs.fVisAtts.GetLineWidth())
285  return true;
286  break;
288  if (fVisAtts.GetForcedDrawingStyle() !=
289  rhs.fVisAtts.GetForcedDrawingStyle())
290  return true;
291  break;
293  if (fVisAtts.GetForcedDrawingStyle() !=
294  rhs.fVisAtts.GetForcedDrawingStyle())
295  return true;
296  break;
298  if (fVisAtts.IsForceAuxEdgeVisible() !=
299  rhs.fVisAtts.IsForceAuxEdgeVisible())
300  return true;
301  break;
303  if (fVisAtts.GetForcedLineSegmentsPerCircle() !=
304  rhs.fVisAtts.GetForcedLineSegmentsPerCircle())
305  return true;
306  break;
307  }
308  return false;
309 }
310 
311 std::ostream& operator <<
312 (std::ostream& os, const G4ModelingParameters::PVNameCopyNoPath& path)
313 {
314 // os << "Touchable path: physical-volume-name:copy-number pairs:\n ";
316  for (i = path.begin(); i != path.end(); ++i) {
317  if (i != path.begin()) {
318  os << ", ";
319  }
320  os << i->GetName() << ':' << i->GetCopyNo();
321  }
322  return os;
323 }
324 
325 std::ostream& operator <<
326 (std::ostream& os,
327  const std::vector<G4ModelingParameters::VisAttributesModifier>& vams)
328 {
329  std::vector<G4ModelingParameters::VisAttributesModifier>::const_iterator
330  iModifier;
331  for (iModifier = vams.begin();
332  iModifier != vams.end();
333  ++iModifier) {
335  iModifier->GetPVNameCopyNoPath();
336  os << '\n' << vamPath;
337  const G4VisAttributes& vamVisAtts = iModifier->GetVisAttributes();
338  const G4Colour& c = vamVisAtts.GetColour();
339  switch (iModifier->GetVisAttributesSignifier()) {
341  os << " visibility ";
342  if (vamVisAtts.IsVisible()) {
343  os << "true";
344  } else {
345  os << "false";
346  }
347  break;
349  os << " daughtersInvisible ";
350  if (vamVisAtts.IsDaughtersInvisible()) {
351  os << "true";
352  } else {
353  os << "false";
354  }
355  break;
357  os << " colour " << c;
358  break;
360  os << " lineStyle ";
361  switch (vamVisAtts.GetLineStyle()) {
363  os << "unbroken";
364  break;
366  os << "dashed";
367  break;
369  os << "dotted";
370  }
371  break;
373  os << " lineWidth "
374  << vamVisAtts.GetLineWidth();
375  break;
378  os << " forceWireframe ";
379  if (vamVisAtts.IsForceDrawingStyle()) {
380  os << "true";
381  } else {
382  os << "false";
383  }
384  }
385  break;
387  if (vamVisAtts.GetForcedDrawingStyle() == G4VisAttributes::solid) {
388  os << " forceSolid ";
389  if (vamVisAtts.IsForceDrawingStyle()) {
390  os << "true";
391  } else {
392  os << "false";
393  }
394  }
395  break;
397  os << " forceAuxEdgeVisible ";
398  if (vamVisAtts.IsForceAuxEdgeVisible()) {
399  os << "true";
400  } else {
401  os << "false";
402  }
403  break;
405  os << " lineSegmentsPerCircle "
406  << vamVisAtts.GetForcedLineSegmentsPerCircle();
407  break;
408  }
409  }
410 
411  return os;
412 }
413 
G4bool IsForceAuxEdgeVisible() const
G4String fName
Definition: G4AttUtils.hh:55
G4double GetLineWidth() const
void SetVisibleDensity(G4double)
G4bool IsVisible() const
const G4Colour & GetColour() const
int G4int
Definition: G4Types.hh:78
LineStyle GetLineStyle() const
void SetCutawaySolid(G4VSolid *pCutawaySolid)
function g(Y1, Y2, PT2)
Definition: hijing1.383.f:5205
G4GLOB_DLL std::ostream G4cout
G4bool IsDaughtersInvisible() const
bool G4bool
Definition: G4Types.hh:79
G4PhysicalVolumeModel::G4PhysicalVolumeNodeID PVNodeID
VisAttributesModifier(const G4VisAttributes &visAtts, VisAttributesSignifier signifier, const PVNameCopyNoPath &path)
std::vector< PVNodeID > PVPath
G4int GetForcedLineSegmentsPerCircle() const
void SetSectionSolid(G4VSolid *pSectionSolid)
std::vector< PVNameCopyNo > PVNameCopyNoPath
G4bool IsForceDrawingStyle() const
std::ostream & operator<<(std::ostream &, const BasicVector3D< float > &)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
ForcedDrawingStyle GetForcedDrawingStyle() const
PVNameCopyNoPath::const_iterator PVNameCopyNoPathConstIterator