Beispiel #1
0
def multiscreen_tau(sample, d2g=0.009, scatm=ss.makeScatmodel("RG", "Drude")):
    result = []
    for walker in sample:
        logNHu, logNHs, a_u, a_s, p_u, p_s, x_s = walker
        MDu, MDs = np.power(10.0, logNHu) * c.mp() * d2g, np.power(10.0, logNHs) * c.mp() * d2g
        da_u, da_s = (a_u - AMIN) / 10.0, (a_s - AMIN) / 10.0
        Udust = dust.Dustdist(rad=np.arange(AMIN, a_u + da_u, da_u), p=p_u)
        Sdust = dust.Dustdist(rad=np.arange(AMIN, a_s + da_s, da_s), p=p_s)
        Ukappa = ss.Kappascat(E=1.0, dist=dust.Dustspectrum(rad=Udust, md=MDu), scatm=scatm).kappa[0]
        Skappa = ss.Kappascat(E=1.0, dist=dust.Dustspectrum(rad=Sdust, md=MDs), scatm=scatm).kappa[0]
        result.append(Ukappa * MDu + Skappa * MDs)
    return np.array(result)
Beispiel #2
0
def sample_logMD(sample, d2g=0.009, replace=False, mscreen=False):
    if mscreen:
        nhtot = np.power(10.0, sample[:, 2]) + np.power(10.0, sample[:, 3])
        logmd = np.log10(nhtot * c.mp() * d2g)
        if replace:
            result = np.copy(sample)
            result[:, 2] = sample[:, 2] + np.log10(c.mp() * d2g)
            result[:, 3] = sample[:, 3] + np.log10(c.mp() * d2g)
            return result
    else:
        logmd = sample[:, 0] + np.log10(c.mp() * d2g)
        if replace:
            result = np.copy(sample)
            result[:, 0] = logmd
            return result
    return logmd
Beispiel #3
0
def sample_tau(sample, d2g=0.009, mscreen=False):
    result = []
    for walker in sample:
        if mscreen:
            x1, x2, logNH1, logNH2, amax, p = walker
            nhtot = np.power(10.0, logNH1) + np.power(10.0, logNH2)
            md = nhtot * c.mp() * d2g
        else:
            logNH, amax, p = walker
            md = np.power(10.0, logNH) * c.mp() * d2g
        da = (amax - AMIN) / 100.0
        DD = dust.Dustdist(rad=np.arange(AMIN, amax + da, da), p=p)
        DS = dust.Dustspectrum(rad=DD, md=md)
        KK = ss.Kappascat(E=1.0, dist=DS).kappa[0]
        result.append(KK * md)
    return np.array(result)
Beispiel #4
0
def DiscreteISM( halo, xg=0.5, NH=1.0e20, d2g=0.009 ):
    """
    FUNCTION DiscreteISM( halo, xg=0.5, NH=1.0e20, d2g=0.009 )
    MODIFIES halo.htype, halo.dist, halo.taux, halo.intensity
    ----------------------------------------------------------------------------
    halo : Halo object
    xg   : float : distance FROM source / distance between source and observer
    NH   : float : column density [cm^-2]
    d2g  : float : dust-to-gass mass ratio
    """
    E0    = halo.energy
    alpha = halo.alpha
    scatm = halo.scatm
    md    = NH * c.mp() * d2g

    halo.htype = GalHalo( xg=xg, NH=NH, d2g=d2g, ismtype='Screen' )
    halo.dist  = dust.Dustspectrum( rad=halo.rad, md=md )

    thscat = alpha / xg

    if type(halo.rad) == dust.Grain:
        dsig = ss.Diffscat( theta=thscat, a=halo.dist.a, E=E0, scatm=scatm ).dsig
        intensity = np.power( xg, -2.0 ) * dsig * halo.dist.nd

    elif type(halo.rad) == dust.Dustdist:
        avals  = halo.dist.a
        intensity = []
        for i in range( len(alpha) ):
            iatemp = np.zeros( shape=( len(avals),len(alpha) ) )
            for j in range( len(avals) ):
                dsig    = ss.Diffscat( theta=thscat, a=avals[j], E=E0, scatm=scatm ).dsig
                iatemp[j,:] = np.power(xg,-2.0) * dsig
            intensity.append( c.intz( avals, iatemp[:,i] * halo.dist.nd ) )
        intensity = np.array( intensity )
    else:
        print '%% Must input type dust.Grain or dust.Dustdist'
        intensity = np.zeros( np.size(xvals) )

    halo.intensity = intensity * np.power( c.arcs2rad(), 2 )  # arcsec^-2
    halo.taux      = ss.Kappascat( E=halo.energy, scatm=halo.scatm, dist=halo.dist ).kappa * md
