#! /usr/bin/env python

from mcd import mcd
from myplot import maplatlon
import numpy as np
import matplotlib.pyplot as mpl

from math import isnan

from ppplot import writeascii


from scipy import stats


dafile = "/home/aymeric/Work/submitted/coauthorship/2012reiss/reiss_data.txt"

yorgl = np.loadtxt(dafile)
yorgl = np.transpose(yorgl)
ddwind = yorgl[5]
ddwinddir = yorgl[6]
ddwinderror = yorgl[9]

ddheight = yorgl[7]
ddheighterror = yorgl[8]

#ddheight = yorgl[7]*0. + 10.
#ddheighterror = yorgl[8]*0. + 0.5

stddev = np.std(ddwind[np.where(ddwind != -999.)])
print stddev

## missing points are NaN
ind = np.where(ddwind == -999.) ; ddwind[ind] = np.NaN
print "1. wind not available", yorgl[0][ind]
ind = np.where(ddheight == -999.) ; ddwind[ind] = np.NaN
print "1. height not available", yorgl[0][ind]
## no data point with rel error more than x%
#ind = np.where(100. * ddwinderror / ddwinddir > 5.)
#there was an error here!
tol = 50.
ind = np.where(100. * ddwinderror / ddwind > tol) ; ddwind[ind] = np.NaN 
print "2. error on wind too large"
print yorgl[0][ind]
print ddwinderror[ind]
ind = np.where(100. * ddheighterror / ddheight > tol) ; ddwind[ind] = np.NaN 
print "3. error on height too large"
print yorgl[0][ind]
print ddheighterror[ind]
## one record is doubtful according to Reiss
ind = np.where( yorgl[0] == 3 ) ; ddwind[ind] = np.NaN #; ddwinddir[ind] = np.NaN ; ddwinderror[ind] = np.NaN
print "4. doubtful", yorgl[0][ind]

#exit()

## constant_heights
#for heights in [20.,100.,500.,1000.,2000.,5000.,7000.,10000.,20000.]:
#for heights in [10.]:

## multiple_obsheight
#for heights in [0.1,0.2,0.5,0.75,1.0,1.5,2.0,10.]:
for heights in [1.0]:

 query = mcd()
 mcdwind = [] ; mcdwindle = [] ; mcdwindhe = [] ; mcdangle = [] ; mcdanglele = [] ; mcdanglehe = [] 

 for i in yorgl[0]:

   if not isnan(ddwind[i-1]):
    query.lat = yorgl[1][i-1]
    query.lon = yorgl[2][i-1]
    query.xdate = yorgl[3][i-1]
    query.loct = yorgl[4][i-1]

    query.xz = ddheight[i-1] #ddheight is really the one that works best

    ## constant_heights
    #query.xz = heights
    ## multiple_obsheight
    query.xz = ddheight[i-1]*heights

    query.update() ; uu = query.zonwind ; vv = query.merwind
    if uu == -999. or vv == -999.: 
       speed = np.NaN ; speedmin = np.NaN ; speedmax = np.NaN
       angle = np.NaN ; anglemin = np.NaN ; anglemax = np.NaN
    else:
       speed = np.sqrt(uu*uu+vv*vv) ; speedmin = speed ; speedmax = speed

       angle = 90. - np.arctan2(vv,uu) * 180. / np.pi
       if angle < 0.: angle = angle + 360.

       ## multiple_obsheight
       query.xzs = max(ddheight[i-1] - 2.*ddheighterror[i-1],10.)
       query.xze = ddheight[i-1] + 2.*ddheighterror[i-1]
       ## constant_heights
       #query.xzs = max(query.xz - 0.1*query.xz,10.)
       #query.xze = query.xz + 0.1*query.xz

       query.profile()
       tab = np.sqrt(query.zonwindtab*query.zonwindtab + query.merwindtab*query.merwindtab)
       tab2 = 90. - np.arctan2(query.merwindtab,query.zonwindtab) * 180. / np.pi
       tab2[np.where(tab2 < 0.)] = tab2[np.where(tab2 < 0.)] + 360.
       speedmin = min(tab)
       speedmax = max(tab)
       anglemin = min(tab2)-5.
       anglemax = max(tab2)+5.
       if anglemin < 0.: anglemin = angle - (anglemax - angle)
       print int(i), speed, speedmin, speedmax 
       print int(i), angle, anglemin, anglemax
   else:
    #print "removed ",i,ddwinderror[i-1],ddheighterror[i-1]
    speed = -999. ; speedmin = -1000. ; speedmax = -998. ; angle = -999. ; anglemin = -1000. ; anglemax = -998.

   mcdwind.append(speed)
   mcdwindle.append(speed-speedmin)
   mcdwindhe.append(speedmax-speed)
   mcdangle.append(angle)
   mcdanglele.append(angle-anglemin)
   mcdanglehe.append(anglemax-angle)

 mcdwind = np.array(mcdwind)
 mcdwindle = np.array(mcdwindle)
 mcdwindhe = np.array(mcdwindhe)

 mcdangle = np.array(mcdangle)
 mcdanglele = np.array(mcdanglele)
 mcdanglehe = np.array(mcdanglehe)


 mpl.figure(figsize=(12,10))
 mpl.plot([0,30], [stddev,stddev+30], 'g--')
 mpl.plot([0,30], [-stddev,-stddev+30], 'g--')
 mpl.plot([0,30], [0,30], 'g-')

 writeascii(field=mcdwind,absc=ddwind,name=str(heights)+'.txt')

 #ind = np.isnan(ddwind)
 #y = ddwind
 #y[ind] = -9999.
 #xi = mcdwind[y > -9999.]
 #y = ddwind[y > -9999.]
 #slope, intercept, r_value, p_value, std_err = stats.linregress(xi,y)
 #linear = slope*xi+intercept
 #mpl.plot(xi,linear)
 #ecart = y - linear
 #print np.std(ecart)

 mpl.errorbar(mcdwind, ddwind, yerr=[ddwinderror,ddwinderror], xerr=[mcdwindle,mcdwindhe], fmt='bo')
