def test_line_emission(): bms = BetaModelSource() ds = bms.ds def _dm_emission(field, data): return cross_section * (data["dark_matter_density"] / m_chi)**2 * data["cell_volume"] ds.add_field(("gas", "dm_emission"), function=_dm_emission, units="s**-1") location = YTQuantity(3.5, "keV") sigma = YTQuantity(1000., "km/s") sigma_E = (location * sigma / clight).in_units("keV") A = YTQuantity(1000., "cm**2") exp_time = YTQuantity(2.0e5, "s") redshift = 0.01 sphere = ds.sphere("c", (100., "kpc")) line_model = LineSourceModel(location, "dm_emission", sigma="dark_matter_dispersion", prng=32) photons = PhotonList.from_data_source(sphere, redshift, A, exp_time, line_model) D_A = photons.parameters["fid_d_a"] dist_fac = 1.0 / (4. * np.pi * D_A * D_A * (1. + redshift)**3) dm_E = (sphere["dm_emission"]).sum() E = uconcatenate(photons["energy"]) n_E = len(E) n_E_pred = (exp_time * A * dm_E * dist_fac).in_units("dimensionless") loc = location / (1. + redshift) sig = sigma_E / (1. + redshift) assert np.abs(loc - E.mean()) < 1.645 * sig / np.sqrt(n_E) assert np.abs(E.std()**2 - sig * sig) < 1.645 * np.sqrt(2 * (n_E - 1)) * sig**2 / n_E assert np.abs(n_E - n_E_pred) < 1.645 * np.sqrt(n_E)
def test_line_emission(): bms = BetaModelSource() ds = bms.ds def _dm_emission(field, data): return cross_section*(data["dark_matter_density"]/m_chi)**2*data["cell_volume"] ds.add_field(("gas","dm_emission"), function=_dm_emission, units="s**-1") location = YTQuantity(3.5, "keV") sigma = YTQuantity(1000., "km/s") sigma_E = (location*sigma/clight).in_units("keV") A = YTQuantity(1000., "cm**2") exp_time = YTQuantity(2.0e5, "s") redshift = 0.01 sphere = ds.sphere("c", (100.,"kpc")) line_model = LineSourceModel(location, "dm_emission", sigma="dark_matter_dispersion", prng=32) photons = PhotonList.from_data_source(sphere, redshift, A, exp_time, line_model) D_A = photons.parameters["fid_d_a"] dist_fac = 1.0/(4.*np.pi*D_A*D_A*(1.+redshift)**3) dm_E = (sphere["dm_emission"]).sum() E = uconcatenate(photons["energy"]) n_E = len(E) n_E_pred = (exp_time*A*dm_E*dist_fac).in_units("dimensionless") loc = location/(1.+redshift) sig = sigma_E/(1.+redshift) assert np.abs(loc-E.mean()) < 1.645*sig/np.sqrt(n_E) assert np.abs(E.std()**2-sig*sig) < 1.645*np.sqrt(2*(n_E-1))*sig**2/n_E assert np.abs(n_E-n_E_pred) < 1.645*np.sqrt(n_E)
def do_beta_model(source, v_field, em_field): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) ds = source.ds A = 3000. exp_time = 1.0e5 redshift = 0.05 nH_sim = 0.02 apec_model = TableApecModel(0.1, 11.5, 20000, thermal_broad=False) abs_model = TBabsModel(nH_sim) sphere = ds.sphere("c", (0.5, "Mpc")) kT_sim = source.kT Z_sim = source.Z thermal_model = ThermalSourceModel(apec_model, Zmet=Z_sim, prng=source.prng) photons = PhotonList.from_data_source(sphere, redshift, A, exp_time, thermal_model) D_A = photons.parameters["FiducialAngularDiameterDistance"] norm_sim = sphere.quantities.total_quantity(em_field) norm_sim *= 1.0e-14 / (4 * np.pi * D_A * D_A * (1. + redshift) * (1. + redshift)) norm_sim = float(norm_sim.in_cgs()) v1, v2 = sphere.quantities.weighted_variance(v_field, em_field) sigma_sim = float(v1.in_units("km/s")) mu_sim = -float(v2.in_units("km/s")) events = photons.project_photons("z", absorb_model=abs_model, prng=source.prng) events = ACIS_I(events, rebin=False, convolve_psf=False, prng=source.prng) events.write_spectrum("beta_model_evt.pi", clobber=True) os.system("cp %s ." % events.parameters["ARF"]) os.system("cp %s ." % events.parameters["RMF"]) load_user_model(mymodel, "tbapec") add_user_pars("tbapec", ["nH", "kT", "metallicity", "redshift", "norm"], [0.01, 4.0, 0.2, redshift, norm_sim * 0.8], parmins=[0.0, 0.1, 0.0, -20.0, 0.0], parmaxs=[10.0, 20.0, 10.0, 20.0, 1.0e9], parfrozen=[False, False, False, True, False]) load_pha("beta_model_evt.pi") set_stat("cstat") set_method("simplex") ignore(":0.5, 8.0:") set_model("tbapec") fit() set_covar_opt("sigma", 1.645) covar() res = get_covar_results() assert np.abs(res.parvals[0] - nH_sim) < res.parmaxes[0] assert np.abs(res.parvals[1] - kT_sim) < res.parmaxes[1] assert np.abs(res.parvals[2] - Z_sim) < res.parmaxes[2] assert np.abs(res.parvals[3] - norm_sim) < res.parmaxes[3] os.chdir(curdir) shutil.rmtree(tmpdir)
def plaw_fit(alpha_sim, prng=None): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) bms = BetaModelSource() ds = bms.ds if prng is None: prng = bms.prng def _hard_emission(field, data): return YTQuantity( 1.0e-18, "s**-1*keV**-1") * data["density"] * data["cell_volume"] / mp ds.add_field(("gas", "hard_emission"), function=_hard_emission, units="keV**-1*s**-1") nH_sim = 0.02 A = YTQuantity(2000., "cm**2") exp_time = YTQuantity(2.0e5, "s") redshift = 0.01 sphere = ds.sphere("c", (100., "kpc")) plaw_model = PowerLawSourceModel(1.0, 0.01, 11.0, "hard_emission", alpha_sim, prng=prng) photons = PhotonList.from_data_source(sphere, redshift, A, exp_time, plaw_model) D_A = photons.parameters["fid_d_a"] dist_fac = 1.0 / (4. * np.pi * D_A * D_A * (1. + redshift)**3).in_cgs() norm_sim = float( (sphere["hard_emission"]).sum() * dist_fac.in_cgs()) * (1. + redshift) events = photons.project_photons("z", [30., 45.], absorb_model="wabs", nH=nH_sim, prng=bms.prng, no_shifting=True) events.write_simput_file("plaw", overwrite=True) instrument_simulator("plaw_simput.fits", "plaw_evt.fits", exp_time, "sq_acisi_cy19", [30.0, 45.0], overwrite=True, foreground=False, ptsrc_bkgnd=False, instr_bkgnd=False, prng=prng) write_spectrum("plaw_evt.fits", "plaw_model_evt.pi", overwrite=True) os.system("cp %s %s ." % (arf.filename, rmf.filename)) load_user_model(mymodel, "wplaw") add_user_pars("wplaw", ["nH", "norm", "redshift", "alpha"], [0.01, norm_sim * 1.1, redshift, 0.9], parmins=[0.0, 0.0, 0.0, 0.1], parmaxs=[10.0, 1.0e9, 10.0, 10.0], parfrozen=[False, False, True, False]) load_pha("plaw_model_evt.pi") set_stat("cstat") set_method("simplex") ignore(":0.6, 7.0:") set_model("wplaw") fit() res = get_fit_results() assert np.abs(res.parvals[0] - nH_sim) / nH_sim < 0.1 assert np.abs(res.parvals[1] - norm_sim) / norm_sim < 0.05 assert np.abs(res.parvals[2] - alpha_sim) / alpha_sim < 0.05 os.chdir(curdir) shutil.rmtree(tmpdir)
def test_vapec_beta_model(): bms = BetaModelSource() tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng = 45 ds = bms.ds A = 30000. exp_time = 1.0e4 redshift = 0.05 nH_sim = 0.02 sphere = ds.sphere("c", (0.5, "Mpc")) kT_sim = bms.kT Z_sim = bms.Z O_sim = bms.O Ca_sim = bms.Ca var_elem = {"O": ("stream", "oxygen"), "Ca": ("stream", "calcium")} thermal_model = ThermalSourceModel("apec", 0.1, 11.5, 20000, var_elem=var_elem, Zmet=("gas","metallicity"), prng=prng) photons = PhotonList.from_data_source(sphere, redshift, A, exp_time, thermal_model) D_A = photons.parameters["fid_d_a"] norm_sim = sphere.quantities.total_quantity("emission_measure") norm_sim *= 1.0e-14/(4*np.pi*D_A*D_A*(1.+redshift)*(1.+redshift)) norm_sim = float(norm_sim.in_cgs()) events = photons.project_photons("z", [30.0, 45.0], absorb_model="tbabs", nH=nH_sim, prng=prng, no_shifting=True) new_events = Lynx_Calorimeter(events, prng=prng) os.system("cp %s %s ." % (arf.filename, rmf.filename)) new_events.write_channel_spectrum("var_abund_beta_model_evt.pha", overwrite=True) load_user_model(mymodel_var, "tbapec") add_user_pars("tbapec", ["nH", "kT", "abund", "redshift", "norm", "O", "Ca"], [nH_sim, 4.0, Z_sim, redshift, norm_sim*0.8, 0.3, 0.5], parmins=[0.0, 0.1, 0.0, -20.0, 0.0, 0.0, 0.0], parmaxs=[10.0, 20.0, 10.0, 20.0, 1.0e9, 10.0, 10.0], parfrozen=[True, False, True, True, False, False, False]) load_pha("var_abund_beta_model_evt.pha") set_stat("cstat") set_method("levmar") ignore(":0.6, 8.0:") set_model("tbapec") fit() res = get_fit_results() assert np.abs(res.parvals[0]-kT_sim)/kT_sim < 0.05 assert np.abs(res.parvals[1]-norm_sim)/norm_sim < 0.05 assert np.abs(res.parvals[2]-O_sim)/O_sim < 0.05 assert np.abs(res.parvals[3]-Ca_sim)/Ca_sim < 0.15 os.chdir(curdir) shutil.rmtree(tmpdir)
def do_beta_model(source, v_field, em_field, axis="z", prng=None): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) if prng is None: prng = source.prng ds = source.ds A = 30000. exp_time = 1.0e4 redshift = 0.05 nH_sim = 0.02 sphere = ds.sphere("c", (0.5, "Mpc")) kT_sim = source.kT Z_sim = source.Z thermal_model = ThermalSourceModel("apec", 0.1, 11.5, 20000, Zmet=Z_sim, prng=prng) photons = PhotonList.from_data_source(sphere, redshift, A, exp_time, thermal_model) D_A = photons.parameters["fid_d_a"] norm_sim = sphere.quantities.total_quantity(em_field) norm_sim *= 1.0e-14/(4*np.pi*D_A*D_A*(1.+redshift)*(1.+redshift)) norm_sim = float(norm_sim.in_cgs()) v1, v2 = sphere.quantities.weighted_variance(v_field, em_field) if isinstance(axis, string_types): if axis == "z": fac = 1.0 else: fac = 0.0 else: axis /= np.sqrt(np.dot(axis, axis)) fac = np.dot(axis, [0.0, 0.0, 1.0]) sigma_sim = fac*float(v1.in_units("km/s")) mu_sim = -fac*float(v2.in_units("km/s")) events = photons.project_photons(axis, [30.0, 45.0], absorb_model="tbabs", nH=nH_sim, prng=prng) events.write_simput_file("beta_model", overwrite=True) instrument_simulator("beta_model_simput.fits", "beta_model_evt.fits", exp_time, "mucal", [30.0, 45.0], overwrite=True, foreground=False, ptsrc_bkgnd=False, instr_bkgnd=False, prng=prng) write_spectrum("beta_model_evt.fits", "beta_model_evt.pi", overwrite=True) os.system("cp %s %s ." % (arf.filename, rmf.filename)) load_user_model(mymodel, "tbapec") add_user_pars("tbapec", ["nH", "kT", "metallicity", "redshift", "norm", "velocity"], [0.02, 4.0, 0.2, 0.04, norm_sim*0.8, 300.0], parmins=[0.0, 0.1, 0.0, -200.0, 0.0, 0.0], parmaxs=[10.0, 20.0, 10.0, 200.0, 1.0e9, 20000.0], parfrozen=[True, False, False, False, False, False]) load_pha("beta_model_evt.pi") set_stat("cstat") set_method("levmar") ignore(":0.6, 8.0:") set_model("tbapec") fit() res = get_fit_results() redshift_sim = (1.0+mu_sim/ckms)*(1.0+redshift) - 1.0 assert np.abs(res.parvals[0]-kT_sim)/kT_sim < 0.05 assert np.abs(res.parvals[1]-Z_sim)/Z_sim < 0.05 assert np.abs(res.parvals[2]-redshift_sim)/redshift_sim < 0.05 assert np.abs(res.parvals[3]-norm_sim) < 0.05 assert np.abs(res.parvals[4]-sigma_sim) < 30.0 os.chdir(curdir) shutil.rmtree(tmpdir)
def test_sloshing(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng = RandomState(0x4d3d3d3) ds = data_dir_load(gslr) A = 2000. exp_time = 1.0e4 redshift = 0.1 sphere = ds.sphere("c", (0.1, "Mpc")) sphere.set_field_parameter("X_H", 0.75) thermal_model = ThermalSourceModel("apec", 0.1, 11.0, 10000, Zmet=0.3, thermal_broad=False, prng=prng) photons1 = PhotonList.from_data_source(sphere, redshift, A, exp_time, thermal_model) return_photons = return_data(photons1.photons) nphots = 0 for i in range(4): phots = PhotonList.from_data_source(sphere, redshift, A, 0.25*exp_time, thermal_model) phots.write_h5_file("split_photons_%d.h5" % i) nphots += len(phots.photons["energy"]) merge_files(["split_photons_%d.h5" % i for i in range(4)], "merged_photons.h5", add_exposure_times=True, overwrite=True) merged_photons = PhotonList.from_file("merged_photons.h5") assert len(merged_photons.photons["energy"]) == nphots assert merged_photons.parameters["fid_exp_time"] == exp_time events1 = photons1.project_photons([1.0,-0.5,0.2], [30., 45.], absorb_model="tbabs", nH=0.1, prng=prng) return_events = return_data(events1.events) events1.write_spectrum("test_events_spec.fits", 0.2, 10.0, 2000) f = pyfits.open("test_events_spec.fits") return_spec = return_data(f["SPECTRUM"].data["COUNTS"]) f.close() events1.write_fits_image("test_events_img.fits", (20.0, "arcmin"), 1024) f = pyfits.open("test_events_img.fits") return_img = return_data(f[0].data) f.close() tests = [GenericArrayTest(ds, return_photons, args=["photons"]), GenericArrayTest(ds, return_events, args=["events"]), GenericArrayTest(ds, return_spec, args=["spec"]), GenericArrayTest(ds, return_img, args=["img"])] for test in tests: test_sloshing.__name__ = test.description yield test photons1.write_h5_file("test_photons.h5") events1.write_h5_file("test_events.h5") events1.write_fits_file("test_events.fits", 20.0, 1024) photons2 = PhotonList.from_file("test_photons.h5") events2 = EventList.from_h5_file("test_events.h5") events3 = EventList.from_fits_file("test_events.fits") for k in photons1.keys(): if k == "energy": arr1 = uconcatenate(photons1[k]) arr2 = uconcatenate(photons2[k]) else: arr1 = photons1[k] arr2 = photons2[k] assert_array_equal(arr1, arr2) for k in events2.keys(): assert_array_equal(events1[k], events2[k]) assert_allclose(events2[k], events3[k], rtol=1.0e-6) nevents = 0 for i in range(4): events = photons1.project_photons([1.0, -0.5, 0.2], [30., 45.], absorb_model="tbabs", nH=0.1, prng=prng) events.write_h5_file("split_events_%d.h5" % i) nevents += len(events["xsky"]) merge_files(["split_events_%d.h5" % i for i in range(4)], "merged_events.h5", add_exposure_times=True, overwrite=True) merged_events = EventList.from_h5_file("merged_events.h5") assert len(merged_events["xsky"]) == nevents assert merged_events.parameters["exp_time"] == 4.0*exp_time os.chdir(curdir) shutil.rmtree(tmpdir)
def test_sloshing(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng = RandomState(0x4d3d3d3) ds = data_dir_load(gslr) A = 2000. exp_time = 1.0e4 redshift = 0.1 apec_model = TableApecModel(0.1, 11.0, 10000) tbabs_model = TBabsModel(0.1) sphere = ds.sphere("c", (0.1, "Mpc")) sphere.set_field_parameter("X_H", 0.75) thermal_model = ThermalSourceModel(apec_model, Zmet=0.3, prng=prng) photons1 = PhotonList.from_data_source(sphere, redshift, A, exp_time, thermal_model) return_photons = return_data(photons1.photons) tests = [GenericArrayTest(ds, return_photons, args=["photons"])] for a, r, i in zip(arfs, rmfs, instruments): arf = AuxiliaryResponseFile(a, rmffile=r) events1 = photons1.project_photons([1.0, -0.5, 0.2], area_new=arf.max_area, absorb_model=tbabs_model, prng=prng) events1["xsky"] events1 = i(events1, rebin=False, convolve_psf=False, prng=prng) return_events = return_data(events1.events) tests.append(GenericArrayTest(ds, return_events, args=[a])) for test in tests: test_sloshing.__name__ = test.description yield test photons1.write_h5_file("test_photons.h5") events1.write_h5_file("test_events.h5") photons2 = PhotonList.from_file("test_photons.h5") events2 = EventList.from_h5_file("test_events.h5") for k in photons1.keys(): if k == "Energy": arr1 = uconcatenate(photons1[k]) arr2 = uconcatenate(photons2[k]) else: arr1 = photons1[k] arr2 = photons2[k] yield assert_array_equal, arr1, arr2 for k in events1.keys(): yield assert_array_equal, events1[k], events2[k] nevents = 0 for i in range(4): events = photons1.project_photons([1.0, -0.5, 0.2], exp_time_new=0.25 * exp_time, absorb_model=tbabs_model, prng=prng) events.write_h5_file("split_events_%d.h5" % i) nevents += len(events["xsky"]) merge_files(["split_events_%d.h5" % i for i in range(4)], "merged_events.h5", add_exposure_times=True, clobber=True) merged_events = EventList.from_h5_file("merged_events.h5") assert len(merged_events["xsky"]) == nevents assert merged_events.parameters["ExposureTime"] == exp_time os.chdir(curdir) shutil.rmtree(tmpdir)
def plaw_fit(alpha_sim): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) bms = BetaModelSource() ds = bms.ds def _hard_emission(field, data): return YTQuantity(1.0e-18, "s**-1*keV**-1")*data["density"]*data["cell_volume"]/mp ds.add_field(("gas", "hard_emission"), function=_hard_emission, units="keV**-1*s**-1") nH_sim = 0.02 abs_model = WabsModel(nH_sim) A = YTQuantity(2000., "cm**2") exp_time = YTQuantity(2.0e5, "s") redshift = 0.01 sphere = ds.sphere("c", (100.,"kpc")) plaw_model = PowerLawSourceModel(1.0, 0.01, 11.0, "hard_emission", alpha_sim, prng=prng) photons = PhotonList.from_data_source(sphere, redshift, A, exp_time, plaw_model) D_A = photons.parameters["FiducialAngularDiameterDistance"] dist_fac = 1.0/(4.*np.pi*D_A*D_A*(1.+redshift)**3).in_cgs() norm_sim = float((sphere["hard_emission"]).sum()*dist_fac.in_cgs())*(1.+redshift) events = photons.project_photons("z", absorb_model=abs_model, prng=bms.prng, no_shifting=True) events = ACIS_I(events, rebin=False, convolve_psf=False, prng=bms.prng) events.write_spectrum("plaw_model_evt.pi", clobber=True) os.system("cp %s ." % events.parameters["ARF"]) os.system("cp %s ." % events.parameters["RMF"]) load_user_model(mymodel, "wplaw") add_user_pars("wplaw", ["nH", "norm", "redshift", "alpha"], [0.01, norm_sim*1.1, redshift, 0.9], parmins=[0.0, 0.0, 0.0, 0.1], parmaxs=[10.0, 1.0e9, 10.0, 10.0], parfrozen=[False, False, True, False]) load_pha("plaw_model_evt.pi") set_stat("cstat") set_method("simplex") ignore(":0.6, 7.0:") set_model("wplaw") fit() set_covar_opt("sigma", 1.645) covar() res = get_covar_results() assert np.abs(res.parvals[0]-nH_sim) < res.parmaxes[0] assert np.abs(res.parvals[1]-norm_sim) < res.parmaxes[1] assert np.abs(res.parvals[2]-alpha_sim) < res.parmaxes[2] os.chdir(curdir) shutil.rmtree(tmpdir)