示例#1
0
def load_cubes(config):
    cube_dir = Path(config['logging']['working_dir'])
    npred_cube = SkyCube.read(cube_dir / 'npred_cube.fits.gz')
    exposure_cube = SkyCube.read(cube_dir / 'exposure_cube.fits', format='fermi-exposure')
    # print(exposure_cube)
    # print('exposure sum: {}'.format(np.nansum(exposure_cube.data)))
    i_nan = np.where(np.isnan(exposure_cube.data))
    exposure_cube.data[i_nan] = 0

    # npred_cube_convolved = SkyCube.read(cube_dir / 'npred_cube_convolved.fits.gz')

    return dict(counts=npred_cube, exposure=exposure_cube)
示例#2
0
def prepare_images():
    # Read in data
    background_file = FermiVelaRegion.filenames()['diffuse_model']
    exposure_file = FermiVelaRegion.filenames()['exposure_cube']
    counts_file = FermiVelaRegion.filenames()['counts_cube']
    background_model = SkyCube.read(background_file)
    exposure_cube = SkyCube.read(exposure_file)

    # Add correct units
    exposure_cube.data = Quantity(exposure_cube.data.value, 'cm2 s')

    # Re-project background cube
    repro_bg_cube = background_model.reproject_to(exposure_cube)

    # Define energy band required for output
    energies = EnergyBounds([10, 500], 'GeV')

    # Compute the predicted counts cube
    npred_cube = compute_npred_cube(repro_bg_cube, exposure_cube, energies)

    # Convolve with Energy-dependent Fermi LAT PSF
    psf = EnergyDependentTablePSF.read(FermiVelaRegion.filenames()['psf'])
    convolved_npred_cube = convolve_cube(npred_cube,
                                         psf,
                                         offset_max=Angle(3, 'deg'))

    # Counts data
    counts_data = fits.open(counts_file)[0].data
    counts_wcs = WCS(fits.open(counts_file)[0].header)
    counts_cube = SkyCube(data=Quantity(counts_data, ''),
                          wcs=counts_wcs,
                          energy=energies)
    counts_cube = counts_cube.reproject_to(npred_cube,
                                           projection_type='nearest-neighbor')

    counts = counts_cube.data[0]
    model = convolved_npred_cube.data[0]

    # Load Fermi tools gtmodel background-only result
    gtmodel = fits.open(
        FermiVelaRegion.filenames()['background_image'])[0].data.astype(float)

    # Ratio for the two background images
    ratio = np.nan_to_num(model / gtmodel)

    # Header is required for plotting, so returned here
    wcs = npred_cube.wcs
    header = wcs.to_header()

    return model, gtmodel, ratio, counts, header
示例#3
0
def prepare_images():
    # Read in data
    background_file = FermiVelaRegion.filenames()['diffuse_model']
    exposure_file = FermiVelaRegion.filenames()['exposure_cube']
    counts_file = FermiVelaRegion.filenames()['counts_cube']
    background_model = SkyCube.read(background_file)
    exposure_cube = SkyCube.read(exposure_file)

    # Add correct units
    exposure_cube.data = Quantity(exposure_cube.data.value, 'cm2 s')

    # Re-project background cube
    repro_bg_cube = background_model.reproject_to(exposure_cube)

    # Define energy band required for output
    energies = EnergyBounds([10, 500], 'GeV')

    # Compute the predicted counts cube
    npred_cube = compute_npred_cube(repro_bg_cube, exposure_cube, energies)

    # Convolve with Energy-dependent Fermi LAT PSF
    psf = EnergyDependentTablePSF.read(FermiVelaRegion.filenames()['psf'])
    convolved_npred_cube = convolve_cube(npred_cube, psf,
                                         offset_max=Angle(3, 'deg'))

    # Counts data
    counts_data = fits.open(counts_file)[0].data
    counts_wcs = WCS(fits.open(counts_file)[0].header)
    counts_cube = SkyCube(data=Quantity(counts_data, ''),
                          wcs=counts_wcs,
                          energy=energies)
    counts_cube = counts_cube.reproject_to(npred_cube, projection_type='nearest-neighbor')

    counts = counts_cube.data[0]
    model = convolved_npred_cube.data[0]

    # Load Fermi tools gtmodel background-only result
    gtmodel = fits.open(FermiVelaRegion.filenames()['background_image'])[0].data.astype(float)

    # Ratio for the two background images
    ratio = np.nan_to_num(model / gtmodel)

    # Header is required for plotting, so returned here
    wcs = npred_cube.wcs
    header = wcs.to_header()

    return model, gtmodel, ratio, counts, header
