
""" Code to compute target visibility

Context : SRP
Module  : SRPVisibility.py
Version : 1.4.1
Author  : Stefano Covino
Date    : 12/09/2011
E-mail  : stefano.covino@brera.inaf.it
URL:    : http://www.merate.mi.astro.it/~covino
Purpose : Compute target visibility, Moon and Sun separation.

Usage   : SRPVisibility  [-h] [-l arg1 arg2 / -s arg3] -o arg4 [-t arg5] [-v]
            -l Coordinate location of observing site (dd:mm:ss or dd.dddd)
            -s Observing site
            -o Object coordinates (hh:mm:ss dd:mm:ss or hh.ddd dd.ddd)
            -t Computation time ('yyy/mm/dd hh:mm:ss')


History : (20/12/2003) First version.
        : (01/09/2004) Better coordinate management.
        : (03/02/2005) Optparse.
        : (21/05/2005) Sun altitude.
        : (01/08/2009) Coordinated in degrees in output.
        : (17/03/2010) Astrometric coordinates. 
        : (12/09/2011) Better cosmetics.
"""


import ephem
from optparse import OptionParser
import SRP.SRPConstants as SRPConstants
import SRP.SRPUtil as SRPUtil
import SRP.TimeAstro_algs as TimeAstro_algs



parser = OptionParser(usage="usage: %prog [-h] [-l arg1 arg2 / -s arg3] -o arg4 [-t arg5] [-v]", version="%prog 1.4.1")
parser.add_option("-l", "--location", action="store", nargs=2, type="string", dest="locat", help="Coordinate location of observing site (dd:mm:ss or dd.dddd).")
parser.add_option("-o", "--object", action="store", nargs=2, type="string", dest="object", help="Object coordinates (hh:mm:ss dd:mm:ss or hh.ddd dd.ddd)")
parser.add_option("-s", "--site", action="store", nargs=1, type="string", dest="site", help="Name of observing site.")
parser.add_option("-t", "--time", action="store", nargs=1, type="string", dest="time", help="Computation time ('yyy/mm/dd hh:mm:ss')")
parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="Fully describe operations.")
(options, args) = parser.parse_args()


Site = ephem.Observer()
if options.locat:
        Site.lat = str(options.locat[0])
        Site.long = str(options.locat[1])
elif options.site: 
        if options.site in SRPConstants.SiteDict.keys():
                Site.lat = str(SRPConstants.SiteDict[options.site].Lat)
                Site.long = str(SRPConstants.SiteDict[options.site].Long)
        else:
                print "Available sites: "
		for entr in SRPConstants.SiteDict.keys():
			print SRPConstants.SRPTab+entr
                parser.error("Site %s is not recognized." % options.site)
else:
        Site.lat = str(SRPConstants.SiteDict['LaSilla'].Lat)
        Site.long = str(SRPConstants.SiteDict['LaSilla'].Long)
if options.time:
        Site.date = options.time

sun = ephem.Sun(Site)
moon = ephem.Moon(Site)

if options.object:
        nb = ephem.readdb('SRP Object,f|M|sp,'+options.object[0]+','+options.object[1]+',0,'+'2000')
        nb.compute(Site)
        if options.verbose:
                print "Site coordinates        : Latitude %s, Longitude %s" % (Site.lat, Site.long)
                print "Target coordinates      : RA %s, DEC %s" % (nb.a_ra, nb.a_dec)
                print "Target coordinates (deg): RA %.5f, DEC %.5f" % (SRPUtil.rad2deg(float(nb.a_ra)), SRPUtil.rad2deg(float(nb.a_dec)))
        if options.verbose:
                print "Computation time: %s" % Site.date
                print "Target Althazimuthal coordinates      : AZ %s, ALT %s" % (nb.az, nb.alt)
                print "Target Althazimuthal coordinates (deg): AZ %.5f, ALT %.5f" % (SRPUtil.rad2deg(float(nb.az)), SRPUtil.rad2deg(float(nb.alt)))

                print "Moon separation: %s" % ephem.separation((moon.az,moon.alt), (nb.az,nb.alt))
                print "Sun separation: %s" % ephem.separation((sun.az,sun.alt), (nb.az,nb.alt))
                print "Sun altitude: %s" % sun.alt
        else:
                print "%.5f %.5f %.5f %.5f %.5f %.5f %.5f %.5f" % (Site.date-ephem.date('2000/1/1 0:0:0'), 
                        TimeAstro_algs.rad_to_deg(float(nb.az)), TimeAstro_algs.rad_to_deg(float(nb.alt)), 
                        TimeAstro_algs.rad_to_deg(ephem.separation((moon.az,moon.alt), (nb.az,nb.alt))), 
                        TimeAstro_algs.rad_to_deg(ephem.separation((sun.az,sun.alt), (nb.az,nb.alt))),
                        TimeAstro_algs.rad_to_deg(float(sun.alt)), SRPUtil.rad2deg(float(nb.a_ra)), 
                        SRPUtil.rad2deg(float(nb.a_dec)))
else:
        parser.print_help()








