"""
Define common numerical constants, CT and atom property names, and keyword
values (enums).
Copyright Schrodinger, LLC. All rights reserved.
"""
from schrodinger.infra.mm import FFIO_DATA_CT_TYPE
from schrodinger.infra.mm import FFIO_FULL_SYSTEM
class _ConstantsMeta(type):
    def __iter__(self):
        for k, v in self.__dict__.items():
            if not k.startswith("_"):
                yield v
    def __str__(self):
        """
        Prints all constant members defined in the `_ConstantsMeta` class into a
        string.
        """
        return " ".join([str(e) for e in self])
[docs]class Constants(object, metaclass=_ConstantsMeta):
    """
    Related constants can inherit from `Constants` to make them iterable
    in the order of their declarations.
    """ 
class _MaePropertyValue:
    """
    This class defines a container for values associated
    with `MaePropertyName`. This makes the values iterable
    in the order of their declarations.
    """
    def __init__(self, **kwargs):
        self._kwargs = kwargs
        for k, v in kwargs.items():
            setattr(self, k, v)
    def __iter__(self):
        for v in self._kwargs.values():
            yield v
    def __str__(self):
        return " ".join([str(e) for e in self._kwargs.values()])
[docs]class MaePropertyName(str):
    """
    This class defines a container for structure or atom level properties.
    The property key can be accessed directly, while enum values are
    accessed via the `VAL` attribute.
    Example usage:
    CT_TYPE = MaePropertyName(FFIO_DATA_CT_TYPE, FULL_SYSTEM=FFIO_FULL_SYSTEM)
    ct.property[CT_TYPE] = CT_TYPE.VAL.FULL_SYSTEM
    valid_ct_types = list(CT_TYPE.VAL)
    """
    def __new__(cls, name: str, **kwargs):
        # Validation checks can be added here.
        return str.__new__(cls, name)
[docs]    def __init__(self, name: str, **kwargs):
        self.VAL = _MaePropertyValue(**kwargs)  
# Physical constants
# References:
# - GAS_CONSTANT / BOLTZMANN:
#   - https://en.wikipedia.org/wiki/Gas_constant
#   - https://physics.nist.gov/cgi-bin/cuu/Value?r
BOLTZMANN = 1.9872036E-3  # kcal/mol/K
GAS_CONSTANT = BOLTZMANN
GAS_CONSTANT_JOUL = 8.3144598  # J/mol/K
ONE_ATMOSPHERE = 1.01325  # bar
# Unit conversion factors
[docs]class Conversion:
    KCAL_TO_JOUL = 4184.0
    CAL_CM_TO_MPA = 0.48888  # From (cal/cm^3)^1/2 to MPa^(1/2)
    AU_TO_KG = 1.6605655  # Mass: 1 mole of AU to kg 
# Misc. constants
LIGAND_TOTAL_ATOMS_LIMIT = 150
# Force Field CT block
FFIO_FF = 'ffio_ff'
[docs]class EXISTING_RESTRAINT(Constants):
    RETAIN = 'retain'
    IGNORE = 'ignore'
    IGNORE_POSRE = 'ignore_posre' 
[docs]class WATER_MODELS(Constants):
    SPC = 'SPC'
    SPCE = 'SPCE'
    TIP3P = 'TIP3P'
    TIP3P_CHARMM = 'TIP3P_CHARMM'
    TIP4P = 'TIP4P'
    TIP4PEW = 'TIP4PEW'
    TIP4P2005 = 'TIP4P2005'
    TIP5P = 'TIP5P'
    TIP4PD = 'TIP4PD' 
# Map water model name to pdb residue
FFLD_WATER = {
    WATER_MODELS.SPC: "SPC",
    WATER_MODELS.SPCE: "SPCE",
    WATER_MODELS.TIP3P: "T3P",
    WATER_MODELS.TIP4P: "T4P",
    WATER_MODELS.TIP4P2005: "T4P5",
    WATER_MODELS.TIP4PEW: "T4PE",
    WATER_MODELS.TIP4PD: "T4PD",
    WATER_MODELS.TIP5P: "T5P"
}
[docs]class CUSTOM_CHARGE_MODE(Constants):
    KEEP = 'keep'
    CLEAR = 'clear'
    ASSIGN = 'assign' 
