from __future__ import print_function
import numpy as np
import sys
import os
import datetime
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib.ticker import MultipleLocator
from matplotlib.ticker import ScalarFormatter
from matplotlib.ticker import NullFormatter
import matplotlib.image as image
import matplotlib.patches as patches
import matplotlib.lines as lines
import matplotlib.ticker as ticker
from scipy.optimize import curve_fit

def read_values (filename):
	xs = []
	f = open(filename,'r')
	lines = f.readlines()
	f.close()
	for line in lines:
		p=line.split()
		xs.append(float(p[0]))
	xs = np.asarray(xs)
	return xs

def make_figure (times_passive,times_Pe2ini,times_Pe2,times_Pe20ini,times_Pe20,times_Pe100ini,times_Pe100):
	# exponential distributions
	avg2   = np.mean(times_Pe2)
	avg20  = np.mean(times_Pe20)
	avg100 = np.mean(times_Pe100)
	
	xs = np.arange(0,6,0.1)
	ys2 = np.exp(-xs/avg2) / avg2
	ys20 = np.exp(-xs/avg20) / avg20
	ys100 = np.exp(-xs/avg100) / avg100
	
	
	
	# setto alcune variabili comuni
	axisticslabelfontsize=9
	axisticslabelfontsizeinset=7
	axislabelfontsize=11 
	axislabelfontsizeinset=9
	
	xfig,yfig=7.0,2.3
	factor = xfig/yfig
	
	
	x1,y1 = 0.12,0.16
	dx1,dy1=0.2,0.70
	
	xgap = 0.06
	
	x2,y2 = x1+dx1+xgap,y1
	dx2,dy2 = dx1,dy1
	
	x3,y3 = x2+dx2+xgap,y1
	dx3,dy3 = dx1,dy1
	
	
	
	xlim_left,xlim_right = 0,5.7
	xtic_main,xtic_min = 2.5,0.5
	ylim_low,ylim_up = 0,1.3
	ytic_main,ytic_min = 0.5,0.1
	
	bins = np.arange(0,11.5,0.2)
	
	
	with PdfPages('fig3.pdf') as pdf:
		fig = plt.figure(figsize=(xfig,yfig))
		plt.rc('text', usetex=True)
		plt.rc('text.latex', preamble = ','.join('''\usepackage{txfonts} \usepackage{lmodern}'''.split()))
		
		
		
		
		
		
		
		
		
		######################## panel A ########################################
		panel = fig.add_axes([x1, y1, dx1, dy1])
		panel.tick_params(axis='both',which='both',direction='in',bottom=True,top=True,left=True,right=True)
		for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.set_xlabel(r'$t_{\rm{target}} / \tau$',fontsize=axislabelfontsize)
		panel.set_ylabel(r'$P(t_{\rm{target}})$',fontsize=axislabelfontsize)
		panel.set_xlim(xlim_left,xlim_right)
		panel.set_ylim(ylim_low,ylim_up)
		panel.xaxis.set_major_locator(MultipleLocator(xtic_main))
		panel.xaxis.set_minor_locator(MultipleLocator(xtic_min))
		panel.yaxis.set_major_locator(MultipleLocator(ytic_main))
		panel.yaxis.set_minor_locator(MultipleLocator(ytic_min))
		panel.text(0.83,0.88,r'(a)',fontsize=axislabelfontsize,transform=panel.transAxes)
		t = panel.text(0.28,0.85,r'Pe = $2$',fontsize=axislabelfontsize+1,transform=panel.transAxes)
		t.set_bbox(dict(facecolor='white', alpha=0.8, edgecolor='none',pad=1.5))
		
		#~ # plot avg line
		panel.plot(xs,ys2,'m-',linewidth=1.0)
		panel.hist(times_Pe2,bins=bins,density=True,color='b',alpha=0.5)
		panel.hist(times_passive,bins=bins,density=True,color='b',histtype='step',label=r'passive particle')
		panel.hist(times_Pe2ini,bins=bins,density=True,color='k',histtype='step',label=r'initial policy')

		######################## panel B ########################################
		panel = fig.add_axes([x2, y2, dx2, dy2])
		panel.tick_params(axis='both',which='both',direction='in',bottom=True,top=True,left=True,right=True)
		for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.set_xlabel(r'$t_{\rm{target}} / \tau$',fontsize=axislabelfontsize)
		panel.set_xlim(xlim_left,xlim_right)
		panel.set_xlim(xlim_left,xlim_right)
		panel.set_ylim(ylim_low,ylim_up)
		panel.xaxis.set_major_locator(MultipleLocator(xtic_main))
		panel.xaxis.set_minor_locator(MultipleLocator(xtic_min))
		panel.yaxis.set_major_locator(MultipleLocator(ytic_main))
		panel.yaxis.set_minor_locator(MultipleLocator(ytic_min))
		panel.text(0.83,0.88,r'(b)',fontsize=axislabelfontsize,transform=panel.transAxes)
		t = panel.text(0.27,0.85,r'Pe = $20$',fontsize=axislabelfontsize+1,transform=panel.transAxes)
		t.set_bbox(dict(facecolor='white', alpha=0.8, edgecolor='none',pad=1.5))
		
		#~ # plot avg line
		panel.hist(times_Pe20,bins=bins,density=True,color='r',alpha=0.8)
		panel.plot(xs,ys20,'m-',linewidth=1.0, label=r'$e^{(-t_{\rm target}/ \langle t_{\rm target} \rangle)} / \langle t_{\rm target} \rangle$')
		panel.hist(times_Pe20ini,bins=bins,density=True,color='k',histtype='step',label=r'initial policy')
		panel.hist(times_passive,bins=bins,density=True,color='b',histtype='step',label=r'passive particle')
		
		#~ panel.legend(loc='center', bbox_to_anchor=(0.5, 1.1),ncol=3,fontsize=8,handlelength=1.5,labelspacing=0.2)
		
		#specify order of items in legend
		handles, labels = panel.get_legend_handles_labels()
		order = [1,2,0]
		panel.legend([handles[idx] for idx in order],[labels[idx] for idx in order],loc='center', bbox_to_anchor=(0.5, 1.1),ncol=3,fontsize=8,handlelength=1.5,labelspacing=0.2) 
		
		
		######################## panel C ########################################
		panel = fig.add_axes([x3, y3, dx3, dy3])
		panel.tick_params(axis='both',which='both',direction='in',bottom=True,top=True,left=True,right=True)
		for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.set_xlabel(r'$t_{\rm{target}} / \tau$',fontsize=axislabelfontsize)
		panel.set_xlim(xlim_left,xlim_right)
		panel.set_ylim(ylim_low,2.8)
		panel.xaxis.set_major_locator(MultipleLocator(xtic_main))
		panel.xaxis.set_minor_locator(MultipleLocator(xtic_min))
		panel.yaxis.set_major_locator(MultipleLocator(ytic_main))
		panel.yaxis.set_minor_locator(MultipleLocator(ytic_min))
		
		panel.text(0.83,0.88,r'(c)',fontsize=axislabelfontsize,transform=panel.transAxes)
		t = panel.text(0.25,0.85,r'Pe = $100$',fontsize=axislabelfontsize+1,transform=panel.transAxes)
		t.set_bbox(dict(facecolor='white', alpha=0.8, edgecolor='none',pad=1.5))
		
		#~ # plot avg line
		panel.plot(xs,ys100,'m-',linewidth=1.0)
		panel.hist(times_Pe100,bins=bins,density=True,color='g',alpha=0.8)
		panel.hist(times_passive,bins=bins,density=True,color='b',histtype='step',label=r'passive particle')
		panel.hist(times_Pe100ini,bins=bins,density=True,color='k',histtype='step',label=r'initial policy')
		
		
		pdf.savefig(fig)
	return

def main():
	foldername = '../RESULTS/Target_Times_Distributions/TargetTimes_'
	
	# passive particle
	filename= foldername+'Passive.dat'
	times_passive = read_values (filename)
	
	# Pe=2 ini
	filename= foldername+'Pe2_ini.dat'
	times_Pe2ini = read_values (filename)
	# Pe=2
	filename= foldername+'Pe2.dat'
	times_Pe2 = read_values (filename)
	
	# Pe=20 ini
	filename= foldername+'Pe20_ini.dat'
	times_Pe20ini = read_values (filename)
	# Pe=20
	filename= foldername+'Pe20.dat'
	times_Pe20 = read_values (filename)
	
	# Pe=100 ini
	filename= foldername+'Pe100_ini.dat'
	times_Pe100ini = read_values (filename)
	# Pe=100
	filename= foldername+'Pe100.dat'
	times_Pe100 = read_values (filename)
	
	
	
	# plots
	make_figure(times_passive,times_Pe2ini,times_Pe2,times_Pe20ini,times_Pe20,times_Pe100ini,times_Pe100)


main()