示例#4
0
def prepare_images():
    # Read in data
    fermi_vela = FermiVelaRegion()
    background_file = FermiVelaRegion.filenames()['diffuse_model']
    exposure_file = FermiVelaRegion.filenames()['exposure_cube']
    counts_file = FermiVelaRegion.filenames()['counts_cube']
    background_model = SkyCube.read(background_file, format='fermi-background')
    exposure_cube = SkyCube.read(exposure_file, format='fermi-exposure')

    # Re-project background cube
    repro_bg_cube = background_model.reproject(exposure_cube)

    # Define energy band required for output
    energies = EnergyBounds([10, 500], 'GeV')

    # Compute the predicted counts cube
    npred_cube = compute_npred_cube(repro_bg_cube,
                                    exposure_cube,
                                    energies,
                                    integral_resolution=5)

    # Convolve with Energy-dependent Fermi LAT PSF
    psf = EnergyDependentTablePSF.read(FermiVelaRegion.filenames()['psf'])
    kernels = psf.kernels(npred_cube)
    convolved_npred_cube = npred_cube.convolve(kernels, mode='reflect')

    # Counts data
    counts_cube = SkyCube.read(counts_file, format='fermi-counts')
    counts_cube = counts_cube.reproject(npred_cube)

    counts = counts_cube.data[0]
    model = convolved_npred_cube.data[0]

    # Load Fermi tools gtmodel background-only result
    gtmodel = fits.open(
        FermiVelaRegion.filenames()['background_image'])[0].data.astype(float)

    # Ratio for the two background images
    ratio = np.nan_to_num(model / gtmodel)

    # Header is required for plotting, so returned here
    wcs = npred_cube.wcs
    header = wcs.to_header()
    return model, gtmodel, ratio, counts, header
示例#5
0
def prepare_images():
    # Read in data
    fermi_vela = FermiVelaRegion()
    background_file = FermiVelaRegion.filenames()['diffuse_model']
    exposure_file = FermiVelaRegion.filenames()['exposure_cube']
    counts_file = FermiVelaRegion.filenames()['counts_cube']
    background_model = SkyCube.read(background_file, format='fermi-background')
    exposure_cube = SkyCube.read(exposure_file, format='fermi-exposure')

    # Re-project background cube
    repro_bg_cube = background_model.reproject(exposure_cube)

    # Define energy band required for output
    energies = EnergyBounds([10, 500], 'GeV')

    # Compute the predicted counts cube
    npred_cube = compute_npred_cube(repro_bg_cube, exposure_cube, energies,
                                    integral_resolution=5)

    # Convolve with Energy-dependent Fermi LAT PSF
    psf = EnergyDependentTablePSF.read(FermiVelaRegion.filenames()['psf'])
    kernels = psf.kernels(npred_cube)
    convolved_npred_cube = npred_cube.convolve(kernels, mode='reflect')

    # Counts data
    counts_cube = SkyCube.read(counts_file, format='fermi-counts')
    counts_cube = counts_cube.reproject(npred_cube)

    counts = counts_cube.data[0]
    model = convolved_npred_cube.data[0]

    # Load Fermi tools gtmodel background-only result
    gtmodel = fits.open(FermiVelaRegion.filenames()['background_image'])[0].data.astype(float)

    # Ratio for the two background images
    ratio = np.nan_to_num(model / gtmodel)

    # Header is required for plotting, so returned here
    wcs = npred_cube.wcs
    header = wcs.to_header()
    return model, gtmodel, ratio, counts, header