# mpl.xlim(xmin=0.,xmax=17.)
# mpl.ylim(ymin=0.,ymax=30.)
 mpl.xlim(xmin=0.,xmax=30.)
 mpl.ylim(ymin=0.,ymax=30.)


 mpl.xlabel('MCD horizontal wind speed (m/s)')
 mpl.ylabel('Dust devil observed drift speed (m/s)')


 for i in yorgl[0]:
    ## on multiplie stddev par 1.2 de facon a enlever les points tres au bord
    ##  qui sont in si on considere l error bar
    if abs(ddwind[i-1] - mcdwind[i-1]) > stddev*1.2:
        mpl.annotate(str(int(i)), xy=(mcdwind[i-1], ddwind[i-1]), xytext=(10,2), 
            textcoords='offset points', ha='center', va='bottom' )#,
            #bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
            #arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.3', 
            #color='red'))


 #mpl.show()
 mpl.savefig("speed"+str(heights)+".eps")
 mpl.savefig("speed"+str(heights)+".png")
 ##mpl.savefig("comp4.eps")
 ##mpl.savefig("comp4.png")

 ddwinddirerror = mcdanglele*0. + 15.

 mpl.figure(figsize=(12,10))
 mpl.errorbar(mcdangle,ddwinddir,yerr=[ddwinddirerror,ddwinddirerror],xerr=[mcdanglele,mcdanglehe],fmt='bo')
 mpl.plot(mcdangle,ddwinddir,'bo')
 mpl.xlim(xmin=0.,xmax=360.)
 mpl.ylim(ymin=0.,ymax=360.)

 mpl.xlabel('MCD horizontal wind orientation (deg)')
 mpl.ylabel('Dust devil observed drift orientation (deg)')


 stddev2 = 50.  ## voir e.g. 8 9 10
 mpl.plot([0,360], [stddev2,stddev2+360], 'g--')
 mpl.plot([0,360], [-stddev2,-stddev2+360], 'g--')
 mpl.plot([0,360], [0,360], 'g-')


 for i in yorgl[0]:
    ## on multiplie stddev par 1.2 de facon a enlever les points tres au bord
    ##  qui sont in si on considere l error bar
    if abs(ddwinddir[i-1] - mcdangle[i-1]) > stddev2*1.2:
        mpl.annotate(str(int(i)), xy=(mcdangle[i-1], ddwinddir[i-1]), xytext=(10,2),
            textcoords='offset points', ha='center', va='bottom')#,
            #bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
            #arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.3',
            #color='red'))

 ##xytext=(18,30)

 #mpl.show()
 mpl.savefig("angle"+str(heights)+".eps")
 mpl.savefig("angle"+str(heights)+".png")
 #mpl.savefig("comp3.eps")
 #mpl.savefig("comp3.png")

