from __future__ import division
import pandas
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from scipy.signal import convolve
# matplotlib.rcParams.update({'font.size': 18})
# matplotlib.rcParams.update({'mathtext.default': 'sf'})
# import tqdm
# import pickle

def import_results(FileCsv,ColName):
    """imports a dataframe csv and extracts desired columns"""
    results_directory = './'

    data = pandas.read_csv(results_directory +
                           'results.csv'
                           )
    df = data[data['Unnamed: 0'] != np.nan]
    df = df.drop_duplicates()
    return np.array(df[ColName])

def y_conv(t1,t2,bin_duration,tot2):
    """
    :params TauInit: initial time distribution of pulses with 2 edges only
    :params bin_duration
    """
    def prob(tm):
        rng = max(tm) - min(tm)
        bn = int(rng / bin_duration)
#         print bn
        rng1 = bin_duration * bn
#         plt.figure()
        hgram = plt.hist((tm), bins=bn, range=[min(tm), (min(tm) + rng1)]);
        prob = hgram[0]
        return prob
    
    dist = convolve(prob(t1), prob(t2), mode='full')
#     g2_t = dist[0:len(prob(t1))][::-1]
    g2_t = dist[len(prob(t1))-1:] + dist[0:len(prob(t1))][::-1]
#     g2_t = dist[len(prob(t1))-1:]
#     g2_t=dist
    g2_t = g2_t / np.sum(g2_t) * tot2
    dt = np.arange(len(g2_t)) * bin_duration
    # plt.figure()
    # plt.plot(dt, g2_t)
    # plt.show()
    return dt, g2_t

def hist(data, numbins, lims, label='', plot=True, alpha=.5):
    """Creates and Plots numpy histogram, removing the last bin"""
    y, binEdges = np.histogram(data, numbins, range=(lims))
    y_err = np.sqrt(y)
    step = binEdges[1] - binEdges[0]
    _bins = binEdges[:-1] + step / 2
    if plot:
        plt.errorbar(_bins, y, yerr=y_err, fmt='.', color='blue', alpha=alpha)
        plt.xlim(lims)
    return y, _bins

a1 = import_results('results.csv','one_amplitude_fitted') 
a2 = import_results('results.csv','two_amplitude_fitted') 
t1 = import_results('results.csv','one_x_offset_fitted') 
t2 = import_results('results.csv','two_x_offset_fitted') 
ampmin = np.minimum(a1,a2)
maskMinArea = ampmin>0.6

tau = np.abs((t1-t2)*1e9)[maskMinArea] 
bin_duration = 25  # ns
g2_duration = 10000
numbins = int(g2_duration / bin_duration)
lims = [0, g2_duration]  # units ns

y, bins = hist(tau, numbins=numbins, lims=lims, plot=False, alpha=1)

toa = np.loadtxt('time_of_arrival_1ph.dat')
dt, g2_t = y_conv(toa*1e9,toa*1e9,bin_duration,len(t1))
y_cmodel_ = lambda t: np.interp(t,dt,g2_t)

y_err = np.sqrt(y)
g2 = y / y_cmodel_(bins)
g2_err = y_err / y_cmodel_(bins)

# with open('g2_data.dat', 'w') as f:
#     f.write('time\tg2\tg2_err\n')
#     [f.write('{}\t{}\t{}\n'.format(b, fr, fr_err))
#      for b, fr, fr_err
#      in zip(bins, g2, g2_err)]

# with open('G2_data.dat', 'w') as f:
#     f.write('time\tg2\tg2_err\n')
#     [f.write('{}\t{}\t{}\n'.format(b, fr, fr_err))
#      for b, fr, fr_err
#      in zip(bins, y, np.sqrt(y))]

# results_directory = './'

# data = pandas.read_csv(results_directory +
#                        'results.csv'
#                        )
# df = data[data['Unnamed: 0'] != np.nan]
# df = df.drop_duplicates()

# bin_duration = 20  # ns
# g2_duration = 10000
# numbins = int(g2_duration / bin_duration)
# lims = [0, g2_duration]  # units ns
# pltrange = 2000

# df['tau'] = np.abs(df['two_x_offset_fitted'] - df['one_x_offset_fitted']) * 1e9
# tau = df['tau']

# y, bins = hist(tau, numbins=numbins, lims=lims, plot=False, alpha=1)
# y_model = model(numbins, lims, plot=False)

# plt.figure()
# plt.errorbar(bins, g2, g2_err)
# plt.axhline(1,marker='.')
# plt.xlabel('pulse separation (ns)')
# plt.ylabel('counts')
# plt.xlim(0, pltrange)
# # plt.ylim(0,np.max(y[1:])*1.2)
# plt.tight_layout
# # plt.savefig('g2_cw_binsize_{}ns_range_{}ns.pdf'.format(bin_duration, pltrange))
# plt.show()

# with open('tinit_data.dat', 'w') as f:
#     f.write('t1_init\tt2_init\tfrequency_err\n')
#     [f.write('{}\t{}\t{}\n'.format(b, fr, fr_err))
#      for b, fr, fr_err
#      in zip(bins, g2, g2_err)]