Example #1
0
from Error import raiseError

try:
    import pyfits as pf
except:
    try:
        import astropy.io.fits as pf
    except:
        raiseError('No pyfits module found.', None)
Example #2
0
def getRegions(configOpts, logger):

    #####################################################################
    ##########################  FUV processing ##########################

    fuvImage = configOpts['fuvImage']

    logger.write('FUV Image: %s' % fuvImage, newLine=True)

    if not os.path.exists(fuvImage):
        raiseError('FUV image does not exist.', logger)

    if (configOpts['fuvMaskFile'].lower() == 'default') or (configOpts['fuvMaskFile'] is None):
        configOpts['fuvMaskFile'] = configOpts['root'] + '_Mask.fits'

    doCLFindFUV = True
    if os.path.exists(configOpts['fuvMaskFile']):
        if configOpts['overwrite'] is True:
            doCLFindFUV = True
        else:
            doCLFindFUV = getYN('\nFound {0}. Rerun CLFind? [y/N] '.format(configOpts['fuvMaskFile']),
                                returnOpt=False)

    if doCLFindFUV is False:
        logger.write('FUV mask not created. Using previously generated mask %s.' % configOpts['fuvMaskFile'])

    else:

        if configOpts['fuvInteractive'] is False:
            logger.write('FUV parameters loaded')

        else:

            logger.write('FUV: Running in interactive mode ... ', newLine=True)

            data = pf.getdata(fuvImage)
            logger.write('Image statistics', newLine=True, log=True)
            logger.write('Max: %9.3e' % np.nanmax(data), log=True)
            logger.write('Min: %9.3e' % np.nanmin(data), log=True)
            logger.write('Mean: %9.3e' % np.mean(data), log=True)
            logger.write('Median: %9.3e' % np.median(data), log=True)

            configOpts['fuvBackground'] = calcBackground(fuvImage, logger, verbose=configOpts['verbose'])
            logger.write('Background: %.5e' % configOpts['fuvBackground'],
                         newLine=True)

            configOpts['fuvSigma'] = getFloat('Sigma [3]: ', 3)
            configOpts['fuvhLevel'] = getFloat('Highest level [-1 for automatic]: ', -1)
            configOpts['fuvnLevels'] = getFloat('Number of levels  [-1 for automatic]: ', -1)
            configOpts['fuvMinPixels'] = getFloat('Minimum number of pixels [20]: ', 20)

        calcParameters('fuv', configOpts, logger)
        printCLFindOptions('fuv', configOpts, logger)

        resultCheck = checkCLFindOptions('fuv', configOpts)

        if resultCheck is False:
            raiseError('Some of the parameters are incorrect. Please, review the configuration file.',
                       logger)

        clfind2d(fuvImage, configOpts['fuvMaskFile'], configOpts['fuvLevels'],
                 log=True, nPixMin=configOpts['fuvMinPixels'],
                 verbose=configOpts['verbose'])

        logger.write('CLFind log can be found in %s.log' %
                     configOpts['fuvMaskFile'], newLine=True, doPrint=False)

    #####################################################################
    ##########################  FUV rejection ###########################

    if configOpts['checkFUV']:
        if (configOpts['fuvMaskFileRej'] is None) or (configOpts['fuvMaskFileRej'].lower() == 'default'):
            configOpts['fuvMaskFileRej'] = os.path.splitext(configOpts['fuvImage'])[0] + '_RejMsk.fits'

        doRejection = True
        if os.path.exists(configOpts['fuvMaskFileRej']) and doCLFindFUV is False:
            if configOpts['overwrite'] is False:
                doRejection = getYN('\nFound %s. Redo FUV rejection? [y/N] ' %
                                    configOpts['fuvMaskFileRej'], returnOpt=False)

        if doRejection is True:
            logger.write('FUV rejection', newLine=True)
            checkFUV(configOpts, logger)
            logger.write('New mask saved as %s' % configOpts['fuvMaskFileRej'],
                         newLine=True)
        else:
            logger.write('Not doing FUV rejection. Using image %s' %
                         configOpts['fuvMaskFileRej'])

    #####################################################################
    ######################  FUV regions catalogue #######################

    logger.write('Creating FUV catalogs ... ', newLine=True)

    rejMask = configOpts['fuvMaskFileRej']
    votRegsFile = os.path.splitext(rejMask)[0] + '.vot'
    ds9RegsFile = os.path.splitext(rejMask)[0] + '.reg'
    peaksFile = os.path.splitext(rejMask)[0] + '_Peaks.dat'

    if False not in map(os.path.exists, [votRegsFile, ds9RegsFile, peaksFile]) and \
            configOpts['overwrite'] is False:
        logger.write('FUV catalogues already exist.', newLine=True)
        if os.path.exists(votRegsFile):
            logger.write('VOTable catalogue: %s' % votRegsFile)
        logger.write('DS9 catalogue: %s' % ds9RegsFile)
        logger.write('Peaks file: %s' % peaksFile)
    else:
        createCatalog(fuvImage, rejMask, votRegsFile, ds9RegsFile, logger,
                      peaksFile=peaksFile, ellipse=False, plot=configOpts['plotDS9'])

    return

    #####################################################################
    ##########################  HI processing ###########################

    # if configOpts['hiInteractive'] == False:
    #     areCLParamsOK = checkCLFindOptions('hi')
    #     if areCLParamsOK == False:
    #         fancyPrint('Some HI parameters in config file are wrong\n',
    #             newLine=True, log=True)
    #         sys.exit()
    #     fancyPrint('HI parameters loaded', newLine=True, log=True)

    # else:

    #     fancyPrint('HI: Running in interactive mode ... ', newLine=True, log=True)

    #     data = pf.getdata(configOpts['hiImage'])
    #     fancyPrint('Image statistics', newLine=True, log=True)
    #     fancyPrint('Max: %9.3e' % np.nanmax(data), log=True)
    #     fancyPrint('Min: %9.3e' % np.nanmin(data), log=True)
    #     fancyPrint('Mean: %9.3e' % np.mean(data), log=True)
    #     fancyPrint('Median: %9.3e' % np.median(data), log=True)

    #     configOpts['hiBackground'] = \
    #         calcBackground(configOpts['hiImage'], fancyPrint)
    #     fancyPrint('Background: %.5e' % configOpts['hiBackground'],
    #         newLine=True, log=False)

    #     fancyPrint('')
    #     configOpts['hiSigma'] = getFloat('Sigma [3]: ', 3)
    #     configOpts['hihLevel'] = getFloat('Highest level [-1 for automatic]: ', -1)
    #     configOpts['hinLevels'] = getFloat('Number of levels  [-1 for automatic]: ', -1)
    #     configOpts['hiMinPixels'] = getFloat('Minimum number of pixels [20]: ', 20)
    #     fancyPrint('')

    # hiLevels = calcParameters('hi')

    # if (configOpts['hiMaskFile'].lower() == 'default') or (configOpts['hiMaskFile'] == None):
    #     configOpts['hiMaskFile'] = os.path.splitext(configOpts['hiImage'])[0] + '_Msk.fits'

    # doIDL = True
    # if os.path.exists(configOpts['hiMaskFile']):
    #     doIDL = getYN('\nFound {0}. Rerun CLFind? [y/N] '.format(configOpts['hiMaskFile']),
    #         returnOpt=False)

    # if doIDL:

    #     status, maskFile, idlLogFile = clfind2dIDL(configOpts['hiImage'], hiLevels,
    #         log=configOpts['log'], nPixMin=configOpts['hiMinPixels'],
    #         verbose=configOpts['verbose'])

    #     if not status:
    #         fancyPrint('Problem found running IDL', newLine=True, log=True)
    #         fancyPrint('Kill IDL, check {0} and try again\n'.format(idlLogFile), log=True)
    #         sys.exit()

    #     sh.move(maskFile, configOpts['hiMaskFile'])
    #     logData = open(idlLogFile, 'r').read().splitlines()
    #     sh.move(idlLogFile, 'clfind2dHI.log')

    # else:
    #     logData = open('clfind2dHI.log', 'r').read().splitlines()

    # for line in logData:
    #     fancyPrint(line, log=True, noPrint=True)
    #     if 'clumps found (' in line:
    #         m = re.match(r'(\d+)(.+)(\(+)(\d+)', line.replace(' ',''))
    #         nClumpsHI = int(m.groups(0)[0])
    #         nClumpsRejHI = nClumps = int(m.groups(0)[-1])

    # fancyPrint('HI mask file: {0}'.format(configOpts['hiMaskFile']), newLine=True, log=True)
    # fancyPrint('Number of clumps: {0}'.format(nClumpsHI), log=True)
    # fancyPrint('Number of clumps rejected: {0}'.format(nClumpsRejHI), log=True)


    # # #####################################################################
    # # ##########################  HI rejection ###########################
    # #
    # # if configOpts['checkHI']:
    # #     if (configOpts['fuvMaskFileRej'] == None) or (configOpts['fuvMaskFileRej'].lower() == 'default'):
    # #         configOpts['fuvMaskFileRej'] = os.path.splitext(configOpts['fuvImage'])[0] + '_RejMsk.fits'
    # #
    # #     doRejection = True
    # #     if os.path.exists(configOpts['fuvMaskFileRej']) and doIDL == False:
    # #         doRejection = getYN('\nFound {0}. Redo FUV rejection? [y/N] '.format(configOpts['fuvMaskFileRej']),
    # #                             returnOpt=False)
    # #
    # #     if doRejection == True:
    # #         try:
    # #             checkFUV(configOpts, fancyPrint)
    # #         except Exception as detail:
    # #             raise detail
    # #     else:
    # #         fancyPrint('Not doing FUV rejection. Using image {0}'.format(configOpts['fuvMaskFileRej']),
    # #             log=True, noPrint=True, newLine=True)
    # #
    # #
    # # #####################################################################

    # fancyPrint('')

    return configOpts
