""" 

Context : SRP
Module  : SRPAverSigmaClipping.py
Version : 1.0.2
Author  : Stefano Covino
Date    : 18/04/2012
E-mail  : stefano.covino@brera.inaf.astro.it
URL:    : http://www.merate.mi.astro.it/utenti/covino
Purpose : Code to derive sigma-clipped average

Usage   : SRPAverSigmaClipping -i arg1 -d arg2 [-e arg3] [-h] [-k arg4] [-v]
            -i File with input data
            -d Column positions for data.
            -e Column positions for data errors.
            -k Sigma-clipping value


History : (01/10/2010) First version.
        : (18/07/2011) Better cosmetics.
        : (18/04/2012) Standard deviation in output.
"""



import math, sys
from optparse import OptionParser


from SRP.SRPStatistics.AverIterSigmaClipp import AverIterSigmaClipp




parser = OptionParser(usage="usage: %prog -i arg1 -d arg2 [-e arg3] [-h] [-k arg4] [-v]", version="%prog 1.0.1")
parser.add_option("-i", "--inptab", action="store", nargs=1, type="string", dest="inptab", help="File with input data")
parser.add_option("-d", "--datapos", action="store", nargs=1, type="int", dest="datapos", help="Column positions for data.")
parser.add_option("-e", "--edatapos", action="store", nargs=1, type="int", dest="edatapos", help="Column positions for data errors.")
parser.add_option("-k", "--klippvalue", action="store", nargs=1, type="float", dest="klippvalue", default=3.0, help="Sigma-clipping value")
parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="Fully describe operations.")
(options, args) = parser.parse_args()


if options.inptab and options.datapos:
    # files
    try:
        inpi = file(options.inptab)
    except IOError:
        parser.error("File %s can not be accessed." % options.inptab)
    # columns
    if options.datapos < 1:
        parser.error("Column numbers must be grater than 1.")
    if options.edatapos:
        if options.edatapos < 1:
            parser.error("Column numbers must be grater than 1.")            
    # clipping value
    if options.klippvalue <= 0.0:
        parser.error("Sigma-clipping value must be positive.")
    # read lines
    dti = inpi.readlines()
    inpdata = []
    for i in dti:
        il = i.split()
        if options.edatapos:
            try:
                inpdata.append((il[options.datapos-1],il[options.edatapos-1]))
            except IndexError:
                parser.error("Input table does not contain enough columns.")
        else:
            try:
                inpdata.append(il[options.datapos-1])
            except IndexError:
                parser.error("Input table does not contain enough columns.")
    # datachek
    #print inpdata
    for i in range(len(inpdata)):
        if options.edatapos:
            try:
                inpdata[i] = (float(inpdata[i][0]),float(inpdata[i][1]))
            except ValueError:
                parser.error("Incorrect input data.")
        else:
            try:
                inpdata[i] = float(inpdata[i])
            except ValueError:
                parser.error("Incorrect input data.")
    #
    calcvalues = AverIterSigmaClipp(inpdata,options.klippvalue)
    #
    if options.verbose:
        print "Computed average sigma-clipping: %g, standard deviations: %g, standard error: %g, with %d objects (chi2 = %.2g)." % (calcvalues[0], calcvalues[1], calcvalues[2], calcvalues[4], calcvalues[3])
    else:
        print "%g %g %g %d %.2g" % (calcvalues[0], calcvalues[1], calcvalues[2], calcvalues[4], calcvalues[3])
else:
    parser.print_help()
