Source code for schrodinger.application.matsci.polymer
"""
Module containing functionalities related to polymers
Copyright Schrodinger, LLC. All rights reserved.
"""
from schrodinger.application.matsci import amorphous
from schrodinger.application.matsci import clusterstruct
from schrodinger.application.matsci import msprops
[docs]def create_polymer_name(mol):
    """
    Create a polymer name for the passed molecule by finding its monomers.
    Returns None if the molecule is not a polymer or has unexpected composition,
    e.g. more than one initiator.
    The format is "a-{initiator}-w-{terminator}-poly({list of other monomers})"
    Example: a-chloro-w-fluoro-poly(caprolactam-chloroprene)
    :param `structure._Molecule` mol: The molecule to get the name for
    :rtype: str or None
    :return: The polymer name, or None if the molecule is not a polymer
    """
    initiator = ''
    terminator = ''
    monomers = set()
    for atom in mol.atom:
        monomer_name = atom.property.get(msprops.MONOMER_NAME_PROP)
        if monomer_name is None:
            continue
        if atom.pdbres.rstrip() == amorphous.INI:
            if initiator:
                if initiator != monomer_name:
                    return None  # More than one initiator monomer
            else:
                initiator = monomer_name
        elif atom.pdbres.rstrip() == amorphous.TRM:
            if terminator:
                if terminator != monomer_name:
                    return None
            else:
                terminator = monomer_name
        else:
            monomers.add(monomer_name)
    if not all([initiator, terminator, monomers]):
        # Not a polymer (not one we made at least)
        return None
    parts = []
    if initiator != 'aH':
        # [1:] removes 'a' or 'w' from the beginning of the name
        parts.extend(['a', initiator[1:]])
    if terminator != 'wH':
        parts.extend(['w', terminator[1:]])
    if parts:
        parts.append('')  # Adds an extra dash before "poly"
    monomers_str = '-'.join(sorted(monomers))
    polymer_name = '-'.join(parts) + f'poly({monomers_str})'
    return polymer_name 
[docs]def find_polymer_species(structs):
    """
    Convenience function to find polymer species in the passed structures.
    Molecules that are not polymers are grouped by SMILES.
    See `clusterstruct.find_species` for more information
    :param iterable structs: The structures to get species for
    :rtype: dict
    :return: Keys are unique SMILES strings or group names for species, values
        are SpeciesData objects for that species
    """
    return clusterstruct.find_species(structs,
                                      naming_function=create_polymer_name)