#!/usr/bin/env python

#########################################
import matplotlib.pyplot as plt         #
import numpy as np                      #
from math import sqrt, radians, cos	#
#########################################

plt.rcParams.update({'font.size': 11})
from scipy.constants import golden_ratio, inch
mm2inch = 1.0E-3 / inch

energy = 96.8 # kJmol normal incidence

# Laser-off rotation around y
LO_S0_y	     		= []
LO_S0_trap_y 		= []
LO_S0_weight_step_y 	= []
LO_S0_weight_terr_y	= []
LO_S0_step_y		= []
LO_S0_terr_y		= []
LO_branch_terr_y	= []
LO_branch_step_y 	= []
LO_branch_y		= []
energy_rot_off_y	= []

#v1 rotation around y
v1_S0_y                 = []
v1_S0_trap_y            = []
v1_S0_weight_step_y     = []
v1_S0_weight_terr_y     = []
v1_S0_step_y            = []
v1_S0_terr_y            = []
v1_branch_terr_y        = []
v1_branch_step_y        = []
v1_branch_y             = []
energy_rot_v1_y		= []

# Laser off rotation around x
LO_S0_x                 = []
LO_S0_trap_x            = []
LO_S0_weight_step_x     = []
LO_S0_weight_terr_x     = []
LO_S0_step_x            = []
LO_S0_terr_x            = []
LO_branch_terr_x        = []
LO_branch_step_x        = []
LO_branch_x             = []
energy_rot_off_x	= []

# v1 rotation around x
v1_S0_x                 = []
v1_S0_trap_x            = []
v1_S0_weight_step_x     = []
v1_S0_weight_terr_x     = []
v1_S0_step_x            = []
v1_S0_terr_x            = []
v1_branch_terr_x        = []
v1_branch_step_x        = []
v1_branch_x             = []
energy_rot_v1_x		= []

# Experimental data - rotating around y
LO_expt_y_rot = [[0,      0.0753,  0.00753],			# Angle, S0, err
		 [-10,    0.0751,  0.00751],
		 [-20,    0.0702,  0.00702],
		 [-30,    0.0574,  0.00574],
		 [-40,    0.0426,  0.005],
		 [-50,    0.0228,  0.005]]

LO_norm = [[58.2384,         0.01580,         0.005,	0.006,     0.002],		# Energy, Expt S0, Expt err, AIMD S0, AIMD err
	   [69.2488,         0.02685,         0.005,	0.019,     0.004],
	   [79.532,          0.04285,         0.005,	0.040,     0.009],
	   [92.5326,         0.06100,         0.005,	0.058,     0.010],
	   [96.8281,         0.07530,         0.005,	0.069,     0.008],		# Davide's values (0.07, 0.011) are for 500 trajectories
	   [107.875,         0.09425,         0.005,	0.102,     0.014]]

v1_norm = [[58.2384,         0.06825,         0.020,	0.030,	   0.008],		# Energy, Expt S0, Expt err, AIMD S0, AIMD err
	   [69.2488,         0.08303,         0.012,    0.076,     0.012],
	   [79.532,          0.08300,         0.030,    0.068,     0.011]]

# Calculations - rotating around y
LO_data_y = [[50,	1,	5,	1,	1,	134,	468,	509,	23,	1000.],
	     [40,	3,	8,	2,	8,	78,	478,	488,	33,	1000.], # Angle, CH step, CD step, CH terr, CD terr, trapped, nearest step, nearest edge, nearest corner, total
	     [30,       7,     25,      1,      4,      35,     481,    434,    85,     1000.],
	     [20,	7,	29,	0,	3,	18,	527,	363,	110,	1000.],
	     [10, 	7, 	46,	2,	5,	7,	545,	359,	96,	1000.],
	     [0,	16,	49,	2,	2,	4,	545,	335,	120,	1000.],
	     [-10,	21,	46,	0,	2,	1,	569,	333,	98,	1000.],
	     [-20,	11,	42,	0,	0,	5,	563,	343,	94,	1000.],
	     [-30,	12,	42,	0,	0,	17,	606,	301,	93,	1000.],
	     [-40,	13,	37,	0,	0,	47,	651,	267,	82,	1000.],
	     [-50,	7,	26,	0,	0,	120,	713,	240,	47,	1000.]]
								
v1_data_y = [[40, 	6,	3,	3,	0,	34,	257,	220,	23,	500.],
	     [20,	20,	12,	6,	5,	11,	269,	190,	41,	500.],
	     [0,	41,	19,	6,	1,	1,	269,	178,	52,	500.],
	     [-20,	21,	21,	2,	0,	5,	281,	158,	59,	500.],
	     [-40,	22,	14,	0,	0,	26,	317,	146,	37,	500.]]

