5
file acidebase.py: part of the package pyacidobasic version %s:
7
Copyright (C) 2010 Georges Khaznadar <georgesk@ofset.org>
9
This program is free software: you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation, either version 3 of the License, or
12
(at your option) any later version.
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
GNU General Public License for more details.
19
You should have received a copy of the GNU General Public License
20
along with this program. If not, see <http://www.gnu.org/licenses/>.
23
from PyQt4.QtCore import *
24
from HTMLParser import *
26
class abHTMLparser(HTMLParser):
28
un analyseur de code HTML capable de construire une liste d'acides
31
def __init__(self,liste):
32
HTMLParser.__init__(self)
38
def handle_starttag(self, tag, attrs):
47
if self.gotAb == None: self.gotAb=0
49
elif self.ligne and self.d and (tag=="sup" or tag=="sub"):
50
self.input+="<"+tag+">"
52
def handle_data(self, data):
53
if self.ligne and self.d:
56
def handle_endtag(self, tag):
59
self.liste.append(self.ab)
63
formes=self.input.split(',')
67
self.ab.formes.append(QString(f))
69
self.ab.formeIndex= int(self.input)
71
self.ab.nom= QString(unicode(self.input,"utf-8"))
73
pKs=self.input.split(",")
76
self.ab.pK.append(float(pK))
78
self.ab.c= float(self.input)
80
self.ab.charge= int(self.input)
82
raise Exception(rangeError, u"trop de données dans le fichier d'entrée")
84
elif self.ligne and self.d and (tag=="sup" or tag=="sub"):
85
self.input+="</"+tag+">"
89
def __init__(self, formes=["AH","A<sup>-</sup>"], formeIndex=0, nom="acide générique", pK=[3.5], c=1.0, charge=0, v=0.0):
91
objet représentant un couple acido-basique
92
@param formes la liste des formes acido-basiques conjuguées
93
@param formeIndex la forme de base
94
@param nom désignation de la forme de base
95
@param pK liste des constantes d'acidité
96
@param c concentration initiale en mol/L
97
@param charge charge électrique de la forme acide en unité élémentaire
101
self.formeIndex=formeIndex
109
return acideBase(self.formes, self.formeIndex, self.nom, self.pK, self.c, self.charge, self.v)
112
return "%s;%s;%s;%s;%s;%s;%s" %(self.formes,
119
def chargeNette(self,pH):
121
Renvoie la charge électrique en Faraday en fonction du pH
123
concentrations=[1.0] # liste des concentrations des espèces
124
total=1.0 # concentration totale
126
c=concentrations[-1]*10**(pH-pK)
127
concentrations.append(c)
129
# On normaliste pour que la concentration totale soit self.c
130
concentrations=map(lambda c:c/total*self.c, concentrations)
131
ch=self.charge # on considère la cahrge de l'espèce acide
133
# on calcule d'abord la concentration de charges
134
for c in concentrations:
135
result+=c*ch # on cumule la charge de l'espèce acide
136
ch-=1 # et on passe à la base conjuguée
137
# puis la charge en Faraday, en multipliant par le volume en mL.
144
formes=s[0].split(',')
148
ab.formes.append(QString(f))
149
ab.formeIndex= int(s[1])
150
ab.nom= QString(unicode(s[2],"utf-8"))
154
ab.pK.append(float(pK))
159
def listFromString(s):
161
for ligne in s.split("\n"):
163
acideOuBase=fromString(ligne)
164
liste.append(acideOuBase)
171
remplit une liste d'acides/bases à partir de code HTML
174
p=abHTMLparser(liste)
178
def listFromFile(fname):
180
p=fname.index("html")
182
return listFromHTML(open(fname,"r").read(655360))
185
return listFromString(open(fname,"r").read(655360))