Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/modeling/src/G4ModelingParameters.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 
 32 #include "G4ModelingParameters.hh"
 33 
 34 #include "G4ios.hh"
 35 #include "G4VisAttributes.hh"
 36 #include "G4ExceptionSeverity.hh"
 37 #include "G4SystemOfUnits.hh"
 38 #include "G4VSolid.hh"
 39 #include "G4DisplacedSolid.hh"
 40 #include "G4VPhysicalVolume.hh"
 41 #include "G4PhysicalVolumeModel.hh"
 42 #include "G4UnitsTable.hh"
 43 
 44 #define G4warn G4cout
 45 
 46 G4ModelingParameters::G4ModelingParameters ():
 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 
 66 G4ModelingParameters::G4ModelingParameters
 67 (const G4VisAttributes* pDefaultVisAttributes,
 68  G4ModelingParameters::DrawingStyle drawingStyle,
 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 
 95 G4ModelingParameters::~G4ModelingParameters ()
 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 
121 void G4ModelingParameters::SetVisibleDensity (G4double visibleDensity) {
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 
138 G4int G4ModelingParameters::SetNoOfSides (G4int nSides) {
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 
151 void G4ModelingParameters::SetSectionSolid
152 (G4DisplacedSolid* pSectionSolid) {
153   delete fpSectionSolid;
154   fpSectionSolid = pSectionSolid;
155 }
156 
157 void G4ModelingParameters::SetCutawaySolid
158 (G4DisplacedSolid* pCutawaySolid) {
159   delete fpCutawaySolid;
160   fpCutawaySolid = pCutawaySolid;
161 }
162 
163 std::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) {
177     case G4ModelingParameters::wf:
178       os << "wireframe"; break;
179     case G4ModelingParameters::hlr:
180       os << "hidden line removal (hlr)"; break;
181     case G4ModelingParameters::hsr:
182       os << "surface (hsr)"; break;
183     case G4ModelingParameters::hlhsr:
184       os << "surface and edges (hlhsr)"; break;
185     case G4ModelingParameters::cloud:
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 
266 G4bool 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 
309 G4bool G4ModelingParameters::VisAttributesModifier::operator!=
310 (const G4ModelingParameters::VisAttributesModifier& rhs) const
311 {
312   if (fSignifier != rhs.fSignifier) return true;
313   if (fPVNameCopyNoPath != rhs.fPVNameCopyNoPath) return true;
314   switch (fSignifier) {
315     case G4ModelingParameters::VASVisibility:
316       if (fVisAtts.IsVisible() != rhs.fVisAtts.IsVisible())
317         return true;
318       break;
319     case G4ModelingParameters::VASDaughtersInvisible:
320       if (fVisAtts.IsDaughtersInvisible() !=
321           rhs.fVisAtts.IsDaughtersInvisible())
322         return true;
323       break;
324     case G4ModelingParameters::VASColour:
325       if (fVisAtts.GetColour() != rhs.fVisAtts.GetColour())
326         return true;
327       break;
328     case G4ModelingParameters::VASLineStyle:
329       if (fVisAtts.GetLineStyle() != rhs.fVisAtts.GetLineStyle())
330         return true;
331       break;
332     case G4ModelingParameters::VASLineWidth:
333       if (fVisAtts.GetLineWidth() != rhs.fVisAtts.GetLineWidth())
334         return true;
335       break;
336     case G4ModelingParameters::VASForceWireframe:
337     case G4ModelingParameters::VASForceSolid:
338     case G4ModelingParameters::VASForceCloud:
339       if (fVisAtts.GetForcedDrawingStyle() !=
340           rhs.fVisAtts.GetForcedDrawingStyle())
341         return true;
342       break;
343     case G4ModelingParameters::VASForceNumberOfCloudPoints:
344       if (fVisAtts.GetForcedNumberOfCloudPoints() !=
345           rhs.fVisAtts.GetForcedNumberOfCloudPoints())
346         return true;
347       break;
348     case G4ModelingParameters::VASForceAuxEdgeVisible:
349       if (fVisAtts.IsForceAuxEdgeVisible() !=
350           rhs.fVisAtts.IsForceAuxEdgeVisible() ||
351           fVisAtts.IsForcedAuxEdgeVisible() !=
352           rhs.fVisAtts.IsForcedAuxEdgeVisible())
353         return true;
354       break;
355     case G4ModelingParameters::VASForceLineSegmentsPerCircle:
356       if (fVisAtts.GetForcedLineSegmentsPerCircle() !=
357           rhs.fVisAtts.GetForcedLineSegmentsPerCircle())
358         return true;
359       break;
360   }
361   return false;
362 }
363 
364 G4bool 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 
372 std::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  ";
380     G4ModelingParameters::PVNameCopyNoPathConstIterator i;
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 
391 const G4String& G4ModelingParameters::PVPointerCopyNo::GetName() const
392 {
393   return fpPV->GetName();
394 }
395 
396 G4bool G4ModelingParameters::PVPointerCopyNo::operator!=
397 (const G4ModelingParameters::PVPointerCopyNo& rhs) const
398 {
399   if (fpPV != rhs.fpPV) return true;
400   if (fCopyNo != rhs.fCopyNo) return true;
401   return false;
402 }
403 
404 std::ostream& operator <<
405 (std::ostream& os, const G4ModelingParameters::PVPointerCopyNoPath& path)
406 {
407   os << "Touchable path: physical-volume-pointer:copy-number pairs:\n  ";
408   G4ModelingParameters::PVPointerCopyNoPathConstIterator i;
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 
418 std::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) {
427     const G4ModelingParameters::PVNameCopyNoPath& vamPath =
428     iModifier->GetPVNameCopyNoPath();
429     os << '\n' << vamPath;
430     const G4VisAttributes& vamVisAtts = iModifier->GetVisAttributes();
431     const G4Colour& c = vamVisAtts.GetColour();
432     switch (iModifier->GetVisAttributesSignifier()) {
433       case G4ModelingParameters::VASVisibility:
434         os << " visibility ";
435         if (vamVisAtts.IsVisible()) {
436           os << "true";
437         } else {
438           os << "false";
439         }
440         break;
441       case G4ModelingParameters::VASDaughtersInvisible:
442         os << " daughtersInvisible ";
443         if (vamVisAtts.IsDaughtersInvisible()) {
444           os << "true";
445         } else {
446           os << "false";
447         }
448         break;
449       case G4ModelingParameters::VASColour:
450         os << " colour " << c;
451         break;
452       case G4ModelingParameters::VASLineStyle:
453         os << " lineStyle ";
454         switch (vamVisAtts.GetLineStyle()) {
455           case G4VisAttributes::unbroken:
456             os << "unbroken";
457             break;
458           case G4VisAttributes::dashed:
459             os << "dashed";
460             break;
461           case G4VisAttributes::dotted:
462             os << "dotted";
463         }
464         break;
465       case G4ModelingParameters::VASLineWidth:
466         os << " lineWidth "
467         << vamVisAtts.GetLineWidth();
468         break;
469       case G4ModelingParameters::VASForceWireframe:
470         if (vamVisAtts.GetForcedDrawingStyle() == G4VisAttributes::wireframe) {
471           os << " forceWireframe ";
472           if (vamVisAtts.IsForceDrawingStyle()) {
473             os << "true";
474           } else {
475             os << "false";
476           }
477         }
478         break;
479       case G4ModelingParameters::VASForceSolid:
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;
489       case G4ModelingParameters::VASForceCloud:
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;
499       case G4ModelingParameters::VASForceNumberOfCloudPoints:
500         os << " numberOfCloudPoints "
501         << vamVisAtts.GetForcedNumberOfCloudPoints();
502         break;
503       case G4ModelingParameters::VASForceAuxEdgeVisible:
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;
518       case G4ModelingParameters::VASForceLineSegmentsPerCircle:
519         os << " lineSegmentsPerCircle "
520         << vamVisAtts.GetForcedLineSegmentsPerCircle();
521         break;
522     }
523   }
524 
525   return os;
526 }
527 
528