#!/usr/bin/python
"""ceci est un programme de voltametrie cyclique, il prend 
 en parametre d'execution le nom d'un fichier .dat contenant les 
 caracteristiques de la volta cyclique. de maniere optionnel il peut integerer 
 spécifiquement des cycles $2 à $3"""

import os,string,sys,time,readline,dircache


######################################################
##### routine d'intégration numérique
######################################################

def integrale(X,Y):
    """routine d'intégration numérique"""
    l=len(X)
    if len(X)!=len(Y): print "les 2 tableaux doivent avoir la meme taille"
    Int=0.0
    for i in range(l-1):
        Int=Int+0.5*(X[i+1]-X[i])*(Y[i]+Y[i+1])
    return Int

######################################
## Calcul de la charge de synthese Qs
######################################

def Qp(E,I,v):
    """Calcul de la charge de pic Qpic"""
#    Y=[]
#    for i in I:
#        Y.append(i/v)
    Q=integrale(E,I)
    return Q/v/2

######################################
## Calcul de la charge de pic Qp
######################################

def Qs(E,I,v):
    """Calcul de la charge de synthese Qs"""
    Y=[]
    for i in I:
        Y.append(abs(i))
    Q=integrale(E,Y)
    return Q/v

def LisFich(file):
	"""lit le fichier 'file' et retourne les potentiels E, les intensités I
	et la vitesse de ballayage"""
	E=[]
	I=[]
	nc=1
	Fichier=open(file,"r")
	for ligne in Fichier.readlines():
		if ligne[0]=="#": #on cherche la vitesse, mot clé : mV/s
			if string.find(ligne,"#E/I")==0:continue
			if string.find(ligne,"Potentiel")==0:continue
			print ligne[1:-1]
			if string.find(ligne,"mV/s")==1:
				v=int(string.split(ligne,":")[1])
			if string.find(ligne,"Cycle")==1:
				nc=int(string.split(ligne,":")[1])
			if string.find(ligne,"nPt")==1:
				np=int(string.split(ligne,":")[1])
		else:
			mots=string.split(ligne)
			E.append(float(mots[0]))
			I.append(float(mots[1]))
	return E,I,v,nc,np		

########################################
##Début de programme principale ########
########################################
if __name__=="__main__":
	"""programme principale : on lit un nom de fichier, on appelle """
	if len(sys.argv)<2:
	    for i in dircache.listdir('.'):
	        print i
	    entree=raw_input("Entrer le nom du fichier contenant la volta .dat : ")
	else:
	    entree=sys.argv[1]
	E,I,v,nc,np=LisFich(entree)
	print "Vitesse de balayage (en mV/s) : "+str(v)
	print "Nombre de cycles : "+str(nc)
#	print len(E),len(I),np
	print "Charge de Synthèse (en µC) : "+str(Qs(E,I,v))
	print "Charge de Pics moyenne     : "+str(Qp(E,I,v)/nc)
	fin=len(E);debut=0
	if len(sys.argv)>=3: debut=int(sys.argv[2])*np
	if len(sys.argv)>=4: fin=int(sys.argv[3])*np
	print "Pour les cycles "+str(debut/np)+" à "+str(fin/np)
	print "Charge de Synthèse (en µC) : "+str(Qs(E[debut:fin],I[debut:fin],v))
	print "Charge de Pics moyenne     :"+str(Qp(E[debut:fin],I[debut:fin],v)*np/(fin-debut))
