def fake_data(**kwargs): bkg = kwargs['bkg'] + "{1}" rsp = kwargs['rsp'] xs.AllData.clear() xs.AllModels.clear() m = xs.Model('ALP') for i in range(len(N)): m.ALP.norm.values = N[i] m.ALP.norm.frozen = True xs.AllData.clear() fs = xs.FakeitSettings(background=bkg, response=rsp, fileName='fake_spec_%s.fak' % i) sl = 2000 * [fs] # making 2000 simulations xs.AllData.fakeit(2000, sl) if kwargs['show']: import matplotlib.pyplot as plt xs.AllData.clear() for i in range(1, 2001): xs.AllData += "fake_spec_20.fak{%i}" % i xs.AllModels.clear() m = xs.Model("ALP") xs.Fit.statMethod = "pgstat" xs.Plot.device = "/xs" xs.Plot.xAxis = "MeV" xs.Plot.add = True xs.Plot.background = True xs.Plot.xLog = True xs.Plot.yLog = True xs.Plot.show() xs.Plot("ufspec") xerr_uf = np.zeros((2001, len(E_LLE))) yerr_uf = np.zeros((2001, len(E_LLE))) spec_uf = np.zeros((2001, len(E_LLE))) for i in range(1, 2001): xerr_uf[i, :] = np.asarray(xs.Plot.xErr(i)) yerr_uf[i, :] = np.asarray(xs.Plot.yErr(i)) spec_uf[i, :] = np.asarray(xs.Plot.y(i)) for i in range(1, 2001): plt.errorbar(E_LLE, spec_uf[i, :], xerr=xerr_uf[i, :], yerr=yerr_uf[i, :]) plt.plot(E_LLE, SED * N[20], 'r', zorder=2001, label='Theoretical spectrum') plt.xlabel('Energy, [MeV]') plt.ylabel('[photons cm$^{-2}$ s$^{-1}$ MeV$^{-1}$] ') plt.xscale('log') plt.grid() plt.legend() plt.show()
def get_fraction_obs(nh_val, redshift, kev_min_erosita=0.5, kev_max_erosita=2.0): print(nh_val, redshift) kev_min_erosita_RF = kev_min_erosita * (1 + redshift) kev_max_erosita_RF = kev_max_erosita * (1 + redshift) m1 = xspec.Model("atable{torus1006.fits} + zpowerlw") m1.torus.nH = nh_val m1.torus.Theta_tor = 45. m1.torus.Theta_inc = 87. m1.torus.z = redshift m1.torus.norm = 1. m1.zpowerlw.PhoIndex = 2. m1.zpowerlw.Redshift = redshift m1.zpowerlw.norm = 0.01 # observed frame attenuated flux xspec.AllModels.calcFlux(str(kev_min_erosita) + " " + str(kev_max_erosita)) flux_obs = m1.flux[0] # rest frame intrinsic flux m1.torus.nH = 0.01 xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) flux_intrinsic = m1.flux[0] fraction_observed = flux_obs / flux_intrinsic return fraction_observed
def get_fraction_obsF_RF(nh_val=1, kT=4, redshift=0, norm=1, metallicity=0.3): """ computes the fraction of flux observed in the eROSITA band w.r.t. RF 0.5-2 keV flux using a tbabs*apec model (cluster) model at a given redshift returns : * flux(0.5-2,nH) / flux(0.5/(1+z)-2/(1+z),nH=0.01) nh_val=1 kT=4 redshift=0 norm=1 """ print(nh_val, redshift) kev_min_erosita = 0.5 # 24.8 kev_max_erosita = 2.0 # 6.19 kev_min_erosita_RF = 0.5*(1+redshift) kev_max_erosita_RF = 2.0*(1+redshift) m1 = xspec.Model("tbabs*apec") m1.setPars( nh_val, # 1 1 TBabs nH 10^22 1.00000 +/- 0.0 kT, # 2 2 apec kT keV 1.00000 +/- 0.0 metallicity, # 3 2 apec Abundanc 1.00000 frozen 0., # 4 2 apec Redshift 0.0 frozen norm, # 5 2 apec norm 1.00000 +/- 0.0 ) # flux observed xspec.AllModels.calcFlux(str(kev_min_erosita)+" "+str(kev_max_erosita)) flux_obs = m1.flux[0]#/(kev_max_erosita-kev_min_erosita) xspec.AllModels.show() # flux in the rest-frame without galactic absorption m1.TBabs.nH = 0.0 xspec.AllModels.calcFlux(str(kev_min_erosita_RF)+" "+str(kev_max_erosita_RF)) flux_intrinsic = m1.flux[0]#/(kev_max_erosita_RF-kev_min_erosita_RF) xspec.AllModels.show() fraction_observed = flux_obs / flux_intrinsic return fraction_observed
def get_attenuation(nh_val=1): """ computes the attenuation """ print(nh_val) kev_min_erosita = 0.5 # 24.8 kev_max_erosita = 2.0 # 6.19 kev_min_erosita_RF = 0.5 kev_max_erosita_RF = 2.0 m1 = xspec.Model("tbabs*apec") m1.setPars( nh_val, 3., 0.3, 0., 1., ) # flux observed xspec.AllModels.calcFlux(str(kev_min_erosita) + " " + str(kev_max_erosita)) flux_obs = m1.flux[0] #/(kev_max_erosita-kev_min_erosita) xspec.AllModels.show() # flux in the rest-frame without galactic absorption m1.TBabs.nH = 0.0 xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) flux_intrinsic = m1.flux[0] #/(kev_max_erosita_RF-kev_min_erosita_RF) xspec.AllModels.show() fraction_observed = flux_obs / flux_intrinsic return fraction_observed
def get_spectrum(nh_val, redshift): #m1 = xspec.Model("atable{"+torus_model+"} + zpowerlw") #m1.setPars(nh_val, 2., 45., 87., redshift, 1., 2., redshift, 0.001) m1 = xspec.Model("atable{" + torus_model + "} + atable{" + torus_model_omni + "}") m1.setPars( nh_val, # torus NH value in 0.01, 1000 PL, # torus photon Index, 2 400, # torus Ecut off 400 keV 30, # torus torus opening angle sigma. 5deg = thin, 90deg = isotropic 0.3, # torus CTK coverage: 0.4 ??? 40., # torus viewing angle redshift, # torus redshift 1., # torus norm nh_val, # scatt NH value in 0.01, 1000 (same as for torus) PL, # scatt photon Index, 2 400, # scatt Ecut off 400 keV 30, # scatt torus opening angle sigma. 5deg = thin, 90deg = isotropic 0.3, # scatt CTK coverage: 0.4 ??? 40., # scatt viewing angle redshift, # scatt redshift 0.01) # scatt norm kevs = n.arange(0.1, 50, 0.1) # kevs = 10**n.arange(-1., n.log10(50), 0.1) fluxes = [] nPh = [] for kev_min_erosita_RF, kev_max_erosita_RF in zip(kevs[:-1], kevs[1:]): xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) #print(xspec.Xset.cosmo) #xspec.AllModels.calcLumin(str(kev_min_erosita_RF)+" "+str(kev_max_erosita_RF)) fluxes.append(m1.flux[0]) nPh.append(m1.flux[3]) return (kevs[:-1] + kevs[1:]) * 0.5, n.array(fluxes), n.array( nPh), -kevs[:-1] + kevs[1:]
def get_spec(nh_val=1, PL=1.9, redshift=0., norm1=0.98, norm2=0.02, norm3=1., rel_refl=1., incl=n.cos(30. * n.pi / 180.)): m1 = xspec.Model("zwabs*(cabs*zpowerlw*zhighect+pexrav)+zpowerlw") m1.setPars( nh_val, #2 2 zwabs nH 10^22 1.00000 +/- 0.0 redshift, #3 2 zwabs Redshift 0.0 frozen nh_val, #4 3 cabs nH 10^22 1.00000 +/- 0.0 PL, #5 4 zpowerlw PhoIndex 1.00000 +/- 0.0 redshift, #6 4 zpowerlw Redshift 0.0 frozen norm1, #7 4 zpowerlw norm 1.00000 +/- 0.0 50., #8 5 zhighect cutoffE keV 10.0000 +/- 0.0 200., #9 5 zhighect foldE keV 15.0000 +/- 0.0 redshift, #10 5 zhighect Redshift 0.0 frozen PL, #16 8 pexrav PhoIndex 2.00000 +/- 0.0 200., #17 8 pexrav foldE keV 100.000 +/- 0.0 rel_refl, #18 8 pexrav rel_refl 0.0 +/- 0.0 redshift, #19 8 pexrav Redshift 0.0 frozen 1., #20 8 pexrav abund 1.00000 frozen 1., #21 8 pexrav Fe_abund 1.00000 frozen incl, #22 8 pexrav cosIncl 0.450000 frozen norm3, #23 8 pexrav norm 1.00000 +/- 0.0 PL, #11 6 zpowerlw PhoIndex 1.00000 +/- 0.0 redshift, #12 6 zpowerlw Redshift 0.0 frozen norm2 #13 6 zpowerlw norm 1.00000 +/- 0.0 ) #kevs = n.arange(0.1, 50, 0.1) # kevs = 10**n.arange(-1., n.log10(50), 0.01) fluxes = [] nPh = [] for kev_min_erosita_RF, kev_max_erosita_RF in zip(kevs[:-1], kevs[1:]): xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) #print(xspec.Xset.cosmo) #xspec.AllModels.calcLumin(str(kev_min_erosita_RF)+" "+str(kev_max_erosita_RF)) fluxes.append(m1.flux[0]) nPh.append(m1.flux[3]) x, y, nP, dE = (kevs[:-1] + kevs[1:]) * 0.5, n.array(fluxes), n.array( nPh), -kevs[:-1] + kevs[1:] # x keV # y/dE erg/(cm$^2$ s keV) # nP number of photons # energy interval # E = hc/lambda # x * y / dE = nu * f_nu = ll * f_ll ll = (cc.c * cc.h / (x * uu.keV).to(uu.J)).to(uu.AA) f_ll = x * y / (dE * ll) # erg/(cm$^2$ s A) return ll, f_ll, x, y / dE, nP, dE
def fit_spectrum(ob): spec = xspec.Spectrum(ob.path + ob.spectrum) spec.ignore("**-0.5 10.0-**") xspec.AllData.ignore("bad") model = xspec.Model("ph(bb+po)") xspec.Fit.query = 'yes' xspec.Fit.perform() energy_ranges = np.asarray(spec.energies) energy = (energy_ranges[:, 0] + energy_ranges[:, 1]) / 2 energy_err = energy - energy_ranges[:, 0] x1 = energy ex_1 = energy_err y1 = spec.values ey1 = np.sqrt(spec.variance) xspec.AllData.notice("all") energy_ranges = np.asarray(spec.energies) energy = energy_ranges[:, 0] + energy_ranges[:, 1] / 2 x2 = energy y2 = model.folded(1) plt.errorbar(x1, y1, ey1, ex1, fmt="o") plt.plot(x2, y2)
def set_model(self, nh, redshift): model = xspec.Model("wabs*apec") model.wabs.nH = nh model.apec.Redshift = redshift model.apec.kT = self.modelpar("temperature") model.apec.Abundanc = self.modelpar("abundance") self._model = model
def imrefspec(fpmlist, idetlist, auxil, cxbp={'pl': 1.29, 'ecut': 41.13, 'norm': 0.002353}, texp=1.0e9): queue = [] # Check for RMF files for idet in idetlist: idet = int(idet) if idet not in (0, 1, 2, 3): continue for ab in fpmlist: if ab not in ('A', 'B'): continue rmffile = 'det%d%s.rmf' % (idet, ab) if os.path.exists(rmffile): queue.append((idet, ab)) print('Queued FPM%s det%d: %s' % (ab, idet, rmffile)) else: print('Skipped FPM%s det%d: %s not found.' % (ab, idet, rmffile)) if len(queue) == 0: print('Nothing to be done.') return True m = xspec.Model('cutoffpl') m.cutoffpl.PhoIndex = cxbp['pl'] m.cutoffpl.HighECut = cxbp['ecut'] m.cutoffpl.norm = cxbp['norm'] for idet, ab in queue: # If there is existing spectrum loaded, RMF and ARF in FakeSettings # will be ignored (the 'from existing spectra' flow). We need to do # the 'from scratch' flow. xspec.AllData.clear() fakesettings_ap = xspec.FakeitSettings( response='det%d%s.rmf' % (idet, ab), arf='%s/be.arf' % auxil, exposure=texp, correction=0.0, fileName='aperbgd%s_det%d.pha' % (ab, idet) ) fakesettings_fcxb = xspec.FakeitSettings( response='det%d%s.rmf' % (idet, ab), arf='%s/fcxb%s.arf' % (auxil, ab), exposure=texp, correction=0.0, fileName='fcxbbgd%s_det%d.pha' % (ab, idet) ) xspec.AllData.fakeit( nSpectra=2, settings=[fakesettings_ap, fakesettings_fcxb], applyStats=False, filePrefix='') return True
def get_f_hard_RF_soft_obsF( nh_val, redshift=0): #, kev_min_erosita = 0.5, kev_max_erosita = 2.0): print(nh_val, redshift) kev_min_erosita = 0.5 * (1 + redshift) kev_max_erosita = 2.0 * (1 + redshift) kev_min_erosita_RF = 2.0 kev_max_erosita_RF = 10.0 redshift = 0. #m1 = xspec.Model("(tbabs*(plcabs+pexrav)+zpowerlw)*tbabs") m1 = xspec.Model( "TBabs(plcabs + zgauss + constant*powerlaw + pexrav*constant)") m1.pexrav.rel_refl = '-2 -2 -2 -2' m1.setPars( nh_val_galactic, # 1 1 TBabs nH 10^22 1.00000 +/- 0.0 |||| 0.01 -0.0001 0 0 100000 1e+06 nh_val, # 2 2 plcabs nH 10^22 1.00000 +/- 0.0 |||| 0.01 0.01 1e-06 1e-06 100000 100000 3., # 3 2 plcabs nmax (scale) 1.00000 |||| 3 1., # 4 2 plcabs FeAbun 1.00000 frozen |||| 1 -0.01 0 0 10 10 7.11, # 5 2 plcabs FeKedge KeV 7.11000 frozen |||| 7.11 -0.0711 7 7 10 10 PL, # 6 2 plcabs PhoIndex 2.00000 +/- 0.0 |||| 1.9 -0.019 0 0 3 3 95., # 7 2 plcabs HighECut keV 95.0000 frozen |||| 95 -0.95 0.01 1 100 200 300., # 8 2 plcabs foldE 100.000 frozen |||| 300 -3 1 1 1e+06 1e+06 1.0, # 9 2 plcabs acrit 1.00000 frozen |||| 1 -0.01 0 0 1 1 0.0, # 10 2 plcabs FAST (scale) 0.0 |||| 0 redshift, # 11 2 plcabs Redshift 0.0 frozen |||| 0 -0.005 -0.999 -0.999 10 10 1., # 12 2 plcabs norm 1.00000 +/- 0.0 |||| 1 -0.01 0 0 1e+20 1e+24 6.4, # 13 3 zgauss LineE keV 6.50000 +/- 0.0 |||| 6.4 -0.064 0 0 1e+06 1e+06 0.05, # 14 3 zgauss Sigma keV 0.100000 +/- 0.0 |||| 0.05 -0.0005 0 0 10 20 redshift, # 15 3 zgauss Redshift 0.0 frozen |||| = p11 0.01, # 16 3 zgauss norm 1.00000 +/- 0.0 |||| 0.01 0.0001 0 0 1e+20 1e+24 0.02, # 17 4 constant factor 1.00000 +/- 0.0 |||| 0.02 -0.0002 0 0 0.1 0.1 PL, # 18 5 powerlaw PhoIndex 1.00000 +/- 0.0 |||| = p6 1., # 19 5 powerlaw norm 1.00000 +/- 0.0 |||| = p12/(1. + p11)/(1./(1. + p11))^( - p6) PL, # 20 6 pexrav PhoIndex 2.00000 +/- 0.0 |||| = p6 300, # 21 6 pexrav foldE keV 100.000 +/- 0.0 |||| 300 -3 1 1 1e+06 1e+06 -1, # 22 6 pexrav rel_refl 0.0 +/- 0.0 |||| -1 -0.01 -3 -3 -1e-09 -1e-09 redshift, # 23 6 pexrav Redshift 0.0 frozen |||| = p11 1., # 24 6 pexrav abund 1.00000 frozen |||| 1 -0.01 0 0 1e+06 1e+06 1., # 25 6 pexrav Fe_abund 1.00000 frozen |||| 1 -0.01 0 0 1e+06 1e+06 0.45, # 26 6 pexrav cosIncl 0.450000 frozen |||| 0.45 -0.0045 0.05 0.05 0.95 0.95 1., # 27 6 pexrav norm 1.00000 +/- 0.0 |||| = p19 1. # 28 7 constant factor 1.00000 +/- 0.0 |||| 1 -0.01 0.01 0.01 100 100 ) #m1.pexrav.rel_refl.values m1.powerlaw.norm.link = 'p12/(1. + p11)/(1./(1. + p11))^( - p6)' m1.pexrav.norm.link = 'p12/(1. + p11)/(1./(1. + p11))^( - p6)' xspec.AllModels.calcFlux(str(kev_min_erosita) + " " + str(kev_max_erosita)) flux_obs = m1.flux[0] #/(kev_max_erosita-kev_min_erosita) # rest frame intrinsic flux xspec.AllModels.show() m1.TBabs.nH = 0.01 m1.plcabs.nH = 0.01 xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) flux_intrinsic = m1.flux[0] #/(kev_max_erosita_RF-kev_min_erosita_RF) xspec.AllModels.show() fraction_observed = flux_obs / flux_intrinsic return fraction_observed
def Roughfit(obsname, Sourcename, obs_suffix='xwtw2po_cl_seporb.pha', NH=1.0, PL=2, kT=0.5, outfile='Roughfit.spec', PLOT=True): '''Given the observation number file of an observation, the Sourcename, and the name of an output file, this will preform a rough spectral fit to get a handle on the sources flux.''' spec = obsname + '/sw' + obsname + obs_suffix fits = pyfits.open(spec) xspec.AllData(spec) xspec.AllData.ignore("bad") xspec.AllData.ignore("**-0.5 10.0-**") model = xspec.Model("tbabs(po+bb)") errorstr = '1.6 2 3 4 5' model.TBabs.nH = NH model.TBabs.nH.frozen = True model.powerlaw.PhoIndex.values = [PL, 0.01, -3.0, -2.0, 9.0, 10.0] model.bbody.kT.values = [kT, 0.01, 0.0001, 0.01, 100.0, 200.0] xspec.Fit.query = 'yes' xspec.Fit.perform() xspec.Fit.perform() xspec.Plot.xAxis = "keV" xspec.Plot.device = "/xw" xspec.Plot("data", "resid") xspec.Plot() xspec.Fit.error(errorstr) try: xspec.AllModels.calcFlux("0.5 10. err 1000 90") except (RuntimeError, TypeError, NameError, 'Flux Command Error'): pass outf = open(outfile + '.spec', 'w') nH = xspec.AllModels(1)(1) outf.write('# nH: %f (%f - %f)\tChisq: %f\tDOF: %f\n' % (nH.values[0], nH.error[0], nH.error[1], xspec.Fit.statistic, xspec.Fit.dof)) outf.write( '# obsid\tflux\tflux_low\tflux_high\tgamma\tgamma_low\tgamma_high\tkT\tkT_low\tkT_high\tPLnorm/kTnorm\n' ) flux = xspec.AllData(1).flux output = '%s\t%E\t%E\t%E\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n' %\ ( spec, flux[0], flux[1], flux[2],xspec.AllModels(1)(2).values[0], xspec.AllModels(1)(2).error[0], xspec.AllModels(1)(2).error[1], xspec.AllModels(1)(4).values[0], xspec.AllModels(1)(4).error[0], xspec.AllModels(1)(4).error[1], xspec.AllModels(1)(3).values[0]/xspec.AllModels(1)(5).values[0] ) outf.write(output) outf.close() xspec.AllData.clear() xspec.AllModels.clear()
def prepare(self): """ Prepare the absorption model for execution. """ xspec.Xset.chatter = 0 xspec.AllModels.setEnergies("%f %f %d lin" % (self.emin.value, self.emax.value, self.nchan)) self.model = xspec.Model(self.model_name+"*powerlaw") self.model.powerlaw.norm = self.nchan/(self.emax.value-self.emin.value) self.model.powerlaw.PhoIndex = 0.0
def set_fit_parameters(self): xspec.AllData.clear() xspec.Fit.statMethod = str(self.statistic) xspec.Fit.query = "yes" os.chdir(self.path) self.spec_mos1 = xspec.Spectrum(self.spectrum_files["mos1"]) self.spec_mos1.ignore(self.energy_range["mos1"]) self.spec_mos2 = xspec.Spectrum(self.spectrum_files["mos2"]) self.spec_mos2.ignore(self.energy_range["mos2"]) self.spec_pn = xspec.Spectrum(self.spectrum_files["pn"]) self.spec_pn.ignore(self.energy_range["pn"]) self.spec_rass = xspec.Spectrum(self.spectrum_files["rass"]) print(self.spec_mos1, self.spec_mos2, self.spec_pn, self.spec_rass) #self.m1 = xspec.Model("{}+{}*{}".format(Spectrum.esas_bkg_model, self.abs_model, self.src_model)) self.m1 = xspec.Model(Spectrum.esas_model) gau1 = Gaussian(component_number=1, LineE=1.48516) self.m1.gaussian.LineE.values, self.m1.gaussian.Sigma.values, self.m1.gaussian.norm.values = gau1.get_params( ) gau2 = Gaussian(component_number=2, LineE=1.74000) self.m1.gaussian_2.LineE.values, self.m1.gaussian_2.Sigma.values, self.m1.gaussian_2.norm.values = gau2.get_params( ) gau3 = Gaussian(component_number=3, LineE=7.11) self.m1.gaussian_3.LineE.values, self.m1.gaussian_3.Sigma.values, self.m1.gaussian_3.norm.values = gau3.get_params( ) gau4 = Gaussian(component_number=4, LineE=7.49) self.m1.gaussian_4.LineE.values, self.m1.gaussian_4.Sigma.values, self.m1.gaussian_4.norm.values = gau4.get_params( ) gau5 = Gaussian(component_number=5, LineE=8.05) self.m1.gaussian_5.LineE.values, self.m1.gaussian_5.Sigma.values, self.m1.gaussian_5.norm.values = gau5.get_params( ) gau6 = Gaussian(component_number=6, LineE=8.62) self.m1.gaussian_6.LineE.values, self.m1.gaussian_6.Sigma.values, self.m1.gaussian_6.norm.values = gau6.get_params( ) gau7 = Gaussian(component_number=7, LineE=8.90) self.m1.gaussian_7.LineE.values, self.m1.gaussian_7.Sigma.values, self.m1.gaussian_7.norm.values = gau7.get_params( ) print(dir(self.m1)) print(self.m1.show()) print(self.m1.componentNames) print(self.m1.setPars())
def prepare(self): """ Prepare the thermal model for execution. """ xspec.Xset.chatter = 0 xspec.AllModels.setEnergies("%f %f %d lin" % (self.emin.value, self.emax.value, self.nchan)) self.model = xspec.Model(self.model_name) if self.model_name == "bremss": self.norm = 3.02e-15 else: self.norm = 1.0e-14
def load_instr(model_n, model_name, extr): """Create instrumental line model for ExtractedSpectrum extr Fix line energies and norms based on FWC fit data, but allow overall norm to vary (i.e., all line ratios pinned to FWC line ratios). Use ARFs appropriate for FWC data (no telescope vignetting). Currently expect 2 lines (MOS) and 7 lines (PN) modeled in FWC spectrum MOS lines: Al, Si PN lines: Al, Ti, Cr, Ni, Cu, Zn, Cu(K-beta) WARNING -- operates on a single ExtractedSpectrum, rather than a list, which breaks convention with other model loaders. Reason being, each spectrum has a DIFFERENT instr. line model. ExtractedSpectrum object additionally _must_ have an attached xs.Spectrum object, referenced via .spec attribute. (alternative approach: create a single model w/ both MOS and PN lines, and freeze or zero out values accordingly. This makes xs.AllModels.show() output much harder to read (many zeroed, meaningless parameters, but model #s easier to track) Arguments model_n: XSPEC model number, 1-based extr: single ExtractedSpectrum. WARNING - breaks convention w/ other model loaders. model_name: XSPEC model name, string (no spaces) Output: None. Global XSPEC objects configured for instrumental lines. """ # Set responses of <xs.Spectrum> objects extr.spec.multiresponse[model_n - 1] = extr.rmf_instr() extr.spec.multiresponse[model_n - 1].arf = extr.arf_instr() fit_dict = extr.fwc_fit() instr = xs.Model( "constant * (" + fit_dict['1']['instr']['expression'] + ")", model_name, model_n) # Set parameters all at once parlist = ["1, , 0.1, 0.1, 10, 10" ] # Set constant factor to 1 (range: 0.1-10) for cname in fit_dict['1']['instr']['componentNames']: parlist.extend([ fit_dict['1']['instr'][cname]['LineE']['value'], fit_dict['1']['instr'][cname]['Sigma']['value'], fit_dict['1']['instr'][cname]['norm']['value'] ]) instr.setPars(*parlist) # Freeze everything except constant prefactor xs_utils.freeze_model(instr) instr.constant.factor.frozen = False
def __init__(self, file_path, **kwargs): """ """ xspec.AllData.clear() self.count_spectrum = xBinnedCountSpectrum(file_path) irf_name = self.count_spectrum.primary_header_keyword('IRFNAME') self.spectrum = xspec.Spectrum(file_path) self.spectrum.response = irf_file_path(irf_name, 'rmf') self.spectrum.response.arf = irf_file_path(irf_name, 'arf') self.spectrum.ignore('**-%f' % kwargs['emin']) self.spectrum.ignore('%f-**' % kwargs['emax']) self.model = xspec.Model(kwargs['model']) xspec.Fit.perform()
def prepare_spectrum(self): """ Prepare the absorption model for execution given a redshift *zobs* for the spectrum. """ import xspec xspec.Xset.chatter = 0 xspec.AllModels.setEnergies("%f %f %d lin" % (self.emin.value, self.emax.value, self.nchan)) self.model = xspec.Model(self.model_name+"*powerlaw") self.model.powerlaw.norm = self.nchan/(self.emax.value-self.emin.value) self.model.powerlaw.PhoIndex = 0.0 for k,v in self.settings.items(): xspec.Xset.addModelString(k,v)
def prepare_spectrum(self): """ Prepare the absorption model for execution. """ import xspec xspec.Xset.chatter = 0 xspec.AllModels.setEnergies("%f %f %d lin" % (self.emin, self.emax, self.nchan)) self.model = xspec.Model(self.model_name + "*powerlaw") self.model.powerlaw.norm = self.nchan / (self.emax - self.emin) self.model.powerlaw.PhoIndex = 0.0 for k, v in self.settings.items(): xspec.Xset.addModelString(k, v) m = getattr(self.model, self.model_name) m.nH = 1.0 self.sigma = YTArray(-np.log(self.model.values(0)) * 1.0e-22, "cm**2")
def call_xspec(): import xspec print "starting fit_srcbin10" import glob import pyfits import numpy as np from astropy.time import Time import xspec xspec.AllData.clear() xspec.Xset.chatter = 0 xspec.FitManager.query = "yes" xspec.Fit.query = "yes" xspec.Fit.nIterations = 100 pcmode = False WorkDir = '/Users/corcoran/research/WR140/Swift/data/2016/work' rmfdir = '/caldb/data/swift/xrt/cpf/rmf' if pcmode: mode = 'pc' else: mode = 'wt' xspecdir = WorkDir + "/" + obsid.strip() + "/" + mode + "/xspec" cwd = os.getcwd() print "\n" os.chdir(xspecdir) src = xspec.Spectrum("srcbin10.pha") try: hdu = pyfits.open("src.arf") except: print "ARF src.arf not found; Returning" return arfhd = hdu[1].header try: respfile = arfhd['RESPFILE'] except: print "RESPFILE keyword in srcbin10.arf not found; Returning" return try: rmffile = glob.glob(rmfdir + '/' + respfile)[0] except: print "Response file %s does not exist; Returning" % (rmfdir + '/' + respfile) return xspec.AllData.clear() mostring = "wabs*apec + wabs*(apec + gaussian)" print "test1.55" m = xspec.Model(mostring) return
def get_fraction_obsF_obsF(nh_val, redshift=0):#, kev_min_erosita = 0.5, kev_max_erosita = 2.0): print(nh_val, redshift) kev_min_erosita = 0.5 kev_max_erosita = 2.0 kev_min_erosita_RF = 0.4 kev_max_erosita_RF = 2.4 m1 = xspec.Model("(tbabs*(plcabs+pexrav)+zpowerlw)*tbabs") m1.pexrav.rel_refl='-2 -2 -2 -2' m1.setPars( nh_val, #1 1 TBabs nH 10^22 1.00000 +/- 0.0 nh_val, #2 2 plcabs nH 10^22 1.00000 +/- 0.0 3., #3 2 plcabs nmax (scale) 1.00000 1., #4 2 plcabs FeAbun 1.00000 frozen 7.11, #5 2 plcabs FeKedge KeV 7.11000 frozen PL, #6 2 plcabs PhoIndex 2.00000 +/- 0.0 50., #7 2 plcabs HighECut keV 95.0000 frozen 200., #8 2 plcabs foldE 100.000 frozen 1.0, #9 2 plcabs acrit 1.00000 frozen 0.0, #10 2 plcabs FAST (scale) 0.0 redshift, #11 2 plcabs Redshift 0.0 frozen norm1, #12 2 plcabs norm 1.00000 +/- 0.0 PL, #13 3 pexrav PhoIndex 2.00000 +/- 0.0 200., #14 3 pexrav foldE keV 100.000 +/- 0.0 rel_refl, #15 3 pexrav rel_refl 0.0 +/- 0.0 redshift, #16 3 pexrav Redshift 0.0 frozen 1., #17 3 pexrav abund 1.00000 frozen 1., #18 3 pexrav Fe_abund 1.00000 frozen incl, #19 3 pexrav cosIncl 0.450000 frozen norm_PR, #20 3 pexrav norm 1.00000 +/- 0.0 PL, #21 4 zpowerlw PhoIndex 1.00000 +/- 0.0 redshift, #22 4 zpowerlw Redshift 0.0 frozen norm2, #23 4 zpowerlw norm 1.00000 +/- 0.0 0.01 #24 5 TBabs nH 10^22 1.00000 +/- 0.0 ) m1.pexrav.norm.link='p12/(1. + p11)/(1./(1. + p11))^( - p6)' xspec.AllModels.calcFlux(str(kev_min_erosita)+" "+str(kev_max_erosita)) flux_obs = m1.flux[0]#/(kev_max_erosita-kev_min_erosita) # rest frame intrinsic flux xspec.AllModels.show() m1.TBabs.nH = 0.01 m1.plcabs.nH = 0.01 xspec.AllModels.calcFlux(str(kev_min_erosita_RF)+" "+str(kev_max_erosita_RF)) flux_intrinsic = m1.flux[0]#/(kev_max_erosita_RF-kev_min_erosita_RF) xspec.AllModels.show() fraction_observed = flux_obs / flux_intrinsic return fraction_observed
def plotTrumpetSpecs(evtFiles): mainVals1937 = [0.01, 0.07] mainVals1821 = [0.98, 1.05] interVals1821 = [0.51, 0.59] interVals1937 = [0.54, 0.59] #the lower and upper are the two different phase ranges for the main and interpulse #"Back" refers to the background region/ off pulse region used as background #We use the same background region for each pulsar lowBack = [.2, .4] upBack = [.7, .9] #for num in range(evtplotTrupetFiles): #using old code in genspectra to produce a pha file for a given evt file genspectra.gen_spectra('evtFiles/newfile1821_4.evt', mainVals1821, interVals1821, 0, 1200, 1000, save_pha="ourOnPeakboth.pha", run_xspec=False) genspectra.gen_spectra('evtFiles/newfile1821_4.evt', lowBack, upBack, 0, 1200, 1000, save_pha="ourOffPeak.pha", run_xspec=False) s1 = xspec.Spectrum("ourOnPeakboth.pha") s1.response = "/packages/caldb/data/nicer/xti/cpf/rmf/nixtiref20170601v001.rmf" s1.response.arf = "/packages/caldb/data/nicer/xti/cpf/arf/nixtiaveonaxis20170601v002.arf" s1.background = "ourOffPeak.pha" s1.ignore("**-0.8,10.0-**") #this is the command "abund wilm" xspec.Xset.abund = "wilm" #m1 holds the model that was implemented on the data m1 = xspec.Model("tbabs*pow") #fitting and plotting the data/creating values for the data of the plot xspec.Fit.perform() print("error stuff") xspec.Fit.error("1-3") print("hello") xspec.Plot.device = "/xs" xspec.Plot("ufspec delchi")
def get_PL(redshift=0., PL=2., norm1=1): m1 = xspec.Model("zpowerlw") m1.setPars( PL, #5 4 zpowerlw PhoIndex 1.00000 +/- 0.0 redshift, #6 4 zpowerlw Redshift 0.0 frozen norm1 #7 4 zpowerlw norm 1.00000 +/- 0.0 ) kevs = 10**n.arange(-1.,n.log10(50),0.01) x_kevs = 10**(0.5 *(n.log10(kevs[:-1]) + n.log10(kevs[1:]))) fluxes = [] nPh = [] for kev_min_erosita_RF, kev_max_erosita_RF in zip(kevs[:-1],kevs[1:]): xspec.AllModels.calcFlux(str(kev_min_erosita_RF)+" "+str(kev_max_erosita_RF)) fluxes.append( m1.flux[0] ) nPh.append(m1.flux[3] ) x,y,nP,dE = (kevs[:-1]+kevs[1:])*0.5, n.array(fluxes), n.array(nPh), -kevs[:-1]+kevs[1:] return x_kevs, y
def set_model(): """ Creates an XSPEC model instance for a two component absorbed thermal model plus gaussian line :return: """ import xspec mo = xspec.Model("wabs*vapec + wabs*vapec + gaussian") mo.wabs.nH.values = [.1, 0.01, .05, .05, 100, 100] mo.vapec.kT.values = [3., 0.1, 1., 1., 9., 9.] mo.vapec.N.values = [3, 0.01, 1, 1, 30, 30] mo.vapec.norm.values = [1e-2, 0.001, 0, 0, 1, 1] mo.wabs_3.nH.values = [.1, 0.01, .05, .05, 100, 100] mo.vapec_4.norm.values = [0.1, 0.01, 0.0, 0.0, 1., 1.] mo.vapec_4.kT.values = [.1, 0.01, .1, .1, .5, .5] mo.gaussian.LineE.values = [6.4, .1, 6.2, 6.2, 6.6, 6.6] mo.gaussian.norm.values = [1e-5, 0.001, 0, 0, 0.0001, 0.0001] mo.gaussian.Sigma.values = [0.0, 0.01, 0.0, 0.0, .02, .02] return mo
def get_spectrum(nh_val, redshift, d_kev=0.0025): m1 = xspec.Model("(tbabs*(plcabs+pexrav)+zpowerlw)*tbabs") m1.pexrav.rel_refl = '-2 -2 -2 -2' m1.setPars( nh_val, #1 1 TBabs nH 10^22 1.00000 +/- 0.0 nh_val, #2 2 plcabs nH 10^22 1.00000 +/- 0.0 3., #3 2 plcabs nmax (scale) 1.00000 1., #4 2 plcabs FeAbun 1.00000 frozen 7.11, #5 2 plcabs FeKedge KeV 7.11000 frozen PL, #6 2 plcabs PhoIndex 2.00000 +/- 0.0 50., #7 2 plcabs HighECut keV 95.0000 frozen 200., #8 2 plcabs foldE 100.000 frozen 1.0, #9 2 plcabs acrit 1.00000 frozen 0.0, #10 2 plcabs FAST (scale) 0.0 redshift, #11 2 plcabs Redshift 0.0 frozen norm1, #12 2 plcabs norm 1.00000 +/- 0.0 PL, #13 3 pexrav PhoIndex 2.00000 +/- 0.0 200., #14 3 pexrav foldE keV 100.000 +/- 0.0 rel_refl, #15 3 pexrav rel_refl 0.0 +/- 0.0 redshift, #16 3 pexrav Redshift 0.0 frozen 1., #17 3 pexrav abund 1.00000 frozen 1., #18 3 pexrav Fe_abund 1.00000 frozen incl, #19 3 pexrav cosIncl 0.450000 frozen norm_PR, #20 3 pexrav norm 1.00000 +/- 0.0 PL, #21 4 zpowerlw PhoIndex 1.00000 +/- 0.0 redshift, #22 4 zpowerlw Redshift 0.0 frozen norm2, #23 4 zpowerlw norm 1.00000 +/- 0.0 0.01 #24 5 TBabs nH 10^22 1.00000 +/- 0.0 ) m1.pexrav.norm.link = 'p12/(1. + p11)/(1./(1. + p11))^( - p6)' #kevs = n.arange(0.1, 50, 0.1) # kevs = 10**n.arange(-1., n.log10(50), d_kev) fluxes = [] nPh = [] for kev_min_erosita_RF, kev_max_erosita_RF in zip(kevs[:-1], kevs[1:]): xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) #print(xspec.Xset.cosmo) #xspec.AllModels.calcLumin(str(kev_min_erosita_RF)+" "+str(kev_max_erosita_RF)) fluxes.append(m1.flux[0]) nPh.append(m1.flux[3]) return (kevs[:-1] + kevs[1:]) * 0.5, n.array(fluxes), n.array( nPh), -kevs[:-1] + kevs[1:]
def get_sigma_T(nh_val = 1,redshift=0., PL=2., norm1=1./(3.68922734e-11)): m1 = xspec.Model("cabs*zpowerlw") m1.setPars( nh_val, #2 2 cwabs nH 10^22 1.00000 +/- 0.0 PL, #5 4 zpowerlw PhoIndex 1.00000 +/- 0.0 redshift, #6 4 zpowerlw Redshift 0.0 frozen norm1 #7 4 zpowerlw norm 1.00000 +/- 0.0 ) kevs = 10**n.arange(-1.,n.log10(50),0.01) x_kevs = 10**(0.5 *(n.log10(kevs[:-1]) + n.log10(kevs[1:]))) fluxes = [] nPh = [] for kev_min_erosita_RF, kev_max_erosita_RF in zip(kevs[:-1],kevs[1:]): xspec.AllModels.calcFlux(str(kev_min_erosita_RF)+" "+str(kev_max_erosita_RF)) fluxes.append( m1.flux[0] ) nPh.append(m1.flux[3] ) x,y,nP,dE = (kevs[:-1]+kevs[1:])*0.5, n.array(fluxes), n.array(nPh), -kevs[:-1]+kevs[1:] sig_e = -n.log(y) return x_kevs, sig_e
def prepare_spectrum(self, zobs): """ Prepare the thermal model for execution given a redshift *zobs* for the spectrum. """ import xspec xspec.Xset.chatter = 0 xspec.AllModels.setEnergies( "%f %f %d lin" % (self.emin.value, self.emax.value, self.nchan)) self.model = xspec.Model(self.model_name) self.thermal_comp = getattr(self.model, self.model_name) if self.model_name == "bremss": self.norm = 3.02e-15 else: self.norm = 1.0e-14 self.thermal_comp.norm = 1.0 self.thermal_comp.Redshift = zobs if self.thermal_broad: xspec.Xset.addModelString("APECTHERMAL", "yes") for k, v in self.settings.items(): xspec.Xset.addModelString(k, v)
def get_spectrum(temperature=1, redshift=0.5, metal_abundance=0.3, norm1=1., d_kev=0.0025): m1 = xspec.Model("apec") m1.setPars( temperature, # 1 1 apec kT keV 1.00000 +/- 0.0 metal_abundance, # 2 1 apec Abundanc 1.00000 frozen redshift, # 3 1 apec Redshift 0.0 frozen norm1 # 4 1 apec norm 1.00000 +/- 0.0 ) kevs = 10**n.arange(-1., n.log10(50), d_kev) fluxes = [] nPh = [] for kev_min_erosita_RF, kev_max_erosita_RF in zip(kevs[:-1], kevs[1:]): xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) fluxes.append(m1.flux[0]) nPh.append(m1.flux[3]) return (kevs[:-1] + kevs[1:]) * \ 0.5, n.array(fluxes), n.array(nPh), -kevs[:-1] + kevs[1:]
def srcutlog_fit(s, alpha): """Fit spectrum s to srcutlog model. First fits break/norm with nH frozen at 0.6, then lets nH run free as well. alpha frozen to user specified value srcutlog must be already loaded! """ model = xs.Model('phabs*srcutlog') model.phabs.nH = 0.6 model.srcutlog.alpha = alpha model.srcutlog.alpha.frozen = True # Keep frozen in all fits par_break = model.srcutlog.__getattribute__('break') # Yeah... model.phabs.nH.frozen = True par_break.frozen = False model.srcutlog.norm.frozen = False xs.Fit.perform() # Only break, norm free model.phabs.nH.frozen = False xs.Fit.perform() # break, norm, nH all free return model
def xspec_flux(x): Temperature, z_, ind_file, El_, Eh_, Z_ = x L_factor, norm, abundance = 1e44, 1.0, Z_ E_norm = [El_, Eh_] xspec.Model("apec") m1 = xspec.AllModels(1) m1.setPars(Temperature, abundance, z_, norm) filename = mydirectory+"/parameter_files/xspec/" + str(ind_file) + ".fak" fs1 = xspec.FakeitSettings(response, ancillary, fileName = filename, \ exposure = 100000.0) xspec.AllData.fakeit(1,fs1,applyStats=False, noWrite = True) spec1 = xspec.AllData(1) xspec.AllModels.setEnergies(".01 100. 1000 log") xspec.AllModels.calcLumin("%f %f %f" %(E_norm[0],E_norm[1],z_)) L = spec1.lumin[0] xspec.AllModels.calcFlux("%f %f" %(E_norm[0],E_norm[1])) F = spec1.flux[0] new_norm = L_factor / (L * 1e44) m1.setPars({4:new_norm}) xspec.AllModels.calcLumin("%f %f %f" %(E_norm[0],E_norm[1],z_)) L_new = spec1.lumin[0] xspec.AllModels.calcFlux("%f %f" %(E_norm[0],E_norm[1])) F_new = spec1.flux[0] spec1.ignore("**-%f %f-**" %(E_norm[0],E_norm[1])) rate = spec1.rate[3] xspec.AllData.clear() return [F_new, rate]
def get_fraction_obs_RF_ObsF( nh_val, redshift=0): #, kev_min_erosita = 0.5, kev_max_erosita = 2.0): print(nh_val, redshift) kev_min_erosita = 0.5 kev_max_erosita = 2.0 kev_min_erosita_RF = 0.5 / (1 + redshift) kev_max_erosita_RF = 2. / (1 + redshift) m1 = xspec.Model("atable{" + torus_model + "} + atable{" + torus_model_omni + "}") m1.setPars( nh_val, # torus NH value in 0.01, 1000 PL, # torus photon Index, 2 400, # torus Ecut off 400 keV 30, # torus torus opening angle sigma. 5deg = thin, 90deg = isotropic 0.3, # torus CTK coverage: 0.4 ??? 40., # torus viewing angle redshift, # torus redshift 1., # torus norm nh_val, # scatt NH value in 0.01, 1000 (same as for torus) PL, # scatt photon Index, 2 400, # scatt Ecut off 400 keV 30, # scatt torus opening angle sigma. 5deg = thin, 90deg = isotropic 0.3, # scatt CTK coverage: 0.4 ??? 40., # scatt viewing angle redshift, # scatt redshift 0.02) # scatt norm xspec.AllModels.calcFlux(str(kev_min_erosita) + " " + str(kev_max_erosita)) flux_obs = m1.flux[0] #/(kev_max_erosita-kev_min_erosita) # rest frame intrinsic flux xspec.AllModels.show() m1.torus.nH = 0.01 m1.scat.nH = 0.01 xspec.AllModels.calcFlux( str(kev_min_erosita_RF) + " " + str(kev_max_erosita_RF)) flux_intrinsic = m1.flux[0] #/(kev_max_erosita_RF-kev_min_erosita_RF) xspec.AllModels.show() fraction_observed = flux_obs / flux_intrinsic return fraction_observed