Go to the documentation of this file.00001 """
00002 Module to configure the persistency type in GaudiPython.
00003 """
00004 __author__ = "Marco Clemencic <marco.clemencic@cern.ch>"
00005
00006 class PersistencyError(RuntimeError):
00007 """
00008 Base class for exceptions in PersistencyHelper.
00009 """
00010 pass
00011
00012 class UnknownPersistency(PersistencyError):
00013 """
00014 Exception raised if the persistency type is not known to the module.
00015 """
00016 def __init__(self, type_):
00017 super(UnknownPersistency, self).__init__("Unknown persistency type %r" % type_)
00018 self.type = type_
00019
00020
00021 _implementations = []
00022
00023 def get(type_):
00024 """
00025 Return the PersistencyHerper implementing the given persistency type.
00026 """
00027 for i in _implementations:
00028 if i.handle(type_):
00029 return i
00030 raise UnknownPersistency(type_)
00031
00032 def add(instance):
00033 """
00034 Function to extend the list of known helpers.
00035
00036 New helpers are added to the top of the list.
00037 """
00038 _implementations.insert(0, instance)
00039
00040 class FileDescription(object):
00041 def __init__(self, filename, opt, svc, sel=None, collection=None, fun=None):
00042 '''
00043 Class to hold/manipulate the file description.
00044
00045 @param filename: name of the file
00046 @param opt: option (READ/CREATE/RECREATE/WRITE)
00047 @param svc: conversion service (or selector)
00048 @param sel: selection expression
00049 @param collection: collection
00050 @param fun: selection class
00051 '''
00052 self.filename = filename
00053 self.opt = opt
00054 self.svc = svc
00055 self.sel = sel
00056 self.collection = collection
00057 self.fun = fun
00058 def __data__(self):
00059 '''
00060 Return a list of pairs describing the instance.
00061 '''
00062 return [("DATAFILE", self.filename),
00063 ("OPT", self.opt),
00064 ("SVC", self.svc),
00065 ("SEL", self.sel),
00066 ("COLLECTION", self.collection),
00067 ("FUN", self.fun)]
00068 def __str__(self):
00069 """
00070 Return the string representation of the file description to be passed
00071 to the application.
00072 """
00073 return " ".join(["%s='%s'" % (k, v) for k, v in self.__data__() if v])
00074
00075 class PersistencyHelper(object):
00076 """
00077 Base class for extensions to persistency configuration in GaudiPython.
00078 """
00079 def __init__(self, types):
00080 """
00081 Define the type of persistencies supported by the instance.
00082 """
00083 self.types = set(types)
00084 def handle(self, typ):
00085 """
00086 Returns True if the current instance understands the requested
00087 persistency type.
00088 """
00089 return typ in self.types
00090
00091 class RootPersistency(PersistencyHelper):
00092 """
00093 Implementation of PersistencyHelper based on Gaudi::RootCnvSvc.
00094 """
00095 def __init__(self):
00096 """
00097 Constructor.
00098
00099 Declare the type of supported persistencies to the base class.
00100 """
00101 super(RootPersistency, self).__init__(["ROOT", "POOL_ROOT",
00102 "RootCnvSvc", "Gaudi::RootCnvSvc"])
00103 self.configured = False
00104
00105 def configure(self, appMgr):
00106 """
00107 Basic configuration.
00108 """
00109 if not self.configured:
00110
00111 appMgr.service('Gaudi::RootCnvSvc/RootCnvSvc')
00112 eps = appMgr.service ( 'EventPersistencySvc' )
00113 eps.CnvServices += ['RootCnvSvc']
00114 self.configured = True
00115
00116 def formatInput(self, filenames, **kwargs):
00117 '''
00118 Translate a list of file names in a list of input descriptions.
00119
00120 The optional parameters 'collection', 'sel' and 'fun' should be used to
00121 configure Event Tag Collection inputs.
00122
00123 @param filenames: the list of files
00124 '''
00125 if not self.configured:
00126 raise PersistencyError("Persistency not configured")
00127 if type(filenames) is str:
00128 filenames = [filenames]
00129 fileargs = {}
00130
00131 fileargs = dict([(k, kwargs[k])
00132 for k in ["collection", "sel", "fun"]
00133 if k in kwargs])
00134 if fileargs:
00135
00136 svc = 'Gaudi::RootCnvSvc'
00137 else:
00138 svc = 'Gaudi::RootEvtSelector'
00139 return map(str,
00140 [FileDescription(f, 'READ', svc, **fileargs)
00141 for f in filenames])
00142
00143 def formatOutput(self, filename, **kwargs):
00144 '''
00145 Translate a filename in an output description.
00146
00147 @param filenames: the list of files
00148 @param lun: Logical Unit for Event Tag Collection outputs (optional)
00149 '''
00150 if not self.configured:
00151 raise PersistencyError("Persistency not configured")
00152 retval = str(FileDescription(filename, 'RECREATE', 'Gaudi::RootCnvSvc'))
00153 if 'lun' in kwargs:
00154 retval = "%s %s" % (kwargs['lun'], retval)
00155 return retval
00156
00157
00158 add(RootPersistency())