Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4LocatorChangeLogger.cc
Go to the documentation of this file.
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
37
38// --------------------------------------------------------------------
39// Streaming operator dumping record
40//
41std::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//
50std::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//
61std::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 )
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 )
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 )
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}
std::ostream & operator<<(std::ostream &os, const G4LocatorChangeLogger &logger)
long G4long
Definition: G4Types.hh:87
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
std::ostream & StreamInfo(std::ostream &os) const
static std::ostream & ReportEndChanges(std::ostream &os, const G4LocatorChangeLogger &startA, const G4LocatorChangeLogger &endB)
static const char * GetNameChangeLocation(EChangeLocation)
static std::ostream & ReportVector(std::ostream &os, const std::string &nameOfRecord, const std::vector< G4LocatorChangeRecord > &lcr)