Geant4 Cross Reference |
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 // G4LocatorChangeLogger class implementation 27 // 28 // Author: John Apostolakis, 04.09.19 - First 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 G4LocatorChan 43 { 44 return logger.StreamInfo(os); 45 } 46 47 // ------------------------------------------- 48 // Stream object contents to an output stream 49 // 50 std::ostream& G4LocatorChangeLogger::StreamInf 51 { 52 G4long oldprc = os.precision(16); 53 G4LocatorChangeRecord::ReportVector( os, thi 54 os.precision(oldprc); 55 return os; 56 } 57 58 // ------------------------------------------- 59 // Print the changes in start, end points in 60 // 61 std::ostream& G4LocatorChangeLogger::ReportEnd 62 const G 63 const G 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: 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.si 95 endB[ endB.size 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)even 106 { 107 auto codeLocA= (*itrecA).GetLocation() 108 109 os << G4endl; 110 os << setw( 7 ) << eventA << " " 111 << setw( 4 ) << (*itrecA).GetIterat 112 << setw( 3 ) << codeLocA << " " 113 << setw( 15 ) 114 << G4LocatorChangeRecord::GetNameCh 115 << setw( prec+9 ) << (*itrecA).GetL 116 << setw( prec+9 ) << (*itrecB).GetL 117 if( confirm ) 118 { 119 os << setw( 4 ) << (*itrecB).GetIter 120 << setw( 15 ) << (*itrecB).GetLoc 121 } 122 } 123 else 124 { 125 if ( (G4int)eventA > prevA ) 126 { 127 auto codeLocA= (*itrecA).GetLocation 128 os << G4endl; 129 os << setw( 7 ) << (*itrecA).GetCoun 130 << setw( 4 ) << (*itrecA).GetIter 131 << setw( 3 ) << codeLocA << " " 132 << setw( 15 ) 133 << G4LocatorChangeRecord::GetName 134 << setw( prec+9 ) << (*itrecA).Ge 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).GetIter 145 << setw( 3 ) << codeLocB << " " 146 << setw( 15 ) 147 << G4LocatorChangeRecord::GetName 148 << setw( prec+9 ) << " " << 149 << setw( prec+9 ) << (*itrecB).Ge 150 } 151 } 152 153 prevA= eventA; 154 prevB= eventB; 155 156 auto nextA= itrecA; 157 auto nextB= itrecB; 158 159 G4int nextAct = maxEvent, nextBct = maxEv 160 ++nextA; 161 ++nextB; 162 if ( nextA != startA.end() ) { nextAct = 163 if ( nextB != endB.end() ) { nextBct = 164 165 isLastA= ( nextA >= startA.end() ); 166 isLastB= ( nextB >= endB.end() ); 167 168 advanceA= ( nextAct <= nextBct ) && !isLa 169 advanceB= ( nextBct <= nextAct ) && !isLa 170 171 if( advanceA ) 172 { 173 ++itrecA; 174 eventA = isLastA ? maxEvent : (*itrecA 175 } 176 177 if( advanceB ) 178 { 179 ++itrecB; 180 eventB = isLastB ? maxEvent : (*itrecB 181 } 182 183 // Checks 184 if( isLastA != ( nextA == startA.end() ) 185 { 186 os << G4endl; 187 os << " Checking isLastA= " << isLast 188 << " vs expected : " << ( itrecA = 189 os << " BAD --- ERROR " << G4endl; 190 } 191 if( isLastB != ( nextB == endB.end() ) ) 192 { 193 os << G4endl; 194 os << " Checking isLastB= " << isLast 195 << " vs expected : " << ( itrecB = 196 os << " BAD --- ERROR " << G4endl; 197 } 198 } while ( ! ( isLastA && isLastB ) ); 199 200 os << G4endl; 201 os.precision(oldprc); 202 return os; 203 } 204