import matplotlib as mpl
# mpl.use('Agg') # necessary to be able to generate the reports even without X server
from matplotlib.pylab import plt
import numpy as np
from .log import Log, ERROR, WARNING, NOTICE
log = Log()

quantity_lookup = {
    "VIS2":     ("VIS2DATA", "VIS2ERR","vis2"),
    "VIS2DATA": ("VIS2DATA", "VIS2ERR","vis2"),
    "T3PHI" : ("T3PHI", "T3PHIERR","oi_t3"),
    "T3AMP" : ("T3AMP", "T3AMPERR","oi_t3"),
    "VISAMP": ("VISAMP", "VISAMPERR","vis"),
    "VISPHI": ("VISPHI", "VISPHIERR","vis")
}


#
# get and format a single data, we can triger specific query and post processing
# for "BASELINE", "BASENAME", "SP_FREQ"... but surely more interesting for further
# sorting to actually define these column and fill them
#
def get_data_for_plot(db, tbl, value, tbls="", const="", func=None, flatten=True):
    if tbl=="flux":
        str = "SELECT "+value+" from "+tbl+",targets,wavelengths,headers,arrays as ar1"+tbls+" where ar1.[FILEID]="+tbl+".[FILEID] and ar1.STA_INDEX="+tbl+".STA1_INDEX and "+tbl+".[FILEID]=targets.[FILEID] and "+tbl+".[TARGET_ID]=targets.[TARGET_ID] and wavelengths.[FILEID]="+tbl+".[FILEID] and wavelengths.[INSNAME]="+tbl+".[INSNAME] and headers.[FILEID]="+tbl+".[FILEID] "+const
    elif tbl=="t3":
        str = "SELECT "+value+" from "+tbl+",targets,wavelengths,headers,arrays as ar1,arrays as ar2,arrays as ar3"+tbls+" where ar1.[FILEID]="+tbl+".[FILEID] and ar1.STA_INDEX="+tbl+".STA1_INDEX and ar2.[FILEID]="+tbl+".[FILEID] and ar2.STA_INDEX="+tbl+".STA2_INDEX and ar3.STA_INDEX="+tbl+".STA3_INDEX and "+tbl+".[FILEID]=targets.[FILEID] and "+tbl+".[TARGET_ID]=targets.[TARGET_ID] and wavelengths.[FILEID]="+tbl+".[FILEID] and wavelengths.[INSNAME]="+tbl+".[INSNAME] and headers.[FILEID]="+tbl+".[FILEID] "+const
    else:
        str = "SELECT "+value+" from "+tbl+",targets,wavelengths,headers,arrays as ar1,arrays as ar2"+tbls+" where ar1.[FILEID]="+tbl+".[FILEID] and ar1.STA_INDEX="+tbl+".STA1_INDEX and ar2.[FILEID]="+tbl+".[FILEID] and ar2.STA_INDEX="+tbl+".STA2_INDEX and "+tbl+".[FILEID]=targets.[FILEID] and "+tbl+".[TARGET_ID]=targets.[TARGET_ID] and wavelengths.[FILEID]="+tbl+".[FILEID] and wavelengths.[INSNAME]="+tbl+".[INSNAME] and headers.[FILEID]="+tbl+".[FILEID] "+const

    data = db.execute(str).fetchall()

    if flatten is True:
        data = list(zip( *data ))[0]

    if func is not None:
        data = [ func(d) for d in data ]

    return data

