def _get_sed_mags_and_cosmology(catalog_name): """ Returns 3 numpy arrays: sed_names, sed_mag_list, sed_mag_norm and a dictionary for cosmology sed_names is 1d str array, with length = number of SED files in the library sed_mag_list is MxN float array, with M = number of SED files in the library, and N = number of top hat filters in the catalog sed_mag_norm is 1d float array, with length = number of SED files in the library cosmology = {'H0': H0, 'Om0': Om0} """ gc = GCRCatalogs.load_catalog(catalog_name, config_overwrite=dict(md5=False)) cosmo = dict(H0=gc.cosmology.H0.value, Om0=gc.cosmology.Om0) bp_params_raw = {'disk': set(), 'bulge': set()} for q in gc.list_all_quantities(): m = _gcr_sed_re.match(q) if m: wav0, width, tag = m.groups() bp_params_raw[tag].add((int(wav0), int(width))) assert bp_params_raw['disk'] == bp_params_raw[ 'bulge'], 'SEDs for disk and bulge do not match' assert bp_params_raw['disk'], 'No SED found' bp_params_sorted = sorted(bp_params_raw['disk'], key=lambda p: p[0]) # SED labels in GCR specify the band pass in angstrom, but CatSim uses nm # Hence the conversion factor 0.1 in the code below wav_min = bp_params_sorted[0][0] * 0.1 wav_max = max((0.1 * (wav0 + width) for wav0, width in bp_params_sorted)) wav_grid = np.arange(wav_min, wav_max, 0.1) bp_name_list = list() bp_list = list() for wav0, width in bp_params_sorted: sb_grid = ((wav_grid >= wav0 * 0.1) & (wav_grid <= (wav0 + width) * 0.1)).astype(float) bp_list.append(Bandpass(wavelen=wav_grid, sb=sb_grid)) bp_name_list.append('%d_%d' % (wav0, width)) bandpass_dict = BandpassDict(bp_list, bp_name_list) sed_names = list() sed_mag_list = list() sed_mag_norm = list() imsim_bp = Bandpass() imsim_bp.imsimBandpass() for sed_file_name in os.listdir(_galaxy_sed_dir): spec = Sed() spec.readSED_flambda(os.path.join(_galaxy_sed_dir, sed_file_name)) sed_names.append(sed_file_name) sed_mag_list.append(tuple(bandpass_dict.magListForSed(spec))) sed_mag_norm.append(spec.calcMag(imsim_bp)) return np.array(sed_names), np.array(sed_mag_list), np.array( sed_mag_norm), cosmo
def _create_sed_library_mags(wav_min, wav_width): """ Calculate the magnitudes of the SEDs in sims_sed_library dir in the tophat filters specified by wav_min, wav_width Parameters ---------- wav_min is a numpy array of the minimum wavelengths of the tophat filters (in nm) wav_width is a numpy array of the widths of the tophat filters (in nm) Returns ------- sed_names is an array containing the names of the SED files sed_mag_list is MxN float array, with M = number of SED files in the library, and N = number of top hat filters in the catalog sed_mag_norm is 1d float array, with length = number of SED files in the library """ wav_max = max((wav0 + width for wav0, width in zip(wav_min, wav_width))) wav_grid = np.arange(wav_min.min(), wav_max, 0.1) bp_name_list = list() bp_list = list() for wav0, width in zip(wav_min, wav_width): sb_grid = ((wav_grid >= wav0) & (wav_grid <= (wav0 + width))).astype(float) bp_list.append(Bandpass(wavelen=wav_grid, sb=sb_grid)) bp_name_list.append('%d_%d' % (wav0, width)) bandpass_dict = BandpassDict(bp_list, bp_name_list) sed_names = list() sed_mag_list = list() sed_mag_norm = list() imsim_bp = Bandpass() imsim_bp.imsimBandpass() for sed_file_name in os.listdir(_galaxy_sed_dir): spec = Sed() spec.readSED_flambda(os.path.join(_galaxy_sed_dir, sed_file_name)) sed_names.append(defaultSpecMap[sed_file_name]) sed_mag_list.append(tuple(bandpass_dict.magListForSed(spec))) sed_mag_norm.append(spec.calcMag(imsim_bp)) return np.array(sed_names), np.array(sed_mag_list), np.array(sed_mag_norm)
def testMagListForSed(self): """ Test that magListForSed calculates the correct magnitude """ wavelen = numpy.arange(10.0,2000.0,1.0) flux = (wavelen*2.0-5.0)*1.0e-6 spectrum = Sed(wavelen=wavelen, flambda=flux) for nBp in range(3, 10, 1): nameList, bpList = self.getListOfBandpasses(nBp) testDict = BandpassDict(bpList, nameList) self.assertFalse(len(testDict.values()[0].wavelen)==len(spectrum.wavelen)) magList = testDict.magListForSed(spectrum) for ix, (name, bp, magTest) in enumerate(zip(nameList, bpList, magList)): magControl = spectrum.calcMag(bp) self.assertAlmostEqual(magTest, magControl, 5)
def testMagListForSed(self): """ Test that magListForSed calculates the correct magnitude """ wavelen = numpy.arange(10.0,2000.0,1.0) flux = (wavelen*2.0-5.0)*1.0e-6 spectrum = Sed(wavelen=wavelen, flambda=flux) for nBp in range(3, 10, 1): nameList, bpList = self.getListOfBandpasses(nBp) testDict = BandpassDict(bpList, nameList) self.assertFalse(len(testDict.values()[0].wavelen)==len(spectrum.wavelen)) magList = testDict.magListForSed(spectrum) for ix, (name, bp, magTest) in enumerate(zip(nameList, bpList, magList)): magControl = spectrum.calcMag(bp) self.assertAlmostEqual(magTest, magControl, 5)
def testIndicesOnMagnitudes(self): """ Test that, when you pass a list of indices into the calcMagList methods, you get the correct magnitudes out. """ nBandpasses = 7 nameList, bpList = self.getListOfBandpasses(nBandpasses) testBpDict = BandpassDict(bpList, nameList) # first try it with a single Sed wavelen = numpy.arange(10.0,2000.0,1.0) flux = (wavelen*2.0-5.0)*1.0e-6 spectrum = Sed(wavelen=wavelen, flambda=flux) indices = [1,2,5] magList = testBpDict.magListForSed(spectrum, indices=indices) ctNaN = 0 for ix, (name, bp, magTest) in enumerate(zip(nameList, bpList, magList)): if ix in indices: magControl = spectrum.calcMag(bp) self.assertAlmostEqual(magTest, magControl, 5) else: ctNaN += 1 self.assertTrue(numpy.isnan(magTest)) self.assertEqual(ctNaN, 4) nSed = 20 sedNameList = self.getListOfSedNames(nSed) magNormList = numpy.random.random_sample(nSed)*5.0 + 15.0 internalAvList = numpy.random.random_sample(nSed)*0.3 + 0.1 redshiftList = numpy.random.random_sample(nSed)*5.0 galacticAvList = numpy.random.random_sample(nSed)*0.3 + 0.1 # now try a SedList without a wavelenMatch testSedList = SedList(sedNameList, magNormList, internalAvList=internalAvList, redshiftList=redshiftList, galacticAvList=galacticAvList) magList = testBpDict.magListForSedList(testSedList, indices=indices) self.assertEqual(magList.shape[0], nSed) self.assertEqual(magList.shape[1], nBandpasses) for ix, sedObj in enumerate(testSedList): dummySed = Sed(wavelen=copy.deepcopy(sedObj.wavelen), flambda=copy.deepcopy(sedObj.flambda)) ctNaN = 0 for iy, bp in enumerate(testBpDict): if iy in indices: mag = dummySed.calcMag(testBpDict[bp]) self.assertAlmostEqual(mag, magList[ix][iy], 2) else: ctNaN += 1 self.assertTrue(numpy.isnan(magList[ix][iy])) self.assertEqual(ctNaN, 4) # now use wavelenMatch testSedList = SedList(sedNameList, magNormList, internalAvList=internalAvList, redshiftList=redshiftList, galacticAvList=galacticAvList, wavelenMatch=testBpDict.wavelenMatch) magList = testBpDict.magListForSedList(testSedList, indices=indices) self.assertEqual(magList.shape[0], nSed) self.assertEqual(magList.shape[1], nBandpasses) for ix, sedObj in enumerate(testSedList): dummySed = Sed(wavelen=copy.deepcopy(sedObj.wavelen), flambda=copy.deepcopy(sedObj.flambda)) ctNaN = 0 for iy, bp in enumerate(testBpDict): if iy in indices: mag = dummySed.calcMag(testBpDict[bp]) self.assertAlmostEqual(mag, magList[ix][iy], 2) else: ctNaN += 1 self.assertTrue(numpy.isnan(magList[ix][iy])) self.assertEqual(ctNaN, 4)
sorted_dex = np.argsort(bp_min_list) bp_min_list = bp_min_list[sorted_dex] bp_name_list = bp_name_list[sorted_dex] bp_list = bp_list[sorted_dex] bp_dict = BandpassDict(bp_list, bp_name_list) import os from lsst.utils import getPackageDir from lsst.sims.photUtils import Sed galaxy_sed_dir = os.path.join(getPackageDir('sims_sed_library'), 'galaxySED') sed_file_list = os.listdir(galaxy_sed_dir) with open('CatSimMagGrid.txt', 'w') as out_file: out_file.write('# sed_name ') for bp_name in bp_dict: out_file.write('%s ' % bp_name) out_file.write('magNorm\n') for file_name in sed_file_list: full_name = os.path.join(galaxy_sed_dir, file_name) spec = Sed() spec.readSED_flambda(full_name) mag_list = bp_dict.magListForSed(spec) mag_norm = spec.calcMag(imsim_bp) out_file.write('%s ' % file_name) for i_filter in range(len(bp_dict)): out_file.write('%.6g ' % mag_list[i_filter]) out_file.write('%.6g\n' % mag_norm)
def testIndicesOnMagnitudes(self): """ Test that, when you pass a list of indices into the calcMagList methods, you get the correct magnitudes out. """ nBandpasses = 7 nameList, bpList = self.getListOfBandpasses(nBandpasses) testBpDict = BandpassDict(bpList, nameList) # first try it with a single Sed wavelen = numpy.arange(10.0,2000.0,1.0) flux = (wavelen*2.0-5.0)*1.0e-6 spectrum = Sed(wavelen=wavelen, flambda=flux) indices = [1,2,5] magList = testBpDict.magListForSed(spectrum, indices=indices) ctNaN = 0 for ix, (name, bp, magTest) in enumerate(zip(nameList, bpList, magList)): if ix in indices: magControl = spectrum.calcMag(bp) self.assertAlmostEqual(magTest, magControl, 5) else: ctNaN += 1 self.assertTrue(numpy.isnan(magTest)) self.assertEqual(ctNaN, 4) nSed = 20 sedNameList = self.getListOfSedNames(nSed) magNormList = numpy.random.random_sample(nSed)*5.0 + 15.0 internalAvList = numpy.random.random_sample(nSed)*0.3 + 0.1 redshiftList = numpy.random.random_sample(nSed)*5.0 galacticAvList = numpy.random.random_sample(nSed)*0.3 + 0.1 # now try a SedList without a wavelenMatch testSedList = SedList(sedNameList, magNormList, internalAvList=internalAvList, redshiftList=redshiftList, galacticAvList=galacticAvList) magList = testBpDict.magListForSedList(testSedList, indices=indices) self.assertEqual(magList.shape[0], nSed) self.assertEqual(magList.shape[1], nBandpasses) for ix, sedObj in enumerate(testSedList): dummySed = Sed(wavelen=copy.deepcopy(sedObj.wavelen), flambda=copy.deepcopy(sedObj.flambda)) ctNaN = 0 for iy, bp in enumerate(testBpDict): if iy in indices: mag = dummySed.calcMag(testBpDict[bp]) self.assertAlmostEqual(mag, magList[ix][iy], 2) else: ctNaN += 1 self.assertTrue(numpy.isnan(magList[ix][iy])) self.assertEqual(ctNaN, 4) # now use wavelenMatch testSedList = SedList(sedNameList, magNormList, internalAvList=internalAvList, redshiftList=redshiftList, galacticAvList=galacticAvList, wavelenMatch=testBpDict.wavelenMatch) magList = testBpDict.magListForSedList(testSedList, indices=indices) self.assertEqual(magList.shape[0], nSed) self.assertEqual(magList.shape[1], nBandpasses) for ix, sedObj in enumerate(testSedList): dummySed = Sed(wavelen=copy.deepcopy(sedObj.wavelen), flambda=copy.deepcopy(sedObj.flambda)) ctNaN = 0 for iy, bp in enumerate(testBpDict): if iy in indices: mag = dummySed.calcMag(testBpDict[bp]) self.assertAlmostEqual(mag, magList[ix][iy], 2) else: ctNaN += 1 self.assertTrue(numpy.isnan(magList[ix][iy])) self.assertEqual(ctNaN, 4)