def find_pointings_to_mosaic(pointingdict,mospointingname):
	seps = np.array([])
	tomospointings = np.array([])
	ra1,dec1 = pointingdict[mospointingname][1],pointingdict[mospointingname][2]
	for j in pointingdict:
		ra2,dec2 = pointingdict[j][1],pointingdict[j][2]
		seps = np.append(seps,(sepn(ra1*deg2rad,dec1*deg2rad,ra2*deg2rad,dec2*deg2rad)*rad2deg))
		tomospointings = np.append(tomospointings,j)
	sortedseps = np.sort(seps)
	# For now include the 6 closest pointings plus keep including others until we have all that are within the distance of 1.1 times the 6th closest pointing. At later stage try to take into account e.g. elongation of beam for low declination observations.
	endmosindex = 7
	for i in range(7,20):
		if (sortedseps[i])/(sortedseps[6]) < 1.1:
			endmosindex = i
	mosaicpointings = tomospointings[np.where(seps < sortedseps[endmosindex])]
	mosseps = seps[np.where(seps < sortedseps[endmosindex])]
	return mosaicpointings,mosseps
Esempio n. 2
0
def find_median_astrometry(astromaps,pointingra,pointingdec):

    foundpointing = False
    for astromap in astromaps:
        ra,dec=getposim('%s/astromap.fits'%astromap)
        if sepn(ra*deg2rad,dec*deg2rad,pointingra,pointingdec)*rad2deg < 0.6:        
            foundpointing = True
            f = fits.open('%s/astromap.fits'%astromap)
            _,_,ys,xs=f[0].data.shape
            # Use central 20% of the image
            subim=f[0].data[0][0][ys/2-ys/5:ys/2+ys/5,xs/2-xs/5:xs/2+xs/5].flatten()
    if foundpointing:
        subim = np.nan_to_num(subim)
        return np.median(subim)
    else:
        print 'Cant find astrometry near %s, %s'%(pointingra*rad2deg,pointingdec*rad2deg)
        sys.exit(0)
def find_pointings_to_mosaic(pointingdict, mospointingname):
    seps = np.array([])
    tomospointings = np.array([])
    ra1, dec1 = pointingdict[mospointingname][1], pointingdict[
        mospointingname][2]
    for j in pointingdict:
        ra2, dec2 = pointingdict[j][1], pointingdict[j][2]
        seps = np.append(seps, (sepn(ra1 * deg2rad, dec1 * deg2rad,
                                     ra2 * deg2rad, dec2 * deg2rad) * rad2deg))
        tomospointings = np.append(tomospointings, j)
    sortedseps = np.sort(seps)
    # For now include the 6 closest pointings plus keep including others until we have all that are within the distance of 1.1 times the 6th closest pointing. At later stage try to take into account e.g. elongation of beam for low declination observations.
    endmosindex = 7
    for i in range(7, 20):
        if (sortedseps[i]) / (sortedseps[6]) < 1.1:
            endmosindex = i
    mosaicpointings = tomospointings[np.where(seps < sortedseps[endmosindex])]
    mosseps = seps[np.where(seps < sortedseps[endmosindex])]
    return mosaicpointings, mosseps
def find_median_astrometry(astromaps,pointingra,pointingdec):

    foundpointing = False
    for astromap in astromaps:
        amname='%s/astromap.fits'%astromap
        if not os.path.isfile(amname):
            continue
        ra,dec=getposim(amname)
        if sepn(ra*deg2rad,dec*deg2rad,pointingra,pointingdec)*rad2deg < 0.6:        
            foundpointing = True
            f = fits.open('%s/astromap.fits'%astromap)
            _,_,ys,xs=f[0].data.shape
            # Use central 20% of the image
            subim=f[0].data[0][0][old_div(ys,2)-old_div(ys,5):old_div(ys,2)+old_div(ys,5),old_div(xs,2)-old_div(xs,5):old_div(xs,2)+old_div(xs,5)].flatten()
    if foundpointing:
        subim = np.nan_to_num(subim)
        return np.median(subim)
    else:
        print('Cant find astrometry near %s, %s'%(pointingra*rad2deg,pointingdec*rad2deg))
        return None
