#!/usr/bin/env python
from numpy import *
import numpy as np
import math
from mpmath import *
from scipy.optimize import curve_fit
import scipy.integrate
import scipy
import glob
import os.path
import sys
import os
import matplotlib
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.ticker as tck
from matplotlib.ticker import MultipleLocator
from matplotlib.ticker import ScalarFormatter
from matplotlib.ticker import NullFormatter
import numpy.ma as ma
import matplotlib.lines as lines
from matplotlib.lines import Line2D

mp.dps = 15; mp.pretty = False;

class nf(float):
	def __repr__(self):
		s = f'{self:.1f}'
		return f'{self:.0f}' if s[-1] == '0' else s
		
def multiple_formatter(denominator=2, number=np.pi, latex='\pi'):
	def gcd(a, b):
		while b:
			a, b = b, a%b
		return a
	def _multiple_formatter(x, pos):
		den = denominator
		num = np.int(np.rint(den*x/number))
		com = gcd(num,den)
		(num,den) = (int(num/com),int(den/com))
		if den==1:
			if num==0:
				return r'$0$'
			if num==1:
				return r'$%s$'%latex
			elif num==-1:
				return r'$-%s$'%latex
			else:
				return r'$%s%s$'%(num,latex)
		else:
			if num==1:
				return r'$\frac{%s}{%s}$'%(latex,den)
			elif num==-1:
				return r'$\frac{-%s}{%s}$'%(latex,den)
			else:
				return r'$\frac{%s%s}{%s}$'%(num,latex,den)
	return _multiple_formatter
    
class Multiple:
	def __init__(self, denominator=2, number=np.pi, latex='\pi'):
		self.denominator = denominator
		self.number = number
		self.latex = latex

	def locator(self):
		return plt.MultipleLocator(self.number / self.denominator)

	def formatter(self):
		return plt.FuncFormatter(multiple_formatter(self.denominator, self.number, self.latex))
		
# ~ def read_commp (filename):
	# ~ q = np.zeros(shape=(8))
	# ~ f=open(filename,'r')
	# ~ lines = f.readlines()
	# ~ f.close()
	# ~ i = 0
	# ~ for line in lines:
		# ~ p = line.split()
		# ~ q[i] = float(p[0])
		# ~ i+=1
	# ~ return q
	
def read_commp (filename):
	q = np.zeros(shape=(5))
	er = np.zeros(shape=(5))
	f=open(filename,'r')
	lines = f.readlines()
	f.close()
	i = 0
	for line in lines:
		p = line.split()
		q[i] = float(p[0])
		er[i] = float(p[3])
		if i == 0:
			q[4] = float(p[0])
			er[4] = float(p[3])
		i+=1
	return q,er
	
def read_commp_exp (filename):
	q = np.zeros(shape=(5))
	er = np.zeros(shape=(5))
	f=open(filename,'r')
	lines = f.readlines()
	f.close()
	i = 0
	for line in lines:
		p = line.split()
		q[i] = float(p[0])
		er[i] = float(p[1])
		if i == 0:
			q[4] = float(p[0])
			er[4] = float(p[1])
		i+=1
	return q,er

# ~ def plot_commp(theta,q1,q2,q3):
	# ~ with PdfPages('comm_points_confirm.pdf') as pdf:
		# ~ if plt.rcParams["text.usetex"]:
			# ~ fmt1 = r'%r \%%'
		# ~ else:
			# ~ fmt1 = '%r %%'
		# ~ fig = plt.figure(figsize=(4.,2.8),dpi=600)
		# ~ plt.rc('text', usetex=True)
		# ~ panel = fig.add_axes([0.15, 0.15, 0.72, 0.75])
		# ~ plt.plot(theta,q1,linewidth=1.0,color='red',marker='x',label='point 1')
		# ~ plt.plot(theta,q2,linewidth=1.0,color='green',marker='^',label='point 2')
		# ~ plt.plot(theta,q3,linewidth=1.0,color='blue',marker='+',label='point 3')
		# ~ panel.set_xlabel(r'$\theta$',fontsize=axislabelfontsize,labelpad=2)
		# ~ for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		# ~ #panel.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))
		# ~ #panel.xaxis.set_major_locator(tck.MultipleLocator(base=0.5))
		# ~ #panel.xaxis.set_minor_locator(tck.MultipleLocator(base=0.25))
		# ~ panel.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
		# ~ panel.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 12))
		# ~ panel.xaxis.set_major_formatter(plt.FuncFormatter(multiple_formatter()))
		# ~ panel.set_ylabel(r'$q(\theta)$',fontsize=axislabelfontsize,labelpad=2)
		# ~ for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		# ~ panel.set_ylim(0.,1.1)
		# ~ panel.yaxis.set_major_locator(MultipleLocator(0.2))
		# ~ panel.yaxis.set_minor_locator(MultipleLocator(0.1))
		# ~ plt.legend()
		# ~ pdf.savefig(fig)
		
