use crate::structure::{Selection, Structure};
use crate::{AnalysisPolicy, ExecutionContext, Namespace};
use molframe_chem::{ComponentProvider, CovalentRadii, PolymerRoleProfile};
use molframe_validate::ClashOptions;
pub trait ValidationExt {
fn clashes(
&self,
options: &ClashOptions,
) -> Result<molframe_validate::ClashTable, molframe_spatial::SpatialError>;
fn clashes_with(
&self,
options: &ClashOptions,
context: &ExecutionContext,
) -> Result<molframe_validate::ClashTable, molframe_spatial::SpatialError>;
#[must_use]
fn bond_length_deviations(
&self,
radii: &CovalentRadii,
tolerance: f32,
) -> Vec<molframe_validate::BondDeviation>;
#[must_use]
fn ligand_geometry(
&self,
radii: &CovalentRadii,
tolerance: f32,
) -> molframe_validate::LigandGeometryReport;
#[must_use]
fn ligand_geometry_outliers(
&self,
radii: &CovalentRadii,
tolerance: f32,
) -> Vec<molframe_validate::BondDeviation>;
#[must_use]
fn quality_flags(&self) -> Vec<molframe_validate::QualityFlag>;
#[must_use]
fn overvalent_atoms(&self) -> Vec<molframe_validate::ValenceError>;
fn cis_peptides(
&self,
threshold_degrees: f64,
) -> Result<Vec<molframe_validate::CisPeptide>, molframe_core::diagnostic::Diagnostic>;
fn nonplanar_aromatic_rings(
&self,
options: molframe_validate::PlanarityOptions,
) -> Result<Vec<molframe_validate::PlanarityFlag>, molframe_validate::PlanarityError>;
fn plane_restraint_outliers(
&self,
restraints: &[molframe_validate::PlaneRestraint],
options: molframe_validate::PlanarityOptions,
) -> Result<molframe_validate::PlaneRestraintReport, molframe_validate::PlanarityError>;
fn ramachandran(
&self,
options: &molframe_validate::RamachandranOptions<'_>,
) -> Result<Vec<molframe_validate::RamachandranRecord>, molframe_validate::RamachandranError>;
fn ramachandran_outliers(
&self,
options: &molframe_validate::RamachandranOptions<'_>,
) -> Result<Vec<molframe_validate::RamachandranRecord>, molframe_validate::RamachandranError>;
fn rotamer_outliers(
&self,
provider: &dyn ComponentProvider,
policy: &AnalysisPolicy,
references: &molframe_validate::ReferenceLibrary,
profile: &molframe_validate::RotamerProfile,
options: molframe_validate::RotamerOptions,
) -> Result<molframe_validate::RotamerReport, molframe_validate::RotamerError>;
fn chirality_outliers(
&self,
provider: &dyn ComponentProvider,
policy: &AnalysisPolicy,
options: molframe_validate::ChiralityOptions,
) -> Result<molframe_validate::ChiralityReport, molframe_core::diagnostic::Diagnostic>;
fn ccd_missing_atoms(
&self,
provider: &dyn ComponentProvider,
policy: &AnalysisPolicy,
) -> Result<molframe_validate::CcdCompletenessReport, molframe_core::diagnostic::Diagnostic>;
fn nucleic_acid_geometry(
&self,
provider: &dyn ComponentProvider,
roles: &PolymerRoleProfile,
policy: molframe_validate::NucleicGeometryPolicy,
) -> Result<
Vec<molframe_validate::NucleicGeometryRecord>,
molframe_validate::NucleicGeometryError,
>;
fn completeness(
&self,
namespace: Namespace,
) -> Result<Vec<molframe_validate::ChainCompleteness>, molframe_validate::CompletenessError>;
fn altloc_occupancy_sums(
&self,
namespace: Namespace,
options: molframe_validate::AltlocOccupancyOptions,
) -> Result<molframe_validate::AltlocOccupancyReport, molframe_validate::AltlocOccupancyError>;
fn reference_geometry(
&self,
provider: &dyn ComponentProvider,
namespace: Namespace,
options: molframe_validate::ReferenceGeometryOptions,
) -> Result<molframe_validate::ReferenceGeometryReport, molframe_core::diagnostic::Diagnostic>;
fn b_factor_distribution(
&self,
selection: &Selection,
outlier_standard_deviations: f64,
) -> Result<molframe_validate::BFactorDistribution, molframe_validate::BFactorError>;
fn tls_b_factor_consistency(
&self,
groups: &[molframe_validate::TlsGroup],
maximum_absolute_deviation: f64,
symmetry_tolerance: f64,
) -> Result<molframe_validate::TlsBFactorReport, molframe_validate::BFactorError>;
}
impl ValidationExt for Structure {
fn clashes(
&self,
options: &ClashOptions,
) -> Result<molframe_validate::ClashTable, molframe_spatial::SpatialError> {
self.clashes_with(options, &ExecutionContext::default())
}
fn clashes_with(
&self,
options: &ClashOptions,
context: &ExecutionContext,
) -> Result<molframe_validate::ClashTable, molframe_spatial::SpatialError> {
molframe_validate::clashes_with(self.engine(), options, context)
}
fn bond_length_deviations(
&self,
radii: &CovalentRadii,
tolerance: f32,
) -> Vec<molframe_validate::BondDeviation> {
molframe_validate::bond_length_deviations(self.engine(), radii, tolerance)
}
fn ligand_geometry(
&self,
radii: &CovalentRadii,
tolerance: f32,
) -> molframe_validate::LigandGeometryReport {
molframe_validate::ligand_geometry(self.engine(), radii, tolerance)
}
fn ligand_geometry_outliers(
&self,
radii: &CovalentRadii,
tolerance: f32,
) -> Vec<molframe_validate::BondDeviation> {
molframe_validate::ligand_geometry_outliers(self.engine(), radii, tolerance)
}
fn quality_flags(&self) -> Vec<molframe_validate::QualityFlag> {
molframe_validate::quality_flags(self.engine())
}
fn overvalent_atoms(&self) -> Vec<molframe_validate::ValenceError> {
molframe_validate::overvalent_atoms(self.engine())
}
fn cis_peptides(
&self,
threshold_degrees: f64,
) -> Result<Vec<molframe_validate::CisPeptide>, molframe_core::diagnostic::Diagnostic> {
molframe_validate::cis_peptides(self.engine(), threshold_degrees)
}
fn nonplanar_aromatic_rings(
&self,
options: molframe_validate::PlanarityOptions,
) -> Result<Vec<molframe_validate::PlanarityFlag>, molframe_validate::PlanarityError> {
molframe_validate::nonplanar_aromatic_rings(self.engine(), options)
}
fn plane_restraint_outliers(
&self,
restraints: &[molframe_validate::PlaneRestraint],
options: molframe_validate::PlanarityOptions,
) -> Result<molframe_validate::PlaneRestraintReport, molframe_validate::PlanarityError> {
molframe_validate::plane_restraint_outliers(self.engine(), restraints, options)
}
fn ramachandran(
&self,
options: &molframe_validate::RamachandranOptions<'_>,
) -> Result<Vec<molframe_validate::RamachandranRecord>, molframe_validate::RamachandranError>
{
molframe_validate::ramachandran(self.engine(), options)
}
fn ramachandran_outliers(
&self,
options: &molframe_validate::RamachandranOptions<'_>,
) -> Result<Vec<molframe_validate::RamachandranRecord>, molframe_validate::RamachandranError>
{
molframe_validate::ramachandran_outliers(self.engine(), options)
}
fn rotamer_outliers(
&self,
provider: &dyn ComponentProvider,
policy: &AnalysisPolicy,
references: &molframe_validate::ReferenceLibrary,
profile: &molframe_validate::RotamerProfile,
options: molframe_validate::RotamerOptions,
) -> Result<molframe_validate::RotamerReport, molframe_validate::RotamerError> {
molframe_validate::rotamer_outliers(
self.engine(),
provider,
policy,
references,
profile,
options,
)
}
fn chirality_outliers(
&self,
provider: &dyn ComponentProvider,
policy: &AnalysisPolicy,
options: molframe_validate::ChiralityOptions,
) -> Result<molframe_validate::ChiralityReport, molframe_core::diagnostic::Diagnostic> {
molframe_validate::chirality_outliers(self.engine(), provider, policy, options)
}
fn ccd_missing_atoms(
&self,
provider: &dyn ComponentProvider,
policy: &AnalysisPolicy,
) -> Result<molframe_validate::CcdCompletenessReport, molframe_core::diagnostic::Diagnostic>
{
molframe_validate::ccd_missing_atoms(self.engine(), provider, policy)
}
fn nucleic_acid_geometry(
&self,
provider: &dyn ComponentProvider,
roles: &PolymerRoleProfile,
policy: molframe_validate::NucleicGeometryPolicy,
) -> Result<
Vec<molframe_validate::NucleicGeometryRecord>,
molframe_validate::NucleicGeometryError,
> {
molframe_validate::nucleic_acid_geometry(self.engine(), provider, roles, policy)
}
fn completeness(
&self,
namespace: Namespace,
) -> Result<Vec<molframe_validate::ChainCompleteness>, molframe_validate::CompletenessError>
{
molframe_validate::completeness(self.engine(), namespace)
}
fn altloc_occupancy_sums(
&self,
namespace: Namespace,
options: molframe_validate::AltlocOccupancyOptions,
) -> Result<molframe_validate::AltlocOccupancyReport, molframe_validate::AltlocOccupancyError>
{
molframe_validate::altloc_occupancy_sums(self.engine(), namespace, options)
}
fn reference_geometry(
&self,
provider: &dyn ComponentProvider,
namespace: Namespace,
options: molframe_validate::ReferenceGeometryOptions,
) -> Result<molframe_validate::ReferenceGeometryReport, molframe_core::diagnostic::Diagnostic>
{
molframe_validate::reference_geometry(self.engine(), provider, namespace, options)
}
fn b_factor_distribution(
&self,
selection: &Selection,
outlier_standard_deviations: f64,
) -> Result<molframe_validate::BFactorDistribution, molframe_validate::BFactorError> {
molframe_validate::b_factor_distribution(
self.engine(),
selection.atom_selection(),
outlier_standard_deviations,
)
}
fn tls_b_factor_consistency(
&self,
groups: &[molframe_validate::TlsGroup],
maximum_absolute_deviation: f64,
symmetry_tolerance: f64,
) -> Result<molframe_validate::TlsBFactorReport, molframe_validate::BFactorError> {
molframe_validate::tls_b_factor_consistency(
self.engine(),
groups,
maximum_absolute_deviation,
symmetry_tolerance,
)
}
}