Esempio n. 5
0
def filter_catalogs(args, pointingras, pointingdecs, mosaiccat, outname,
                    dessourcenums, cattype):

    pointdirectories = args.pointdirectories

    sourceids = np.array([])
    sourceresolved = np.array([])
    sourcera = np.array([])
    e_sourcera = np.array([])
    e_sourcera_tot = np.array([])
    sourcedec = np.array([])
    e_sourcedec = np.array([])
    e_sourcedec_tot = np.array([])
    sint = np.array([])
    e_sint = np.array([])
    e_sint_tot = np.array([])
    speak = np.array([])
    e_speak = np.array([])
    e_speak_tot = np.array([])
    maj = np.array([])
    e_maj = np.array([])
    smin = np.array([])
    e_smin = np.array([])
    dcmaj = np.array([])
    e_dcmaj = np.array([])
    dcsmin = np.array([])
    e_dcsmin = np.array([])
    pa = np.array([])
    e_pa = np.array([])
    dcpa = np.array([])
    e_dcpa = np.array([])
    rms_noise = np.array([])
    stype = np.array([])
    mosaic_identifier = np.array([])
    gausid = np.array([])
    islid = np.array([])
    sourcenum = np.array([])

    pointing = mosaiccat.replace('.cat.fits', '-blanked.fits')
    if cattype == 'gaus':
        sourcecat = fits.open(mosaiccat)
        mosaiccat = glob.glob(
            mosaiccat.replace(
                'mosaic.cat.fits',
                'mosaic-blanked_pybdsm/*/catalogues/mosaic-blanked.pybdsm.gaul.FITS'
            ))[0]

    cat = fits.open(mosaiccat)

    f = fits.open(pointing)
    rapointing = f[0].header['CRVAL1'] * deg2rad
    decpointing = f[0].header['CRVAL2'] * deg2rad
    f.close()

    numsources = len(cat[1].data['RA'])

    closepointingindex = np.where(
        sepn(pointingras, pointingdecs, rapointing, decpointing) *
        rad2deg < 5.0)

    astromed = find_median_astrometry(pointdirectories, rapointing,
                                      decpointing)
    if astromed is None:
        astromed = 5.0  # missing data, assume bad e.g. hole
    keepindices = []
    time1 = time.time()
    for i in range(0, numsources):

        if dessourcenums == None:
            allsep = sepn(pointingras[closepointingindex],
                          pointingdecs[closepointingindex],
                          cat[1].data['RA'][i] * deg2rad,
                          cat[1].data['DEC'][i] * deg2rad)
            centsep = sepn(rapointing, decpointing,
                           cat[1].data['RA'][i] * deg2rad,
                           cat[1].data['DEC'][i] * deg2rad)
            if min(allsep) != centsep:
                continue
            else:
                keepindices.append(i)
        else:
            if cat[1].data['Source_id'][i] in dessourcenums:
                keepindices.append(i)
            else:
                continue

        if cattype == 'srl':
            sc = SkyCoord(cat[1].data['RA'][i] * deg2rad * u.rad,
                          cat[1].data['DEC'][i] * deg2rad * u.rad,
                          frame='icrs')
        if cattype == 'gaus':
            sourceindex = cat[1].data['Source_id'][i]
            sc = SkyCoord(
                sourcecat[1].data['RA'][sourceindex] * deg2rad * u.rad,
                sourcecat[1].data['DEC'][sourceindex] * deg2rad * u.rad,
                frame='icrs')
        s = sc.to_string(style='hmsdms', sep='', precision=3)
        s = sc.to_string(style='hmsdms', sep='', precision=2)
        identity = str('ILTJ' + s).replace(' ', '')[:-1]

        sourceids = np.append(sourceids, identity)
        if cattype == 'srl':
            mosaic_identifier = np.append(mosaic_identifier,
                                          mosaiccat.split('/')[-2])
        if cattype == 'gaus':
            mosaic_identifier = np.append(mosaic_identifier,
                                          mosaiccat.split('/')[-5])
        fluxratio = cat[1].data['Total_flux'][i] / cat[1].data['Peak_flux'][i]
        snr = cat[1].data['Peak_flux'][i] / cat[1].data['Isl_rms'][i]

        # Some equation to figure out if the source is resolved -- leave these dummy values for now.
        if fluxratio > (1.483 + 1000.4 / (snr**3.94)):
            #if fluxratio > (1.50341355 + 1.78467767/(snr**0.78385826)):
            sourceresolved = np.append(sourceresolved, 'R')
        else:
            sourceresolved = np.append(sourceresolved, 'U')

    print 'Keeping %s sources for %s -- took %s' % (len(keepindices), pointing,
                                                    time.time() - time1)

    sourcera = np.append(sourcera, cat[1].data[keepindices]['RA'])
    e_sourcera = np.append(e_sourcera, cat[1].data[keepindices]['E_RA'])
    e_sourcera_tot = np.append(
        e_sourcera_tot,
        (cat[1].data[keepindices]['E_RA']**2.0 + (astromed * arcsec2deg)**
         2.0)**0.5)  #$ ADD SOME ERROR TO THE SOURCE POSITIONS

    sourcedec = np.append(sourcedec, cat[1].data[keepindices]['DEC'])
    e_sourcedec = np.append(e_sourcedec, cat[1].data[keepindices]['E_DEC'])
    e_sourcedec_tot = np.append(
        e_sourcedec_tot,
        (cat[1].data[keepindices]['E_DEC']**2.0 + (astromed * arcsec2deg)**
         2.0)**0.5)  # ADD SOME ERROR TO THE SOURCE POSITIONS

    sint = np.append(sint, cat[1].data[keepindices]['Total_flux'])
    e_sint = np.append(e_sint, cat[1].data[keepindices]['E_Total_flux'])
    e_sint_tot = np.append(
        e_sint_tot, (cat[1].data[keepindices]['E_Total_flux']**2.0 +
                     (cat[1].data[keepindices]['Total_flux'] * 0.2)**2.0)**0.5)

    speak = np.append(speak, cat[1].data[keepindices]['Peak_flux'])
    e_speak = np.append(e_speak, cat[1].data[keepindices]['E_Peak_flux'])
    e_speak_tot = np.append(
        e_speak_tot, (cat[1].data[keepindices]['E_Peak_flux']**2.0 +
                      (cat[1].data[keepindices]['Peak_flux'] * 0.2)**2.0)**0.5)

    maj = np.append(maj, cat[1].data[keepindices]['Maj'])
    e_maj = np.append(e_maj, cat[1].data[keepindices]['E_Maj'])
    smin = np.append(smin, cat[1].data[keepindices]['Min'])
    e_smin = np.append(e_smin, cat[1].data[keepindices]['E_Min'])
    dcmaj = np.append(dcmaj, cat[1].data[keepindices]['DC_Maj'])
    e_dcmaj = np.append(e_dcmaj, cat[1].data[keepindices]['E_DC_Maj'])
    dcsmin = np.append(dcsmin, cat[1].data[keepindices]['DC_Min'])
    e_dcsmin = np.append(e_dcsmin, cat[1].data[keepindices]['E_DC_Min'])
    pa = np.append(pa, cat[1].data[keepindices]['PA'])
    e_pa = np.append(e_pa, cat[1].data[keepindices]['E_PA'])
    dcpa = np.append(dcpa, cat[1].data[keepindices]['DC_PA'])
    e_dcpa = np.append(e_dcpa, cat[1].data[keepindices]['E_DC_PA'])

    rms_noise = np.append(rms_noise, cat[1].data[keepindices]['Isl_rms'])
    stype = np.append(stype, cat[1].data[keepindices]['S_Code'])
    islid = np.append(islid, cat[1].data[keepindices]['Isl_id'])
    sourcenum = np.append(sourcenum, cat[1].data[keepindices]['Source_id'])

    col1 = fits.Column(name='Source_Name',
                       format='24A',
                       unit='',
                       array=sourceids)
    col2 = fits.Column(name='RA', format='f8', unit='deg', array=sourcera)
    col3 = fits.Column(name='E_RA',
                       format='f8',
                       unit='arcsec',
                       array=e_sourcera * deg2arcsec)
    col4 = fits.Column(name='E_RA_tot',
                       format='f8',
                       unit='arcsec',
                       array=e_sourcera_tot * deg2arcsec)

    col5 = fits.Column(name='DEC', format='f8', unit='deg', array=sourcedec)
    col6 = fits.Column(name='E_DEC',
                       format='f8',
                       unit='arcsec',
                       array=e_sourcedec * deg2arcsec)
    col7 = fits.Column(name='E_DEC_tot',
                       format='f8',
                       unit='arcsec',
                       array=e_sourcedec_tot * deg2arcsec)

    col8 = fits.Column(name='Peak_flux',
                       format='f8',
                       unit='beam-1 mJy',
                       array=speak * 1000.0)
    col9 = fits.Column(name='E_Peak_flux',
                       format='f8',
                       unit='beam-1 mJy',
                       array=e_speak * 1000.0)
    col10 = fits.Column(name='E_Peak_flux_tot',
                        format='f8',
                        unit='beam-1 mJy',
                        array=e_speak_tot * 1000.0)

    col11 = fits.Column(name='Total_flux',
                        format='f8',
                        unit='mJy',
                        array=sint * 1000.0)
    col12 = fits.Column(name='E_Total_flux',
                        format='f8',
                        unit='mJy',
                        array=e_sint * 1000.0)
    col13 = fits.Column(name='E_Total_flux_tot',
                        format='f8',
                        unit='mJy',
                        array=e_sint_tot * 1000.0)

    #maj[np.where(sourceresolved=='U')] = np.nan
    #e_maj[np.where(sourceresolved=='U')] = np.nan
    #smin[np.where(sourceresolved=='U')] = np.nan
    #e_smin[np.where(sourceresolved=='U')] = np.nan
    #pa[np.where(sourceresolved=='U')] = np.nan
    #e_pa[np.where(sourceresolved=='U')] = np.nan

    col14 = fits.Column(name='Maj',
                        format='f8',
                        unit='arcsec',
                        array=maj * deg2arcsec)
    col15 = fits.Column(name='E_Maj',
                        format='f8',
                        unit='arcsec',
                        array=e_maj * deg2arcsec)

    col16 = fits.Column(name='Min',
                        format='f8',
                        unit='arcsec',
                        array=smin * deg2arcsec)
    col17 = fits.Column(name='E_Min',
                        format='f8',
                        unit='arcsec',
                        array=e_smin * deg2arcsec)

    col18 = fits.Column(name='DC_Maj',
                        format='f8',
                        unit='arcsec',
                        array=dcmaj * deg2arcsec)
    col19 = fits.Column(name='E_DC_Maj',
                        format='f8',
                        unit='arcsec',
                        array=e_dcmaj * deg2arcsec)

    col20 = fits.Column(name='DC_Min',
                        format='f8',
                        unit='arcsec',
                        array=dcsmin * deg2arcsec)
    col21 = fits.Column(name='E_DC_Min',
                        format='f8',
                        unit='arcsec',
                        array=e_dcsmin * deg2arcsec)

    col22 = fits.Column(name='PA', format='f8', unit='deg', array=pa)
    col23 = fits.Column(name='E_PA', format='f8', unit='deg', array=e_pa)

    col24 = fits.Column(name='DC_PA', format='f8', unit='deg', array=dcpa)
    col25 = fits.Column(name='E_DC_PA', format='f8', unit='deg', array=e_dcpa)

    #col20 = fits.Column(name='Resolved',format='1A',unit='',array=sourceresolved)

    col26 = fits.Column(name='Isl_rms',
                        format='f8',
                        unit='beam-1 mJy',
                        array=rms_noise * 1000.0)
    col27 = fits.Column(name='S_Code', format='1A', unit='', array=stype)

    col28 = fits.Column(name='Mosaic_ID',
                        format='9A',
                        unit='',
                        array=mosaic_identifier)

    col29 = fits.Column(name='Isl_id', format='I8', unit='', array=islid)

    # With unique source names that are matched with source and gaussian catalogs the source_id is not needed.
    #col24 = fits.Column(name='Source_id',format='I8',unit='',array=sourcenum)

    if cattype == 'gaus':
        gausid = np.append(gausid, cat[1].data[keepindices]['Gaus_id'])
        col30 = fits.Column(name='Gaus_id', format='I8', unit='', array=gausid)

    if cattype == 'srl':
        cols = fits.ColDefs([
            col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11,
            col12, col13, col14, col15, col16, col17, col18, col19, col20,
            col21, col22, col23, col24, col25, col26, col27, col28, col29
        ])
    if cattype == 'gaus':
        cols = fits.ColDefs([
            col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11,
            col12, col13, col14, col15, col16, col17, col18, col19, col20,
            col21, col22, col23, col24, col25, col26, col27, col28, col29,
            col30
        ])

    tbhdu = fits.BinTableHDU.from_columns(cols)

    if cattype == 'gaus':
        regionfile = open('%s.gaus.reg' % outname, 'w')
    if cattype == 'srl':
        regionfile = open('%s.srl.reg' % outname, 'w')
    regionfile.write('# Region file format: DS9 version 4.0\n')
    regionfile.write(
        'global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source\n'
    )
    regionfile.write('fk5\n')
    for i in range(0, len(sourceids)):
        if not np.isnan(maj[i]):
            regionfile.write(
                'ellipse(%s,%s,%s,%s,%s)\n' %
                (sourcera[i], sourcedec[i], maj[i], smin[i], pa[i] + 90))
        else:
            regionfile.write('box(%s,%s,5.0",5.0",0.0)\n' %
                             (sourcera[i], sourcedec[i]))
    regionfile.close()

    prihdr = fits.Header()
    prihdr['NAME'] = outname
    prihdu = fits.PrimaryHDU(header=prihdr)
    tbhdulist = fits.HDUList([prihdu, tbhdu])
    if cattype == 'srl':
        outcat = outname + '.srl.fits'
    if cattype == 'gaus':
        outcat = outname + '.gaus.fits'
    tbhdulist.writeto(outcat)

    return sourcenum, outcat
