""" Code to convert Stokes parameters to polarization and viceversa
    
Context : SRP
Module  : SRPStokesPol
Author  : Stefano Covino
Date    : 19/02/2012
E-mail  : stefano.covino@brera.inaf.it
URL:    : http://www.merate.mi.astro.it/utenti/covino
Purpose : Convert Stokes parameters to polarization and viceversa

Usage   : SRPStokesPol [-h] [-n n] [-p P eP Theta eTheta Chi eChi]
                    [-s Q eQ U eU V eV] [-v] [--version]

            -n id the number of trials for error computation
            -p P eP Theta eTheta Chi eChi are the normalized polarization parameters
            -s Q eQ U eU V eV  are the normalized Stokes parameters 
    
History : (19/02/2012) First version.

"""

__version__ = '1.0.0'


import argparse, math, sys
import numpy
from SRP.SRPPolarimetry.Pol2Stokes import Pol2Stokes
from SRP.SRPPolarimetry.Stokes2Pol import Stokes2Pol
from SRP.SRPStatistics.GenGaussSet import GenGaussSet
from SRP.SRPStatistics.ScoreatPercentile import ScoreatPercentile



parser = argparse.ArgumentParser()
parser.add_argument("-n", "--ntrial", action="store", type=int, default=1000, help="Number of trials for error computation", metavar='n')
parser.add_argument("-p", "--pol", action="store", type=float, nargs=6, help="Normalized polarization parameters", metavar=('P', 'eP', 'Theta', 'eTheta', 'Chi', 'eChi'))
parser.add_argument("-s", "--stokes", action="store", type=float, nargs=6, help="Normalized Stokes parameters", metavar=('Q', 'eQ', 'U', 'eU', 'V', 'eV'))
parser.add_argument("-v", "--verbose", action="store_true", help="Fully describe operations")
parser.add_argument("--version", action="version", version=__version__)
options = parser.parse_args()


#
if options.ntrial <= 0:
    parser.error ("Number of trials must be positive.")
#
if (options.pol or options.stokes) and not (options.pol and options.stokes):
    if options.stokes:
        if (options.stokes[0]**2 + options.stokes[2]**2 + options.stokes[4]**2) > 1:
            parser.error("Polarization cannot be larger than 1.")
    elif options.pol:
        if options.pol[0] > 1.0:
            parser.error("Polarization cannot be larger than 1.")
    if options.verbose:
        if options.stokes:
            print "Q, eQ: %.3g +/- %.3g" % (options.stokes[0],options.stokes[1])
            print "U, eU: %.3g +/- %.3g" % (options.stokes[2],options.stokes[3])
            print "V, eV: %.3g +/- %.3g" % (options.stokes[4],options.stokes[5])
        elif options.pol:
            print "P, eP        : %.3g +/- %.3g" % (options.pol[0],options.pol[1])
            print "Theta, eTheta: %.3g +/- %.3g" % (options.pol[2],options.pol[3])
            print "Chi, eChi    : %.3g +/- %.3g" % (options.pol[4],options.pol[5])
    #
    if options.stokes:
        pol = Stokes2Pol(1.0,options.stokes[0],options.stokes[2],options.stokes[4]) 
        pols = Stokes2Pol(1.0,GenGaussSet(options.stokes[0],options.stokes[1],options.ntrial),GenGaussSet(options.stokes[2],options.stokes[3],options.ntrial),GenGaussSet(options.stokes[4],options.stokes[5],options.ntrial))
    elif options.pol:
        stokes = Pol2Stokes(1.0,options.pol[0],math.radians(options.pol[2]),math.radians(options.pol[4]))
        stokess = Pol2Stokes(1.0,GenGaussSet(options.pol[0],options.pol[1],options.ntrial),GenGaussSet(math.radians(options.pol[2]),math.radians(options.pol[3]),options.ntrial),GenGaussSet(math.radians(options.pol[4]),math.radians(options.pol[5]),options.ntrial))
    #
    if options.verbose:
        if options.stokes:
            print "P, eP        : %.3g +/- %.3g" % (pol[1],ScoreatPercentile(pols[1])[3])
            print "Theta, eTheta: %.3g +/- %.3g" % (math.degrees(pol[2]),math.degrees(ScoreatPercentile(pols[2])[3]))
            print "Chi, eChi    : %.3g +/- %.3g" % (math.degrees(pol[3]),math.degrees(ScoreatPercentile(pols[3])[3]))
        elif options.pol:
            print "Q, eQ: %.3g +/- %.3g" % (stokes[1],ScoreatPercentile(stokess[1])[3])
            print "U, eU: %.3g +/- %.3g" % (stokes[2],ScoreatPercentile(stokess[2])[3])
            print "V, eV: %.3g +/- %.3g" % (stokes[3],ScoreatPercentile(stokess[3])[3])
    else:
        if options.stokes:
            print "%.3g %.3g %.3g %.3g %.3g %.3g" % (pol[1],ScoreatPercentile(pols[1])[3],math.degrees(pol[2]),math.degrees(ScoreatPercentile(pols[2])[3]),math.degrees(pol[3]),math.degrees(ScoreatPercentile(pols[3])[3]))
        elif options.pol:
            print "%.3g %.3g %.3g %.3g %.3g %.3g" % (stokes[1],ScoreatPercentile(stokess[1])[3],stokes[2],ScoreatPercentile(stokess[2])[3],stokes[3],ScoreatPercentile(stokess[3])[3])
#