44from sys import exit
55from glob import glob
66import re
7+ from math import sqrt , log10 , floor
78import numpy as np
89import ROOT
910ROOT .PyConfig .IgnoreCommandLineOptions = True
1011
1112def Print (vals , ttype ):
1213 data = np .array (vals )
13- print ("%s: %.5g stdev: %.5g" % (ttype , np .average (data ), np .std (data )))
14+ n = len (data )
15+ print ("%s: %.5g ± %.5g sec" % (ttype , np .average (data ), np .std (data )/ sqrt (n )))
1416
1517def get (fname , ttype ):
1618 if ttype == "average" :
@@ -36,31 +38,40 @@ def get(fname, ttype):
3638 except ValueError :
3739 print (f"Can't convert \" { val } \" to float" )
3840 raise
39- raise NameError ( f"String \" { sss } \" not found in { fname } " )
41+ return None
4042
4143def main ():
4244 """ Print/draw the CPU time statistics based on the FLUKA output files"""
4345
4446 parser = argparse .ArgumentParser (description = main .__doc__ ,
4547 epilog = "Homepage: https://github.com/kbat/mc-tools" )
46- parser .add_argument ('-o' , dest = "out" , type = str , default = None , help = 'optional output file name' , required = False )
48+ parser .add_argument ('out' , type = str , nargs = "+" , help = 'List of FLUKA output file(s)' )
49+ parser .add_argument ('-o' , dest = "pdf" , type = str , default = None , help = 'optional output PDF file name' , required = False )
4750 parser .add_argument ('-n' , dest = "N" , type = int , default = 10 , help = 'number of histogram bins (make sense with the -o option only)' , required = False )
4851 parser .add_argument ('-v' , '--verbose' , action = 'store_true' , default = False , dest = 'verbose' , help = 'explain what is being done' )
4952
5053 args = parser .parse_args ()
5154
55+ if args .pdf and not args .pdf .endswith (".pdf" ):
56+ print (f"Error: PDF file name is expected: { args .pdf } " )
57+ return 1
58+
5259 avals = []
5360 mvals = []
5461
55- for fname in glob ("*.out" ):
56- avals .append (get (fname , "average" ))
57- mvals .append (get (fname , "maximum" ))
62+ for fname in args .out :
63+ aval = get (fname , "average" )
64+ if aval is not None :
65+ mval = get (fname , "maximum" )
66+ if mval is not None :
67+ avals .append (aval )
68+ mvals .append (mval )
5869
5970 Print (avals , "Average" )
6071 Print (mvals , "Maximum" )
6172 print ("TODO: take into account weight reported in Total number of primaries run" )
6273
63- if args .out :
74+ if args .pdf :
6475
6576 ha = ROOT .TH1F ("ha" , "Average;Time [s];Number of runs" , args .N , min (avals )* 0.99 , max (avals )* 1.01 )
6677 hm = ROOT .TH1F ("hm" , "Maximum;Time [s];Number of runs" , args .N , min (mvals )* 0.99 , max (mvals )* 1.01 )
@@ -72,10 +83,10 @@ def main():
7283 hm .Fill (v )
7384
7485 ha .Draw ("hist e" )
75- ROOT .gPad .Print ("%s(" % args .out )
86+ ROOT .gPad .Print ("%s(" % args .pdf )
7687
7788 hm .Draw ("hist e" )
78- ROOT .gPad .Print ("%s)" % args .out )
89+ ROOT .gPad .Print ("%s)" % args .pdf )
7990
8091if __name__ == "__main__" :
8192 exit (main ())
0 commit comments