14     """Enable athena-specific command linea arguments""" 
   20     """Check filename extension and fill relevant options""" 
   21     def __call__(self, parser, args, values, option_string=None):
 
   22         scripts = [f  
for f 
in values 
if f[-3:] == 
'.py']
 
   23         pkls    = [f  
for f 
in values 
if f[-4:] == 
'.pkl']
 
   25         if (scripts 
and pkls) 
or len(pkls)>1:
 
   26             raise ValueError(
'Only job options or one pickle file is allowed')
 
   28         setattr(args, self.dest, scripts)
 
   29         args.fromdb = pkls[0] 
if pkls 
else None 
   33     """Enable Hepheastus""" 
   34     def __call__(self, parser, args, values, option_string=None):
 
   36         setattr(args, self.dest,
 
   37                 [] 
if values==
'all' else [values])
 
   40         import Hephaestus.MemoryTracker 
as memtrack  
 
   42         if option_string==
'--delete-check':
 
   43             args.memchk_mode = 
'delete-check' 
   44             import Hephaestus.DeleteChecker          
 
   46             args.memchk_mode = 
'leak-check' 
   50     """Custom help action to support flags""" 
   51     def __call__(self, parser, namespace, values, option_string=None):
 
   57             sys.argv = [
'athena.py', 
'--help']
 
   59                 sys.argv.append(values)
 
   60             runpy.run_module(
'AthenaConfiguration.AthNoop', run_name=
'__main__')
 
   67     from PyUtils.Helpers 
import release_metadata
 
   68     return (
'[%(project name)s-%(release)s] [%(platform)s] ' 
   69             '[%(nightly name)s/%(nightly release)s] -- built on [%(date)s]' % 
release_metadata())
 
   73     """Set required envirnoment variables based on command line""" 
   76     if opts.enable_ers_hdlr == 
'y':
 
   77         os.unsetenv(
'TDAQ_ERS_NO_SIGNAL_HANDLERS')
 
   79         os.environ[
'TDAQ_ERS_NO_SIGNAL_HANDLERS'] = 
'1' 
   81     os.environ[
'LIBC_FATAL_STDERR_'] = 
'1'   
   85     libname = 
'libtcmalloc'   
   87     if ( libname 
not in os.getenv(
'LD_PRELOAD',
'') 
and   
   88          os.getenv(
'USETCMALLOC') 
in (
'1', 
None) 
and     
   89          opts.do_leak_chk 
is None ):                    
 
   91         print (
'*******************************************************************************')
 
   92         print (
'WARNING: option --tcmalloc used or implied, but libtcmalloc.so not loaded.')
 
   93         print (
'         This is probably because you\'re using athena.py in a non standard way')
 
   94         print (
'         such as "python athena.py ..." or "nohup athena.py"')
 
   95         print (
'         If you wish to use tcmalloc, you will have to manually LD_PRELOAD it')
 
   96         print (
'*******************************************************************************')
 
  101     from AthenaCommon.AthenaCommonFlags 
import athenaCommonFlags
 
  103     if opts.filesInput 
is not None:
 
  106         for fe 
in opts.filesInput.split(
","):
 
  107             found = glob.glob(fe)
 
  109             files += found 
if found 
else [fe]
 
  111         athenaCommonFlags.FilesInput.set_Value_and_Lock(files)
 
  113     if opts.evtMax 
is not None:
 
  114         athenaCommonFlags.EvtMax.set_Value_and_Lock(opts.evtMax)
 
  116     if opts.skipEvents 
is not None:
 
  117         athenaCommonFlags.SkipEvents.set_Value_and_Lock(opts.skipEvents)
 
  121     """Configure CA from relevant command line arguments if running from pkl""" 
  124         acc.interactive = opts.interactive
 
  128             acc.getService(
'EventSelector').SkipEvents = opts.skipEvents
 
  133         acc.setDebugStage(opts.debug)
 
  136         from AthenaCommon 
import Constants
 
  137         acc.getService(
'MessageSvc').OutputLevel = getattr(Constants, opts.loglevel)
 
  141     """Create default argument parser""" 
  143     parser = argparse.ArgumentParser(formatter_class=
 
  144                                      lambda prog : argparse.HelpFormatter(
 
  145                                          prog, max_help_position=40, width=100),
 
  146                                      add_help=
False, **kwargs)
 
  148     parser.expert_groups = []   
 
  151     g = parser.add_argument_group(
'Main options')
 
  153     if __athenaCLI 
