Skip to content

Commit

Permalink
Merge pull request #4 from LSSTDESC/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
pgris authored Aug 7, 2020
2 parents 713388f + 20eec8d commit fa884c3
Show file tree
Hide file tree
Showing 3 changed files with 253 additions and 63 deletions.
15 changes: 12 additions & 3 deletions sn_tools/sn_calcFast.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def __init__(self, reference_lc, dustcorr, x1, color,
telescope, mjdCol='observationStartMJD',
RACol='fieldRA', DecCol='fieldDec',
filterCol='filter', exptimeCol='visitExposureTime',
m5Col='fiveSigmaDepth', seasonCol='season', nexpCol='numExposures',
m5Col='fiveSigmaDepth', seasonCol='season', nexpCol='numExposures',seeingCol='seeingFwhmEff',
snr_min=5.,
lightOutput=True,
ebvofMW=-1.0,
Expand All @@ -72,6 +72,8 @@ def __init__(self, reference_lc, dustcorr, x1, color,
self.exptimeCol = exptimeCol
self.seasonCol = seasonCol
self.nexpCol = nexpCol
self.seeingCol = seeingCol

self.x1 = x1
self.color = color
self.lightOutput = lightOutput
Expand Down Expand Up @@ -399,9 +401,13 @@ def processBand(self, sel_obs, ebvofMW, band, gen_par, j=-1, output_q=None):
np.tile(sel_obs[self.nexpCol], (nvals, 1)), mask=~flag)
m5_obs = np.ma.array(
np.tile(sel_obs[self.m5Col], (nvals, 1)), mask=~flag)
if self.seeingCol in sel_obs.dtype.names:
seeings = np.ma.array(
np.tile(sel_obs[self.seeingCol], (nvals, 1)), mask=~flag)

healpixIds = np.ma.array(
np.tile(sel_obs['healpixID'].astype(int), (nvals, 1)), mask=~flag)

pixRAs = np.ma.array(
np.tile(sel_obs['pixRA'], (nvals, 1)), mask=~flag)

Expand Down Expand Up @@ -430,12 +436,15 @@ def processBand(self, sel_obs, ebvofMW, band, gen_par, j=-1, output_q=None):
lc['mag'] = mag_obs[~mag_obs.mask]
if not self.lightOutput:
lc['gamma'] = gammas[~gammas.mask]
lc['m5'] = m5_obs[~m5_obs.mask]
lc['m5'] = m5_obs[~m5_obs.mask]
lc['mag'] = mag_obs[~mag_obs.mask]
lc['magerr'] = (2.5/np.log(10.))/snr_m5[~snr_m5.mask]
lc['time'] = obs_time[~obs_time.mask]
lc[self.exptimeCol] = exp_time[~exp_time.mask]
lc[self.nexpCol] = nexposures[~nexposures.mask]
if self.seeingCol in sel_obs.dtype.names:
lc[self.seeingCol] = seeings[~seeings.mask]

lc['band'] = ['LSST::'+band]*len(lc)
lc['zp'] = self.zp[band]
lc['zp'] = 2.5*np.log10(3631)
Expand Down
68 changes: 35 additions & 33 deletions sn_tools/sn_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,19 +138,13 @@ class GenerateSample:
filterCol : str, opt
name of the column corresponding to filter
Default : 'filter'
min_rf_phase : float, opt
min rest-frame phase for supernovae
Default : -15.
max_rf_phase : float, opt
max rest-frame phase for supernovae
Default : 30.
area : float, opt
area of the survey (in deg\^2)
Default : 9.6 deg\^2
"""

def __init__(self, sn_parameters, cosmo_parameters, mjdCol='mjd', seasonCol='season', filterCol='filter', min_rf_phase=-15., max_rf_phase=30., area=9.6, dirFiles='reference_files', web_path=''):
def __init__(self, sn_parameters, cosmo_parameters, mjdCol='mjd', seasonCol='season', filterCol='filter', area=9.6, dirFiles='reference_files', web_path=''):
self.dirFiles = dirFiles
self.params = sn_parameters
self.sn_rate = SN_Rate(rate=self.params['z']['rate'],
Expand All @@ -162,8 +156,10 @@ def __init__(self, sn_parameters, cosmo_parameters, mjdCol='mjd', seasonCol='sea
self.seasonCol = seasonCol
self.filterCol = filterCol
self.area = area
self.min_rf_phase = min_rf_phase
self.max_rf_phase = max_rf_phase
self.min_rf_phase = self.params['min_rf_phase']
self.max_rf_phase =self.params['max_rf_phase']
self.min_rf_phase_qual = self.params['min_rf_phase_qual']
self.max_rf_phase_qual =self.params['max_rf_phase_qual']
self.web_path = web_path

def __call__(self, obs):
Expand Down Expand Up @@ -195,6 +191,10 @@ def __call__(self, obs):
min rest-frame phase for LC points
max_rf_phase, float
max rest-frame phase for LC points
min_rf_phase_qual, float
min rest-frame phase for T0 estimation
max_rf_phase_qual, float
max rest-frame phase for T0 estimation
"""
epsilon = 1.e-08

Expand All @@ -216,7 +216,7 @@ def __call__(self, obs):
if len(r) > 0:
names = ['z', 'x1', 'color', 'daymax',
'epsilon_x0', 'epsilon_x1', 'epsilon_color',
'epsilon_daymax', 'min_rf_phase', 'max_rf_phase']
'epsilon_daymax', 'min_rf_phase', 'max_rf_phase','min_rf_phase_qual','max_rf_phase_qual']
types = ['f8']*len(names)
# params = np.zeros(len(r), dtype=list(zip(names, types)))
params = np.asarray(r, dtype=list(zip(names, types)))
Expand Down Expand Up @@ -259,7 +259,10 @@ def getParameters(self, daymin, daymax, duration):
min rest-frame phase for LC points
max_rf_phase, float
max rest-frame phase for LC points
min_rf_phase_qual, float
min rest-frame phase for T0 estimation
max_rf_phase, float
max rest-frame phase for T0 estimation
"""

# get z range
Expand Down Expand Up @@ -304,7 +307,7 @@ def getParameters(self, daymin, daymax, duration):
T0_values = [daymin+21.*(1.+z)]
if self.params['daymax']['type'] == 'random':
T0_values = np.arange(
daymin-(1.+z)*self.min_rf_phase, daymax-(1.+z)*self.max_rf_phase, 0.1)
daymin-(1.+z)*self.min_rf_phase_qual, daymax-(1.+z)*self.max_rf_phase, 0.1)
dist_daymax = T0_values
# print('daymax',dist_daymax,type(dist_daymax))
if dist_daymax.size == 0:
Expand All @@ -313,7 +316,7 @@ def getParameters(self, daymin, daymax, duration):
-1., dist_daymax,
[1./len(dist_daymax)]*len(dist_daymax))
r.append((z, x1_color[0], x1_color[1], T0, 0.,
0., 0., 0., self.min_rf_phase, self.max_rf_phase))
0., 0., 0., self.min_rf_phase_qual, self.max_rf_phase))

if self.params['z']['type'] == 'uniform':
zstep = self.params['z']['step']
Expand All @@ -326,8 +329,8 @@ def getParameters(self, daymin, daymax, duration):
if z < 1.e-6:
z = 0.01
if self.params['daymax']['type'] == 'uniform':
T0_min = daymin-(1.+z)*self.min_rf_phase
T0_max = daymax-(1.+z)*self.max_rf_phase
T0_min = daymin-(1.+z)*self.min_rf_phase_qual
T0_max = daymax-(1.+z)*self.max_rf_phase_qual
T0_min = daymin
T0_max = daymax
nT0 = int((T0_max-T0_min)/daystep)
Expand All @@ -341,22 +344,22 @@ def getParameters(self, daymin, daymax, duration):

for T0 in T0_values:
r.append((z, x1_color[0], x1_color[1], T0, 0.,
0., 0., 0., self.min_rf_phase, self.max_rf_phase))
0., 0., 0., self.min_rf_phase, self.max_rf_phase,self.min_rf_phase_qual, self.max_rf_phase_qual))

if self.params['z']['type'] == 'unique':
daystep = self.params['daymax']['step']
x1_color = self.params['x1_color']['min']
z = self.params['z']['min']
if self.params['daymax']['type'] == 'uniform':
T0_min = daymin-(1.+z)*self.min_rf_phase
T0_max = daymax-(1.+z)*self.max_rf_phase
T0_min = daymin-(1.+z)*self.min_rf_phase_qual
T0_max = daymax-(1.+z)*self.max_rf_phase_qual
nT0 = int((T0_max-T0_min)/daystep)
T0_values = np.linspace(T0_min, T0_max, nT0+1)
if self.params['daymax']['type'] == 'unique':
T0_values = [daymin+21.*(1.+z)]
for T0 in T0_values:
r.append((z, x1_color[0], x1_color[1], T0, 0.,
0., 0., 0., self.min_rf_phase, self.max_rf_phase))
0., 0., 0., self.min_rf_phase, self.max_rf_phase,self.min_rf_phase_qual, self.max_rf_phase_qual))
rdiff = []
if self.params['differential_flux']:
for rstart in r:
Expand Down Expand Up @@ -471,11 +474,6 @@ class SimuParameters:
filterCol : str, opt
name of the column corresponding to filter
Default : 'filter'
min_rf_phase : float, opt
min rest-frame phase for supernovae
Default : -15.
max_rf_phase : float, opt
max rest-frame phase for supernovae
Default : 30.
area : float, opt
area of the survey (in deg\^2)
Expand All @@ -488,8 +486,7 @@ class SimuParameters:
"""

