Skip to content

Commit

Permalink
pumbing origin_id down to more fundamental functions AND option to di…
Browse files Browse the repository at this point in the history
…splay rmsd per origin_id
  • Loading branch information
nwmoriarty committed Feb 26, 2025
1 parent eccf82f commit 36b4b0b
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 24 deletions.
11 changes: 7 additions & 4 deletions cctbx/geometry_restraints/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1080,14 +1080,15 @@ def get_sorted(self,
n_not_shown = correct_id_proxies - n_outputted
return sorted_table, n_not_shown

def get_outliers(self, sites_cart, sigma_threshold):
def get_outliers(self, sites_cart, sigma_threshold, origin_id=None):
result = []
from cctbx.geometry_restraints.linking_class import linking_class
origin_ids = linking_class()
if origin_id is None: origin_id=origin_ids.get_origin_id('covalent geometry')
vals = self.get_sorted(
by_value="delta",
sites_cart=sites_cart,
origin_id=origin_ids.get_origin_id('covalent geometry'))[0]
origin_id=origin_id)[0]
if(vals is None): return result
for it in vals:
i,j = it[0],it[1]
Expand Down Expand Up @@ -1539,9 +1540,11 @@ def get_sorted(self,
site_labels=site_labels, max_items=max_items,
get_restraints_only=False, origin_id=origin_id)

def get_outliers(self, sites_cart, sigma_threshold):
def get_outliers(self, sites_cart, sigma_threshold, origin_id=0):
result = []
vals = self.get_sorted(by_value="delta", sites_cart=sites_cart)[0]
vals = self.get_sorted(by_value="delta",
origin_id=origin_id,
sites_cart=sites_cart)[0]
if(vals is None): return result
for it in vals:
i,j,k = [int(i) for i in it[0]]
Expand Down
26 changes: 15 additions & 11 deletions cctbx/geometry_restraints/energies.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,25 +195,29 @@ def __init__(self, sites_cart,
self.finalize_target_and_gradients()

# Not used anymore? -- used in model_statistics.py
def get_filtered_n_bond_proxies(self):
return self.bond_proxies.simple.proxy_select(origin_id=0).size()
def get_filtered_n_bond_proxies(self, origin_id=0):
return self.bond_proxies.simple.proxy_select(origin_id=origin_id).size()

def get_filtered_n_angle_proxies(self):
return self.angle_proxies.proxy_select(origin_id=0).size()
def get_filtered_n_angle_proxies(self, origin_id=0):
return self.angle_proxies.proxy_select(origin_id=origin_id).size()

def get_filtered_n_dihedral_proxies(self):
return self.dihedral_proxies.proxy_select(origin_id=0).size()

def get_filtered_n_planarity_proxies(self):
return self.planarity_proxies.proxy_select(origin_id=0).size()

def get_angle_outliers(self, sites_cart, sigma_threshold=4):
def get_angle_outliers(self, sites_cart, sigma_threshold=4, origin_id=0):
return self.angle_proxies.get_outliers(sites_cart=sites_cart,
sigma_threshold=sigma_threshold)
sigma_threshold=sigma_threshold,
origin_id=origin_id,
)

def get_bond_outliers(self, sites_cart, sigma_threshold=4):
return self.bond_proxies.get_outliers(sites_cart=sites_cart,
sigma_threshold=sigma_threshold)
def get_bond_outliers(self, sites_cart, sigma_threshold=4, origin_id=0):
return self.bond_proxies.get_outliers( sites_cart=sites_cart,
sigma_threshold=sigma_threshold,
origin_id=origin_id,
)