#
# Very fast routine to plot a scatter of variable
# Main drawback: marker cannot be vectorialised.
#
def plot_couple(db, tbl, x, y, yerr=None, xerr=None, axes=None,
                xfunc=None,yfunc=None,eyfunc=None,exfunc=None,
                const="", constx="", consty="", tbls="", **kwargs):

    xdatas = get_data_for_plot(db, tbl, x, const=const+constx, func=xfunc, tbls=tbls);
    ydatas = get_data_for_plot(db, tbl, y, const=const+consty, func=yfunc, tbls=tbls);
    if yerr is not None: eydatas = get_data_for_plot(db, tbl, yerr, const=const+consty, func=eyfunc, tbls=tbls);
    if xerr is not None: exdatas = get_data_for_plot(db, tbl, xerr, const=const+constx, func=exfunc, tbls=tbls);

    print(xdatas)
    print(ydatas)
    print(exdatas)
    print(eydatas)
    # plot error bars
    if yerr is not None:
        i,j,k = axes.errorbar(xdatas,ydatas,linestyle="none",yerr=eydatas,c='gray')
        k[0].set_alpha(0.3)
        j[0].set_alpha(0.3)
        j[1].set_alpha(0.3)

    if yerr is not None and xerr is not None:
        i,j,k = axes.errorbar(xdatas,ydatas,linestyle="none",yerr=eydatas,xerr=exdatas,c='gray')
        k[0].set_alpha(0.3)
        j[0].set_alpha(0.3)
        j[1].set_alpha(0.3)

    # plot symbols
    axes.scatter( xdatas, ydatas, zorder=100, **kwargs )



def make_dictionary(db, values, query, row2key=lambda r:r[0]):
    """ values can be an iterable or a function with signature (i,N,r)
    where i is the row index 0,1,2,3 ,....,N ;  N the number of row and
    r is the value of that row
    """
    c = db.execute(query)
    if hasattr(values, "__call__"):
        func = values
        rows = [(row2key(r),r) for r in c]
        Nkeys = len(rows)
        return {k:func(i,Nkeys,r) for i,(k,r) in enumerate(rows)}
    else:
        N = len(values)
        return {row2key(r):values[i%N] for i,r in enumerate(c)}

def make_target_dictionary(db, values=list("bgrkcy")):
    query="SELECT DISTiNCT TARGET FROM targets"
    return make_dictionary(db, values, query, lambda r:r[0])

def make_setup_dictionary(db, values=list("osx21")):
    query="SELECT DISTiNCT [ESO INS SPEC RES],[ESO INS POLA MODE],[ESO INS TIM2 PERIOD],[ESO DET2 SEQ1 DIT] FROM headers"
    return make_dictionary(db, values, query, lambda r:tuple(r))

def axes_maker(fig=None, orientation=0,extra=lambda ax,r:None,
               sharex=False, sharey=False, **kwargs):
    fig = fig or plt.gcf()
    if orientation:
        def make_ax(i,N,r):
            ax = fig.add_subplot(N, 1,i+1, **kwargs)
            if not i and sharey: kwargs["sharey"] = ax
            ax.first_axes =  not i
            ax.last_axes  =  i==(N-1)
            extra(ax,r)
            return ax
    else:
        def make_ax(i,N,r):
            ax = fig.add_subplot(N, i+1,1, **kwargs)
            if not i and sharex: kwargs["sharex"] = ax
            ax.first_axes =  not i
            ax.last_axes  =  i==(N-1)
            extra(ax,r)
            return ax
    return make_ax

def _extra_base(ax,r):
    ax.set_title(r[2]+r[3])

def make_base_dictionary(db, maker=None, tbl="vis2"):
    """ e.g.:  make_base_dictionary(db, axes_maker(fig)) """
    if maker is None:
        maker = axes_maker(extra=_extra_base)
    query = "SELECT DISTINCT STA1_NAME, STA2_NAME, ar1.STA_NAME, ar2.STA_NAME FROM %s, arrays as ar1, arrays as ar2 WHERE STA1_INDEX = ar1.STA_INDEX AND STA2_INDEX = ar2.STA_INDEX "%tbl
    return make_dictionary(db, maker, query, lambda r:r[0:2])

def _extra_triplet(ax,r):
    ax.set_title(r[3]+r[4]+r[5])

