"""HS3 Functions implementation.Provides classes for handling HS3 functions including product functions,generic functions with mathematical expressions, and interpolation functions."""from__future__importannotationsimportloggingfromcollections.abcimportIteratorfromtypingimportAnnotated,Anyfrompydanticimport(Field,PrivateAttr,RootModel,)frompyhs3.exceptionsimportcustom_error_msgfrompyhs3.functionsimportstandardfrompyhs3.functions.coreimportFunctionlog=logging.getLogger(__name__)SumFunction=standard.SumFunctionProductFunction=standard.ProductFunctionGenericFunction=standard.GenericFunctionInterpolationFunction=standard.InterpolationFunctionProcessNormalizationFunction=standard.ProcessNormalizationFunctionCMSAsymPowFunction=standard.CMSAsymPowFunctionHistogramFunction=standard.HistogramFunctionRooRecursiveFractionFunction=standard.RooRecursiveFractionFunction# Combine all function registriesregistered_functions:dict[str,type[Function]]={**standard.functions,}# Type alias for all function types using discriminated unionFunctionType=Annotated[SumFunction|ProductFunction|GenericFunction|InterpolationFunction|ProcessNormalizationFunction|CMSAsymPowFunction|HistogramFunction|RooRecursiveFractionFunction,Field(discriminator="type"),]
[docs]classFunctions(RootModel[list[FunctionType]]):""" Collection of HS3 functions for parameter computation. Manages a set of function instances that compute parameter values based on other parameters. Functions can be products, generic mathematical expressions, or interpolation functions. Provides dict-like access to functions by name and handles function creation from configuration dictionaries. Attributes: funcs: Mapping from function names to Function instances. """root:Annotated[list[FunctionType],custom_error_msg({"union_tag_invalid":"Unknown function type '{tag}' does not match any of the expected functions: {expected_tags}"}),]=Field(default_factory=list)_map:dict[str,Function]=PrivateAttr(default_factory=dict)defmodel_post_init(self,__context:Any,/)->None:"""Initialize computed collections after Pydantic validation."""self._map={func.name:funcforfuncinself.root}def__getitem__(self,item:str)->Function:returnself._map[item]def__contains__(self,item:str)->bool:returniteminself._mapdef__iter__(self)->Iterator[Function]:# type: ignore[override] # https://github.com/pydantic/pydantic/issues/8872returniter(self.root)def__len__(self)->int:returnlen(self.root)