# graph constants
[docs]class FEP_TYPES(Constants):
    PROTEIN_STABILITY = 'prm_stability'
    PROTEIN_SELECTIVITY = 'protein_selectivity'
    COVALENT_LIGAND = 'covalent_ligand'
    SMALL_MOLECULE = 'small_molecule'
    METALLOPROTEIN = 'metalloprotein'
    LIGAND_SELECTIVITY = 'ligand_selectivity'
    BINDING_POSE = "binding_pose"
    ABSOLUTE_BINDING = "absolute_binding"
    SOLUBILITY = 'solubility' 
PROTEIN_FEP_TYPES = (FEP_TYPES.PROTEIN_STABILITY, FEP_TYPES.PROTEIN_SELECTIVITY,
                     FEP_TYPES.LIGAND_SELECTIVITY)
SELECTIVITY_FEP_TYPES = (FEP_TYPES.PROTEIN_SELECTIVITY,
                         FEP_TYPES.LIGAND_SELECTIVITY)
# Per edge simulation protocol
[docs]class SIMULATION_PROTOCOL(Constants):
    DEFAULT = 'default'
    CHARGED = "charge"
    FORMALCHARGED = "charge0"
    COREHOPPING = "core-hopping"
    MACROCYCLE_COREHOPPING = "macrocycle-core-hopping"
    FRAGMENT_LINKING = "fragment-linking" 
# Structure level ct properties
NUM_COMPONENT = 'i_ffio_num_component'
USE_CUSTOM_OPLSDIR = 'b_ffio_use_custom_oplsdir'
IS_INFINITE = 'b_matsci_is_infinite'  # (MATSCI-2544, MATSCI-6234)
CT_INDEX = 'i_ffio_ct_index'
CT_TYPE = MaePropertyName(FFIO_DATA_CT_TYPE,
                          FULL_SYSTEM=FFIO_FULL_SYSTEM,
                          SOLUTE='solute',
                          SOLVENT='solvent',
                          MEMBRANE='membrane',
                          ION='ion',
                          COSOLVENT='cosolvent',
                          CRYSTAL_WATER='crystal water',
                          POSITIVE_SALT='positive salt',
                          NEGATIVE_SALT='negative salt',
                          LIGAND='ligand',
                          RECEPTOR='receptor',
                          ALCHEMICAL_WATER='alchemical_water')
# there may be more..
FEP_STRUC_TAG = MaePropertyName(
    's_fep_struc_tag',
    LIGAND='ligand',
    RECEPTOR='receptor',
    MEMBRANE='membrane',
    SOLVENT='solvent',  # ct with solvent, not leg
    COMPLEX='complex')  # ct with protein-ligand complex, not leg
