def test_beta_model_flux(answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) r_c = 20.0 beta = 1.0 prng = 34 beta_src_pos = BetaModel(ra0, dec0, r_c, beta) sim_cat = SimputCatalog.from_models("beta", "beta", spec, beta_src_pos, exp_time, area, prng=prng) sim_cat.write_catalog(overwrite=True) instrument_simulator("beta_simput.fits", "beta_flux_evt.fits", exp_time, "acisi_cy0", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, roll_angle=37.0, prng=prng) wspec = spec.new_spec_from_band(0.5, 7.0) make_exposure_map("beta_flux_evt.fits", "beta_expmap.fits", wspec.emid.value, weights=wspec.flux.value, overwrite=True) write_radial_profile("beta_flux_evt.fits", "beta_flux_evt_profile.fits", [ra0, dec0], 0.0, 100.0, 200, ctr_type="celestial", emin=0.5, emax=7.0, expmap_file="beta_expmap.fits", overwrite=True) file_answer_testing("EVENTS", "beta_flux_evt.fits", answer_store, answer_dir) file_answer_testing("PROFILE", "beta_flux_evt_profile.fits", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_annulus(answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) r_in = 10.0 r_out = 30.0 ann_pos = AnnulusModel(ra0, dec0, r_in, r_out) ann_src = SimputPhotonList.from_models("ann", spec, ann_pos, exp_time, area, prng=prng) sim_cat = SimputCatalog.from_source("ann_simput.fits", ann_src, overwrite=True) instrument_simulator("ann_simput.fits", "ann_evt.fits", exp_time, "lynx_hdxi", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) write_radial_profile("ann_evt.fits", "ann_evt_profile.fits", [ra0, dec0], 1.1*r_in, 0.9*r_out, 100, ctr_type="celestial", emin=0.5, emax=7.0, overwrite=True) file_answer_testing("EVENTS", "ann_evt.fits", answer_store, answer_dir) file_answer_testing("PROFILE", "ann_evt_profile.fits", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_thermal(answer_store, answer_dir): prng = RandomState(71) tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) spectrum_answer_testing(spec, "thermal_spec.h5", answer_store, answer_dir) pt_src_pos = PointSourceModel(30.0, 45.0) sim_cat = SimputCatalog.from_models("thermal_model", "thermal_model", spec, pt_src_pos, exp_time, area, prng=prng) sim_cat.write_catalog(overwrite=True) instrument_simulator("thermal_model_simput.fits", "thermal_model_evt.fits", exp_time, inst_name, [30.0, 45.0], ptsrc_bkgnd=False, foreground=False, instr_bkgnd=False, prng=prng) write_spectrum("thermal_model_evt.fits", "thermal_model_evt.pha", overwrite=True) file_answer_testing("EVENTS", "thermal_model_evt.fits", answer_store, answer_dir) file_answer_testing("SPECTRUM", "thermal_model_evt.pha", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_annulus(answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) r_in = 10.0 r_out = 30.0 ann_pos = AnnulusModel(ra0, dec0, r_in, r_out) sim_cat = SimputCatalog.from_models("ann", "ann", spec, ann_pos, exp_time, area, prng=prng) sim_cat.write_catalog(overwrite=True) instrument_simulator("ann_simput.fits", "ann_evt.fits", exp_time, "hdxi", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) write_radial_profile("ann_evt.fits", "ann_evt_profile.fits", [ra0, dec0], 1.1*r_in, 0.9*r_out, 100, ctr_type="celestial", emin=0.5, emax=7.0, overwrite=True) file_answer_testing("EVENTS", "ann_evt.fits", answer_store, answer_dir) file_answer_testing("PROFILE", "ann_evt_profile.fits", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_add_background(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng1 = RandomState(29) prng2 = RandomState(29) ra0 = 30.0 dec0 = 45.0 ra1 = 22.0 dec1 = 22.0 exp_time = 50000.0 instrument_simulator(None, "evt1.fits", exp_time, "lynx_hdxi", [ra0, dec0], prng=prng1, overwrite=True) make_background_file("bkg_evt.fits", exp_time, "lynx_hdxi", [ra0, dec0], prng=prng2, overwrite=True) instrument_simulator(None, "evt2.fits", exp_time, "lynx_hdxi", [ra1, dec1], bkgnd_file="bkg_evt.fits", prng=prng2, overwrite=True) f1 = pyfits.open("evt1.fits") f2 = pyfits.open("evt2.fits") for key in ["X", "Y", "ENERGY", "PHA"]: assert_allclose(f1["EVENTS"].data[key], f2["EVENTS"].data[key], rtol=1.0e-6) f1.close() f2.close() os.chdir(curdir) shutil.rmtree(tmpdir)
def test_beta_model(answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng = 32 r_c = 20.0 beta = 1.0 exp_time = Quantity(500.0, "ks") beta_src_pos = BetaModel(ra0, dec0, r_c, beta) beta_src = SimputPhotonList.from_models("beta", spec, beta_src_pos, exp_time, area, prng=prng) sim_cat = SimputCatalog.from_source("beta_simput.fits", beta_src, overwrite=True) instrument_simulator("beta_simput.fits", "beta_evt.fits", exp_time, "chandra_acisi_cy0", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) write_radial_profile("beta_evt.fits", "beta_evt_profile.fits", [ra0, dec0], 0.0, 100.0, 200, ctr_type="celestial", emin=0.5, emax=7.0, overwrite=True) file_answer_testing("EVENTS", "beta_evt.fits", answer_store, answer_dir) file_answer_testing("PROFILE", "beta_evt_profile.fits", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_beta_model(answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng = 32 r_c = 20.0 beta = 1.0 exp_time = Quantity(500.0, "ks") beta_src_pos = BetaModel(ra0, dec0, r_c, beta) sim_cat = SimputCatalog.from_models("beta", "beta", spec, beta_src_pos, exp_time, area, prng=prng) sim_cat.write_catalog(overwrite=True) instrument_simulator("beta_simput.fits", "beta_evt.fits", exp_time, "acisi_cy0", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) write_radial_profile("beta_evt.fits", "beta_evt_profile.fits", [ra0, dec0], 0.0, 100.0, 200, ctr_type="celestial", emin=0.5, emax=7.0, overwrite=True) file_answer_testing("EVENTS", "beta_evt.fits", answer_store, answer_dir) file_answer_testing("PROFILE", "beta_evt_profile.fits", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_point_source(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) pt_src = SimputSpectrum.from_spectrum("pt_src", spec, ra0, dec0) cat = SimputCatalog.from_source("pt_src_simput.fits", pt_src, overwrite=True) inst = get_instrument_from_registry("lynx_hdxi") inst["name"] = "hdxi_big_psf" inst["psf"] = ["gaussian", 5.0] add_instrument_to_registry(inst) instrument_simulator("pt_src_simput.fits", "pt_src_evt.fits", exp_time, "hdxi_big_psf", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) psf_scale = inst["psf"][1] dtheta = inst["fov"]*60.0/inst["num_pixels"] f = pyfits.open("pt_src_evt.fits") x = f["EVENTS"].data["X"] y = f["EVENTS"].data["Y"] f.close() scalex = np.std(x)*sigma_to_fwhm*dtheta scaley = np.std(y)*sigma_to_fwhm*dtheta assert (scalex - psf_scale)/psf_scale < 0.03 assert (scaley - psf_scale)/psf_scale < 0.03 os.chdir(curdir) shutil.rmtree(tmpdir)
def test_background(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) kT_sim = 1.0 Z_sim = 0.0 norm_sim = 4.0e-2 nH_sim = 0.04 redshift = 0.01 exp_time = (200., "ks") area = (1000., "cm**2") fov = (10.0, "arcmin") prng = 24 agen = ApecGenerator(0.05, 12.0, 5000, broadening=False) spec = agen.get_spectrum(kT_sim, Z_sim, redshift, norm_sim) spec.apply_foreground_absorption(norm_sim) events = make_background(area, exp_time, fov, (30.0, 45.0), spec, prng=prng) events.write_simput_file("bkgnd", overwrite=True) instrument_simulator("bkgnd_simput.fits", "bkgnd_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("bkgnd_evt.fits", "background_evt.pi", overwrite=True) os.system("cp %s %s ." % (arf.filename, rmf.filename)) load_user_model(mymodel, "wapec") add_user_pars("wapec", ["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("background_evt.pi") set_stat("cstat") set_method("simplex") ignore(":0.5, 8.0:") set_model("wapec") fit() res = get_fit_results() assert np.abs(res.parvals[0]-nH_sim)/nH_sim < 0.1 assert np.abs(res.parvals[1]-kT_sim)/kT_sim < 0.05 assert np.abs(res.parvals[2]-Z_sim) < 0.05 assert np.abs(res.parvals[3]-norm_sim)/norm_sim < 0.05 os.chdir(curdir) shutil.rmtree(tmpdir)
def test_point_source(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) nH_sim = 0.02 norm_sim = 1.0e-4 alpha_sim = 0.95 redshift = 0.02 exp_time = (100., "ks") area = (3000., "cm**2") spec = Spectrum.from_powerlaw(alpha_sim, redshift, norm_sim, emin=0.1, emax=11.5, nbins=2000) spec.apply_foreground_absorption(nH_sim, model="tbabs") positions = [(30.01, 45.0)] events = make_point_sources(area, exp_time, positions, (30.0, 45.0), spec, prng=prng) events.write_simput_file("ptsrc", overwrite=True) instrument_simulator("ptsrc_simput.fits", "ptsrc_evt.fits", exp_time, "sq_aciss_cy19", [30.0, 45.0], overwrite=True, foreground=False, ptsrc_bkgnd=False, instr_bkgnd=False, prng=prng) write_spectrum("ptsrc_evt.fits", "point_source_evt.pi", overwrite=True) os.system("cp %s %s ." % (arf.filename, rmf.filename)) load_user_model(mymodel, "tplaw") add_user_pars("tplaw", ["nH", "norm", "redshift", "alpha"], [0.02, norm_sim*0.8, redshift, 0.9], parmins=[0.0, 0.0, 0.0, 0.1], parmaxs=[10.0, 1.0e9, 10.0, 10.0], parfrozen=[True, False, True, False]) load_pha("point_source_evt.pi") set_stat("cstat") set_method("simplex") ignore(":0.4, 9.0:") set_model("tplaw") fit() res = get_fit_results() assert np.abs(res.parvals[0]-norm_sim)/norm_sim < 0.05 assert np.abs(res.parvals[1]-alpha_sim)/alpha_sim < 0.05 os.chdir(curdir) shutil.rmtree(tmpdir)
def test_point_source(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) nH_sim = 0.02 norm_sim = 1.0e-4 alpha_sim = 0.95 redshift = 0.02 exp_time = (100., "ks") area = (3000., "cm**2") spec = Spectrum.from_powerlaw(alpha_sim, redshift, norm_sim, emin=0.1, emax=11.5, nbins=2000) spec.apply_foreground_absorption(nH_sim, model="tbabs") positions = [(30.01, 45.0)] events = make_point_sources(area, exp_time, positions, (30.0, 45.0), spec, prng=prng) events.write_simput_file("ptsrc", overwrite=True) instrument_simulator("ptsrc_simput.fits", "ptsrc_evt.fits", exp_time, "sq_aciss_cy20", [30.0, 45.0], overwrite=True, foreground=False, ptsrc_bkgnd=False, instr_bkgnd=False, prng=prng) write_spectrum("ptsrc_evt.fits", "point_source_evt.pi", overwrite=True) os.system("cp %s %s ." % (arf.filename, rmf.filename)) load_user_model(mymodel, "tplaw") add_user_pars("tplaw", ["nH", "norm", "redshift", "alpha"], [0.02, norm_sim*0.8, redshift, 0.9], parmins=[0.0, 0.0, 0.0, 0.1], parmaxs=[10.0, 1.0e9, 10.0, 10.0], parfrozen=[True, False, True, False]) load_pha("point_source_evt.pi") set_stat("cstat") set_method("simplex") ignore(":0.4, 9.0:") set_model("tplaw") fit() res = get_fit_results() assert np.abs(res.parvals[0]-norm_sim)/norm_sim < 0.05 assert np.abs(res.parvals[1]-alpha_sim)/alpha_sim < 0.05 os.chdir(curdir) shutil.rmtree(tmpdir)
def plaw_fit(alpha_sim, answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) nH_sim = 0.02 norm_sim = 1.0e-4 redshift = 0.01 exp_time = (50.0, "ks") area = 40000.0 inst_name = "new_hdxi" spec = Spectrum.from_powerlaw(alpha_sim, redshift, norm_sim, 0.1, 10.0, 20000) spec.apply_foreground_absorption(nH_sim, model="tbabs") spectrum_answer_testing(spec, f"power_law_{alpha_sim}.h5", answer_store, answer_dir) pt_src_pos = PointSourceModel(30.0, 45.0) pt_src = SimputPhotonList.from_models("plaw_model", spec, pt_src_pos, exp_time, area, prng=prng) cat = SimputCatalog.from_source("plaw_model_simput.fits", pt_src, overwrite=True) instrument_simulator("plaw_model_simput.fits", f"plaw_model_{alpha_sim}_evt.fits", exp_time, inst_name, [30.0, 45.0], instr_bkgnd=False, ptsrc_bkgnd=False, foreground=False, prng=prng) write_spectrum(f"plaw_model_{alpha_sim}_evt.fits", f"plaw_model_{alpha_sim}_evt.pha", overwrite=True) file_answer_testing("EVENTS", f"plaw_model_{alpha_sim}_evt.fits", answer_store, answer_dir) file_answer_testing("SPECTRUM", f"plaw_model_{alpha_sim}_evt.pha", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_emission_line(answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) const_flux = 1.0e-4 line_pos = 5.0 line_width = 0.02 line_amp = 1.0e-5 exp_time = (100.0, "ks") area = 30000.0 inst_name = "lynx_lxm" spec = Spectrum.from_constant(const_flux, 1.0, 10.0, 20000) spec.add_emission_line(line_pos, line_width, line_amp) spectrum_answer_testing(spec, "emission_line_test.h5", answer_store, answer_dir) pt_src_pos = PointSourceModel(30.0, 45.0) sim_cat = SimputCatalog.from_models("emission_line", "emission_line", spec, pt_src_pos, exp_time, area, prng=prng) sim_cat.write_catalog(overwrite=True) instrument_simulator("emission_line_simput.fits", "emission_line_evt.fits", exp_time, inst_name, [30.0, 45.0], instr_bkgnd=False, ptsrc_bkgnd=False, foreground=False, prng=prng) write_spectrum("emission_line_evt.fits", "emission_line_evt.pha", overwrite=True) file_answer_testing("EVENTS", "emission_line_evt.fits", answer_store, answer_dir) file_answer_testing("SPECTRUM", "emission_line_evt.pha", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_point_source(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) e = spec.generate_energies(exp_time, area, prng=prng) pt_src = PointSourceModel(ra0, dec0, e.size) write_photon_list("pt_src", "pt_src", e.flux, pt_src.ra, pt_src.dec, e, overwrite=True) inst = get_instrument_from_registry("hdxi") inst["name"] = "hdxi_big_psf" inst["psf"] = ["gaussian", 5.0] add_instrument_to_registry(inst) instrument_simulator("pt_src_simput.fits", "pt_src_evt.fits", exp_time, "hdxi_big_psf", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) psf_scale = inst["psf"][1] dtheta = inst["fov"] * 60.0 / inst["num_pixels"] f = pyfits.open("pt_src_evt.fits") x = f["EVENTS"].data["X"] y = f["EVENTS"].data["Y"] f.close() scalex = np.std(x) * sigma_to_fwhm * dtheta scaley = np.std(y) * sigma_to_fwhm * dtheta assert (scalex - psf_scale) / psf_scale < 0.01 assert (scaley - psf_scale) / psf_scale < 0.01 os.chdir(curdir) shutil.rmtree(tmpdir)
def test_add_background(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng1 = RandomState(29) prng2 = RandomState(29) ra0 = 30.0 dec0 = 45.0 ra1 = 22.0 dec1 = 22.0 exp_time = 50000.0 ra = np.array([]) dec = np.array([]) e = np.array([]) empty_cat = {"ra": [ra], "dec": [dec], "energy": [e], "flux": [0.0], "emin": [0.1], "emax": [10.0], "sources": ["empty"]} instrument_simulator(empty_cat, "evt1.fits", exp_time, "hdxi", [ra0, dec0], prng=prng1, overwrite=True) make_background_file("bkg_evt.fits", exp_time, "hdxi", [ra0, dec0], prng=prng2, overwrite=True) instrument_simulator(empty_cat, "evt2.fits", exp_time, "hdxi", [ra1, dec1], bkgnd_file="bkg_evt.fits", prng=prng2, overwrite=True) f1 = pyfits.open("evt1.fits") f2 = pyfits.open("evt2.fits") for key in ["X", "Y", "ENERGY", "PHA"]: assert_allclose(f1["EVENTS"].data[key], f2["EVENTS"].data[key], ) f1.close() f2.close() os.chdir(curdir) shutil.rmtree(tmpdir)
def test_thermal_nei(answer_store, answer_dir): prng = RandomState(71) tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) spectrum_answer_testing(spec_nei, "thermal_spec_nei.h5", answer_store, answer_dir) pt_src_pos = PointSourceModel(30.0, 45.0) pt_src = SimputPhotonList.from_models("thermal_model_nei", spec_nei, pt_src_pos, exp_time, area, prng=prng) sim_cat = SimputCatalog.from_source("thermal_model_nei_simput.fits", pt_src, overwrite=True) instrument_simulator("thermal_model_nei_simput.fits", "thermal_model_nei_evt.fits", exp_time, inst_name, [30.0, 45.0], ptsrc_bkgnd=False, foreground=False, instr_bkgnd=False, prng=prng) write_spectrum("thermal_model_nei_evt.fits", "thermal_model_nei_evt.pha", overwrite=True) file_answer_testing("EVENTS", "thermal_model_nei_evt.fits", answer_store, answer_dir) file_answer_testing("SPECTRUM", "thermal_model_nei_evt.pha", answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def plaw_fit(alpha_sim, answer_store, answer_dir): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) nH_sim = 0.02 norm_sim = 1.0e-4 redshift = 0.01 exp_time = (50.0, "ks") area = 40000.0 inst_name = "new_hdxi" spec = Spectrum.from_powerlaw(alpha_sim, redshift, norm_sim, 0.1, 10.0, 20000) spec.apply_foreground_absorption(nH_sim, model="tbabs") spectrum_answer_testing(spec, "power_law_%s.h5" % alpha_sim, answer_store, answer_dir) pt_src_pos = PointSourceModel(30.0, 45.0) sim_cat = SimputCatalog.from_models("plaw_model", "plaw_model", spec, pt_src_pos, exp_time, area, prng=prng) sim_cat.write_catalog(overwrite=True) instrument_simulator("plaw_model_simput.fits", "plaw_model_%s_evt.fits" % alpha_sim, exp_time, inst_name, [30.0, 45.0], instr_bkgnd=False, ptsrc_bkgnd=False, foreground=False, prng=prng) write_spectrum("plaw_model_%s_evt.fits" % alpha_sim, "plaw_model_%s_evt.pha" % alpha_sim, overwrite=True) file_answer_testing("EVENTS", "plaw_model_%s_evt.fits" % alpha_sim, answer_store, answer_dir) file_answer_testing("SPECTRUM", "plaw_model_%s_evt.pha" % alpha_sim, answer_store, answer_dir) os.chdir(curdir) shutil.rmtree(tmpdir)
def test_point_source(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) pt_src_pos = PointSourceModel(ra0, dec0) sim_cat = SimputCatalog.from_models("pt_src", "pt_src", spec, pt_src_pos, exp_time, area, prng=prng) sim_cat.write_catalog(overwrite=True) inst = get_instrument_from_registry("hdxi") inst["name"] = "hdxi_big_psf" inst["psf"] = ["gaussian", 5.0] add_instrument_to_registry(inst) instrument_simulator("pt_src_simput.fits", "pt_src_evt.fits", exp_time, "hdxi_big_psf", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) psf_scale = inst["psf"][1] dtheta = inst["fov"]*60.0/inst["num_pixels"] f = pyfits.open("pt_src_evt.fits") x = f["EVENTS"].data["X"] y = f["EVENTS"].data["Y"] f.close() scalex = np.std(x)*sigma_to_fwhm*dtheta scaley = np.std(y)*sigma_to_fwhm*dtheta assert (scalex - psf_scale)/psf_scale < 0.03 assert (scaley - psf_scale)/psf_scale < 0.03 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 make_mosaic_events(pointing_list, input_source, out_prefix, exp_time, instrument, overwrite=False, instr_bkgnd=True, foreground=True, ptsrc_bkgnd=True, bkgnd_file=None, no_dither=False, dither_params=None, subpixel_res=False, aimpt_shift=None, prng=None): """ Observe a source from many different pointings. Parameters ---------- pointing_list : list of tuples or str Either a list of tuples or a two-column ASCII table, containing RA and Dec pointings for each mock observation. input_source : string The path to the SIMPUT catalog file which contains the input source(s). out_prefix : string The prefix for the event files which will be generated. exp_time : float, (value, unit) tuple, or :class:`~astropy.units.Quantity` The exposure time in seconds. instrument : string The name of the instrument to use, which picks an instrument specification from the instrument registry. overwrite : boolean, optional Whether or not to overwrite an existing file with the same name. Default: False instr_bkgnd : boolean, optional Whether or not to include the instrumental/particle background. Default: True foreground : boolean, optional Whether or not to include the local foreground. Default: True ptsrc_bkgnd : boolean, optional Whether or not to include the point-source background. Default: True bkgnd_file : string, optional If set, backgrounds will be loaded from this file and not generated on the fly. Default: None no_dither : boolean, optional If True, turn off dithering entirely. Default: False dither_params : array-like of floats, optional The parameters to use to control the size and period of the dither pattern. The first two numbers are the dither amplitude in x and y detector coordinates in arcseconds, and the second two numbers are the dither period in x and y detector coordinates in seconds. Default: [8.0, 8.0, 1000.0, 707.0]. subpixel_res: boolean, optional If True, event positions are not randomized within the pixels within which they are detected. Default: False aimpt_shift : array-like, optional A two-float array-like object which shifts the aimpoint on the detector from the nominal position. Units are in arcseconds. Default: None, which results in no shift from the nominal aimpoint. prng : :class:`~numpy.random.RandomState` object, integer, or None A pseudo-random number generator. Typically will only be specified if you have a reason to generate the same set of random numbers, such as for a test. Default is None, which sets the seed based on the system time. """ if isinstance(pointing_list, str): t = ascii.read(pointing_list, format='commented_header', guess=False, header_start=0, delimiter="\t") elif not isinstance(pointing_list, Table): t = Table(np.array(pointing_list), names=["ra", "dec"]) out_list = [] for i, row in enumerate(t): out_file = f"{out_prefix}_{i}_evt.fits" out_list.append(out_file) instrument_simulator(input_source, out_file, exp_time, instrument, (row["ra"], row["dec"]), overwrite=overwrite, instr_bkgnd=instr_bkgnd, foreground=foreground, ptsrc_bkgnd=ptsrc_bkgnd, bkgnd_file=bkgnd_file, no_dither=no_dither, dither_params=dither_params, subpixel_res=subpixel_res, aimpt_shift=aimpt_shift, prng=prng) t["evtfile"] = out_list outfile = f"{out_prefix}_event_mosaic.dat" mylog.info(f"Writing mosaic information to {outfile}.") t.write(outfile, overwrite=overwrite, delimiter="\t", format='ascii.commented_header') return outfile
def test_beta_model(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) r_c = 20.0 beta = 1.0 exp_time = Quantity(500.0, "ks") e = spec.generate_energies(exp_time, area, prng=prng) beta_src = BetaModel(ra0, dec0, r_c, beta, e.size, prng=prng) write_photon_list("beta", "beta", e.flux, beta_src.ra, beta_src.dec, e, overwrite=True) instrument_simulator("beta_simput.fits", "beta_evt.fits", exp_time, "hdxi", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) inst = get_instrument_from_registry("hdxi") arf = AuxiliaryResponseFile(inst["arf"]) cspec = ConvolvedSpectrum(spec, arf) ph_flux = cspec.get_flux_in_band(0.5, 7.0)[0].value S0 = 3.0 * ph_flux / (2.0 * np.pi * r_c * r_c) write_radial_profile("beta_evt.fits", "beta_evt_profile.fits", [ra0, dec0], 0.0, 100.0, 200, ctr_type="celestial", emin=0.5, emax=7.0, overwrite=True) load_data(1, "beta_evt_profile.fits", 3, ["RMID", "SUR_BRI", "SUR_BRI_ERR"]) set_stat("chi2") set_method("levmar") set_source("beta1d.src") src.beta = 1.0 src.r0 = 10.0 src.ampl = 0.8 * S0 freeze(src.xpos) fit() set_covar_opt("sigma", 1.645) covar() res = get_covar_results() assert np.abs(res.parvals[0] - r_c) < res.parmaxes[0] assert np.abs(res.parvals[1] - beta) < res.parmaxes[1] assert np.abs(res.parvals[2] - S0) < res.parmaxes[2] os.chdir(curdir) shutil.rmtree(tmpdir)
def test_beta_model_flux(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) r_c = 20.0 beta = 1.0 prng = 34 e = spec.generate_energies(exp_time, area, prng=prng) beta_src = BetaModel(ra0, dec0, r_c, beta, e.size, prng=prng) write_photon_list("beta", "beta", e.flux, beta_src.ra, beta_src.dec, e, overwrite=True) instrument_simulator("beta_simput.fits", "beta_evt.fits", exp_time, "acisi_cy0", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, roll_angle=37.0, prng=prng) ph_flux = spec.get_flux_in_band(0.5, 7.0)[0].value S0 = 3.0 * ph_flux / (2.0 * np.pi * r_c * r_c) wspec = spec.new_spec_from_band(0.5, 7.0) make_exposure_map("beta_evt.fits", "beta_expmap.fits", wspec.emid.value, weights=wspec.flux.value, overwrite=True) write_radial_profile("beta_evt.fits", "beta_evt_profile.fits", [ra0, dec0], 0.0, 100.0, 200, ctr_type="celestial", emin=0.5, emax=7.0, expmap_file="beta_expmap.fits", overwrite=True) load_data(1, "beta_evt_profile.fits", 3, ["RMID", "SUR_FLUX", "SUR_FLUX_ERR"]) set_stat("chi2") set_method("levmar") set_source("beta1d.src") src.beta = 1.0 src.r0 = 10.0 src.ampl = 0.8 * S0 freeze(src.xpos) fit() set_covar_opt("sigma", 1.645) covar() res = get_covar_results() assert np.abs(res.parvals[0] - r_c) < res.parmaxes[0] assert np.abs(res.parvals[1] - beta) < res.parmaxes[1] assert np.abs(res.parvals[2] - S0) < res.parmaxes[2] os.chdir(curdir) shutil.rmtree(tmpdir)
def test_annulus(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) r_in = 10.0 r_out = 30.0 e = spec.generate_energies(exp_time, area, prng=prng) ann_src = AnnulusModel(ra0, dec0, r_in, r_out, e.size, prng=prng) write_photon_list("ann", "ann", e.flux, ann_src.ra, ann_src.dec, e, overwrite=True) instrument_simulator("ann_simput.fits", "ann_evt.fits", exp_time, "hdxi", [ra0, dec0], ptsrc_bkgnd=False, instr_bkgnd=False, foreground=False, prng=prng) inst = get_instrument_from_registry("hdxi") arf = AuxiliaryResponseFile(inst["arf"]) cspec = ConvolvedSpectrum(spec, arf) ph_flux = cspec.get_flux_in_band(0.5, 7.0)[0].value S0 = ph_flux / (np.pi * (r_out**2 - r_in**2)) write_radial_profile("ann_evt.fits", "ann_evt_profile.fits", [ra0, dec0], 1.1 * r_in, 0.9 * r_out, 100, ctr_type="celestial", emin=0.5, emax=7.0, overwrite=True) load_data(1, "ann_evt_profile.fits", 3, ["RMID", "SUR_BRI", "SUR_BRI_ERR"]) set_stat("chi2") set_method("levmar") set_source("const1d.src") src.c0 = 0.8 * S0 fit() set_covar_opt("sigma", 1.645) covar() res = get_covar_results() assert np.abs(res.parvals[0] - S0) < res.parmaxes[0] 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_add_background(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) prng1 = RandomState(29) prng2 = RandomState(29) ra0 = 30.0 dec0 = 45.0 ra1 = 22.0 dec1 = 22.0 exp_time = 50000.0 ra = np.array([]) dec = np.array([]) e = np.array([]) empty_cat = { "ra": [ra], "dec": [dec], "energy": [e], "flux": [0.0], "emin": [0.1], "emax": [10.0], "sources": ["empty"] } instrument_simulator(empty_cat, "evt1.fits", exp_time, "hdxi", [ra0, dec0], prng=prng1, overwrite=True) make_background_file("bkg_evt.fits", exp_time, "hdxi", [ra0, dec0], prng=prng2, overwrite=True) instrument_simulator(empty_cat, "evt2.fits", exp_time, "hdxi", [ra1, dec1], bkgnd_file="bkg_evt.fits", prng=prng2, overwrite=True) f1 = pyfits.open("evt1.fits") f2 = pyfits.open("evt2.fits") for key in ["X", "Y", "ENERGY", "PHA"]: assert_allclose( f1["EVENTS"].data[key], f2["EVENTS"].data[key], ) f1.close() f2.close() os.chdir(curdir) shutil.rmtree(tmpdir)
def plaw_fit(alpha_sim): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) nH_sim = 0.02 norm_sim = 1.0e-4 redshift = 0.01 exp_time = 5.0e4 area = 40000.0 inst_name = "hdxi" spec = Spectrum.from_powerlaw(alpha_sim, redshift, norm_sim) spec.apply_foreground_absorption(nH_sim) e = spec.generate_energies(exp_time, area) pt_src = PointSourceModel(30.0, 45.0, e.size) write_photon_list("plaw_model", "plaw_model", e.flux, pt_src.ra, pt_src.dec, e, clobber=True) instrument_simulator("plaw_model_simput.fits", "plaw_model_evt.fits", exp_time, inst_name, [30.0, 45.0], astro_bkgnd=None, instr_bkgnd_scale=0.0) inst = get_instrument_from_registry(inst_name) arf = AuxiliaryResponseFile(inst["arf"]) rmf = RedistributionMatrixFile(inst["rmf"]) os.system("cp %s ." % arf.filename) os.system("cp %s ." % rmf.filename) write_spectrum("plaw_model_evt.fits", "plaw_model_evt.pha", clobber=True) load_user_model(mymodel, "wplaw") add_user_pars("wplaw", ["nH", "norm", "redshift", "alpha"], [0.01, norm_sim * 0.8, 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.pha") set_stat("cstat") set_method("simplex") ignore(":0.5, 9.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)
def test_background(): tmpdir = tempfile.mkdtemp() curdir = os.getcwd() os.chdir(tmpdir) kT_sim = 1.0 Z_sim = 0.0 norm_sim = 4.0e-2 nH_sim = 0.04 redshift = 0.01 exp_time = (200., "ks") area = (1000., "cm**2") fov = (10.0, "arcmin") prng = 24 agen = ApecGenerator(0.05, 12.0, 5000, broadening=False) spec = agen.get_spectrum(kT_sim, Z_sim, redshift, norm_sim) spec.apply_foreground_absorption(norm_sim) events = make_background(area, exp_time, fov, (30.0, 45.0), spec, prng=prng) events.write_simput_file("bkgnd", overwrite=True) instrument_simulator("bkgnd_simput.fits", "bkgnd_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("bkgnd_evt.fits", "background_evt.pi", overwrite=True) os.system("cp %s %s ." % (arf.filename, rmf.filename)) load_user_model(mymodel, "wapec") add_user_pars("wapec", ["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("background_evt.pi") set_stat("cstat") set_method("simplex") ignore(":0.5, 8.0:") set_model("wapec") fit() res = get_fit_results() assert np.abs(res.parvals[0] - nH_sim) / nH_sim < 0.1 assert np.abs(res.parvals[1] - kT_sim) / kT_sim < 0.05 assert np.abs(res.parvals[2] - Z_sim) < 0.05 assert np.abs(res.parvals[3] - norm_sim) / norm_sim < 0.05 os.chdir(curdir) shutil.rmtree(tmpdir)