and legacy_args:
 
  154         g.add_argument(
'scripts', nargs=
'*', action=JobOptAction,
 
  155                        help=
'scripts or pickle file to run')
 
  157     g.add_argument(
'-l', 
'--loglevel', metavar=
'LVL', type=str.upper, default=
'INFO',
 
  158                    choices=[
'ALL', 
'VERBOSE', 
'DEBUG', 
'INFO', 
'WARNING', 
'ERROR', 
'FATAL'],
 
  159                    help=
'logging level: %(choices)s')
 
  161     g.add_argument(
'--filesInput', metavar=
'FILES',
 
  162                    help=
'set FilesInput property (comma-separated list with wildcards)')
 
  164     g.add_argument(
'--evtMax', metavar=
'N', type=int,
 
  165                    help=
'max number of events to process')
 
  167     g.add_argument(
'--skipEvents', metavar=
'N', type=int,
 
  168                    help=
'number of events to skip')
 
  170     g.add_argument(
'--nprocs', metavar=
'N', type=int,
 
  171                    help=
'enable AthenaMP if %(metavar)s>=1 or %(metavar)s==-1')
 
  173     g.add_argument(
'--threads', metavar=
'N', type=int,
 
  174                    help=
'number of threads for AthenaMT, threads per worker for athenaMP')
 
  176     g.add_argument(
'--concurrent-events', metavar=
'N', type=int,
 
  177                    help=
'number of concurrent events for AthenaMT')
 
  179     g.add_argument(
'--CA', action=
'store_true',
 
  180                    help=
'force ComponentAccumulator mode')
 
  182     g.add_argument(
'--config-only', metavar=
'FILE', nargs=
'?', default=
False, const=
True,
 
  183                    help=
'run only configuration and optionally store in %(metavar)s')
 
  185     g.add_argument(
'--mtes', action=
'store_true',
 
  186                    help=
'activate multi-threaded event service')
 
  188     g.add_argument(
'--mtes-channel', metavar=
'NAME', default=
'EventService_EventRanges',
 
  189                    help=
'yampl channel name between pilot and AthenaMT in event service mode')
 
  191     g.add_argument(
"--mpi", action=
"store_true", default=
None, help=
"activate MPI mode")
 
  193     g.add_argument(
'--version', action=
'version', version=
get_version(),
 
  194                    help=
'print version number')
 
  196     g.add_argument(
'-h', 
'--help', metavar=
'FLAGS', nargs=
'?', action=AthHelpFlags,
 
  197                    help=
'show help message (for FLAGS, "flags" for all categories)' if __athenaCLI
 
  198                    else 'show help message (for FLAGS category)')
 
  202     g = parser.add_argument_group(
'Monitoring and debugging')
 
  204     g.add_argument(
'--perfmon', metavar=
'MODE', nargs=
'?', const=
'fastmonmt',
 
  205                    help=
'enable performance monitoring toolkit in MODE')
 
  207     g.add_argument(
'-i', 
'--interactive', nargs=
'?', choices=[
'init', 
'run'], const=
'init',
 
  208                    help=
'interactive mode with optional stage (default: init)')
 
  210     g.add_argument(
'--profile-python', metavar=
'FILE',
 
  211                    help=
'profile python code, dump in %(metavar)s (.pkl or .txt)')
 
  213     g.add_argument(
'-d', 
'--debug', metavar=
'STAGE', nargs=
'?', const=
'init',
 
  214                    choices=[
'conf', 
'init', 
'exec', 
'fini'],
 
  215                    help=
'attach debugger at stage: %(choices)s [%(const)s] (gdb or $ATLAS_DEBUGGER if set)')
 
  217     g.add_argument(
'--debugWorker', action=
'store_true', dest=
'debug_worker',
 
  218                    help=
'pause AthenaMP workers at bootstrap until SIGUSR1 signal received')
 
  220     g.add_argument(
'--leak-check', metavar=
'STAGE', dest=
'do_leak_chk', action=MemCheckAction,
 
  221                    choices=[
'initialize', 
'start', 
'beginrun', 
'execute', 
'finalize',
 
  222                             'endrun', 
'stop', 
'full', 
'full-athena', 
'all'],
 
  223                    help=
'perform basic memory leak checking, disables the use of tcmalloc.')
 
  225     g.add_argument(
'--delete-check', metavar=
'STAGE', dest=
'do_leak_chk', action=MemCheckAction,
 
  226                    choices=[
'initialize', 
'start', 
'beginrun', 
'execute', 
'finalize',
 
  227                             'endrun', 
'stop', 
'full', 
'full-athena', 
'all'],
 
  228                    help=
'perform double delete checking, disables the use of tcmalloc.')
 
  230     g.add_argument(
'--tracelevel', metavar=
'LEVEL', nargs=
'?', type=int, choices=
range(1,4), const=3,
 
  231                    help=
'trace level for python configuration (%(choices)s)')
 
  235         g = parser.add_argument_group(
'Legacy options')
 
  237         g.add_argument(
'-c', 
'--command', metavar=
'CMD',
 
  238                        help=
'one-liner, runs before any scripts')
 
  240         g.add_argument(
'--drop-and-reload', action=
'store_true', dest=
'drop_reload',
 
  241                        help=
'offload configuration and start new process')
 
  243         g.add_argument(
'--dump-configuration', metavar=
'FILE', dest=
'config_dump_file',
 
  244                        help=
'dump an ASCII version of the configuration to %(metavar)s')
 
  246         g.add_argument(
'-s', 
'--showincludes', action=
'store_true',
 
  247                        help=
'show printout of included files')
 
  251         g = parser.add_argument_group(
'System options')
 
  253         g.add_argument(
'--tcmalloc', action=
'store_true', dest=
'tcmalloc', default=
True,
 
  254                        help=
'use tcmalloc.so for memory allocation [DEFAULT]')
 
  256         g.add_argument(
'--stdcmalloc', action=
'store_false', dest=
'tcmalloc',
 
  257                        help=
'use libc malloc for memory allocation')
 
  259         g.add_argument(
'--stdcmath', action=
'store_true', default=
True,
 
  260                        help=
'use libc malloc for memory allocation [DEFAULT]')
 
  262         g.add_argument(
'--imf', action=
'store_true',
 
  263                        help=
'use Intel Math Function library')
 
  265         g.add_argument(
'--exctrace', action=
'store_true',
 
  266                        help=
'preload exception trace collector')
 
  268         g.add_argument(
'--no-excabort', action=
'store_true',
 
  269                        help=
'disable converting some exceptions to abort')
 
  271         g.add_argument(
'--preloadlib', metavar=
'LIB',
 
  272                        help=
'localized preload of library %(metavar)s')
 
  274         g.add_argument(
'--enable-ers-hdlr', metavar=
'y/n', default=
'n', choices=[
'y',
'n'],
 
  275                        help=
'enable or not the ERS handler [%(default)s]')
 
  282         import AthenaCommon.ExitCodes 