Esempio n. 6
0
def separation(ra1, dec1, ra2, dec2):
    return np.degrees(
        sepn(np.radians(ra1), np.radians(dec1), np.radians(ra2),
             np.radians(dec2)))
Esempio n. 7
0
def plot_flux_errors(catalog,fitsimage,outname,auxcatname,options=None):
    if options is None:
        options = o
    scat = Table.read(catalog)

    fitsimage = fits.open(fitsimage)
    fieldra = fitsimage[0].header['CRVAL1']
    fielddec = fitsimage[0].header['CRVAL2']
    fitsimage.close()
    radialseps = sepn(scat['RA']*deg2rad,scat['DEC']*deg2rad,fieldra*deg2rad,fielddec*deg2rad)*rad2deg

    pylab.plot(np.sort(scat['Total_flux']),np.sort(scat['Total_flux'])*np.median(np.array(scat[auxcatname+'_Total_flux']/options[auxcatname+'_fluxfactor'])/np.array(scat['Total_flux'])),'r--')
    pylab.plot(scat['Total_flux'],scat[auxcatname+'_Total_flux']/options[auxcatname+'_fluxfactor'],'ko')
    pylab.xlabel('Integrated LOFAR flux (Jy)')
    pylab.ylabel('Integrated '+auxcatname+' flux (Jy)')
    pylab.xlim(xmin=0.01,xmax=0.5)
    pylab.ylim(ymin=0.01,ymax=0.5)
    pylab.semilogx()
    pylab.semilogy()
    equality = np.arange(0,10,0.01)
    pylab.plot(equality,equality,'k-')
    pylab.savefig(outname.replace('.png','_integrated.png'))
    pylab.close('all')
    pylab.cla()
    plt.clf()
    
    pylab.plot(np.sort(scat['Peak_flux']),np.sort(scat['Peak_flux'])*np.median(np.array(scat[auxcatname+'_Peak_flux']/options['%s_fluxfactor'%auxcatname])/np.array(scat['Peak_flux'])),'r--')
    pylab.plot(scat['Peak_flux'],scat[auxcatname+'_Peak_flux']/options[auxcatname+'_fluxfactor'],'ko')
    pylab.xlabel('Peak LOFAR flux (Jy)')
    pylab.ylabel('Peak '+auxcatname+' flux (Jy)')
    pylab.xlim(xmin=0.01,xmax=0.5)
    pylab.ylim(ymin=0.01,ymax=0.5)
    pylab.semilogx()
    pylab.semilogy()
    equality = np.arange(0,10,0.01)
    pylab.plot(equality,equality,'k-')
    pylab.savefig(outname.replace('.png','_peak.png'))
    pylab.close('all')
    pylab.cla()
    plt.clf()
    
    pylab.plot(radialseps,scat['Total_flux']/(scat[auxcatname+'_Total_flux']/options[auxcatname+'_fluxfactor']),'bo',alpha=0.4,markersize=3)
    equality = np.arange(-0.01,10,0.01)
    fractionrange = np.arange(0.99,1.01,0.002)
    for i in fractionrange:
        pylab.plot(equality,1.0*i+0*equality,'k-')
    pylab.plot(equality,1.0+0*equality,'k-')
    pylab.xlabel('Distance from pointing centre (deg)')
    pylab.ylabel('Integrated LOFAR flux / Integrated '+auxcatname+' flux')
    
    pylab.xlim(xmin=0.0,xmax=2)
    pylab.ylim(ymin=0.5,ymax=2.0)    

    distancerange = np.arange(0,np.max(radialseps)+0.15,0.15)

    for i in range(0,len(distancerange)-1):
        distancemin = distancerange[i]
        distancemax = distancerange[i+1]
        binvals = np.array([])
        for j in range(0,len(radialseps)):
            if distancemin < radialseps[j] < distancemax:
                binvals = np.append(binvals,scat['Total_flux'][j]/(scat[auxcatname+'_Total_flux'][j]/options[auxcatname+'_fluxfactor']))
        midpoint = (distancemin+distancemax)/2.0
        if len(binvals) > 0.0:
            booterrl,booterrh = bootstrap(binvals, 100000, np.mean, 0.05)
            booterrl,booterrh = bootstrap(binvals, 100000, np.median, 0.05)
