use crate::ExecutionContext;
use crate::structure::{Selection, Structure};
use molframe_chem::ComponentProvider;
use molframe_spatial::{SpatialBackend, SpatialError};
pub trait AnalysisExt {
fn atom_contacts(&self, cutoff: f32) -> Result<molframe_analysis::ContactTable, SpatialError>;
fn atom_contacts_with(
&self,
cutoff: f32,
backend: SpatialBackend,
context: &ExecutionContext,
) -> Result<molframe_analysis::ContactTable, SpatialError>;
fn atom_contacts_between(
&self,
left: &Selection,
right: &Selection,
cutoff: f32,
) -> Result<molframe_analysis::ContactTable, SpatialError>;
fn atom_contacts_between_with(
&self,
left: &Selection,
right: &Selection,
cutoff: f32,
backend: SpatialBackend,
context: &ExecutionContext,
) -> Result<molframe_analysis::ContactTable, SpatialError>;
fn visit_atom_contacts<F: FnMut(molframe_analysis::Contact)>(
&self,
cutoff: f32,
emit: F,
) -> Result<(), SpatialError>;
fn visit_atom_contacts_with<F: FnMut(molframe_analysis::Contact)>(
&self,
cutoff: f32,
backend: SpatialBackend,
context: &ExecutionContext,
emit: F,
) -> Result<(), SpatialError>;
fn residue_contact_map(
&self,
cutoff: f32,
min_separation: u32,
) -> Result<molframe_analysis::ContactMap, SpatialError>;
fn residue_contact_map_with(
&self,
cutoff: f32,
min_separation: u32,
backend: SpatialBackend,
context: &ExecutionContext,
) -> Result<molframe_analysis::ContactMap, SpatialError>;
fn hydrogen_bonds(
&self,
options: molframe_analysis::HydrogenBondOptions,
) -> Result<molframe_analysis::HydrogenBondTable, molframe_analysis::HydrogenBondError>;
fn hydrogen_bonds_with(
&self,
options: molframe_analysis::HydrogenBondOptions,
context: &ExecutionContext,
) -> Result<molframe_analysis::HydrogenBondTable, molframe_analysis::HydrogenBondError>;
fn water_bridges(
&self,
options: molframe_analysis::WaterBridgeOptions,
) -> Result<molframe_analysis::WaterBridgeTable, molframe_analysis::HydrogenBondError>;
fn water_bridges_with(
&self,
options: molframe_analysis::WaterBridgeOptions,
context: &ExecutionContext,
) -> Result<molframe_analysis::WaterBridgeTable, molframe_analysis::HydrogenBondError>;
fn salt_bridges(
&self,
max_distance: f32,
) -> Result<molframe_analysis::SaltBridgeTable, SpatialError>;
fn salt_bridges_with(
&self,
max_distance: f32,
backend: SpatialBackend,
context: &ExecutionContext,
) -> Result<molframe_analysis::SaltBridgeTable, SpatialError>;
fn pi_stacking(
&self,
options: molframe_analysis::PiStackingOptions,
) -> Result<molframe_analysis::PiStackingTable, molframe_analysis::PiStackingError>;
fn cation_pi(
&self,
options: molframe_analysis::CationPiOptions,
) -> Result<molframe_analysis::CationPiTable, molframe_analysis::CationPiError>;
fn base_pairs(
&self,
provider: &dyn ComponentProvider,
options: molframe_analysis::BasePairOptions,
) -> Result<Vec<molframe_analysis::BasePair>, molframe_analysis::BasePairError>;
fn base_pairs_with(
&self,
provider: &dyn ComponentProvider,
options: molframe_analysis::BasePairOptions,
context: &ExecutionContext,
) -> Result<Vec<molframe_analysis::BasePair>, molframe_analysis::BasePairError>;
fn secondary_structure(
&self,
options: &molframe_analysis::DsspOptions,
) -> Result<molframe_analysis::SseTable, molframe_analysis::DsspError>;
fn chain_interface(
&self,
first: &str,
second: &str,
cutoff: f32,
) -> Result<Vec<molframe_core::index::ResidueIndex>, SpatialError>;
fn chain_interface_with(
&self,
first: &str,
second: &str,
cutoff: f32,
backend: SpatialBackend,
context: &ExecutionContext,
) -> Result<Vec<molframe_core::index::ResidueIndex>, SpatialError>;
fn native_contact_fraction(
&self,
target: &Structure,
cutoff: f32,
tolerance: f32,
) -> Result<molframe_analysis::NativeContacts, molframe_analysis::NativeError>;
fn native_contact_fraction_with(
&self,
target: &Structure,
cutoff: f32,
tolerance: f32,
backend: SpatialBackend,
context: &ExecutionContext,
) -> Result<molframe_analysis::NativeContacts, molframe_analysis::NativeError>;
fn half_sphere_exposure(
&self,
radius: f32,
) -> Result<Vec<molframe_analysis::HalfSphereExposure>, molframe_analysis::HseError>;
fn half_sphere_exposure_with(
&self,
radius: f32,
backend: SpatialBackend,
context: &ExecutionContext,
) -> Result<Vec<molframe_analysis::HalfSphereExposure>, molframe_analysis::HseError>;
fn nucleic_torsions(
&self,
) -> Result<Vec<molframe_analysis::NucleicTorsions>, molframe_analysis::NucleicTorsionError>;
fn surface_contacts(
&self,
radii: &[f32],
options: molframe_analysis::SurfaceContactOptions,
) -> Result<Vec<molframe_analysis::Contact>, molframe_surface::SasaError>;
fn surface_contacts_with(
&self,
radii: &[f32],
options: molframe_analysis::SurfaceContactOptions,
context: &ExecutionContext,
) -> Result<Vec<molframe_analysis::Contact>, molframe_surface::SasaError>;
}