"""Base class for computing opacities."""importtypingastimportnumpyasnpimportnumpy.typingasnptfromtaurex.cacheimportGlobalCachefromtaurex.coreimportCitablefromtaurex.logimportLogger
[docs]classOpacity(Logger,Citable):"""This is the base class for computing opactities."""
[docs]@classmethoddefdiscover(cls)->t.List[t.Tuple[str,t.Any]]:"""Class method, used to discover molecular opacities. Should return opacities that are available in the current environment. """raiseNotImplementedError
[docs]@classmethoddefpriority(cls)->int:"""Priority of the opacity during discovery."""return100
def__init__(self,name:str)->None:"""Initialize opacity. Parameters ---------- name: str Name of opacity for logging. """super().__init__(name)@propertydefresolution(self)->float:"""Resolution of opacity."""raiseNotImplementedError@propertydefmoleculeName(self)->str:# noqa: N802"""Name of molecule."""raiseNotImplementedError@propertydefwavenumberGrid(self)->npt.NDArray[np.float64]:# noqa: N802raiseNotImplementedError@propertydeftemperatureGrid(self)->npt.NDArray[np.float64]:# noqa: N802raiseNotImplementedError@propertydefpressureGrid(self)->npt.NDArray[np.float64]:# noqa: N802raiseNotImplementedError
[docs]defcompute_opacity(self,temperature:float,pressure:float,wngrid:t.Optional[npt.NDArray[np.float64]]=None,)->npt.NDArray[np.float64]:"""Must return in units of cm2."""raiseNotImplementedError
[docs]defopacity(self,temperature:float,pressure:float,wngrid:t.Optional[npt.NDArray[np.float64]]=None,)->npt.NDArray[np.float64]:"""Compute the opacity for a given temperature and pressure. Parameters ---------- temperature: float Temperature in K pressure: float Pressure in Pa wngrid: :obj:`array`, optional Wavenumber grid to restrict to. Returns ------- :obj:`array` Opacity array """ifwngridisNone:wngrid_filter=slice(None)else:wngrid_filter=np.where((self.wavenumberGrid>=wngrid.min())&(self.wavenumberGrid<=wngrid.max()))[0]orig=self.compute_opacity(temperature,pressure,wngrid_filter)ifwngridisNoneornp.array_equal(self.wavenumberGrid.take(wngrid_filter),wngrid):returnorigelse:hold_method=GlobalCache()["opacity_hold"]ifhold_method:returnnp.interp(wngrid,self.wavenumberGrid[wngrid_filter],orig)else:returnnp.interp(wngrid,self.wavenumberGrid[wngrid_filter],orig,left=0.0,right=0.0,)
[docs]defopacityCitation(self)->t.List[str]:# noqa: N802"""Citation for the specific molecular opacity. Returns ------- list of str: List of string with reference information """return[]