import sys
import os
import random
from random import seed
from random import random
from random import gauss
import datetime

import numpy as np
import math
from mpmath import *
import cmath
from scipy.linalg import eig
import scipy.special as sc
from scipy import linalg as sciLA


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 matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator

from scipy.signal import savgol_filter


mp.dps = 16; mp.pretty = False;


def read_data (Nbins,filename):
	xs=np.zeros((Nbins))
	ys=np.zeros((Nbins))
	data = np.zeros((Nbins,Nbins))
	f = open(filename,'r')
	lines = f.readlines()
	f.close()
	k=0
	p = lines[2].split()
	Dl = float(p[1])
	for line in lines[1:]:
		i = k%Nbins
		j = int(k/Nbins)
		p=line.split()
		xs[i] = float(p[1])-Dl/2
		ys[j] = float(p[0])-Dl/2
		data[i,j] = float(p[2])
		k+=1
	

	return xs,ys,data,Dl

def read_tpt_distro (tau,filename):
	ts = []
	TPT = []
	f = open(filename,'r')
	lines = f.readlines()
	f.close()
	k = 0
	somma = 0
	for line in lines:
		p=line.split()
		k +=1
		ts.append(k*0.005/tau)
		v = int(p[0])
		somma = somma+v
		TPT.append(v)
	ts = np.asarray(ts)
	TPT = np.asarray(TPT)
	
	Nt = len(ts)
	bt = 40
	Nt2 = Nt/bt
	ts2 = np.zeros((Nt2))
	TPT2 = np.zeros((Nt2))
	for i in range(Nt2):
		ts2[i] = 0.5*(ts[i*bt] + ts[min((i+1)*bt,Nt)-1])
		somma2 = 0
		for j in range(bt):
			if (i*bt + j < Nt): somma2 += TPT[i*bt + j]
		TPT2[i] = somma2
	
	TPT2 = TPT2/(somma*bt*0.005/tau)
	
	# check
	Dt = ts2[1]-ts2[0]
	somma = 0
	for t in TPT2:
		somma += t*Dt
	print 'check norm = ',somma,Dt,0.005/tau
	return ts2,TPT2