as ath_codes
 
  284             reason = ath_codes.OPTIONS_UNKNOWN
 
  286             message = ath_codes.codes[reason]
 
  288             message = ath_codes.codes[ath_codes.OPTIONS_UNKNOWN]
 
  290         SystemExit.__init__(self, reason, message)
 
  298     """parses command line arguments and returns an ``Options`` instance""" 
  304         dashpos = sys.argv.index(
"-")
 
  309         args = sys.argv[1:dashpos]
 
  310         user_opts = sys.argv[dashpos+1:]
 
  320     doHelp = any(a 
in (
'-h', 
'--help') 
or a.startswith(
'--help=') 
for a 
in args)
 
  323         unrequiredActions = []
 
  324         for a 
in parser._actions:
 
  326                 unrequiredActions.append(a)
 
  330         helpActions = {
'-h' : parser._option_string_actions.pop(
'-h'),
 
  331                        '--help' : parser._option_string_actions.pop(
'--help')}
 
  334         opts, leftover = parser.parse_known_args(args)
 
  337         parser._option_string_actions.update(helpActions)
 
  338         for a 
in unrequiredActions:
 
  343             opts, leftover = parser.parse_known_args(args)
 
  345         opts, leftover = parser.parse_known_args(args)
 
  347     opts.user_opts = user_opts
 
  351     if not (opts.scripts 
or opts.fromdb) 
and leftover:
 
  354     if not (opts.scripts 
or opts.fromdb) 
and not opts.interactive:
 
  355         parser.error(
"the following arguments are required: scripts")
 
  363 if __name__ == 
'__main__':
 
  364     from pprint 
import pprint
 
  365     pprint(vars(
parse()))
 
  366     print(
'TDAQ_ERS_NO_SIGNAL_HANDLERS', os.getenv(
'TDAQ_ERS_NO_SIGNAL_HANDLERS'))