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 // G4LocatorChangeRecord class implementation 27 // 28 // Author: John Apostolakis, 28.08.19 - First 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 t 39 // 40 const char * G4LocatorChangeRecord::fNameChang 41 { "Invalid", "Unknown", "Initialising", "Int 42 "NoIntersections-AForFB", "RecalculatedB" 43 "InsertingMidPoint", "RecalculatedB-2ndHal 44 "Level Pop" }; 45 46 // ------------------------------------------- 47 // 48 std::ostream& G4LocatorChangeRecord::ReportVec 49 50 const std::vector<G4Loc 51 { 52 using std::setw; 53 G4int prec= 16; 54 if( vecRec.empty() ) 55 { 56 os << "Locator Change Record for " << nam 57 return os; 58 } 59 60 G4long oldprc = os.precision(prec); 61 62 // std::vector<G4LocatorChangeRecord>::const 63 auto itRec 64 = std::vector<G4LocatorChangeRecord>::con 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() << 80 << setw( 4 ) << (*itRec).GetIteration( 81 << std::left 82 << setw( prec+9 ) << (*itRec).GetLengt 83 << setw( 2 ) << locationCode << " " 84 << setw( 15 ) << fNameChangeLocation[ 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> & 102 const std::vector<G4LocatorChangeRecord> & 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_it 110 itrecA= startA.begin(); 111 itrecB= endB.begin(); 112 os << G4endl; 113 os << "===================================== 114 os << G4endl << " ** Change records: " << G4 115 os << " * endPoints A (start) and B (en 116 os << " * Sizes of change records: star 117 << " end(B) : " << endB.size() << G4en 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.si 137 endB[ endB.size 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)even 148 { 149 auto codeLocA= (*itrecA).GetLocation() 150 151 os << G4endl; 152 os << setw( 7 ) << eventA << " " 153 << setw( 4 ) << (*itrecA).GetIterat 154 << setw( 3 ) << codeLocA << " " 155 << setw( 15 ) << fNameChangeLocatio 156 << setw( prec+9 ) << (*itrecA).GetL 157 << setw( prec+9 ) << (*itrecB).GetL 158 if( confirm ) 159 { 160 os << setw( 4 ) << (*itrecB).GetIter 161 << setw( 15 ) << (*itrecB).GetLoc 162 } 163 } 164 else 165 { 166 if ( (G4int)eventA > prevA ) 167 { 168 auto codeLocA = (*itrecA).GetLocati 169 os << G4endl; 170 os << setw( 7 ) << (*itrecA).GetCou 171 << setw( 4 ) << (*itrecA).GetIte 172 << setw( 3 ) << codeLocA << " " 173 << setw( 15 ) << fNameChangeLoca 174 << setw( prec+9 ) << (*itrecA).G 175 << setw( prec+9 ) << " " < 176 } 177 else 178 { 179 // assert( (G4int)eventB > prevB ); 180 auto codeLocB = (*itrecB).GetLocati 181 182 os << G4endl; 183 os << setw( 7 ) << eventB << " " 184 << setw( 4 ) << (*itrecB).GetIte 185 << setw( 3 ) << codeLocB << " " 186 << setw( 15 ) << fNameChangeLoca 187 << setw( prec+9 ) << " " < 188 << setw( prec+9 ) << (*itrecB).G 189 } 190 } 191 192 prevA= eventA; 193 prevB= eventB; 194 195 auto nextA= itrecA; 196 auto nextB= itrecB; 197 198 G4int nextAct = maxEvent, nextBct = maxEv 199 ++nextA; 200 ++nextB; 201 if ( nextA != startA.end() ) { nextAct = 202 if ( nextB != endB.end() ) { nextBct = 203 204 isLastA= ( nextA >= startA.end() ); 205 isLastB= ( nextB >= endB.end() ); 206 207 advanceA= ( nextAct <= nextBct ) && !isLa 208 advanceB= ( nextBct <= nextAct ) && !isLa 209 210 if( advanceA ) 211 { 212 ++itrecA; 213 if( !isLastA ) { eventA = (*itrecA).Ge 214 else { eventA = maxEvent; } 215 } 216 217 if( advanceB ) 218 { 219 ++itrecB; 220 if( !isLastB ) { eventB = (*itrecB).Ge 221 else { eventB = maxEvent; } 222 } 223 224 // Checks 225 if( isLastA != ( nextA == startA.end() ) 226 { 227 os << G4endl; 228 os << " Checking isLastA= " << isLast 229 << ( itrecA == startA.end() ); 230 os << " BAD --- ERROR " << G4endl; 231 } 232 if( isLastB != ( nextB == endB.end() ) ) 233 { 234 os << G4endl; 235 os << " Checking isLastB= " << isLast 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, c 251 { 252 return e.StreamInfo(os); 253 } 254 255 // ------------------------------------------- 256 // Stream object contents to an output stream 257 // 258 std::ostream& G4LocatorChangeRecord::StreamInf 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< 274 { 275 G4LocatorChangeRecord::ReportVector( os, "", 276 return os; 277 } 278 279 // ------------------------------------------- 280 // 281 const char *G4LocatorChangeRecord::GetNameChan 282 { 283 return fNameChangeLocation[loc]; 284 } 285