diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d92713..52ac6d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org). +## [2.4.0] - 2022-06-01 + +### Changed + +- Comparing per-cycle outputs using R-work instead of R-free + +### Fixed + +- Nautilus test that was looking for a space in a residue name + ## [2.3.6] - 2022-05-30 ### Fixed diff --git a/modelcraft/__init__.py b/modelcraft/__init__.py index 30b63c0..9b65bdf 100644 --- a/modelcraft/__init__.py +++ b/modelcraft/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.3.6" +__version__ = "2.4.0" from .cell import max_distortion as max_cell_distortion from .cell import remove_scale diff --git a/modelcraft/modelcraft.py b/modelcraft/modelcraft.py index 4508c01..c86dd31 100755 --- a/modelcraft/modelcraft.py +++ b/modelcraft/modelcraft.py @@ -60,7 +60,7 @@ def run(self): for self.cycle in range(1, args.cycles + 1): print("\n## Cycle %d\n" % self.cycle) self.run_cycle() - self.process_cycle_output() + self.process_cycle_output(self.last_refmac) if ( self.cycles_without_improvement == args.auto_stop_cycles and args.auto_stop_cycles > 0 @@ -76,7 +76,7 @@ def run(self): self.cycle += 1 self.update_current_from_refmac_result(self.output_refmac) self.fixsidechains() - self.process_cycle_output() + self.process_cycle_output(self.last_refmac) print("\n## Best Model:") self.print_refmac_result(self.output_refmac) self.terminate(reason="Normal") @@ -204,20 +204,13 @@ def refmac(self, structure: gemmi.Structure, cycles: int, auto_accept: bool): cycles=cycles, ).run(self) self._finished_job("Refmac", result) - if auto_accept or self._is_better(result, self.last_refmac): + if auto_accept or result.rfree < self.last_refmac.rfree: if not auto_accept: print("(accepted)") self.update_current_from_refmac_result(result) else: print("(rejected)") - def _is_better(self, new_result: RefmacResult, old_result: RefmacResult): - return ( - old_result is None - or (self.args.mode == "xray" and new_result.rfree < old_result.rfree) - or (self.args.mode == "em" and new_result.fsc > old_result.fsc) - ) - def update_current_from_refmac_result(self, result: RefmacResult): self.current_structure = result.structure self.current_phases = result.abcd @@ -283,30 +276,34 @@ def findwaters(self, dummy=False): self._finished_job(name, result) self.refmac(result.structure, cycles=10, auto_accept=False) - def process_cycle_output(self): - self.print_refmac_result(self.last_refmac) - model_stats = ModelStats(self.last_refmac.structure) + def process_cycle_output(self, result: RefmacResult): + self.print_refmac_result(result) + model_stats = ModelStats(result.structure) stats = {"cycle": self.cycle, "residues": model_stats.residues} if self.args.mode == "xray": stats["waters"] = model_stats.waters - stats["r_work"] = self.last_refmac.rwork - stats["r_free"] = self.last_refmac.rfree + stats["r_work"] = result.rwork + stats["r_free"] = result.rfree if self.args.mode == "em": - stats["fsc"] = self.last_refmac.fsc + stats["fsc"] = result.fsc self.report["cycles"].append(stats) - if self._is_better(self.last_refmac, self.output_refmac): + if ( + self.output_refmac is None + or (self.args.mode == "xray" and result.rwork < self.output_refmac.rwork) + or (self.args.mode == "em" and result.fsc > self.output_refmac.fsc) + ): self.cycles_without_improvement = 0 - self.output_refmac = self.last_refmac - write_mmcif(self.path("modelcraft.cif"), self.last_refmac.structure) + self.output_refmac = result + write_mmcif(self.path("modelcraft.cif"), result.structure) write_mtz( self.path("modelcraft.mtz"), [ self.args.fmean, self.args.freer, - self.last_refmac.abcd, - self.last_refmac.fphi_best, - self.last_refmac.fphi_diff, - self.last_refmac.fphi_calc, + result.abcd, + result.fphi_best, + result.fphi_diff, + result.fphi_calc, ], ) self.report["final"] = stats diff --git a/modelcraft/tests/integration/test_nautilus.py b/modelcraft/tests/integration/test_nautilus.py index 5639d21..00dd979 100644 --- a/modelcraft/tests/integration/test_nautilus.py +++ b/modelcraft/tests/integration/test_nautilus.py @@ -50,7 +50,7 @@ def test_102d(): structure=structure, ).run(pipeline) stats = ModelStats(nautilus.structure) - assert contains_residue(nautilus.structure, " DT") + assert contains_residue(nautilus.structure, "DT") assert stats.residues > 22 assert nautilus.fragments_built == 2 assert nautilus.residues_built > 22 diff --git a/setup.py b/setup.py index 2167549..15072ad 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="modelcraft", - version="2.3.6", + version="2.4.0", author="Paul Bond", author_email="paul.bond@york.ac.uk", description="Automated model building pipeline for X-ray crystallography",