def plot_commp(theta,q1,q2,q3,er1,er2,er3):
	with PdfPages('comm_points_quarter_trasl_parv001Dr005.pdf') as pdf:
		if plt.rcParams["text.usetex"]:
			fmt1 = r'%r \%%'
		else:
			fmt1 = '%r %%'
		fig = plt.figure(figsize=(4.,2.8),dpi=600)
		plt.rc('text', usetex=True)
		panel = fig.add_axes([0.15, 0.15, 0.72, 0.75])
		plt.errorbar(theta,q1,yerr=er1,linewidth=1.0,color='red',marker='x',label='point 1',elinewidth=0.5,capsize=2.,capthick=0.5)
		plt.errorbar(theta,q2,yerr=er2,linewidth=1.0,color='green',marker='^',label='point 2',elinewidth=0.5,capsize=2.,capthick=0.5)
		plt.errorbar(theta,q3,yerr=er3,linewidth=1.0,color='blue',marker='+',label='point 3',elinewidth=0.5,capsize=2.,capthick=0.5)
		panel.set_xlabel(r'$\theta$',fontsize=axislabelfontsize,labelpad=2)
		for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
		panel.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 12))
		panel.xaxis.set_major_formatter(plt.FuncFormatter(multiple_formatter()))
		panel.set_ylabel(r'$q(\theta)$',fontsize=axislabelfontsize,labelpad=2)
		for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.set_ylim(-0.2,1.1)
		panel.yaxis.set_major_locator(MultipleLocator(0.2))
		panel.yaxis.set_minor_locator(MultipleLocator(0.1))
		
		custom_lines_n = [Line2D([0], [0], color="red", lw=6, alpha = 1.),
						Line2D([0], [0], color="green", lw=6, alpha = 1.),
						Line2D([0], [0], color="blue", lw=6, alpha = 1.)]
		
		panel.legend(custom_lines_n,['Point 1', 'Point 2', 'Point 3'] ,loc='upper center',bbox_to_anchor=(0.2, 0.35),fontsize=legendfontsize-1,handlelength=1.4,labelspacing=0.1,borderpad = 0.5)
		
		pdf.savefig(fig)
		