LO_data_y_TN_corr = [[50, 0.007, 0.003],
		     [40, 0.019, 0.005],
		     [30, 0.033, 0.006],
                     [20, 0.040, 0.007],
		     [10, 0.060, 0.009],
                     [ 0, 0.069, 0.010],
                     [-10, 0.064, 0.009],
                     [-20, 0.049, 0.008],
                     [-30, 0.059, 0.009],
                     [-40, 0.044, 0.007],
                     [-50, 0.032, 0.006]]

# Calculations - rotating around x
LO_data_x = [[20,	3,	24,	0,	1,	6,	525,	383,	92,	1000.],
	     [0,        16,     49,     2,      2,      4,      545,    335,    120,    1000.]]

v1_data_x = [[40,	12,	3,	0,	0,	10,	268,	189,	43,	500.],	
	     [20,	23,	17,	5,	2,	3,	281,	168,	52,	500.],
	     [0,        41,     19,     6,      1,      1,      271,    178,    52,     500.]]

LO_data_x_TN_corr = [[20, 0.027, 0.006],
                     [ 0, 0.069, 0.010]]

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Sticking coefficients
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def sticking(stick,tot,S0_array):
	S0 = (float(stick)/tot)
	err = sqrt((1-S0)*S0/tot)
	S0_array.append([S0, err])
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Branching ratios
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def branching(CH,CD,branching_array):
	tot = CH+CD
	if tot !=0:
		CH_br = float(CH) / tot
		CD_br = float(CD) / tot
		if  CH != 0 and CD !=0:
			err = sqrt((1.0-CH_br)*CH_br/tot)
		else:
			err = 1.0-0.32**(1./tot)
	else:
		err = 0
		CH_br = 0
		CD_br = 0
	
	branching_array.append([CH_br, CD_br, err])
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Analysing data for rotation around the y axis
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for i in range (len(LO_data_y)):
# S0 for reaction
	stick = (LO_data_y[i][1] + LO_data_y[i][2] + LO_data_y[i][3] + LO_data_y[i][4])
	sticking(stick, LO_data_y[i][9], LO_S0_y)
# S0 for reaction + trapping
	trap = (stick + LO_data_y[i][5])
	sticking(trap, LO_data_y[i][9], LO_S0_trap_y)
# S0 for reaction on step and terrace
	sticking(LO_data_y[i][1]+LO_data_y[i][2], LO_data_y[i][9], LO_S0_step_y)
        sticking(LO_data_y[i][3]+LO_data_y[i][4], LO_data_y[i][9], LO_S0_terr_y)
# S0 for reaction on step and terrace considering number of molecules that hit step and terrace
	sticking(LO_data_y[i][1]+LO_data_y[i][2], LO_data_y[i][6], LO_S0_weight_step_y)
	sticking(LO_data_y[i][3]+LO_data_y[i][4], LO_data_y[i][7], LO_S0_weight_terr_y)
# Step to terrace branching ratio for reactivity
	branching(LO_data_y[i][1]+LO_data_y[i][2],LO_data_y[i][3]+LO_data_y[i][4],LO_branch_y)
# CH and CD on steps
	branching(LO_data_y[i][1],LO_data_y[i][2], LO_branch_step_y)
# CH and CD on terraces
        branching(LO_data_y[i][3],LO_data_y[i][4], LO_branch_terr_y)
# Energy
	energy_rot_off_y.append(energy*cos(radians(LO_data_y[i][0]))*cos(radians(LO_data_y[i][0])))

for i in range (len(v1_data_y)):
# S0 for reaction
        stick = (v1_data_y[i][1] + v1_data_y[i][2] + v1_data_y[i][3] + v1_data_y[i][4])
        sticking(stick, v1_data_y[i][9], v1_S0_y)
# S0 for reaction + trapping
        trap = (stick + v1_data_y[i][5])
        sticking(trap, v1_data_y[i][9], v1_S0_trap_y)
# S0 for reaction on step and terrace
        sticking(v1_data_y[i][1]+v1_data_y[i][2], v1_data_y[i][9], v1_S0_step_y)
        sticking(v1_data_y[i][3]+v1_data_y[i][4], v1_data_y[i][9], v1_S0_terr_y)
# S0 for reaction on step and terrace considering number of molecules that hit step and terrace
        sticking(v1_data_y[i][1]+v1_data_y[i][2], v1_data_y[i][6], v1_S0_weight_step_y)
        sticking(v1_data_y[i][3]+v1_data_y[i][4], v1_data_y[i][7], v1_S0_weight_terr_y)
# Step to terrace branching ratio for reactivity
        branching(v1_data_y[i][1]+v1_data_y[i][2],v1_data_y[i][3]+v1_data_y[i][4],v1_branch_y)
