Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/Tree/src/G4ASCIITreeSceneHandler.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 ]

Diff markup

Differences between /visualization/Tree/src/G4ASCIITreeSceneHandler.cc (Version 11.3.0) and /visualization/Tree/src/G4ASCIITreeSceneHandler.cc (Version 3.0)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 //                                                
 27 //                                                
 28 //                                                
 29 // John Allison  5th April 2001                   
 30 // A scene handler to dump geometry hierarchy.    
 31 // Based on a provisional G4ASCIITreeGraphicsS    
 32                                                   
 33 #include "G4ASCIITreeSceneHandler.hh"             
 34                                                   
 35 #include "G4ASCIITree.hh"                         
 36 #include "G4ASCIITreeMessenger.hh"                
 37 #include "G4VSolid.hh"                            
 38 #include "G4PhysicalVolumeModel.hh"               
 39 #include "G4VPhysicalVolume.hh"                   
 40 #include "G4LogicalVolume.hh"                     
 41 #include "G4VPVParameterisation.hh"               
 42 #include "G4Polyhedron.hh"                        
 43 #include "G4UnitsTable.hh"                        
 44 #include "G4Material.hh"                          
 45 #include "G4Scene.hh"                             
 46 #include "G4ModelingParameters.hh"                
 47 #include "G4PhysicalVolumeMassScene.hh"           
 48 #include "G4VSensitiveDetector.hh"                
 49 #include "G4VReadOutGeometry.hh"                  
 50 #include "G4TransportationManager.hh"             
 51 #include "G4AttCheck.hh"                          
 52 #include "G4AttValue.hh"                          
 53                                                   
 54 G4ASCIITreeSceneHandler::G4ASCIITreeSceneHandl    
 55 (G4VGraphicsSystem& system,                       
 56  const G4String& name):                           
 57   G4VTreeSceneHandler(system, name),              
 58   fpOutFile(0),                                   
 59   fpLastPV(0),                                    
 60   fLastCopyNo(-99),                               
 61   fLastNonSequentialCopyNo(-99)                   
 62 {}                                                
 63                                                   
 64 G4ASCIITreeSceneHandler::~G4ASCIITreeSceneHand    
 65                                                   
 66 void G4ASCIITreeSceneHandler::BeginModeling ()    
 67                                                   
 68   G4VTreeSceneHandler::BeginModeling ();  // T    
 69                                                   
 70   const G4ASCIITree* pSystem = (G4ASCIITree*)G    
 71   const G4String& outFileName = pSystem -> Get    
 72   if (outFileName == "G4cout") {                  
 73     fpOutFile = &G4cout;                          
 74   } else {                                        
 75     fOutFile.open (outFileName);                  
 76     fpOutFile = &fOutFile;                        
 77   }                                               
 78                                                   
 79   static G4bool firstTime = true;                 
 80   if (firstTime) {                                
 81     firstTime = false;                            
 82     G4cout << "G4ASCIITreeSceneHandler::BeginM    
 83     if (outFileName == "G4cout") {                
 84       G4cout << "G4 standard output (G4cout)";    
 85     } else {                                      
 86       G4cout << "file \"" << outFileName << "\    
 87     }                                             
 88     G4cout << G4endl;                             
 89                                                   
 90     WriteHeader (G4cout); G4cout << G4endl;       
 91   }                                               
 92                                                   
 93   if (outFileName != "G4cout") {                  
 94     WriteHeader (fOutFile); fOutFile << std::e    
 95   }                                               
 96 }                                                 
 97                                                   
 98 void G4ASCIITreeSceneHandler::WriteHeader (std    
 99 {                                                 
100   const G4ASCIITree* pSystem = (G4ASCIITree*)G    
101   const G4int verbosity = pSystem->GetVerbosit    
102   const G4int detail = verbosity % 10;            
103   os << "#  Set verbosity with \"/vis/ASCIITre    
104   for (size_t i = 0;                              
105        i < G4ASCIITreeMessenger::fVerbosityGui    
106     os << "\n#  " << G4ASCIITreeMessenger::fVe    
107   }                                               
108   os << "\n#  Now printing with verbosity " <<    
109   os << "\n#  Format is: PV:n";                   
110   if (detail >= 1) os << " / LV (SD,RO)";         
111   if (detail >= 2) os << " / Solid(type)";        
112   if (detail >= 3) os << ", volume, density";     
113   if (detail >= 5) os << ", daughter-subtracte    
114   if (detail >= 6) os << ", physical volume du    
115   if (detail >= 7) os << ", polyhedron dump";     
116   os <<                                           
117     "\n#  Abbreviations: PV = Physical Volume,    
118     "\n#                 SD = Sensitive Detect    
119 }                                                 
120                                                   
121 void G4ASCIITreeSceneHandler::EndModeling () {    
122   const G4ASCIITree* pSystem = (G4ASCIITree*)     
123   const G4int verbosity = pSystem->GetVerbosit    
124   const G4int detail = verbosity % 10;            
125   const G4String& outFileName = pSystem -> Get    
126                                                   
127   // Output left over copy number, if any...      
128   if (fLastCopyNo != fLastNonSequentialCopyNo)    
129     if (fLastCopyNo == fLastNonSequentialCopyN    
130     else *fpOutFile << '-';                       
131     *fpOutFile << fLastCopyNo;                    
132   }                                               
133   // Output outstanding rest of line, if any..    
134   if (!fRestOfLine.str().empty()) *fpOutFile <    
135   fRestOfLine.str("");                            
136   fpLastPV = 0;                                   
137   fLastPVName.clear();                            
138   fLastCopyNo = -99;                              
139   fLastNonSequentialCopyNo = -99;                 
140                                                   
141   // This detail to G4cout regardless of outFi    
142   if (detail >= 4) {                              
143     G4cout << "Calculating mass(es)..." << G4e    
144     const std::vector<G4Scene::Model>& models     
145     std::vector<G4Scene::Model>::const_iterato    
146     for (i = models.begin(); i != models.end()    
147       G4PhysicalVolumeModel* pvModel =            
148   dynamic_cast<G4PhysicalVolumeModel*>(i->fpMo    
149       if (pvModel) {                              
150         const G4ModelingParameters* tempMP =      
151         pvModel->GetModelingParameters();         
152         G4ModelingParameters mp;  // Default -    
153         pvModel->SetModelingParameters (&mp);     
154         G4PhysicalVolumeMassScene massScene(pv    
155         pvModel->DescribeYourselfTo (massScene    
156         G4double volume = massScene.GetVolume(    
157         G4double mass = massScene.GetMass();      
158                                                   
159         G4cout << "Overall volume of \""          
160         << pvModel->GetTopPhysicalVolume()->Ge    
161         << "\":"                                  
162         << pvModel->GetTopPhysicalVolume()->Ge    
163         << ", is "                                
164         << G4BestUnit (volume, "Volume")          
165         << " and the daughter-included mass";     
166         G4int requestedDepth = pvModel->GetReq    
167         if (requestedDepth == G4PhysicalVolume    
168           G4cout << " to unlimited depth";        
169         } else {                                  
170           G4cout << ", ignoring daughters at d    
171           << requestedDepth                       
172           << " and below,";                       
173         }                                         
174         G4cout << " is " << G4BestUnit (mass,     
175         << G4endl;                                
176                                                   
177         pvModel->SetModelingParameters (tempMP    
178       }                                           
179     }                                             
180   }                                               
181                                                   
182   if (outFileName != "G4cout") {                  
183     fOutFile.close();                             
184     G4cout << "Output file \"" << outFileName     
185   }                                               
186   fLVSet.clear();                                 
187   fReplicaSet.clear();                            
188   G4cout << "G4ASCIITreeSceneHandler::EndModel    
189   G4VTreeSceneHandler::EndModeling ();  // To     
190 }                                                 
191                                                   
192 void G4ASCIITreeSceneHandler::RequestPrimitive    
193                                                   
194   G4PhysicalVolumeModel* pPVModel =               
195     dynamic_cast<G4PhysicalVolumeModel*>(fpMod    
196   if (!pPVModel) return;  // Not from a G4Phys    
197                                                   
198   // This call comes from a G4PhysicalVolumeMo    
199   // the path of the current drawn (non-culled    
200   // drawn (non-culled) ancestors.  Each node     
201   // PVNodeID object, which is a physical volu    
202   // is a vector of PVNodeIDs corresponding to    
203   // actually selected, i.e., not culled.         
204   // The following typedef's already set in he    
205   //typedef G4PhysicalVolumeModel::G4PhysicalV    
206   //typedef std::vector<PVNodeID> PVPath;         
207   const PVPath& drawnPVPath = pPVModel->GetDra    
208   //G4int currentDepth = pPVModel->GetCurrentD    
209   G4VPhysicalVolume* pCurrentPV = pPVModel->Ge    
210   const G4String& currentPVName = pCurrentPV->    
211   const G4int currentCopyNo = pCurrentPV->GetC    
212   G4LogicalVolume* pCurrentLV = pPVModel->GetC    
213   G4Material* pCurrentMaterial = pPVModel->Get    
214                                                   
215   G4ASCIITree* pSystem = (G4ASCIITree*)GetGrap    
216   G4int verbosity = pSystem->GetVerbosity();      
217   G4int detail = verbosity % 10;                  
218                                                   
219   // If verbosity < 10 suppress unnecessary re    
220   // Repeated simple replicas can always be su    
221   // Paramaterisations can only be suppressed     
222   // size, density, etc., are in principle dif    
223   const G4bool isParameterised = pCurrentPV->G    
224   const G4bool isSimpleReplica = pCurrentPV->I    
225   const G4bool isAmenableToSupression =           
226   (verbosity < 10 && isSimpleReplica) || (verb    
227   if (isAmenableToSupression) {                   
228     // See if this has been found before with     
229     PVPath::const_reverse_iterator thisID = dr    
230     PVPath::const_reverse_iterator motherID =     
231     G4bool ignore = false;                        
232     for (ReplicaSetIterator i = fReplicaSet.be    
233          ++i) {                                   
234       if (i->back().GetPhysicalVolume()->GetLo    
235           thisID->GetPhysicalVolume()->GetLogi    
236         // For each one previously found (if m    
237         // have different mothers)...             
238         // To avoid compilation errors on VC++    
239         // Previously:                            
240         //   PVNodeID previousMotherID = ++(i-    
241         // (Should that have been: PVNodeID::c    
242         // Replace                                
243         //   previousMotherID == i->rend()        
244         // by                                     
245         //   i->size() <= 1                       
246         // Replace                                
247         //   previousMotherID != i->rend()        
248         // by                                     
249         //   i->size() > 1                        
250         // Replace                                
251         //   previousMotherID->                   
252         // by                                     
253         //   (*i)[i->size() - 2].                 
254         if (motherID == drawnPVPath.rend() &&     
255             i->size() <= 1)                       
256           ignore = true;  // Both have no moth    
257         if (motherID != drawnPVPath.rend() &&     
258             i->size() > 1 &&                      
259             motherID->GetPhysicalVolume()->Get    
260             (*i)[i->size() - 2].GetPhysicalVol    
261           ignore = true;  // Same mother LV...    
262       }                                           
263     }                                             
264     if (ignore) {                                 
265       pPVModel->CurtailDescent();                 
266       return;                                     
267     }                                             
268   }                                               
269                                                   
270   // Now suppress printing for volumes with th    
271   // copy number - but not if they are paramet    
272   // taken out above (those that are "amenable    
273   // taken out).                                  
274   if (verbosity < 10 && !isParameterised &&       
275       currentPVName == fLastPVName &&             
276       currentCopyNo != fLastCopyNo) {             
277     // Check...                                   
278     if (isAmenableToSupression) {                 
279       G4Exception("G4ASCIITreeSceneHandler::Re    
280       "vistree0001",                              
281       JustWarning,                                
282       "Volume amenable to suppressed printing     
283     }                                             
284     // Check mothers are identical...             
285     else if (pCurrentLV == (fpLastPV? fpLastPV    
286       if (currentCopyNo != fLastCopyNo + 1) {     
287   // Non-sequential copy number...                
288   *fpOutFile << ',' << currentCopyNo;             
289   fLastNonSequentialCopyNo = currentCopyNo;       
290       }                                           
291       fLastCopyNo = currentCopyNo;                
292       pPVModel->CurtailDescent();                 
293       return;                                     
294     }                                             
295   }                                               
296   fpLastPV = pCurrentPV;                          
297                                                   
298   // High verbosity or a new or otherwise non-    
299   // Output copy number, if any, from previous    
300   if (fLastCopyNo != fLastNonSequentialCopyNo)    
301     if (fLastCopyNo == fLastNonSequentialCopyN    
302     else *fpOutFile << '-';                       
303     *fpOutFile << fLastCopyNo;                    
304   }                                               
305   // Output rest of line, if any, from previou    
306   if (!fRestOfLine.str().empty()) *fpOutFile <    
307   fRestOfLine.str("");                            
308   fLastPVName = currentPVName;                    
309   fLastCopyNo = currentCopyNo;                    
310   fLastNonSequentialCopyNo = currentCopyNo;       
311   // Start next line...                           
312   // Indent according to drawn path depth...      
313   for (size_t i = 0; i < drawnPVPath.size(); i    
314   *fpOutFile << "\"" << currentPVName             
315        << "\":" << currentCopyNo;                 
316                                                   
317   if (pCurrentPV->IsReplicated()) {               
318     if (verbosity < 10) {                         
319       // Add printing for replicas (when repli    
320       EAxis axis;                                 
321       G4int nReplicas;                            
322       G4double width;                             
323       G4double offset;                            
324       G4bool consuming;                           
325       pCurrentPV->GetReplicationData(axis,nRep    
326       G4VPVParameterisation* pP = pCurrentPV->    
327       if (pP) {                                   
328   if (detail < 3) {                               
329     fReplicaSet.insert(drawnPVPath);              
330     if (nReplicas > 2) fRestOfLine << '-';        
331     else fRestOfLine << ',';                      
332     fRestOfLine << nReplicas - 1                  
333           << " (" << nReplicas << " parametris    
334   }                                               
335       }                                           
336       else {                                      
337   fReplicaSet.insert(drawnPVPath);                
338   if (nReplicas > 2) fRestOfLine << '-';          
339   else fRestOfLine << ',';                        
340   fRestOfLine << nReplicas - 1                    
341         << " (" << nReplicas << " replicas)";     
342       }                                           
343     }                                             
344   } else {                                        
345     if (fLVSet.find(pCurrentLV) != fLVSet.end(    
346       if (verbosity <  10) {                      
347   // Add printing for repeated LV (if it has d    
348   if (pCurrentLV->GetNoDaughters()) fRestOfLin    
349   // ...and curtail descent.                      
350   pPVModel->CurtailDescent();                     
351       }                                           
352     }                                             
353   }                                               
354                                                   
355   if (detail >= 1) {                              
356     fRestOfLine << " / \""                        
357     << pCurrentLV->GetName() << "\"";             
358     G4VSensitiveDetector* sd = pCurrentLV->Get    
359     if (sd) {                                     
360       fRestOfLine << " (SD=\"" << sd->GetName(    
361       G4VReadOutGeometry* roGeom = sd->GetROge    
362       if (roGeom) {                               
363   fRestOfLine << ",RO=\"" << roGeom->GetName()    
364       }                                           
365       fRestOfLine << ")";                         
366     }                                             
367   }                                               
368                                                   
369   if (detail >= 2) {                              
370     fRestOfLine << " / \""                        
371          << solid.GetName()                       
372          << "\"("                                 
373          << solid.GetEntityType() << ")";         
374   }                                               
375                                                   
376   if (detail >= 3) {                              
377     fRestOfLine << ", "                           
378     << G4BestUnit(((G4VSolid&)solid).GetCubicV    
379     << ", ";                                      
380     if (pCurrentMaterial) {                       
381       fRestOfLine                                 
382   << G4BestUnit(pCurrentMaterial->GetDensity()    
383   << " (" << pCurrentMaterial->GetName() << ")    
384     } else {                                      
385       fRestOfLine << "(No material)";             
386     }                                             
387   }                                               
388                                                   
389   if (detail >= 5) {                              
390     if (pCurrentMaterial) {                       
391       G4Material* pMaterial = const_cast<G4Mat    
392       // ...and find daughter-subtracted mass.    
393       G4double daughter_subtracted_mass = pCur    
394   (pCurrentPV->IsParameterised(),  // Force if    
395    false,  // Do not propagate - calculate for    
396    // volume of daughters.                        
397    pMaterial);                                    
398       G4double daughter_subtracted_volume =       
399   daughter_subtracted_mass / pCurrentMaterial-    
400       fRestOfLine << ", "                         
401       << G4BestUnit(daughter_subtracted_volume    
402       << ", "                                     
403       << G4BestUnit(daughter_subtracted_mass,"    
404     }                                             
405   }                                               
406                                                   
407   if (detail >= 6) {                              
408     std::vector<G4AttValue>* attValues = pPVMo    
409     const std::map<G4String,G4AttDef>* attDefs    
410     fRestOfLine << '\n' << G4AttCheck(attValue    
411     delete attValues;                             
412   }                                               
413                                                   
414   if (detail >= 7) {                              
415     G4Polyhedron* polyhedron = solid.GetPolyhe    
416     fRestOfLine << "\nLocal polyhedron coordin    
417     const G4Transform3D& transform = pPVModel-    
418     polyhedron->Transform(transform);             
419     fRestOfLine << "\nGlobal polyhedron coordi    
420   }                                               
421                                                   
422   if (fLVSet.find(pCurrentLV) == fLVSet.end())    
423     fLVSet.insert(pCurrentLV);  // Record new     
424   }                                               
425                                                   
426   fRestOfLine << std::endl;                       
427                                                   
428   return;                                         
429 }                                                 
430