""" Code to rototranslate science frame files

Context : SRP
Module  : SRPRotoTransla.py
Version : 1.1.3
Author  : Stefano Covino
Date    : 20/05/2012
E-mail  : stefano.covino@brera.inaf.it
URL:    : http://www.merate.mi.astro.it/utenti/covino
Purpose : Rototraslastion parameters for FITS images.

Usage   : SRPRotoTransla [-v] [-h] [-f] -i arg1 -p arg2 arg3 arg4 -r arg5

            -f Filter for FWHM value
            -i Input FITS file
            -p Rototraslation parameters (x0,y0,ang [deg])
            -r Reference FITS file


History : (27/10/2008) First version.
        : (27/11/2008) Logical improvement.
        : (11/09/2009) pyfits transition.
        : (06/08/2011) Better cosmetics.
        : (08/08/2011) Minor bug correction.
        : (20/05/2012) Better import style.
"""



import os, os.path, string, sys, math
from optparse import OptionParser
import SRP.SRPConstants as SRPConstants
import SRP.SRPFiles as SRPFiles
import SRP.SRPUtil as SRPUtil
from SRP.SRPStatistics.AverIterSigmaClipp import AverIterSigmaClipp
import pyfits
from SRP.SRPSystem.Which import Which



parser = OptionParser(usage="usage: %prog [-v] [-h] [-f] -i arg1 -p arg2 arg3 arg4 -r arg5", version="%prog 1.1.3")
parser.add_option("-f", "--fwhmfilter", action="store_true", dest="fwhmf", help="Filter for FWHM value")	
parser.add_option("-i", "--inputfits", action="store", nargs=1, type="string", dest="fitsfile", help="Input FITS file")
parser.add_option("-p", "--pars", action="store", dest="pars", nargs=3, type="float", help="Rototraslation parameters (x0,y0,ang [deg])")
parser.add_option("-r", "--reffits", action="store", nargs=1, type="string", dest="fitsref", help="Reference FITS file")
parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="Fully describe operations")	
(options, args) = parser.parse_args()


