def from_prody_atomgroup( cls, name: ProteinKey, protein: pd.AtomGroup, split_type: SplitType = SplitType.KMER, split_size: int = 16, selection: str = "calpha", upsample_rate: int = 50, moment_types: List[MomentType] = ( MomentType.O_3, MomentType.O_4, MomentType.O_5, MomentType.F, ), ): """ Construct MomentInvariants instance from a ProDy AtomGroup object. Selects according to `selection` string, (default = alpha carbons) `moment_types` determines which moments are calculated. Example -------- >>> invariants = MomentInvariants.from_prody_atomgroup(atom_group, split_type=SplitType.RADIUS, moment_types=[MomentType.O_3, MomentType.F, MomentType.phi_7, MomentType.phi_12]) """ protein: pd.AtomGroup = protein.select("protein").select(selection) coordinates: np.ndarray = protein.getCoords() residue_splits = group_indices(protein.getResindices()) shape = cls( name, len(residue_splits), coordinates, residue_splits, protein.getIndices(), sequence=protein.getSequence(), split_type=split_type, split_size=split_size, upsample_rate=upsample_rate, moment_types=moment_types, ) shape._split(split_type) return shape
def get_beta_indices(protein: pd.AtomGroup) -> List[int]: """ Get indices of beta carbons of pd AtomGroup object (If beta carbon doesn't exist, alpha carbon index is returned) """ residue_splits = group_indices(protein.getResindices()) i = 0 indices = [] for split in residue_splits: ca = None cb = None for _ in split: if protein[i].getName() == "CB": cb = protein[i].getIndex() if protein[i].getName() == "CA": ca = protein[i].getIndex() i += 1 if cb is not None: indices.append(cb) else: assert ca is not None indices.append(ca) return indices