示例#6
0
from gammapy.cube import SkyCube
from gammapy.cube.sherpa_ import (
    CombinedModel3DInt,
    CombinedModel3DIntConvolveEdisp,
    NormGauss2DInt,
)

from sherpa.models import PowLaw1D, TableModel
from sherpa.estmethods import Covariance
from sherpa.optmethods import NelderMead
from sherpa.stats import Cash
from sherpa.fit import Fit
import sherpa
import os
cube_dir = Path(os.getcwd())
counts_3d = SkyCube.read(cube_dir / 'counts_cube.fits')
cube
cube = counts.to_sherpa_data3d(dstype='Data3DInt')
background
bkg_3d = SkyCube.read(cube_dir / 'bkg_cube.fits')
cube_dir = Path('$GAMMAPY_EXTRA/test_datasets/cube')
bkg_3d = SkyCube.read(cube_dir / 'bkg_cube.fits')
background
bkg_3d
bkg = TableModel('bkg')
bkg.load(None, background.data.value.ravel())
bkg.ampl = 1
bkg.ampl.freeze()
i_nan = np.where(np.isnan(exposure.data))
exposure.data[i_nan] = 0
# In order to have the exposure in cm2 s
示例#7
0
"""Test npred model image computation.
"""
from astropy.coordinates import Angle
from gammapy.datasets import FermiGalacticCenter
from gammapy.utils.energy import EnergyBounds
from gammapy.irf import EnergyDependentTablePSF
from gammapy.cube import SkyCube, compute_npred_cube, convolve_cube

filenames = FermiGalacticCenter.filenames()
flux_cube = SkyCube.read(filenames['diffuse_model'])
exposure_cube = SkyCube.read(filenames['exposure_cube'])
psf = EnergyDependentTablePSF.read(filenames['psf'])

flux_cube = flux_cube.reproject_to(exposure_cube)

energy_bounds = EnergyBounds([10, 30, 100, 500], 'GeV')
npred_cube = compute_npred_cube(flux_cube, exposure_cube, energy_bounds)