MOLTYPE = MaePropertyName("s_leadoptmap_moltype", LIGAND='ligand')
VISIBILITY = "i_m_visibility"
FEP_FRAGNAME = "s_fep_fragname"
FEP_WRTFRAG = 's_fep_wrtfrag'
FEP_PERTDB = 's_fep_pertdb'
FEPMAPPER_BIAS = "i_fepmapper_bias"
FEP_SUITABILITY = "r_bioluminate_delta_FEP_Suitability"
COVALENT_LIGAND = 's_fep_covalent_ligand'
FEP_COVALENT_PROTEIN_BB_ATOM = 'i_fep_cov_protein_bb_atom'
FEP_DG_PREFIX = "s_des_dG"
FEP_DDG_PREFIX = "s_des_ddG"
FEP_DG_CROSSLINK_CORRECTION_REF = FEP_DG_PREFIX + "_crosslink_correction_ref"
FEP_DG_CROSSLINK_CORRECTION_MUT = FEP_DG_PREFIX + "_crosslink_correction_mut"
FEP_DDG_CROSSLINK_CORRECTION = FEP_DDG_PREFIX + "_crosslink_correction"
# For the absolute binding fep workflow
FEP_DG_CROSSLINK_CORRECTION = FEP_DG_PREFIX + "_crosslink_correction"
FEP_PRED_DG = "r_fepplus_pred_dg"  # FIXME: PANEL should use this contant
FEP_PRED_DG_ERROR = "r_fepplus_pred_dg_error"  # FIXME: PANEL should use this contant
# Used to set node experimental dg on initial graph creation.
FEPMAPPER_EXP_DG = "r_fepmapper_exp_dG"
# Used to keep track of the mutations for protein fep.
BIOLUMINATE_MUTATION = "s_bioluminate_Mutations"
# Marker for the WT structure.
BIOLUMINATE_WT = 'NONE'
ABFEP_DUMMY_LIGAND = "b_fep_ab_dummy_ligand"
# Marker for dummy ligand in AB FEP and Solubility
DUMMY_LIGAND = "b_fep_dummy_ligand"
LIGAND_ORIGINAL_TITLE = "s_ligand_original_title"
PROTEIN_ORIGINAL_TITLE = "s_protein_original_title"
# Selection bias correction properties.
CORRECTED_PREDICTED_AFFINITY_KCAL = 'r_fep_Corrected_Predicted_Affinity_(kcal/mol)'
CORRECTED_PREDICTED_UNCERTAINTY_KCAL = 'r_fep_Corrected_Predicted_Uncertainty_(kcal/mol)'
CORRECTED_PREDICTED_AFFINITY_nM = 'r_fep_Corrected_Predicted_Affinity_(nM)'
FOLD_UNCERTAINTY = 'r_fep_Fold_Uncertainty'
# Mixed solvent properties.
MXMD_COSOLVENT_PROBE = 's_mxmd_cosolvent_probe'
MXMD_GRID_SPACING = 'r_mxmd_grid_spacing'
MXMD_BOX_LENGTH = 'r_mxmd_box_length'
MXMD_NUM_PROBES = 'i_mxmd_num_probes'
MXMD_CENTER_X = 'r_mxmd_center_x'
MXMD_CENTER_Y = 'r_mxmd_center_y'
MXMD_CENTER_Z = 'r_mxmd_center_z'
# Simulation box
_SIM_BOX_BASENAME = 'r_chorus_box'
SIM_BOX = tuple(f"{_SIM_BOX_BASENAME}_{abc}{xyz}" for abc in ['a', 'b', 'c']
                for xyz in ['x', 'y', 'z'])
SIM_BOX_DIAGONAL = tuple(
    f"{_SIM_BOX_BASENAME}_{val}" for val in ('ax', 'by', 'cz'))
# Trajectory
TRJ_POINTER = 's_chorus_trajectory_file'
# Solubility FEP properties.
FEP_ORIGINAL_TITLE = 's_fep_original_title'
FEP_HASH_ID = 's_fep_hash_id'
FEP_SOLUBILITY = "s_des_dG_dissolution"
FEP_SOLUBILITY_MICROMOLAR = 'r_des_solubility_[uM]'
FEP_TRANSFER_FREE_ENERGY = "s_des_dG_transfer"
SOLUBILITY_SUBJOB = MaePropertyName('s_fep_solubility_subjob',
                                    MD='md',
                                    HYDRATION='hydration',
                                    SUBLIMATION='sublimation',
                                    SOLVATION='solvation',
                                    SOLUBLE='soluble')
SOLUBILITY_STATUS = MaePropertyName('s_fep_solubility_status',
                                    FINISHED='finished',
                                    FAILED='failed')
