Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/navigation/src/G4LocatorChangeLogger.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 // G4LocatorChangeLogger class implementation
 27 //
 28 // Author: John Apostolakis, 04.09.19 - First version
 29 // --------------------------------------------------------------------
 30 
 31 #include <iostream>
 32 #include <iomanip>
 33 #include <locale>
 34 // #include <cassert>
 35 
 36 #include "G4LocatorChangeLogger.hh"
 37 
 38 // --------------------------------------------------------------------
 39 // Streaming operator dumping record 
 40 //
 41 std::ostream& operator<< ( std::ostream& os,
 42                            const G4LocatorChangeLogger& logger )
 43 {
 44   return logger.StreamInfo(os);
 45 }
 46       
 47 // --------------------------------------------------------------------
 48 // Stream object contents to an output stream
 49 //
 50 std::ostream& G4LocatorChangeLogger::StreamInfo(std::ostream& os) const
 51 {
 52   G4long oldprc = os.precision(16);
 53   G4LocatorChangeRecord::ReportVector( os, this->fName, *this );
 54   os.precision(oldprc);
 55   return os;
 56 }
 57 
 58 // --------------------------------------------------------------------
 59 //  Print the changes in start, end points in columns -- one event per row
 60 //
 61 std::ostream& G4LocatorChangeLogger::ReportEndChanges( std::ostream& os,
 62                                        const G4LocatorChangeLogger & startA,
 63                                        const G4LocatorChangeLogger & endB )
 64 {
 65   using std::setw;
 66   G4int prec= 16;
 67   const G4bool confirm = true;
 68   G4long oldprc = os.precision(prec);
 69 
 70   auto itrecA= startA.cbegin();
 71   auto itrecB= endB.cbegin();
 72 
 73   os << "====================================================================="
 74      << G4endl;
 75   os << "  Size of individual change record:  startA : " << startA.size() 
 76      << "  endB : " <<   endB.size() << G4endl;
 77   os << "====================================================================="
 78      << G4endl;
 79 
 80   os << setw( 7 ) << "Change#"  << "  "
 81      << setw( 4 ) << "Iter"  << "  "
 82      << setw( 20 ) << "CodeLocation"  << "  "
 83      << setw( prec+9 ) << "Length-A (start)" << "  " 
 84      << setw( prec+9 ) << "Length-B (end)" << "  "
 85      << G4endl;
 86   os << "=====================================================================";
 87 
 88   auto eventA = (*itrecA).GetCount();
 89   auto eventB = (*itrecB).GetCount();
 90 
 91   G4bool isLastA= false;
 92   G4bool isLastB= false;
 93 
 94   G4int maxEvent = std::max( startA[ startA.size() - 1 ].GetCount() ,
 95                              endB[   endB.size() - 1 ].GetCount() );
 96   G4int prevA = -1;
 97   G4int prevB = -1;  
 98 
 99   G4bool advanceA= false, advanceB= false;
100   do
101   {
102      advanceA= false;
103      advanceB= false;
104 
105      if( ((G4int)eventA>prevA) && ((G4int)eventB>prevB) )
106      {
107         auto codeLocA= (*itrecA).GetLocation();
108         
109         os << G4endl;                   
110         os << setw( 7 ) << eventA  << "  " 
111            << setw( 4 ) << (*itrecA).GetIteration()  << "  "
112            << setw( 3 ) << codeLocA << " " 
113            << setw( 15 )
114            << G4LocatorChangeRecord::GetNameChangeLocation( codeLocA ) << " "
115            << setw( prec+9 ) << (*itrecA).GetLength() << "  " 
116            << setw( prec+9 ) << (*itrecB).GetLength() << "  ";
117         if( confirm )
118         { 
119           os << setw( 4 ) << (*itrecB).GetIteration()  << "  "
120              << setw( 15 ) << (*itrecB).GetLocation();
121         }
122      }
123      else
124      {
125         if ( (G4int)eventA > prevA )
126         {
127           auto codeLocA= (*itrecA).GetLocation();           
128           os << G4endl;           
129           os << setw( 7 ) << (*itrecA).GetCount() << "  " 
130              << setw( 4 ) << (*itrecA).GetIteration()  << "  "
131              << setw( 3 ) << codeLocA << " " 
132              << setw( 15 )
133              << G4LocatorChangeRecord::GetNameChangeLocation( codeLocA ) << " "
134              << setw( prec+9 ) << (*itrecA).GetLength() << "  " 
135              << setw( prec+9 ) << "       " << "  ";
136         }
137         else
138         {
139           // assert( (G4int)eventB > prevB );
140           auto codeLocB= (*itrecB).GetLocation();
141            
142           os << G4endl;           
143           os << setw( 7 ) << eventB  << "  " 
144              << setw( 4 ) << (*itrecB).GetIteration()  << "  "
145              << setw( 3 ) << codeLocB << " " 
146              << setw( 15 )
147              << G4LocatorChangeRecord::GetNameChangeLocation( codeLocB ) << " "
148              << setw( prec+9 ) << "       " << "  "
149              << setw( prec+9 ) << (*itrecB).GetLength() << "  " ;           
150         }
151      }
152 
153      prevA= eventA;
154      prevB= eventB;
155      
156      auto nextA= itrecA;
157      auto nextB= itrecB;
158      
159      G4int nextAct = maxEvent, nextBct = maxEvent;
160      ++nextA;
161      ++nextB;
162      if ( nextA != startA.end() ) { nextAct = (*nextA).GetCount(); }
163      if ( nextB !=   endB.end() ) { nextBct = (*nextB).GetCount(); }
164 
165      isLastA=  ( nextA >= startA.end() );
166      isLastB=  ( nextB >=   endB.end() );
167      
168      advanceA= ( nextAct <= nextBct ) && !isLastA;
169      advanceB= ( nextBct <= nextAct ) && !isLastB;
170 
171      if( advanceA )
172      {
173         ++itrecA;
174         eventA = isLastA ? maxEvent : (*itrecA).GetCount();
175      }
176      
177      if( advanceB )
178      {
179         ++itrecB;
180         eventB = isLastB ? maxEvent : (*itrecB).GetCount();
181      }
182 
183      // Checks
184      if( isLastA !=  ( nextA == startA.end() ) )
185      {
186         os << G4endl;
187         os << "  Checking isLastA= " << isLastA
188            << " vs expected :  " << ( itrecA == startA.end() );
189         os << " BAD --- ERROR " << G4endl;
190      }
191      if( isLastB !=  ( nextB == endB.end() ) )
192      {
193         os << G4endl;        
194         os << "  Checking isLastB= " << isLastB
195            << " vs expected :  " << ( itrecB ==  endB.end() );        
196         os << " BAD --- ERROR " << G4endl;        
197      }       
198   } while ( ! ( isLastA && isLastB ) );
199   
200   os << G4endl;           
201   os.precision(oldprc);
202   return os;
203 }
204