#            print booterrl,booterrh, binvals
            pylab.errorbar(midpoint,np.median(binvals),xerr=(distancemin-distancemax)/2.0,yerr=[[np.median(binvals)-booterrl],[booterrh-np.median(binvals)]],fmt='--o',ecolor='b',color='b',zorder=999999)
    pylab.savefig(outname.replace('.png','_total_radial.png'))
    pylab.close('all')
    pylab.cla()
    plt.clf()
Esempio n. 8
0
def plot_flux_ratios(catalog,fitsimage,outname,options=None):
    if options is None:
        options = o
    scat = Table.read(catalog)
    fluxratios = scat['Total_flux']/scat['Peak_flux']

    fitsimage = fits.open(fitsimage)
    fieldra = fitsimage[0].header['CRVAL1']
    fielddec = fitsimage[0].header['CRVAL2']
    fitsimage.close()
    radialseps = sepn(scat['RA']*deg2rad,scat['DEC']*deg2rad,fieldra*deg2rad,fielddec*deg2rad)*rad2deg

    nullfmt = NullFormatter()         # no labels

    # definitions for the axes
    left, width = 0.1, 0.65
    bottom, height = 0.1, 0.8
    bottom_h = left_h = left + width + 0.02

    rect_scatter = [left, bottom, width, height]
    rect_histx = [left, bottom_h, width, 0.2]
    rect_histy = [left_h, bottom, 0.2, height]

    # start with a rectangular Figure
    plt.figure(1, figsize=(8, 8))
    axScatter = plt.axes(rect_scatter)
    plt.xlabel('Distance from pointing centre (deg)')
    plt.ylabel('Integrated flux / Peak flux')
    plt.xticks(rotation=270)
    axScatter.plot([0,3.0],[1.0,1.0],'k-')

    smids = []
    svals = []
    distancerange = np.arange(0,max(radialseps),0.3)
    for i in range(0,len(distancerange)-1):
        distancemin = distancerange[i]
        distancemax = distancerange[i+1]
        binvals = np.array([])
        for j in range(0,len(radialseps)):
            if distancemin < radialseps[j] < distancemax:
                binvals = np.append(binvals,fluxratios[j])
        midpoint = (distancemin+distancemax)/2.0
        #bsmear = bandwidth_smearing2(6*arcsec2deg,150E6,midpoint,4*48.8E3)
        #tsmear = time_smearing2(16.0,midpoint,6*arcsec2deg)
        #smids.append(midpoint)
        #svals.append(1.0/(bsmear*tsmear))
        booterrl,booterrh = bootstrap(binvals, 100000, np.mean, 0.05)
        booterrl,booterrh = bootstrap(binvals, 100000, np.median, 0.05)
        axScatter.errorbar(midpoint,np.median(binvals),xerr=(distancemin-distancemax)/2.0,yerr=[[np.median(binvals)-booterrl],[booterrh-np.median(binvals)]],fmt='--o',ecolor='b',color='b',zorder=999999)

    #axScatter.plot(smids,svals,'k--')
    
    axHisty = plt.axes(rect_histy)
    plt.xticks(rotation=270)

    # no labels
    axHisty.yaxis.set_major_formatter(nullfmt)

    # the scatter plot:
    
    axScatter.scatter(radialseps,fluxratios,color='blue',marker='+',s=10,alpha=0.5)

    binwidth = 0.05

    axScatter.set_xlim((0, 3.0))
    axScatter.set_ylim((0.8, 2.5))

    bins = np.arange(0.8, 3, binwidth)
    axHisty.hist(fluxratios, bins=bins, orientation='horizontal',color='blue',alpha=0.5)
    axHisty.set_ylim(axScatter.get_ylim())
    plt.savefig(outname)
    plt.close('all')
    plt.cla()
    plt.clf()
