Source code for molsysmt.form.parmed_Structure.has_attribute
from molsysmt._private.argdigest import arg_digest
[docs]
@arg_digest(form='parmed.Structure')
def has_attribute(molecular_system, attribute, include_none=False, skip_digestion=False):
from . import attributes
output = attributes[attribute]
if output and not include_none:
if attribute == 'formal_charge':
output = any(
getattr(atom, 'formal_charge', None) is not None
for atom in molecular_system.atoms
)
elif attribute == 'partial_charge':
output = bool(molecular_system.atoms) and all(
getattr(atom, 'charge', None) is not None
for atom in molecular_system.atoms
)
elif attribute == 'atom_is_aromatic':
output = any(
getattr(atom, 'aromatic', None) is not None
for atom in molecular_system.atoms
)
elif attribute in {
'bond_type', 'bond_order', 'fractional_bond_order',
'bond_is_aromatic', 'bond_evidence',
}:
from ._chemical_state import bond_table_from_structure
column = {
'bond_type': 'bond_type',
'bond_order': 'bond_order',
'fractional_bond_order': 'fractional_bond_order',
'bond_is_aromatic': 'is_aromatic',
'bond_evidence': 'evidence',
}[attribute]
bond_table, _ = bond_table_from_structure(molecular_system)
output = column in bond_table and bond_table[column].notna().any()
elif attribute == 'connectivity_completeness':
output = hasattr(molecular_system, 'bonds')
elif attribute in {'coordinates', 'structure_id', 'structure_index', 'n_structures'}:
output = molecular_system.get_coordinates('all') is not None
elif attribute in {'box', 'box_angles', 'box_lengths', 'box_shape', 'box_volume'}:
output = molecular_system.get_box('all') is not None
elif attribute == 'b_factor':
output = any(float(atom.bfactor) != 0.0 for atom in molecular_system.atoms)
return bool(output)