def plot_commpassive(theta,q1,q2,q3,er1,er2,er3):
	with PdfPages('comm_points_quarter_passive_rc_half_correct.pdf') as pdf:
		if plt.rcParams["text.usetex"]:
			fmt1 = r'%r \%%'
		else:
			fmt1 = '%r %%'
		fig = plt.figure(figsize=(4.,2.8),dpi=600)
		plt.rc('text', usetex=True)
		panel = fig.add_axes([0.18, 0.15, 0.72, 0.75])
		# ~ plt.errorbar(theta,q1,yerr=er1,linewidth=1.0,color='red',marker='x',label='point 1',elinewidth=0.5,capsize=2.,capthick=0.5)
		# ~ plt.errorbar(theta,q2,yerr=er2,linewidth=1.0,color='green',marker='^',label='point 2',elinewidth=0.5,capsize=2.,capthick=0.5)
		# ~ plt.errorbar(theta,q3,yerr=er3,linewidth=1.0,color='blue',marker='+',label='point 3',elinewidth=0.5,capsize=2.,capthick=0.5)
		plt.plot(theta,q1,linewidth=1.0,color='red',marker='x',label='point 1')
		plt.plot(theta,q2,linewidth=1.0,color='green',marker='^',label='point 2')
		plt.plot(theta,q3,linewidth=1.0,color='blue',marker='+',label='point 3')
		panel.set_xlabel(r'$\vartheta$',fontsize=axislabelfontsize,labelpad=2)
		for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
		panel.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 12))
		panel.xaxis.set_major_formatter(plt.FuncFormatter(multiple_formatter()))
		panel.set_ylabel(r'$q(\vartheta)$',fontsize=axislabelfontsize,labelpad=2)
		for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.set_ylim(-0.2,1.1)
		panel.yaxis.set_major_locator(MultipleLocator(0.2))
		panel.yaxis.set_minor_locator(MultipleLocator(0.1))
		
		custom_lines_n = [Line2D([0], [0], color="red", lw=6, alpha = 1.),
						Line2D([0], [0], color="green", lw=6, alpha = 1.),
						Line2D([0], [0], color="blue", lw=6, alpha = 1.)]
		
		panel.legend(custom_lines_n,['Point 1', 'Point 2', 'Point 3'] ,loc='upper center',bbox_to_anchor=(0.2, 0.31),fontsize=legendfontsize-1,handlelength=1.4,labelspacing=0.1,borderpad = 0.5)
		
		plt.text(0.,0.95,r"$(b)$",fontsize=axislabelfontsize+2)
		
		pdf.savefig(fig)
		
def plot_commexpteo(theta,q1,q2,q3,q1exp,q2exp,q3exp,er1exp,er2exp,er3exp,q1c,q2c,q3c):
	with PdfPages('Fig4.pdf') as pdf:
		if plt.rcParams["text.usetex"]:
			fmt1 = r'%r \%%'
		else:
			fmt1 = '%r %%'
		fig = plt.figure(figsize=(4.,2.8),dpi=600)
		plt.rc('text', usetex=True)
		panel = fig.add_axes([0.18, 0.15, 0.72, 0.8])
		plt.plot(theta,q1,linewidth=1.0,color='red')
		plt.plot(theta,q2,linewidth=1.0,color='green')
		plt.plot(theta,q3,linewidth=1.0,color='blue')
		plt.plot(theta,q1c,linewidth=1.0,color='red',linestyle='--')
		plt.plot(theta,q2c,linewidth=1.0,color='green',linestyle='--')
		plt.plot(theta,q3c,linewidth=1.0,color='blue',linestyle='--')
		plt.errorbar(theta,q1exp,yerr=er1exp,fmt='o',color='red',marker='^',markersize=3,elinewidth=0.5,capsize=2.,capthick=0.5)
		plt.errorbar(theta,q2exp,yerr=er2exp,fmt='o',color='green',marker='^',markersize=3,elinewidth=0.5,capsize=2.,capthick=0.5)
		plt.errorbar(theta,q3exp,yerr=er3exp,fmt='o',color='blue',marker='^',markersize=3,elinewidth=0.5,capsize=2.,capthick=0.5)
		panel.set_xlabel(r'$\varphi$',fontsize=axislabelfontsize,labelpad=2)
		for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
		panel.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 12))
		panel.xaxis.set_major_formatter(plt.FuncFormatter(multiple_formatter()))
		panel.set_ylabel(r'$q(\varphi)$',fontsize=axislabelfontsize,labelpad=2)
		for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize)
		panel.set_ylim(0.,1.)
		panel.yaxis.set_major_locator(MultipleLocator(0.2))
		panel.yaxis.set_minor_locator(MultipleLocator(0.1))
		
		custom_lines_n = [Line2D([0], [0], color="red", lw=6, alpha = 1.),
						Line2D([0], [0], color="green", lw=6, alpha = 1.),
						Line2D([0], [0], color="blue", lw=6, alpha = 1.)]
		
		panel.legend(custom_lines_n,[r"$\mathrm{Point \;} 1$", r"$\mathrm{Point \;} 2$", r"$\mathrm{Point \;} 3$"] ,loc='upper center',bbox_to_anchor=(0.8, 0.27),fontsize=legendfontsize-3,handlelength=1.4,labelspacing=0.1,borderpad = 0.5)
		
		custom_lines = [Line2D([], [], color="black", marker='^', linestyle='None', alpha = 1.),
						Line2D([0], [0], color="black", lw=1, alpha = 1.),
						Line2D([0], [0], color="black", dashes=[6, 2], lw=1, alpha = 1.)]
						
		panel = fig.add_axes([0.18, 0.35, 0.2, 0.2])
		panel.set_axis_off()
		panel.legend(custom_lines, [r"$\mathrm{Camphor \; disks}$", r"$\mathrm{Standard \; ABP}$", r"$\mathrm{Chiral \; ABP}$"],loc='upper center', bbox_to_anchor=(0.8, 0.15), fontsize = legendfontsize-3, borderpad = 0.3,handletextpad=0.5,columnspacing=2.)
		
		# ~ panel = fig.add_axes([0.26, 0.24, 0.24, 0.25])
		# ~ plt.plot(theta,q1d,linewidth=1.0,color='red')
		# ~ plt.plot(theta,q2d,linewidth=1.0,color='green')
		# ~ plt.plot(theta,q3d,linewidth=1.0,color='blue')
		# ~ plt.errorbar(theta,q1exp,yerr=er1exp,fmt='o',color='red',marker='^',markersize=1,elinewidth=0.3,capsize=1.5,capthick=0.3)
		# ~ plt.errorbar(theta,q2exp,yerr=er2exp,fmt='o',color='green',marker='^',markersize=1,elinewidth=0.3,capsize=1.5,capthick=0.3)
		# ~ plt.errorbar(theta,q3exp,yerr=er3exp,fmt='o',color='blue',marker='^',markersize=1,elinewidth=0.3,capsize=1.5,capthick=0.3)
		# ~ for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize-3)
		# ~ panel.tick_params(axis='x', pad=-0.05)
		# ~ panel.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
		# ~ panel.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 12))
		# ~ panel.xaxis.set_major_formatter(plt.FuncFormatter(multiple_formatter()))
		# ~ for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize-3)
		# ~ panel.set_ylim(0.,1.)
		# ~ panel.yaxis.set_major_locator(MultipleLocator(0.2))
		# ~ panel.yaxis.set_minor_locator(MultipleLocator(0.1))
		# ~ panel.text(0.6,0.1,r"$\ell = 0.4$",fontsize = axislabelfontsize)
		
		pdf.savefig(fig)
		