def make_triplet_dictionary(db, maker=None, tbl="oi_t3"):
    """ e.g.:  make_triplet_dictionary(db, axes_maker(fig)) """
    if maker is None:
        maker = axes_maker(extra=_extra_triplet)

    query = "SELECT DISTINCT STA1_INDEX, STA2_INDEX, STA3_INDEX, ar1.STA_NAME, ar2.STA_NAME, ar3.STA_NAME FROM %s, arrays as ar1, arrays as ar2, arrays as ar3 WHERE STA1_INDEX = ar1.STA_INDEX AND STA2_INDEX = ar2.STA_INDEX AND STA3_INDEX = ar3.STA_INDEX"%tbl
    return make_dictionary(db, maker, query, lambda r:r[0:3])

def plot_trend_val(db, name, axes=None, setup=None, base=None, **kwargs):
    if axes is None:
        axes = plt.gca()

    name, name_err, tbl  = quantity_lookup[name]

    markers = ["o","s","x","2","1"]
    colors  = list("bgrcmy")

    ncolor = len(colors)
    nmarkers = len(markers)

    #setups = db.get_values(["setup_keys", "setup_vals"], tbls=["setups"])
    #for i,(skeys, svals) in enumerate(setups):
    #    setup = i
    keys = ["mean(%s, WImin, WImax)"%name]
    if name_err:
        keys += ["mean(%s, WImin, WImax)"%name_err]

    keys += ["MJD", "TARGET", "ESO INS SPEC RES", "ESO INS POLA MODE", "ESO INS TIM2 PERIOD", "ESO DET2 SEQ1 DIT"]

    data = db.get_values(keys,
                          tbls=[tbl, "waveindex", "targets", "headers"],
                          inside="recarray",
                          base=base,
                           **kwargs
                        )
    setups = np.array([r+"_"+p+"_"+t1+"_"+t2 for r,p,t1,t2 in zip(data["ESO INS SPEC RES"], data["ESO INS POLA MODE"],data["ESO INS TIM2 PERIOD"], data["ESO DET2 SEQ1 DIT"])])

    setupset = set(setups)
    axes.targets = []
    for i, setup in enumerate(setupset):
        ou, = np.where(setups==setup)
        subdata = data[ou]

        targets = set(subdata['TARGET'])
        for j,target in enumerate(targets):
            ou, = np.where(subdata['TARGET']==target)
            d = subdata[ou]

            color = colors[j%ncolor]
            marker = markers[i%nmarkers]

            fmt = color+marker
            if name_err:
                axes.errorbar(d["MJD"],d[name], yerr=d[name_err], label=target, color=color, ecolor=color, marker=marker, linestyle="none")
            else:
                axes.plot(d["MJD"],d[name], fmt, label=target)

            axes.targets.append( (np.min(d["MJD"]), target) )
    return axes

def plot_vis2(db, legbase="", **kwargs):

    a = plot_trend_val(db, "VIS2DATA", **kwargs)
    a.set_ylim(-0.1, 1.2)
    a.set_ylabel("$Vis^2$ ")
    a.set_xlabel("MJD")
    plot_base_legend(a, legbase)
    a.grid()
    return a

def plot_visAmp(db, legbase="", **kwargs):

    a = plot_trend_val(db, "VISAMP", **kwargs)
    a.set_ylim(-0.1, 1.2)
    a.set_ylabel("$VisAmp$ ")
    a.set_xlabel("MJD")
    plot_base_legend(a, legbase)
    a.grid()
    return a

def plot_t3phi(db, legbase="", **kwargs):

    a = plot_trend_val(db, "T3PHI", **kwargs)
    a.set_ylim(-190, 190)
    a.set_ylabel("$T3phi [deg]$ ")
    a.set_xlabel("MJD")
    plot_base_legend(a, legbase)
    a.grid()
    return a


def plot_base_legend(axes, txt):
    axes.text(0.02, 0.9, txt,
          horizontalalignment='left',
          verticalalignment='center',
          transform=axes.transAxes)

def plot_target_legend(axes, ypos=1.0, **kwargs):
    targets = getattr(axes,"targets", [])
    kwargs.setdefault("rotation", 70)

    for mjd, name in targets:
        axes.text(mjd, ypos, name , **kwargs)

