HepMC3 event record library
ValidationControl.cc
1// -*- C++ -*-
2//
3// This file is part of HepMC
4// Copyright (C) 2014-2019 The HepMC collaboration (see AUTHORS for details)
5//
6#include "ValidationControl.h"
7#include "OutputValidationTool.h"
8#include "SimpleEventTool.h"
9
10#ifdef PHOTOSPP
11#include "PhotosValidationTool.h"
12#endif
13
14#ifdef TAUOLAPP
15#include "TauolaValidationTool.h"
16#endif
17
18#ifdef MCTESTER
19#include "McTesterValidationTool.h"
20#endif
21
22#ifdef PYTHIA8
23#include "PythiaValidationTool.h"
24#endif
25
26#include <fstream>
27#include <cstdio>
28
30 m_events(0),
31 m_momentum_check_events(0),
32 m_momentum_check_threshold(10e-6),
33 m_print_events(0),
34 m_event_counter(0),
35 m_status(-1),
36 m_timer("processing time"),
37 m_has_input_source(0) {
38}
39
41 for (std::vector<ValidationTool *>::iterator t=m_toolchain.begin(); t!=m_toolchain.end(); ++t)
42 delete *t;
43}
44
45void ValidationControl::read_file(const std::string &filename) {
46
47 // Open config file
48 std::ifstream in(filename.c_str());
49
50 if(!in.is_open()) {
51 printf("ValidationControl: error reading config file: %s\n",filename.c_str());
52 m_status = -1;
53 return;
54 }
55 else printf("ValidationControl: parsing config file: %s\n",filename.c_str());
56
57 // Parse config file
58 char buf[256];
59 int line = 0;
60
61 while(!in.eof()) {
62 PARSING_STATUS status = PARSING_OK;
63 ++line;
64
65 in >> buf;
66
67 if( strlen(buf) < 3 || buf[0] == ' ' || buf[0] == '#' ) {
68 in.getline(buf,255);
69 continue;
70 }
71
72 // Parse event number
73 if( strncmp(buf,"EVENTS",6)==0 ) {
74 in>>m_events;
75 }
76 // Parse input source
77 else if( strncmp(buf,"INPUT",5)==0 ) {
78 in >> buf;
79
80 if( m_has_input_source ) status = ADDITIONAL_INPUT;
81 else {
82 ValidationTool *input = NULL;
83 // Use tool as input source
84 if( strncmp(buf,"SimpleEvent",11)==0 ) {
85 input = new SimpleEventTool();
86 }
87 else if( strncmp(buf,"pythia8",7)==0) {
88#ifdef PYTHIA8
89 in >> buf;
90 input = new PythiaValidationTool(buf);
91#else
92 status = UNAVAILABLE_TOOL;
93#endif
94 }
95 else status = UNRECOGNIZED_INPUT;
96
97 if(!status) {
98 m_has_input_source = true;
99 m_toolchain.insert(m_toolchain.begin(),input);
100 }
101 }
102 }
103 // Parse tools used
104 else if( strncmp(buf,"TOOL",3)==0 ) {
105 in >> buf;
106 if ( strncmp(buf,"output",6)==0 ) {
107 m_toolchain.push_back( new OutputValidationTool(filename) );
108 }
109 else if ( strncmp(buf,"tauola",6)==0 ) {
110#ifdef TAUOLAPP
111 m_toolchain.push_back( new TauolaValidationTool() );
112#else
113 status = UNAVAILABLE_TOOL;
114#endif
115 }
116 else if( strncmp(buf,"photos",6)==0 ) {
117#ifdef PHOTOSPP
118 m_toolchain.push_back( new PhotosValidationTool() );
119#else
120 status = UNAVAILABLE_TOOL;
121#endif
122 }
123 else if( strncmp(buf,"mctester",8)==0 ) {
124#ifdef MCTESTER
125 m_toolchain.push_back( new McTesterValidationTool() );
126#else
127 status = UNAVAILABLE_TOOL;
128#endif
129 }
130 else status = UNRECOGNIZED_TOOL;
131 }
132 // Parse option
133 else if( strncmp(buf,"SET",3)==0 ) {
134 in >> buf;
135
136 if ( strncmp(buf,"print_events",12)==0 ) {
137 in >> buf;
138
139 int events = 0;
140 if( strncmp(buf,"ALL",3)==0 ) events = -1;
141 else events = atoi(buf);
142
143 print_events(events);
144 }
145 else if( strncmp(buf,"check_momentum",14)==0 ) {
146 in >> buf;
147
148 int events = 0;
149 if( strncmp(buf,"ALL",3)==0 ) events = -1;
150 else events = atoi(buf);
151
153 }
154 else status = UNRECOGNIZED_OPTION;
155 }
156 else status = UNRECOGNIZED_COMMAND;
157
158 // Error checking
159 if(status != PARSING_OK) printf("ValidationControl: config file line %i: ",line);
160
161 switch(status) {
162 case UNRECOGNIZED_COMMAND:
163 printf("skipping unrecognised command: '%s'\n",buf);
164 break;
165 case UNRECOGNIZED_OPTION:
166 printf("skipping unrecognised option: '%s'\n",buf);
167 break;
168 case UNRECOGNIZED_INPUT:
169 printf("skipping unrecognised input source: '%s'\n",buf);
170 break;
171 case UNRECOGNIZED_TOOL:
172 printf("skipping unrecognised tool: '%s'\n",buf);
173 break;
174 case UNAVAILABLE_TOOL:
175 printf("skipping unavailable tool: '%s'\n",buf);
176 break;
177 case ADDITIONAL_INPUT:
178 printf("skipping additional input source: '%s'\n",buf);
179 break;
180 case CANNOT_OPEN_FILE:
181 printf("skipping input file: '%s'\n",buf);
182 break;
183 default:
184 break;
185 }
186
187 // Ignore rest of the line
188 in.getline(buf,255);
189 }
190
191 // Having input source is enough to start validation
193 else printf("ValidationControl: no valid input source\n");
194}
195
197 if( m_status ) return false;
198 if( m_events && ( m_event_counter >= m_events ) ) return false;
199
200 if(m_event_counter) {
203 }
204 else m_timer.start();
205
207
208 if( m_events ) {
209 if( m_event_counter == 1 ) {
210 printf("ValidationControl: event 1 of %-7i\n",m_events);
212 }
213 else if( m_event_counter%m_events_print_step == 0 ) {
214 int elapsed = m_timer.elapsed_time();
215 m_timer.stop();
216 int total = m_timer.total_time();
217 printf("ValidationControl: event %7i (%6.2f%%, %7ims current, %7ims total)\n",m_event_counter,m_event_counter*100./m_events,elapsed,total);
218 m_timer.start();
219 }
220 }
221 else {
222 if( m_event_counter == 1 ) {
223 printf("ValidationControl: event 1\n");
224 m_events_print_step = 1000;
225 }
226 else if( m_event_counter%m_events_print_step == 0 ) {
227 int elapsed = m_timer.elapsed_time();
228 m_timer.stop();
229 int total = m_timer.total_time();
230 printf("ValidationControl: event %7i (%6ims current, %7ims total)\n",m_event_counter,elapsed,total);
231 m_timer.start();
232 }
233 }
234
235 return true;
236}
237
239 printf("ValidationControl: initializing\n");
240
241 for (std::vector<ValidationTool *>::iterator tool=m_toolchain.begin(); tool!=m_toolchain.end(); ++tool) (*tool)->initialize();
242}
243
245
246 m_status = 0;
247
248 FourVector input_momentum;
249 for (std::vector<ValidationTool *>::iterator tool=m_toolchain.begin(); tool!=m_toolchain.end(); ++tool) {
250
251 Timer *timer = (*tool)->timer();
252
253 if(timer) timer->start();
254 m_status = (*tool)->process(hepmc);
255 if(timer) timer->stop();
256
257 // status != 0 means an error - stop processing current event
258 if(m_status) return;
259
260 if((*tool)->tool_modifies_event() && m_print_events) {
261 printf("--------------------------------------------------------------\n");
262 printf(" Print event: %s\n",(*tool)->name().c_str());
263 printf("--------------------------------------------------------------\n");
264
265 HEPMC2CODE( hepmc.print(); )
266 HEPMC3CODE( Print::listing(hepmc,8); )
267 }
268
269 if((*tool)->tool_modifies_event() && m_momentum_check_events ) {
270 FourVector sum;
271 double delta = 0.0;
272
273 HEPMC2CODE(
274 for ( GenEvent::particle_const_iterator p = hepmc.particles_begin();
275 p != hepmc.particles_end(); ++p ) {
276 if( (*p)->status() != 1 ) continue;
277 FourVector m = (*p)->momentum();
278 sum.setPx( sum.px() + m.px() );
279 sum.setPy( sum.py() + m.py() );
280 sum.setPz( sum.pz() + m.pz() );
281 sum.setE ( sum.e() + m.e() );
282 }
283
284 double momentum = input_momentum.px() + input_momentum.py() + input_momentum.pz() + input_momentum.e();
285 if( fabs(momentum) > 10e-12 ) {
286 double px = input_momentum.px() - sum.px();
287 double py = input_momentum.py() - sum.py();
288 double pz = input_momentum.pz() - sum.pz();
289 double e = input_momentum.e() - sum.e();
290 delta = sqrt(px*px + py*py + pz*pz + e*e);
291 }
292 )
293
294 HEPMC3CODE(
295 for (auto p: hepmc.particles()) if( p->status() != 1 ) continue; else sum += p->momentum();
296 if(!input_momentum.is_zero()) delta = (input_momentum - sum).length();
297 )
298
299 printf("Momentum sum: %+15.8e %+15.8e %+15.8e %+15.8e (evt: %7i, %s)",sum.px(),sum.py(),sum.pz(),sum.e(),m_event_counter,(*tool)->name().c_str());
300
301 if( delta < m_momentum_check_threshold ) printf("\n");
302 else printf(" - WARNING! Difference = %+15.8e\n",delta);
303
304 input_momentum = sum;
305 }
306 }
307}
308
310 printf("ValidationControl: finalizing\n");
311
312 // Finalize
313 for (std::vector<ValidationTool *>::iterator t=m_toolchain.begin(); t!=m_toolchain.end(); ++t)
314 (*t)->finalize();
315
316 printf("ValidationControl: printing timers\n");
317
318 // Print timers
319 for (std::vector<ValidationTool *>::iterator t=m_toolchain.begin(); t!=m_toolchain.end(); ++t)
320 if((*t)->timer()) (*t)->timer()->print();
321
322
323 printf("ValidationControl: finished processing:\n");
324
325 // List tools
326 for (std::vector<ValidationTool *>::iterator t=m_toolchain.begin(); t!=m_toolchain.end(); ++t)
327 printf(" tool: %s\n",(*t)->long_name().c_str());
328
329}
Generic 4-vector.
Definition: FourVector.h:36
double e() const
Energy component of momentum.
Definition: FourVector.h:131
double pz() const
z-component of momentum
Definition: FourVector.h:124
bool is_zero() const
Check if the length of this vertex is zero.
Definition: FourVector.h:193
double px() const
x-component of momentum
Definition: FourVector.h:110
double py() const
y-component of momentum
Definition: FourVector.h:117
double length() const
Magnitude of spatial (x, y, z) 3-vector.
Definition: FourVector.h:146
Stores event-related information.
Definition: GenEvent.h:41
const std::vector< ConstGenParticlePtr > & particles() const
Get list of particles (const)
Definition: GenEvent.cc:39
static void listing(std::ostream &os, const GenEvent &event, unsigned short precision=2)
Print event in listing (HepMC2) format.
Definition: Print.cc:50
Interface to MCTester.
Interface for validatio to Pythia.
Interface for validatio to Photos.
Interface for validatio to Pythia.
Simple validation.
Interface for validatio to Tauola.
Used to benchmark MC generators.
Definition: Timer.h:38
int total_time()
Definition: Timer.h:55
void start()
Definition: Timer.h:44
void stop()
Definition: Timer.h:60
int elapsed_time()
Definition: Timer.h:49
bool new_event()
New event.
int m_event_counter
counter of events
void initialize()
Init function.
ValidationControl()
Constructor.
void process(GenEvent &hepmc)
Process event.
void finalize()
Finalize.
int m_events_print_step
events print step
bool m_has_input_source
Input source flag.
int m_print_events
print events
PARSING_STATUS
parsing stutus
~ValidationControl()
Destructor.
void print_events(int events)
N events to print.
std::vector< ValidationTool * > m_toolchain
Toolchain.
void check_momentum_for_events(int events)
N events to check momentum.
double m_momentum_check_threshold
mom check threshold
void read_file(const std::string &filename)
Read file.
int m_momentum_check_events
mom check events
Virtual Interface to validation tools.