# CH and CD on steps
        branching(v1_data_y[i][1],v1_data_y[i][2], v1_branch_step_y)
# CH and CD on terraces
        branching(v1_data_y[i][3],v1_data_y[i][4], v1_branch_terr_y)
# Energy
        energy_rot_v1_y.append(energy*cos(radians(v1_data_y[i][0]))*cos(radians(v1_data_y[i][0])))

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Analysing data for rotation around the x axis
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for i in range (len(LO_data_x)):
# S0 for reaction
        stick = (LO_data_x[i][1] + LO_data_x[i][2] + LO_data_x[i][3] + LO_data_x[i][4])
        sticking(stick, LO_data_x[i][9], LO_S0_x)
# S0 for reaction + trapping
        trap = (stick + LO_data_x[i][5])
        sticking(trap, LO_data_x[i][9], LO_S0_trap_x)
# S0 for reaction on step and terrace
        sticking(LO_data_x[i][1]+LO_data_x[i][2], LO_data_x[i][9], LO_S0_step_x)
        sticking(LO_data_x[i][3]+LO_data_x[i][4], LO_data_x[i][9], LO_S0_terr_x)
# S0 for reaction on step and terrace considering number of molecules that hit step and terrace
        sticking(LO_data_x[i][1]+LO_data_x[i][2], LO_data_x[i][6], LO_S0_weight_step_x)
        sticking(LO_data_x[i][3]+LO_data_x[i][4], LO_data_x[i][7], LO_S0_weight_terr_x)
# Step to terrace branching ratio for reactivity
        branching(LO_data_x[i][1]+LO_data_x[i][2],LO_data_x[i][3]+LO_data_x[i][4],LO_branch_x)
# CH and CD on steps
        branching(LO_data_x[i][1],LO_data_x[i][2], LO_branch_step_x)
# CH and CD on terraces
        branching(LO_data_x[i][3],LO_data_x[i][4], LO_branch_terr_x)
# Energy
        energy_rot_off_x.append(energy*cos(radians(LO_data_x[i][0]))*cos(radians(LO_data_x[i][0])))

for i in range (len(v1_data_x)):
# S0 for reaction
        stick = (v1_data_x[i][1] + v1_data_x[i][2] + v1_data_x[i][3] + v1_data_x[i][4])
        sticking(stick, v1_data_x[i][9], v1_S0_x)
# S0 for reaction + trapping
        trap = (stick + v1_data_x[i][5])
        sticking(trap, v1_data_x[i][9], v1_S0_trap_x)
# S0 for reaction on step and terrace
        sticking(v1_data_x[i][1]+v1_data_x[i][2], v1_data_x[i][9], v1_S0_step_x)
        sticking(v1_data_x[i][3]+v1_data_x[i][4], v1_data_x[i][9], v1_S0_terr_x)
# S0 for reaction on step and terrace considering number of molecules that hit step and terrace
        sticking(v1_data_x[i][1]+v1_data_x[i][2], v1_data_x[i][6], v1_S0_weight_step_x)
        sticking(v1_data_x[i][3]+v1_data_x[i][4], v1_data_x[i][7], v1_S0_weight_terr_x)
# Step to terrace branching ratio for reactivity
        branching(v1_data_x[i][1]+v1_data_x[i][2],v1_data_x[i][3]+v1_data_x[i][4],v1_branch_x)
# CH and CD on steps
        branching(v1_data_x[i][1],v1_data_x[i][2], v1_branch_step_x)
# CH and CD on terraces
        branching(v1_data_x[i][3],v1_data_x[i][4], v1_branch_terr_x)
# Energy
        energy_rot_v1_x.append(energy*cos(radians(v1_data_x[i][0]))*cos(radians(v1_data_x[i][0])))

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Plots
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LO_data_y 	    = np.transpose(LO_data_y)
LO_S0_y 	    = np.transpose(LO_S0_y)
LO_expt_y_rot 	    = np.transpose(LO_expt_y_rot)
LO_S0_trap_y 	    = np.transpose(LO_S0_trap_y)
LO_branch_y 	    = np.transpose(LO_branch_y)
LO_branch_step_y    = np.transpose(LO_branch_step_y)
LO_branch_terr_y    = np.transpose(LO_branch_terr_y)
LO_norm 	    = np.transpose(LO_norm)
LO_S0_step_y 	    = np.transpose(LO_S0_step_y)
LO_S0_terr_y 	    = np.transpose(LO_S0_terr_y)
LO_S0_weight_step_y = np.transpose(LO_S0_weight_step_y)
LO_S0_weight_terr_y = np.transpose(LO_S0_weight_terr_y)
LO_data_y_TN_corr   = np.transpose(LO_data_y_TN_corr)