def legend_figure(fig, pos="upper right", **kwargs):
    legs = [(l,l.get_label()) for l in fig.axes[0].lines if not l.get_label().startswith("_")]
    legs = list(zip(*legs))+[pos]
    fig.legend(*legs,**kwargs)


def plot_all(db, plot_func, plotname="", version="", ext=".pdf", save=False, **kwargs):

    kwargs.pop("DET_NAME", None)
    kwargs.pop("base", None)

    configs_data = db.get_values(["STA_INDEX", "TEL_NAME", "STA_NAME"], tbls=["arrays"], inside="recarray")

    #patche
    configs_data = configs_data[  np.array( [tel.startswith("AT") for tel in configs_data["TEL_NAME"]] ) ]

    stations = configs_data["STA_INDEX"]

#    bases = []
#    bnames = []
#    for i,sta1 in enumerate(stations):
#        for j,sta2 in enumerate(stations[i+1:], start=i+1):
#            N = len(db.get_values(["MJD"], tbls=["vis2","arrays"], base=(sta1,sta2)))
#            if N:
#                bases.append((sta1,sta2))
#                bnames.append(configs_data[i]["STA_NAME"]+configs_data[j]["STA_NAME"])
#

    bases= [(10, 13), (10, 5), (10, 1), (13, 5), (13, 1), (5, 1)]
    bnames = ['B2A0','C1A0','C1B2','C1D0','D0A0','D0B2']

    fig_ft, subplots_ft =  plt.subplots(len(bases),1, sharex = True)
    fig_sc, subplots_sc =  plt.subplots(len(bases),1, sharex = True)
    fig_ft.subplots_adjust(hspace=0.0)
    fig_sc.subplots_adjust(hspace=0.0)
    for axes_sc, axes_ft, base, bname in zip(subplots_sc.flat, subplots_ft.flat,  bases, bnames):
        log.notice("Ploting base %s,%s"%base)
        plot_func(db, base=base, axes=axes_sc, legbase=bname,  DET_NAME="sc", **kwargs)
        plot_func(db, base=base, axes=axes_ft, legbase=bname,  DET_NAME="ft", **kwargs)

    fig_sc.filename = plotname+version+"_SC"+ext
    fig_ft.filename = plotname+version+"_FT"+ext
    if save:
        if not isinstance(save, str):
            save = "./"
        for fig in [fig_sc, fig_ft]:
            fig.set_size_inches(8.267,11.692) # A4 paper
            fig.suptitle(fig.filename)
            fig.savefig(save+"/"+fig.filename, orientation='portrait', papertype="a4")

            log.notice(save+"/"+fig.filename+" saved")
    return fig_sc, fig_ft


def plot_all_trending(db, **kwargs):
    log.notice("Plotting VIS2 trend for SC and FT ")
    plot_all(db, plot_vis2, plotname=kwargs.pop("plotname","VIS2"), **kwargs)

    log.notice("Plotting VISAMP trend for SC and FT ")
    plot_all(db, plot_visAmp, plotname=kwargs.pop("plotname","VISAMP"), **kwargs)

def thibase(stations):
    return "ar1.STA_NAME='"+stations[0]+"' and ar2.STA_NAME='"+stations[1]+"'"


