"""Library of scoring methods of the model outputs.""" from flax_model.alphafold3.model import protein_data_processing import jax.numpy as jnp import numpy as np Array = jnp.ndarray | np.ndarray def pseudo_beta_fn( aatype: Array, dense_atom_positions: Array, dense_atom_masks: Array, is_ligand: Array | None = None, use_jax: bool | None = True, ) -> tuple[Array, Array] | Array: """Create pseudo beta atom positions and optionally mask. Args: aatype: [num_res] amino acid types. dense_atom_positions: [num_res, NUM_DENSE, 3] vector of all atom positions. dense_atom_masks: [num_res, NUM_DENSE] mask. is_ligand: [num_res] flag if something is a ligand. use_jax: whether to use jax for the computations. Returns: Pseudo beta dense atom positions and the corresponding mask. """ if use_jax: xnp = jnp else: xnp = np if is_ligand is None: is_ligand = xnp.zeros_like(aatype) pseudobeta_index_polymer = xnp.take( protein_data_processing.RESTYPE_PSEUDOBETA_INDEX, aatype, axis=0 ).astype(xnp.int32) pseudobeta_index = xnp.where( is_ligand, xnp.zeros_like(pseudobeta_index_polymer), pseudobeta_index_polymer, ) pseudo_beta = xnp.take_along_axis( dense_atom_positions, pseudobeta_index[..., None, None], axis=-2 ) pseudo_beta = xnp.squeeze(pseudo_beta, axis=-2) pseudo_beta_mask = xnp.take_along_axis( dense_atom_masks, pseudobeta_index[..., None], axis=-1 ).astype(xnp.float32) pseudo_beta_mask = xnp.squeeze(pseudo_beta_mask, axis=-1) return pseudo_beta, pseudo_beta_mask