@@ -513,7 +513,9 @@ def calculate_HH(self, template_name, pH_list=None, pka_set=None):
513513 Defaults to 50 values between 2 and 12.
514514
515515 pka_set ('dict', optional):
516- Mapping: {particle_name: {"pka_value": 'float', "acidity": "acidic"|"basic"}}
516+ Mapping per particle. Monoprotic entries use
517+ {"pka_value": float, "acidity": ...}, polyprotic entries use
518+ {"pka_values": [float, ...], "acidity": ...}.
517519
518520 Returns:
519521 'list[float]':
@@ -530,7 +532,7 @@ def calculate_HH(self, template_name, pH_list=None, pka_set=None):
530532 return [None ] * len (pH_list )
531533 charge_number_map = self .get_charge_number_map ()
532534 def formal_charge (particle_name ):
533- tpl = self .db .get_template (name = particle_name ,
535+ tpl = self .db .get_template (name = particle_name ,
534536 pmb_type = "particle" )
535537 state = self .db .get_template (name = tpl .initial_state ,
536538 pmb_type = "particle_state" )
@@ -540,20 +542,24 @@ def formal_charge(particle_name):
540542 Z = 0.0
541543 for particle , multiplicity in particle_counts .items ():
542544 if particle in pka_set :
543- pka = pka_set [particle ][ "pka_value" ]
544- acidity = pka_set [ particle ] ["acidity" ]
545+ entry = pka_set [particle ]
546+ acidity = entry ["acidity" ]
545547 if acidity == "acidic" :
546548 psi = - 1
547549 elif acidity == "basic" :
548550 psi = + 1
549551 else :
550552 raise ValueError (f"Unknown acidity '{ acidity } ' for particle '{ particle } '" )
551- charge = psi / (1.0 + 10.0 ** (psi * (pH - pka )))
553+ if "pka_values" in entry :
554+ pka_list = entry ["pka_values" ]
555+ else :
556+ pka_list = [entry ["pka_value" ]]
557+ charge = sum (psi / (1.0 + 10.0 ** (psi * (pH - pka ))) for pka in pka_list )
552558 Z += multiplicity * charge
553559 else :
554560 Z += multiplicity * formal_charge (particle )
555561 Z_HH .append (Z )
556- return Z_HH
562+ return Z_HH
557563
558564 def calculate_HH_Donnan (self , c_macro , c_salt , pH_list = None , pka_set = None ):
559565 """
0 commit comments