Does the exercise itself.
29 {
31
32 if ( argc != 2 )
33 {
34 std::cerr << "usage: " << argv[0] << " <test-file>" << std::endl;
35 std::exit( 1 );
36 }
37
38
39 double cpu_time_used = 0;
40 double validation_cpu_time = 0;
41 uint32_t info_read = 0;
42 uint32_t dummy = 0;
43 uint32_t robs_read = 0;
44 uint32_t ros_counter = 0;
45 uint32_t event_counter = 0;
46 RealTimeClock my_clock;
47
48
49 std::fstream in( argv[1], std::ios::in | std::ios::binary );
50 if ( !in )
51 {
52 std::cerr << "File `" << argv[1] << "' does not exist?!" << std::endl;
53 std::exit( 1 );
54 }
55 size_t offset = 0;
56
57#ifdef PAGED_MEMORY
58 std::cout <<
"Working with paged storage with page size = " <<
PAGE_SIZE << std::endl;
59#else
60 std::cout << "Working with contiguous storage." << std::endl;
61#endif
62
63 while ( in && in.good() && !in.eof() )
64 {
65
67 in.read( (
char*)
data, 8 );
68 if ( !in.good() || in.eof() ) break;
70 {
71
72 std::cout <<
"Word at offset " <<
HEX( offset ) <<
" is not "
74 std::exit( 1 );
75 }
76
77#ifdef PAGED_MEMORY
78
79 in.seekg( offset );
80
81 size_t to_read =
data[1] << 2;
82 size_t page_counter = 0;
83
85 while ( to_read > 0 )
86 {
88 in.read( (char*)paged_event[page_counter], readnow );
89 to_read -= readnow;
90 ++page_counter;
91
92 }
93
95 for ( size_t i = 0; i < page_counter; ++i )
96 {
97 myvec[i].iov_base = paged_event[i];
99 }
100
101 myvec[page_counter - 1].iov_len =
data[1] << 2 - ( page_counter - 1 ) *
PAGE_SIZE;
103#else
104 in.seekg( offset );
106 in.read( (
char*)event,
data[1] << 2 );
107#endif
108
109 offset +=
data[1] << 2;
110
111 try
112 {
113#ifdef PAGED_MEMORY
115 mem.begin() );
117#else
119 typedef const uint32_t* pointer_t;
120#endif
121
122 fe.check_tree();
123 ++event_counter;
124
125 Time start = my_clock.time();
126
127
128 pointer_t sdp[64];
129 uint32_t nsd = fe.children( sdp, 64 );
130 for ( size_t i = 0; i < nsd; ++i )
131 {
133
134 pointer_t rosp[256];
135 uint32_t nros = sd.children( rosp, 256 );
136 for ( size_t j = 0; j < nros; ++j )
137 {
139 ++ros_counter;
140
141 pointer_t robp[2048];
142 uint32_t nrob = ros.children( robp, 2048 );
143 for ( size_t k = 0; k < nrob; ++k )
144 {
146 dummy += rob.rod_lvl1_id();
147 ++info_read;
148 ++robs_read;
149 }
150 }
151 }
152
153 Time end = my_clock.time();
154 Time diff = end - start;
155 cpu_time_used += diff.as_nanoseconds();
156 start = my_clock.time();
157 end = my_clock.time();
158 diff = end - start;
159 validation_cpu_time += diff.as_microseconds();
160
161
162
163 }
164
166 {
167 std::cerr << std::endl <<
"Uncaught eformat exception: " << ex.
what() << std::endl;
168 }
169
171 {
172 std::cerr << std::endl <<
"Uncaught ERS exception: " << ex.
what() << std::endl;
173 }
174
175 catch ( std::exception& ex )
176 {
177 std::cerr << std::endl << "Uncaught std exception: " << ex.what() << std::endl;
178 }
179
180 catch ( ... )
181 { std::cerr << std::endl << "Uncaught unknown exception" << std::endl; }
182
183 }
184
185 std::cout << " Statistics for ROB Header access:" << std::endl;
186 std::cout << " ---------------------------------" << std::endl;
187 std::cout << " - Total reading time: " << cpu_time_used / 1e6 << " milisecs" << std::endl;
188 std::cout << " - Reading time per Event (" << event_counter
189 << "): " << cpu_time_used / ( event_counter * 1e3 ) << " usecs" << std::endl;
190 std::cout << " - Reading time per ROS (" << ros_counter
191 << "): " << cpu_time_used / ( ros_counter * 1e3 ) << " usecs" << std::endl;
192 std::cout << " - Reading time per ROB (" << robs_read
193 << "): " << cpu_time_used / ( robs_read ) << " nanosecs" << std::endl;
194 std::cout << " - Reading time per info (" << info_read
195 << "): " << cpu_time_used / ( info_read ) << " nanosecs" << std::endl;
196 std::cout << " - Validation per event (after header access): "
197 << validation_cpu_time / ( event_counter ) << " microseconds" << std::endl;
198
199 std::exit( 0 );
200}
const char * what() const
Human description message.