Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4LocatorChangeLogger class implementation 26 // G4LocatorChangeLogger class implementation 27 // 27 // 28 // Author: John Apostolakis, 04.09.19 - First 28 // Author: John Apostolakis, 04.09.19 - First version 29 // ------------------------------------------- 29 // -------------------------------------------------------------------- 30 30 31 #include <iostream> 31 #include <iostream> 32 #include <iomanip> 32 #include <iomanip> 33 #include <locale> 33 #include <locale> 34 // #include <cassert> 34 // #include <cassert> 35 35 36 #include "G4LocatorChangeLogger.hh" 36 #include "G4LocatorChangeLogger.hh" 37 37 38 // ------------------------------------------- 38 // -------------------------------------------------------------------- 39 // Streaming operator dumping record 39 // Streaming operator dumping record 40 // 40 // 41 std::ostream& operator<< ( std::ostream& os, 41 std::ostream& operator<< ( std::ostream& os, 42 const G4LocatorChan 42 const G4LocatorChangeLogger& logger ) 43 { 43 { 44 return logger.StreamInfo(os); 44 return logger.StreamInfo(os); 45 } 45 } 46 46 47 // ------------------------------------------- 47 // -------------------------------------------------------------------- 48 // Stream object contents to an output stream 48 // Stream object contents to an output stream 49 // 49 // 50 std::ostream& G4LocatorChangeLogger::StreamInf 50 std::ostream& G4LocatorChangeLogger::StreamInfo(std::ostream& os) const 51 { 51 { 52 G4long oldprc = os.precision(16); << 52 G4int oldprc = os.precision(16); 53 G4LocatorChangeRecord::ReportVector( os, thi 53 G4LocatorChangeRecord::ReportVector( os, this->fName, *this ); 54 os.precision(oldprc); 54 os.precision(oldprc); 55 return os; 55 return os; 56 } 56 } 57 57 58 // ------------------------------------------- 58 // -------------------------------------------------------------------- 59 // Print the changes in start, end points in 59 // Print the changes in start, end points in columns -- one event per row 60 // 60 // 61 std::ostream& G4LocatorChangeLogger::ReportEnd 61 std::ostream& G4LocatorChangeLogger::ReportEndChanges( std::ostream& os, 62 const G 62 const G4LocatorChangeLogger & startA, 63 const G 63 const G4LocatorChangeLogger & endB ) 64 { 64 { 65 using std::setw; 65 using std::setw; 66 G4int prec= 16; 66 G4int prec= 16; 67 const G4bool confirm = true; 67 const G4bool confirm = true; 68 G4long oldprc = os.precision(prec); << 68 G4int oldprc = os.precision(prec); 69 69 70 auto itrecA= startA.cbegin(); 70 auto itrecA= startA.cbegin(); 71 auto itrecB= endB.cbegin(); 71 auto itrecB= endB.cbegin(); 72 72 73 os << "===================================== 73 os << "=====================================================================" 74 << G4endl; 74 << G4endl; 75 os << " Size of individual change record: 75 os << " Size of individual change record: startA : " << startA.size() 76 << " endB : " << endB.size() << G4endl 76 << " endB : " << endB.size() << G4endl; 77 os << "===================================== 77 os << "=====================================================================" 78 << G4endl; 78 << G4endl; 79 79 80 os << setw( 7 ) << "Change#" << " " 80 os << setw( 7 ) << "Change#" << " " 81 << setw( 4 ) << "Iter" << " " 81 << setw( 4 ) << "Iter" << " " 82 << setw( 20 ) << "CodeLocation" << " " 82 << setw( 20 ) << "CodeLocation" << " " 83 << setw( prec+9 ) << "Length-A (start)" < 83 << setw( prec+9 ) << "Length-A (start)" << " " 84 << setw( prec+9 ) << "Length-B (end)" << 84 << setw( prec+9 ) << "Length-B (end)" << " " 85 << G4endl; 85 << G4endl; 86 os << "===================================== 86 os << "====================================================================="; 87 87 88 auto eventA = (*itrecA).GetCount(); 88 auto eventA = (*itrecA).GetCount(); 89 auto eventB = (*itrecB).GetCount(); 89 auto eventB = (*itrecB).GetCount(); 90 90 91 G4bool isLastA= false; 91 G4bool isLastA= false; 92 G4bool isLastB= false; 92 G4bool isLastB= false; 93 93 >> 94 G4int jA=0, jB=0; >> 95 94 G4int maxEvent = std::max( startA[ startA.si 96 G4int maxEvent = std::max( startA[ startA.size() - 1 ].GetCount() , 95 endB[ endB.size 97 endB[ endB.size() - 1 ].GetCount() ); 96 G4int prevA = -1; 98 G4int prevA = -1; 97 G4int prevB = -1; 99 G4int prevB = -1; 98 100 99 G4bool advanceA= false, advanceB= false; 101 G4bool advanceA= false, advanceB= false; 100 do 102 do 101 { 103 { 102 advanceA= false; 104 advanceA= false; 103 advanceB= false; 105 advanceB= false; 104 106 105 if( ((G4int)eventA>prevA) && ((G4int)even 107 if( ((G4int)eventA>prevA) && ((G4int)eventB>prevB) ) 106 { 108 { 107 auto codeLocA= (*itrecA).GetLocation() 109 auto codeLocA= (*itrecA).GetLocation(); 108 110 109 os << G4endl; 111 os << G4endl; 110 os << setw( 7 ) << eventA << " " 112 os << setw( 7 ) << eventA << " " 111 << setw( 4 ) << (*itrecA).GetIterat 113 << setw( 4 ) << (*itrecA).GetIteration() << " " 112 << setw( 3 ) << codeLocA << " " 114 << setw( 3 ) << codeLocA << " " 113 << setw( 15 ) 115 << setw( 15 ) 114 << G4LocatorChangeRecord::GetNameCh 116 << G4LocatorChangeRecord::GetNameChangeLocation( codeLocA ) << " " 115 << setw( prec+9 ) << (*itrecA).GetL 117 << setw( prec+9 ) << (*itrecA).GetLength() << " " 116 << setw( prec+9 ) << (*itrecB).GetL 118 << setw( prec+9 ) << (*itrecB).GetLength() << " "; 117 if( confirm ) 119 if( confirm ) 118 { 120 { 119 os << setw( 4 ) << (*itrecB).GetIter 121 os << setw( 4 ) << (*itrecB).GetIteration() << " " 120 << setw( 15 ) << (*itrecB).GetLoc 122 << setw( 15 ) << (*itrecB).GetLocation(); 121 } 123 } 122 } 124 } 123 else 125 else 124 { 126 { 125 if ( (G4int)eventA > prevA ) 127 if ( (G4int)eventA > prevA ) 126 { 128 { 127 auto codeLocA= (*itrecA).GetLocation 129 auto codeLocA= (*itrecA).GetLocation(); 128 os << G4endl; 130 os << G4endl; 129 os << setw( 7 ) << (*itrecA).GetCoun 131 os << setw( 7 ) << (*itrecA).GetCount() << " " 130 << setw( 4 ) << (*itrecA).GetIter 132 << setw( 4 ) << (*itrecA).GetIteration() << " " 131 << setw( 3 ) << codeLocA << " " 133 << setw( 3 ) << codeLocA << " " 132 << setw( 15 ) 134 << setw( 15 ) 133 << G4LocatorChangeRecord::GetName 135 << G4LocatorChangeRecord::GetNameChangeLocation( codeLocA ) << " " 134 << setw( prec+9 ) << (*itrecA).Ge 136 << setw( prec+9 ) << (*itrecA).GetLength() << " " 135 << setw( prec+9 ) << " " << 137 << setw( prec+9 ) << " " << " "; 136 } 138 } 137 else 139 else 138 { 140 { 139 // assert( (G4int)eventB > prevB ); 141 // assert( (G4int)eventB > prevB ); 140 auto codeLocB= (*itrecB).GetLocation 142 auto codeLocB= (*itrecB).GetLocation(); 141 143 142 os << G4endl; 144 os << G4endl; 143 os << setw( 7 ) << eventB << " " 145 os << setw( 7 ) << eventB << " " 144 << setw( 4 ) << (*itrecB).GetIter 146 << setw( 4 ) << (*itrecB).GetIteration() << " " 145 << setw( 3 ) << codeLocB << " " 147 << setw( 3 ) << codeLocB << " " 146 << setw( 15 ) 148 << setw( 15 ) 147 << G4LocatorChangeRecord::GetName 149 << G4LocatorChangeRecord::GetNameChangeLocation( codeLocB ) << " " 148 << setw( prec+9 ) << " " << 150 << setw( prec+9 ) << " " << " " 149 << setw( prec+9 ) << (*itrecB).Ge 151 << setw( prec+9 ) << (*itrecB).GetLength() << " " ; 150 } 152 } 151 } 153 } 152 154 153 prevA= eventA; 155 prevA= eventA; 154 prevB= eventB; 156 prevB= eventB; 155 157 156 auto nextA= itrecA; 158 auto nextA= itrecA; 157 auto nextB= itrecB; 159 auto nextB= itrecB; 158 160 159 G4int nextAct = maxEvent, nextBct = maxEv 161 G4int nextAct = maxEvent, nextBct = maxEvent; 160 ++nextA; 162 ++nextA; 161 ++nextB; 163 ++nextB; 162 if ( nextA != startA.end() ) { nextAct = 164 if ( nextA != startA.end() ) { nextAct = (*nextA).GetCount(); } 163 if ( nextB != endB.end() ) { nextBct = 165 if ( nextB != endB.end() ) { nextBct = (*nextB).GetCount(); } 164 166 165 isLastA= ( nextA >= startA.end() ); 167 isLastA= ( nextA >= startA.end() ); 166 isLastB= ( nextB >= endB.end() ); 168 isLastB= ( nextB >= endB.end() ); 167 169 168 advanceA= ( nextAct <= nextBct ) && !isLa 170 advanceA= ( nextAct <= nextBct ) && !isLastA; 169 advanceB= ( nextBct <= nextAct ) && !isLa 171 advanceB= ( nextBct <= nextAct ) && !isLastB; 170 172 171 if( advanceA ) 173 if( advanceA ) 172 { 174 { 173 ++itrecA; 175 ++itrecA; >> 176 if( !isLastA ) { ++jA; } 174 eventA = isLastA ? maxEvent : (*itrecA 177 eventA = isLastA ? maxEvent : (*itrecA).GetCount(); 175 } 178 } 176 179 177 if( advanceB ) 180 if( advanceB ) 178 { 181 { 179 ++itrecB; 182 ++itrecB; >> 183 if( !isLastB ) { ++jB; } 180 eventB = isLastB ? maxEvent : (*itrecB 184 eventB = isLastB ? maxEvent : (*itrecB).GetCount(); 181 } 185 } 182 186 183 // Checks 187 // Checks 184 if( isLastA != ( nextA == startA.end() ) 188 if( isLastA != ( nextA == startA.end() ) ) 185 { 189 { 186 os << G4endl; 190 os << G4endl; 187 os << " Checking isLastA= " << isLast 191 os << " Checking isLastA= " << isLastA 188 << " vs expected : " << ( itrecA = 192 << " vs expected : " << ( itrecA == startA.end() ); 189 os << " BAD --- ERROR " << G4endl; 193 os << " BAD --- ERROR " << G4endl; 190 } 194 } 191 if( isLastB != ( nextB == endB.end() ) ) 195 if( isLastB != ( nextB == endB.end() ) ) 192 { 196 { 193 os << G4endl; 197 os << G4endl; 194 os << " Checking isLastB= " << isLast 198 os << " Checking isLastB= " << isLastB 195 << " vs expected : " << ( itrecB = 199 << " vs expected : " << ( itrecB == endB.end() ); 196 os << " BAD --- ERROR " << G4endl; 200 os << " BAD --- ERROR " << G4endl; 197 } 201 } 198 } while ( ! ( isLastA && isLastB ) ); 202 } while ( ! ( isLastA && isLastB ) ); 199 203 200 os << G4endl; 204 os << G4endl; 201 os.precision(oldprc); 205 os.precision(oldprc); 202 return os; 206 return os; 203 } 207 } 204 208