Milky Way Extinction Error

It seems that if an SNCosmo Model is initialized with Milky Way extinction (even if it is set to zero), and an SDSS bandpass is specified, that model.bandmag() and model.color() will return the exception:

Buffer dtype mismatch, expected 'double' but got 'long'

This is demonstrated below.


In [1]:
import numpy as np
import matplotlib.pyplot as plt

import sncosmo
import simulate_lsst as sl

%matplotlib inline

Working without MW extinction

Following the example given in the documentation regarding adding dust to supernova models, I'll initialize an instance of the Model class with host extinction, but no MW extinction. Default values for the parameters are used.


In [2]:
dust = sncosmo.CCM89Dust()
model_no_mw = sncosmo.Model(source='hsiao',
                      effects=[dust],
                      effect_names=['host'],
                      effect_frames=['rest'])
# waves = np.arange(200.,1000.,10.0)
#model_no_mw.set(z=1.0, t0=0.0, amplitude=1.e-10)
#model_no_mw.set(z=1.0, t0=0.0, x1=1.0, c=.1, hostebv=0.0)
#model_no_mw.set_source_peakabsmag(-19.0, 'bessellb', 'ab')
print model_no_mw


<Model at 0x108925dd0>
source:
  class      : TimeSeriesSource
  name       : 'hsiao'
  version    : 3.0
  phases     : [-20, .., 85] days
  wavelengths: [1000, .., 25000] Angstroms
effect (name='host' frame='rest'):
  class           : CCM89Dust
  wavelength range: [909.09, 33333.3] Angstroms
parameters:
  z         = 0.0
  t0        = 0.0
  amplitude = 1.0
  hostebv   = 0.0
  hostr_v   = 3.1000000000000001

In [3]:
model_no_mw.bandflux('desi', time=[.1, .5, 1.])


Out[3]:
array([ 288491.91652638,  285568.80092357,  281584.6937222 ])

In [4]:
model_no_mw.bandflux('sdssi', time=[.1, .5, 1.])


Out[4]:
array([ 184468.48307092,  183021.60751745,  181130.50238601])

In [5]:
model_no_mw.color('desi', 'desr', time=[.1, .5, 1.], magsys='ab')


Out[5]:
array([ 0.54783799,  0.56370346,  0.5826175 ])

In [6]:
model_no_mw.color('sdssi', 'sdssr', time=[.1, .5, 1.], magsys='ab')


Out[6]:
array([ 0.6247266 ,  0.63931893,  0.65543875])

Things seem okay; bandflux() and color() return reasonable values for both SDSS and DES.

Now with MW extinction

Now, I'll initialize another model that is identical, except for the addition of the MW dust parameter.


In [7]:
model_mw_ext = sncosmo.Model(source='hsiao',
                      effects=[dust, dust],
                      effect_names=['host', 'mw'],
                      effect_frames=['rest', 'obs'])
# waves = np.arange(200.,1000.,10.0)
#model_mw_ext.set(z=1.0, t0=0.0, x1=1.0, c=.1, mwebv=0.05)
#model_mw_ext.set_source_peakabsmag(-19.0, 'bessellb', 'ab')
#model_mw_ext.set(z=.5, t0=0.0, amplitude=1.e-10)
print model_mw_ext


<Model at 0x108c272d0>
source:
  class      : TimeSeriesSource
  name       : 'hsiao'
  version    : 3.0
  phases     : [-20, .., 85] days
  wavelengths: [1000, .., 25000] Angstroms
effect (name='host' frame='rest'):
  class           : CCM89Dust
  wavelength range: [909.09, 33333.3] Angstroms
effect (name='mw' frame='obs'):
  class           : CCM89Dust
  wavelength range: [909.09, 33333.3] Angstroms
parameters:
  z         = 0.0
  t0        = 0.0
  amplitude = 1.0
  hostebv   = 0.0
  hostr_v   = 3.1000000000000001
  mwebv     = 0.0
  mwr_v     = 3.1000000000000001

In [8]:
model_mw_ext.bandflux('desi', time=[.1, .5, 1.])