v1_data_y 	    = np.transpose(v1_data_y)
v1_S0_y 	    = np.transpose(v1_S0_y)
v1_S0_trap_y        = np.transpose(v1_S0_trap_y)
v1_branch_y 	    = np.transpose(v1_branch_y)
v1_branch_step_y    = np.transpose(v1_branch_step_y)
v1_branch_terr_y    = np.transpose(v1_branch_terr_y)
v1_norm             = np.transpose(v1_norm)
v1_S0_step_y 	    = np.transpose(v1_S0_step_y)
v1_S0_terr_y 	    = np.transpose(v1_S0_terr_y)
v1_S0_weight_step_y = np.transpose(v1_S0_weight_step_y)
v1_S0_weight_terr_y = np.transpose(v1_S0_weight_terr_y)

LO_data_x           = np.transpose(LO_data_x)
LO_S0_x             = np.transpose(LO_S0_x)
LO_S0_trap_x        = np.transpose(LO_S0_trap_x)
LO_branch_x         = np.transpose(LO_branch_x)
LO_branch_step_x    = np.transpose(LO_branch_step_x)
LO_branch_terr_x    = np.transpose(LO_branch_terr_x)
LO_S0_step_x 	    = np.transpose(LO_S0_step_x)
LO_S0_terr_x 	    = np.transpose(LO_S0_terr_x)
LO_S0_weight_step_x = np.transpose(LO_S0_weight_step_x)
LO_S0_weight_terr_x = np.transpose(LO_S0_weight_terr_x)
LO_data_x_TN_corr   = np.transpose(LO_data_x_TN_corr)

v1_data_x           = np.transpose(v1_data_x)
v1_S0_x             = np.transpose(v1_S0_x)
v1_S0_trap_x        = np.transpose(v1_S0_trap_x)
v1_branch_x         = np.transpose(v1_branch_x)
v1_branch_step_x    = np.transpose(v1_branch_step_x)
v1_branch_terr_x    = np.transpose(v1_branch_terr_x)
v1_S0_step_x 	    = np.transpose(v1_S0_step_x)
v1_S0_terr_x 	    = np.transpose(v1_S0_terr_x)
v1_S0_weight_step_x = np.transpose(v1_S0_weight_step_x)
v1_S0_weight_terr_x = np.transpose(v1_S0_weight_terr_x)

leiden_blue = (0,17/255,88/255)

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Rotating around y
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# TO FLIP PLOTS! #
fac = -1.

angfit = np.array([float(i) for i in range(-60,60)])
cosfit = 0.069*np.cos(np.radians(angfit))*np.cos(np.radians(angfit))

###########################################################
###########################################################
###							###
###		TERRACE VS STEP BRANCHING		###
###							###
###########################################################
###########################################################

# y rotation

#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(LO_branch_y[2])
up_err_step  = np.array(LO_branch_y[2])
low_err_terr = np.array(LO_branch_y[2])
up_err_terr  = np.array(LO_branch_y[2])

