import math

from mathutils import fit_polynomial, PolynomialFunction
from plotutils import plot_line, plot_function
import org.apache.commons.math3.stat.correlation.PearsonsCorrelation as PearsonsCorrelation

if get_exec_pars().source == CommandSource.ui:
    dx = sin
    dy = isin
    interval = 0.10
    window = 40
    p = plot(None, "Data")[0]

if isinstance(dx, basestring):    dx = Channel(dx)
if isinstance(dy, basestring):    dy = Channel(dy)

sd=p.getSeries(0)
sd.setLinesVisible(False)
sd.setPointSize(4)
marker=None

while(True):
    #Sample and plot data
    x=dx.read()  
    y=dy.read()
    sd.appendData(x, y)
    if len(sd.x) > window:
        #Remove First Element
        sd.token.remove(0)    
    ax = sd.x
    ay = sd.y
    if len(ax)>2:
        x1, x2 = min(ax), max(ax)  
        res = (x2-x1)/100     
        if x1!=x2:
            #Display correlation
            corr= PearsonsCorrelation().correlation(to_array(ax,'d'), to_array(ay,'d'))        
            s = "Correlation=" + str(round(corr,4))
            #print s
            if marker is not None: 
                p.removeMarker(marker)
            marker = p.addMarker(x2+res, p.AxisId.X, s,  p.getBackground())
            marker.setLabelPaint(Color.BLACK)
            
            #Calculate, print and plot linear fit
            pars_lin = (a0,a1) = fit_polynomial(ay, ax, 1)
            #print "Fit lin  a1:" , a1, " a0:",a0        
            y1 = poly(x1, pars_lin)
            y2 = poly(x2, pars_lin)
            plot_line(p, x1, y1, x2, y2, width = 2, color = Color.BLUE, name = "Fit Linear")
    
            #Calculate, print and plot quadratic fit
            pars_quad = (a0,a1,a2) = fit_polynomial(ay, ax, 2)
            #print "Fit quad a2:" , a2, "a1:" , a1, " a0:",a0        
            fitted_quad_function = PolynomialFunction(pars_quad)
            ax = frange(x1, x2, res, True)
            plot_function(p, fitted_quad_function, "Fit Quadratic", ax, color=Color.GREEN)
                
    time.sleep(interval)
    