offset_max = Angle(1, 'deg')
npred_cube_convolved = convolve_cube(npred_cube, psf, offset_max)
示例#8
0
def main():

    # Read file to fit
    #filename = 'nexcess_cube.fits.gz'
    filename = 'non_cube_convolved.fits.gz'
    cube = SkyCube.read(filename)

    # Read configuration
    config = read_config('config.yaml')
    binsz = config['binning']['binsz']
    offset_fov = config['selection']['offset_fov']

    # Take PSF data
    irffile = 'irf_file.fits'
    psf_table = psf_fromfits(irffile)

    energarr = cube.energies('edges')
    sigmas = psf_table[3]
    norms = psf_table[4]

    hdu = pyfits.open(filename)

    im_sizex = hdu[0].header['NAXIS1']
    im_sizey = hdu[0].header['NAXIS2']

    cx = 0.5 * im_sizex
    cy = 0.5 * im_sizey

    # Check the significance
    filename_on = 'non_cube.fits.gz'

    cube_on = SkyCube.read(filename_on)

    filename_off = 'noff_cube.fits.gz'

    cube_off = SkyCube.read(filename_off)
    alpha_obs = 1.

    on_pos = SkyCoord(83.6333 * u.deg, 22.0144 * u.deg, frame='icrs')
    on_sizes = np.ones(len(
        cube.energies('center'))) * 120 * binsz * u.deg  #0.167

    off_pos = SkyCoord(83.6333 * u.deg, 22.0144 * u.deg, frame='icrs')
    off_sizes = on_sizes * alpha_obs

    on_data = Table()
    off_data = Table()
    on_data['value'] = np.zeros(len(on_sizes))
    off_data['value'] = np.zeros(len(on_sizes))
    for idx in range(len(cube.energies('center'))):

        on_region = CircleSkyRegion(on_pos, on_sizes[idx])
        off_region = CircleSkyRegion(off_pos, off_sizes[idx])

        on_data['value'][idx] = cube_on.spectrum(on_region)['value'][idx]
        off_data['value'][idx] = cube_off.spectrum(off_region)['value'][idx]

        limasig = np.sqrt(
            2) * np.sqrt(on_data['value'][idx] * np.log(
                ((1 + alpha_obs) / alpha_obs) * on_data['value'][idx] /
                (on_data['value'][idx] + off_data['value'][idx])) +
                         off_data['value'][idx] * np.log(
                             (1 + alpha_obs) * off_data['value'][idx] /
                             (on_data['value'][idx] + off_data['value'][idx])))

        print(limasig, 'Energy range: ',
              cube_on.energies('edges')[idx], ' - ',
              cube_on.energies('edges')[idx + 1])

        #Fit only if data is enough
        #and on_data['value'][i] - off_data['value'][i] >= 0.01 * off_data['value'][i]
        if limasig >= 3 and on_data['value'][idx] - off_data['value'][idx] >= 7:

            # Make image cube from slice excess convolved cube
            cube_sum = np.zeros(
                (cube.data.shape[1], cube.data.shape[2])) * u.ct
            cube_sum = np.add(cube_sum, cube.data[idx])

            cube_sum.value[np.isnan(cube_sum.value)] = 0
            cube_sum.value[cube_sum.value < 0] = abs(
                cube_sum.value[cube_sum.value < 0])

            image_sum = SkyCube.empty_like(cube)
            image_sum.data = cube_sum

            image_sum.write('sum_image.fits.gz', overwrite=True)

            # Find nearest energy and theta value
            i = np.argmin(np.abs(energarr[idx].value -
                                 psf_table[0].value))  ######
            j = np.argmin(np.abs(offset_fov - psf_table[2].value))

            # Make PSF
            #psfname="mypsf"
            #load_user_model(PSFGauss,psfname)
            s1 = sigmas[0][j][i] / binsz
            s2 = sigmas[1][j][i] / binsz
            s3 = sigmas[2][j][i] / binsz
            print(sigmas[0][j][i], sigmas[1][j][i], sigmas[2][j][i])
            ampl = norms[0][j][i]
            ampl2 = norms[1][j][i]
            ampl3 = norms[2][j][i]

            t0 = time()

            #Morphological fitting
            load_image("sum_image.fits.gz")
            #image_data()

            #set_coord("physical")

            set_method("simplex")
            set_stat("cash")

            # Position and radius
            x0 = 125
            y0 = 125
            rad0 = 80.0

            image_getregion(coord="physical")
            'circle(x0,y0,rad0);'

            notice2d("circle(" + str(x0) + "," + str(y0) + "," + str(rad0) +
                     ")")

            load_user_model(GaussianSource, "sph2d")
            add_user_pars("sph2d", [
                "sigma1", "sigma2", "sigma3", "alpha", "beta", "ampl", "size",
                "xpos", "ypos"
            ])

            set_model(sph2d + const2d.bgnd)

            # Constant PSF
            #gpsf.fwhm = 4.2
            #gpsf.xpos = x0
            #gpsf.ypos = y0
            #gpsf.ellip = 0.2
            #gpsf.theta = 30 * np.pi / 180

            #### Set PSF
            set_par(sph2d.sigma1, val=s1, frozen=True)
            set_par(sph2d.sigma2, val=0, frozen=True)
            set_par(sph2d.sigma3, val=0, frozen=True)
            set_par(sph2d.alpha, val=0, frozen=True)
            set_par(sph2d.beta, val=0, frozen=True)

            # HESS PSF
            #set_par(sph2d.sigma1, val = 0.025369, frozen = True)
            #set_par(sph2d.alpha, val = 0.691225, frozen = True)
            #set_par(sph2d.sigma2, val = 0.0535014, frozen = True)
            #set_par(sph2d.beta, val = 0.13577, frozen = True)
            #set_par(sph2d.sigma3, val = 0.11505, frozen = True)

            set_par(sph2d.xpos, val=x0, frozen=True)
            set_par(sph2d.ypos, val=y0, frozen=True)

            set_par(sph2d.ampl, val=10000, min=1e-11, max=100000000)
            set_par(sph2d.size, val=10, min=1e-11, max=100)

            set_par(bgnd.c0, val=1, min=0, max=100)

            show_model()
            fit()
            #do_fit()
            conf()
            #do_conf()
            #image_fit()
            #save_model("model_" + str(idx) + ".fits")
            #save_resid("resid_" + str(idx) + ".fits")

            t1 = time()
            print('Simul time', t1 - t0)