# Atom level ct properties
FEP_MAPPING = "i_fep_mapping"
FEP_RESTRAIN = "i_fep_restrain"
FEPIO_STAGE = 'i_fepio_stage'
FEP_SUBST = 'i_fep_subst'
# Marks the ligand atoms for protein ligand mutation
LIGAND_MARKER = "i_protmap_nochange"
CRYSTAL_WATER_PROP = 'i_desmond_crystal_water'
FF_USE_EXISTING_CHARGE = "i_ff_skip_cm1a"
# TODO: What is the difference between these?
FEP_ATOM_INDEX = "i_fep_pa_atomindex"
ORIGINAL_INDEX = 'i_m_original_index'
ORIGINAL_MOLECULE_NUMBER = 'i_m_original_molecule'
# atom property added in captermini.CapTermini
PPW_ATOM_INDEX = "i_ppw_original_index"
# atom property added in Epik generated titration states
FEP_TMP_IDX = "i_fep_tmp_idx"
# Atom charge
FF_CUSTOM_CHARGE = 'r_ffio_custom_charge'
DES_ATOM_DOMAIN = MaePropertyName('i_des_atom_domain',
                                  SOLUTE=1,
                                  SOLVENT=2,
                                  ION=3,
                                  MEMBRANE=4,
                                  CRYSTAL_WATER=5,
                                  ALCHEM_A=7,
                                  ALCHEM_B=8,
                                  INACTIVE=9)
# REST region definition
REST_HOTREGION = "i_rest_hotregion"
[docs]class REST_PROPERTIES(Constants):
    SOLVENT_HOTREGION = 'i_rest_solvent_hotregion'
    COMPLEX_HOTREGION = 'i_rest_complex_hotregion' 
[docs]class REST_COMPONENT(Constants):
    ENVIRONMENT = "environment"
    RECEPTOR = "receptor"
    MEMBRANE = "membrane"
    LIGAND = "ligand"
    COMPLEX = "complex" 
[docs]class REST_REGION_RULE(Constants):
    DEFAULT = 'default'
    ALL = 'all' 
# Absolute FEP properties.
FEP_ABSOLUTE_ENERGY = "i_ffio_grp_energy"
FEP_ABSOLUTE_LIGAND = "i_ffio_grp_ligand"
# Protein FEP properties.
# PROT_LIGAND_REGION signifies the subset of the protein that
# is mutating in protein fep, analogous to the ligand in normal FEP
# (no guarantee that all atoms are mutated)
PROT_LIGAND_REGION = "i_fep_protein_mutating_subset"
# Original coordinates
REFERENCE_COORD_BASENAME = 'r_fep_original_coord'
REFERENCE_COORD_PROPERTIES = [
    REFERENCE_COORD_BASENAME + '_x', REFERENCE_COORD_BASENAME + '_y',
    REFERENCE_COORD_BASENAME + '_z'
]
# Only for the analysis, not used to determine restraints
_ANALYSIS_REFERENCE_COORD_BASENAME = 'r_fep_analysis_original_coord'
ANALYSIS_REFERENCE_COORD_PROPERTIES = [
    _ANALYSIS_REFERENCE_COORD_BASENAME + '_x',
    _ANALYSIS_REFERENCE_COORD_BASENAME + '_y',
    _ANALYSIS_REFERENCE_COORD_BASENAME + '_z'
] # yapf: disable
# alchemical ion
# FIXME: Note there is also a `CT_TYPE.VAL.ALCHEMICAL_WATER`
ALCHEMICAL_ION = 'b_fep_alchemical_ion'
ALCHEMICAL_WATER = 'i_fep_alchemical_water'
ALCHEMICAL_WATER_CHARGE = 'i_fep_alchemical_water_charge'
# Maestro subgroup
M_SUBGROUP_TITLE = 's_m_subgroup_title'
M_SUBGROUPID = 's_m_subgroupid'
M_SUBGROUP_COLLAPSED = 'b_m_subgroup_collapsed'
# FEP schedule names
POSE_DIHEDRAL_RESTRAINT = 'pose_dihedral_restraint'
[docs]class IsotropyPolicy(Constants):
    ISOTROPIC = 'isotropic'
    SEMI_ISOTROPIC = 'semi_isotropic'
    CONSTANT_AXIS_A = "constant_axis_a"
    CONSTANT_AXIS_B = "constant_axis_b"
    CONSTANT_AXIS_C = "constant_axis_c"
    ANISOTROPIC = "anisotropic"
    FLEXIBLE = "flexible" 