def plot_all_trending_new(db):
    # list of existing bases (discard the 'S' station)
    # base = zip(*db.execute("select distinct BASENAME from vis2 where BASENAME not like 'S%'").fetchall())[0]
    baselist = db.execute("select distinct ar1.STA_NAME, ar2.STA_NAME from vis2,arrays as ar1,arrays as ar2 where ar1.[FILEID]=vis2.[FILEID] and ar2.[FILEID]=vis2.[FILEID] and ar1.STA_INDEX=vis2.STA1_INDEX and ar2.STA_INDEX=vis2.STA2_INDEX").fetchall()

    baselist = [ (i,j) for i,j in baselist if i[0]!='S']

    # VIS2 for SC and FT
    fig, subplots =  plt.subplots(6, 1, sharex = True)
    fig.subplots_adjust(hspace=0.0)
    fig.set_size_inches(8.267,11.692)
    fig.suptitle("VIS2 FT (red) and SC (blue)")

    for i,axes in enumerate(subplots):
        plot_couple(db,"vis2","MJD","VIS2DATA_MED",yerr="VIS2ERR_MED",
            # yfunc=np.median,eyfunc=np.median,
            axes=axes,
            const="and det(vis2.INSNAME)='FT' and "+thibase(baselist[i]),
            marker='o',c='r')

        plot_couple(db,"vis2","MJD","VIS2DATA_MED",yerr="VIS2ERR_MED",
            # yfunc=np.median,eyfunc=np.median,
            axes=axes,
            const="and det(vis2.INSNAME)='SC' and "+thibase(baselist[i]),
            marker='+',c='b')

        axes.set_ylim(-0.1, 1.2)
        axes.grid()
        axes.set_ylabel("VIS2 "+baselist[i][0]+baselist[i][1])

    axes.set_xlabel("MJD")
    fig.savefig("VIS2_FT_SC.png", orientation='portrait', papertype="a4")
    log.notice("VIS2_FT_SC.png saved")

    # VISAMP for SC and FT
    fig, subplots =  plt.subplots(6, 1, sharex = True)
    fig.subplots_adjust(hspace=0.0)
    fig.set_size_inches(8.267,11.692)
    fig.suptitle("VISAMP FT (red) and SC (blue)")

    for i,axes in enumerate(subplots):
        plot_couple(db,"vis","MJD","VISAMP_MED",yerr="VISAMPERR_MED",
            # yfunc=np.median,eyfunc=np.median,
            axes=axes,
            const="and det(vis.INSNAME)='FT' and "+thibase(baselist[i]),
            marker='o',c='r')

        plot_couple(db,"vis","MJD","VISAMP_MED",yerr="VISAMPERR_MED",
            # yfunc=np.median,eyfunc=np.median,
            axes=axes,
            const="and det(vis.INSNAME)='SC' and "+thibase(baselist[i]),
            marker='+',c='b')

        axes.set_ylim(-0.1, 1.2)
        axes.grid()
        axes.set_ylabel("VISAMP "+baselist[i][0]+baselist[i][1])

    axes.set_xlabel("MJD")
    fig.savefig("VISAMP_FT_SC.png", orientation='portrait', papertype="a4")
    log.notice("VISAMP_FT_SC.png saved")

    # VISPHI for SC and FT
    fig, subplots = plt.subplots(6, 1, sharex = True)
    fig.subplots_adjust(hspace=0.0)
    fig.set_size_inches(8.267,11.692)
    fig.suptitle("VISPHI FT (red) and SC (blue)")

    for i,axes in enumerate(subplots):
        plot_couple(db,"vis","MJD","VISPHI_MED",yerr="VISPHIERR_MED",
            # yfunc=np.median,eyfunc=np.median,
            axes=axes,
            const="and det(vis.INSNAME)='FT' and "+thibase(baselist[i]),
            marker='o',c='r')

        plot_couple(db,"vis","MJD","VISPHI_MED",yerr="VISPHIERR_MED",
            # yfunc=np.median,eyfunc=np.median,
            axes=axes,
            const="and det(vis.INSNAME)='SC' and "+thibase(baselist[i]),
            marker='+',c='b')

        # axes.set_ylim(-0.1, 1.2)
        axes.grid()
        axes.set_ylabel("VISPHI "+baselist[i][0]+baselist[i][1])

    axes.set_xlabel("MJD")
    fig.savefig("VISPHI_FT_SC.png", orientation='portrait', papertype="a4")
    log.notice("VISPHI_FT_SC.png saved")

    # # VISPHI-POLAR-DIFF for SC and FT
    # fig, subplots = plt.subplots(6, 1, sharex = True)
    # fig.subplots_adjust(hspace=0.0)
    # fig.set_size_inches(8.267,11.692)
    # fig.suptitle("VISPHI FT (red) and SC (blue)")
    #
    # for i,axes in enumerate(subplots):
    #     plot_couple(db,"vis","vis.VISPHI","vis.VISPHI - vis_p2.VISPHI", #yerr="vis.VISPHIERR",
    #         yfunc=np.median,xfunc=np.median,axes=axes,
    #         tbls=",vis as vis_p2",
    #         const="and vis.BASENAME='"+base[i]+"' and vis.BASENAME=vis_p2.BASENAME and vis.INSNAME='SPECTRO_FT_P1' and vis_p2.INSNAME='SPECTRO_FT_P2' and vis.FILEID=vis_p2.FILEID and vis.MJD=vis_p2.MJD",
    #         marker='o',c='r')
    #     #plot_couple(db,"vis","vis.VISPHI","vis_p2.VISPHI", #yerr="vis.VISPHIERR",
    #     #    yfunc=np.median,xfunc=np.median,axes=axes,
    #     #    tbls=",vis as vis_p2",
    #     #    const="and vis.BASENAME='"+base[i]+"' and vis.BASENAME=vis_p2.BASENAME and vis.INSNAME='SPECTRO_SC_P1' and vis_p2.INSNAME='SPECTRO_SC_P2' and vis.FILEID=vis_p2.FILEID and vis.MJD=vis_p2.MJD",
    #     #    marker='+',c='b')
    #
    #     # axes.set_ylim(-0.1, 1.2)
    #     axes.grid()
    #     axes.set_ylabel("PHIDIFF "+base[i])
    #
    # axes.set_xlabel("MJD")
    # fig.savefig("VISPHI_PDIFF_FT_SC.png", orientation='portrait', papertype="a4")
    # log.notice("VISPHI_PDIFF_FT_SC.png saved")