for i in range (len(LO_branch_y[2])):
        if LO_branch_y[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if LO_branch_y[1][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if LO_branch_y[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if LO_branch_y[1][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

plt.subplot(4,2,1)
plt.bar(fac*LO_data_y[0], LO_branch_y[0], width = 4, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(fac*LO_data_y[0], LO_branch_y[1], width = -4, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.errorbar(fac*LO_data_y[0]+2, LO_branch_y[0], yerr=np.array([low_err_step,up_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(fac*LO_data_y[0]-2, LO_branch_y[1], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-55,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(-40., 50., 20.0))
plt.ylabel('Fraction')
plt.annotate('A $\\rm{\\phi_i} = 0$'u'\xb0 Laser-Off', xy = (-52,0.95), xytext=(-52,0.95))

#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(v1_branch_y[2])
up_err_step  = np.array(v1_branch_y[2])
low_err_terr = np.array(v1_branch_y[2])
up_err_terr  = np.array(v1_branch_y[2])

for i in range (len(v1_branch_y[2])):
        if v1_branch_y[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if v1_branch_y[1][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if v1_branch_y[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if v1_branch_y[1][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

plt.subplot(4,2,3)
plt.bar(fac*v1_data_y[0], v1_branch_y[0], width = 4, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(fac*v1_data_y[0], v1_branch_y[1], width = -4, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.errorbar(fac*v1_data_y[0]+2, v1_branch_y[0], yerr=np.array([low_err_step,up_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(fac*v1_data_y[0]-2, v1_branch_y[1], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-55,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(-40., 50., 20.0))
plt.ylabel('Fraction')
plt.annotate('B $\\rm{\\phi_i} = 0$'u'\xb0 $\\nu_1$=1', xy = (-52,0.95), xytext=(-52,0.95))

# x rotation

#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(LO_branch_x[2])
up_err_step  = np.array(LO_branch_x[2])
low_err_terr = np.array(LO_branch_x[2])
up_err_terr  = np.array(LO_branch_x[2])

for i in range (len(LO_branch_x[2])):
        if LO_branch_x[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if LO_branch_x[1][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if LO_branch_x[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if LO_branch_x[1][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

plt.subplot(4,2,5)
plt.bar(LO_data_x[0], LO_branch_x[0], width = 2, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(LO_data_x[0], LO_branch_x[1], width = -2, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.errorbar(LO_data_x[0]+1, LO_branch_x[0], yerr=np.array([low_err_step,up_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(LO_data_x[0]-1, LO_branch_x[1], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-5,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(0, 51, 10.0))
plt.ylabel('Fraction')
lg = plt.legend(loc = 'upper right', numpoints = 1, prop={'size': 12})
lg.draw_frame(False)
plt.annotate('C $\\rm{\\phi_i} = 90$'u'\xb0 Laser-Off', xy = (-3,0.95), xytext=(-3,0.95))

#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(v1_branch_x[2])
up_err_step  = np.array(v1_branch_x[2])
low_err_terr = np.array(v1_branch_x[2])
up_err_terr  = np.array(v1_branch_x[2])

for i in range (len(v1_branch_x[2])):
        if v1_branch_x[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if v1_branch_x[1][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if v1_branch_x[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if v1_branch_x[1][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

plt.subplot(4,2,7)
plt.bar(v1_data_x[0], v1_branch_x[0], width = 2, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(v1_data_x[0], v1_branch_x[1], width = -2, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.errorbar(v1_data_x[0]+1, v1_branch_x[0], yerr=np.array([low_err_step,up_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(v1_data_x[0]-1, v1_branch_x[1], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-5,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(0, 51, 10.0))
plt.xlabel('$\\rm{\\theta_i}$ ('u'\xb0)')
plt.ylabel('Fraction')
plt.annotate('D $\\rm{\\phi_i} = 90$'u'\xb0 $\\nu_1$=1', xy = (-3,0.95), xytext=(-3,0.95))
plt.subplots_adjust(left=0.1, bottom=0.08, right=0.95, top=0.99, wspace=0.15, hspace=0.25)
plt.savefig('Fig7.png',bbox_inches='tight',dpi=300)
plt.show()

###########################################################
###########################################################
###                                                     ###
###             SHADOWING NEAREST TRAJ	                ###
###                                                     ###
###########################################################
###########################################################

# y rotation

plt.subplot(4,2,1)
plt.bar(fac*LO_data_y[0], LO_data_y[6]/LO_data_y[9],  width = 4, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(fac*LO_data_y[0], LO_data_y[7]/LO_data_y[9],  width = -4, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.bar(fac*LO_data_y[0], LO_data_y[8]/LO_data_y[9],  width = -4, color = 'green', ecolor = 'black', align = 'center', label = 'Corner')
plt.xlim(-55,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(-40., 50., 20.0))
plt.ylabel('Fraction')
plt.annotate('A $\\rm{\\phi_i} = 0$'u'\xb0 Laser-Off', xy = (-52,0.95), xytext=(-52,0.95))

plt.subplot(4,2,3)
plt.bar(fac*v1_data_y[0], v1_data_y[6]/v1_data_y[9],  width = 4, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(fac*v1_data_y[0], v1_data_y[7]/v1_data_y[9],  width = -4, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.bar(fac*v1_data_y[0], v1_data_y[8]/v1_data_y[9],  width = -4, color = 'green', ecolor = 'black', align = 'center', label = 'Corner')
plt.xlim(-55,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(-40., 50., 20.0))
plt.ylabel('Fraction')
plt.annotate('B $\\rm{\\phi_i} = 0$'u'\xb0 $\\nu_1$=1', xy = (-52,0.95), xytext=(-52,0.95))

# x rotation

plt.subplot(4,2,5)
plt.bar(LO_data_x[0], LO_data_x[6]/LO_data_x[9],  width = 2, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(LO_data_x[0], LO_data_x[7]/LO_data_x[9],  width = -2, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.bar(LO_data_x[0], LO_data_x[8]/LO_data_x[9],  width = -2, color = 'green', ecolor = 'black', align = 'center', label = 'Corner')
plt.xlim(-5,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(0, 51, 10.0))
lg = plt.legend(loc = 'best', numpoints = 1,  prop={'size': 12})
lg.draw_frame(False)
plt.ylabel('Fraction')
plt.annotate('C $\\rm{\\phi_i} = 90$'u'\xb0 Laser-Off', xy = (-3,0.95), xytext=(-3,0.95))

plt.subplot(4,2,7)
plt.bar(v1_data_x[0], v1_data_x[6]/v1_data_x[9],  width = 2, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(v1_data_x[0], v1_data_x[7]/v1_data_x[9],  width = -2, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.bar(v1_data_x[0], v1_data_x[8]/v1_data_x[9],  width = -2, color = 'green', ecolor = 'black', align = 'center', label = 'Corner')
plt.xlim(-5,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(0, 51, 10.0))
plt.xlabel('$\\rm{\\theta_i}$ ('u'\xb0)')
plt.ylabel('Fraction')
plt.annotate('D $\\rm{\\phi_i} = 90$'u'\xb0 $\\nu_1$=1', xy = (-3,0.95), xytext=(-3,0.95))
plt.subplots_adjust(left=0.1, bottom=0.08, right=0.95, top=0.99, wspace=0.15, hspace=0.25)
plt.savefig('Fig8.png',bbox_inches='tight', dpi=300)
plt.show()

###########################################################
###########################################################
###                                                     ###
###             WEIGHTED S0	                        ###
###                                                     ###
###########################################################
###########################################################

# y rotation

plt.subplot(4,2,1)
plt.errorbar(fac*LO_data_y[0], LO_S0_weight_step_y[0], yerr = LO_S0_weight_step_y[1],marker = 'o', color = 'red', mec = 'red', markersize =5, linestyle = 'None', label = 'Step')
plt.errorbar(fac*LO_data_y[0], LO_S0_weight_terr_y[0], yerr = LO_S0_weight_terr_y[1],marker = 'o', color = 'blue', mec = 'blue', markersize =5, linestyle = 'None', label = 'Terrace')
plt.xlim(-55,55)
plt.ylim(0,0.16)
plt.xticks(np.arange(-40., 50., 20.0))
plt.yticks(np.arange(0.0, 0.2, 0.04))
plt.ylabel('S$_0$(site)')
plt.annotate('A $\\rm{\\phi_i} = 0$'u'\xb0 Laser-Off', xy = (50,0.1), xytext=(-52,0.13))

plt.subplot(4,2,3)
plt.errorbar(fac*v1_data_y[0], v1_S0_weight_step_y[0], yerr = v1_S0_weight_step_y[1], marker = 'o', color = 'red', mec = 'red', markersize =5, linestyle = 'None', label = 'Step')
plt.errorbar(fac*v1_data_y[0], v1_S0_weight_terr_y[0], yerr = v1_S0_weight_terr_y[1], marker = 'o', color = 'blue', mec = 'blue', markersize =5, linestyle = 'None', label = 'Terrace')
plt.xlim(-55,55)
plt.ylim(0,0.25)
plt.xticks(np.arange(-40., 50., 20.0))
plt.ylabel('S$_0$(site)')
plt.annotate('B $\\rm{\\phi_i} = 0$'u'\xb0 $\\nu_1$=1', xy = (-52,0.20), xytext = (-52,0.20))

# x rotation

plt.subplot(4,2,5)
plt.errorbar(LO_data_x[0], LO_S0_weight_step_x[0], yerr = LO_S0_weight_step_x[1],marker = 's', color = 'red', mec = 'red', markersize =5, linestyle = 'None', label = 'Step')
plt.errorbar(LO_data_x[0], LO_S0_weight_terr_x[0], yerr = LO_S0_weight_terr_x[1],marker = 's', color = 'blue', mec = 'blue', markersize =5, linestyle = 'None', label = 'Terrace')
plt.errorbar(-LO_data_x[0], LO_S0_weight_step_x[0], yerr = LO_S0_weight_step_x[1],marker = 's', color = 'red', mec = 'red', markersize =5, linestyle = 'None')
plt.errorbar(-LO_data_x[0], LO_S0_weight_terr_x[0], yerr = LO_S0_weight_terr_x[1],marker = 's', color = 'blue', mec = 'blue', markersize =5, linestyle = 'None')
plt.xlim(-5,55)
plt.ylim(0,0.16)
plt.yticks(np.arange(0.0, 0.2, 0.04))
plt.xticks(np.arange(0, 51, 10.0))
plt.ylabel('S$_0$(site)')
lg = plt.legend(loc = 'lower right', numpoints = 1, prop={'size': 12})
lg.draw_frame(False)
plt.annotate('C $\\rm{\\phi_i} = 90$'u'\xb0 Laser-Off', xy = (23,0.1), xytext=(23,0.13))

plt.subplot(4,2,7)
plt.errorbar(v1_data_x[0], v1_S0_weight_step_x[0], yerr = v1_S0_weight_step_x[1], marker = 's', color = 'red', mec = 'red', markersize =5, linestyle = 'None', label = 'Step')
plt.errorbar(v1_data_x[0], v1_S0_weight_terr_x[0], yerr = v1_S0_weight_terr_x[1], marker = 's', color = 'blue', mec = 'blue', markersize =5, linestyle = 'None', label = 'Terrace')
plt.errorbar(-v1_data_x[0], v1_S0_weight_step_x[0], yerr = v1_S0_weight_step_x[1], marker = 's', color = 'red', mec = 'red', markersize =5, linestyle = 'None')
plt.errorbar(-v1_data_x[0], v1_S0_weight_terr_x[0], yerr = v1_S0_weight_terr_x[1], marker = 's', color = 'blue', mec = 'blue', markersize =5, linestyle = 'None')
plt.xlim(-5,55)
plt.ylim(0,0.25)
plt.xticks(np.arange(0, 51, 10.0))
plt.xlabel('$\\rm{\\theta_i}$ ('u'\xb0)')
plt.ylabel('S$_0$(site)')
plt.annotate('D $\\rm{\\phi_i} = 90$'u'\xb0 $\\nu_1$=1', xy = (30,0.20), xytext = (30,0.20))
plt.subplots_adjust(left=0.1, bottom=0.08, right=0.95, top=0.99, wspace=0.15, hspace=0.25)
plt.savefig('Fig9.png',bbox_inches='tight', dpi=300)
plt.show()

###########################################################
###########################################################
###                                                     ###
###             CH RATIO                                ###
###                                                     ###
###########################################################
###########################################################

# y rotation

#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(LO_branch_step_y[2])
up_err_step  = np.array(LO_branch_step_y[2])
low_err_terr = np.array(LO_branch_terr_y[2])
up_err_terr  = np.array(LO_branch_terr_y[2])

for i in range (len(LO_branch_step_y[2])):
        if LO_branch_step_y[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if LO_branch_terr_y[0][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if LO_branch_step_y[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if LO_branch_terr_y[0][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# CH branching laser off (top) and v1 (bottom)
plt.subplot(4,2,1)
plt.bar(fac*LO_data_y[0], LO_branch_step_y[0], width = 4, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(fac*LO_data_y[0], LO_branch_terr_y[0], width = -4, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.errorbar(fac*LO_data_y[0]+2, LO_branch_step_y[0], yerr=np.array([up_err_step,low_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(fac*LO_data_y[0]-2, LO_branch_terr_y[0], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-55,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(-40., 50., 20.0))
plt.ylabel('Fraction')
plt.annotate('A $\\rm{\\phi_i} = 0$'u'\xb0 Laser-Off', xy = (-52,0.95), xytext = (-52,0.95))
lg = plt.legend(loc = 'upper right', numpoints = 1, prop={'size': 12})
lg.draw_frame(False)


#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(v1_branch_step_y[2])
up_err_step  = np.array(v1_branch_step_y[2])
low_err_terr = np.array(v1_branch_terr_y[2])
up_err_terr  = np.array(v1_branch_terr_y[2])

for i in range (len(v1_branch_step_y[2])):
        if v1_branch_step_y[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if v1_branch_terr_y[0][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if v1_branch_step_y[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if v1_branch_terr_y[0][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

plt.subplot(4,2,3)
plt.plot([],[], 'w', label = '$\\rm{\\phi_i} = 0$'u'\xb0')
plt.bar(fac*v1_data_y[0], v1_branch_step_y[0], width = 4, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(fac*v1_data_y[0], v1_branch_terr_y[0], width = -4, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.errorbar(fac*v1_data_y[0]+2, v1_branch_step_y[0], yerr=np.array([up_err_step,low_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(fac*v1_data_y[0]-2, v1_branch_terr_y[0], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-55,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(-40., 50., 20.0))
plt.ylabel('Fraction')
plt.annotate('B       $\\rm{\\phi_i} = 0$'u'\xb0 $\\nu_1$=1', xy = (-52,0.95), xytext = (-52,0.95))

#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(LO_branch_step_x[2])
up_err_step  = np.array(LO_branch_step_x[2])
low_err_terr = np.array(LO_branch_terr_x[2])
up_err_terr  = np.array(LO_branch_terr_x[2])

for i in range (len(LO_branch_step_x[2])):
        if LO_branch_step_x[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if LO_branch_terr_x[0][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if LO_branch_step_x[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if LO_branch_terr_x[0][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# x rotation

plt.subplot(4,2,5)
plt.bar(LO_data_x[0], LO_branch_step_x[0], width = 2, color = 'red', ecolor = 'black', align = 'edge', label = 'Step')
plt.bar(LO_data_x[0], LO_branch_terr_x[0], width = -2, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terrace')
plt.errorbar(LO_data_x[0]+1, LO_branch_step_x[0], yerr=np.array([up_err_step,low_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(LO_data_x[0]-1, LO_branch_terr_x[0], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-5,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(0, 51, 10.0))
plt.ylabel('Fraction')
plt.annotate('C $\\rm{\\phi_i} = 90$'u'\xb0 Laser-Off', xy = (-3,0.95), xytext = (-3,0.95))


#~~~ MAKING ASYMMETRIC ERRORS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
low_err_step = np.array(v1_branch_step_x[2])
up_err_step  = np.array(v1_branch_step_x[2])
low_err_terr = np.array(v1_branch_terr_x[2])
up_err_terr  = np.array(v1_branch_terr_x[2])

for i in range (len(v1_branch_step_x[2])):
        if v1_branch_step_x[0][i]-low_err_step[i] < 0.:low_err_step[i] = 0
        if v1_branch_terr_x[0][i]-low_err_terr[i] < 0.:low_err_terr[i] = 0
        if v1_branch_step_x[0][i]+up_err_step[i] > 1.: up_err_step[i] = 0
        if v1_branch_terr_x[0][i]+up_err_terr[i] > 1.: up_err_terr[i] = 0
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

plt.subplot(4,2,7)
plt.bar(v1_data_x[0], v1_branch_step_x[0], width = 2, color = 'red', ecolor = 'black', align = 'edge', label = 'Step rxn')
plt.bar(v1_data_x[0], v1_branch_terr_x[0], width = -2, color = 'blue', ecolor = 'black', align = 'edge', label = 'Terr rxn')
plt.errorbar(v1_data_x[0]+1, v1_branch_step_x[0], yerr=np.array([up_err_step,low_err_step]), linestyle='None', ecolor = 'black')
plt.errorbar(v1_data_x[0]-1, v1_branch_terr_x[0], yerr=np.array([low_err_terr,up_err_terr]), linestyle='None', ecolor = 'black')
plt.xlim(-5,55)
plt.ylim(0,1.2)
plt.xticks(np.arange(0, 51, 10.0))
plt.xlabel('$\\rm{\\theta_i}$ ('u'\xb0)')
plt.ylabel('Fraction')
plt.annotate('D $\\rm{\\phi_i} = 90$'u'\xb0 $\\nu_1$=1', xy = (-3,0.95), xytext = (-3,0.95))
plt.subplots_adjust(left=0.1, bottom=0.08, right=0.95, top=0.99, wspace=0.15, hspace=0.25)
plt.savefig('Fig10.png',bbox_inches='tight', dpi=300)
plt.show()

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# x rotation vs y rotation
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# AIMD laser off vs laser on
cosfit = v1_S0_x[0][2]*np.cos(np.radians(angfit))*np.cos(np.radians(angfit))

plt.subplot(2,2,1)
plt.plot(angfit,cosfit, 'k--')
plt.plot([],[], 'ko', label = '$\\rm{\\phi_i} = 0$'u'\xb0')
plt.errorbar(fac*LO_data_y[0],LO_S0_y[0], yerr=LO_S0_y[1], color='blue', marker='o', mec = 'blue', markersize = 5, linestyle='None')
plt.errorbar(fac*v1_data_y[0], v1_S0_y[0], yerr=v1_S0_y[1], color='red',  marker='o', mec = 'red', markersize = 5, linestyle='None')
plt.plot([],[], 'ks', label = '$\\rm{\\phi_i} = 90$'u'\xb0')
plt.errorbar(LO_data_x[0],LO_S0_x[0], yerr=LO_S0_x[1], color='blue', marker='s', mec = 'blue', markersize = 5, linestyle='None')
plt.errorbar(v1_data_x[0], v1_S0_x[0], yerr=v1_S0_x[1], color='red',  marker='s', mec = 'red', markersize = 5, linestyle='None')
plt.errorbar(-LO_data_x[0],LO_S0_x[0], yerr=LO_S0_x[1], color='blue', marker='s', mec = 'blue', markersize = 5, linestyle='None')
plt.errorbar(-v1_data_x[0], v1_S0_x[0], yerr=v1_S0_x[1], color='red',  marker='s', mec = 'red', markersize = 5, linestyle='None')
plt.xlim(-55,55)
plt.ylim(0,0.16)
plt.xticks(np.arange(-40., 50., 20.0))
plt.yticks(np.arange(0.,0.18,0.04))
plt.xlabel('$\\rm{\\theta_i}$ ('u'\xb0)')
plt.ylabel('S$_0$')
lg = plt.legend(loc = 'best', numpoints = 1, prop={'size': 11})
lg.draw_frame(False)
plt.savefig('Fig5.png',bbox_inches='tight', dpi=300)
plt.show()


