Skip to content

Commit 5a11d25

Browse files
committed
Add: __repr__ methods to Python dataclasses and wrapper classes
Add human-readable __repr__ to PoseResult, BindingModeResult, DockingResult, Pose, Thermodynamics, and BoltzmannLUT. These match the existing style used by StatMechEngine, NormalMode, BindingMode, etc. https://claude.ai/code/session_01W7GzzZMgGLVpRsch6FED6w
1 parent af69aee commit 5a11d25

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

python/flexaidds/docking.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ class Pose:
3636
coordinates: Optional[np.ndarray] = None
3737
boltzmann_weight: float = 0.0
3838

39+
def __repr__(self) -> str:
40+
parts = [f"<Pose idx={self.index} E={self.energy:.2f}"]
41+
if self.rmsd is not None:
42+
parts.append(f" RMSD={self.rmsd:.2f}")
43+
if self.boltzmann_weight > 0.0:
44+
parts.append(f" w={self.boltzmann_weight:.4g}")
45+
parts.append(">")
46+
return "".join(parts)
47+
3948
def to_dict(self) -> dict:
4049
return {
4150
'index': self.index,

python/flexaidds/models.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@ class PoseResult:
6262
temperature: Optional[float] = None
6363
remarks: Dict[str, Any] = field(default_factory=dict)
6464

65+
def __repr__(self) -> str:
66+
parts = [f"<PoseResult mode={self.mode_id} rank={self.pose_rank}"]
67+
if self.cf is not None:
68+
parts.append(f" CF={self.cf:.2f}")
69+
if self.free_energy is not None:
70+
parts.append(f" F={self.free_energy:.2f}")
71+
parts.append(f" path={self.path.name}>")
72+
return "".join(parts)
73+
6574

6675
@dataclass(frozen=True)
6776
class BindingModeResult:
@@ -108,6 +117,16 @@ def n_poses(self) -> int:
108117
"""Number of poses in this binding mode."""
109118
return len(self.poses)
110119

120+
def __repr__(self) -> str:
121+
parts = [f"<BindingModeResult mode={self.mode_id} rank={self.rank}"]
122+
parts.append(f" n_poses={self.n_poses}")
123+
if self.free_energy is not None:
124+
parts.append(f" F={self.free_energy:.2f}")
125+
if self.entropy is not None:
126+
parts.append(f" S={self.entropy:.5f}")
127+
parts.append(">")
128+
return "".join(parts)
129+
111130
def best_pose(self) -> Optional[PoseResult]:
112131
"""Return the pose with the lowest CF (or cf_app) score.
113132
@@ -158,6 +177,12 @@ def n_modes(self) -> int:
158177
"""Number of binding modes in this result."""
159178
return len(self.binding_modes)
160179

180+
def __repr__(self) -> str:
181+
return (
182+
f"<DockingResult n_modes={self.n_modes} "
183+
f"source={self.source_dir.name}>"
184+
)
185+
161186
def top_mode(self) -> Optional[BindingModeResult]:
162187
"""Return the binding mode with the lowest free energy.
163188

python/flexaidds/thermodynamics.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ def entropy_term(self) -> float:
5959
"""Entropic contribution to free energy: TΔS (kcal/mol)."""
6060
return self.temperature * self.entropy
6161

62+
def __repr__(self) -> str:
63+
return (
64+
f"<Thermodynamics T={self.temperature:.1f}K "
65+
f"F={self.free_energy:.2f} H={self.mean_energy:.2f} "
66+
f"S={self.entropy:.5f} kcal/(mol·K)>"
67+
)
68+
6269
def to_dict(self) -> dict:
6370
"""Convert to dictionary for serialization."""
6471
return {
@@ -291,19 +298,23 @@ def __init__(self, beta: float, e_min: float, e_max: float, n_bins: int = 10000)
291298
"""
292299
if _core is None:
293300
raise RuntimeError("C++ bindings not available")
301+
self._beta = beta
294302
self._lut = _core.BoltzmannLUT(beta, e_min, e_max, n_bins)
295303

296304
def __call__(self, energy: float) -> float:
297305
"""Look up Boltzmann factor for given energy.
298-
306+
299307
Args:
300308
energy: Energy in kcal/mol
301-
309+
302310
Returns:
303311
exp(-βE)
304312
"""
305313
return self._lut(energy)
306314

315+
def __repr__(self) -> str:
316+
return f"<BoltzmannLUT β={self._beta:.4f}>"
317+
307318

308319
def helmholtz_from_energies(energies, temperature: float = 300.0) -> float:
309320
"""Convenience function: Helmholtz free energy from energy array.

0 commit comments

Comments
 (0)