Source code for jetset.cosmo_tools

__author__ = "Andrea Tramacere"

from astropy.units import  Unit as u
from astropy.units.quantity import Quantity
from astropy import cosmology 
from astropy.table import Table
from astropy.cosmology import Cosmology

import warnings

__all__=['Cosmo']


[docs] class Cosmo (object): def __init__(self,astropy_cosmo=None,DL_cm=None,verbose=False): _c = None self._c_name=None if DL_cm is not None and astropy_cosmo is not None: raise RuntimeError('Either you provide an astropy cosmology objet, or luminosity distance in cm, or nothing') elif astropy_cosmo is None and DL_cm is None: _c = self._get_custom_cosmology() if verbose is True: print("cosmology set to custom",str(_c)) elif astropy_cosmo is not None and DL_cm is None: _c = astropy_cosmo elif astropy_cosmo is None and DL_cm is not None: _c=None if verbose is True: print("using cosmo without z and only DL, should be used only for galactic objects!!") print("z will be fixed to zero") else: raise RuntimeError('Either you provide an astropy cosmology objet, or luminosity distance in cm, or nothing') self._c = _c if DL_cm is not None: if isinstance(DL_cm,Quantity): if u(DL_cm)=='cm': pass else: DL_cm=DL_cm.to('cm') else: DL_cm=DL_cm*u('cm') self._DL_cm = DL_cm def __repr__(self): if self._c is not None: s= '%s' % self._c elif self._DL_cm is not None: x=self._DL_cm s= 'cosmology is not defined, the luminosity distance has been set to %s'%x else: s='you have to define either an astropy cosmology model or set a luminosity distance in cm' return s
[docs] def get_DL_cm(self,z=None): if self._c is not None: #THIS IS FIXING THE ERROR WITH PICKLED COSMO #TODO: open issue on astropy! try: _d= self._c.luminosity_distance( z ).to('cm').value except: _d = self._c.luminosity_distance(z) _d = _d.value*u(str(_d.unit)) _d = _d.to('cm').value else: _d = self._DL_cm.value return _d
def _serialize_model(self): _model = {} if self._c is not None: _model['_astropy_cosmo']=Table(self._c.to_format('astropy.table')) else: _model['_astropy_cosmo']=None _model['_DL_cm'] = self._DL_cm.value return _model def __getstate__(self): return self._serialize_model() def __setstate__(self,state): astropy_cosmo,DL_cm=self._decode_model(state) self.__init__(astropy_cosmo=astropy_cosmo,DL_cm=DL_cm)
[docs] @classmethod def from_model(cls,model): astropy_cosmo,DL_cm = cls._decode_model(model) return cls(astropy_cosmo,DL_cm)
@staticmethod def _get_custom_cosmology(): try: return cosmology.Planck13 except: return cosmology.FlatLambdaCDM(H0=67.8, Om0=0.307) @staticmethod def _decode_model(model): DL_cm=None astropy_cosmo=None try: if '_astropy_cosmo' in model.keys(): if model['_astropy_cosmo'] is not None: try: astropy_cosmo=Cosmology.from_format(Table(model['_astropy_cosmo']),format='astropy.table') except Exception as e: warnings.warn('unable to get astropy.cosmology from loaded instance, setting to Planck13') astropy_cosmo = cosmology.Planck13 if '_DL_cm' in model.keys(): DL_cm=model['_DL_cm'] except Exception as e: warnings.warn('failed to decode saved astropy model, reason: %s'%str(e)) return astropy_cosmo,DL_cm