Source code for alphatwirl.heppyresult.HeppyResult

# Tai Sakuma <tai.sakuma@cern.ch>

##__________________________________________________________________||
import os
import re
from .Component import Component
from .ReadVersionInfo import ReadVersionInfo

##__________________________________________________________________||
DEFAULT_EXCLUDE_LIST = ['Chunks', 'failed']
DEFAULT_COMPONENT_HAS_THESE_FILES = ['config.pck', 'config.txt']

##__________________________________________________________________||
[docs]class HeppyResult(object): """A Heppy result Args: path (str): the path to the Heppy result componentNames (list, optional): the list of the names of the components to read. If not given, all components except the ones listed in `excludeList` will be read. excludeList (list, optional): a list of the names of the directory in the Heppy result directory which are to be excluded to be considered as components. if not given, `DEFAULT_EXCLUDE_LIST` will be used. componentHasTheseFiles (list, optional): the directories with there files are considered as components. if not given, `DEFAULT_COMPONENT_HAS_THESE_FILES` will be used. isComponent (function, optional): a function that determines if a directory is a Heppy component. if not give, `IsComponent` will be used. """ def __init__(self, path, componentNames = None, excludeList = DEFAULT_EXCLUDE_LIST, componentHasTheseFiles = DEFAULT_COMPONENT_HAS_THESE_FILES, isComponent = None, ): self.path = os.path.normpath(path) self.isComponent = IsComponent(excludeList, componentHasTheseFiles) if isComponent is None else isComponent allComponentNames = [n for n in os.listdir(self.path) if self.isComponent(os.path.join(self.path, n))] allComponentNames = sorted(allComponentNames, key = lambda n: [float(c) if c.isdigit() else c for c in re.findall('\d+|\D+', n)]) if componentNames is not None: nonexistentComponent = [c for c in componentNames if c not in allComponentNames] if len(nonexistentComponent) > 0: raise ValueError("No such components: " + ", ".join(nonexistentComponent)) self.componentNames = componentNames else: self.componentNames = allComponentNames self._compDict = { } self._versionInfo = None self._readVersionInfo = ReadVersionInfo() def __getattr__(self, name): if name not in self._compDict: if name not in self.componentNames: raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name)) path = os.path.join(self.path, name) self._compDict[name] = Component(path) return self._compDict[name]
[docs] def components(self): return [getattr(self, n) for n in self.componentNames]
[docs] def versionInfo(self): if self._versionInfo is None: path = os.path.join(self.path, 'versionInfo.txt') self._versionInfo = self._readVersionInfo(path) return self._versionInfo
##__________________________________________________________________||
[docs]class IsComponent(object): def __init__(self, excludeList, componentHasTheseFiles): self.excludeList = excludeList self.componentHasTheseFiles = componentHasTheseFiles def __call__(self, path): if not os.path.isdir(path): return False if os.path.basename(path) in self.excludeList: return False if not set(self.componentHasTheseFiles).issubset(set(os.listdir(path))): return False return True
##__________________________________________________________________||