# Conformation restraint types
[docs]class ConfRestraintType(Constants):
    BACKBONE = "backbone"
    SIDECHAIN = "sidechain"
    CALPHA_RUNG = "calpha_rung" 
# Fragment linking
FRAGMENT_LINKING_JOBS = MaePropertyName(
    's_fep_frag_linking_job',
    COMPLEX='complex',
    SOLVENT='solvent',
    FRAGMENT_HYDRATION='solvent_fragment_hydration',
    RESTRAINED_FRAGMENT_HYDRATION='solvent_restrained_fragment_hydration')
FRAGMENT_LINKING_SOLVENT_JOBS = (
    FRAGMENT_LINKING_JOBS.VAL.SOLVENT,
    FRAGMENT_LINKING_JOBS.VAL.FRAGMENT_HYDRATION,
    FRAGMENT_LINKING_JOBS.VAL.RESTRAINED_FRAGMENT_HYDRATION)
FRAGMENT_LINKING_HYDRATION_JOBS = (
    FRAGMENT_LINKING_JOBS.VAL.FRAGMENT_HYDRATION,
    FRAGMENT_LINKING_JOBS.VAL.RESTRAINED_FRAGMENT_HYDRATION)
FEP_RESTRAINT_CORRECTION = 'r_fep_restraint_correction'
FRAGMENT_LINKING_SIGN = 'i_fep_frag_linking_sign'
FEP_ENCODED_RESTRAINTS = 's_fep_encoded_restraints'
ABFE_LIGAND = 'b_fep_abfe'
FEP_ABSOLUTE_BINDING_LIGAND = 'i_fep_absolute_binding_ligand'
# protein backbone atom pdbname
PROTEIN_BACKBONE_PDB_NAMES = [
    ' H  ', ' N  ', ' O  ', ' CA ', ' HA ', ' C  ', ' HA3', ' HA2'
]
# Absolute Binding FEP
ABSOLUTE_BINDING_LEGS = MaePropertyName('s_fep_absolute_binding_leg',
                                        COMPLEX='complex',
                                        SOLVENT='solvent')
[docs]class FepLegTypes(Constants):
    COMPLEX = 'complex'
    SOLVENT = 'solvent'
    VACUUM = 'vacuum'
    SUBLIMATION = 'sublimation'
    HYDRATION = 'hydration'
    SOLVATION = SOLUBILITY_SUBJOB.VAL.SOLVATION
    FRAGMENT_HYDRATION = FRAGMENT_LINKING_JOBS.VAL.FRAGMENT_HYDRATION
    RESTRAINED_FRAGMENT_HYDRATION = FRAGMENT_LINKING_JOBS.VAL.RESTRAINED_FRAGMENT_HYDRATION 
[docs]class Ensembles(Constants):
    NVT = "NVT"
    NPT = "NPT"
    MUVT = "muVT" 
[docs]class RestrainTypes(Constants):
    POS = 'pos'
    POS_FBHW = 'posfbhw'
    STRETCH_FBHW = 'stretchfbhw'
    ANGLE_FBHW = 'anglefbhw'
    IMPROPER_FBHW = 'improperfbhw' 
# Default
ABSOLUTE_BINDING_COMPLEX_LAMBDAS = 68
ABSOLUTE_BINDING_SOLVENT_LAMBDAS = 60
# ABFEP with restraints uses a different number of lambdas
ABSOLUTE_BINDING_RESTRAINED_COMPLEX_LAMBDAS = 80
ABSOLUTE_BINDING_RESTRAINED_SOLVENT_LAMBDAS = 68
# Default number of lambdas
[docs]class Schedule(Constants):
    DEFAULT = "default"
    FLEXIBLE = "flexible"
    CHARGE = "charge" 