Example #3
0
def checkFUV(options, logger):

    fuvImage = options['fuvImage']
    fuvMask = options['fuvMaskFile']

    logger.write('Checking FUV regions ... ', newLine=True, doLog=False)

    logger.write('Gathering regions ... ', doLog=False)

    hduMask = pf.open(fuvMask)
    hduImage = pf.open(fuvImage)
    # nRegs = np.max(hduMask[0].data)
    regions = Regions.RegionSet(hduMask[0].data, image=hduImage[0].data)

    logger.write('Getting adjacent regions ... ', doLog=False)
    adjacentRegions = regions.getAdjacentRegs()

    logger.write('Processing adjacent regions ... ', doLog=False)

    while adjacentRegions != []:

        pair = adjacentRegions[0]
        fluxA = regions.Regions[pair[0]].getFlux()
        fluxB = regions.Regions[pair[1]].getFlux()
        peakA = regions.Regions[pair[0]].peak
        peakB = regions.Regions[pair[1]].peak

        if options['fluxContrast'] is not False:
            contrast = float(np.max([fluxA, fluxB]) / np.min([fluxA, fluxB]))
            minRegion = pair[np.argmin([fluxA, fluxB])]
            maxRegion = pair[np.argmax([fluxA, fluxB])]
            if options['fluxContrast'] is True or contrast > options['fluxContrast']:
                if options['joinRegions']:
                    regions.joinRegions(maxRegion, minRegion)
                    logger.write('Adjacent regions %d and %d joined. Flux contrast=%.1f' %
                                 (maxRegion, minRegion, contrast), doPrint=False)
                else:
                    regions.deleteReg(minRegion)
                    logger.write('Adjacent regions %d deleted. Flux contrast=%.1f' %
                                 (minRegion, contrast), doPrint=False)
                adjacentRegions = regions.getAdjacentRegs()
                continue

        if options['peakContrast'] is not False:
            contrast = float(np.max([peakA, peakB]) / np.min([peakA, peakB]))
            minRegion = pair[np.argmin([peakA, peakB])]
            maxRegion = pair[np.argmax([peakA, peakB])]
            if options['peakContrast'] is True or contrast > options['peakContrast']:
                if options['joinRegions']:
                    regions.joinRegions(maxRegion, minRegion)
                    logger.write('Adjacent regions %d and %d joined. Peak contrast=%.1f' %
                                 (maxRegion,  minRegion, contrast), doPrint=False)
                else:
                    regions.deleteReg(minRegion)
                    logger.write('Adjacent regions %d deleted. Peak contrast=%.1f' %
                                 (minRegion, contrast), doPrint=False)
                adjacentRegions = regions.getAdjacentRegs()
                continue

        del adjacentRegions[0]

    logger.write('Getting close regions ... ', newLine=True, doLog=False)

    if options['scale'] is not None:
        scalePc = options['scale']
    else:
        try:
            try:
                scaleDeg = np.abs(hduImage[0].header['CD1_1'])
            except:
                scaleDeg = np.abs(hduImage[0].header['CDELT1'])
        except:
            raiseError('Pixel scale cannot be calculated. Use the scale parameter.')

        try:
            scalePc = 2.0 * options['distance'] * 1e6 * np.tan(0.5 * scaleDeg * np.pi / 180.)
        except:
            raiseError('Distance to the galaxy not defined.')

    minNumPixels = options['minDistance'] / scalePc

    closeRegions = regions.getCloseRegs(minNumPixels, adjacent=False)

    logger.write('Processing close regions ... ', newLine=True, doLog=False)

    while closeRegions != []:

        pair = closeRegions[0]

        fluxA = regions.Regions[pair[0]].getFlux()
        fluxB = regions.Regions[pair[1]].getFlux()
        peakA = regions.Regions[pair[0]].peak
        peakB = regions.Regions[pair[1]].peak

        if options['alwaysRemoveClose']:
            minRegion = pair[np.argmin([fluxA, fluxB])]
            regions.deleteReg(minRegion)
            closeRegions = regions.getCloseRegs(minNumPixels, adjacent=False)
            logger.write('Close region %d removed' % minRegion, doPrint=False)
            continue

        if options['fluxContrast'] is not False:
            contrast = float(np.max([fluxA, fluxB]) / np.min([fluxA, fluxB]))
            minRegion = pair[np.argmin([fluxA, fluxB])]
            maxRegion = pair[np.argmax([fluxA, fluxB])]
            if (options['fluxContrast'] is True) or (contrast > options['fluxContrast']):
                regions.deleteReg(minRegion)
                closeRegions = regions.getCloseRegs(minNumPixels, adjacent=False)
                logger.write('Close region %s removed. Flux contrast=%.1f' %
                             (minRegion, contrast), doPrint=False)
                continue

        if options['peakContrast'] is not False:
            contrast = float(np.max([peakA, peakB]) / np.min([peakA, peakB]))
            minRegion = pair[np.argmin([peakA, peakB])]
            maxRegion = pair[np.argmax([peakA, peakB])]
            if (options['peakContrast'] is True) or (contrast > options['peakContrast']):
                regions.deleteReg(minRegion)
                closeRegions = regions.getCloseRegs(minNumPixels, adjacent=False)
                logger.write('Close region %d removed. Peak contrast=%.1f' %
                             (minRegion, contrast), doPrint=False)
                continue

        del closeRegions[0]

    logger.write('Saving new mask ... ', newLine=True, doLog=False)

    hdu = pf.PrimaryHDU(regions.DataMask)
    hdu.header = hduMask[0].header
    hduList = pf.HDUList([hdu])
    if os.path.exists(options['fuvMaskFileRej']): os.remove(options['fuvMaskFileRej'])
    hduList.writeto(options['fuvMaskFileRej'], output_verify='ignore')

    return
