| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

DybPython::Control::NuWa Class Reference

List of all members.

Public Member Functions

def __init__
def cmdline
def known_input_type
def add_input_file
def configure_python_features
def configure_ipython
def configure_framework
def configure_random
def configure_run
def configure_job
def configure_geometry
def configure_optmods
def configure_args
def configure_user
def configure_post_user
def configure_visualization
def configure
def spade_files
def run_post_user
def run
def finalize

Public Attributes

 opts_parser
 DATETIME_FORMAT
 post_user_algs
 spadeSvc
 opts
 args
 use_AES
 AES_window
 theApp
 input_files
 modules

Detailed Description

This is the main program to run NuWa offline jobs.

It provides a job with a minimal, standard setup.  Non standard
behavior can made using command line options or providing additional
configuration in the form of python files or modules to load.

Usage:

  nuwa.py [options] [-m|--module "mod.ule --mod-arg ..."] \\
          [config1.py config2.py ...] \\
          [mod.ule1 mod.ule2 ...] \\
          [[input1.root input2.root ...] or [input1.data ...]] \\

Python modules can be specified with -m|--module options and may
include any per-module arguments by enclosing them in shell quotes
as in the above usage.  Modules that do not take arguments may
also be listed as non-option arguments.  Modules may supply the
following functions:

configure(argv=[]) - if exists, executed at configuration time

run(theApp) - if exists, executed at run time with theApp set to
the AppMgr.

Additionally, python job scripts may be specified.

Modules and scripts are loaded in the order they are specified on
the command line.

Finally, input ROOT files may be specified.  These will be read in
the order they are specified and will be assigned to supplying
streams not specificially specified in any input-stream map.

The listing of modules, job scripts and/or ROOT files may be
interspersed but must follow all options.

Definition at line 7 of file Control.py.


Member Function Documentation

def DybPython::Control::NuWa::__init__ (   self  ) 

Definition at line 10 of file Control.py.

