예제 #1
0
파일: fakeit.py 프로젝트: mcrnogor/LLE-ALPs
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()
예제 #2
0
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
예제 #5
0
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:]
예제 #6
0
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
예제 #7
0
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)
예제 #8
0
 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
예제 #9
0
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
예제 #11
0
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()
예제 #12
0
 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
예제 #13
0
파일: fitting.py 프로젝트: kiyami/astrostat
    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())
예제 #14
0
 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
예제 #15
0
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
예제 #16
0
파일: fitting.py 프로젝트: pabell/ximpol
 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()
예제 #17
0
 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)
예제 #18
0
 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")
예제 #19
0
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
예제 #21
0
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
예제 #23
0
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
예제 #24
0
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
예제 #26
0
 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)
예제 #27
0
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:]
예제 #28
0
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
예제 #29
0
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]
예제 #30
0
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