Esempio n. 9
0
def separation(ra1, dec1, ra2, dec2):
    # same as sepn but in degrees
    return factor * sepn(ra1 / factor, dec1 / factor, ra2 / factor,
                         dec2 / factor)
def plot_flux_errors(catalog,fitsimage,outname,auxcatname,options=None):
    if options is None:
        options = o
    if os.path.isfile(outname.replace('.png','_integrated.png')):
        warn('Plot file %s exists, not making it' % outname)
    else:

        scat = Table.read(catalog)

        fitsimage = fits.open(fitsimage)
        fieldra = fitsimage[0].header['CRVAL1']
        fielddec = fitsimage[0].header['CRVAL2']
        fitsimage.close()
        radialseps = sepn(scat['RA']*deg2rad,scat['DEC']*deg2rad,fieldra*deg2rad,fielddec*deg2rad)*rad2deg

        plt.plot(np.sort(scat['Total_flux']),np.sort(scat['Total_flux'])*np.median(np.array(scat[auxcatname+'_Total_flux']/options[auxcatname+'_fluxfactor'])/np.array(scat['Total_flux'])),'r--')
        plt.plot(scat['Total_flux'],scat[auxcatname+'_Total_flux']/options[auxcatname+'_fluxfactor'],'ko')
        plt.xlabel('Integrated LOFAR flux (Jy)')
        plt.ylabel('Integrated '+auxcatname+' flux (Jy)')
        plt.xlim(xmin=0.01,xmax=0.5)
        plt.ylim(ymin=0.01,ymax=0.5)
        plt.semilogx()
        plt.semilogy()
        equality = np.arange(0,10,0.01)
        plt.plot(equality,equality,'k-')
        plt.savefig(outname.replace('.png','_integrated.png'))
        plt.close('all')
        plt.cla()
        plt.clf()

        plt.plot(np.sort(scat['Peak_flux']),np.sort(scat['Peak_flux'])*np.median(np.array(scat[auxcatname+'_Peak_flux']/options['%s_fluxfactor'%auxcatname])/np.array(scat['Peak_flux'])),'r--')
        plt.plot(scat['Peak_flux'],scat[auxcatname+'_Peak_flux']/options[auxcatname+'_fluxfactor'],'ko')
        plt.xlabel('Peak LOFAR flux (Jy)')
        plt.ylabel('Peak '+auxcatname+' flux (Jy)')
        plt.xlim(xmin=0.01,xmax=0.5)
        plt.ylim(ymin=0.01,ymax=0.5)
        plt.semilogx()
        plt.semilogy()
        equality = np.arange(0,10,0.01)
        plt.plot(equality,equality,'k-')
        plt.savefig(outname.replace('.png','_peak.png'))
        plt.close('all')
        plt.cla()
        plt.clf()

        plt.plot(radialseps,scat['Total_flux']/(scat[auxcatname+'_Total_flux']/options[auxcatname+'_fluxfactor']),'bo',alpha=0.4,markersize=3)
        equality = np.arange(-0.01,10,0.01)
        fractionrange = np.arange(0.99,1.01,0.002)
        for i in fractionrange:
            plt.plot(equality,1.0*i+0*equality,'k-')
        plt.plot(equality,1.0+0*equality,'k-')
        plt.xlabel('Distance from pointing centre (deg)')
        plt.ylabel('Integrated LOFAR flux / Integrated '+auxcatname+' flux')

        plt.xlim(xmin=0.0,xmax=2)
        plt.ylim(ymin=0.5,ymax=2.0)    

        distancerange = np.arange(0,np.max(radialseps)+0.15,0.15)

        for i in range(0,len(distancerange)-1):
            distancemin = distancerange[i]
            distancemax = distancerange[i+1]
            binvals = np.array([])
            for j in range(0,len(radialseps)):
                if distancemin < radialseps[j] < distancemax:
                    binvals = np.append(binvals,scat['Total_flux'][j]/(scat[auxcatname+'_Total_flux'][j]/options[auxcatname+'_fluxfactor']))
            midpoint = (distancemin+distancemax)/2.0
            if len(binvals) > 0:
                booterrl,booterrh = bootstrap(binvals, 100000, np.mean, 0.05)
                booterrl,booterrh = bootstrap(binvals, 100000, np.median, 0.05)
    #            print booterrl,booterrh, binvals
                plt.errorbar(midpoint,np.median(binvals),xerr=(distancemin-distancemax)/2.0,yerr=[[np.median(binvals)-booterrl],[booterrh-np.median(binvals)]],fmt='--o',ecolor='b',color='b',zorder=999999)
        plt.savefig(outname.replace('.png','_total_radial.png'))
        plt.close('all')
        plt.cla()
        plt.clf()