def make_figure (xs,ys,data,xs2,ys2,Dl,objA,objB,objC,objD,objE,objF,objG):
	# setto alcune variabili comuni
	# ~ axisticslabelfontsize=8
	# ~ axisticslabelfontsizeinset=7
	# ~ axislabelfontsize=11 
	# ~ axislabelfontsizeinset=9
	
	
	axislabelfontsize = 11 
	axisticslabelfontsize = 8
	colorbarfontsize = 9 
	

	xsize = 3.5
	ysize = 6
	
	xgap = 0.12
	x1 = xgap+0.03
	y1 = 0.55
	x1size = 0.86
	alpha = 0.8
	y1size = x1size *  xsize/ysize * alpha
	# ~ x4size = x1size *1.25
	
	x2 = x1
	y2 = 0.06
	y2size = y1size
	x2size = y2size *  ysize/xsize
	
	
	# ~ x2 = x1 + 1.5*xgap + x4size
	# ~ x4 = x2 + 1.5*xgap + x4size
	
	
	with PdfPages('fig3.pdf') as pdf:
		fig = plt.figure(figsize=(xsize,ysize))
		plt.rc('text', usetex=True)
		plt.rc('text.latex', preamble = ','.join('''\usepackage{txfonts} \usepackage{lmodern}'''.split()))
		cmap = plt.get_cmap('bwr')
		# ~ cmap = plt.get_cmap('Reds')
		
		######################### panel 1 ##############################
		panel = fig.add_axes([x1, y1, x1size, y1size])
		
		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'$ \lambda_{0\to 1} \tau$',fontsize=axislabelfontsize)
		panel.set_ylabel(r'$ \lambda_{1\to 0} \tau$',fontsize=axislabelfontsize)
		
		pcm = panel.pcolormesh(xs, ys, data.T, shading = 'gouraud', cmap=cmap, vmin=8.5, vmax=14.5)
		# ~ pcm = panel.pcolormesh(xs, ys, data.T, shading = 'flat', cmap=cmap, vmin=8.5, vmax=14.5)
		cbar = plt.colorbar(pcm)
		cbar.ax.tick_params(labelsize=colorbarfontsize, direction='in')

		# ~ panel.plot(xs[1:]+Dl/2,ys2[1:]+Dl/2,'-', color = 'lightgreen', linewidth=2)
		panel.plot(xs2+Dl/2,savgol_filter(ys2, 11, 2)+Dl/2-0.05,'--', color = 'lightgreen', linewidth=2)
		
		panel.text(0.35,1.04,r'$\langle t_{\rm TPT} \rangle / \tau$',fontsize=axislabelfontsize+1,transform=panel.transAxes)
		
		panel.set_xlim(-Dl/2,3.0)
		panel.xaxis.set_major_locator(MultipleLocator(1))
		panel.xaxis.set_minor_locator(MultipleLocator(0.5))
		panel.set_ylim(-Dl/2,3.0)
		panel.yaxis.set_major_locator(MultipleLocator(1))
		panel.yaxis.set_minor_locator(MultipleLocator(0.5))
		
		radius = 0.06
		
		circle = plt.Circle((objA[0],objA[1]),radius,facecolor='None',lw=1.0, edgecolor='k')
		panel.add_patch(circle)
		panel.text(objA[0]+1.5*radius,objA[1]+1.5*radius,r'A',fontsize=9)
		
		circle = plt.Circle((objB[0],objB[1]),radius,facecolor='None',lw=1.0, edgecolor='k')
		panel.add_patch(circle)
		panel.text(objB[0]+1.5*radius,objB[1]+1.5*radius,r'B',fontsize=9)
		
		circle = plt.Circle((objC[0],objC[1]),radius,facecolor='None',lw=1.0, edgecolor='k')
		panel.add_patch(circle)
		panel.text(objC[0]+1.5*radius,objC[1]+1.5*radius,r'C',fontsize=9)
		
		circle = plt.Circle((objD[0],objD[1]),radius,facecolor='None',lw=1.0, edgecolor='k')
		panel.add_patch(circle)
		panel.text(objD[0]+1.5*radius,objD[1]+1.5*radius,r'D',fontsize=9)
		
		circle = plt.Circle((objE[0],objE[1]-0.05),radius,facecolor='None',lw=1.0, edgecolor='k')
		panel.add_patch(circle)
		panel.text(objE[0]+1.5*radius,objE[1]-2*radius-0.05,r'E',fontsize=9)
		
		circle = plt.Circle((objF[0],objF[1]),radius,facecolor='None',lw=1.0, edgecolor='k')
		panel.add_patch(circle)
		panel.text(objF[0]+1.5*radius,objF[1]+1.5*radius,r'F',fontsize=9)
		
		circle = plt.Circle((objG[0],objG[1]),radius,facecolor='None',lw=1.0, edgecolor='k')
		panel.add_patch(circle)
		panel.text(objG[0]+1.5*radius,objG[1]+1.5*radius,r'G',fontsize=9)
		
		
		panel.text(-0.14,1.04,r'\textbf{a)}',fontsize=11,transform=panel.transAxes)
	
		######################### panel 2 ##############################
		panel = fig.add_axes([x2, y2, x2size, y2size])
		
		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/ \tau$',fontsize=axislabelfontsize)
		panel.set_ylabel(r'$P(t_{\rm TPT})$',fontsize=axislabelfontsize)
		
		panel.plot(objA[2],objA[3],'-',color='cyan',linewidth=1.5,label=(r'A) $\lambda_{0 \to 1} \!=\! %3.2f /\tau ; \, \lambda_{1 \to 0}  \!=\! %3.2f /\tau $' % (objA[0],objA[1])) )
		panel.plot(objB[2],objB[3],'r-',linewidth=2,label=(r'B) $\lambda_{0 \to 1}  \!=\! %3.2f /\tau ; \, \lambda_{1 \to 0}  \!=\! %3.2f /\tau $' % (objB[0],objB[1])) )
		panel.plot(objC[2],objC[3],'k-',linewidth=1.5,label=(r'C) $\lambda_{0 \to 1}  \!=\! %3.2f /\tau ; \, \lambda_{1 \to 0}  \!=\! %3.2f /\tau $' % (objC[0],objC[1])) )
		panel.plot(objD[2],objD[3],'b-',linewidth=1.5,label=(r'D) $\lambda_{0 \to 1}  \!=\! %3.2f /\tau ; \, \lambda_{1 \to 0}  \!=\! %3.2f /\tau $' % (objD[0],objD[1])) )
		panel.plot(objE[2],objE[3],'g-',linewidth=1.5,label=(r'E) $\lambda_{0 \to 1}  \!=\! %3.2f /\tau ; \, \lambda_{1 \to 0}  \!=\! %3.2f /\tau $' % (objE[0],objE[1])) )
		panel.plot(objF[2],objF[3],color='b',linestyle='dotted',linewidth=1.2,label=r'F) passive BP'  )
		panel.plot(objG[2],objG[3],'r--',linewidth=2,label=r'G) ABP' )
	
		panel.set_xlim(0,47)
		panel.xaxis.set_major_locator(MultipleLocator(10))
		panel.xaxis.set_minor_locator(MultipleLocator(5))
		panel.set_ylim(0,0.16)
		panel.yaxis.set_major_locator(MultipleLocator(0.05))
		panel.yaxis.set_minor_locator(MultipleLocator(0.025))
		
		panel.legend(loc='upper right', bbox_to_anchor=(0.99, 0.99),ncol=1,fontsize=7,handlelength=2,labelspacing=0.2)
		
		
		panel.text(-0.14,1.04,r'\textbf{b)}',fontsize=11,transform=panel.transAxes)


		pdf.savefig(fig)
	return

