#!/usr/bin/env python 
# -*- coding: utf-8 -*-

import matplotlib
#matplotlib.rcParams['backend'] = 'Qt4Agg'
matplotlib.rcParams['backend'] = 'Agg'


from scipy.signal import *

from numpy import *
from matplotlib.pyplot import *
import mlpy
#import cwt

from matplotlib.ticker import MultipleLocator, FormatStrFormatter,LogLocator


matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

matplotlib.rcParams['xtick.major.size'] = 10
matplotlib.rcParams['xtick.minor.size'] = 7

matplotlib.rcParams['ytick.major.size'] = 10
matplotlib.rcParams['ytick.minor.size'] = 7

def PlotSpectrogram(spec,freq,name,start = None, end = None):
    contrast = 10		
    pole = log(1+contrast*abs(spec))
    if (start== None):
	start= 0
	end = 1
	
    fig = figure()
    ax = fig.add_axes([0.1, 0.1, 0.8, 0.85])
    img = ax.imshow(pole, extent=[start*1000,end*1000 ,freq[-1], freq[0]], aspect='auto') 
    ax.set_yscale('log', nonposy='clip')
    minorLocator   = MultipleLocator(1)
    ax.xaxis.set_minor_locator(minorLocator)
    #ax.plot([start, start], [amin(freq), amax(freq)], 'w--')
    #ax.plot([end  ,   end], [amin(freq), amax(freq)], 'w--')
    ax.axis([start*1000,end*1000,amin(freq), amax(freq)])
    ax.set_xlabel('time [ms]')
    ax.set_ylabel('Frequency [Hz]')
    fig.colorbar(img)
    savefig(name+'_spectrogram'+'.png')
    clf()

def Plotdata(tvec,signal,name):
    

    plot(tvec[0:100]*1000,signal[0:100]+1e-9,'k',linewidth=0.1)
    xlabel('time [ms]')
    ylabel('U [V]')
    savefig(name+'_signal'+'.png')
    clf()
    plot(tvec*1000,signal,'k',linewidth=0.1)
    xlabel('time [ms]')
    ylabel('U [V]')
    savefig(name+'_signal_full'+'.png')
    clf()
    

def Spectrogram(omega0,frequenciCutOff,signal,dt):

    #spec, scale = cwt.cwt(signal, dt, dj=0.05, wf='morlet', p=omega0, extmethod='periodic', extlength='powerof2',res = 2000)
    spec, scale = mlpy.cwt(signal, dt, dj=0.05, wf='morlet', p=omega0, extmethod='periodic', extlength='powerof2')


    # approximate scales through frequencies
    freq = (omega0 + sqrt(2.0 + omega0**2))/(4*pi * scale[1:])

    spec = spec[freq > frequenciCutOff, : ] 
    freq = freq[freq > frequenciCutOff] 



    return spec,freq

def FFTanalysis(signal,start, end, name,dt,frequenciCutOff):

    Fsignal = fft.rfft(signal)

    fvec = 2/dt/len(Fsignal)*arange(size(Fsignal))
    Fsignal = Fsignal[fvec > frequenciCutOff]
    fvec = fvec[fvec > frequenciCutOff]
    plot(fvec,abs(Fsignal),linewidth=0.1)
    xlabel('Frequency [Hz]')
    ylabel('Intensity [a.u.]')
    yscale('log', nonposy='clip')
    xscale('log', nonposy='clip')
    limits = sort(abs(Fsignal))[[len(Fsignal)*1e-3,len(Fsignal)*(1-1e-3 )]]
    axis([fvec[0],fvec[-1],limits[0], amax(abs (Fsignal))])
  
    savefig(name+'_fft'+'.png')
    

    
    
    clf()
    

    
def main():
   
    dir_list = ('.')


    name_list = ('NIbasic_01','NIturbo_08', 'PapouchSt_05', 'PapouchSt_08', 'PapouchSt_09', 'NI6251ext_01')
    for directory in dir_list:
	for file_name in name_list:
	    name = file_name
	    print 'processing ', name
	    signal = loadtxt(name)
	    ##print signal
	    
	    #print shape(signal)
	   
	    if all(signal == 0):
		continue
	    omega0 = 50
	    frequenciCutOff =1e3
	    dt = signal[1,0]-signal[0,0]
	    start = signal[0,0]
	    end   = signal[-1,0]
	    Plotdata(signal[:,0],signal[:,1],name)

	    try:
		signal[:,1] -=mean(signal[:,1])
		( spec,freq) = Spectrogram(omega0,frequenciCutOff,signal[:,1],dt)
		PlotSpectrogram(spec,freq,name,start, end)
		FFTanalysis(signal[:,1],start, end, name,dt,frequenciCutOff)
	    except ValueError:
		print 'chyba'
    
def main2():


    start = 0
    end = 0.04

    omega0 = 50	#čím větší tím lepší frekvenční rozlišení a opačně
    frequenciCutOff =1e4


    signal = loadtxt('textronix25MHz1')
    signal -=mean(signal)
    print size(signal)
    length = size(signal)
    end = size(signal)*4e-8
    t = linspace(start,end,length)
    signal = vstack((t,signal)).T

    name = 'textronix'
    
    #length 
    specLen = 2000.0
    step = int(length/specLen)
    signalPartLen = 10000.0
    nParts = int(length/signalPartLen)+1
    lenPart = int(2**14*0.8)
    dt = (end-start)/length
    overlap = 0.2
    spec = empty
    for i in range(nParts):
	s =   int(  i*lenPart)
	e = int((i+1)*lenPart)
	#if i <=0:
	    #s = 0
	#elif i>= nParts-1:
	    #e = length-1
	
	print s," ",e
	signaltmp = signal[s:e,:]	    
	print shape(signaltmp)
	( specTmp,freqTmp) = Spectrogram(omega0,frequenciCutOff,signaltmp,dt)
    
	specTmp = specTmp[:,s:e:step]
	
	    
	
	
    
    
    #PlotSpectrogram(spec,freq,name,start, end)


    s=   int(size(tvec)/pix)
    pole = pole[:,::s]






    
    
if __name__ == "__main__":
    main()
    	