def get_dihedral_outliers(self, sites_cart, sigma_threshold=4):
return self.dihedral_proxies.get_outliers(sites_cart=sites_cart,
Expand Down Expand Up @@ -333,9 +337,9 @@ def angle_deviations_weighted(self):
else:
return 0,0,0

def angle_deviations(self):
def angle_deviations(self, origin_id=0):
if(self.n_angle_proxies is not None):
angle_deltas = self.angle_proxies.proxy_select(origin_id=0).deltas(
angle_deltas = self.angle_proxies.proxy_select(origin_id=origin_id).deltas(
sites_cart=self.sites_cart)
if len(angle_deltas) > 0:
a_sq = angle_deltas * angle_deltas
Expand Down
38 changes: 29 additions & 9 deletions mmtbx/model/statistics.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,32 +69,36 @@ def _init(self, pdb_hierarchy=None, geometry_restraints_manager=None):
self.from_restraints.den_residual_sum+
self.from_restraints.ramachandran_residual_sum)

def angle(self, return_rmsZ=False):
def angle(self, origin_id=0, return_rmsZ=False):
mi,ma,me,n = 0,0,0,0
outliers = 0
if(self.from_restraints is not None):
if return_rmsZ:
mi,ma,me = self.from_restraints.angle_deviations_z()
else:
mi,ma,me = self.from_restraints.angle_deviations()
n = self.from_restraints.get_filtered_n_angle_proxies()
mi,ma,me = self.from_restraints.angle_deviations(origin_id=origin_id)
n = self.from_restraints.get_filtered_n_angle_proxies(origin_id=origin_id)
outliers = self.from_restraints.get_angle_outliers(
sites_cart = self.pdb_hierarchy.atoms().extract_xyz(),
sigma_threshold=4)
sigma_threshold=4,
origin_id=origin_id,
)
return group_args(min = mi, max = ma, mean = me, n = n, outliers = outliers)

def bond(self, return_rmsZ=False):
def bond(self, origin_id=0, return_rmsZ=False):
mi,ma,me,n = 0,0,0,0
outliers = 0
if(self.from_restraints is not None):
if return_rmsZ:
mi,ma,me = self.from_restraints.bond_deviations_z()
else:
mi,ma,me = self.from_restraints.bond_deviations()
n = self.from_restraints.get_filtered_n_bond_proxies()
mi,ma,me = self.from_restraints.bond_deviations(origin_id=origin_id)
n = self.from_restraints.get_filtered_n_bond_proxies(origin_id=origin_id)
outliers = self.from_restraints.get_bond_outliers(
sites_cart = self.pdb_hierarchy.atoms().extract_xyz(),
sigma_threshold=4)
sigma_threshold=4,
origin_id=origin_id,
)
return group_args(min = mi, max = ma, mean = me, n = n, outliers = outliers)

def chirality(self):
Expand Down Expand Up @@ -311,7 +315,10 @@ def number_of_bonds(self):
bonds = self.bond()
return bonds.n

def show(self, log=None, prefix="", exclude_protein_only_stats=False, uppercase=True):
def show(self, log=None, prefix="",
exclude_protein_only_stats=False,
include_rmsd_details=False,
uppercase=True):
if(log is None): log = sys.stdout
def fmt(f1,f2,d1,z1=None):
if f1 is None : return ' - - - '
Expand Down Expand Up @@ -414,6 +421,19 @@ def fmt2(f1):
result = result.upper()
print(result, file=log)

if include_rmsd_details:
from cctbx.geometry_restraints.linking_class import linking_class
origin_ids = linking_class()
print('Details of bonding type rmsd', file=log)
for key, i in origin_ids.items():
bond_rc=self.bond(origin_id=i)
angle_rc=self.angle(origin_id=i)
if bond_rc.n:
print(f' {key:20s} : bond {bond_rc.mean:12.5f} ({bond_rc.n:5d})', file=log)
if angle_rc.n:
print(f' {key:20s} : angle {angle_rc.mean:12.3f} ({angle_rc.n:5d})', file=log)


def as_cif_block(self, cif_block=None, pdbx_refine_id=''):
if cif_block is None:
cif_block = iotbx.cif.model.block()
Expand Down

0 comments on commit 36b4b0b

Please sign in to comment.