diff --git a/propka/protonate.py b/propka/protonate.py index cd0f6c8..bd74894 100644 --- a/propka/protonate.py +++ b/propka/protonate.py @@ -113,7 +113,7 @@ class Protonate: i = 1 for bonded in heavy_atom.bonded_atoms: if bonded.element == 'H': - bonded.name += '%d' % i + bonded.name += str(i) i += 1 def set_number_of_protons_to_add(self, atom): @@ -125,15 +125,16 @@ class Protonate: debug('*'*10) debug('Setting number of protons to add for', atom) atom.number_of_protons_to_add = 8 - debug(' %4d' % 8) + debug(" 8") atom.number_of_protons_to_add -= self.valence_electrons[atom.element] - debug('Valence eletrons: %4d' % -self.valence_electrons[atom.element]) + debug('Valence electrons: {0:>4d}'.format( + -self.valence_electrons[atom.element])) atom.number_of_protons_to_add -= len(atom.bonded_atoms) - debug('Number of bonds: %4d' % -len(atom.bonded_atoms)) + debug('Number of bonds: {0:>4d}'.format(-len(atom.bonded_atoms))) atom.number_of_protons_to_add -= atom.num_pi_elec_2_3_bonds - debug('Pi electrons: %4d' % -atom.num_pi_elec_2_3_bonds) + debug('Pi electrons: {0:>4d}'.format(-atom.num_pi_elec_2_3_bonds)) atom.number_of_protons_to_add += int(atom.charge) - debug('Charge: %4.1f' % atom.charge) + debug('Charge: {0:>4.1f}'.format(atom.charge)) debug('-'*10) debug(atom.number_of_protons_to_add) @@ -149,35 +150,37 @@ class Protonate: debug('='*10) debug('Setting steric number and lone pairs for', atom) atom.steric_number = 0 - debug('%65s: %4d' % ('Valence electrons', - self.valence_electrons[atom.element])) + debug('{0:>65s}: {1:>4d}'.format( + 'Valence electrons', self.valence_electrons[atom.element])) atom.steric_number += self.valence_electrons[atom.element] - debug('%65s: %4d' % ('Number of bonds', - len(atom.bonded_atoms))) + debug('{0:>65s}: {1:>4d}'.format( + 'Number of bonds', len(atom.bonded_atoms))) atom.steric_number += len(atom.bonded_atoms) - debug('%65s: %4d' % ('Number of hydrogen atoms to add', - atom.number_of_protons_to_add)) + debug('{0:>65s}: {1:>4d}'.format( + 'Number of hydrogen atoms to add', atom.number_of_protons_to_add)) atom.steric_number += atom.number_of_protons_to_add - debug('%65s: %4d' % ('Number of pi-electrons in double ' - 'and triple bonds(-)', - atom.num_pi_elec_2_3_bonds)) + debug('{0:>65s}: {1:>4d}'.format( + 'Number of pi-electrons in double and triple bonds(-)', + atom.num_pi_elec_2_3_bonds)) atom.steric_number -= atom.num_pi_elec_2_3_bonds - debug('%65s: %4d' % ('Number of pi-electrons in conjugated double and ' - 'triple bonds(-)', - atom.num_pi_elec_conj_2_3_bonds)) + debug('{0:>65s}: {1:>4d}'.format( + 'Number of pi-electrons in conjugated double and triple bonds(-)', + atom.num_pi_elec_conj_2_3_bonds)) atom.steric_number -= atom.num_pi_elec_conj_2_3_bonds - debug('%65s: %4d' % ('Number of donated co-ordinated bonds', 0)) + debug('{0:>65s}: {1:>4d}'.format( + 'Number of donated co-ordinated bonds', 0)) atom.steric_number += 0 - debug('%65s: %4.1f' % ('Charge(-)', atom.charge)) + debug('{0:>65s}: {1:>4.1f}'.format( + 'Charge(-)', atom.charge)) atom.steric_number -= atom.charge atom.steric_number = math.floor(atom.steric_number/2.0) - atom.number_of_lone_pairs = (atom.steric_number - - len(atom.bonded_atoms) - - atom.number_of_protons_to_add) + atom.number_of_lone_pairs = ( + atom.steric_number-len(atom.bonded_atoms)-atom.number_of_protons_to_add) debug('-'*70) - debug('%65s: %4d' % ('Steric number', atom.steric_number)) - debug('%65s: %4d' % ('Number of lone pairs', - atom.number_of_lone_pairs)) + debug('{0:>65s}: {1:>4d}'.format( + 'Steric number', atom.steric_number)) + debug('{0:>65s}: {1:>4d}'.format( + 'Number of lone pairs', atom.number_of_lone_pairs)) atom.steric_num_lone_pairs_set = True def add_protons(self, atom): @@ -191,8 +194,8 @@ class Protonate: if atom.steric_number in list(self.protonation_methods.keys()): self.protonation_methods[atom.steric_number](atom) else: - warning('Do not have a method for protonating', - atom, '(steric number: %d)' % atom.steric_number) + warning('Do not have a method for protonating', atom, + '(steric number: {0:d})'.format(atom.steric_number)) def trigonal(self, atom): """Add hydrogens in trigonal geometry. @@ -200,7 +203,7 @@ class Protonate: Args: atom: atom to protonate """ - debug('TRIGONAL - %d bonded atoms' % len(atom.bonded_atoms)) + debug('TRIGONAL - {0:d} bonded atoms'.format(len(atom.bonded_atoms))) rot_angle = math.radians(120.0) cvec = Vector(atom1=atom) # 0 bonds @@ -258,7 +261,8 @@ class Protonate: Args: atom: atom to protonate. """ - debug('TETRAHEDRAL - %d bonded atoms' % len(atom.bonded_atoms)) + debug( + 'TETRAHEDRAL - {0:d} bonded atoms'.format(len(atom.bonded_atoms))) # TODO - might be good to move tetrahedral angle to constant rot_angle = math.radians(109.5) cvec = Vector(atom1=atom) @@ -304,7 +308,7 @@ class Protonate: new_h = propka.atom.Atom() new_h.set_property( numb=None, - name='H%s' % atom.name[1:], + name='H{0:s}'.format(atom.name[1:]), res_name=atom.res_name, chain_id=atom.chain_id, res_num=atom.res_num, @@ -327,14 +331,15 @@ class Protonate: atom.number_of_protons_to_add -= 1 atom.conformation_container.add_atom(new_h) # update names of all protons on this atom - new_h.residue_label = "%-3s%4d%2s" % (new_h.name, new_h.res_num, - new_h.chain_id) + new_h.residue_label = "{0:<3s}{1:>4d}{2:>2s}".format( + new_h.name, new_h.res_num, new_h.chain_id) no_protons = atom.count_bonded_elements('H') if no_protons > 1: i = 1 for proton in atom.get_bonded_elements('H'): - proton.name = 'H%s%d' % (atom.name[1:], i) - proton.residue_label = "%-3s%4d%2s" % ( + proton.name = 'H{0:s}{1:d}'.format( + atom.name[1:], i) + proton.residue_label = "{0:<3s}{1:>4d}{2:>2s}".format( proton.name, proton.res_num, proton.chain_id) i += 1 debug('added', new_h, 'to', atom) @@ -352,8 +357,9 @@ class Protonate: if element in list(self.bond_lengths.keys()): dist = self.bond_lengths[element] else: - str_ = ('Bond length for %s not found, using the standard value ' - 'of %f' % (element, dist)) + str_ = ( + 'Bond length for {0:s} not found, using the standard value ' + 'of {1:f}'.format(element, dist)) warning(str_) bvec = bvec.rescale(dist) return bvec diff --git a/propka/run.py b/propka/run.py index deeea27..e851309 100644 --- a/propka/run.py +++ b/propka/run.py @@ -34,7 +34,7 @@ def single(pdbfile, optargs=None): options = loadOptions(*optargs) pdbfile = options.filenames.pop(0) if len(options.filenames) > 0: - _LOGGER.warning("Ignoring filenames: %s", options.filenames) + _LOGGER.warning("Ignoring filenames: {0:s}".format(options.filenames)) my_molecule = Molecular_container(pdbfile, options) my_molecule.calculate_pka() my_molecule.write_pka() diff --git a/propka/vector_algebra.py b/propka/vector_algebra.py index cfa48a9..1303de5 100644 --- a/propka/vector_algebra.py +++ b/propka/vector_algebra.py @@ -58,7 +58,7 @@ class Vector: elif type(other) in [int, float]: return Vector(self.x * other, self.y * other, self.z * other) else: - info('%s not supported' % type(other)) + info('{0:s} not supported'.format(type(other))) raise TypeError def __rmul__(self, other): @@ -85,7 +85,8 @@ class Vector: return math.sqrt(self.sq_length()) def __str__(self): - return '%10.4f %10.4f %10.4f'%(self.x, self.y, self.z) + return '{0:>10.4f} {1:>10.4f} {2:>10.4f}'.format( + self.x, self.y, self.z) def __repr__(self): return '' @@ -100,9 +101,7 @@ class Vector: def rescale(self, new_length): """ Rescale vector to new length while preserving direction """ frac = new_length/(self.length()) - res = Vector(xi=self.x*frac, - yi=self.y*frac, - zi=self.z*frac) + res = Vector(xi=self.x*frac, yi=self.y*frac, zi=self.z*frac) return res @@ -296,7 +295,8 @@ class MultiVector: keys2 = get_sorted_configurations(atom2.configurations.keys()) if self.keys != keys2: str_ = ('Cannot make multi vector: Atomic configurations ' - 'mismatch for\n %s\n %s\n' % (atom1, atom2)) + 'mismatch for\n {0:s}\n {1:s}\n'.format( + atom1, atom2)) raise KeyError(str_) for key in self.keys: atom1.setConfiguration(key) @@ -314,7 +314,7 @@ class MultiVector: def __str__(self): res = '' for i, key in enumerate(self.keys): - res += '%s %s\n' % (key, self.vectors[i]) + res += '{0:s} {1:s}\n'.format(key, self.vectors[i]) return res def do_job(self, job): @@ -350,8 +350,9 @@ class MultiVector: for i in range(len(self.vectors)): self.result.vectors.append( # TODO - eliminate eval() or entire class - eval('self.vectors[%d] %s other.vectors[%d]' - % (i, operation, i))) + eval( + 'self.vectors[{0:d}] {1:s} other.vectors[{2:d}]'.format( + i, operation, i))) self.result.keys.append(self.keys[i]) def __add__(self, other): diff --git a/propka/version.py b/propka/version.py index 8ce368d..9ff5d87 100644 --- a/propka/version.py +++ b/propka/version.py @@ -31,7 +31,7 @@ class Version: Raises: NotImplementedError """ - err = "Called an empty Version function with args %s" % args + err = "Called an empty Version function with args {0:s}".format(args) raise NotImplementedError(err) def calculate_desolvation(self, group): diff --git a/tests/test_basic_regression.py b/tests/test_basic_regression.py index 8a4cbf0..cd8036e 100644 --- a/tests/test_basic_regression.py +++ b/tests/test_basic_regression.py @@ -48,8 +48,9 @@ def get_test_dirs(): if test_path.is_dir(): path_dict[key] = test_path else: - errstr = ("Can't find %s test files in %s" - % (key, [TEST_DIR / path, path])) + errstr = ( + "Can't find {0:s} test files in {1:s}".format( + key, [TEST_DIR / path, path])) raise FileNotFoundError(errstr) return path_dict @@ -65,8 +66,9 @@ def run_propka(options, pdb_path, tmp_path): options += [str(pdb_path)] args = propka.lib.loadOptions(options) try: - _LOGGER.warning("Working in tmpdir %s because of PROPKA file output; " - "need to fix this.", tmp_path) + _LOGGER.warning( + "Working in tmpdir {0:s} because of PROPKA file output; " + "need to fix this.".format(str(tmp_path))) cwd = Path.cwd() os.chdir(tmp_path) molecule = propka.molecular_container.Molecular_container( @@ -93,7 +95,7 @@ def compare_output(pdb, tmp_path, ref_path): ref_data.append(float(line)) test_data = [] - pka_path = Path(tmp_path) / ("%s.pka" % pdb) + pka_path = Path(tmp_path) / ("{0:s}.pka".format(pdb)) with open(pka_path, "rt") as pka_file: at_pka = False for line in pka_file: @@ -106,8 +108,9 @@ def compare_output(pdb, tmp_path, ref_path): match = re.search(r'([0-9]+\.[0-9]+)', line) value = float(match.group(0)) test_data.append(value) - errstr = ("Error exceeds maximum allowed value (%d decimal places)" - % MAX_ERR_DECIMALS) + errstr = ( + "Error exceeds maximum allowed value ({0:d} decimal places)".format( + MAX_ERR_DECIMALS)) assert_almost_equal( test_data, ref_data, decimal=MAX_ERR_DECIMALS, err_msg=errstr, verbose=True) @@ -126,17 +129,18 @@ def compare_output(pdb, tmp_path, ref_path): def test_regression(pdb, options, tmp_path): """Basic regression test of PROPKA functionality.""" path_dict = get_test_dirs() - ref_path = path_dict["results"] / ("%s.dat" % pdb) + ref_path = path_dict["results"] / ("{0:s}.dat".format(pdb)) if ref_path.is_file(): ref_path = ref_path.resolve() else: - _LOGGER.warning("Missing results file for comparison: %s", ref_path) + _LOGGER.warning("Missing results file for comparison: {0:s}".format( + str(ref_path))) ref_path = None - pdb_path = path_dict["pdbs"] / ("%s.pdb" % pdb) + pdb_path = path_dict["pdbs"] / ("{0:s}.pdb".format(pdb)) if pdb_path.is_file(): pdb_path = pdb_path.resolve() else: - errstr = "Missing PDB file: %s" % pdb_path + errstr = "Missing PDB file: {0:s}".format(pdb_path) raise FileNotFoundError(errstr) tmp_path = Path(tmp_path).resolve()