Out[8]:
array([ 288491.91652638,  285568.80092357,  281584.6937222 ])

In [9]:
model_mw_ext.bandflux('sdssi', time=[.1, .5, 1.])


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-990c71902ba2> in <module>()
----> 1 model_mw_ext.bandflux('sdssi', time=[.1, .5, 1.])

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in bandflux(self, band, time, zp, zpsys)
   1293         except ValueError as e:
   1294             _check_for_fitpack_error(e, time, 'time')
-> 1295             raise e
   1296 
   1297     def _bandflux_rcov(self, band, time):

ValueError: Buffer dtype mismatch, expected 'double' but got 'long'

In [10]:
model_mw_ext.color('desi', 'desr', time=[.1, .5, 1.], magsys='ab')


Out[10]:
array([ 0.54783799,  0.56370346,  0.5826175 ])

In [11]:
model_mw_ext.color('sdssi', 'sdssr', time=[.1, .5, 1.], magsys='ab')


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-11-45f81cf7f79a> in <module>()
----> 1 model_mw_ext.color('sdssi', 'sdssr', time=[.1, .5, 1.], magsys='ab')

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in color(self, band1, band2, magsys, time)
   1422             raise TypeError("Magnitude system argument must be scalar.")
   1423 
-> 1424         return (self.bandmag(band1, magsys, time) -
   1425                 self.bandmag(band2, magsys, time))
   1426 

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in bandmag(self, band, magsys, time)
   1387             The return value is an `~numpy.ndarray` if any are interable.
   1388         """
-> 1389         return _bandmag(self, band, magsys, time)
   1390 
   1391     def color(self, band1, band2, magsys, time):

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in _bandmag(model, band, magsys, time_or_phase)
    155     Source and ``time`` is used in Model.
    156     """
--> 157     bandflux = _bandflux(model, band, time_or_phase, None, None)
    158     band, magsys, bandflux = np.broadcast_arrays(band, magsys, bandflux)
    159     return_scalar = (band.ndim == 0)

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in _bandflux(model, band, time_or_phase, zp, zpsys)
    131 
    132         # Get the flux
--> 133         f = model._flux(time_or_phase[mask], b.wave)
    134         fsum = np.sum(f * b.trans * b.wave * b.dwave, axis=1) / HC_ERG_AA
    135 

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in _flux(self, time, wave)
   1173         for effect, frame in zip(self._effects, self._effect_frames):
   1174             if frame == 'obs':
-> 1175                 f = effect.propagate(wave, f)
   1176             else:
   1177                 f = effect.propagate(restwave, f)

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in propagate(self, wave, flux)
   1509         """Propagate the flux."""
   1510         a_v = self._parameters[0] * self._parameters[1]
-> 1511         trans = 10.**(-0.4 * ccm89(wave, a_v, self._parameters[1]))
   1512         return trans * flux
   1513 

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/_extinction.so in sncosmo._extinction.ccm89 (sncosmo/_extinction.c:1980)()

ValueError: Buffer dtype mismatch, expected 'double' but got 'long'

This also errors even if mwebv=0.0.


In [12]:
model_mw_ext.set(mwebv=0.0)
print model_mw_ext


<Model at 0x108c272d0>
source:
  class      : TimeSeriesSource
  name       : 'hsiao'
  version    : 3.0
  phases     : [-20, .., 85] days
  wavelengths: [1000, .., 25000] Angstroms
effect (name='host' frame='rest'):
  class           : CCM89Dust
  wavelength range: [909.09, 33333.3] Angstroms
effect (name='mw' frame='obs'):
  class           : CCM89Dust
  wavelength range: [909.09, 33333.3] Angstroms
parameters:
  z         = 0.0
  t0        = 0.0
  amplitude = 1.0
  hostebv   = 0.0
  hostr_v   = 3.1000000000000001
  mwebv     = 0.0
  mwr_v     = 3.1000000000000001