#    # T3PHI
#    triplets = zip(*db.execute("select distinct BASENAME from t3 where BASENAME not like 'S%'").fetchall())[0]
#
#    fig, subplots =  plt.subplots(len(triplets), 1, sharex = True)
#    fig.subplots_adjust(hspace=0.0)
#    fig.set_size_inches(8.267,11.692)
#    fig.suptitle("T3PHI FT (red) and SC (blue)")
#
#    for i,axes in enumerate(subplots):
#        plot_couple(db,"t3","MJD","T3PHI",yerr="T3PHIERR",
#            yfunc=np.median,eyfunc=np.median,axes=axes,
#            const="and det(t3.INSNAME)='FT' and "+thibase(baselist[i]),
#            marker='o',c='r')
#
#        plot_couple(db,"t3","MJD","T3PHI",yerr="T3PHIERR",
#            yfunc=np.median,eyfunc=np.median, axes=axes,
#            const="and det(t3.INSNAME)='SC' and "+thibase(baselist[i]),
#            marker='+',c='b')
#
#        axes.set_ylim(-190, 190)
#        axes.grid()
#        axes.set_ylabel("T3PHI "+triplets[i])
#
#    axes.set_xlabel("MJD")
#    fig.savefig("T3PHI_FT_SC.png", orientation='portrait', papertype="a4")
#    log.notice("T3PHI_FT_SC.png saved")
#
#    # FLUX
#    tel = zip(*db.execute("select distinct BASENAME from flux where BASENAME not like 'S%'").fetchall())[0]
#
#    fig, subplots = plt.subplots(len(tel), 1, sharex = True)
#    fig.subplots_adjust(hspace=0.0)
#    fig.set_size_inches(8.267,11.692)
#    fig.suptitle("FLUX FT (red) and SC (blue)")
#
#    for i,axes in enumerate(subplots):
#        plot_couple(db,"flux","MJD","FLUX",yerr="FLUXERR",
#            yfunc=np.median,eyfunc=np.median,axes=axes,
#            const="and det(flux.INSNAME)='FT' and BASENAME='"+tel[i]+"'",
#            marker='o',c='r')
#
#        plot_couple(db,"flux","MJD","FLUX",yerr="FLUXERR",
#            yfunc=np.median,eyfunc=np.median, axes=axes,
#            const="and det(flux.INSNAME)='SC' and BASENAME='"+tel[i]+"'",
#            marker='+',c='b')
#
#        axes.grid()
#        axes.set_ylabel("FLUX "+tel[i])
#        axes.set_yscale('log')
#
#    axes.set_xlabel("MJD")
#    fig.savefig("FLUX_FT_SC.png", orientation='portrait', papertype="a4")
#    log.notice("FLUX_FT_SC.png saved")