def plot_config():
	with PdfPages('Fig1.pdf') as pdf:
		if plt.rcParams["text.usetex"]:
			fmt1 = r'%r \%%'
		else:
			fmt1 = '%r %%'
		fig = plt.figure(figsize=(4.,4.),dpi=600)
		plt.rc('text', usetex=True)
		panel = fig.add_axes([0.17, 0.15, 0.8, 0.8])
		yt = np.linspace(-0.6,0.6,2000)
		xt = np.zeros(shape=(2000))
		i = 0
		for el in yt:
			xt[i] = -0.8
			i+=1
		panel.plot(xt,yt,linewidth=1.0,color='black')
		circle = plt.Circle((0, 0), 1., color='black', fill=False)
		circle1 = plt.Circle((0, 0), 0.1, color='black', fill=False)
		circle2 = plt.Circle((-0.5, 0), 0.1, color='red', fill=False)
		circle3 = plt.Circle((0, 0.5), 0.1, color='green', fill=False)
		circle4 = plt.Circle((0.5, 0), 0.1, color='blue', fill=False)
		panel.add_patch(circle)
		panel.add_patch(circle1)
		panel.add_patch(circle2)
		panel.add_patch(circle3)
		panel.add_patch(circle4)
		panel.text(-0.04,-0.04,"R")
		panel.text(-0.95,-0.04,"T")
		panel.text(-0.54,-0.04,"1")
		panel.text(-0.04,0.46,"2")
		panel.text(0.46,-0.04,"3")
		panel.set_xlabel(r'$x/\sigma$',fontsize=axislabelfontsize+3,labelpad=2)
		for tick in panel.xaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize+3)
		panel.set_xlim(-1.1,1.1)
		panel.xaxis.set_major_locator(MultipleLocator(0.5))
		panel.xaxis.set_minor_locator(MultipleLocator(0.1))
		panel.set_ylabel(r'$y/\sigma$',fontsize=axislabelfontsize+3,labelpad=2,rotation='horizontal')
		for tick in panel.yaxis.get_major_ticks(): tick.label.set_fontsize(axisticslabelfontsize+3)
		panel.set_ylim(-1.1,1.1)
		panel.yaxis.set_major_locator(MultipleLocator(0.5))
		panel.yaxis.set_minor_locator(MultipleLocator(0.1))
		pdf.savefig(fig)
		
