#! /usr/bin/env python2 # -*- coding: utf-8 -*- __version__ = '$Revision: 1.7 $' __date__ = '$Date: 2014/10/06 12:06:58 $' """ Obdela eno sliko iz VEGE. Vrne match, število zvezd v fitu Oktober 2014 Bojan Dintinjana """ import os, sys import getopt import time import pyfits import math import re import string import commands import glob import numpy as np from pyraf import iraf def __main(): global dat, verbose, all all = 0 verbose = 0 opts,args = getopt.getopt(sys.argv[1:], "hva", ["help","verbose","all"]) for o,a in opts: if o in ("-h", "--help"): __usage() sys.exit() if o in ("-v", "--verbose"): verbose = 1 if o in ("-a", "--all"): all = 1 if not args: __usage() sys.exit() for image in args: print "Obdelujem sliko: ", image ProcessOne(image) def ProcessOne(image): global fits, crval1, crval2,cd1_1,cd2_2,xref,yref order=4 vp = pipeline() fits = pyfits.open(image) try: matchx = fits[0].header['MATCHEDX'] if matchx=='T' and not all: print "..je že obdelana." return except: pass crval1 = fits[0].header['CRVAL1'] crval2 = fits[0].header['CRVAL2'] xref = fits[0].header['CRPIX1'] yref = fits[0].header['CRPIX2'] try: cd1_1 = fits[0].header['CD1_1'] cd2_2 = fits[0].header['CD2_2'] except: cd1_1 = fits[0].header['CDELT1'] cd2_2 = fits[0].header['CDELT2'] ra=to_hms(crval1/15.) de=to_dms(crval2) #print("Slika v obdelavi je "+ image + "\n") #print ("scat -c ua2 -n 170 -mx 17 -r -700 %s %s J2000 > starlist.wcs" % (ra,de)) o=commands.getstatusoutput("scat -c ua2 -n 200 -mx 18 -r -680 %s %s J2000 > starlist.wcs" % (ra,de)) if o[0]==0: print "Katalog USNO_A2 ok." else: print "Napaka: "+o[1] match=False vp.dofind(image+'[1:2048,1:2048]') #order=2 #za linearno tan projekcijo n=vp.domatch(image,30) if n<7: print "Prvi match ni uspel, poizkušam znova" n = vp.domatch(image,60) if n>=7: #if n<12: # order=3 vp.domap(image,order) match=True else: print "Drugi match ni uspel, končujem." if match: print "Match: ", image, "narejeno.\n" else: print "Ni matcha: ", image, "\n" return match,n class pipeline: def __init__(self): iraf.cl.menus = "no" # da iraf ne spreminja lokalnih uparam, naj ima svojo tmp mapo #iraf.set(uparm="/home/vega/tmp/uparm/") iraf.digiphot() iraf.apphot() iraf.unlearn(iraf.apphot) iraf.apphot.verify = "no" iraf.apphot.verbose= "no" iraf.unlearn('imstat') iraf.unlearn(iraf.datapars) iraf.datapars.scale = 1. iraf.datapars.fwhmpsf = 5.0 iraf.datapars.sigma = 15. iraf.datapars.datamin = 10. iraf.datapars.datamax = 65500. iraf.datapars.exposure = "EXPOSURE" iraf.datapars.obstime = "JD" iraf.unlearn(iraf.findpars) iraf.findpars.threshold = 10. iraf.findpars.nsigma = 1.5 iraf.unlearn(iraf.centerpars) iraf.centerpars.cbox = 6. iraf.centerpars.cmaxiter = 10 iraf.centerpars.maxshift = 3. iraf.centerpars.clean = "yes" iraf.photpars.apertures = "1.3" self.output1='_image_.coo.1' self.output2='_image_.coo.2' self.field = "ID,OTIME,XC,YC,MSKY,STDEV,FLUX,MAG,MERR,ITIME,VMAG,BVMAG,AIRMASS,NAME" self.fields = string.split(self.field,',') self.expr = "PERROR='NoError' & CERROR='NoError' & SERROR='NoError' & MAG!=INDEF & MSKY!=INDEF & MERR!=INDEF" self.mstar= 0 self.ra_rms = 0.0 self.de_rms = 0.0 self.imag = 0.0 self.iflux = 0.0 def dofind(self,image): iraf.unlearn(iraf.daofind) self.clean(self.output1) stdev = iraf.imstat(image,fields='stddev',nclip=5,format='no',Stdout=1) print "Stdev. neba: %5.1f"%float(stdev[0]) iraf.datapars.sigma = float(stdev[0]) iraf.daofind(image,output=self.output1) iraf.psort(self.output1,field='MAG') commands.getstatusoutput('head -n 240 %s > %s' % (self.output1,self.output2)) def domatch(self,image,nmatch): self.clean("_image_.mat.1") iraf.imcoords() iraf.unlearn(iraf.ccxymatch) iraf.ccxymatch.input = self.output2 iraf.ccxymatch.reference = "starlist.wcs" iraf.ccxymatch.output = "_image_.mat.1" iraf.ccxymatch.tolerance = 7. iraf.ccxymatch.ptolerance = 10. iraf.ccxymatch.refpoints = "" iraf.ccxymatch.xin = xref iraf.ccxymatch.yin = yref iraf.ccxymatch.xmag = cd1_1*3600. iraf.ccxymatch.ymag = cd2_2*3600. iraf.ccxymatch.xrotation = 0. iraf.ccxymatch.yrotation = 0. iraf.ccxymatch.projection = "tnx" iraf.ccxymatch.lngref = crval1/15. iraf.ccxymatch.latref = crval2 iraf.ccxymatch.lngcolumn = 2 iraf.ccxymatch.latcolumn = 3 iraf.ccxymatch.xcolumn = 1 iraf.ccxymatch.ycolumn = 2 iraf.ccxymatch.lngunits = "hours" iraf.ccxymatch.latunits = "degrees" iraf.ccxymatch.separation = 20 iraf.ccxymatch.pseparation = 20 iraf.ccxymatch.matching = "triangles" iraf.ccxymatch.nmatch = nmatch iraf.ccxymatch.ratio = 10. iraf.ccxymatch.nreject = 10 iraf.ccxymatch.verbose = "yes" msg=iraf.ccxymatch(self.output2,"starlist.wcs","_image_.mat.1",7.,10.,Stdout=1) #print msg p=re.match(r'[\s+]?(?P\d*)[\s+]reference coordinates matched.*',msg[-1]) if p: self.mstar = int(p.group('n')) print "Število prepoznanih zvezd je ",self.mstar return self.mstar def domap(self,image,order): iraf.unlearn(iraf.ccmap) iraf.ccmap.input = "_image_.mat.1" iraf.ccmap.database = "database.db" iraf.ccmap.solutions = image iraf.ccmap.images = image iraf.ccmap.results = "" iraf.ccmap.xcolumn = 3 iraf.ccmap.ycolumn = 4 iraf.ccmap.lngcolumn = 1 iraf.ccmap.latcolumn = 2 iraf.ccmap.refpoint = "user" iraf.ccmap.xref = "CRPIX1" iraf.ccmap.yref = "CRPIX2" iraf.ccmap.lngref = "CRVAL1" iraf.ccmap.latref = "CRVAL2" iraf.ccmap.refsystem = "J2000" iraf.ccmap.lngrefunits = "degrees" iraf.ccmap.latrefunits = "degrees" iraf.ccmap.projection = "tnx" iraf.ccmap.fitgeometry = "general" iraf.ccmap.function = "polynomial" iraf.ccmap.xxorder = order iraf.ccmap.xyorder = order iraf.ccmap.xxterms = "half" iraf.ccmap.yxorder = order iraf.ccmap.yyorder = order iraf.ccmap.yxterms = "half" iraf.ccmap.maxiter = 0 iraf.ccmap.reject = 3. iraf.ccmap.update = "yes" iraf.ccmap.pixsystem = "logical" iraf.ccmap.verbose = "yes" iraf.ccmap.interactive = "no" iraf.ccmap.graphics = "stdgraph" iraf.ccmap.cursor = "" msg=iraf.ccmap("_image_.mat.1","database.db",Stdout=1) #print msg for i in range(len(msg)): p=re.match(r'\s+XI fit ok\. ETA fit ok\.',msg[i]) if p: print "Fit ok, ", iraf.hedit.add = "yes" iraf.hedit.addonly = "no" iraf.hedit.verify = "no" iraf.hedit.show = "no" iraf.hedit.update = "yes" iraf.hedit(image,"MATCHED","T") iraf.hedit(image,"MATCHEDX","T") rrms,drms =0.,0. p=re.match(r'.*fit rms:\s+(?P\d*(\.\d*)?)\s+(?P\d*(\.\d*)?)',msg[i]) if p: self.ra_rms = float(p.group('rrms')) self.de_rms = float(p.group('drms')) print 'napaka rms Ra/Dec: %6.3f" %6.3f"' %(self.ra_rms,self.de_rms) def clean(self,file): if os.access(file,os.F_OK): os.remove(file) def to_hms(x): h = int(x) x -= h x *= 60.0 m = int(x + 1e-6) s = int((x - m - 1e-6)*6000)/100.0 return "%02d:%02d:%05.2f" % (h, m, s) def to_dms(x): if (x>0): znak="+" else: znak="-" x=math.fabs(x) h = int(x) x -= h x *= 60.0 m = int(x + 1e-6) s = int((x - m - 1e-6)*600)/10.0 return "%1s%02d:%02d:%04.1f" % (znak, h, m, s) def str_to_dec(x): z=1.0 z1,z2,z3='','','' p=re.match(r'(?P[+-])?(?P\d{1,2})[: ](?P[+-])?(?P\d{1,2})[: ](?P[+-])?(?P\d{1,2}(\.\d*)?)',x) if p: if p.group('z1')=='-' or p.group('z2')=='-' or p.group('z3')=='-' : z=-1.0 return z*(float(p.group('h'))+float(p.group('m'))/60+float(p.group('s'))/3600) def __usage(): print >> sys.stderr, 'Uporaba: %s [opcije] slike' % sys.argv[0] print >> sys.stderr, '''Opcije: -h,--help to navodilo -v,--verbose vec izpisa -a,--all obdela ponovno Uporaba: $ VegaMatch.py ime_slike.fts (Obdelava ene slike) $ VegaMatch.py imena_slik*.fts (Obdelava serije slik) ''' if __name__ == '__main__': __main() ''' $Log: AllSkyMatch.py,v $ '''