Source code for schrodinger.ui.sequencealignment.structure_utils
from schrodinger import structure
from schrodinger.infra import mm
from schrodinger.structutils.analyze import calculate_sasa
from schrodinger.structutils.analyze import evaluate_asl
sasa_by_res_name = None
[docs]def calculate_sasa_dict(ignore_backbone=False, include_calpha=False):
    """
    This code comes from reactive_protein_residues.py script.
    Calculates the surface-accessable surface area (SASA) for each residue's
    side-chain, and stores them in a dictionary, where the res name is a key.
    :param ignore_backbone: boolean
    :param ignore_backbone: When True, backbone N and C atoms will be deleted
        from a fragment before surface area calculation.
    :param include_calpha: boolean
    :param include_calpha: When True C-alpha will be included in surface
        area calculation.
    """
    # Calculate the SASAs only the first time this function is called:
    global sasa_by_res_name
    if sasa_by_res_name is not None:
        return sasa_by_res_name
    mm.mmfrag_initialize(mm.error_handler)
    frag_handle = mm.mmfrag_new("peptide")
    res_name_st_list = []
    first = True
    while True:
        if first:
            which = mm.MM_FIRST
            first = False
        else:
            which = mm.MM_NEXT
        try:
            name, ct_handle = mm.mmfrag_get_fragment(frag_handle, which)
        except mm.MmException as e:
            if e.rc == mm.MMFRAG_DONE:
                break
        copy_ct = mm.mmct_ct_duplicate(ct_handle)
        res_st = structure.Structure(copy_ct, True)
        if ignore_backbone:
            backbone_atoms = evaluate_asl(
                res_st, "atom.ptype \" N\" or atom.ptype \" C\"")
            res_st.deleteAtoms(backbone_atoms)
        res_name_st_list.append((name, res_st))
    mm.mmfrag_delete(frag_handle)
    mm.mmfrag_terminate()
    sasas_by_res_name = {}
    asl = "sidechain"
    if include_calpha:
        asl += " OR atom.ptype \"CA\""
    for name, res_st in res_name_st_list:
        side_chain_atoms = evaluate_asl(res_st, asl)
        res_sasa = calculate_sasa(res_st, side_chain_atoms)
        # BIOLUM-1715 Prevent possible normalization problems
        if res_sasa < 1e-3:
            res_sasa = 1.0
        sasas_by_res_name[name] = res_sasa
        # Ev:126808 Add an entry for HID (same SASA as HIS):
        if name == "HIS":
            sasas_by_res_name["HID"] = res_sasa
    return sasas_by_res_name