Example #4
0
def createCatalog(image, mask, voTableCat, ds9RegsFile, logger,
                  peaksFile=None, ellipse=False, ellMode='linear', plot=False):

    if voModule is False:
        logger.write(cm.Fore.RED + 'No VO module found. A FITS table will be generated instead.' +
                     cm.Style.RESET_ALL, newLine=True)

# Reads the header, data and loads the astrometric solution
    hduImage = pf.open(image)
    hduMask = pf.open(mask)
    try:
        wcsMask = pw.WCS(hduMask[0].header)
    except:
        wcsMask = None
        logger.write(cm.Fore.YELLOW + 'No WCS information. The VOTable file will not include those fields.' +
                     cm.Style.RESET_ALL)

    logger.write('Gathering mask data ... ', newLine=True)
    regions = RegionSet(hduMask[0].data, image=hduImage[0].data)

    logger.write('Preparing data ... ')
    centroids = np.array([regions.Regions[idReg].getCentroid()[0] for idReg in regions.idRegions])
    radii = [regions.Regions[idReg].getCentroid()[1] for idReg in regions.idRegions]
    sizes = [regions.Regions[idReg].where[0].size for idReg in regions.idRegions]
    peaks = [regions.Regions[idReg].peak for idReg in regions.idRegions]
    peaksPix = np.array([regions.Regions[idReg].peakWhere for idReg in regions.idRegions]) + 1
    fluxes = [regions.Regions[idReg].getFlux() for idReg in regions.idRegions]

    if wcsMask is not None:
        skyCoordsCentroids = wcsMask.wcs_pix2sky(np.fliplr(centroids), 0)
        skyCoordsPeak = wcsMask.wcs_pix2sky(np.fliplr(peaksPix), 0)

        try:
            scale = np.abs(hduImage[0].header['CD1_1']) * 3600.
        except:
            try:
                scale = np.abs(hduImage[0].header['CDELT1']) * 3600.
            except:
                wcsMask = None
                logger.write(cm.Fore.YELLOW + 'No WCS information. The VOTable file will ' +
                             'not include those fields.' + cm.Style.RESET_ALL)

        radiiSky = radii * scale