def global_variables ():
	# setto anche alcune variabili comuni utili per le varie figure
	global axisticslabelfontsize
	global axisticslabelfontsizeinset
	global axislabelfontsize
	global axislabelfontsizeinset
	global legendfontsize
	global lineswidth
	axisticslabelfontsize=9
	axisticslabelfontsizeinset=7
	axislabelfontsize=11
	axislabelfontsizeinset=9
	legendfontsize=11
	lineswidth = 2
	return
	
def main():
	global_variables ()
	
	# ~ thetae = np.linspace(0.,2*np.pi,9)
	# ~ theta = np.zeros(shape=8)
	# ~ i = 0
	# ~ while i < len(thetae)-1:
		# ~ theta[i] += (thetae[i+1]+thetae[i])/2.
		# ~ i+=1
	# ~ theta = np.zeros(shape=(8))
	# ~ i = 0
	# ~ while i < 8:
		# ~ theta[i] = np.pi/8.+(i*(np.pi/4.))
		# ~ i+=1
	theta = np.zeros(shape=(5))
	i = 0
	while i < 4:
		theta[i] = i*(np.pi/2.)
		i+=1
	theta[4] = 2*np.pi
	# ~ theta = theta/np.pi
	
	# ~ q1,er1= read_commp("comm_left_sim_trial_parv001Dr005.dat")
	# ~ q2,er2= read_commp("comm_up_sim_trial_parv001Dr005.dat")
	# ~ q3,er3= read_commp("comm_right_sim_trial_parv001Dr005.dat")
	q1,er1 = read_commp("comm_left_sim_final_par_v001Dr005_correct.dat")
	q2,er2 = read_commp("comm_up_sim_final_par_v001Dr005_correct.dat")
	q3,er3 = read_commp("comm_right_sim_final_par_v001Dr005_correct.dat")
	q1c,er1c= read_commp("comm_left_sim_circle.dat")
	q2c,er2c= read_commp("comm_up_sim_circle.dat")
	q3c,er3c= read_commp("comm_right_sim_circle.dat")
	# ~ q1exp,er1exp = read_commp_exp("comm_left.dat")
	# ~ q2exp,er2exp = read_commp_exp("comm_up.dat")
	# ~ q3exp,er3exp = read_commp_exp("comm_right.dat")
	q1exp,er1exp = read_commp_exp("comm_left5.dat")
	q2exp,er2exp = read_commp_exp("comm_up5.dat")
	q3exp,er3exp = read_commp_exp("comm_right5.dat")
	# ~ q1,er1= read_commp("comm_left_sim_passive_rc_half_correct.dat")
	# ~ q2,er2= read_commp("comm_up_sim_passive_rc_half_correct.dat")
	# ~ q3,er3= read_commp("comm_right_sim_passive_rc_half_correct.dat")
	# ~ q1,er1= read_commp("comm_left_sim_passive_rc_half.dat")
	# ~ q2,er2= read_commp("comm_up_sim_passive_rc_half.dat")
	# ~ q3,er3= read_commp("comm_right_sim_passive_rc_half.dat")
	# ~ q1,er1= read_commp("comm_left_sim_trasl_parv001Dr005.dat")
	# ~ q2,er2= read_commp("comm_up_sim_trasl_parv001Dr005.dat")
	# ~ q3,er3= read_commp("comm_right_sim_trasl_parv001Dr005.dat")
	print("Data read!")

	# ~ plot_commp (theta,q1,q2,q3,er1,er2,er3)
	# ~ plot_commpassive (theta,q1,q2,q3,er1,er2,er3)
	plot_commexpteo (theta,q1,q2,q3,q1exp,q2exp,q3exp,er1exp,er2exp,er3exp,q1c,q2c,q3c)
	
	plot_config ()

main()
