Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/navigation/src/G4LocatorChangeRecord.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 // G4LocatorChangeRecord class implementation
 27 //
 28 // Author: John Apostolakis, 28.08.19 - First version
 29 // --------------------------------------------------------------------
 30 
 31 #include <iostream>
 32 #include <iomanip>
 33 #include <locale>
 34 // #include <cassert>
 35 
 36 #include "G4LocatorChangeRecord.hh"
 37 
 38 // Must correspond exactly with the count of the enum EChangeLocation
 39 //
 40 const char * G4LocatorChangeRecord::fNameChangeLocation[] =
 41   { "Invalid", "Unknown", "Initialising", "IntersectsAF", "IntersectsFB",  // 5
 42     "NoIntersections-AForFB",  "RecalculatedB",         // 2
 43     "InsertingMidPoint", "RecalculatedB-2ndHalf",       // 2
 44     "Level Pop" };
 45 
 46 // --------------------------------------------------------------------
 47 // 
 48 std::ostream& G4LocatorChangeRecord::ReportVector ( std::ostream& os,
 49                                               const std::string & name,
 50                        const std::vector<G4LocatorChangeRecord> & vecRec )
 51 {
 52   using std::setw;
 53   G4int prec= 16;
 54   if( vecRec.empty() )
 55   {
 56      os << "Locator Change Record for " << name << "  is empty" << G4endl;
 57      return os;
 58   }
 59   
 60   G4long oldprc = os.precision(prec);
 61 
 62   // std::vector<G4LocatorChangeRecord>::const_iterator
 63   auto itRec
 64      = std::vector<G4LocatorChangeRecord>::const_iterator(vecRec.cbegin());
 65 
 66   os << setw( 7 ) << "Change#"  << "  " 
 67      << setw( 4 ) << "Iter"  << "  "
 68      << std::left
 69      << setw( prec+9 ) << "Length" << "  "
 70      << setw( 15 ) << "Code-Location"  << "  "
 71      << G4endl;
 72   os << "====================================================================="
 73      << G4endl;
 74   
 75   do
 76   {
 77      auto locationCode= (*itRec).GetLocation();
 78      os << std::internal
 79         << setw( 7 ) << (*itRec).GetCount() << "  "       // Event Count
 80         << setw( 4 ) << (*itRec).GetIteration()  << "  "
 81         << std::left
 82         << setw( prec+9 ) << (*itRec).GetLength() << "  "
 83         << setw( 2  ) << locationCode  << "  "  // location enum
 84         << setw( 15 ) << fNameChangeLocation[ locationCode ]
 85         << std::internal
 86         ;
 87      os << G4endl;
 88      ++itRec;
 89 
 90   } while ( itRec != vecRec.cend() );
 91 
 92   os.precision(oldprc);
 93   return os;
 94 }
 95 
 96 // --------------------------------------------------------------------
 97 // 
 98 std::ostream& 
 99 G4LocatorChangeRecord::ReportEndChanges (
100    std::ostream& os,
101    const std::vector<G4LocatorChangeRecord> & startA,
102    const std::vector<G4LocatorChangeRecord> &   endB )
103 {
104   using std::setw;   
105   G4int prec= 16;
106   const G4bool confirm = true;
107   G4long oldprc = os.precision(prec);
108 
109   std::vector<G4LocatorChangeRecord>::const_iterator itrecA, itrecB;
110   itrecA= startA.begin();
111   itrecB= endB.begin();
112   os << G4endl;
113   os << "=========================================================================================";
114   os << G4endl << " ** Change records: " << G4endl;
115   os << " *     endPoints  A (start) and B (end): combined changes of AB intervals" << G4endl;
116   os << " *     Sizes of change records:  start(A) : " << startA.size() 
117      << "  end(B) : " <<   endB.size() << G4endl;
118   os << "========================================================================================="    
119      << G4endl;
120 
121   os << setw( 7 ) << "Change#"  << "  "
122      << setw( 4 ) << "Iter"  << "  "
123      << setw( 20 ) << "CodeLocation"  << "  "
124      << setw( prec+9 ) << "Length-A (start)" << "  " 
125      << setw( prec+9 ) << "Length-B (end)" << "  "
126      << G4endl;  
127   os << "=====================================================================";
128 
129   
130   auto eventA = (*itrecA).GetCount();
131   auto eventB = (*itrecB).GetCount();
132 
133   G4bool isLastA= false;
134   G4bool isLastB= false;
135 
136   G4int maxEvent = std::max( startA[ startA.size() - 1 ].GetCount() ,
137                              endB[   endB.size() - 1 ].GetCount() );
138   G4int prevA = -1;
139   G4int prevB = -1;  
140 
141   G4bool advanceA= false, advanceB= false;
142   do
143   {
144      advanceA= false;
145      advanceB= false;
146 
147      if( ((G4int)eventA>prevA) && ((G4int)eventB>prevB) )
148      {
149         auto codeLocA= (*itrecA).GetLocation();
150         
151         os << G4endl;                   
152         os << setw( 7 ) << eventA  << "  " 
153            << setw( 4 ) << (*itrecA).GetIteration()  << "  "
154            << setw( 3 ) << codeLocA << " " 
155            << setw( 15 ) << fNameChangeLocation[ codeLocA ] << " " 
156            << setw( prec+9 ) << (*itrecA).GetLength() << "  " 
157            << setw( prec+9 ) << (*itrecB).GetLength() << "  ";
158         if( confirm )
159         { 
160           os << setw( 4 ) << (*itrecB).GetIteration()  << "  "
161              << setw( 15 ) << (*itrecB).GetLocation();
162         }
163      }
164      else
165      {
166         if ( (G4int)eventA > prevA )
167         {
168            auto codeLocA = (*itrecA).GetLocation();           
169            os << G4endl;           
170            os << setw( 7 ) << (*itrecA).GetCount() << "  " 
171               << setw( 4 ) << (*itrecA).GetIteration()  << "  "
172               << setw( 3 ) << codeLocA << " " 
173               << setw( 15 ) << fNameChangeLocation[ codeLocA ] << " "            
174               << setw( prec+9 ) << (*itrecA).GetLength() << "  " 
175               << setw( prec+9 ) << "       " << "  ";
176         }
177         else
178         {
179            // assert( (G4int)eventB > prevB );
180            auto codeLocB = (*itrecB).GetLocation();
181            
182            os << G4endl;           
183            os << setw( 7 ) << eventB  << "  " 
184               << setw( 4 ) << (*itrecB).GetIteration()  << "  "
185               << setw( 3 ) << codeLocB << " " 
186               << setw( 15 ) << fNameChangeLocation[ codeLocB ] << " "                          
187               << setw( prec+9 ) << "       " << "  "
188               << setw( prec+9 ) << (*itrecB).GetLength() << "  " ;           
189         }
190      }
191 
192      prevA= eventA;
193      prevB= eventB;
194      
195      auto nextA= itrecA;
196      auto nextB= itrecB;
197      
198      G4int nextAct = maxEvent, nextBct = maxEvent;
199      ++nextA;
200      ++nextB;
201      if ( nextA != startA.end() ) { nextAct = (*nextA).GetCount(); }
202      if ( nextB !=   endB.end() ) { nextBct = (*nextB).GetCount(); }
203 
204      isLastA=  ( nextA >= startA.end() );
205      isLastB=  ( nextB >=   endB.end() );
206      
207      advanceA= ( nextAct <= nextBct ) && !isLastA;
208      advanceB= ( nextBct <= nextAct ) && !isLastB;
209 
210      if( advanceA )
211      {
212         ++itrecA;
213         if( !isLastA ) { eventA = (*itrecA).GetCount(); }
214         else { eventA = maxEvent; }
215      }
216      
217      if( advanceB )
218      {
219         ++itrecB;
220         if( !isLastB ) { eventB = (*itrecB).GetCount(); } 
221         else { eventB = maxEvent; }
222      }
223 
224      // Checks
225      if( isLastA !=  ( nextA == startA.end() ) )
226      {
227         os << G4endl;
228         os << "  Checking isLastA= " << isLastA << " vs expected :  "
229            << ( itrecA == startA.end() );
230         os << " BAD --- ERROR " << G4endl;
231      }
232      if( isLastB !=  ( nextB == endB.end() ) )
233      {
234         os << G4endl;        
235         os << "  Checking isLastB= " << isLastB << " vs expected :  "
236            << ( itrecB ==  endB.end() );        
237         os << " BAD --- ERROR " << G4endl;        
238      }
239        
240   } while ( ! ( isLastA && isLastB ) );
241   
242   os << G4endl;           
243   os.precision(oldprc);
244   return os;
245 }
246 
247 // --------------------------------------------------------------------
248 // Streaming operator dumping record 
249 //
250 std::ostream& operator<< ( std::ostream& os, const G4LocatorChangeRecord& e )
251 {
252   return e.StreamInfo(os);
253 }
254       
255 // --------------------------------------------------------------------
256 // Stream object contents to an output stream
257 //
258 std::ostream& G4LocatorChangeRecord::StreamInfo(std::ostream& os) const
259 {
260   G4long oldprc = os.precision(16);
261   os << "  count = " << fEventCount
262      << "  iter= "   << fIteration
263      << "  Location code = " << fCodeLocation
264      << "  Length = " << GetLength() << G4endl;
265   os.precision(oldprc);
266   return os;
267 }
268 
269 // --------------------------------------------------------------------
270 // Streaming operator
271 //
272 std::ostream& operator << ( std::ostream& os,
273                             const std::vector<G4LocatorChangeRecord> & vecR )
274 {
275   G4LocatorChangeRecord::ReportVector( os, "", vecR );
276   return os;
277 }
278 
279 // --------------------------------------------------------------------
280 // 
281 const char *G4LocatorChangeRecord::GetNameChangeLocation( EChangeLocation loc )
282 {
283   return fNameChangeLocation[loc];
284 }
285