DEFAULT_LAMBDAS_BY_SCHEDULE = {
    Schedule.DEFAULT: 12,
    Schedule.FLEXIBLE: 16,
    Schedule.CHARGE: 24,
}
# Absolute hydration windows
FRAGMENT_LINKING_HYDRATION_LAMBDAS = 24
DEFAULT_LAMBDAS_BY_SIMULATION_PROTOCOL = {
    SIMULATION_PROTOCOL.DEFAULT: DEFAULT_LAMBDAS_BY_SCHEDULE[Schedule.DEFAULT],
    SIMULATION_PROTOCOL.CHARGED: DEFAULT_LAMBDAS_BY_SCHEDULE[Schedule.CHARGE],
    SIMULATION_PROTOCOL.FORMALCHARGED: DEFAULT_LAMBDAS_BY_SCHEDULE[
        Schedule.CHARGE],
    SIMULATION_PROTOCOL.COREHOPPING: DEFAULT_LAMBDAS_BY_SCHEDULE[
        Schedule.FLEXIBLE],
    SIMULATION_PROTOCOL.MACROCYCLE_COREHOPPING: DEFAULT_LAMBDAS_BY_SCHEDULE[
        Schedule.FLEXIBLE],
    SIMULATION_PROTOCOL.FRAGMENT_LINKING: FRAGMENT_LINKING_HYDRATION_LAMBDAS
}
FFIO_NUM_PSEUDOS = 'i_ffio_num_pseudos'
FFIO_PARENT2PSEUDO = 's_ffio_parent_to_pseudo'
FEP_TITRATION_STATES = 's_fep_TITRATION_STATES'
FEP_STATE_INFO = 's_fep_STATE_INFO'
FEP_AID2GID = 's_fep_aid2gid'
FEP_ALCHEMICAL_CHANGE = 's_fep_ALCHEMICAL_CHANGE'
DESMOND_WRITE_JSON = 'b_desmond_write_json'
[docs]class IdConversion(Constants):
    COMPONENT_TO_COMBINED = 'component_to_combined'
    ATOM_TOTAL = 'atom_total'
    PSEUDO_END = 'pseudo_end'
    PARENT2PSEUDO = 'parent_to_pseudo'
    PSEUDO2PARENT = 'pseudo_to_parent'
    TOPOLOGY = 'topology' 