00015          :
00016     
00017       nuwa.py [options] [-m|--module "mod.ule --mod-arg ..."] \\
00018               [config1.py config2.py ...] \\
00019               [mod.ule1 mod.ule2 ...] \\
00020               [[input1.root input2.root ...] or [input1.data ...]] \\
00021 
00022     Python modules can be specified with -m|--module options and may
00023     include any per-module arguments by enclosing them in shell quotes
00024     as in the above usage.  Modules that do not take arguments may
00025     also be listed as non-option arguments.  Modules may supply the
00026     following functions:
00027 
00028     configure(argv=[]) - if exists, executed at configuration time
00029 
00030     run(theApp) - if exists, executed at run time with theApp set to
00031     the AppMgr.
00032 
00033     Additionally, python job scripts may be specified.
00034 
00035     Modules and scripts are loaded in the order they are specified on
00036     the command line.
00037 
00038     Finally, input ROOT files may be specified.  These will be read in
00039     the order they are specified and will be assigned to supplying
00040     streams not specificially specified in any input-stream map.
00041 
00042     The listing of modules, job scripts and/or ROOT files may be
00043     interspersed but must follow all options.
00044 
00045     """
00046 
00047     def __init__(self):
00048         ' Create a NuWa instance.'
00049         from optparse import OptionParser
00050         from DybPython.hostid import hostid
00051         parser = OptionParser(usage=self.__doc__)
00052 
00053         parser.add_option("-A", "--aes-trim-window",default="0",type="string",
00054                           help="'None' for no AES. Turn on AES with zero or any positive value and use that for AES trimming window (in second).")
00055 
00056         parser.add_option("-l", "--log-level",default=3,type="int",
00057                           help="Set output log level.")
00058 
00059         parser.add_option("-M","--msg-stream-level", action="append",
00060                           help="Set individual MsgStream levels using form: 'StreamName,LevelNumber'")
00061 
00062         parser.add_option("-L", "--file-list", default=None, type="string",
00063                           help="Input file list")
00064 
00065         parser.add_option("-C", "--color",default="no",
00066                           help="Use colored logs assuming given background ('light' or 'dark')")
00067 
00068         parser.add_option("-i", "--interactive",action="store_true",default=False,
00069                           help="Enter interactive ipython shell after the run completes (def is batch).")
00070 
00071         parser.add_option("-s", "--show-includes", action="store_true",default=False,
00072                           help="Show printout of included files.")
00073 
00074         parser.add_option("-m", "--module", action="append", 
00075                           help="Load given module and pass optional argument list")
00076 
00077         parser.add_option("-n", "--executions", default=0, type="int",
00078                           help="Number of times to execute list of top level algorithms.")
00079 
00080         parser.add_option("-o", "--output",default="",
00081                           help="Output filename")
00082 
00083         parser.add_option("-O", "--output-streams",default="{}",
00084                           help="Output file map")
00085 
00086         parser.add_option("-I", "--input-streams",default="{}",
00087                           help="Input file map")
00088 
00089         parser.add_option("-H", "--hostid",default=hostid(), type="int",
00090                           help="Force given hostid")
00091 
00092         parser.add_option("-R", "--run",default=0, type="int",
00093                           help="Set run number")
00094 
00095         parser.add_option("-T", "--time",default="0", type="string",
00096                           help="Set wall time")
00097 
00098         parser.add_option("", "--dbconf",default=None , type="string",
00099                           help="Sets DBCONF envvar identifying section of ~/.my.cnf to use for DB connection parameters and triggering DBI to use this config (DbiCascader.cxx)  ")
00100 
00101         parser.add_option("-N", "--execution",default=0, type="int",
00102                           help="Set the starting execution number")
00103 
00104         parser.add_option("-V", "--visualize", action="store_true", default = False,
00105                           help="Run in visualize mode")
00106 
00107         parser.add_option("-E", "--external-loop", type='string', default='',
00108                           help="Delegate to an external loop, name a module with a 'start(app)' method defined.")
00109 
00110         parser.add_option("-G", "--detector",default= "",
00111                           help="Specify a non-default, top-level geometry file")
00112 
00113         parser.add_option("-K", "--leak-check-execute",action="store_true",default= False,
00114                           help="Use Hephaestus memory tracker")
00115         parser.add_option("","--leak-check-method",action="append",
00116                           default=[],
00117                           help="Add a method for the leak checker to focus on");
00118 
00119         parser.add_option("","--no-history",action='store_const',dest='history',
00120                           const='off',help='Same as --history=off')
        parser.add_option("","--history",default="on",

def DybPython::Control::NuWa::cmdline (   self,
  argv 
)

Definition at line 121 of file Control.py.

00134                                                                     : {'file1':'histograms.root'}")
00135 
00136         parser.add_option("", "--input-stats",default=None,
00137                           help="Input file map for histograms.   Ex: {'file1':'histograms.root'}")
00138         parser.add_option("", "--force-readout", action="store_true",default=False,
00139                           help="Force Readout to be written to output file.")
00140 
00141         import uuid
00142         parser.add_option("", "--jobid",default=str(uuid.uuid1()),
00143                           help="Set the job ID for bookkeeping")
00144 
00145         parser.add_option("", "--job-info",default="{}",
00146                           help="Add or override job bookkeeping information")
00147 
00148 
00149         parser.disable_interspersed_args()
00150         self.opts_parser = parser
00151         self.DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S'
00152         self.post_user_algs = []
00153 
00154         # If the spade service (SpadeAlgo) is used it will register itself.
00155         self.spadeSvc = None;
00156         return
00157 
00158     def cmdline(self,argv):
00159         'Parse command line'
00160         (options,args) = self.opts_parser.parse_args(args=argv)
00161 
00162         self.opts = options
00163         self.args = args
00164 
00165         # convert string to dictionary object

def DybPython::Control::NuWa::known_input_type (   self,
  fname 
)

Definition at line 166 of file Control.py.

00169                                  :
00170             self.opts.output_stats = mapify(self.opts.output_stats)
00171         if self.opts.input_stats:
00172             self.opts.input_stats = mapify(self.opts.input_stats)
00173         self.opts.job_info = mapify(self.opts.job_info)

def DybPython::Control::NuWa::add_input_file (   self,
  fname 
)

Add file name or list of file names to self.input_files,
expanding if it is a .list file.

Definition at line 174 of file Control.py.

00177                                          :
00178             self.opts.time = int(mktime(strptime(self.opts.time,
00179                                                  self.DATETIME_FORMAT))
00180                                  -timezone)
00181             # Note: mktime adds the timezone, so we need to subtract it.
00182         else:
00183             self.opts.time = int(self.opts.time)
00184 
00185 
00186         from Tools import mapify, unitify
00187         if self.opts.aes_trim_window.lower() == "none":
00188             self.use_AES = False
00189         else:
00190             self.use_AES = True
00191             self.AES_window = unitify(self.opts.aes_trim_window,"second")
00192             if self.AES_window >=0 :
00193                 print "AES is turned on and trimming window is set to ",\
00194                     self.AES_window/units.second," seconds"
00195                 # valid
00196                 pass
00197             else :
00198                 print "error: invalid AES trimming window"
00199                 exit()
00200 
00201         return
00202 
00203     def known_input_type(self,fname):
00204         'Return True if file name has a recognized extension.'
00205         for ext in ['.root','.data','.rraw','.list']:
00206             if fname[-len(ext):] == ext:
00207                 return True
00208             continue
00209         return False
00210 
00211     def add_input_file(self,fname):
00212         '''Add file name or list of file names to self.input_files,
00213         expanding if it is a .list file.'''

def DybPython::Control::NuWa::configure_python_features (   self  ) 

Definition at line 214 of file Control.py.

00215                     : return
00216 
00217         #print 'add_input_file(%s)'%fname
00218 
00219         # recurse if list
00220         if isinstance(fname,list):
00221             for name in fname:
00222                 self.add_input_file(name)
00223                 continue
00224             return
00225 
00226         if not self.known_input_type(fname):
00227             msg = 'Got unknown input file type: "%s"'%fname
00228             print msg
00229             raise TypeError,msg
00230 
00231         if fname[-5:] != '.list':
00232             self.input_files.append(fname)
00233             return
00234 
00235         # process as a list file
00236         fp = open(fname)
00237         for line in fp.readlines():
00238             line = line.strip()
00239             if len(line) == 0: continue
00240             if line[0] == '#': pass
00241             if not line: pass
00242             if not self.known_input_type(line):
00243                 print ' unknown file:',line
00244                 continue
00245             self.add_input_file(line)
00246             continue
00247         fp.close()
00248         return
00249 
00250 
00251     def configure_python_features(self):
00252         'Set up python features'
00253         if not os.getcwd() in sys.path:
00254             sys.path = [ os.getcwd() ] + sys.path
00255 
00256         if not '' in sys.path:
00257             sys.path = [ '' ] + sys.path
00258 
00259         sys.ps1 = 'nuwa> '
00260         sys.ps2 = '. ... '
00261 
00262 
00263         if self.opts.interactive:
00264             try:
00265                 import rlcompleter, readline, atexit
00266             except ImportError:
00267                 print 'No readline available.'
00268             else:
00269                 readline.parse_and_bind('tab: complete')
00270                 readline.parse_and_bind('set show-all-if-ambiguous On')
00271             

def DybPython::Control::NuWa::configure_ipython (   self  ) 

     If ipython not available or are already inside ipython, setup a dummy 
     embedded ipython ipshell function, otherwise setup the real thing.

Definition at line 272 of file Control.py.

00273                                            :
00274                     readline.read_history_file(fhistory)
00275                 readline.set_history_length(1024)
00276                 atexit.register(readline.write_history_file,fhistory)
00277         else:                   # batch
00278             if os.isatty(sys.stdin.fileno()):
00279                 os.close(sys.stdin.fileno())
00280             pass
00281         
00282 
00283         if self.opts.leak_check_execute:
00284             try:
00285                 import Hephaestus.MemoryTracker as memtrack
00286             except ImportError:
00287                 print "ERROR: Hephaestus is not available."
00288                 sys.exit(1)
00289             else:
00290                 methods = []
00291                 if "Algorithm::sysExecute" not in self.opts.leak_check_method:
00292                     methods.append("Algorithm::sysExecute")
00293                 methods += self.opts.leak_check_method
00294                 for m in methods:
00295                     print "Will leak check in",m
00296                     memtrack.trace(m)
00297                 memtrack.start()
00298 
        if self.opts.dbconf:

def DybPython::Control::NuWa::configure_framework (   self  ) 

Definition at line 299 of file Control.py.

00299                            :
00300             os.environ.update( DBCONF=self.opts.dbconf )
00301             print "Defining DBCONF to %s " % os.environ.get('DBCONF') 
00302 
00303         # to do:
00304         # * set up python side logging
00305 
00306         return
00307 
00308 
00309     def configure_ipython(self):
00310         """
00311              If ipython not available or are already inside ipython, setup a dummy 
00312              embedded ipython ipshell function, otherwise setup the real thing.
00313         """
00314         if not self.opts.interactive:
00315             return
00316 
00317         def ipshell(*args): pass
00318         self.ipshell = ipshell
00319 
00320         try:
00321             import IPython
00322         except ImportError:
00323             print "No ipython available."
00324             return
00325 
00326         try:
00327             __IPYTHON__
00328         except NameError:
00329             from IPython.Shell import IPShellEmbed
00330             irgs = [''] 
00331             banner = "entering ipython embedded shell, within the scope of the NuWa instance... try the locals() command " 
00332             self.ipshell = IPShellEmbed(irgs, banner=banner, exit_msg="exiting ipython" )
00333 
00334 
00335 
00336     def configure_framework(self):
00337         'Set up framework level defaults'
00338 
00339         # Fudge to make sure the right TimeStamp definition is loaded for MDC10b
00340         from GaudiPython import gbl
00341         t = gbl.TimeStamp()
00342         # end fudge
00343         
00344         from Gaudi.Configuration import ApplicationMgr
00345         self.theApp = ApplicationMgr()
00346         self.theApp.OutputLevel = self.opts.log_level
00347 
00348         # Setup history service 
00349         if self.opts.history.lower() not in ["off","no","none","n","false"] \
00350                 and self.opts.executions != 0:
00351             from GaudiSvc.GaudiSvcConf import HistorySvc
00352             hs = HistorySvc()
00353             hs.OutputLevel = 1
00354             self.theApp.ExtSvc.append(hs)
00355             self.theApp.ActivateHistory = True
00356             if self.opts.history.lower() in ["on","yes","y","true"]:
00357                 hs.Dump = True
00358             else:
00359                 hs.OutputFile = self.opts.history
00360 
00361         # Use our event data service which will in turn use the
00362         # standard EvtDataSvc as an Archive Event Service by default
00363         import DybEventMgr
00364         DybEventMgr.Configure(self.use_AES) # double negative
00365 
00366         # Deal with I/O.
00367         try:
00368             import DybPython.Catalog as Catalog
00369             print 'Embedded Catalog is available'
00370         except ImportError:
00371             print 'No Embedded Catalog available'
00372 
00373         # Input files can be determined in several ways
00374         self.input_files = []
00375 
00376         # First add files that are specified on the command line
00377         left_overs = []
00378         for arg in self.args:
00379             if not self.known_input_type(arg):
00380                 left_overs.append(arg)
00381                 continue
00382             self.add_input_file(arg)
00383             continue
00384         self.args = left_overs
00385         del(left_overs)
00386 
00387         # Next, WTF is this code supposed to do?  The first half
00388         # requires a Python file to exist but then strips off the .py
00389         # and loads it as a module.  This unnecessarily limiting use
00390         # to a .py file in the current directory and won't allow use
00391         # of modules that are found via sys.path.  The second half
00392         # duplicates the functionality of just specifying input files
00393         # on the command line.
00394         if self.opts.file_list:
00395             if (os.path.exists(self.opts.file_list) and self.opts.file_list[-3:] == '.py'):
00396                 # If python file, assume it is a List module
00397                 listModule = self.opts.file_list[:-3]
00398                 try:
00399                     exec('import ' + listModule)
00400                 except Exception,err:
00401                     import traceback
00402                     traceback.print_exc()
00403                     print 'Failed to load', listModule
00404                     sys.exit(1)
00405                 print "Loaded \"%s\""%listModule
00406                 self.add_input_file(eval(listModule + '.list'))
00407 
00408             else:
00409                 # Otherwise get list by evaluation the expression.
00410                 fnames = eval(str(self.opts.file_list))
00411                 # if evaluation is not a real list try and force it to be one.
00412                 if not isinstance(fnames, type([])):
00413                     fnames = eval(str(fnames))
00414                 self.add_input_file(fnames)
00415 
00416 
00417         # Check that all input files are of the same type
00418         inputFiletype = None
00419         if self.input_files:
00420             firstFile = self.input_files[0]
00421             inputFiletype = firstFile[-5:]
00422             for filename in self.input_files[1:]:
00423                 if filename[-5:] != inputFiletype:
00424                     msg = "nuwa.py ERROR: Incorrect file type:",file
00425                     raise TypeError,msg
00426                     pass
00427                 continue
00428             pass
00429 
00430         # Should check that the files exist unless they are 
00431         # xrootd files
00432         for fname in self.input_files:
00433             if fname[:7]=='root://' :
00434                 if self.input_files.index( fname ) < 1 :
00435                     print 'Cannot test for existence of xrootd file. Here is first file',fname
00436             else:
00437                 if not os.path.exists(fname):
00438                     msg = 'Warning: input file does not exist "%s"'%fname
00439                     raise RuntimeError,msg
00440                 continue
00441 
00442         # For ROOT input, prepare streams
00443         if self.input_files and inputFiletype == '.root':
00444             try:
00445                 default = self.opts.input_streams['default']
00446             except KeyError:
00447                 default = self.input_files
00448             self.opts.input_streams['default'] = default
00449             pass
00450             
00451         if self.opts.input_streams and inputFiletype == '.root':
00452             # Enable reading of Run Data from ROOT input file
00453             from RunDataSvc.RunDataSvcConf import RunDataSvc
00454             runDataSvc = RunDataSvc()
00455             runDataSvc.ReadFromFile = True
00456             self.theApp.ExtSvc.append( runDataSvc )
00457 
00458             # Enable reading of Job Info from ROOT input file
00459             from JobInfoSvc.JobInfoSvcConf import JobInfoSvc
00460             jobInfoSvc = JobInfoSvc()
00461             jobInfoSvc.ReadFromFile = True
00462             self.theApp.ExtSvc.append( jobInfoSvc )
00463 
00464         # Merge default output files if needed
00465         if self.opts.output:
00466             self.opts.output_streams['default'] = self.opts.output
00467 
00468         if self.opts.output_streams:
00469             # Add Run Data to ROOT output file
00470             from RunDataSvc.RunDataSvcConf import RunDataWriterAlg
00471             runDataWriterAlg = RunDataWriterAlg()
00472             runDataWriterAlg.WriteToFile = True
00473 
00474             # Add Job Info to ROOT output file
00475             from JobInfoSvc.JobInfoSvcConf import JobInfoWriterAlg
00476             jobInfoWriterAlg = JobInfoWriterAlg()
00477             jobInfoWriterAlg.WriteToFile = True
00478 
00479         import RootIOSvc
00480         self.io = RootIOSvc.Configure(self.opts.input_streams,
00481                                       self.opts.output_streams,
00482                                       self.opts.force_readout)
00483 
00484         # Set up DaqFormat handling
00485         import DaqReadoutSvc
00486         daqSvc=DaqReadoutSvc.DaqReadoutSvc()
00487         if self.opts.daq == 'on':
00488             daqSvc.Generating=True
00489         if self.opts.daq == 'off':
00490             daqSvc.Generating=False
00491         daqSvc.RunNumber = self.opts.run
00492 
00493         # Enable Raw File I/O if given raw data files.
00494         if inputFiletype == '.data' or inputFiletype == '.rraw':
00495             if (self.opts.daq == 'off' and self.opts.raw_load == 'off') or self.opts.raw_load == 'raw':
00496                 import RawDataIO
00497                 self.rawIo = RawDataIO.Configure()
00498                 self.rawIo.InputSvc.RawDataFiles = self.input_files
00499             elif self.opts.daq == 'on' or self.opts.raw_load == 'daq':
00500                 import DaqFormatIO
00501                 self.daqIO = DaqFormatIO.eventSelector()
00502                 self.daqIO.InputFiles = self.input_files
00503                 self.daqIO.SamplingInterval = 1
00504                 # For ActionOnInvalid: 0 = exit, 1 = skip, 2 = process
00505                 self.daqIO.ActionOnInvalid = 1
00506             elif self.opts.raw_load.startswith('daq-'):
00507                 from DaqFormatModules.DaqFormatModulesConf import DybDaq__DaqFormatInput
00508                 self.rawLoad = DybDaq__DaqFormatInput()
00509                 self.theApp.TopAlg += [self.rawLoad]
00510                 self.rawLoad.InputFiles = self.input_files
00511                 if self.opts.raw_load =='daq-repackage':
00512                     self.rawLoad.Repackage = True
00513                 else:
00514                     self.rawLoad.Repackage = False
00515                     if self.opts.raw_load in ['daq-both','daq-packed']:
00516                         self.rawLoad.UsePacked = True
00517                     else:
00518                         self.rawLoad.UsePacked = False
00519                     if self.opts.raw_load in ['daq-both','daq-unpacked']:
00520                         self.rawLoad.UseUnpacked = True
00521                     else:
00522                         self.rawLoad.UseUnpacked = False
00523             else:
                from DataDebug.DataDebugConf import DataLoaderAlg

def DybPython::Control::NuWa::configure_random (   self  ) 

Definition at line 524 of file Control.py.

00528                                                           :
00529                     self.rawLoad.UsePacked = True
00530                 else:
00531                     self.rawLoad.UsePacked = False
00532                 if self.opts.raw_load in ['both','unpacked']:
                    self.rawLoad.UseUnpacked = True

def DybPython::Control::NuWa::configure_run (   self  ) 

Definition at line 533 of file Control.py.

00534                     :
00535                     self.rawLoad.UseUnpacked = False
00536                     
00537         # Configure Statistics Service for histogram I/O
00538         if self.opts.output_stats or self.opts.input_stats:
00539             print 'output_stats=',self.opts.output_stats
00540             print 'input_stats=',self.opts.input_stats
00541             from StatisticsSvc.StatisticsSvcConf import StatisticsSvc
00542             statsSvc = StatisticsSvc()
            if self.opts.output_stats:

def DybPython::Control::NuWa::configure_job (   self  ) 

Definition at line 543 of file Control.py.

00543                                      :
00544                 statsSvc.Output = self.opts.output_stats
00545             if self.opts.input_stats:
00546                 statsSvc.Input = self.opts.input_stats 
00547             self.theApp.ExtSvc.append( statsSvc )
00548             pass
00549 
00550         ninput = len(self.input_files)
00551         for k,v in self.opts.input_streams.iteritems():
00552             ninput += len(v)
00553         if self.opts.executions == -1 and ninput == 0:
00554             err = 'Unbounded running with no input files, probably not what you wanted.\n'
00555             sys.stderr.write(err)
00556             sys.exit(1)
00557             pass
00558         
00559         return
00560 
00561     def configure_random(self):
00562 
00563         if self.opts.random == 'on':
00564             from DybAlg import RandomSeeder
00565             rs = RandomSeeder(hostid = self.opts.hostid,
00566                               run = self.opts.run,
00567                               execcountoffset = self.opts.execution-1);
00568         return
00569 
00570     def configure_run(self):
00571         # Catch command-line run number and wall time for simulation jobs
00572         # Send run number and wall time to RunDataSvc
00573         from RunDataSvc.RunDataSvcConf import RunDataSvc
00574         runDataSvc = RunDataSvc()
        runDataSvc.SimRunNumber = self.opts.run

def DybPython::Control::NuWa::configure_geometry (   self  ) 

Definition at line 575 of file Control.py.

00580                            :
00581         # Catch job configuration info and feed to Job Info Service
00582         from JobInfoSvc.JobInfoSvcConf import JobInfoSvc
00583         jobInfoSvc = JobInfoSvc()
00584         # Initialize current job info
00585         import sys, time, os
        nuwaPath = os.path.realpath(os.path.expandvars('$DYBRELEASEROOT/../../'))

def DybPython::Control::NuWa::configure_optmods (   self  ) 

load and configure() "-m" modules here   

Definition at line 586 of file Control.py.

00590                                   :
00591             revisionFile = open(revPath)
00592             if revisionFile:
00593                 revLine = revisionFile.readline()
00594                 if revLine != "":
00595                     revision = revLine.strip()
00596         jobConfigList = {'command':' '.join(sys.argv),
00597                          'revision':revision,
00598                          'nuwaPath':nuwaPath,
00599                          'cmtConfig':os.getenv('CMTCONFIG'),
00600                          'hostid':str(self.opts.hostid),
00601                          'jobTime':time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()),
00602                          'username':os.getenv('LOGNAME')}
00603         jobInfoSvc.JobId = self.opts.jobid
00604         # Process user-defined job information
00605         for key in self.opts.job_info.keys():
00606             print "User-defined job info: "+key+" = "+self.opts.job_info[key]
00607             jobConfigList[key] = self.opts.job_info[key]
00608         jobInfoSvc.JobConfig = jobConfigList
00609         self.theApp.ExtSvc.append( jobInfoSvc )
00610         return
00611 
00612     def configure_geometry(self):
00613         import XmlDetDesc
00614         if self.opts.detector:
00615             XmlDetDesc.Configure(self.opts.detector)
00616             print "Note: using non-default geometry in " \
00617                 + self.opts.detector + " is loaded."
00618         else:
00619             XmlDetDesc.Configure()
00620         return

def DybPython::Control::NuWa::configure_args (   self  ) 

spin over all non-option arguments 

Definition at line 621 of file Control.py.

00623                                :
00624         """ load and configure() "-m" modules here   """
00625         if self.opts.module == None: return
00626 
00627         from DybPython.cmdline import quotedParse
00628 
00629         for modcmd in self.opts.module:
00630             argv = quotedParse(modcmd)
00631             modname = argv[0]
00632             if modname[-3:] == '.py':
00633                 print 'Fixing assumed typo in module name from "%s" to "%s"'%(modname,modname[:-3])
00634                 modname = modname[:-3]
00635             modargs = argv[1:]
00636             print "Importing modules",modname,"["," ".join(modargs),"]"
00637             exec('import %s'%modname) # Don't catch potential exception!
00638             mod = eval(modname)
00639             self.modules.append(mod)
00640 
00641             print "Trying to call configure() on",modname
00642             try:
00643                 if modargs:
00644                     mod.configure(argv=modargs)
00645                 else:
00646                     mod.configure()
00647                     
00648             except SyntaxError,err:
00649                 print "Got SyntaxError:",str(err)
00650                 print "Assuming",cfg,"has not configure() function"
00651                 pass
00652             except AttributeError,err:
00653                 if "object has no attribute 'configure" not in str(err):
00654                     raise
00655             pass
00656 
00657 
    def configure_args(self):

def DybPython::Control::NuWa::configure_user (   self  ) 

Definition at line 658 of file Control.py.

00658                             :
00659         """ spin over all non-option arguments """
00660         
00661         # At this point there should be no input files left in the args.
00662         for cfg in self.args:
00663 
00664             if cfg[-3:] == '.py':
00665                 cfgf = open(cfg)
00666                 try:
00667                     exec(cfgf)
00668                 except Exception,err:
00669                     import traceback
00670                     traceback.print_exc()
00671                     print 'Failed to load',cfg
00672                     sys.exit(1)
                print "Loaded \"%s\""%cfg

def DybPython::Control::NuWa::configure_post_user (   self  ) 

Definition at line 673 of file Control.py.

00676                 :               # assume this is a module
00677                 print "Importing module",cfg
00678                 exec('import %s'%cfg) # Don't catch potential exception!
00679 
00680                 mod = eval(cfg)
00681                 self.modules.append(mod)
00682 
00683                 # if it has a configure() method, call it now
00684                 print "Trying to call configure() on",cfg
00685                 try:
00686                     mod.configure()
00687                 except AttributeError,err:
00688                     if "object has no attribute 'configure'" not in str(err):
00689                         raise
00690                     pass
00691                 pass
00692             continue
00693         return
00694     
00695     def configure_user(self):
00696         from DybPython.Include import include, IncludeError
00697         include.setShowIncludes(self.opts.show_includes)
00698 
00699         try:
00700             include("$HOME/.nuwarc")
00701             print "Included ~/.nuwarc"
00702         except IncludeError,err:
00703             pass
00704 
00705         self.modules = []
00706         self.configure_optmods()
00707         self.configure_args()
00708         return
00709 
00710     def configure_post_user(self):

def DybPython::Control::NuWa::configure_visualization (   self  ) 

Definition at line 711 of file Control.py.

00711                            :
00712             if self.opts.output_streams:
00713                 print "Using DybStoreAlg to trigger output."
00714                 from RootIOTest.RootIOTestConf import DybStoreAlg
00715                 dsa = DybStoreAlg()
00716                 self.post_user_algs.append(dsa)
00717         else:
00718             if self.opts.executions != 0:
00719                 print "Using DybTrimIO to trigger output and do AES trimming"
00720                 # add DybTrimIO
00721                 from DybAlg.DybAlgConf import DybTrimIO
00722                 trimIO = DybTrimIO()
00723                 self.post_user_algs.append(trimIO)
00724                 # add Trimming service
00725                 from DybEventMgr.DybEventMgrConf import ArchiveTrimSvc
00726                 trimSvc = ArchiveTrimSvc()
00727                 self.theApp.ExtSvc.append(trimSvc)
00728                 trimSvc.DefaultWindowSeconds = self.AES_window/units.second
00729 
00730                 # check whether io is involed
00731                 if self.opts.output_streams:
00732                     # add SaveB4TrimAesSvc
00733                     from DybEventMgr.DybEventMgrConf import SaveB4TrimAesSvc
00734                     svb4t = SaveB4TrimAesSvc()
00735                     self.theApp.ExtSvc.append(svb4t)
00736 
00737                     trimIO.SaveFlag=True;
                else:

def DybPython::Control::NuWa::configure (   self  ) 

Definition at line 738 of file Control.py.

00738                     :
00739                     trimIO.SaveFlag=False;
00740         # Add Run Data Writer to the end of the list of algorithms
00741         from RunDataSvc.RunDataSvcConf import RunDataWriterAlg
00742         self.post_user_algs.append(RunDataWriterAlg())
00743         from JobInfoSvc.JobInfoSvcConf import JobInfoWriterAlg
00744         self.post_user_algs.append(JobInfoWriterAlg())
00745         return
00746 
00747   
00748     def configure_visualization(self):
00749         'Configure for "quanjing/panoramix" visualization'
00750         gui = os.getenv("QUANJINGROOT")
        if not gui:

def DybPython::Control::NuWa::spade_files (   self  ) 

Definition at line 751 of file Control.py.

00751                   :
00752             print "Warning: no QUANJINGROOT variable, no default gui, failure likely."
00753             return
00754         gui += "/xml/gui.onx"
        

def DybPython::Control::NuWa::run_post_user (   self,
  app 
)

Definition at line 755 of file Control.py.

00757                          :
00758             from VisSvc.VisSvcConf import VisualizationSvc
00759             vis = VisualizationSvc()
00760             vis.ColorDbLocation = os.path.dirname(gui) + '/gui/vis/colors.xml'

def DybPython::Control::NuWa::run (   self  ) 

Definition at line 761 of file Control.py.

00771                                            {'Runable':'OnXSvc'} )
00772         appMgr.config()
00773         return
00774 
00775     def configure(self):
00776         self.configure_python_features()
00777         self.configure_ipython()
00778         self.configure_framework()
00779         self.configure_random()
00780         self.configure_run()
00781         self.configure_job()
00782         self.configure_geometry()
00783         self.configure_user()
00784         self.configure_post_user()
00785         return
00786 
00787 
00788     def spade_files(self):
00789         if not self.spadeSvc: return []
00790         return self.spadeSvc.marked
00791 
00792     def run_post_user(self, app):
00793         # Add framework algorithms after user algorithms
00794         for alg in self.post_user_algs:
00795             app.addAlgorithm(alg.getFullJobOptName())
00796         return
00797         
00798     def run(self):
00799 
00800         if self.opts.visualize:
00801             self.configure_visualization()
00802 
00803         from GaudiPython import AppMgr
00804         appMgr = AppMgr()
00805 
00806         if self.opts.color == "dark":
00807             #print 'setting up for dark color terminals'
00808             msg = appMgr.property('MessageSvc')
00809 
00810             msg.OutputLevel = self.opts.log_level
00811             msg.useColors=True
00812             msg.fatalColorCode=['red','white']
00813             msg.errorColorCode=['red']
00814             msg.warningColorCode=['yellow']
00815             msg.debugColorCode=['blue']
00816             msg.verboseColorCode=['cyan']
00817             pass
00818         if self.opts.color == "light":
00819             #print 'setting up for light color terminals'
00820             msg = appMgr.property('MessageSvc')
00821             msg.OutputLevel = self.opts.log_level
00822             msg.useColors=True
00823             msg.fatalColorCode=['red','white']
00824             msg.errorColorCode=['red']
00825             msg.warningColorCode=['yellow']
00826             msg.debugColorCode=['blue']
00827             msg.verboseColorCode=['cyan']
00828             pass
00829 
00830         # Muck with the msg formatting to give more room to show component names
00831         msg = appMgr.property('MessageSvc')
00832         msg.Format="%% F%%%dW%%S%%7W%%R%%T %%0W%%M"%35
00833 
00834         msgSvc = appMgr.service('MessageSvc','IMessageSvc')
00835         if self.opts.msg_stream_level:
00836             for namelevel in self.opts.msg_stream_level:
00837                 name,level = namelevel.split(',')
00838                 msgSvc.setOutputLevel(name,int(level))
00839                 continue
00840             pass
00841 
00842         # Run any modules with a run() function

def DybPython::Control::NuWa::finalize (   self  ) 

Definition at line 843 of file Control.py.

00843                                :
00844             try:
00845                 print "Trying to call run() on",mod.__name__
00846                 mod.run(appMgr)
00847             except AttributeError,err:
00848                 if "object has no attribute 'run'" not in str(err):
00849                     raise
00850                 pass
00851 
00852         self.run_post_user(appMgr)
00853 
00854         n = self.opts.executions
00855         appMgr.EvtMax = n
00856         #appMgr.initialize()
00857 
00858         print 'Starting run with these top algorithms:',appMgr.TopAlg


Member Data Documentation

DybPython::Control::NuWa::opts_parser

Definition at line 113 of file Control.py.

DybPython::Control::NuWa::DATETIME_FORMAT

Definition at line 114 of file Control.py.

DybPython::Control::NuWa::post_user_algs

Definition at line 115 of file Control.py.

DybPython::Control::NuWa::spadeSvc

Definition at line 118 of file Control.py.

DybPython::Control::NuWa::opts

Definition at line 125 of file Control.py.

DybPython::Control::NuWa::args

Definition at line 126 of file Control.py.

DybPython::Control::NuWa::use_AES

Definition at line 151 of file Control.py.

DybPython::Control::NuWa::AES_window

Definition at line 154 of file Control.py.

DybPython::Control::NuWa::theApp

Definition at line 308 of file Control.py.

DybPython::Control::NuWa::input_files

Definition at line 337 of file Control.py.

DybPython::Control::NuWa::modules

Definition at line 668 of file Control.py.


The documentation for this class was generated from the following file:
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:13:02 2011 for DybPython by doxygen 1.4.7