示例#9
0
def main():
    # Read cubes
    cube_on = SkyCube.read('non_cube.fits.gz')
    cube_off = SkyCube.read('noff_cube.fits.gz')

    #Read config

    config = yaml.load(open('config.yaml'))
    binsz = config['binning']['binsz']
    offset_fov = config['selection']['offset_fov']

    #countson_vals = []
    #countsoff_vals = []
    diff_vals = np.ones(int(config['binning']['enumbins']))
    sigmaslimas = np.ones(int(config['binning']['enumbins']))

    # Define PSF region
    irffile = 'irf_file.fits'
    psf_table = psf_fromfits(irffile)
    psfs = psf_table[3]

    on_sizes = np.ones(int(config['binning']['enumbins'])) * u.deg
    energarr = cube_on.energies('edges')
    for idx in range(len(cube_on.energies('center'))):
        i = np.argmin(np.abs(energarr[idx].value - psf_table[0].value))
        j = np.argmin(np.abs(offset_fov - psf_table[2].value))
        on_sizes.value[idx] = psfs[0][j][i] * 2.12

    alpha_obs = 0.2
    on_pos = SkyCoord(83.6333 * u.deg, 22.0144 * u.deg, frame='icrs')

    ##Debug
    #print(on_sizes/binsz)

    off_pos = SkyCoord(83.6333 * u.deg, 22.0144 * u.deg, frame='icrs')
    off_sizes = on_sizes / np.sqrt(alpha_obs)

    on_data = Table()
    off_data = Table()
    on_data['value'] = np.zeros(len(on_sizes))
    off_data['value'] = np.zeros(len(on_sizes))

    for i in range(cube_on.data.shape[0]):

        # Make PSF region
        on_region = CircleSkyRegion(on_pos, on_sizes[i])
        off_region = CircleSkyRegion(off_pos, off_sizes[i])

        # Take spectrum
        on_data['value'][i] = cube_on.spectrum(on_region)['value'][i]
        off_data['value'][i] = cube_off.spectrum(off_region)['value'][
            i]  #* alpha_obs
        non_val = on_data['value'][i]
        noff_val = off_data['value'][i]
        diff_vals[i] = non_val - noff_val

        if non_val != 0 and noff_val != 0:
            siglima = np.sqrt(2) * np.sqrt(non_val * np.log(
                (1.0 + (1.0 / alpha_obs)) * non_val /
                (non_val + noff_val)) + noff_val * np.log(
                    (alpha_obs + 1.0) * noff_val / (non_val + noff_val)))
        elif non_val != 0 and noff_val == 0:
            siglima = np.sqrt(2) * np.sqrt(non_val * np.log(
                (1.0 + (1.0 / alpha_obs))))
        else:
            siglima = 0
        sigmaslimas[i] = siglima

    ##Debug
    #non_val = cube_on.data.sum().value
    #noff_val = cube_off.data.sum().value

    lo_lim_idx = np.where(
        abs(cube_on.energies('edges').value -
            0.4) == np.min(abs(cube_on.energies('edges').value - 0.4)))[0][0]
    max_energ_idx = np.where(
        abs(cube_on.energies('edges').value -
            3.0) == np.min(abs(cube_on.energies('edges').value - 3.0)))[0][0]
    non_val = on_data['value'][lo_lim_idx:max_energ_idx].sum()
    noff_val = off_data['value'][lo_lim_idx:max_energ_idx].sum()

    siglima = np.sqrt(2) * np.sqrt(non_val * np.log(
        (1.0 + (1.0 / alpha_obs)) * non_val /
        (non_val + noff_val)) + noff_val * np.log(
            (alpha_obs + 1.0) * noff_val / (non_val + noff_val)))

    #print('On events: ', on_data)
    #print('Off events: ', off_data)
    diff_vals[np.isnan(diff_vals)] = 0
    sigmaslimas[np.isnan(sigmaslimas)] = 0
    print('Excess: ', diff_vals)
    print('Total positive Excess: ', diff_vals[diff_vals > 0].sum())
    print('LiMa by energy bins: ', sigmaslimas)
    print('Total LiMa: ', siglima, 'Energy range: ',
          cube_on.energies('edges')[lo_lim_idx], ' - ',
          cube_on.energies('edges')[max_energ_idx])

    lo_lim_idx = np.where(
        abs(cube_on.energies('edges').value -
            1.0) == np.min(abs(cube_on.energies('edges').value - 1.0)))[0][0]
    non_val = on_data['value'][lo_lim_idx:max_energ_idx].sum()
    noff_val = off_data['value'][lo_lim_idx:max_energ_idx].sum()

    siglima_tves = np.sqrt(
        2) * np.sqrt(non_val * np.log(2 * non_val / (non_val + noff_val)) +
                     noff_val * np.log(2 * noff_val / (non_val + noff_val)))

    print('Total LiMa: ', siglima_tves, 'Energy range: ',
          cube_on.energies('edges')[lo_lim_idx], ' - ',
          cube_on.energies('edges')[max_energ_idx])

    return [siglima, siglima_tves, on_data, off_data, diff_vals, sigmaslimas]