def plot_all_correlations(db):
    fig, subplots =  plt.subplots(3, 2)
    fig.set_size_inches(8.267,11.692) # A4 paper
    fig.subplots_adjust(wspace=0.3,hspace=0.3)

    axes = subplots[0][0]
    plot_couple(db,"vis","vis.VISAMP","vis_ft.VISAMP",yerr="vis_ft.VISAMPERR",xerr="vis.VISAMPERR",
        yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
        tbls=",vis as vis_ft",
        const=" and vis.[FILEID]=vis_ft.[FILEID] and vis.[BASENAME]=vis_ft.[BASENAME] and vis.[INSNAME]='SPECTRO_SC_P1' and vis_ft.[INSNAME]='SPECTRO_FT_P1' ",
        marker='o',c='g')
    axes.grid()
    axes.set_ylim(-0.1, 1.2)
    axes.set_xlim(-0.1, 1.2)
    axes.set_xlabel("VISAMP SC")
    axes.set_ylabel("VISAMP FT")

    axes=subplots[0][1]
    plot_couple(db,"vis2","vis2.VIS2DATA","vis2_ft.VIS2DATA",yerr="vis2_ft.VIS2ERR",xerr="vis2.VIS2ERR",
         yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
         tbls=",vis2 as vis2_ft",
         const=" and vis2.[FILEID]=vis2_ft.[FILEID] and vis2.[BASENAME]=vis2_ft.[BASENAME] and vis2.[INSNAME]='SPECTRO_SC_P1' and vis2_ft.[INSNAME]='SPECTRO_FT_P1'",
         marker='o',c='g')
    axes.grid()
    axes.set_ylim(-0.1, 1.2)
    axes.set_xlim(-0.1, 1.2)
    axes.set_xlabel("VIS2 SC")
    axes.set_ylabel("VIS2 FT")

    axes=subplots[1][1]
    plot_couple(db,"vis","vis.VISAMP","vis2.VIS2DATA",xerr="vis.VISAMPERR",yerr="vis2.VIS2ERR",
         yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
         tbls=",vis2",
         const=" and vis.[FILEID]=vis2.[FILEID] and vis.[BASENAME]=vis2.[BASENAME] and vis.[INSNAME]=vis2.[INSNAME] and vis.[INSNAME] like 'SPECTRO_FT_%'",
         marker='o',c='r')
    plot_couple(db,"vis","vis.VISAMP","vis2.VIS2DATA",xerr="vis.VISAMPERR",yerr="vis2.VIS2ERR",
         tbls=",vis2",
         yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
         const=" and vis.[FILEID]=vis2.[FILEID] and vis.[BASENAME]=vis2.[BASENAME] and vis.[INSNAME]=vis2.[INSNAME] and vis.[INSNAME] like 'SPECTRO_SC_%'",
         marker='+',c='b')
    axes.grid()
    axes.set_ylim(-0.1, 1.2)
    axes.set_xlim(-0.1, 1.2)
    axes.set_xlabel("VISAMP")
    axes.set_ylabel("VIS2DATA")

    # VIS2DATA between polars
    axes=subplots[2][1]
    plot_couple(db,"vis2","vis2.VIS2DATA","vis2_p2.VIS2DATA",xerr="vis2.VIS2ERR",yerr="vis2_p2.VIS2ERR",
         yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
         tbls=",vis2 as vis2_p2",
         const=" and vis2.[FILEID]=vis2_p2.[FILEID] and vis2.[BASENAME]=vis2_p2.[BASENAME] and vis2.[INSNAME]='SPECTRO_SC_P1' and vis2_p2.[INSNAME]='SPECTRO_SC_P2'",
         marker='o',c='r')
    plot_couple(db,"vis2","vis2.VIS2DATA","vis2_p2.VIS2DATA",xerr="vis2.VIS2ERR",yerr="vis2_p2.VIS2ERR",
         yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
         tbls=",vis2 as vis2_p2",
         const=" and vis2.[FILEID]=vis2_p2.[FILEID] and vis2.[BASENAME]=vis2_p2.[BASENAME] and vis2.[INSNAME]='SPECTRO_FT_P1' and vis2_p2.[INSNAME]='SPECTRO_FT_P2'",
         marker='+',c='b')
    axes.grid()
    axes.set_ylim(-0.1, 1.2)
    axes.set_xlim(-0.1, 1.2)
    axes.set_xlabel("VIS2 P1")
    axes.set_ylabel("VIS2 P2")

    # VISAMP between polars
    axes=subplots[2][0]
    plot_couple(db,"vis","vis.VISAMP","vis_p2.VISAMP",xerr="vis.VISAMPERR",yerr="vis_p2.VISAMPERR",
         yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
         tbls=",vis as vis_p2",
         const=" and vis.[FILEID]=vis_p2.[FILEID] and vis.[BASENAME]=vis_p2.[BASENAME] and vis.[INSNAME]='SPECTRO_SC_P1' and vis_p2.[INSNAME]='SPECTRO_SC_P2'",
         marker='o',c='r')
    plot_couple(db,"vis","vis.VISAMP","vis_p2.VISAMP",xerr="vis.VISAMPERR",yerr="vis_p2.VISAMPERR",
         yfunc=np.median, xfunc=np.median, eyfunc=np.median, exfunc=np.median, axes=axes,
         tbls=",vis as vis_p2",
         const=" and vis.[FILEID]=vis_p2.[FILEID] and vis.[BASENAME]=vis_p2.[BASENAME] and vis.[INSNAME]='SPECTRO_FT_P1' and vis_p2.[INSNAME]='SPECTRO_FT_P2'",
         marker='+',c='b')
    axes.grid()
    axes.set_ylim(-0.1, 1.2)
    axes.set_xlim(-0.1, 1.2)
    axes.set_xlabel("VISAMP P1")
    axes.set_ylabel("VISAMP P2")

    fig.savefig("Correlations.png", orientation='portrait', papertype="a4")
    log.notice("Correlations.png saved")

def plot_all_uv(db):
    fig, subplots =  plt.subplots(3, 2)
    fig.set_size_inches(8.267,11.692) # A4 paper
    fig.subplots_adjust(wspace=0.3,hspace=0.3)

    axes = subplots[0][0]
    plot_couple(db,"vis","UCOORD","VCOORD",   axes=axes, const=" and vis.INSNAME like '%FT%'", marker='+',c='b')
    plot_couple(db,"vis","-UCOORD","-VCOORD", axes=axes, const=" and vis.INSNAME like '%FT%'", marker='+',c='b')
    axes.set_xlabel("UCOORD FT")
    axes.set_ylabel("VCOORD FT")
    axes.grid()

    axes = subplots[0][1]
    plot_couple(db,"vis","UCOORD","VCOORD",   axes=axes, const=" and vis.INSNAME like '%SC%'", marker='o',c='r')
    plot_couple(db,"vis","-UCOORD","-VCOORD", axes=axes, const=" and vis.INSNAME like '%SC%'", marker='o',c='r')
    axes.set_xlabel("UCOORD SC")
    axes.set_ylabel("VCOORD SC")
    axes.grid()

    fig.savefig("uv.png", orientation='portrait', papertype="a4")
    log.notice("uv.png saved")