if options.fitsfile and options.fitsref and options.pars:
	if os.path.isfile(options.fitsfile):
		if options.verbose:
			print "Input FITS file list is: %s." % options.fitsfile
        else:
		parser.error("Input FITS file %s not found" % options.fitsfile)
	if os.path.isfile(options.fitsref):
		if options.verbose:
			print "Reference FITS file is: %s." % options.fitsref
        else:
		parser.error("Reference FITS file %s not found" % options.fitsref)
        if Which(SRPConstants.SRPpeak) == None:
                parser.error("%s package not found." % SRPConstants.SRPpeak)
        starlist = []
        flist = [options.fitsref,options.fitsfile]
        if options.verbose:
                print "Data extraction..."               
        for i in range(len(flist)):
                stlist = []
                cmd = SRPConstants.SRPpeak+" -f '5 10 15' -F -P '5 10 15' -m clip -k 2 "+flist[i]
                res = SRPFiles.SRPPipe(cmd)
                if res == None:
                        print "FITS file %s can not be processed." % flist[i]
                        sys.exit(SRPConstants.SRPExitFailure)
                for l in res.split(os.linesep):
                        if len(l) > 2:
                                try:
                                        stlist.append(SRPUtil.PeakData(l.split()))
                                except ValueError:
                                        pass
                hhfits = pyfits.open(flist[i])
                hh = hhfits[0].header
                irange = SRPUtil.getRange(hh)
                grange = SRPUtil.getGoodRange(irange,1.0)
                if i == 0:      # ref frame
                        gxmin = grange[0]
                        gxmax = grange[1]
                        gymin = grange[2]
                        gymax = grange[3]
                halfsizeX, halfsizeY = irange[1]/2, irange[3]/2
                del hh
                hhfits.close()
                stlistgood = []
                # remove objects close to the edges
                for l in stlist:
                        if grange[0] < l.X < grange[1] and grange[2] < l.Y < grange[3]:
                                stlistgood.append(l)
                # compute FWHM
                sgclist = []
                for l in stlistgood:
			if l.FWHM > 0.0:
                                sgclist.append(l.FWHM)
                fwhm = AverIterSigmaClipp(sgclist)[0]
                if fwhm == None:
                        fwhm = 5.0
                cmd = SRPConstants.SRPpeak+" -f '%.1f %.1f %.1f' -F -P '%.1f %.1f %.1f' -m clip -k 2  %s" % (fwhm, 2*fwhm, 3*fwhm, fwhm, 2*fwhm, 3*fwhm, flist[i])
                res = SRPFiles.SRPPipe(cmd)
                if res == None:
                        print "FITS file %s can not be processed." % flist[i]
                        sys.exit(SRPConstants.SRPExitFailure)
		stlist = []
                for l in res.split(os.linesep):
                        if len(l) > 2:
                                try:
                                        stlist.append(SRPUtil.PeakData(l.split()))
                                except ValueError:
                                        pass
                stlistgood = []
                # remove objects close to the edges
                for l in stlist:
                        if options.fwhmf:
                                if grange[0] < l.X < grange[1] and grange[2] < l.Y < grange[3] and fwhm*0.75 < l.FWHM < fwhm*1.25:
                                        stlistgood.append(l)
                        else:
                                if grange[0] < l.X < grange[1] and grange[2] < l.Y < grange[3]:
                                        stlistgood.append(l) 
                starlist.append((stlistgood,fwhm,flist[i],(halfsizeX,halfsizeY)))
                if options.verbose:
                        print "FWHM of frame %s: %.2f" % (starlist[-1][2], starlist[-1][1])
        if options.verbose:
                print "Half size (X,Y) of reference frame: %.1f %.1f" % (halfsizeX, halfsizeY)
        if options.verbose:
                print "Roto-traslation..."
        root,ext = os.path.splitext(flist[0])
        f = file(root+'.pos','w')
        f.write("serv_type: catalog"+os.linesep)
        f.write("long_name: SRP catalog for file %s" % root+'.pos'+os.linesep)
        f.write("short_name: %s" % root+'.pos'+os.linesep)
        f.write("url: ./%s" % root+'.pos'+os.linesep)
        f.write("id_col: 0"+os.linesep)
        f.write("x_col: 13"+os.linesep)
        f.write("y_col: 14"+os.linesep)
        f.write("symbol: {} circle 4"+os.linesep)
        f.write("Id\tX\tY\tNpix\tMean\tDev\tMed\tMin\tMax\tFWHMX\tFWHMY\tFWHM\tFlux\tNX\tNY"+os.linesep)
        f.write("---------"+os.linesep)
        listmag = starlist[0][0]
        for i in listmag:
                i.NX,i.NY = SRPUtil.rotoTrasla((i.X,i.Y),0.0,0.0,0.0,starlist[0][3][0],starlist[0][3][1])
                f.write(str(i))
        f.write("EOD"+os.linesep)
        f.close()
        root,ext = os.path.splitext(flist[1])
        f = file(root+'.pos','w')
        f.write("serv_type: catalog"+os.linesep)
        f.write("long_name: SRP catalog for file %s" % root+'.pos'+os.linesep)
        f.write("short_name: %s" % root+'.pos'+os.linesep)
        f.write("url: ./%s" % root+'.pos'+os.linesep)
        f.write("id_col: 0"+os.linesep)
        f.write("x_col: 13"+os.linesep)
        f.write("y_col: 14"+os.linesep)
        f.write("symbol: {} circle 4"+os.linesep)
        f.write("Id\tX\tY\tNpix\tMean\tDev\tMed\tMin\tMax\tFWHMX\tFWHMY\tFWHM\tFlux\tNX\tNY"+os.linesep)
        f.write("---------"+os.linesep)
        listmag = starlist[1][0]
        for i in listmag:
                i.NX,i.NY = SRPUtil.rotoTrasla((i.X,i.Y),options.pars[0],options.pars[1],options.pars[2],starlist[1][3][0],starlist[1][3][1])
                f.write(str(i))
        f.write("EOD"+os.linesep)
        f.close() 
else:
	parser.print_help()
	