示例#10
0
                               use_cube,
                               use_etrue=False)
outdir_result = make_outdir_filesresult(source_name,
                                        name_method_fond,
                                        len(energy_bins),
                                        config_name,
                                        image_size,
                                        for_integral_flux,
                                        use_cube,
                                        use_etrue=False)
"""
Source model paramaters initial
"""
#Dans HGPS, c est une gaussienne de 0.05deg en sigma donc *2.35 pour fwhm
#avec HESS meme une source pontuelle ne fera jamais en dessous de 0.03-0.05 degre,
counts_3D = SkyCube.read(outdir_data + "/counts_cube.fits")
cube = counts_3D.to_sherpa_data3d(dstype='Data3DInt')
bkg_3D = SkyCube.read(outdir_data + "/bkg_cube.fits")
exposure_3D = SkyCube.read(outdir_data + "/exposure_cube.fits")
i_nan = np.where(np.isnan(exposure_3D.data))
exposure_3D.data[i_nan] = 0
exposure_3D.data = exposure_3D.data * 1e4
psf_3D = SkyCube.read(outdir_data + "/mean_psf_cube_" + source_name + ".fits",
                      format="fermi-counts")

# Setup combined spatial and spectral model
spatial_model = NormGauss2DInt('spatial-model')
spectral_model = PowLaw1D('spectral-model')
#spectral_model = MyPLExpCutoff('spectral-model')
source_model = CombinedModel3DInt(use_psf=True,
                                  exposure=exposure_3D,
def main():
    
    #Low energy of spectral fitting range.
    lo_fit_energ = 0.1 * u.Unit('TeV')
    hi_fit_energ = 10 * u.Unit('TeV')
    
    #If you want an internal estimation of a high energy limit for the fitting range: est_hi_lim = 'yes'. If 'no' the hi_fit_energ will be used.
    est_hi_lim = 'yes'
    
    # Read ON and OFF cubes
    filename_on = 'non_cube.fits.gz' # non_cube_convolved.fits
    cube_on = SkyCube.read(filename_on)
    
    ann_filename_off = 'noff_withpuls_cube.fits.gz'
    ann_cube_off = SkyCube.read(ann_filename_off)
    circ_filename_off = 'noff_withneb_cube.fits.gz'
    circ_cube_off = SkyCube.read(circ_filename_off)
    
    # Read config and IRFs
    config = read_config('config.yaml')
    irfs = get_irfs(config)
    offset = Angle(config['selection']['offset_fov'] * u.deg)
    livetime = u.Quantity(config['pointing']['livetime']).to('second')
    alpha_obs = 1.
    binsz = config['binning']['binsz']
    aeff = irfs['aeff'].to_effective_area_table(offset = offset, energy = cube_on.energies('edges'))
    edisp = irfs['edisp'].to_energy_dispersion(offset = offset, e_true = aeff.energy.bins, e_reco = cube_on.energies('edges') )
    
    # Define circular on/off Regions parameters
    on_pos = SkyCoord(83.6333 * u.deg, 22.0144 * u.deg, frame='icrs')
    on_sizes = np.ones(20) * binsz * u.deg
    
    off_pos = SkyCoord(83.6333 * u.deg, 22.0144 * u.deg, frame='icrs')
    off_sizes = on_sizes * np.sqrt(1./alpha_obs)
    
    # Make Annular region
    on_rad_sizes = np.ones(len(on_sizes)) * 0.1 * binsz * u.deg
    off_rad_sizes = on_rad_sizes * np.sqrt(1./alpha_obs)
    widths = np.ones(len(on_sizes)) * 22 * binsz * u.deg
    out_rad_sizes = on_rad_sizes + widths
    
    ann_on_data, ann_off_data, ann_stats = make_annular_spectrum(on_pos, off_pos, on_rad_sizes, off_rad_sizes, out_rad_sizes, cube_on, ann_cube_off, alpha_obs)
    
    # Make circular region
    circ_on_data, circ_off_data, circ_stats = make_circular_spectrum(on_pos, off_pos, on_sizes, off_sizes, cube_on, circ_cube_off, alpha_obs)

    # Undo "holes" in circ/ann_stats
    if np.max(np.where(circ_stats == 1)) + 1 != circ_stats.sum():
        circ_stats[0:np.max(np.where(circ_stats == 1)) + 1][circ_stats[0:np.max(np.where(circ_stats == 1)) + 1] == 0] = 1.
    if np.max(np.where(ann_stats == 1)) + 1 != ann_stats.sum():
        ann_stats[0:np.max(np.where(ann_stats == 1)) + 1][ann_stats[0:np.max(np.where(ann_stats == 1)) + 1] == 0] = 1.
    
    # Make on/off vector
    ann_on_vector = PHACountsSpectrum(energy_lo = cube_on.energies('edges')[:-1], energy_hi= cube_on.energies('edges')[1:], data= ann_on_data['value'].data * ann_stats * u.ct, backscal = on_sizes[0].value, meta={'EXPOSURE' : livetime.value})
    circ_on_vector = PHACountsSpectrum(energy_lo = cube_on.energies('edges')[:-1], energy_hi= cube_on.energies('edges')[1:], data= circ_on_data['value'].data * circ_stats * u.ct, backscal = on_sizes[0].value, meta={'EXPOSURE' : livetime.value})
    
    
    ann_off_vector = PHACountsSpectrum(energy_lo = ann_cube_off.energies('edges')[:-1], energy_hi= ann_cube_off.energies('edges')[1:], data= ann_off_data['value'].data * ann_stats * u.ct, backscal = off_sizes[0].value, meta={'EXPOSURE' : livetime.value, 'OFFSET' : 0.3 * u.deg})
    circ_off_vector = PHACountsSpectrum(energy_lo = circ_cube_off.energies('edges')[:-1], energy_hi= circ_cube_off.energies('edges')[1:], data= circ_off_data['value'].data * circ_stats * u.ct, backscal = off_sizes[0].value, meta={'EXPOSURE' : livetime.value, 'OFFSET' : 0.3 * u.deg})

    # Make SpectrumObservation

    ann_sed_table = SpectrumObservation(on_vector = ann_on_vector, off_vector = ann_off_vector, aeff = aeff, edisp = edisp)
    circ_sed_table = SpectrumObservation(on_vector = circ_on_vector, off_vector = circ_off_vector, aeff = aeff, edisp = edisp)

    ##Debug
    #print(ann_stats)
    #print(circ_stats)
    
    # Define Spectral Model

    model2fit1 = LogParabola(amplitude=1e-11 * u.Unit('cm-2 s-1 TeV-1'), reference=1 * u.TeV, alpha=2.5 * u.Unit(''), beta=0.1 * u.Unit(''))
    model2fit2 = ExponentialCutoffPowerLaw(index = 1. * u.Unit(''), amplitude = 1e-11 * u.Unit('cm-2 s-1 TeV-1'), reference= 1 * u.TeV,  lambda_= 0. * u.Unit('TeV-1'))
    model2fit3 = PowerLaw(index= 2.5 * u.Unit(''), amplitude= 5e-11 * u.Unit('cm-2 s-1 TeV-1'), reference= 0.15 * u.TeV)

    model2fit3.parameters['amplitude'].parmin = 1e-12
    model2fit3.parameters['amplitude'].parmax = 1e-10
    
    model2fit3.parameters['index'].parmin = 2.0
    model2fit3.parameters['index'].parmax = 4.0

    #Models to fit the circular and annular observations
    models_ann_fit = [model2fit1, model2fit2, model2fit3]
    models_circ_fit = [model2fit1, model2fit2, model2fit3]
    
    # Fit
    if est_hi_lim = 'yes':
        hi_fit_energ = cube_on.energies('edges')[int(np.sum(ann_stats))]
示例#12
0
else:
    center = SkyCoord.from_name(
        input_param["general"]["sourde_name_skycoord"]).galactic
extraction_size = input_param["param_fit_3D"]["extraction_region"]
empty_cube_reco = make_empty_cube(extraction_size,
                                  energy_bins,
                                  center,
                                  data_unit="")
empty_cube_true = make_empty_cube(extraction_size,
                                  energy_bins_true,
                                  center,
                                  data_unit="")
"""
Define SkyCube
"""
cube_mask = SkyCube.read("skycube_mask_CG_binE_" +
                         str(input_param["energy binning"]["nbin"]) + ".fits")
index_region_selected_3d = np.where(cube_mask.data.value == 1)

counts_3D = SkyCube.read(outdir_data + "/counts_cube.fits").cutout(
    center, extraction_size)
coord = counts_3D.sky_image_ref.coordinates(mode="edges")
energies = counts_3D.energies(mode='edges').to("TeV")
cube = counts_3D.to_sherpa_data3d(dstype='Data3DInt')
#apply the cube_mask
cube.mask = cube_mask.data.value.ravel()

bkg_3D = SkyCube.read(outdir_data + "/bkg_cube.fits").cutout(
    center, extraction_size)
exposure_3D = SkyCube.read(outdir_data + "/exposure_cube.fits").cutout(
    center, extraction_size)
i_nan = np.where(np.isnan(exposure_3D.data))