def get_phosimVars(self): """ Obtain variables sedFilepath to be used to obtain unique filenames for each SED for phoSim and MagNorm which is also used. Note that aside from acting as a getter, this also writes spectra to `self.sn_sedfile_prefix`snid_mjd_band.dat for each observation of interest """ # construct the unique filename # method: snid_mjd(to 4 places of decimal)_bandpassname mjd = "_{:0.4f}_".format(self.mjdobs) mjd += self.obs_metadata.bandpass + '.dat' fnames = np.array([ self.sn_sedfile_prefix + str(int(elem)) + mjd if isinstance( elem, numbers.Number) else self.sn_sedfile_prefix + str(elem) + mjd for elem in self.column_by_name('snid') ], dtype='str') c, x1, x0, t0, z = self.column_by_name('c'),\ self.column_by_name('x1'),\ self.column_by_name('x0'),\ self.column_by_name('t0'),\ self.column_by_name('redshift') bp = Bandpass() bp.imsimBandpass() magNorms = np.zeros(len(fnames)) snobject = SNObject() snobject.rectifySED = True for i in range(len(self.column_by_name('snid'))): # if t0 is nan, this was set by the catalog for dim SN, or SN # outside redshift range, We will not provide a SED file for these if np.isnan(t0[i]): magNorms[i] = np.nan fnames[i] = None else: snobject.set(c=c[i], x1=x1[i], x0=x0[i], t0=t0[i], z=z[i]) if snobject.modelOutSideTemporalRange == 'zero': if self.mjdobs > snobject.maxtime( ) or self.mjdobs < snobject.mintime(): magNorms[i] = np.nan fnames[i] = None # SED in rest frame sed = snobject.SNObjectSourceSED(time=self.mjdobs) try: magNorms[i] = sed.calcMag(bandpass=bp) except: # sed.flambda = 1.0e-20 magNorms[i] = 1000. # sed.calcMag(bandpass=bp) if self.writeSedFile: sed.writeSED(fnames[i]) return (fnames, magNorms)
def get_phosimVars(self): """ Obtain variables sedFilepath to be used to obtain unique filenames for each SED for phoSim and MagNorm which is also used. Note that aside from acting as a getter, this also writes spectra to `self.sn_sedfile_prefix`snid_mjd_band.dat for each observation of interest """ # construct the unique filename # method: snid_mjd(to 4 places of decimal)_bandpassname mjd = "_{:0.4f}_".format(self.mjdobs) mjd += self.obs_metadata.bandpass + '.dat' fnames = np.array([self.sn_sedfile_prefix + str(int(elem)) + mjd if isinstance(elem, numbers.Number) else self.sn_sedfile_prefix + str(elem) + mjd for elem in self.column_by_name('snid')], dtype='str') c, x1, x0, t0, z = self.column_by_name('c'),\ self.column_by_name('x1'),\ self.column_by_name('x0'),\ self.column_by_name('t0'),\ self.column_by_name('redshift') bp = Bandpass() bp.imsimBandpass() magNorms = np.zeros(len(fnames)) snobject = SNObject() snobject.rectifySED = True for i in range(len(self.column_by_name('snid'))): # if t0 is nan, this was set by the catalog for dim SN, or SN # outside redshift range, We will not provide a SED file for these if np.isnan(t0[i]): magNorms[i] = np.nan fnames[i] = None else: snobject.set(c=c[i], x1=x1[i], x0=x0[i], t0=t0[i], z=z[i]) if snobject.modelOutSideTemporalRange == 'zero': if self.mjdobs > snobject.maxtime() or self.mjdobs < snobject.mintime(): magNorms[i] = np.nan fnames[i] = None # SED in rest frame sed = snobject.SNObjectSourceSED(time=self.mjdobs) try: magNorms[i] = sed.calcMag(bandpass=bp) except: # sed.flambda = 1.0e-20 magNorms[i] = 1000. # sed.calcMag(bandpass=bp) if self.writeSedFile: sed.writeSED(fnames[i]) return (fnames, magNorms)
def get_snbrightness(self): """ getters for brightness related parameters of sn """ if self._sn_object_cache is None or len( self._sn_object_cache) > 1000000: self._sn_object_cache = {} c, x1, x0, t0, _z, ra, dec = self.column_by_name('c'),\ self.column_by_name('x1'),\ self.column_by_name('x0'),\ self.column_by_name('t0'),\ self.column_by_name('redshift'),\ self.column_by_name('raJ2000'),\ self.column_by_name('decJ2000') raDeg = np.degrees(ra) decDeg = np.degrees(dec) ebv = self.column_by_name('EBV') id_list = self.column_by_name('snid') bandname = self.obs_metadata.bandpass if isinstance(bandname, list): raise ValueError('bandname expected to be string, but is list\n') bandpass = self.lsstBandpassDict[bandname] # Initialize return array so that it contains the values you would get # if you passed through a t0=self.badvalues supernova vals = np.array([[0.0] * len(t0), [np.inf] * len(t0), [np.nan] * len(t0), [np.inf] * len(t0), [0.0] * len(t0)]).transpose() for i in np.where( np.logical_and( np.isfinite(t0), np.abs(self.mjdobs - t0) < self.maxTimeSNVisible))[0]: if id_list[i] in self._sn_object_cache: SNobject = self._sn_object_cache[id_list[i]] else: SNobject = SNObject() SNobject.set(z=_z[i], c=c[i], x1=x1[i], t0=t0[i], x0=x0[i]) SNobject.setCoords(ra=raDeg[i], dec=decDeg[i]) SNobject.set_MWebv(ebv[i]) self._sn_object_cache[id_list[i]] = SNobject if self.mjdobs <= SNobject.maxtime( ) and self.mjdobs >= SNobject.mintime(): # Calculate fluxes fluxinMaggies = SNobject.catsimBandFlux( time=self.mjdobs, bandpassobject=bandpass) mag = SNobject.catsimBandMag(time=self.mjdobs, fluxinMaggies=fluxinMaggies, bandpassobject=bandpass) vals[i, 0] = fluxinMaggies vals[i, 1] = mag flux_err = SNobject.catsimBandFluxError( time=self.mjdobs, bandpassobject=bandpass, m5=self.obs_metadata.m5[bandname], photParams=self.photometricparameters, fluxinMaggies=fluxinMaggies, magnitude=mag) mag_err = SNobject.catsimBandMagError( time=self.mjdobs, bandpassobject=bandpass, m5=self.obs_metadata.m5[bandname], photParams=self.photometricparameters, magnitude=mag) sed = SNobject.SNObjectSED(time=self.mjdobs, bandpass=self.lsstBandpassDict, applyExtinction=True) adu = sed.calcADU(bandpass, photParams=self.photometricparameters) vals[i, 2] = flux_err vals[i, 3] = mag_err vals[i, 4] = adu return (vals[:, 0], vals[:, 1], vals[:, 2], vals[:, 3], vals[:, 4])
def _light_curves_from_query(self, cat_dict, query_result, grp, lc_per_field=None): t_dict = {} gamma_dict = {} m5_dict = {} t_min = None t_max = None for bp_name in cat_dict: self.lsstBandpassDict[bp_name].sbTophi() # generate a 2-D numpy array containing MJDs, m5, and photometric gamma values # for each observation in the given bandpass raw_array = np.array([[obs.mjd.TAI, obs.m5[bp_name], calcGamma(self.lsstBandpassDict[bp_name], obs.m5[obs.bandpass], self.phot_params)] for obs in grp if obs.bandpass == bp_name]).transpose() if len(raw_array) > 0: t_dict[bp_name] = raw_array[0] m5_dict[bp_name] = raw_array[1] gamma_dict[bp_name] = raw_array[2] local_t_min = t_dict[bp_name].min() local_t_max = t_dict[bp_name].max() if t_min is None or local_t_min < t_min: t_min = local_t_min if t_max is None or local_t_max > t_max: t_max = local_t_max snobj = SNObject() cat = cat_dict[list(cat_dict.keys())[0]] # does not need to be associated with a bandpass dummy_sed = Sed() n_actual_sn = 0 # how many SN have we actually delivered? for chunk in query_result: if lc_per_field is not None and n_actual_sn >= lc_per_field: break t_start_chunk = time.time() for sn in cat.iter_catalog(query_cache=[chunk]): sn_rng = self.sn_universe.getSN_rng(sn[1]) sn_t0 = self.sn_universe.drawFromT0Dist(sn_rng) if sn[5] <= self.z_cutoff and np.isfinite(sn_t0) and \ sn_t0 < t_max + cat.maxTimeSNVisible and \ sn_t0 > t_min - cat.maxTimeSNVisible: sn_c = self.sn_universe.drawFromcDist(sn_rng) sn_x1 = self.sn_universe.drawFromx1Dist(sn_rng) sn_x0 = self.sn_universe.drawFromX0Dist(sn_rng, sn_x1, sn_c, sn[4]) snobj.set(t0=sn_t0, c=sn_c, x1=sn_x1, x0=sn_x0, z=sn[5]) for bp_name in t_dict: t_list = t_dict[bp_name] m5_list = m5_dict[bp_name] gamma_list = gamma_dict[bp_name] bandpass = self.lsstBandpassDict[bp_name] if len(t_list) == 0: continue if snobj.maxtime() >= t_list[0] and snobj.mintime() <= t_list[-1]: active_dexes = np.where(np.logical_and(t_list >= snobj.mintime(), t_list <= snobj.maxtime())) t_active = t_list[active_dexes] m5_active = m5_list[active_dexes] gamma_active = gamma_list[active_dexes] if len(t_active) > 0: wave_ang = bandpass.wavelen*10.0 mask = np.logical_and(wave_ang > snobj.minwave(), wave_ang < snobj.maxwave()) wave_ang = wave_ang[mask] snobj.set(mwebv=sn[6]) sn_ff_buffer = snobj.flux(time=t_active, wave=wave_ang)*10.0 flambda_grid = np.zeros((len(t_active), len(bandpass.wavelen))) for ff, ff_sn in zip(flambda_grid, sn_ff_buffer): ff[mask] = np.where(ff_sn > 0.0, ff_sn, 0.0) fnu_grid = flambda_grid*bandpass.wavelen* \ bandpass.wavelen*dummy_sed._physParams.nm2m* \ dummy_sed._physParams.ergsetc2jansky/dummy_sed._physParams.lightspeed flux_list = \ (fnu_grid*bandpass.phi).sum(axis=1)*(bandpass.wavelen[1]-bandpass.wavelen[0]) acceptable = np.where(flux_list>0.0) flux_error_list = flux_list[acceptable]/ \ calcSNR_m5(dummy_sed.magFromFlux(flux_list[acceptable]), bandpass, m5_active[acceptable], self.phot_params, gamma=gamma_active[acceptable]) if len(acceptable) > 0: n_actual_sn += 1 if lc_per_field is not None and n_actual_sn > lc_per_field: break if sn[0] not in self.truth_dict: self.truth_dict[sn[0]] = {} self.truth_dict[sn[0]]['t0'] = sn_t0 self.truth_dict[sn[0]]['x1'] = sn_x1 self.truth_dict[sn[0]]['x0'] = sn_x0 self.truth_dict[sn[0]]['c'] = sn_c self.truth_dict[sn[0]]['z'] = sn[5] self.truth_dict[sn[0]]['E(B-V)'] = sn[6] if sn[0] not in self.mjd_dict: self.mjd_dict[sn[0]] = {} self.bright_dict[sn[0]] = {} self.sig_dict[sn[0]] = {} if bp_name not in self.mjd_dict[sn[0]]: self.mjd_dict[sn[0]][bp_name] = [] self.bright_dict[sn[0]][bp_name] = [] self.sig_dict[sn[0]][bp_name] = [] for tt, ff, ee in zip(t_active[acceptable], flux_list[acceptable], flux_error_list[0]): self.mjd_dict[sn[0]][bp_name].append(tt) self.bright_dict[sn[0]][bp_name].append(ff/3631.0) self.sig_dict[sn[0]][bp_name].append(ee/3631.0) print("chunk of ", len(chunk), " took ", time.time()-t_start_chunk)
def get_snbrightness(self): """ getters for brightness related parameters of sn """ if self._sn_object_cache is None or len(self._sn_object_cache) > 1000000: self._sn_object_cache = {} c, x1, x0, t0, _z, ra, dec = self.column_by_name('c'),\ self.column_by_name('x1'),\ self.column_by_name('x0'),\ self.column_by_name('t0'),\ self.column_by_name('redshift'),\ self.column_by_name('raJ2000'),\ self.column_by_name('decJ2000') raDeg = np.degrees(ra) decDeg = np.degrees(dec) ebv = self.column_by_name('EBV') id_list = self.column_by_name('snid') bandname = self.obs_metadata.bandpass if isinstance(bandname, list): raise ValueError('bandname expected to be string, but is list\n') bandpass = self.lsstBandpassDict[bandname] # Initialize return array so that it contains the values you would get # if you passed through a t0=self.badvalues supernova vals = np.array([[0.0]*len(t0), [np.inf]*len(t0), [np.nan]*len(t0), [np.inf]*len(t0), [0.0]*len(t0)]).transpose() for i in np.where(np.logical_and(np.isfinite(t0), np.abs(self.mjdobs - t0) < self.maxTimeSNVisible))[0]: if id_list[i] in self._sn_object_cache: SNobject = self._sn_object_cache[id_list[i]] else: SNobject = SNObject() SNobject.set(z=_z[i], c=c[i], x1=x1[i], t0=t0[i], x0=x0[i]) SNobject.setCoords(ra=raDeg[i], dec=decDeg[i]) SNobject.set_MWebv(ebv[i]) self._sn_object_cache[id_list[i]] = SNobject if self.mjdobs <= SNobject.maxtime() and self.mjdobs >= SNobject.mintime(): # Calculate fluxes fluxinMaggies = SNobject.catsimBandFlux(time=self.mjdobs, bandpassobject=bandpass) mag = SNobject.catsimBandMag(time=self.mjdobs, fluxinMaggies=fluxinMaggies, bandpassobject=bandpass) vals[i, 0] = fluxinMaggies vals[i, 1] = mag flux_err = SNobject.catsimBandFluxError(time=self.mjdobs, bandpassobject=bandpass, m5=self.obs_metadata.m5[ bandname], photParams=self.photometricparameters, fluxinMaggies=fluxinMaggies, magnitude=mag) mag_err = SNobject.catsimBandMagError(time=self.mjdobs, bandpassobject=bandpass, m5=self.obs_metadata.m5[ bandname], photParams=self.photometricparameters, magnitude=mag) sed = SNobject.SNObjectSED(time=self.mjdobs, bandpass=self.lsstBandpassDict, applyExtinction=True) adu = sed.calcADU(bandpass, photParams=self.photometricparameters) vals[i, 2] = flux_err vals[i, 3] = mag_err vals[i, 4] = adu return (vals[:, 0], vals[:, 1], vals[:, 2], vals[:, 3], vals[:, 4])