Geant4 Cross Reference |
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