im500hdu = hdulist['image'].header
im500 = hdulist['image'].data * 1.0E3  #convert to mJy
nim500 = hdulist['error'].data * 1.0E3  #convert to mJy
w_500 = wcs.WCS(hdulist[1].header)
pixsize500 = 3600.0 * w_500.wcs.cd[1, 1]  #pixel size (in arcseconds)
hdulist.close()

from astropy.coordinates import SkyCoord
from astropy import units as u
c = SkyCoord(ra=ras * u.degree, dec=decs * u.degree)
import pymoc
moc = pymoc.util.catalog.catalog_to_moc(c, 60, 15)

#---prior250--------
prior250 = xidplus.prior(
    im250, nim250, im250phdu, im250hdu, moc=moc
)  #Initialise with map, uncertianty map, wcs info and primary header
prior250.prior_cat(prior_cat['ra'],
                   prior_cat['dec'],
                   'prior_cat',
                   ID=prior_cat['help_id'])  #Set input catalogue
prior250.prior_bkg(
    -5.0, 5)  #Set prior on background (assumes Gaussian pdf with mu and sigma)
#---prior350--------
prior350 = xidplus.prior(im350, nim350, im350phdu, im350hdu, moc=moc)
prior350.prior_cat(prior_cat['ra'],
                   prior_cat['dec'],
                   'prior_cat',
                   ID=prior_cat['help_id'])
prior350.prior_bkg(-5.0, 5)
예제 #2
0
decs = lofar_orig['DEC'][n:n + 1]
ID = lofar_orig['Source_Name'][n:n + 1]

from astropy.coordinates import SkyCoord
from astropy import units as u

c = SkyCoord(ra=ras * u.degree, dec=decs * u.degree)
import pymoc

moc_near = pymoc.util.catalog.catalog_to_moc(c, 60, 15)

moc_mask = inMoc(lofar_orig['RA'], lofar_orig['DEC'], moc_near)
moc = pymoc.util.catalog.catalog_to_moc(c, 120, 15)

prior = xidplus.prior(
    radim_data, radim_err, radim_header, radim_header, moc=moc
)  #Initialise with map, uncertianty map, wcs info and primary header
prior.prior_cat(lofar_orig['RA'][moc_mask],
                lofar_orig['DEC'][moc_mask],
                'prior_cat',
                ID=lofar_orig['Source_Name'][moc_mask],
                moc=moc)  #Set input catalogue
prior.prior_bkg(
    -5.0, 5)  #Set prior on background (assumes Gaussian pdf with mu and sigma)

pind = np.arange(0, n_size)  #*(1.0/radim_pixsize)
prior.set_prf(prf.array, pind, pind)

prior.get_pointing_matrix()
prior.upper_lim_map()
예제 #3
0
#import pylab as plt
#plt.figure(figsize=(20,10))
#plt.subplot(1,2,1)
#plt.imshow(pacs100_psf[0].data[centre100-radius100:centre100+radius100+1,centre100-radius100:centre100+radius100+1])
#plt.colorbar()
#plt.subplot(1,2,2)
#plt.imshow(pacs160_psf[0].data[centre160-radius160:centre160+radius160+1,centre160-radius160:centre160+radius160+1])
#plt.colorbar()

# ## Set XID+ prior class

# In[ ]:

#---prior100--------
prior100 = xidplus.prior(
    im100, nim100, im100phdu, im100hdu, moc=Final
)  #Initialise with map, uncertianty map, wcs info and primary header
prior100.prior_cat(prior['RA'],
                   prior['Dec'],
                   'GAMA09_Ldust_prediction_results.fits',
                   ID=prior['help_id'])  #Set input catalogue
prior100.prior_bkg(
    0.0, 5)  #Set prior on background (assumes Gaussian pdf with mu and sigma)

