Update string formatting to modern version.

Focuses only on complex formatting.
This commit is contained in:
Nathan Baker
2020-05-27 16:26:52 -07:00
parent 557ab19312
commit 6e7c188dbd
7 changed files with 90 additions and 77 deletions

View File

@@ -242,8 +242,8 @@ def add_trp_hydrogen(residue):
elif atom.name == "CE2": elif atom.name == "CE2":
ce_atom = atom ce_atom = atom
if (cd_atom is None) or (ne_atom is None) or (ce_atom is None): if (cd_atom is None) or (ne_atom is None) or (ce_atom is None):
errstr = "Unable to find all atoms for %s %s" % (residue[0].res_name, errstr = "Unable to find all atoms for %s %s" % (
residue[0].res_num) residue[0].res_name, residue[0].res_num)
raise ValueError(errstr) raise ValueError(errstr)
he_atom = protonate_sp2(cd_atom, ne_atom, ce_atom) he_atom = protonate_sp2(cd_atom, ne_atom, ce_atom)
he_atom.name = "HNE" he_atom.name = "HNE"
@@ -269,8 +269,8 @@ def add_amd_hydrogen(residue):
or (atom.res_name == "ASN" and atom.name == "ND2")): or (atom.res_name == "ASN" and atom.name == "ND2")):
n_atom = atom n_atom = atom
if (c_atom is None) or (o_atom is None) or (n_atom is None): if (c_atom is None) or (o_atom is None) or (n_atom is None):
errstr = "Unable to find all atoms for %s %s" % (residue[0].res_name, errstr = "Unable to find all atoms for %s %s" % (
residue[0].res_num) residue[0].res_name, residue[0].res_num)
raise ValueError(errstr) raise ValueError(errstr)
h1_atom = protonate_direction(n_atom, o_atom, c_atom) h1_atom = protonate_direction(n_atom, o_atom, c_atom)
h1_atom.name = "HN1" h1_atom.name = "HN1"
@@ -604,8 +604,8 @@ def hydrogen_bond_interaction(group1, group2, version):
atoms2 = group2.get_interaction_atoms(group1) atoms2 = group2.get_interaction_atoms(group1)
[closest_atom1, dist, closest_atom2] = get_smallest_distance(atoms1, atoms2) [closest_atom1, dist, closest_atom2] = get_smallest_distance(atoms1, atoms2)
if None in [closest_atom1, closest_atom2]: if None in [closest_atom1, closest_atom2]:
warning('Side chain interaction failed for %s and %s' % (group1.label, warning('Side chain interaction failed for %s and %s' % (
group2.label)) group1.label, group2.label))
return None return None
# get the parameters # get the parameters
[dpka_max, cutoff] = version.get_hydrogen_bond_parameters(closest_atom1, [dpka_max, cutoff] = version.get_hydrogen_bond_parameters(closest_atom1,

View File

@@ -575,9 +575,11 @@ class ConformationContainer:
def __str__(self): def __str__(self):
"""String that lists statistics of atoms and groups.""" """String that lists statistics of atoms and groups."""
str_ = ( fmt = (
'Conformation container %s with %d atoms and %d groups' "Conformation container {name} with {natoms:d} atoms and "
% (self.name, len(self), len(self.groups))) "{ngroups:d} groups")
str_ = fmt.format(
name=self.name, natoms=len(self), ngroups=len(self.groups))
return str_ return str_
def __len__(self): def __len__(self):

View File

@@ -146,31 +146,27 @@ class NonCovalentlyCoupledGroups:
""" """
self.parameters = conformation.parameters self.parameters = conformation.parameters
if verbose: if verbose:
info('') info_fmt = (
info(' Warning: When using the -d option, pKa values based on ' '\n'
'\'swapped\' interactions') ' Warning: When using the -d option, pKa values based on \n'
info(' will be writting to the output .pka file') '\'swapped\' interactions\n'
info('') ' will be writting to the output .pka file\n'
info('-' * 103) '\n'
info(' Detecting non-covalently coupled residues') '{sep}\n'
info('-' * 103) '\n'
info(' Maximum pKa difference: %4.2f pKa units' ' Detecting non-covalently coupled residues\n'
% self.parameters.max_intrinsic_pka_diff) '{sep}\n'
info(' Minimum interaction energy: %4.2f pKa units' ' Maximum pKa difference: {c.max_intrinsic_pka_diff:>4.2f} pKa units\n'
% self.parameters.min_interaction_energy) ' Minimum interaction energy: {c.min_interaction_energy:>4.2f} pKa units\n'
info(' Maximum free energy diff.: %4.2f pKa units' ' Maximum free energy diff.: {c.max_free_energy_diff:>4.2f} pKa units\n'
% self.parameters.max_free_energy_diff) ' Minimum swap pKa shift: {c.min_swap_pka_shift:>4.2f} pKa units\n'
info(' Minimum swap pKa shift: %4.2f pKa units' ' pH: {c.pH:>6} \n'
% self.parameters.min_swap_pka_shift) ' Reference: {c.reference}\n'
info(' pH: %6s ' ' Min pKa: {c.min_pka:>4.2f}\n'
% str(self.parameters.pH)) ' Max pKa: {c.max_pka:>4.2f}\n'
info(' Reference: %s' '\n')
% self.parameters.reference) sep = "-" * 103
info(' Min pKa: %4.2f' info(info_fmt.format(sep=sep, c=self))
% self.parameters.min_pka)
info(' Max pKa: %4.2f'
% self.parameters.max_pka)
info('')
# find coupled residues # find coupled residues
titratable_groups = conformation.get_titratable_groups() titratable_groups = conformation.get_titratable_groups()
if not conformation.non_covalently_coupled_groups: if not conformation.non_covalently_coupled_groups:
@@ -364,20 +360,24 @@ class NonCovalentlyCoupledGroups:
formatted string with information. formatted string with information.
""" """
str_ = ( str_ = (
""" %s and %s coupled (prot.state): %5.2f " {label1} and {label2} coupled (prot.state): {coupl_fact:>5.2f}\n"
Energy levels: %6.2f, %6.2f (difference: %6.2f) at pH %6.2f " Energy levels: {def_energy:>6.2f}, {swap_energy:>6.2f} "
Interaction energy: %6.2f "(difference: {diff_energy:>6.2f}) at pH {ph:>6.2f}\n"
Intrinsic pka's: %6.2f, %6.2f (difference: %6.2f) " Interaction energy: {int_energy:>6.2f}\n"
Swapped pKa's: %6.2f, %6.2f (difference: %6.2f, %6.2f)""" " Intrinsic pka's: {pka1:>6.2f}, {pka2:>6.2f} "
% ( "(difference: {diff_pka:>6.2f})\n"
group1.label, group2.label, data['coupling_factor'], " Swapped pKa's: {swap1:>6.2f}, {swap2:>6.2f} "
data['default_energy'], data['swapped_energy'], "(difference: {shift1:>6.2f}, {shift2:>6.2f})"
data['default_energy'] - data['swapped_energy'], ).format(
data['pH'], data['interaction_energy'], label1=group1.label, label2=group2.label,
group1.intrinsic_pka, group2.intrinsic_pka, coupl_fact=data['coupling_factor'], def_energy=data['default_energy'],
group1.intrinsic_pka-group2.intrinsic_pka, swap_energy=data['swapped_energy'],
data['swapped_pka1'], data['swapped_pka2'], diff_energy=data['default_energy']-data['swapped_energy'], ph=data['pH'],
data['pka_shift1'], data['pka_shift2'])) int_energy=data['interaction_energy'], pka1=group1.intrinsic_pka,
pka2=group2.intrinsic_pka,
diff_pka=group1.intrinsic_pka-group2.intrinsic_pka,
swap1=data['swapped_pka1'], swap2=data['swapped_pka2'],
shift1=data['pka_shift1'], shift2=data['pka_shift2'])
return str_ return str_

View File

@@ -76,15 +76,18 @@ class Group:
if self.atom.terminal: if self.atom.terminal:
self.residue_type = self.atom.terminal self.residue_type = self.atom.terminal
if self.atom.type == 'atom': if self.atom.type == 'atom':
self.label = '%-3s%4d%2s' % (self.residue_type, atom.res_num, fmt = "{g.residue_type:<3s}{a.res_num:>4d}{a.chain_id:>2s}"
atom.chain_id) self.label = fmt.format(g=self, a=atom)
elif self.atom.res_name in ['DA ', 'DC ', 'DG ', 'DT ']: elif self.atom.res_name in ['DA ', 'DC ', 'DG ', 'DT ']:
self.label = '%1s%1s%1s%4d%2s' % ( fmt = "{type:1s}{elem:1s}{name:1s}{res_num:>4d}{chain:>2s}"
self.residue_type[1], atom.element, self.label = fmt.format(
atom.name.replace('\'', '')[-1], atom.res_num, atom.chain_id) type=self.residue_type[1], elem=atom.element,
name=atom.name.replace('\'', '')[-1], res_num=atom.res_num,
chain=atom.chain_id)
else: else:
self.label = '%-3s%4s%2s' % ( fmt = "{type:<3s}{name:>4s}{chain:>2s}"
self.residue_type, atom.name, atom.chain_id) self.label = fmt.format(
type=self.residue_type, name=atom.name, chain=atom.chain_id)
# container for squared distances # container for squared distances
self.squared_distances = {} self.squared_distances = {}
@@ -545,11 +548,10 @@ class Group:
penalty = ( penalty = (
' NB: Discarded due to coupling with %s' ' NB: Discarded due to coupling with %s'
% self.coupled_titrating_group.label) % self.coupled_titrating_group.label)
str_ = ( fmt = (
" %9s %8.2lf %10.2lf %18s %s\n" " {g.label:>9s} {g.pka_value:8.2f} {g.model_pka:10.2f} "
% (self.label, self.pka_value, self.model_pka, ligand_type, "{type:>18s} {penalty:s}\n")
penalty)) return fmt.format(g=self, type=ligand_type, penalty=penalty)
return str_
def __str__(self): def __str__(self):
return 'Group (%s) for %s' % (self.type, self.atom) return 'Group (%s) for %s' % (self.type, self.atom)

View File

@@ -141,8 +141,12 @@ class LigandPkaValues:
warning(errstr) warning(errstr)
propka.pdb.write_mol2_for_atoms(atoms, filename) propka.pdb.write_mol2_for_atoms(atoms, filename)
# Marvin calculate pKa values # Marvin calculate pKa values
options = ('pka -a %d -b %d --min %f --max %f -d large' fmt = (
% (num_pkas, num_pkas, min_ph, max_ph)) 'pka -a {num1} -b {num2} --min {min_ph} '
'--max {max_ph} -d large')
options = (
fmt.format(
num1=num_pkas, num2=num_pkas, min_ph=min_ph, max_ph=max_ph))
(output, errors) = subprocess.Popen( (output, errors) = subprocess.Popen(
[self.cxcalc, filename]+options.split(), stdout=subprocess.PIPE, [self.cxcalc, filename]+options.split(), stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate() stderr=subprocess.PIPE).communicate()

View File

@@ -270,9 +270,10 @@ def get_charge_profile_section(protein, conformation='AVR', _=None):
if profile is None: if profile is None:
str_ += "Could not determine charge profile\n" str_ += "Could not determine charge profile\n"
else: else:
str_ += "%6s%10s%8s\n" % ("pH", "unfolded", "folded") str_ += ' pH unfolded folded\n'
for (ph, q_mod, q_pro) in profile: for (ph, q_mod, q_pro) in profile:
str_ += "%6.2lf%10.2lf%8.2lf\n" % (ph, q_mod, q_pro) str_ += "{ph:6.2f}{qm:10.2f}{qp:8.2f}\n".format(
ph=ph, qm=q_mod, qp=q_pro)
pi_pro, pi_mod = protein.get_pi(conformation=conformation) pi_pro, pi_mod = protein.get_pi(conformation=conformation)
if pi_pro is None or pi_mod is None: if pi_pro is None or pi_mod is None:
str_ += "Could not determine the pI\n\n" str_ += "Could not determine the pI\n\n"

View File

@@ -225,14 +225,17 @@ class Parameters:
'NAM': ['AMD'], 'N1': [], 'O2': []} 'NAM': ['AMD'], 'N1': [], 'O2': []}
for group1 in agroups: for group1 in agroups:
for group2 in lgroups: for group2 in lgroups:
interaction = '%3s %3s %1s %4s %4s' % ( fmt = "{grp1:>3s} {grp2:>3s} {mat:1s} {val1:4} {val2:4}"
group1, group2, self.interaction_matrix[group1][group2], interaction = fmt.format(
self.sidechain_cutoffs.get_value(group1, group2)[0], grp1=group1, grp2=group2,
self.sidechain_cutoffs.get_value(group1, group2)[1]) mat=self.interaction_matrix[group1][group2],
val1=self.sidechain_cutoffs.get_value(group1, group2)[0],
val2=self.sidechain_cutoffs.get_value(group1, group2)[1])
map_interaction = '' map_interaction = ''
if group2 in map_: if group2 in map_:
for val in map_[group2]: for val in map_[group2]:
map_interaction += '|%3s %3s %1s %4s %4s' % ( fmt = "|{grp1:>3s} {grp2:>3s} {mat:1s} {val1:4} {val2:4}"
map_interaction += fmt.format(
group1, val, self.interaction_matrix[group1][val], group1, val, self.interaction_matrix[group1][val],
self.sidechain_cutoffs.get_value(group1, val)[0], self.sidechain_cutoffs.get_value(group1, val)[0],
self.sidechain_cutoffs.get_value(group1, val)[1]) self.sidechain_cutoffs.get_value(group1, val)[1])
@@ -334,13 +337,14 @@ Group1 & Group2 & Interaction & c1 &c2 \\\\
if (self.sidechain_cutoffs.get_value(group1, group2) if (self.sidechain_cutoffs.get_value(group1, group2)
== self.sidechain_cutoffs.default): == self.sidechain_cutoffs.default):
continue continue
str_ += ('%3s & %3s & %1s & %4s & %4s\\\\ \n' fmt = (
% (group1, group2, "{grp1:>3s} & {grp2:>3s} & {mat:1s} & {val1:4} & "
"{val2:4}\\\\ \n")
str_ += fmt.format(
group1, group2,
self.interaction_matrix[group1][group2], self.interaction_matrix[group1][group2],
self.sidechain_cutoffs.get_value(group1, self.sidechain_cutoffs.get_value(group1, group2)[0],
group2)[0], self.sidechain_cutoffs.get_value(group1, group2)[1])
self.sidechain_cutoffs.get_value(group1,
group2)[1]))
if group1 == group2: if group1 == group2:
break break
str_ += ' \\end{longtable}\n' str_ += ' \\end{longtable}\n'