35 using namespace lcio ;
71 {
"verbose", no_argument, NULL,
'v' },
72 {
"pedantic", no_argument, NULL,
'p' },
73 {
"average", no_argument, NULL,
'a' },
74 {
"startevent", required_argument, NULL,
's' },
75 {
"maxevents", required_argument, NULL,
'n' },
76 {
"expelements", required_argument, NULL,
'x' },
77 {
"minelements", required_argument, NULL,
'm' },
78 {
"maxelements", required_argument, NULL,
'M' },
79 {
"abselementerror", required_argument, NULL, 0 },
80 {
"abseventerror", required_argument, NULL, 0 },
81 {
"relelementerror", required_argument, NULL, 0 },
82 {
"releventerror", required_argument, NULL, 0 },
83 {
"help", no_argument, NULL,
'h' },
84 { NULL, no_argument, NULL, 0 }
94 msg <<
endl <<
"error: " << errmsg <<
endl ;
99 <<
"lcio tool for checking an expected number of elements in lcio file(s) from a given collection name"
101 <<
" use: " << progName <<
" [OPTIONS] COLLECTION_NAME INPUT_FILE(S)"
105 <<
" -v, --verbose : increase verbosity (use -vvv for debugging)"
107 <<
" -p, --pedantic : events which contain no elements are counted as failed events and"
109 <<
" not ignored for calculating the average number of elements"
111 <<
" -a, --average : use this option to check the average number of elements instead of treating events individually"
113 <<
" -s, --startevent : start event number (default = 0)"
115 <<
" -n, --maxevents : maximum number of events (default = all events)"
117 <<
" -m, --minelements : if set this value is used as the absolute minimum number of elements (*)"
119 <<
" -M, --maxelements : if set this value is used as the absolute maximum number of elements (*)"
121 <<
" -x, --expelements : expected number of elements +- error , if no error is given the exact value is expected!"
123 <<
" --abselementerror : absolute error for elements, e.g. if expelements = 100 and abselementerror = 3, valid range will be [97-103]"
125 <<
" --relelementerror : relative error for elements, e.g. if expelements = 100 and relelementerror = 0.1, valid range will be [90 - 110]"
127 <<
" --abseventerror : absolute error for events, e.g. abseventerror = 3 means that at most 3 events may fail (**)"
129 <<
" --releventerror : relative error for events, e.g. releventerror = 0.1 means that at most 10% of the total events may fail (**)"
131 <<
" (*) --minelements and --maxelements options always have priority over other options!"
133 <<
" (**) --abseventerror and --releventerror options are both influenced by --pedantic option, i.e."
135 <<
" not only the events which fail the checking of elements are counted as failed, "
137 <<
" but also the ones which do not contain any elements."
141 <<
" display stats for MCParticle collections found in simjobs.slcio:"
143 <<
" " << progName <<
" MCParticle simjob.slcio"
145 <<
" check that MCParticle collections in simjob.slcio contain exactly 101 elements in all events:"
147 <<
" " << progName <<
" --expelements 101 MCParticle simjob.slcio"
149 <<
" check that the average number of elements from the MCParticle collections in simjob.slcio lies between [99-101]"
151 <<
" # note that --abselementerror 1 can be left out as checking for the exact average doesn't really make much sense.."
153 <<
" " << progName <<
" -a --expelements 100 --abselementerror 1 MCParticle simjob.slcio"
155 <<
" check that MCParticle collections in simjob.slcio contain 100 +- 3% elements in all events --> [97-103]:"
157 <<
" " << progName <<
" --expelements 100 --relelementerror .03 MCParticle simjob.slcio"
159 <<
" check that MCParticle collections in simjob.slcio and recjob.slcio contain 100 +- 1 element where 10 events may fail the check:"
161 <<
" " << progName <<
" --expelements 100 --abselementerror 1 --abseventerror 10 MCParticle simjob.slcio recjobs.slcio"
163 <<
" check that MCParticle collections in simjob.slcio and recjob.slcio contain 100 +- 1 element where half the events may fail the check:"
165 <<
" " << progName <<
" --expelements 100 --abselementerror 1 --releventerror .5 MCParticle simjob.slcio recjobs.slcio"
169 exit( EXIT_FAILURE );
175 cout <<
"-----------------------------------" <<
endl ;
177 cout <<
"-----------------------------------" <<
endl ;
194 cout <<
"-----------------------------------" <<
endl ;
202 int main(
int argc,
char** argv ){
257 display_usage( argv[0],
"invalid option: startevent must be >= 0" );
266 display_usage( argv[0],
"invalid option: maxevents must be >= 1" );
275 display_usage( argv[0],
"invalid option: expelements must be > 1" );
284 display_usage( argv[0],
"invalid option: minelements must be > 1" );
293 display_usage( argv[0],
"invalid option: maxelements must be > 1" );
307 display_usage( argv[0],
"invalid option: abselementerror must be > 1" );
317 display_usage( argv[0],
"invalid option: abseventerror must be > 1" );
327 display_usage( argv[0],
"invalid option: 0 < relelementerror < 1 , (e.g.: 0.3)" );
337 display_usage( argv[0],
"invalid option: 0 < releventerror < 1 , (e.g.: 0.3)" );
367 display_usage( argv[0],
"abselementerror and relelementerror options are mutually exclusive" );
372 display_usage( argv[0],
"abseventerror and releventerror options are mutually exclusive" );
377 display_usage( argv[0],
"average option cannot be used in conjunction with abseventerror or releventerror options" );
452 display_usage( argv[0],
"expelements option must be set if using abselementerror or relelementerror" );
459 display_usage( argv[0],
"maxelements must be > minelements" );
485 LCReader*
lcReader = LCFactory::getInstance()->createLCReader() ;
487 lcReader->open( inputFilesVec ) ;
494 LCEvent*
event = NULL ;
495 LCCollection* elements = NULL ;
499 while( (
event = lcReader->readNextEvent()) != 0 )
505 catch( lcio::DataNotAvailableException& e )
512 if( elements != NULL )
514 int nelements = elements->getNumberOfElements() ;
551 catch( lcio::IOException& e )
554 cerr <<
"io error when reading data : " << e.what() <<
endl ;
588 cout <<
"-----------------------------------------------------------" <<
endl ;
606 return EXIT_FAILURE ;
611 cerr <<
"no events were found!" <<
endl ;
612 return EXIT_FAILURE ;
617 cout <<
"-----------------------------------------------------------" <<
endl ;
623 return EXIT_FAILURE ;
628 return EXIT_FAILURE ;
635 return EXIT_FAILURE ;
static const char * optString
int main(int argc, char **argv)
Simple program that opens existing LCIO files and appends the records needed for direct access - if t...
static struct option longOpts[]
void display_usage(const char *progName, const std::string &errmsg="")
static const int min_args