#---prior160--------
prior160 = xidplus.prior(im160, nim160, im160phdu, im160hdu, moc=Final)
prior160.prior_cat(prior['RA'],
                   prior['Dec'],
                   'GAMA09_Ldust_prediction_results.fits',
                   ID=prior['help_id'])
prior160.prior_bkg(0.0, 5)
예제 #4
0
        MIPS_Map = fits.open(filename[index])

        w_im = wcs.WCS(MIPS_Map[1].header)
        w_nim = wcs.WCS(MIPS_Map[2].header)
        #print('w_im: ', w_im, '\n w_nim: ', w_nim)

        MIPS_Map[1].header['CRVAL1'] = MIPS_Map[2].header['CRVAL1']
        MIPS_Map[1].header['CRVAL2'] = MIPS_Map[2].header['CRVAL2']

        data = MIPS_Map[1].data

        # ## Set XID+ prior class
        print('setting XID+ priors')
        prior_MIPS = xidplus.prior(MIPS_Map[1].data,
                                   MIPS_Map[2].data,
                                   MIPS_Map[0].header,
                                   MIPS_Map[1].header,
                                   moc=Final)
        prior_MIPS.prior_cat(masterlist[1].data['ra'][good],
                             masterlist[1].data['dec'][good],
                             masterfile,
                             flux_lower=MIPS_lower,
                             flux_upper=MIPS_upper,
                             ID=masterlist[1].data['help_id'][good])

        #prior_MIPS.sra

        #xidplus.plot_map([prior_MIPS])

        prior_MIPS.set_prf(
            MIPS_psf[1].data[centre - radius:centre + radius + 1,
예제 #5
0
파일: clus_get_xid.py 프로젝트: rit-rsz/rsz
def clus_get_xid(maps,
                 cats,
                 savemap=0,
                 simmap=0,
                 verbose=1,
                 confusionerrors=1):
    err = False
    thresh = 3.0
    mf = 1.0

    mJy2Jy = 1000.0 / mf
    catfile = config.CLUSDATA + 'placeholder'  #this doesn't actually seem to do anything in the xid code,
    # but you need something for this for some reason.

    #Old code not used anymore
    # print('Retrieving data from cats')
    # inra = []
    # indec = []
    # for i in range(len(cats)):
    #     for j in range(len(cats[i]['ra'])):
    #         if cats[i]['ra'][j] not in inra and cats[i]['dec'][j] not in indec:
    #             inra.append(cats[i]['ra'][j])
    #             indec.append(cats[i]['dec'][j])
    # print('Done retrieving data from cats')

    inra = np.array(cats['ra'])
    indec = np.array(cats['dec'])

    ra = inra * u.deg
    dec = indec * u.deg
    c = SkyCoord(ra, dec, unit='deg')
    plt.scatter(ra, dec, c=cats['flux'], alpha=0.5)
    plt.show()

    print(inra)
    #initializing data containers.
    pinds = []
    files = []
    primary_hdus = []
    noise_maps = []
    data_maps = []
    headers = []
    pixsizes = []
    prf_sizes = []
    priors = []
    prfs = []
    for i in range(len(maps)):
        bands = [18, 25, 36]  #units of arcseconds
        fwhm = bands[i] / maps[i]['pixsize']  #converts to arcseconds/pixel
        pixs = maps[i]['pixsize']
        size = pixs * 5
        moc = pymoc.util.catalog.catalog_to_moc(c, size, 15)
        #getting data from the fits files
        files.append(maps[i]['file'])
        hdul = fits.open(files[i])
        headers.append(hdul[1].header)
        primary_hdus.append(hdul[0].header)
        img = hdul[1].data
        data_maps.append(img)
        noise_maps.append(hdul[2].data)
        pixsizes.append(maps[i]['pixsize'])
        prf_sizes.append(get_spire_beam_fwhm(maps[i]['band']))
        pinds.append(np.arange(0, 101, 1) * 1.0 / pixsizes[i])
        # print(maps[i]['file'])
        # print(pixsizes[i])
        #setting up priors
        prior = xidplus.prior(data_maps[i],
                              noise_maps[i],
                              primary_hdus[i],
                              headers[i],
                              moc=moc)
        prior.prior_cat(inra, indec, catfile, moc=moc)
        prior.prior_bkg(-5.0, 5)

        #setting up prfs.
        # This prf doesnt quite look correct
        # In previous set up we needed to rebin to accuratly describe our beam sizes
        prf = Gaussian2DKernel(
            bands[i] / 2.355, x_size=101,
            y_size=101)  #maybe x_size and y_size need to change.
        prf.normalize(mode='peak')
        prfs.append(prf.array)
        # print(prfs)
        exit()
        #appending prf to prior and setting point matrix
        prior.set_prf(prfs[i], pinds[i], pinds[i])  #prfs, xpinds, ypinds
        prior.get_pointing_matrix()
        prior.upper_lim_map()

        #appending prior to priors list.
        priors.append(prior)

    print('fitting %s sources' % (priors[0].nsrc))
    print('using %s %s %s pixels' %
          (priors[0].snpix, priors[1].snpix, priors[2].snpix))

    fit = SPIRE.all_bands(
        priors[0], priors[1], priors[2], iter=1000
    )  #number of iterations should be at least 100 just set lower for testing.
    posterior = xidplus.posterior_stan(fit, [priors[0], priors[1], priors[2]])

    # figs, fig = xidplus.plots.plot_Bayes_pval_map(priors, posterior)
    # print(type(figs)) #figs is list.
    # print(figs) #fig is matplotlib.figure.figure object.
    # print(type(fig))
    # cols = ['PSW', 'PMW', 'PLW']
    # counter = 0
    # for figure in figs:
    #     figure.save('xid_%s.png' %(cols[counter]))
    #     counter += 1

    # plt.imshow(figs)

    spire_cat = cat.create_SPIRE_cat(posterior, priors[0], priors[1],
                                     priors[2])

    # spire_cat.writeto('xid_model_2_%s.fits' % (maps[0]['name']))

    xid_data = spire_cat[1].data
    xid = []

    #in units of mJy for fluxes and degrees for RA/DEC
    xid1 = {
        'band': 'PSW',
        'sra': xid_data.field('RA'),
        'sdec': xid_data.field('DEC'),
        'sflux': xid_data.field('F_SPIRE_250'),
        'serr': xid_data.field(
            'FErr_SPIRE_250_u'
        ),  #there was also FErr_SPIRE_250_l don't know which to use.
        'pflux': xid_data.field('F_SPIRE_250'),
        'perr': xid_data.field('FErr_SPIRE_250_u'),
        'model': None,
        'mf': mf
    }  #idk if perr and pflux is right there may be a conversion needed for pflux.
    #in mikes code it has pflux = output from xid / mJy2Jy.
    xid2 = {
        'band': 'PMW',
        'sra': xid_data.field('RA'),
        'sdec': xid_data.field('DEC'),
        'sflux': xid_data.field('F_SPIRE_350'),
        'serr': xid_data.field('FErr_SPIRE_350_u'),
        'pflux': xid_data.field('F_SPIRE_350'),
        'perr': xid_data.field('FErr_SPIRE_350_u'),
        'model': None,
        'mf': mf
    }

    xid3 = {
        'band': 'PLW',
        'sra': xid_data.field('RA'),
        'sdec': xid_data.field('DEC'),
        'sflux': xid_data.field('F_SPIRE_500'),
        'serr': xid_data.field('FErr_SPIRE_500_u'),
        'pflux': xid_data.field('F_SPIRE_500'),
        'perr': xid_data.field('FErr_SPIRE_500_u'),
        'model': None,
        'mf': mf
    }

    #there was another term in the dictionary sflux, pflux and sflux looked like maybe the same thing, but I'm not sure.
    #I left it out so if there are issues with that then it is because that is gone.
    xid.append(xid1)
    xid.append(xid2)
    xid.append(xid3)

    # models = create_model(maps, xid)

    # for i in range(len(xid)):
    #     xid[i]['model'] = models[i]

    # # only look at data with a flux lower than 0.0
    # for i in range(len(xid)):
    #     whpl = []
    #     for j in range(xid[i]['model'].shape[0]):
    #         for k in range(xid[i]['model'].shape[1]):
    #         if xid[i]['pflux'][j] >= 0.0:
    #             whpl.append(j)
    #     whpl = np.array(whpl)
    #
    #     xid[i]['sra'] = xid[i]['sra'][whpl]
    #     xid[i]['sdec'] = xid[i]['sdec'][whpl]
    #     xid[i]['x'] = xid[i]['x'][whpl]
    #     xid[i]['y'] = xid[i]['y'][whpl]
    #     xid[i]['sflux'] = xid[i]['sflux'][whpl]
    #     xid[i]['serr'] = xid[i]['serr'][whpl]

    for i in range(len(xid)):
        ra = xid[i]['sra'] * u.deg
        dec = xid[i]['sdec'] * u.deg
        c = SkyCoord(ra, dec)
        #initializing w class.
        hdul = fits.open(maps[i]['file'])
        w = wcs(hdul[1].header)
        #converting ra/dec to pixel coords.
        px, py = skycoord_to_pixel(c, w)
        xid[i]['x'] = px
        xid[i]['y'] = py
        xid[i]['sra'] = xid[i]['sra'].tolist()
        xid[i]['sdec'] = xid[i]['sdec'].tolist()
        xid[i]['sflux'] = xid[i]['sflux'].tolist()
        xid[i]['serr'] = xid[i]['serr'].tolist()
        xid[i]['pflux'] = xid[i]['pflux'].tolist()
        xid[i]['perr'] = xid[i]['perr'].tolist()
        xid[i]['x'] = xid[i]['x'].tolist()
        xid[i]['y'] = xid[i]['y'].tolist()

        #saving to json file for further analysis.
        with open('xid_a0370_take_9_%s.json' % (xid[i]['band']),
                  'w') as f:  #code for saving output to a file.
            json.dump(xid[i], f)

    #model = image_model(x,y, sflux, maps[i]['astr']['NAXIS'][0], maps[i]['astr']['NAXIS'][1],
    #maps[i]['psf'])
    #need to finish converting model over to python.

    #
    # if savemap:
    #     outfile = config.CLUSSBOX + 'clus_get_xid_model_' + maps[i]['band'] + '.fit'
    #     writefits(outfile, data=model, header_dict=maps[i]['shead'])

    return xid, err
예제 #6
0
    def setUp(self):
        xidplus.__path__[0]
        # Folder containing maps
        imfolder = xidplus.__path__[0] + '/../test_files/'

        pswfits = imfolder + 'cosmos_itermap_lacey_07012015_simulated_observation_w_noise_PSW_hipe.fits.gz'  # SPIRE 250 map
        pmwfits = imfolder + 'cosmos_itermap_lacey_07012015_simulated_observation_w_noise_PMW_hipe.fits.gz'  # SPIRE 350 map
        plwfits = imfolder + 'cosmos_itermap_lacey_07012015_simulated_observation_w_noise_PLW_hipe.fits.gz'  # SPIRE 500 map

        # Folder containing prior input catalogue
        catfolder = xidplus.__path__[0] + '/../test_files/'
        # prior catalogue
        prior_cat = 'lacey_07012015_MillGas.ALLVOLS_cat_PSW_COSMOS_test.fits'

        # output folder
        output_folder = './'

        # -----250-------------
        hdulist = fits.open(pswfits)
        im250phdu = hdulist[0].header
        im250hdu = hdulist[1].header

        im250 = hdulist[1].data * 1.0E3  # convert to mJy
        nim250 = hdulist[2].data * 1.0E3  # convert to mJy
        w_250 = wcs.WCS(hdulist[1].header)
        pixsize250 = 3600.0 * w_250.wcs.cd[1, 1]  # pixel size (in arcseconds)
        hdulist.close()
        # -----350-------------
        hdulist = fits.open(pmwfits)
        im350phdu = hdulist[0].header
        im350hdu = hdulist[1].header

        im350 = hdulist[1].data * 1.0E3  # convert to mJy
        nim350 = hdulist[2].data * 1.0E3  # convert to mJy
        w_350 = wcs.WCS(hdulist[1].header)
        pixsize350 = 3600.0 * w_350.wcs.cd[1, 1]  # pixel size (in arcseconds)
        hdulist.close()
        # -----500-------------
        hdulist = fits.open(plwfits)
        im500phdu = hdulist[0].header
        im500hdu = hdulist[1].header
        im500 = hdulist[1].data * 1.0E3  # convert to mJy
        nim500 = hdulist[2].data * 1.0E3  # convert to mJy
        w_500 = wcs.WCS(hdulist[1].header)
        pixsize500 = 3600.0 * w_500.wcs.cd[1, 1]  # pixel size (in arcseconds)
        hdulist.close()

        hdulist = fits.open(catfolder + prior_cat)
        fcat = hdulist[1].data
        hdulist.close()
        inra = fcat['RA']
        indec = fcat['DEC']
        # select only sources with 100micron flux greater than 50 microJy
        sgood = fcat['S100'] > 0.050
        inra = inra[sgood]
        indec = indec[sgood]

        from astropy.coordinates import SkyCoord
        from astropy import units as u
        c = SkyCoord(ra=[150.74] * u.degree, dec=[2.03] * u.degree)
        import pymoc
        moc = pymoc.util.catalog.catalog_to_moc(c, 100, 15)

        # ---prior250--------
        prior250 = xidplus.prior(
            im250, nim250, im250phdu, im250hdu, moc=moc
        )  # Initialise with map, uncertianty map, wcs info and primary header
        prior250.prior_cat(inra, indec, prior_cat)  # Set input catalogue
        prior250.prior_bkg(
            -5.0, 5
        )  # Set prior on background (assumes Gaussian pdf with mu and sigma)
        # ---prior350--------
        prior350 = xidplus.prior(im350, nim350, im350phdu, im350hdu, moc=moc)
        prior350.prior_cat(inra, indec, prior_cat)
        prior350.prior_bkg(-5.0, 5)

        # ---prior500--------
        prior500 = xidplus.prior(im500, nim500, im500phdu, im500hdu, moc=moc)
        prior500.prior_cat(inra, indec, prior_cat)
        prior500.prior_bkg(-5.0, 5)

        self.priors = [prior250, prior350, prior500]
예제 #7
0
def process_prior(
        c,
        new_Table=None,
        path_to_data=['../../../data/'],
        field=['Lockman-SWIRE'],
        path_to_SPIRE=[
            '/Volumes/pdh_storage/dmu_products/dmu19/dmu19_HELP-SPIRE-maps/data/'
        ],
        redshift_file=[
            "/Volumes/pdh_storage/dmu_products/dmu24/dmu24_Lockman-SWIRE/data/master_catalogue_Lockman-SWIRE_20170710_photoz_20170802_r_and_irac1_optimised_UPDATED_IDs_20180219.fits"
        ],
        redshift_prior=[0.1, 2.0],
        radius=6.0,
        alt_model=False):

    # Import required modules

    # In[3]:

    # In[4]:

    # Set image and catalogue filenames

    # In[5]:

    #Folder containing maps
    pswfits = path_to_SPIRE[0] + '{}_SPIRE250_v1.0.fits'.format(
        field[0])  #SPIRE 250 map
    pmwfits = path_to_SPIRE[0] + '{}_SPIRE350_v1.0.fits'.format(
        field[0])  #SPIRE 350 map
    plwfits = path_to_SPIRE[0] + '{}_SPIRE500_v1.0.fits'.format(
        field[0])  #SPIRE 500 map

    #output folder
    output_folder = './'

    # Load in images, noise maps, header info and WCS information

    # In[6]:

    #-----250-------------
    hdulist = fits.open(pswfits)
    im250phdu = hdulist[0].header
    im250hdu = hdulist[1].header

    im250 = hdulist[1].data * 1.0E3  #convert to mJy
    nim250 = hdulist[3].data * 1.0E3  #convert to mJy
    w_250 = wcs.WCS(hdulist[1].header)
    pixsize250 = np.abs(3600.0 *
                        w_250.wcs.cdelt[0])  #pixel size (in arcseconds)
    hdulist.close()
    #-----350-------------
    hdulist = fits.open(pmwfits)
    im350phdu = hdulist[0].header
    im350hdu = hdulist[1].header

    im350 = hdulist[1].data * 1.0E3  #convert to mJy
    nim350 = hdulist[3].data * 1.0E3  #convert to mJy
    w_350 = wcs.WCS(hdulist[1].header)
    pixsize350 = np.abs(3600.0 *
                        w_350.wcs.cdelt[0])  #pixel size (in arcseconds)
    hdulist.close()
    #-----500-------------
    hdulist = fits.open(plwfits)
    im500phdu = hdulist[0].header
    im500hdu = hdulist[1].header
    im500 = hdulist[1].data * 1.0E3  #convert to mJy
    nim500 = hdulist[3].data * 1.0E3  #convert to mJy
    w_500 = wcs.WCS(hdulist[1].header)
    pixsize500 = np.abs(3600.0 *
                        w_500.wcs.cdelt[0])  #pixel size (in arcseconds)
    hdulist.close()

    # XID+ uses Multi Order Coverage (MOC) maps for cutting down maps and catalogues so they cover the same area. It can also take in MOCs as selection functions to carry out additional cuts. Lets use the python module [pymoc](http://pymoc.readthedocs.io/en/latest/) to create a MOC, centered on a specific position we are interested in. We will use a HEALPix order of 15 (the resolution: higher order means higher resolution)

    moc = pymoc.util.catalog.catalog_to_moc(c, 100, 15)

    # Load in catalogue you want to fit (and make any cuts). Here we use HELP's VO database and directly call it using PyVO

    # In[10]:

    import pyvo as vo
    service = vo.dal.TAPService(
        "https://herschel-vos.phys.sussex.ac.uk/__system__/tap/run/tap")

    # In[11]:

    resultset = service.search(
        "SELECT TOP 10000 * FROM herschelhelp.main WHERE 1=CONTAINS(POINT('ICRS', ra, dec),CIRCLE('ICRS',"
        + str(c.ra.deg[0]) + ", " + str(c.dec.deg[0]) + ", 0.028 ))")

    # In[12]:

    masterlist = resultset.table

    def construct_prior(Table=None):
        from astropy.coordinates import SkyCoord
        #first use standard cut (i.e. not star and is detected in at least 3 opt/nir bands)
        prior_list = masterlist[(masterlist['flag_gaia'] != 3)
                                & (masterlist['flag_optnir_det'] >= 3)]

        #make skycoord from masterlist
        catalog = SkyCoord(ra=masterlist['ra'], dec=masterlist['dec'])
        #make skycoord from input table
        c = SkyCoord(ra=Table['ra'], dec=Table['dec'])
        #search around all of the new sources
        idxc, idxcatalog, d2d, d3d = catalog.search_around_sky(
            c, radius * u.arcsec)

        #for every new sources
        for src in range(0, len(Table)):
            #limit to matches around interested sources
            ind = idxc == src
            #if there are matches
            if ind.sum() > 0:
                #choose the closest and check if its in the prior list all ready
                in_prior = prior_list['help_id'] == masterlist[idxcatalog][
                    ind][np.argmin(d2d[ind])]['help_id']

                #if its not in prior list
                if in_prior.sum() < 1:
                    print(in_prior.sum())
                    #add to appended sources
                    prior_list = vstack([
                        prior_list,
                        masterlist[idxcatalog][ind][np.argmin(d2d[ind])]
                    ])

        return prior_list

    # In[64]:

    import astropy.units as u
    #create table of candidate source
    t = QTable([c.ra, c.dec], names=('ra', 'dec'))
    #add candidate source to new sources table, create prior list
    if new_Table is not None:
        prior_list = construct_prior(vstack([t, new_Table]))
    else:
        prior_list = construct_prior(t)

    if alt_model == True:
        sep = 18
        separation = c.separation(SkyCoord(prior_list['ra'],
                                           prior_list['dec'])).arcsec
        remove_ind = (separation > np.min(separation)) & (separation < sep)
        prior_list.remove_rows(remove_ind)

    # ## Get Redshift and Uncertianty
    #

    # Ken Duncan defines a median and a hierarchical bayes combination redshift. We need uncertianty so lets match via `help_id`

    # In[26]:

    photoz = Table.read(redshift_file[0])

    # In[27]:

    #help_id=np.empty((len(photoz)),dtype=np.dtype('U27'))
    for i in range(0, len(photoz)):
        photoz['help_id'][i] = str(
            photoz['help_id'][i].strip()).encode('utf-8')
    #photoz['help_id']=help_id

    # In[28]:

    from astropy.table import Column, MaskedColumn
    prior_list['redshift'] = MaskedColumn(np.full(
        (len(prior_list)), fill_value=redshift_prior[0]),
                                          mask=[False] * len(prior_list))
    prior_list.add_column(
        MaskedColumn(np.full((len(prior_list)), fill_value=redshift_prior[1]),
                     mask=[False] * len(prior_list),
                     name='redshift_unc'))

    # In[29]:

    photoz

    # In[30]:

    ii = 0
    for i in range(0, len(prior_list)):
        ind = photoz['help_id'] == prior_list['help_id'][i]
        try:
            if photoz['z1_median'][ind] > 0.0:
                prior_list['redshift'][i] = photoz['z1_median'][ind]
                prior_list['redshift_unc'][i] = np.max(
                    np.array([
                        np.abs(photoz['z1_median'][ind] -
                               photoz['z1_min'][ind]),
                        np.abs(photoz['z1_max'][ind] -
                               photoz['z1_median'][ind])
                    ]))

            #prior_list['redshift_unc'].mask[i]=False
            #prior_list['redshift'].mask[i]=False

        except ValueError:
            None

    # In[33]:

    dist_matrix = np.zeros((len(prior_list), len(prior_list)))
    from astropy.coordinates import SkyCoord
    from astropy import units as u
    for i in range(0, len(prior_list)):
        for j in range(0, len(prior_list)):
            if i > j:
                coord1 = SkyCoord(ra=prior_list['ra'][i] * u.deg,
                                  dec=prior_list['dec'][i] * u.deg,
                                  frame='icrs')

                coord2 = SkyCoord(ra=prior_list['ra'][j] * u.deg,
                                  dec=prior_list['dec'][j] * u.deg)
                dist_matrix[i, j] = coord1.separation(coord2).value

    # In[35]:

    ind = (np.tril(dist_matrix) < 1.0 / 3600.0) & (np.tril(dist_matrix) > 0)
    xx, yy = np.meshgrid(np.arange(0, len(prior_list)),
                         np.arange(0, len(prior_list)))
    yy[ind]

    # In[36]:

    prior_list[yy[ind]]

    # In[37]:

    prior_list['redshift'].mask[yy[ind]] = True

    # In[38]:

    prior_list = prior_list[prior_list['redshift'].mask == False]

    # In[39]:

    prior_list

    # XID+ is built around two python classes. A prior and posterior class. There should be a prior class for each map being fitted. It is initiated with a map, noise map, primary header and map header and can be set with a MOC. It also requires an input prior catalogue and point spread function.
    #

    # In[40]:

    #---prior250--------
    prior250 = xidplus.prior(
        im250, nim250, im250phdu, im250hdu, moc=moc
    )  #Initialise with map, uncertianty map, wcs info and primary header
    prior250.prior_cat(prior_list['ra'],
                       prior_list['dec'],
                       'photoz',
                       ID=prior_list['help_id'])
    prior250.prior_bkg(
        -5.0,
        5)  #Set prior on background (assumes Gaussian pdf with mu and sigma)
    #---prior350--------
    prior350 = xidplus.prior(im350, nim350, im350phdu, im350hdu, moc=moc)
    prior350.prior_cat(prior_list['ra'],
                       prior_list['dec'],
                       'photoz',
                       ID=prior_list['help_id'])
    prior350.prior_bkg(-5.0, 5)
    #---prior500--------
    prior500 = xidplus.prior(im500, nim500, im500phdu, im500hdu, moc=moc)
    prior500.prior_cat(prior_list['ra'],
                       prior_list['dec'],
                       'photoz',
                       ID=prior_list['help_id'])
    prior500.prior_bkg(-5.0, 5)

    # Set PSF. For SPIRE, the PSF can be assumed to be Gaussian with a FWHM of 18.15, 25.15, 36.3 '' for 250, 350 and 500 $\mathrm{\mu m}$ respectively. Lets use the astropy module to construct a Gaussian PSF and assign it to the three XID+ prior classes.

    # In[41]:

    #pixsize array (size of pixels in arcseconds)
    pixsize = np.array([pixsize250, pixsize350, pixsize500])
    #point response function for the three bands
    prfsize = np.array([18.15, 25.15, 36.3])
    #use Gaussian2DKernel to create prf (requires stddev rather than fwhm hence pfwhm/2.355)
    from astropy.convolution import Gaussian2DKernel

    ##---------fit using Gaussian beam-----------------------
    prf250 = Gaussian2DKernel(prfsize[0] / 2.355, x_size=101, y_size=101)
    prf250.normalize(mode='peak')
    prf350 = Gaussian2DKernel(prfsize[1] / 2.355, x_size=101, y_size=101)
    prf350.normalize(mode='peak')
    prf500 = Gaussian2DKernel(prfsize[2] / 2.355, x_size=101, y_size=101)
    prf500.normalize(mode='peak')

    pind250 = np.arange(
        0, 101,
        1) * 1.0 / pixsize[0]  #get 250 scale in terms of pixel scale of map
    pind350 = np.arange(
        0, 101,
        1) * 1.0 / pixsize[1]  #get 350 scale in terms of pixel scale of map
    pind500 = np.arange(
        0, 101,
        1) * 1.0 / pixsize[2]  #get 500 scale in terms of pixel scale of map

    prior250.set_prf(
        prf250.array, pind250, pind250
    )  #requires psf as 2d grid, and x and y bins for grid (in pixel scale)
    prior350.set_prf(prf350.array, pind350, pind350)
    prior500.set_prf(prf500.array, pind500, pind500)

    print('fitting ' + str(prior250.nsrc) + ' sources \n')
    print('using ' + str(prior250.snpix) + ', ' + str(prior350.snpix) +
          ' and ' + str(prior500.snpix) + ' pixels')
    print('source density = {}'.format(prior250.nsrc / moc.area_sq_deg))

    # Before fitting, the prior classes need to take the PSF and calculate how muich each source contributes to each pixel. This process provides what we call a pointing matrix. Lets calculate the pointing matrix for each prior class

    # In[43]:

    prior250.get_pointing_matrix()
    prior350.get_pointing_matrix()
    prior500.get_pointing_matrix()

    # In[44]:

    return [prior250, prior350, prior500], prior_list