def main():
	tau = 0.117
	
	Nbins = 21
	xs,ys,data,Dl = read_data (Nbins,'meanvalues.dat')
	
	xs2 = np.zeros((Nbins))
	ys2 = np.zeros((Nbins))
	for i in range(Nbins):
		miny = 10.0
		value = 100.0
		for j in range(Nbins):
			if (data[i,j]<value):
				value = data[i,j]
				miny=ys[j]
		ys2[i] = miny
		xs2[i] = xs[i]
		xs2[0] = 0.0
		ys2[0] = 0.24
		print xs[i]+Dl/2,ys2[i]+Dl/2,value
		
	x,y= 1.2, 1.2
	ts,tpt = read_tpt_distro (tau,'distributions_for_meantime/length_distribution_histo_TPS_rtp_step0.005pe10tumblerate10runrate10samplesize100000000.dat')
	objA = [x,y,ts,tpt]
	
	x,y= 1.2, 0.12
	ts,tpt = read_tpt_distro (tau,'distributions_for_meantime/length_distribution_histo_TPS_rtp_step0.005pe10tumblerate1runrate10samplesize100000000.dat')
	objB = [x,y,ts,tpt]
	
	x,y= 0.12, 0.12
	ts,tpt = read_tpt_distro (tau,'distributions_for_meantime/length_distribution_histo_TPS_rtp_step0.005pe10tumblerate1runrate1samplesize100000000.dat')
	objC = [x,y,ts,tpt]
	
	x,y= 0.12, 1.2
	ts,tpt = read_tpt_distro (tau,'distributions_for_meantime/length_distribution_histo_TPS_rtp_step0.005pe10tumblerate10runrate1samplesize100000000.dat')
	objD = [x,y,ts,tpt]
	
	x,y= 0.24, 0.7
	ts,tpt = read_tpt_distro (tau,'distributions_for_meantime/length_distribution_histo_TPS_rtp_step0.005pe10tumblerate6runrate2samplesize100000000.dat')
	objE = [x,y,ts,tpt]
	
	x,y= 0.0, 2.4
	ts,tpt = read_tpt_distro (tau,'distributions_for_meantime/length_distribution_histo_TPS_rtp_step0.005pe10tumblerate20runrate0samplesize100000000.dat')
	objF = [x,y,ts,tpt]
	
	x,y= 2.4, 0.0
	ts,tpt = read_tpt_distro (tau,'distributions_for_meantime/length_distribution_histo_TPS_rtp_step0.005pe10tumblerate0runrate20samplesize100000000.dat')
	objG = [x,y,ts,tpt]
	

	# plots
	make_figure (xs,ys,data,xs2,ys2,Dl,objA,objB,objC,objD,objE,objF,objG)



main()