GCMC_BATCH_SIZE_DEFAULT = 1600
GCMC_LIGAND = 'i_gcmc_ligand'
# keys are (water model, inner timestep fs)
# values are: (chemical_potential: kcal/mol, molecule number density: 1/A^3)
# exclusion_radius = 1.5 A
GCMC_CHEMICAL_POTENTIALS = {
    ("SPC", 4): (-6.137, 0.032480),
    ("TIP3P", 4): (-6.011, 0.032722),
    ("TIP4P", 4): (-5.997, 0.033041),
    ("TIP4PEW", 4): (-6.858, 0.033145),
    ("TIP4PD", 4): (-7.694, 0.033083),
    ("TIP5P", 4): (-5.569, 0.032731),
    ("SPCE", 4): (-6.958, 0.033),
    ("TIP4P2005", 4): (-7.064, 0.033),
    ("SPC", 2): (-6.189, 0.03262),
    ("TIP3P", 2): (-6.060, 0.0329),
    ("TIP4P", 2): (-6.051, 0.03315),
    ("TIP4PEW", 2): (-6.940, 0.03323),
    ("TIP4PD", 2): (-7.821, 0.03316),
    ("TIP5P", 2): (-5.628, 0.03285),
    ("SPCE", 2): (-7.016, 0.033),
    ("TIP4P2005", 2): (-7.122, 0.033),
}
# Water models that only work with S-OPLS and not OPLS2005
S_OPLS_WATER_MODELS = {
    "TIP4P", "TIP4P2005", "TIP4PEW", "TIP4PD", "TIP5P", "SCPE"
}
# FEP advanced options GUI lambda window option aliases
ALIAS_FEP_NUM_LW_DEFAULT = 'num_lw_default'
ALIAS_FEP_NUM_LW_CORE = 'num_lw_core'
ALIAS_FEP_NUM_LW_CHARGE = 'num_lw_charge'
# FFIO velocity
_FFIO_PREFIX = 'r_ffio_'
_VELOCITY_POSTFIX = '_vel'
VELOCITY_PROPERTIES = [
    _FFIO_PREFIX + 'x' + _VELOCITY_POSTFIX,
    _FFIO_PREFIX + 'y' + _VELOCITY_POSTFIX,
    _FFIO_PREFIX + 'z' + _VELOCITY_POSTFIX
]
# FFIO coordinate
_COORD_POSTFIX = '_coord'
COORD_PROPERTIES = [
    _FFIO_PREFIX + 'x' + _COORD_POSTFIX, _FFIO_PREFIX + 'y' + _COORD_POSTFIX,
    _FFIO_PREFIX + 'z' + _COORD_POSTFIX
]
[docs]class CorrectionTerm(Constants):
    PKA = "pKa"
    STATE_PENALTY = "State Penalty"
    UNKNOWN = "Unknown"
    BORESCH_RESTRAINT = "Boresch Restraint"
    FRAGMENT_SOLVATION = "Fragment Solvation" 
# keys used in interaction match
[docs]class FEP_STATE_KEYS(Constants):
    WT = 'wt'
    MUT = 'mut' 
# ASL
BACKBONE_CA_ASL = "(backbone and atom.ptype ' CA ')"
[docs]class ENERGY_GROUPS(Constants):
    PRESSURE_TENSOR = 'pressure_tensor'
    CORR_ENERGY = 'corr_energy'
    SELF_ENERGY_ONLY = 'self_energy_only'
    CROSS_ENERGY_ONLY = 'cross_energy_only'
    GCMC_INFO = 'gcmc_info'
    SIMULATION_BOX = 'simulation_box' 
# type of cms.Cms
[docs]class SystemType(Constants):
    ALCHEMICAL = 1  # requires desmond gibbs plugin for alchemical changes
    BINDING = 2  # requires desmond gibbs plugin for binding FEP
    OTHER = 0 
# property to use titration code for fep
USE_TITRATION = 'b_fep_use_titration'
# Lambda Dynamics
FEP_TITRATABLE_GROUP = 'i_fep_titratable_group'
CONSTANT_PH_UNMAP_SIDECHAIN = 'b_titration_unmap_sidechain'
CONSTANT_PH_TITRATABLE_WATER = 'b_fep_TITRATABLE_H2O'
CONSTANT_PH_PMF_ORDER = 4
# key for conf-pose restraints
CONF_POST_RESTRAINTS = "conf_pose_restraints"
# For model2 license
[docs]class PRODUCT(Constants):
    FEP = 'fep'
    CONSTANT_PH = 'constant_ph'
    IFD_MD = 'ifd-md' 
# For OPLS_DIR
SCHRODINGER_MULTISIM_DONT_COPY_OPLS = 'SCHRODINGER_MULTISIM_DONT_COPY_OPLS'
# For memory, linear fit is for mem in MB vs num atoms * num lambdas
# Data comes from GraphDB runs
# For small molecule, abfep, prm stability fep
CPU_SLOPE_INTERCEPT = (0.002214250636309, 4162.26530542264)
GPU_SLOPE_INTERCEPT = (0.004060048145001, 879.10326851197)
# For covalent and selectivity fep
COVALENT_CPU_SLOPE_INTERCEPT = (0.00427170019974, 4056.80282331548)
COVALENT_GPU_SLOPE_INTERCEPT = (0.010131291639133, -232.357871994725)