Beispiel #5
0
 def rp( self, E ):
     mm1 = self.rho / ( 2.0*c.mp() ) * c.re()/(2.0*np.pi) * np.power( c.kev2lam()/E , 2 )
     return mm1+1
Beispiel #6
0
import numpy as np
import matplotlib.pyplot as plt

print('importing...')
import sigma_scat as ss
import dust
import constants as c

print('setting input...')
# column density
NH   = 1.e21
# dust-to-gas ratio
d2g = 0.009
# use proton mass to get dust column mass
dust_mass = NH * c.mp() * d2g 
# energy range to evaluate over (in keV)
ERANGE    = np.power( 10.0, np.arange(-0.6,1.0,0.005) )
MD = dust_mass * 10.0 # for N_H = 1.e22

# define densities
# g cm^-3; see Draine book
RHO_SIL, RHO_GRA, RHO_AVG = 3.8, 2.2, 3.0 

print('defining dust distributions...')

# dust radius range to compute (in um)
# up to 0.25 um
MRN_RANGE = np.arange(0.005,0.25001,0.05)

# larger range going up to 1.5 um
BIG_RANGE = np.arange(0.005, 1.5, 0.05)
Beispiel #7
0
def UniformISM( halo, NH=1.0e20, d2g=0.009, nx=1000, usepathdiff=False ):
    """
    FUNCTION UniformISM( halo, NH=1.0e20, d2g=0.009, nx=1000, usepathdiff=False )
    MODIFIES halo.htype, halo.dist, halo.taux, halo.intensity
    ----------------------------------------------------------------------------
    halo : Halo object
    NH   : float : column density [cm^-2]
    d2g  : float : dust-to-gass mass ratio
    nx   : int : number of values to use in integration
    usepathdiff : boolean : True = use extinction due to path difference e^(-tau*path_diff)
    """
    E0    = halo.energy
    alpha = halo.alpha
    scatm = halo.scatm
    md    = NH * c.mp() * d2g

    halo.htype = GalHalo( NH=NH, d2g=d2g, ismtype='Uniform' )
    halo.dist  = dust.Dustspectrum( rad=halo.rad, md=md )
    halo.taux  = ss.Kappascat( E=halo.energy, scatm=halo.scatm, dist=halo.dist ).kappa * md

    dx    = 1.0 / nx
    xvals = np.arange( 0.0, 1.0, dx ) + dx

    #--- Single grain case ---

    if type( halo.rad ) == dust.Grain:

        intensity = np.array([])
        for al in alpha:
            thscat = al / xvals  # np.size(thscat) = nx
            dsig   = ss.Diffscat( theta=thscat, a=halo.dist.a, E=E0, scatm=scatm ).dsig

            delta_tau = 0.0
            if usepathdiff:
                print 'Using path difference'
                delta_x   = path_diff( al, xvals )
                delta_tau = halo.taux * delta_x
                print np.max( delta_x )

            itemp  = np.power( xvals, -2.0 ) * dsig * halo.dist.nd * np.exp( -delta_tau )
            intensity = np.append( intensity, c.intz( xvals, itemp ) )

    #--- Dust distribution case ---

    elif type( halo.rad ) == dust.Dustdist:

        avals     = halo.dist.a
        intensity = np.array([])

        for al in alpha:
            thscat = al / xvals  # np.size(thscat) = nx
            iatemp    = np.array([])
            for aa in avals:
                dsig  = ss.Diffscat( theta=thscat, a=aa, E=E0, scatm=scatm ).dsig

                delta_tau = 0.0
                if usepathdiff:
                    print 'Using path difference'
                    delta_x   = path_diff( al, xvals )
                    delta_tau = halo.taux * delta_x
                    print max( delta_x )

                dtemp  = np.power( xvals, -2.0 ) * dsig * np.exp( -delta_tau )
                iatemp = np.append( iatemp, c.intz( xvals, dtemp ) )

            intensity = np.append( intensity, c.intz( avals, halo.dist.nd * iatemp ) )

    else:
        print '%% Must input type dust.Grain or dust.Dustdist'
        intensity = np.zeros( np.size(xvals) )
        
    # Set the halo intensity

    halo.intensity  = intensity * np.power( c.arcs2rad(), 2 )  # arcsec^-2