#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys                
import matplotlib.pyplot as plt
from matplotlib import lines
from pylab import *

if __name__ == '__main__':
    inputfile = sys.argv[1]
with open(str(inputfile),'r') as f:
    vec_s1 = [float(x) for x in f.readline().split()]   
    mat_I = np.array([[float(x) for x in ln.split()] for ln in f])    
#mat_I = np.loadtxt(str(inputfile),skiprows=1)

print vec_s1
print mat_I
#enable the following lines if you dont have a working X display
#import matplotlib
#matplotlib.use('Agg')

#MUTUALI INFORMATION PLOT:

# edit the following line to select the orbitals...
zselect=False
if zselect:
    select =[]
    select.extend(range(34,132))
    select = [x-1 for x in select]
    nselect = len(select)
    vec_s1_s = np.zeros(nselect)
    mat_I_s = np.zeros((nselect,nselect))
    print mat_I_s, vec_s1_s

    for i,x in enumerate(select):
        vec_s1_s[i]=vec_s1[x]
    for i,x in enumerate(select):
        for j,y in enumerate(select):
            mat_I_s[i,j] = mat_I[x,y]

    
    print vec_s1_s
    print mat_I_s
    vec_s1 = vec_s1_s
    mat_I = mat_I_s 

    
    

#end selection


N= len(mat_I)
print N
theta = np.zeros(N)
r=np.zeros(N)
labels=np.zeros(N)
area=np.zeros(N)

for i in range(N):
  theta[i]=-2*pi/N*i+pi/2
  r[i]=1.0
  if zselect:
      labels[i]=select[i]+1
  else:
      labels[i]=i+1
  area[i]=vec_s1[i]*500

if (len(sys.argv) > 2):
 for j in range(2,len(sys.argv)):
   if (sys.argv[j] == '-c'):
     coordfile = sys.argv[j+1]
     with open(str(coordfile),'r') as f:
       for i in range(N):
         line = f.readline().split()
         theta[i] = float(line[0]) +pi/2
         r[i] = float(line[1])
print 'theta=',theta
print 'r=',r
 
 


ax = plt.subplot(111,polar=True)
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.grid(b=False)
c = plt.scatter(theta,r,c="Red",s=area)


if (len(sys.argv) > 2):
  for j in range(2,len(sys.argv)):
    print 'sys.argv',j,sys.argv[j]
    if (sys.argv[j] == '-t'):
      plt.title(sys.argv[j+1])
      break
    else:
      plt.title('N = '+str(N/2)+', Results file: '+sys.argv[1])

#this is dummy:
#c1 = plt.scatter(theta,(r+0.05),c="red",s=0)

for i in range(N):
#  plt.annotate(int(labels[i]),xy=(theta[i],(r[i]+0.2)),size='xx-large',)
  plt.text(theta[i],(r[i]+0.25),int(labels[i]),size='x-small',ha='center',va='center')
  for j in range(i,N):
    x =[theta[i],theta[j]]
    y =[r[i],r[j]]
    #y =[1,1]
    if mat_I[i,j] >= 0.1:
      line1 = lines.Line2D(x, y, linewidth=3, color='black',linestyle='-', alpha=0.8,label='0.1')
      ax.add_line(line1)
    elif mat_I[i,j] >=0.01:
      line2 = lines.Line2D(x, y, linewidth=3, color='green',linestyle='-', alpha=0.8,label='0.01')
      ax.add_line(line2)
    elif mat_I[i,j] >=0.001:
      line3 = lines.Line2D(x, y, linewidth=3, color='gray',linestyle='-', alpha=0.6,label='0.001')
      ax.add_line(line3)
params = {'legend.fontsize': 16,
          'legend.linewidth': 2}

#need to check if the three types of lines really exist.
if 'line1' in locals() and 'line2' in locals() and 'line3' in locals():
  ax.legend([line1, line2, line3],[line1.get_label(),line2.get_label(),line3.get_label()],bbox_to_anchor=(0.00,1.0),fancybox=True,shadow=True)
elif 'line1' in locals() and 'line2' in locals():
  ax.legend([line1, line2],[line1.get_label(),line2.get_label()],bbox_to_anchor=(0.00,1.0),fancybox=True,shadow=True)
elif 'line1' in locals() and 'line3' in locals():
  ax.legend([line1, line3],[line1.get_label(),line3.get_label()],bbox_to_anchor=(0.00,1.0),fancybox=True,shadow=True)
elif 'line2' in locals() and 'line3' in locals():
  ax.legend([line2, line3],[line2.get_label(),line3.get_label()],bbox_to_anchor=(0.00,1.0),fancybox=True,shadow=True)
elif 'line1' in locals():
  ax.legend([line1],[line1.get_label()],bbox_to_anchor=(0.00,1.0),fancybox=True,shadow=True)
elif 'line2' in locals():
  ax.legend([line3],[line2.get_label()],bbox_to_anchor=(0.00,1.0),fancybox=True,shadow=True)
elif 'line3' in locals():
  ax.legend([line2],[line3.get_label()],bbox_to_anchor=(0.00,1.0),fancybox=True,shadow=True)
#probably not the best way to code it.

#for saving, enable matplotlib.use('Agg') 
#plt.savefig(str(sys.argv[1])+'.eps')
plt.show()