def plot_flux_ratios(catalog,fitsimage,outname,options=None):
    if options is None:
        options = o

    if os.path.isfile(outname):
        warn('Plot file %s exists, not making it' % outname)
    else:
        scat = Table.read(catalog)
        fluxratios = scat['Total_flux']/scat['Peak_flux']

        fitsimage = fits.open(fitsimage)
        fieldra = fitsimage[0].header['CRVAL1']
        fielddec = fitsimage[0].header['CRVAL2']
        fitsimage.close()
        radialseps = sepn(scat['RA']*deg2rad,scat['DEC']*deg2rad,fieldra*deg2rad,fielddec*deg2rad)*rad2deg

        nullfmt = NullFormatter()         # no labels

        # definitions for the axes
        left, width = 0.1, 0.65
        bottom, height = 0.1, 0.8
        bottom_h = left_h = left + width + 0.02

        rect_scatter = [left, bottom, width, height]
        rect_histx = [left, bottom_h, width, 0.2]
        rect_histy = [left_h, bottom, 0.2, height]

        # start with a rectangular Figure
        plt.figure(1, figsize=(8, 8))
        axScatter = plt.axes(rect_scatter)
        plt.xlabel('Distance from pointing centre (deg)')
        plt.ylabel('Integrated flux / Peak flux')
        plt.xticks(rotation=270)
        axScatter.plot([0,3.0],[1.0,1.0],'k-')

        smids = []
        svals = []
        distancerange = np.arange(0,max(radialseps),0.3)
        for i in range(0,len(distancerange)-1):
            distancemin = distancerange[i]
            distancemax = distancerange[i+1]
            binvals = np.array([])
            for j in range(0,len(radialseps)):
                if distancemin < radialseps[j] < distancemax:
                    binvals = np.append(binvals,fluxratios[j])
            midpoint = (distancemin+distancemax)/2.0
            print i,binvals
            #bsmear = bandwidth_smearing2(6*arcsec2deg,150E6,midpoint,4*48.8E3)
            #tsmear = time_smearing2(16.0,midpoint,6*arcsec2deg)
            #smids.append(midpoint)
            #svals.append(1.0/(bsmear*tsmear))
            #booterrl,booterrh = bootstrap(binvals, 100000, np.mean, 0.05)
            if len(binvals)>0:
                booterrl,booterrh = bootstrap(binvals, 100000, np.median, 0.05)
                axScatter.errorbar(midpoint,np.median(binvals),xerr=(distancemin-distancemax)/2.0,yerr=[[np.median(binvals)-booterrl],[booterrh-np.median(binvals)]],fmt='--o',ecolor='b',color='b',zorder=999999)

        #axScatter.plot(smids,svals,'k--')

        axHisty = plt.axes(rect_histy)
        plt.xticks(rotation=270)

        # no labels
        axHisty.yaxis.set_major_formatter(nullfmt)

        # the scatter plot:

        axScatter.scatter(radialseps,fluxratios,color='blue',marker='+',s=10,alpha=0.5)

        binwidth = 0.05

        axScatter.set_xlim((0, 3.0))
        axScatter.set_ylim((0.8, 2.5))

        bins = np.arange(0.8, 3, binwidth)
        axHisty.hist(fluxratios, bins=bins, orientation='horizontal',color='blue',alpha=0.5)
        axHisty.set_ylim(axScatter.get_ylim())
        plt.savefig(outname)
        plt.close('all')
        plt.cla()
        plt.clf()
    id.append(r['id'])
'''
for l in open('/home/mjh/pipeline-master/ddf-pipeline/misc/DR2-pointings.txt').readlines():
    bits=l.rstrip().split()
    id.append(bits[0])
    ra.append(float(bits[1]))
    dec.append(float(bits[2]))
'''

ra = np.array(ra) * deg2rad
dec = np.array(dec) * deg2rad

r_ra = 270 * deg2rad
r_dec = 45 * deg2rad

sep = sepn(ra, dec, r_ra, r_dec)
i = np.argmin(sep)
print(i, id[i], sep[i] * rad2deg)

# mosaic distance is 2.2 deg
limit = 2.2 * deg2rad

area = 0
totarea = 0
ras = np.linspace(0, 360, 700) * deg2rad
decs = np.linspace(0, 90, 700) * deg2rad
for d in decs:
    a = np.cos(d)
    print('.', end=' ')
    for r in ras:
        sep = sepn(ra, dec, r, d)