In [13]:
model_mw_ext.bandflux('sdssi', time=[.1, .5, 1.])


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-990c71902ba2> in <module>()
----> 1 model_mw_ext.bandflux('sdssi', time=[.1, .5, 1.])

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in bandflux(self, band, time, zp, zpsys)
   1293         except ValueError as e:
   1294             _check_for_fitpack_error(e, time, 'time')
-> 1295             raise e
   1296 
   1297     def _bandflux_rcov(self, band, time):

ValueError: Buffer dtype mismatch, expected 'double' but got 'long'

In [14]:
model_mw_ext.color('sdssi', 'sdssr', time=[.1, .5, 1.], magsys='ab')


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-45f81cf7f79a> in <module>()
----> 1 model_mw_ext.color('sdssi', 'sdssr', time=[.1, .5, 1.], magsys='ab')

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in color(self, band1, band2, magsys, time)
   1422             raise TypeError("Magnitude system argument must be scalar.")
   1423 
-> 1424         return (self.bandmag(band1, magsys, time) -
   1425                 self.bandmag(band2, magsys, time))
   1426 

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in bandmag(self, band, magsys, time)
   1387             The return value is an `~numpy.ndarray` if any are interable.
   1388         """
-> 1389         return _bandmag(self, band, magsys, time)
   1390 
   1391     def color(self, band1, band2, magsys, time):

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in _bandmag(model, band, magsys, time_or_phase)
    155     Source and ``time`` is used in Model.
    156     """
--> 157     bandflux = _bandflux(model, band, time_or_phase, None, None)
    158     band, magsys, bandflux = np.broadcast_arrays(band, magsys, bandflux)
    159     return_scalar = (band.ndim == 0)

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in _bandflux(model, band, time_or_phase, zp, zpsys)
    131 
    132         # Get the flux
--> 133         f = model._flux(time_or_phase[mask], b.wave)
    134         fsum = np.sum(f * b.trans * b.wave * b.dwave, axis=1) / HC_ERG_AA
    135 

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in _flux(self, time, wave)
   1173         for effect, frame in zip(self._effects, self._effect_frames):
   1174             if frame == 'obs':
-> 1175                 f = effect.propagate(wave, f)
   1176             else:
   1177                 f = effect.propagate(restwave, f)

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/models.pyc in propagate(self, wave, flux)
   1509         """Propagate the flux."""
   1510         a_v = self._parameters[0] * self._parameters[1]
-> 1511         trans = 10.**(-0.4 * ccm89(wave, a_v, self._parameters[1]))
   1512         return trans * flux
   1513 

/Users/lisaleemcb/.local/lib/python2.7/site-packages/sncosmo-1.1.dev518-py2.7-macosx-10.5-x86_64.egg/sncosmo/_extinction.so in sncosmo._extinction.ccm89 (sncosmo/_extinction.c:1980)()

ValueError: Buffer dtype mismatch, expected 'double' but got 'long'

Compare datatypes


In [15]:
bpdesi = sncosmo.get_bandpass('desi')

In [16]:
bpdesi.wave.dtype


Out[16]:
dtype('float64')

In [17]:
bpi = sncosmo.get_bandpass('sdssi')

In [18]:
bpi.wave.dtype


Out[18]:
dtype('int64')

So DES and SDSS have different datatypes for the wave attribute. If we instead give bandflux() a modified sdssi, where the values in the wave array has been converted to floats, then we see that the aforementioned functions no longer error in this way.


In [19]:
sdssi =sncosmo.Bandpass(map(float, bpi.wave), bpi.trans)

In [20]:
model_mw_ext.bandflux(sdssi, time=[.1, .5, 1.])


Out[20]:
array([ 184468.48307092,  183021.60751745,  181130.50238601])

In [21]:
bpr = sncosmo.get_bandpass('sdssr')
sdssr =sncosmo.Bandpass(map(float, bpr.wave), bpr.trans)

In [22]:
model_mw_ext.color(sdssi, sdssr, time=[.1, .5, 1.], magsys='ab')


Out[22]:
array([ 0.6247266 ,  0.63931893,  0.65543875])

In [ ]: