import os, sys
import glob
import fnmatch
import datetime
import time
import re
import h5py
import numpy
import matplotlib.pyplot as plt

import pylab as plb
from scipy.optimize import curve_fit
from scipy import asarray as ar,exp
from scipy import stats

from duplicity.path import Path
from numpy.ma.core import getdata

SPEED_OF_LIGHT = 299792458
SPEED_OF_LIGHT = 3e8

try:
    from gevent import sleep
except:
    from time import sleep

from schainpy.model.data.jrodata import Spectra
#from schainpy.model.data.BLTRheaderIO import FileHeader, RecordHeader
from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation
#from schainpy.model.io.jroIO_bltr import BLTRReader
from numpy import imag, shape, NaN


startFp = open('/home/erick/Documents/MIRA35C/20160117/20160117_0000.zspc',"rb") 


FILE_HEADER = numpy.dtype([          #HEADER 1024bytes
                          ('Hname',numpy.str_,32),      #Original file name
                          ('Htime',numpy.str_,32),      #Date and time when the file was created
                          ('Hoper',numpy.str_,64),      #Name of operator who created the file
                          ('Hplace',numpy.str_,128),    #Place where the measurements was carried out
                          ('Hdescr',numpy.str_,256),    #Description of measurements
                          ('Hdummy',numpy.str_,512),    #Reserved space 
                          #Main chunk
                          ('Msign','<i4'),          #Main chunk signature FZKF or NUIG
                          ('MsizeData','<i4'),      #Size of data block main chunk
                          #Processing DSP parameters
                          ('PPARsign','<i4'),       #PPAR signature
                          ('PPARsize','<i4'),       #PPAR size of block
                          ('PPARprf','<i4'),        #Pulse repetition frequency
                          ('PPARpdr','<i4'),        #Pulse duration
                          ('PPARsft','<i4'),        #FFT length
                          ('PPARavc','<i4'),        #Number of spectral (in-coherent) averages
                          ('PPARihp','<i4'),        #Number of lowest range gate for moment estimation
                          ('PPARchg','<i4'),        #Count for gates for moment estimation
                          ('PPARpol','<i4'),        #switch on/off polarimetric measurements. Should be 1.
                          #Service DSP parameters
                          ('SPARatt','<i4'),       #STC attenuation on the lowest ranges on/off
                          ('SPARtx','<i4'),        #OBSOLETE
                          ('SPARaddGain0','<f4'),  #OBSOLETE
                          ('SPARaddGain1','<f4'),  #OBSOLETE
                          ('SPARwnd','<i4'),     #Debug only. It normal mode it is 0.
                          ('SPARpos','<i4'),     #Delay between sync pulse and tx pulse for phase corr, ns
                          ('SPARadd','<i4'),     #"add to pulse" to compensate for delay between the leading edge of driver pulse and envelope of the RF signal.
                          ('SPARlen','<i4'),     #Time for measuring txn pulse phase. OBSOLETE
                          ('SPARcal','<i4'),     #OBSOLETE
                          ('SPARnos','<i4'),     #OBSOLETE
                          ('SPARof0','<i4'),     #detection threshold
                          ('SPARof1','<i4'),     #OBSOLETE
                          ('SPARswt','<i4'),     #2nd moment estimation threshold
                          ('SPARsum','<i4'),     #OBSOLETE
                          ('SPARosc','<i4'),     #flag Oscillosgram mode
                          ('SPARtst','<i4'),     #OBSOLETE
                          ('SPARcor','<i4'),     #OBSOLETE
                          ('SPARofs','<i4'),     #OBSOLETE
                          ('SPARhsn','<i4'),     #Hildebrand div noise detection on noise gate
                          ('SPARhsa','<f4'),     #Hildebrand div noise detection on all gates
                          ('SPARcalibPow_M','<f4'),   #OBSOLETE
                          ('SPARcalibSNR_M','<f4'),   #OBSOLETE
                          ('SPARcalibPow_S','<f4'),   #OBSOLETE
                          ('SPARcalibSNR_S','<f4'),   #OBSOLETE
                          ('SPARrawGate1','<i4'),     #Lowest range gate for spectra saving Raw_Gate1 >=5
                          ('SPARrawGate2','<i4'),     #Number of range gates with atmospheric signal
                          ('SPARraw','<i4'),          #flag - IQ or spectra saving on/off
                          ('SPARprc','<i4'),])        #flag - Moment estimation switched on/off
                        
                        

self.Hname= None     
self.Htime= None
self.Hoper= None
self.Hplace= None
self.Hdescr= None
self.Hdummy= None

self.Msign=None
self.MsizeData=None
                  
self.PPARsign=None
self.PPARsize=None
self.PPARprf=None
self.PPARpdr=None
self.PPARsft=None
self.PPARavc=None
self.PPARihp=None
self.PPARchg=None
self.PPARpol=None
#Service DSP parameters
self.SPARatt=None
self.SPARtx=None
self.SPARaddGain0=None
self.SPARaddGain1=None
self.SPARwnd=None
self.SPARpos=None
self.SPARadd=None
self.SPARlen=None
self.SPARcal=None
self.SPARnos=None
self.SPARof0=None
self.SPARof1=None
self.SPARswt=None
self.SPARsum=None
self.SPARosc=None
self.SPARtst=None
self.SPARcor=None
self.SPARofs=None
self.SPARhsn=None
self.SPARhsa=None
self.SPARcalibPow_M=None
self.SPARcalibSNR_M=None
self.SPARcalibPow_S=None
self.SPARcalibSNR_S=None
self.SPARrawGate1=None
self.SPARrawGate2=None
self.SPARraw=None
self.SPARprc=None 
        
    
        
header = numpy.fromfile(fp, FILE_HEADER,1)
'''      numpy.fromfile(file, dtype, count, sep='')
    file : file or str
    Open file object or filename.
    
    dtype : data-type
    Data type of the returned array. For binary files, it is used to determine 
    the size and byte-order of the items in the file.
    
    count : int
    Number of items to read. -1 means all items (i.e., the complete file).
    
    sep : str
    Separator between items if file is a text file. Empty ("") separator means 
    the file should be treated as binary. Spaces (" ") in the separator match zero 
    or more whitespace characters. A separator consisting only of spaces must match 
    at least one whitespace.
    
'''

Hname= str(header['Hname'][0])     
Htime= str(header['Htime'][0])
Hoper= str(header['Hoper'][0])
Hplace= str(header['Hplace'][0])
Hdescr= str(header['Hdescr'][0])
Hdummy= str(header['Hdummy'][0])

Msign=header['Msign'][0]   
MsizeData=header['MsizeData'][0]

PPARsign=header['PPARsign'][0]
PPARsize=header['PPARsize'][0]
PPARprf=header['PPARprf'][0]
PPARpdr=header['PPARpdr'][0]
PPARsft=header['PPARsft'][0]
PPARavc=header['PPARavc'][0]
PPARihp=header['PPARihp'][0]
PPARchg=header['PPARchg'][0]
PPARpol=header['PPARpol'][0]
#Service DSP parameters
SPARatt=header['SPARatt'][0]
SPARtx=header['SPARtx'][0]
SPARaddGain0=header['SPARaddGain0'][0]
SPARaddGain1=header['SPARaddGain1'][0]
SPARwnd=header['SPARwnd'][0]
SPARpos=header['SPARpos'][0]
SPARadd=header['SPARadd'][0]
SPARlen=header['SPARlen'][0]
SPARcal=header['SPARcal'][0]
SPARnos=header['SPARnos'][0]
SPARof0=header['SPARof0'][0]
SPARof1=header['SPARof1'][0]
SPARswt=header['SPARswt'][0]
SPARsum=header['SPARsum'][0]
SPARosc=header['SPARosc'][0]
SPARtst=header['SPARtst'][0]
SPARcor=header['SPARcor'][0]
SPARofs=header['SPARofs'][0]
SPARhsn=header['SPARhsn'][0]
SPARhsa=header['SPARhsa'][0]
SPARcalibPow_M=header['SPARcalibPow_M'][0]
SPARcalibSNR_M=header['SPARcalibSNR_M'][0]
SPARcalibPow_S=header['SPARcalibPow_S'][0]
SPARcalibSNR_S=header['SPARcalibSNR_S'][0]
SPARrawGate1=header['SPARrawGate1'][0]
SPARrawGate2=header['SPARrawGate2'][0]
SPARraw=header['SPARraw'][0]
SPARprc=header['SPARprc'][0]
        
        
       
SRVI_STRUCTURE = numpy.dtype([         
                            ('frame_cnt','<u4'),#
                            ('time_t','<u4'),   #
                            ('tpow','<f4'),     #
                            ('npw1','<f4'),     #
                            ('npw2','<f4'),     #
                            ('cpw1','<f4'),     #
                            ('pcw2','<f4'),     #
                            ('ps_err','<u4'),   #
                            ('te_err','<u4'),   #
                            ('rc_err','<u4'),   #
                            ('grs1','<u4'),     #
                            ('grs2','<u4'),     #
                            ('azipos','<f4'),     #
                            ('azivel','<f4'),     #
                            ('elvpos','<f4'),     #
                            ('elvvel','<f4'),     #
                            ('northAngle','<f4'), #
                            ('microsec','<u4'),   #
                            ('azisetvel','<f4'),  #
                            ('elvsetpos','<f4'),  #
                            ('RadarConst','<f4'),])   # 

JUMP_STRUCTURE = numpy.dtype([         
                            ('jump','<u140'),#
                            ('SizeOfDataBlock1',numpy.str_,32),#
                            ('jump','<i4'),#
                            ('DataBlockTitleSRVI1',numpy.str_,32),#
                            ('SizeOfSRVI1','<i4'),])#



#frame_cnt=0,  time_t= 0,  tpow=0,   npw1=0,   npw2=0,   
#cpw1=0,   pcw2=0,       ps_err=0,   te_err=0,   rc_err=0,   grs1=0,   
#grs2=0,   azipos=0,   azivel=0,   elvpos=0,   elvvel=0,   northangle=0,   
 #microsec=0,   azisetvel=0,   elvsetpos=0,   RadarConst=0 
        
        
frame_cnt = frame_cnt
dwell = time_t
tpow = tpow
npw1 = npw1
npw2 = npw2
cpw1 = cpw1
pcw2 = pcw2
ps_err = ps_err
te_err = te_err
rc_err = rc_err
grs1 = grs1
grs2 = grs2
azipos = azipos
azivel = azivel
elvpos = elvpos
elvvel = elvvel
northAngle = northAngle
microsec = microsec
azisetvel = azisetvel
elvsetpos = elvsetpos
RadarConst5 = RadarConst
        


#print fp
#startFp = open('/home/erick/Documents/Data/huancayo.20161019.22.fdt',"rb") #The method tell() returns the current position of the file read/write pointer within the file.
#startFp = open(fp,"rb") #The method tell() returns the current position of the file read/write pointer within the file.
#RecCounter=0
#Off2StartNxtRec=811248
#print 'OffsetStartHeader ',self.OffsetStartHeader,'RecCounter ', self.RecCounter, 'Off2StartNxtRec ' , self.Off2StartNxtRec
#OffRHeader= self.OffsetStartHeader + self.RecCounter*self.Off2StartNxtRec
#startFp.seek(OffRHeader, os.SEEK_SET)
print 'debe ser 48, RecCounter*811248', self.OffsetStartHeader,self.RecCounter,self.Off2StartNxtRec
print 'Posicion del bloque:        ',OffRHeader

header = numpy.fromfile(startFp,SRVI_STRUCTURE,1)

self.frame_cnt = header['frame_cnt'][0]#
self.time_t = header['frame_cnt'][0]   #
self.tpow = header['frame_cnt'][0]     #
self.npw1 = header['frame_cnt'][0]     #
self.npw2 = header['frame_cnt'][0]     #
self.cpw1 = header['frame_cnt'][0]     #
self.pcw2 = header['frame_cnt'][0]     #
self.ps_err = header['frame_cnt'][0]    #
self.te_err = header['frame_cnt'][0]    #
self.rc_err = header['frame_cnt'][0]    #
self.grs1 = header['frame_cnt'][0]      #
self.grs2 = header['frame_cnt'][0]      #
self.azipos = header['frame_cnt'][0]     #
self.azivel = header['frame_cnt'][0]     #
self.elvpos = header['frame_cnt'][0]     #
self.elvvel = header['frame_cnt'][0]     #
self.northAngle = header['frame_cnt'][0]    #
self.microsec = header['frame_cnt'][0]      #
self.azisetvel = header['frame_cnt'][0]     #
self.elvsetpos = header['frame_cnt'][0]     #
self.RadarConst = header['frame_cnt'][0]    # 


self.ipp= 0.5*(SPEED_OF_LIGHT/self.PRFhz)

self.RHsize = 180+20*self.nChannels
self.Datasize= self.nProfiles*self.nChannels*self.nHeights*2*4
#print 'Datasize',self.Datasize
endFp = self.OffsetStartHeader + self.RecCounter*self.Off2StartNxtRec

print '=============================================='

print '=============================================='
        

    