def filter_catalogs(args,pointingras,pointingdecs,mosaiccat,outname,dessourcenums,cattype):

    pointdirectories = args.pointdirectories

    sourceids = np.array([])
    sourceresolved = np.array([])
    sourcera = np.array([])
    e_sourcera = np.array([])
    e_sourcera_tot = np.array([])
    sourcedec = np.array([])
    e_sourcedec = np.array([])
    e_sourcedec_tot = np.array([])
    sint = np.array([])
    e_sint = np.array([])
    e_sint_tot = np.array([])
    speak = np.array([])
    e_speak = np.array([])
    e_speak_tot = np.array([])
    maj = np.array([])
    e_maj = np.array([])
    smin = np.array([])
    e_smin = np.array([])
    dcmaj = np.array([])
    e_dcmaj = np.array([])
    dcsmin = np.array([])
    e_dcsmin = np.array([])
    pa = np.array([])
    e_pa = np.array([])
    dcpa = np.array([])
    e_dcpa = np.array([])
    rms_noise = np.array([])
    stype = np.array([])
    mosaic_identifier  = np.array([])
    gausid = np.array([])
    islid = np.array([])
    sourcenum = np.array([])

    
    pointing = mosaiccat.replace('.cat.fits','-blanked.fits')
    if cattype == 'gaus':
        sourcecat = fits.open(mosaiccat)
        mosaiccat = glob.glob(mosaiccat.replace('mosaic.cat.fits','mosaic-blanked_pybdsm/*/catalogues/mosaic-blanked.pybdsm.gaul.FITS'))[0]
        
    cat = fits.open(mosaiccat)
    
    f = fits.open(pointing)
    rapointing = f[0].header['CRVAL1']*deg2rad
    decpointing = f[0].header['CRVAL2']*deg2rad
    f.close()

    numsources = len(cat[1].data['RA'])

    closepointingindex = np.where(sepn(pointingras,pointingdecs,rapointing,decpointing)*rad2deg < 5.0)

    astromed = find_median_astrometry(pointdirectories,rapointing,decpointing)

    keepindices = []
    time1 = time.time()
    for i in range(0,numsources):
        
        if dessourcenums == None:
            allsep = sepn(pointingras[closepointingindex],pointingdecs[closepointingindex],cat[1].data['RA'][i]*deg2rad,cat[1].data['DEC'][i]*deg2rad)
            centsep =  sepn(rapointing,decpointing,cat[1].data['RA'][i]*deg2rad,cat[1].data['DEC'][i]*deg2rad)
            if min(allsep) != centsep:
                continue
            else:
                keepindices.append(i)
        else:
            if cat[1].data['Source_id'][i] in dessourcenums:
                keepindices.append(i)
            else:
                continue
            
        if cattype == 'srl':
            sc=SkyCoord(cat[1].data['RA'][i]*deg2rad*u.rad,cat[1].data['DEC'][i]*deg2rad*u.rad,frame='icrs')
        if cattype == 'gaus':
            sourceindex=cat[1].data['Source_id'][i]
            sc=SkyCoord(sourcecat[1].data['RA'][sourceindex]*deg2rad*u.rad,sourcecat[1].data['DEC'][sourceindex]*deg2rad*u.rad,frame='icrs')
        s=sc.to_string(style='hmsdms',sep='',precision=3)
        s=sc.to_string(style='hmsdms',sep='',precision=2)
        identity = str('ILTJ'+s).replace(' ','')[:-1]

        sourceids = np.append(sourceids,identity)
        if cattype == 'srl':
            mosaic_identifier = np.append(mosaic_identifier,mosaiccat.split('/')[-2])
        if cattype == 'gaus':
            mosaic_identifier = np.append(mosaic_identifier,mosaiccat.split('/')[-5])
        fluxratio = cat[1].data['Total_flux'][i]/cat[1].data['Peak_flux'][i]
        snr  = cat[1].data['Peak_flux'][i]/cat[1].data['Isl_rms'][i]

        # Some equation to figure out if the source is resolved -- leave these dummy values for now.
        if fluxratio > (1.483 + 1000.4/(snr**3.94)):
            #if fluxratio > (1.50341355 + 1.78467767/(snr**0.78385826)):
            sourceresolved = np.append(sourceresolved,'R')
        else:
            sourceresolved = np.append(sourceresolved,'U')

    print 'Keeping %s sources for %s -- took %s'%(len(keepindices),pointing,time.time()-time1)

    sourcera = np.append(sourcera,cat[1].data[keepindices]['RA'])
    e_sourcera = np.append(e_sourcera,cat[1].data[keepindices]['E_RA'])
    e_sourcera_tot = np.append(e_sourcera_tot,(cat[1].data[keepindices]['E_RA']**2.0 + (astromed*arcsec2deg)**2.0)**0.5) #$ ADD SOME ERROR TO THE SOURCE POSITIONS
    
    sourcedec = np.append(sourcedec,cat[1].data[keepindices]['DEC'])
    e_sourcedec = np.append(e_sourcedec,cat[1].data[keepindices]['E_DEC'])
    e_sourcedec_tot = np.append(e_sourcedec_tot,(cat[1].data[keepindices]['E_DEC']**2.0 + (astromed*arcsec2deg)**2.0)**0.5) # ADD SOME ERROR TO THE SOURCE POSITIONS
    
    sint = np.append(sint,cat[1].data[keepindices]['Total_flux'])
    e_sint =np.append(e_sint,cat[1].data[keepindices]['E_Total_flux'])
    e_sint_tot =np.append(e_sint_tot,(cat[1].data[keepindices]['E_Total_flux']**2.0 + (cat[1].data[keepindices]['Total_flux']*0.2)**2.0)**0.5)
    
    speak = np.append(speak,cat[1].data[keepindices]['Peak_flux'])
    e_speak =np.append(e_speak,cat[1].data[keepindices]['E_Peak_flux'])
    e_speak_tot =np.append(e_speak_tot,(cat[1].data[keepindices]['E_Peak_flux']**2.0 + (cat[1].data[keepindices]['Peak_flux']*0.2)**2.0)**0.5)
    
    maj = np.append(maj,cat[1].data[keepindices]['Maj'])
    e_maj =np.append(e_maj,cat[1].data[keepindices]['E_Maj'])
    smin = np.append(smin,cat[1].data[keepindices]['Min'])
    e_smin = np.append(e_smin,cat[1].data[keepindices]['E_Min'])
    dcmaj = np.append(dcmaj,cat[1].data[keepindices]['DC_Maj'])
    e_dcmaj =np.append(e_dcmaj,cat[1].data[keepindices]['E_DC_Maj'])
    dcsmin = np.append(dcsmin,cat[1].data[keepindices]['DC_Min'])
    e_dcsmin = np.append(e_dcsmin,cat[1].data[keepindices]['E_DC_Min'])
    pa = np.append(pa,cat[1].data[keepindices]['PA'])
    e_pa = np.append(e_pa,cat[1].data[keepindices]['E_PA'])
    dcpa = np.append(dcpa,cat[1].data[keepindices]['DC_PA'])
    e_dcpa = np.append(e_dcpa,cat[1].data[keepindices]['E_DC_PA'])

    rms_noise = np.append(rms_noise,cat[1].data[keepindices]['Isl_rms'])
    stype = np.append(stype,cat[1].data[keepindices]['S_Code'])
    islid = np.append(islid,cat[1].data[keepindices]['Isl_id'])
    sourcenum = np.append(sourcenum,cat[1].data[keepindices]['Source_id'])
    
    col1 = fits.Column(name='Source_Name',format='24A',unit='',array=sourceids)
    col2 = fits.Column(name='RA',format='f8',unit='deg',array=sourcera)
    col3 = fits.Column(name='E_RA',format='f8',unit='arcsec',array=e_sourcera*deg2arcsec)
    col4 = fits.Column(name='E_RA_tot',format='f8',unit='arcsec',array=e_sourcera_tot*deg2arcsec)
    
    col5 = fits.Column(name='DEC',format='f8',unit='deg',array=sourcedec)
    col6 = fits.Column(name='E_DEC',format='f8',unit='arcsec',array=e_sourcedec*deg2arcsec)
    col7 = fits.Column(name='E_DEC_tot',format='f8',unit='arcsec',array=e_sourcedec_tot*deg2arcsec)
    
    col8 = fits.Column(name='Peak_flux',format='f8',unit='beam-1 mJy',array=speak*1000.0)
    col9 = fits.Column(name='E_Peak_flux',format='f8',unit='beam-1 mJy',array=e_speak*1000.0)
    col10 = fits.Column(name='E_Peak_flux_tot',format='f8',unit='beam-1 mJy',array=e_speak_tot*1000.0)
    
    col11 = fits.Column(name='Total_flux',format='f8',unit='mJy',array=sint*1000.0)
    col12 = fits.Column(name='E_Total_flux',format='f8',unit='mJy',array=e_sint*1000.0)
    col13 = fits.Column(name='E_Total_flux_tot',format='f8',unit='mJy',array=e_sint_tot*1000.0)
    
    #maj[np.where(sourceresolved=='U')] = np.nan
    #e_maj[np.where(sourceresolved=='U')] = np.nan
    #smin[np.where(sourceresolved=='U')] = np.nan
    #e_smin[np.where(sourceresolved=='U')] = np.nan
    #pa[np.where(sourceresolved=='U')] = np.nan
    #e_pa[np.where(sourceresolved=='U')] = np.nan
    
    col14 =  fits.Column(name='Maj',format='f8',unit='arcsec',array=maj*deg2arcsec)
    col15 =  fits.Column(name='E_Maj',format='f8',unit='arcsec',array=e_maj*deg2arcsec)
    
    col16 =  fits.Column(name='Min',format='f8',unit='arcsec',array=smin*deg2arcsec)
    col17 =  fits.Column(name='E_Min',format='f8',unit='arcsec',array=e_smin*deg2arcsec)

    col18 =  fits.Column(name='DC_Maj',format='f8',unit='arcsec',array=dcmaj*deg2arcsec)
    col19 =  fits.Column(name='E_DC_Maj',format='f8',unit='arcsec',array=e_dcmaj*deg2arcsec)
    
    col20 =  fits.Column(name='DC_Min',format='f8',unit='arcsec',array=dcsmin*deg2arcsec)
    col21 =  fits.Column(name='E_DC_Min',format='f8',unit='arcsec',array=e_dcsmin*deg2arcsec)
    
    col22 =  fits.Column(name='PA',format='f8',unit='deg',array=pa)
    col23 =  fits.Column(name='E_PA',format='f8',unit='deg',array=e_pa)

    col24 =  fits.Column(name='DC_PA',format='f8',unit='deg',array=dcpa)
    col25 =  fits.Column(name='E_DC_PA',format='f8',unit='deg',array=e_dcpa)

    #col20 = fits.Column(name='Resolved',format='1A',unit='',array=sourceresolved)
    
    col26 = fits.Column(name='Isl_rms',format='f8',unit='beam-1 mJy',array=rms_noise*1000.0)
    col27 = fits.Column(name='S_Code',format='1A',unit='',array=stype)
    
    col28 = fits.Column(name='Mosaic_ID',format='9A',unit='',array=mosaic_identifier)
    
    col29 = fits.Column(name='Isl_id',format='I8',unit='',array=islid)
	
    # With unique source names that are matched with source and gaussian catalogs the source_id is not needed.
    #col24 = fits.Column(name='Source_id',format='I8',unit='',array=sourcenum)
    
    if cattype == 'gaus':
        gausid = np.append(gausid,cat[1].data[keepindices]['Gaus_id'])
        col30 = fits.Column(name='Gaus_id',format='I8',unit='',array=gausid)

    if cattype == 'srl':    
        cols = fits.ColDefs([col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29])
    if cattype == 'gaus':
        cols = fits.ColDefs([col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29,col30])
        
    tbhdu = fits.BinTableHDU.from_columns(cols)

    if cattype == 'gaus':
        regionfile = open('%s.gaus.reg'%outname,'w')
    if cattype == 'srl':
        regionfile = open('%s.srl.reg'%outname,'w')
    regionfile.write('# Region file format: DS9 version 4.0\n')
    regionfile.write('global color=green font="helvetica 10 normal" select=1 highlite=1 edit=1 move=1 delete=1 include=1 fixed=0 source\n')
    regionfile.write('fk5\n')
    for i in range(0,len(sourceids)):
	if not np.isnan(maj[i]):
            regionfile.write('ellipse(%s,%s,%s,%s,%s)\n'%(sourcera[i],sourcedec[i],maj[i],smin[i],pa[i]+90))
	else:
            regionfile.write('box(%s,%s,5.0",5.0",0.0)\n'%(sourcera[i],sourcedec[i]))
    regionfile.close()

    prihdr = fits.Header()
    prihdr['NAME'] = outname
    prihdu = fits.PrimaryHDU(header=prihdr)
    tbhdulist = fits.HDUList([prihdu, tbhdu])
    if cattype == 'srl':
        outcat = outname +'.srl.fits'
    if cattype == 'gaus':
        outcat = outname +'.gaus.fits'
    tbhdulist.writeto(outcat)

    return sourcenum,outcat