IceProd Module Base¶
Basic IceProd Modules¶
IceProd Modules are basic wrappers around tray segments that provide an interface for IceProd. The interface of an IceProd module or IPModule consist of
An __init__ method where one should initialize and define paramters
A method to define input parameters to be passed by IceProd (Similar to I3Module)
An Execute method that takes as input a Python dictionary for storing performance statistics.
An IceProd can basically do anything you want but often the purpose is to run IceTray code. The typical structure of the Execute method is the following:
Instantiate I3Tray
Add common services (RNG, SummaryService)
Add I3Reader module (unless this is a generator)
Add/configure tray segments
Add I3Writer module
Terminate chain (Trash,Execute,Finish)
from icecube.simprod import ipmodule
class MyModule(ipmodule.IPModule):
def __init__(self):
# initialize parent class
ipmodule.IPModule.__init__(self)
# define configurable parameters
self.AddParameter('gcdfile','GeoCalibDetStatus filename','')
self.AddParameter('outputfile','Output filename','')
def Execute(self,stats):
# Base class defines an "Excute" option which tells
# the module wether to run or not
if not ipmodule.IPModule.Execute(self,stats): return 0
# Load libraries
from icecube.icetray import I3Tray
from icecube.simprod.segments import PropagateMuons,GenerateNeutrinos
# Instantiate a tray
tray = I3Tray()
# Add services
randomService = phys_services.I3MTRandomService([self.rngseed, self.rngstream])
tray.context['I3RandomService'] = randomService
# Call tray segments
tray.AddSegment(GenerateNeutrinos,
'generator',
RandomService=randomService,
NumEvents=self.nevents,
SimMode=self.simmode)
# Add IO modules
tray.AddModule("I3Writer","writer", filename=self.outputfile)
# Run IceTray
tray.Execute()
Intatiating the IPModule¶
Executing the IPModule then can be done the following way:
#!/bin/env python
from icecube.simprod.modules import MyModule
if __name__ == '__main__':
stats = {}
mymod = MyModule()
mymod.SetParameter("gcdfile","GCD.i3.gz")
mymod.SetParameter("outputfile","test.i3.bz2")
mymod.Execute(stats)
print stats
ParsingModule: IceProd Module + OptionParser¶
The class ipmodule.ParsingModule
inherits from both IPModule
and OptionParser
.
This provides an interface
that can be run by humans (through command-line options) as well as by IceProd (through the IPModule interface).
In order to implement a ParsingModule, you need to replace the parent base class as well as the invocation of __init__
and Execute:
class MyOptParsingModule(ipmodule.ParsingModule):
def __init__(self):
ipmodule.ParsingModule.__init__(self)
...
def Execute(self,stats):
if not ipmodule.ParsingModule.Execute(self,stats): return 0
And then call ExecuteOpts()
instead of Execute in your instantiated class:
#!/bin/env python
from icecube.simprod.modules import MyModule
if __name__ == '__main__':
stats = {}
myopmod = MyModule()
myopmod.ExecuteOpts(stats)
print stats
Since ipmodule.ParsingModule
inherits from both IPModule
and OptionParser
. You can call your script with a
ParsingModule
object on the command line:
Usage: nugen.py [options]
Options:
-h, --help show this help message and exit
--execute boolean condition to execute
--gcdfile=GCDFILE GeoCalibDetStatus filename
--outputfile=OUTPUTFILE
Output filename
--summaryfile=SUMMARYFILE JSON Summary filename
--mjd=MJD MJD for the GCD file
--RunId=RUNID Configure run ID
--RNGSeed=RNGSEED RNG seed
--RNGStream=RNGSTREAM