def __init__(self, sn_parameters, cosmo_parameters,
mjdCol='mjd', seasonCol='season', filterCol='filter',
min_rf_phase=-15., max_rf_phase=30., area=9.6, dirFiles='reference_files', web_path=''):
mjdCol='mjd', seasonCol='season', filterCol='filter',area=9.6, dirFiles='reference_files', web_path=''):
self.dirFiles = dirFiles
self.params = sn_parameters
self.sn_rate = SN_Rate(rate=self.params['z']['rate'],
Expand All @@ -501,8 +498,10 @@ def __init__(self, sn_parameters, cosmo_parameters,
self.seasonCol = seasonCol
self.filterCol = filterCol
self.area = area
self.min_rf_phase = min_rf_phase
self.max_rf_phase = max_rf_phase
self.min_rf_phase = self.params['min_rf_phase']
self.max_rf_phase = self.params['max_rf_phase']
self.min_rf_phase_qual = self.params['min_rf_phase_qual']
self.max_rf_phase_qual = self.params['max_rf_phase_qual']

def getDist(self, rate):
""" get (x1,color) distributions
Expand Down Expand Up @@ -549,7 +548,7 @@ def Params(self, obs):
----------
numpy array with the following columns:
color, z, daymax, x1, epsilon_x0, epsilon_x1,
epsilon_color, epsilon_daymax, min_rf_phase, max_rf_phase
epsilon_color, epsilon_daymax, min_rf_phase, max_rf_phase,min_rf_phase_qual,max_rf_phase_qual
"""

Expand Down Expand Up @@ -601,7 +600,10 @@ def Params(self, obs):
# finally add min and max rf
pars['min_rf_phase'] = self.min_rf_phase
pars['max_rf_phase'] = self.max_rf_phase
pars['min_rf_phase_qual'] = self.min_rf_phase_qual
pars['max_rf_phase_qual'] = self.max_rf_phase_qual


#print('total number of SN to simulate:', len(pars))
return pars.to_records(index=False)

Expand Down Expand Up @@ -689,8 +691,8 @@ def daymaxdist(self, pars, daymin, daymax):
if daymaxtype == 'uniform':
daymaxdf = pd.DataFrame()
for z in pars['z'].values:
daymax_min = daymin-(1.+z)*self.min_rf_phase
daymax_max = daymax-(1.+z)*self.max_rf_phase
daymax_min = daymin-(1.+z)*self.min_rf_phase_qual
daymax_max = daymax-(1.+z)*self.max_rf_phase_qual
if daymax_max-daymax_min >= 10:
ndaymax = int((daymax_max-daymax_min)/daymaxstep)+1
df = pd.DataFrame(np.linspace(
Expand All @@ -700,8 +702,8 @@ def daymaxdist(self, pars, daymin, daymax):

if daymaxtype == 'random':
daymaxdf = pd.DataFrame(pars)
daymaxdf['daymax_min'] = daymin-(1.+pars['z'])*self.min_rf_phase
daymaxdf['daymax_max'] = daymax-(1.+pars['z'])*self.max_rf_phase
daymaxdf['daymax_min'] = daymin-(1.+pars['z'])*self.min_rf_phase_qual
daymaxdf['daymax_max'] = daymax-(1.+pars['z'])*self.max_rf_phase_qual
idx = daymaxdf['daymax_max']-daymaxdf['daymax_min'] >= 10.
daymaxdf = daymaxdf[idx]
if len(daymaxdf) > 0:
Expand Down
Loading

0 comments on commit fa884c3

Please sign in to comment.