# Calculates an ellipse fit for the pixels in the region
    if ellipse:
        logger.write('Fitting ellipse parameters ... ')

        def getEllParams(data, id):
            try:
                return list(fitellipse(data, ellMode)) + [0]
            except RuntimeError:
                return [regions.Regions[id].getCentroid()[0][0], regions.Regions[id].getCentroid()[0][1],
                        regions.Regions[idReg].getCentroid()[1], regions.Regions[idReg].getCentroid()[1],
                        0.0, 1]

        ellipseFit = np.array([getEllParams(regions.Regions[idReg].pixels, idReg) for idReg in regions.idRegions])
        ellipseCentroidWCS = np.array(wcsMask.wcs_pix2sky(ellipseFit[:, [1, 0]], 0))
        ellipseAxisWCS = np.array(ellipseFit[:, [2, 3]] * scale)
        ellipseAngle = np.array(-ellipseFit[:, 4] * 180. / np.pi + 90.)

    if voModule is True:
        # Creates a VOTable with the data
        logger.write('Creating VOTable ... ')

        if os.path.exists(voTableCat):
            os.remove(voTableCat)

        # from vo.tree import VOTableFile, Resource, Table, Field

        votable = VOTableFile()
        resource = Resource()
        votable.resources.append(resource)
        table = Table(votable)
        resource.tables.append(table)

        # Define fields
        fieldsVO = [Field(votable, name='ID', datatype='int'),
                    Field(votable, name='X_CENTROID', datatype='float', unit='pix'),
                    Field(votable, name='Y_CENTROID', datatype='float', unit='pix'),
                    Field(votable, name='RADIUS_PIX', datatype='float', unit='pix'),
                    Field(votable, name='SIZE', datatype='float', unit='pix')]

        if wcsMask is not None:
            fieldsVO += [Field(votable, name='RA_CENTROID', datatype='double', unit='deg'),
                         Field(votable, name='DEC_CENTROID', datatype='double', unit='deg'),
                         Field(votable, name='RADIUS_SKY', datatype='float', unit='arcsec')]

        fieldsVO += [Field(votable, name='PEAK', datatype='float', unit='CPS'),
                     Field(votable, name='X_PEAK', datatype='float', unit='pix'),
                     Field(votable, name='Y_PEAK', datatype='float', unit='pix')]

        if wcsMask is not None:
            fieldsVO += [Field(votable, name='RA_PEAK', datatype='double', unit='deg'),
                         Field(votable, name='DEC_PEAK', datatype='double', unit='deg')]

        fieldsVO += [Field(votable, name='FLUX', datatype='float', unit='CPS')]

        if ellipse is True:
            fieldsVO += [Field(votable, name='X_ELLIPSE', datatype='float', unit='pix'),
                         Field(votable, name='Y_ELLIPSE', datatype='float', unit='pix'),
                         Field(votable, name='SEMIAX1_PIX', datatype='float', unit='pix'),
                         Field(votable, name='SEMIAX2_PIX', datatype='float', unit='pix'),
                         Field(votable, name='ELL_ANGLE', datatype='float', unit='deg'),
                         Field(votable, name='ELL_ERROR', datatype='double')]

            if wcsMask is not None:
                fieldsVO += [Field(votable, name='RA_ELLIPSE', datatype='double', unit='deg'),
                             Field(votable, name='DEC_ELLIPSE', datatype='double', unit='deg'),
                             Field(votable, name='SEMIAX1_SKY', datatype='float', unit='arcsec'),
                             Field(votable, name='SEMIAX2_SKY', datatype='float', unit='arcsec')]

        table.fields.extend(fieldsVO)
        table.create_arrays(len(regions.idRegions))

        for nReg in range(len(regions.idRegions)):
            row = [regions.idRegions[nReg],
                   centroids[nReg, 1]+1, centroids[nReg, 0]+1, radii[nReg], sizes[nReg]]

            if wcsMask is not None:
                row += [skyCoordsCentroids[nReg, 0], skyCoordsCentroids[nReg, 1], radiiSky[nReg]]

            row += [peaks[nReg], peaksPix[nReg, 1]+1, peaksPix[nReg, 0]+1]

            if wcsMask is not None:
                row += [skyCoordsPeak[nReg, 0], skyCoordsPeak[nReg, 1]]

            row.append(fluxes[nReg])

            if ellipse is True:
                row += [ellipseFit[nReg, 1]+1, ellipseFit[nReg, 0]+1, ellipseFit[nReg, 2], ellipseFit[nReg, 3],
                        ellipseAngle[nReg], ellipseFit[nReg, 4]]

                if wcsMask is not None:
                    row += [ellipseCentroidWCS[nReg, 0], ellipseCentroidWCS[nReg, 1], ellipseAxisWCS[nReg, 0],
                            ellipseAxisWCS[nReg, 1]]

            table.array[nReg] = tuple(row)

        votable.to_xml(voTableCat)
        logger.write('VOTable catalogue: %s' % voTableCat)

    else:
    # If the vo module is not available, uses PyFits to create a Fits table

        logger.write('Creating FITS table ... ', newLine=True)

        fields = [pf.Column(name='ID', format='J', array=regions.idRegions),
                  pf.Column(name='X_CENTROID', format='E', unit='pix', array=centroids[:, 1]+1),
                  pf.Column(name='Y_CENTROID', format='E', unit='pix', array=centroids[:, 0]+1),
                  pf.Column(name='RADIUS_PIX', format='E', unit='pix', array=radii),
                  pf.Column(name='SIZE', format='E', unit='pix', array=sizes)]

        if wcsMask is not None:
            fields += [pf.Column(name='RA_CENTROID', format='D', unit='deg',
                                 array=skyCoordsCentroids[:, 0]),
                       pf.Column(name='DEC_CENTROID', format='D', unit='deg',
                                 array=skyCoordsCentroids[:, 1]),
                       pf.Column(name='RADIUS_SKY', format='D', unit='arcsec',
                                 array=radiiSky)]

        fields += [pf.Column(name='PEAK', format='E', unit='CPS', array=peaks),
                   pf.Column(name='X_PEAK', format='E', unit='pix', array=peaksPix[:, 1]+1),
                   pf.Column(name='Y_PEAK', format='E', unit='pix', array=peaksPix[:, 0]+1)]

        if wcsMask is not None:
            fields += [pf.Column(name='RA_PEAK', format='D', unit='deg',
                                 array=skyCoordsPeak[:, 0]),
                       pf.Column(name='DEC_PEAK', format='D', unit='deg',
                                 array=skyCoordsPeak[:, 1])]

        fields += [pf.Column(name='FLUX', format='E', unit='CPS', array=fluxes)]

        if ellipse is True:
            fields += [pf.Column(name='X_ELLIPSE', format='E', unit='pix',
                                 array=ellipseFit[:, 1]+1),
                       pf.Column(name='Y_ELLIPSE', format='E', unit='pix',
                                 array=ellipseFit[:, 0]+1),
                       pf.Column(name='SEMIAX1_PIX', format='E', unit='pix',
                                 array=ellipseFit[:, 2]),
                       pf.Column(name='SEMIAX2_PIX', format='E', unit='pix',
                                 array=ellipseFit[:, 3]),
                       pf.Column(name='ELL_ANGLE', format='E', unit='deg',
                                 array=ellipseAngle),
                       pf.Column(name='ELL_ERROR', format='L', array=ellipseFit[:, 4])]

            if wcsMask is not None:
                fields += [pf.Column(name='RA_ELLIPSE', format='D', unit='deg',
                                     array=ellipseCentroidWCS[:, 0]),
                           pf.Column(name='DEC_ELLIPSE', format='D', unit='deg',
                                     array=ellipseCentroidWCS[:, 1]),
                           pf.Column(name='SEMIAX1_SKY', format='E', unit='arcsec',
                                     array=ellipseAxisWCS[:, 0]),
                           pf.Column(name='SEMIAX2_SKY', format='E', unit='arcsec',
                                     array=ellipseAxisWCS[:, 1])]

        tbhdu = pf.new_table(fields)
        hdu = pf.PrimaryHDU()
        thdulist = pf.HDUList([hdu, tbhdu])

        fitsTableCat = os.path.splitext(voTableCat)[0] + '_Cat.fits'
        if os.path.exists(fitsTableCat): os.remove(fitsTableCat)
        thdulist.writeto(fitsTableCat)
        logger.write('FITS catalogue: %s' % fitsTableCat)

    # Creates the DS9 regions file using the centroid and radius information for each region.
    logger.write('Creating DS9 regions files ... ', newLine=True)

    # For testing purposes we write a file in X, Y.
    ds9XYFile = os.path.splitext(ds9RegsFile)[0] + '_XY.reg'
    unitRegCentroid = open(ds9XYFile, 'w')
    print >>unitRegCentroid, 'global color = green'

    ii = 0
    for yy, xx in centroids:
        regID = regions.idRegions[ii]
        rad = radii[ii]
        if rad > 0.0:
            print >>unitRegCentroid, 'image; circle ' + str(xx+1) + ' ' + str(yy+1) + ' ' + \
                str(rad) + '# text = {%d}' % regID
            # print >>unitRegCentroid, 'image; x point ' + str(xx+1) + ' ' + str(yy+1) + ' # color=green'
        ii += 1

    unitRegCentroid.close()

    # Write RA, Dec instead:
    if wcsMask is not None:
        ds9WCSFile = os.path.splitext(ds9RegsFile)[0] + '_WCS.reg'
        unitRegCentroid = open(ds9WCSFile, 'w')

        print >>unitRegCentroid, 'global color = blue'
        print >>unitRegCentroid, 'fk5'

        ii = 0
        for ra, dec in skyCoordsCentroids:
            regID = regions.idRegions[ii]
            rad = radii[ii]
            if rad > 0.0:
                print >> unitRegCentroid, 'circle(' + str(ra) + ',' + str(dec) + ',' + str(rad) + '")' + \
                    ' # text = {%d}' % regID
                ii += 1

        unitRegCentroid.close()

    if ellipse:
        ds9EllFile = os.path.splitext(ds9RegsFile)[0] + '_Ell.reg'
        unitRegEllipse = open(ds9EllFile, 'w')

        print >>unitRegEllipse, 'global color = red'

        for ii in range(regions.nRegs):
            regID = regions.idRegions[ii]
            print >>unitRegEllipse, 'image; ellipse ' + str(ellipseFit[ii, 1]+1) + ' ' + \
                str(ellipseFit[ii, 0]+1) + ' ' + str(ellipseFit[ii, 2]) + ' ' + str(ellipseFit[ii, 3]) + \
                ' ' + str(ellipseAngle[ii]) + '# text = {%d}' % regID
            # print >>unitRegEllipse, 'image; x point ' + str(xx+1) + ' ' + str(yy+1) + ' # color=green'
            ii += 1

        unitRegEllipse.close()

    # Writes a file with the peak positions
    if peaksFile is not None:

        if wcsMask is None:
            raiseError('No WCS information. Cannot continue.')

        def dec2dms(dd):
            sign = -1. if dd < 0 else 1.  # Remember to deal with negative DEC
            mnt, sec = divmod(abs(dd) * 3600, 60)
            deg, mnt = divmod(mnt, 60)
            return deg * sign, mnt, sec

        logger.write('Saving peak positions ... ', newLine=True)

        peaksUnit = open(peaksFile, 'w')
        print >>peaksUnit, '# PDRID, XPIXEL, YPIXEL, RA, DEC'
        nn = 0
        for yy, xx in peaksPix:
            ra = skyCoordsPeak[nn, 0]
            dec = skyCoordsPeak[nn, 1]
            raHH, raMM, raSS = dec2dms(ra/15.)
            decDD, decMM, decSS = dec2dms(dec)
            row = '%d, %.2f, %.2f, %02d %02d %05.2f, %+02d %02d %05.2f' % \
                  (nn, xx, yy, raHH, raMM, raSS, decDD, decMM, decSS)
            print >>peaksUnit, row
            nn += 1

        peaksUnit.close()

    if plot:
        logger.write('Plotting regions ... ', newLine=True)

        try:
            from plotDS9 import plotDS9
            import ds9
        except:
            raiseWarning('No pyDS9 module find. Skipping plot.')
            return

        d = ds9.ds9()
        d.set('frame delete all')
        plotDS9(image, frame=1)
        d.set('scale mode minmax')
        d.set('regions load ' + os.path.realpath(ds9XYFile))
        plotDS9(mask, frame=2)
        d.set('scale log')
        d.set('scale mode minmax')
        d.set('regions load ' + os.path.realpath(ds9XYFile))
        if ellipse:
            plotDS9(image, frame=3)
            d.set('scale mode minmax')
            d.set('regions load ' + os.path.realpath(ds9EllFile))
            plotDS9(mask, frame=4)
            d.set('scale log')
            d.set('scale mode minmax')
            d.set('regions load ' + os.path.realpath(ds9EllFile))

    return
Example #5
0
#!/usr/bin/env python
# encoding: utf-8
"""
plotDS9.py

Created by José Ramón Sánchez-Gallego on 2011-02-17.
Copyright (c) 2011. All rights reserved.

"""

from Error import raiseError

try:
    import ds9
except:
    raiseError('No ds9 module found.')

import os


def plotDS9(image, frame=1, zscale=True, fit=True, ext=None, adjust=True,
            minLimZero=False, keepScale=False, scale=False, delete=False):
    ddd = ds9.ds9()

    if delete: ddd.set('frame delete all')
    ddd.set('frame ' + str(frame))

    if keepScale is True:
        zMin, zMax = map(float, ddd.get('scale limits').split())

    if adjust is True:
Example #6
0
from Error import raiseError

try:
    import pywcs as pw
except:
    try:
        import astropy.wcs as pw
    except:
        raiseError('No pywcs module found.', None)