#exit()
#
#
#dd = mcd()
#
#
#
#
#
##dd.zkey = 4
##dd.xzs = 600.
##dd.xze = 0.1
##dd.profile()
##dd.plot1d(["t","p"])
##mpl.show()
##exit()
#
### CASE 1
#dd.lat   = -14.6584
#dd.lon   = 175.54
#dd.xdate = 265.278792
#dd.loct  = 14.8487
#dd.xz    = 130.4
#
#dd.update()
#dd.printmcd()
#
#dd.lats  = -5.  
#dd.late  = -25.
#dd.lons  = 160. 
#dd.lone  = 190.
#dd.map2d(["wind"],incwind=True,fixedlt=True)
### il y a un piege pour les cartes locales il faut fixedlt=True
#mpl.savefig("case1.png",dpi=110,bbox_inches='tight',pad_inches=0.4)
#
### CASE 2
#dd.lat   = -68.6125
#dd.lon   = 11.4303
#dd.xdate = 286.507293
#dd.loct  = 15.129030
#dd.xz    = 872.8
##dd.xz    = 10000.0
#
#dd.update()
#dd.printmcd()
#
#dd.lats  = -75.
#dd.late  = -60.
#dd.lons  = 0.
#dd.lone  = 20.
#dd.map2d(["wind"],incwind=True,fixedlt=True)
#mpl.savefig("case2.png",dpi=110,bbox_inches='tight',pad_inches=0.4)
#
###3	25,1306	314,4842	60,8946	14,9971	30,89575722	232	250,217961736111
#
### CASE 3
#dd.lat   = 25.1306
#dd.lon   = 314.4842
#dd.xdate = 60.8946
#dd.loct  = 14.9971
#dd.xz    = 250.218
#
#dd.update()
#dd.printmcd()
#
###4	35,564	199,486	60,5883	14,9949	12,2972688101353	125	895,247012611329
#
### CASE 4
#dd.lat   = 35.564
#dd.lon   = 199.486
#dd.xdate = 60.5883
#dd.loct  = 14.9949
#dd.xz    = 895.247
#
#dd.update()
#dd.printmcd()
#
###5	68,346	234,396	142,828	15,1777	13,4079899322222	83	1128,06581216829
###6	68,316	234,462	142,828	15,1819	16,1939071396022	85	582,624074786015
###7	68,302	234,144	142,828	15,1607	17,3354121022885	112	262,299040101764
#
### CASE 5
#dd.lat   = 68.32
#dd.lon   = 234.3
#dd.xdate = 142.828
#dd.loct  = 15.2
#
#dd.xz    = 1128.066
#dd.update()
#dd.printmcd()
#
#dd.xz    = 582.624
#dd.update()
#dd.printmcd()
#
#dd.xz    = 262.299
#dd.update()
#dd.printmcd()
#
#
###19	27,055	129,614	13,5818	14,444	42,6488205391137	302	1395,96076100437
#
### CASE 19
#dd.lat   = 27.055
#dd.lon   = 129.614
#dd.xdate = 13.5818
#dd.loct  = 14.444
#
#dd.xz    = 1395.961
#dd.update()
#dd.printmcd()
#
#dd.lats  = 20.
#dd.late  = 30.
#dd.lons  = 125.
#dd.lone  = 135.
#dd.map2d(["wind"],incwind=True,fixedlt=True)
#mpl.savefig("case19.png",dpi=110,bbox_inches='tight',pad_inches=0.4)
#
#
