From 9f0363bfb16ecfa0247abfd86082393f0dc37449 Mon Sep 17 00:00:00 2001 From: adw62 Date: Mon, 8 Aug 2022 20:05:44 +0100 Subject: [PATCH] add API doc --- TIES_MD/TIES.py | 151 +++++++----- TIES_MD/alch.py | 18 +- TIES_MD/cli.py | 14 +- TIES_MD/doc/source/HPC_submissions.rst | 14 +- TIES_MD/doc/source/binding_free_energies.rst | 54 ++--- TIES_MD/doc/source/parallelization.rst | 54 ++--- TIES_MD/doc/source/tutorial.rst | 47 ++-- TIES_MD/eng_scripts/cfg_scripts/TIES.cfg | 5 - .../FEP/ethane/zero_sum/leg1/overlap0.npy | Bin 640 -> 640 bytes .../FEP/ethane/zero_sum/leg1/overlap1.npy | Bin 640 -> 640 bytes .../FEP/ethane/zero_sum/leg1/overlap2.npy | Bin 640 -> 640 bytes .../OpenMM/TI/ethane/zero_sum/leg1/dUdlam.png | Bin 96912 -> 96771 bytes .../examples/ethane/zero_sum/leg1/TIES.cfg | 4 +- .../ethane_namd/zero_sum/leg1/TIES.cfg | 4 +- .../examples/hydration/l1-l2/leg1/TIES.cfg | 4 +- .../ligand_protein/ties-l2-l1/com/TIES.cfg | 4 +- TIES_MD/examples/result.dat | 2 +- TIES_MD/tests/test_TIES.py | 5 +- TIES_MD/tests/test_alch.py | 8 +- TIES_MD/ties_analysis/ties_analysis.py | 2 +- docs/API.html | 226 ++++++++++++++++++ docs/HPC_submissions.html | 15 +- docs/TIES_MD.eng_scripts.cfg_scripts.html | 1 + docs/TIES_MD.eng_scripts.html | 1 + docs/TIES_MD.eng_scripts.namd_sub.html | 1 + docs/TIES_MD.eng_scripts.namd_sub_split.html | 1 + docs/TIES_MD.eng_scripts.openmm_sub.html | 138 +++++++++++ .../TIES_MD.eng_scripts.openmm_sub_split.html | 1 + docs/TIES_MD.html | 51 ++-- docs/TIES_MD.openmmtools.html | 1 + docs/TIES_MD.ties_analysis.engines.html | 1 + docs/TIES_MD.ties_analysis.html | 6 + docs/TIES_MD.ties_analysis.methods.html | 1 + docs/_sources/API.rst.txt | 114 +++++++++ docs/_sources/HPC_submissions.rst.txt | 14 +- .../TIES_MD.eng_scripts.openmm_sub.rst.txt | 10 + docs/_sources/binding_free_energies.rst.txt | 54 ++--- docs/_sources/parallelization.rst.txt | 54 ++--- docs/_sources/tutorial.rst.txt | 47 ++-- docs/_static/pygments.css | 34 +-- docs/binding_free_energies.html | 59 ++--- docs/genindex.html | 17 +- docs/index.html | 5 + docs/install.html | 1 + docs/modules.html | 1 + docs/objects.inv | Bin 2513 -> 2569 bytes docs/parallelization.html | 55 +++-- docs/py-modindex.html | 1 + docs/search.html | 1 + docs/searchindex.js | 2 +- docs/theory.html | 1 + docs/tutorial.html | 53 ++-- 52 files changed, 910 insertions(+), 447 deletions(-) create mode 100644 docs/API.html create mode 100644 docs/TIES_MD.eng_scripts.openmm_sub.html create mode 100644 docs/_sources/API.rst.txt create mode 100644 docs/_sources/TIES_MD.eng_scripts.openmm_sub.rst.txt diff --git a/TIES_MD/TIES.py b/TIES_MD/TIES.py index 0a3d302..4915795 100644 --- a/TIES_MD/TIES.py +++ b/TIES_MD/TIES.py @@ -52,7 +52,7 @@ class TIES(object): :param exp_name: str, for the names of experiment i.e. complex -> complex.pdb/complex.prmtop :param run_type: str, flag to say if we should run dynamics or not :param devices: list, list of ints for which cuda devices to use - :param node_id: float, id denoting what replica of this simulation this execution of TIES_MD should run + :param rep_id: float, id denoting what replica of this simulation this execution of TIES_MD should run :param windows_mask: list containing ints for start and end range of windows to be run :param periodic: boolean determines if the simulation will be periodic :param lam: Lambda class, allow passing of custom lambda schedule @@ -60,10 +60,11 @@ class TIES(object): :param **kwargs: dict, containing setting from config file ''' - def __init__(self, cwd, exp_name, run_type='class', devices=None, node_id=None, windows_mask=None, periodic=True, - lam=None, platform='CUDA', **kwargs): + def __init__(self, cwd, exp_name='complex', run_type='class', devices=None, rep_id=None, windows_mask=None, + periodic=True, lam=None, platform='CUDA', **kwargs): nice_print('TIES') - if run_type == 'class' and kwargs is None: + + if run_type == 'class' and kwargs == {}: kwargs = read_config(os.path.join(cwd, 'TIES.cfg')) print('If you use this software please cite:') print('Wade, A.D., et al. 2022. Alchemical Free Energy Estimators and Molecular Dynamics Engines:' @@ -77,9 +78,7 @@ def __init__(self, cwd, exp_name, run_type='class', devices=None, node_id=None, #check all the config file args we need are present args_list = ['engine', 'temperature', 'pressure', 'sampling_per_window', 'equili_per_window', 'methods', 'total_reps', 'split_run', 'elec_edges', 'ster_edges', 'global_lambdas', 'constraint_file', - 'constraint_column', 'input_type', 'box_type'] - - optional_args = ['cell_basis_vec1', 'cell_basis_vec2', 'cell_basis_vec3', 'edge_length'] + 'constraint_column', 'input_type', 'cell_basis_vec1', 'cell_basis_vec2', 'cell_basis_vec3'] # check we have all required arguments for argument in args_list: @@ -88,14 +87,14 @@ def __init__(self, cwd, exp_name, run_type='class', devices=None, node_id=None, # check we have no unexpected arguments for argument in kwargs.keys(): - if argument not in args_list+optional_args: + if argument not in args_list: raise ValueError('Argument {} not supported for this engine or at all.' ' Please remove from the TIES.cfg.'.format(argument)) - self.all_args = args_list+optional_args - + self.all_args = args_list #engine must be delt with first to set namd_version which other options may need. - api_sensitive = ['engine', 'split_run', 'elec_edges', 'ster_edges', 'global_lambdas', 'box_type'] + api_sensitive = ['engine', 'split_run', 'elec_edges', 'ster_edges', 'global_lambdas', + 'cell_basis_vec1', 'cell_basis_vec2', 'cell_basis_vec3'] #Iterate over our args_dict to set attributes of class to values in dict print('Read arguments from file:') @@ -108,11 +107,6 @@ def __init__(self, cwd, exp_name, run_type='class', devices=None, node_id=None, setattr(self, full_k, v) print('') - #set any nonexistant optional args to None - for option in optional_args: - if option not in kwargs.keys(): - setattr(self, option, None) - #set any attr the api needs self._split_run = bool(int(self._split_run)) if self._split_run: @@ -144,6 +138,7 @@ def __init__(self, cwd, exp_name, run_type='class', devices=None, node_id=None, self.run_type = run_type self.methods = self.methods.split(',') + self.basis_vectors = [[], [], []] self.total_reps = int(self.total_reps) self.reps_per_exec = int(self.reps_per_exec) @@ -168,14 +163,15 @@ def __init__(self, cwd, exp_name, run_type='class', devices=None, node_id=None, self.platform = platform self.cwd = cwd - self.node_id = node_id + self.rep_id = rep_id self.periodic = periodic #run through api logic for prop in api_sensitive: setattr(self, prop, self.__getattribute__('_'+prop)) - self.sub_header, self.sub_run_line = None, None + self.pre_run_line, self.run_line = None, None + self.sub_run_line, self.sub_header = None, None # build schedule for lambdas do this last so passed lam can overwrite if desired print('Lambda schedule:') @@ -209,51 +205,76 @@ def __init__(self, cwd, exp_name, run_type='class', devices=None, node_id=None, nice_print('END') @property - def box_type(self): + def cell_basis_vec1(self): + """ + What is the 1st basis vector of the simulation cell + + :return: list of floats for x, y, z components of vector + """ + return self._cell_basis_vec1 + + @cell_basis_vec1.setter + def cell_basis_vec1(self, value): + ''' + Setter for cell_basis_vec1 + :param value: list for x, y, z of box, updates basis_vectors + + :return: None + ''' + if isinstance(value, str): + self._cell_basis_vec1 = [float(x) for x in value.split(',')] + else: + assert len(value) == 3 + self._cell_basis_vec1 = [x for x in value] + self.basis_vectors[0] = Vec3(*self._cell_basis_vec1) * unit.angstrom + + @property + def cell_basis_vec2(self): """ - What type of simulation box is being used (cube, truncatedOctahedron, rhombicDodecahedron or na for manual) + What is the 2nd basis vector of the simulation cell - :return: string for box type. + :return: list of floats for x, y, z components of vector """ - return self._box_type + return self._cell_basis_vec2 - @box_type.setter - def box_type(self, value): + @cell_basis_vec2.setter + def cell_basis_vec2(self, value): ''' - Setting function for box type, will build manual box from cell basis vectors if user passes box type na - :param value: str, for what box type we want + Setter for cell_basis_vec2 + :param value: list for x, y, z of box, updates basis_vectors :return: None ''' - self._box_type = value - if self._box_type == 'na': - vecs = ['cell_basis_vec1', 'cell_basis_vec2', 'cell_basis_vec3'] - for vec in vecs: - if self.__getattribute__(vec) is None: - raise ValueError( - 'If box type is unspecified as na in TIES.cfg the box vectors must be manually specified.' - ' Please add options {} {} {} to TIES.cfg'.format(*vecs)) - self.cell_basis_vec1 = [float(x) for x in self.cell_basis_vec1.split(',')] - self.cell_basis_vec2 = [float(x) for x in self.cell_basis_vec2.split(',')] - self.cell_basis_vec3 = [float(x) for x in self.cell_basis_vec3.split(',')] - - self.basis_vectors = [Vec3(*self.cell_basis_vec1) * unit.angstrom, - Vec3(*self.cell_basis_vec2) * unit.angstrom, - Vec3(*self.cell_basis_vec3) * unit.angstrom] + if isinstance(value, str): + self._cell_basis_vec2 = [float(x) for x in value.split(',')] + else: + assert len(value) == 3 + self._cell_basis_vec2 = [x for x in value] + self.basis_vectors[1] = Vec3(*self._cell_basis_vec2) * unit.angstrom + @property + def cell_basis_vec3(self): + """ + What is the 3rd basis vector of the simulation cell + + :return: list of floats for x, y, z components of vector + """ + return self._cell_basis_vec3 + + @cell_basis_vec3.setter + def cell_basis_vec3(self, value): + ''' + Setter for cell_basis_vec3 + :param value: list for x, y, z of box, updates basis_vectors + + :return: None + ''' + if isinstance(value, str): + self._cell_basis_vec3 = [float(x) for x in value.split(',')] else: - print('Getting box vectors for {} box. Ignoring cell basis vectors'.format(self.box_type)) - if self.edge_length is None: - raise ValueError('Must provide edge_length option in TIES.cfg to compute box vectors. If custom box vectors' - ' are desired set box_type = na in TIES.cfg.') - self.edge_length = self.edge_length.split('*unit.') - self.edge_length = unit.Quantity(float(self.edge_length[0]), getattr(unit, self.edge_length[1])) - self.edge_length = self.edge_length.in_units_of(unit.angstrom) / unit.angstrom - self.basis_vectors = get_box_vectors(self.box_type, self.edge_length) - - self.cell_basis_vec1 = [float(x) for x in self.basis_vectors[0] / unit.angstrom] - self.cell_basis_vec2 = [float(x) for x in self.basis_vectors[1] / unit.angstrom] - self.cell_basis_vec3 = [float(x) for x in self.basis_vectors[2] / unit.angstrom] + assert len(value) == 3 + self._cell_basis_vec3 = [x for x in value] + self.basis_vectors[2] = Vec3(*self._cell_basis_vec3) * unit.angstrom @property def engine(self): @@ -386,6 +407,8 @@ def split_run(self, value): if self._split_run: self.reps_per_exec = 1 else: + if self.rep_id is not None: + raise ValueError('Split run is off but rep_id has a set value of {}. Unset rep_id'.format(self.rep_id)) self.reps_per_exec = self.total_reps def update_cfg(self): @@ -417,8 +440,6 @@ def update_cfg(self): cons_file='na' if self.constraint_file is None else self.constraint_file, constraint_column='na' if self.constraint_column is None else self.constraint_column, input_type=self.input_type, - box_type='na' if self.box_type is None else self.box_type, - edge_length='na' if self.edge_length is None else self.edge_length, **solv_oct_box) with open(os.path.join(self.cwd, 'TIES.cfg'), 'w') as f: f.write(ties_script) @@ -430,12 +451,14 @@ def setup(self): :return: None ''' - sub_header, sub_run_line = get_header_and_run(self.engine, self.namd_version, self.split_run, - self.num_windows, self.total_reps, self.exp_name, self.devices) + sub_header, sub_run_line = get_header_and_run(self.engine, self.namd_version, self.split_run,self.num_windows, + self.total_reps, self.exp_name, self.devices) if self.sub_header is None: self.sub_header = sub_header - if self.sub_run_line is None: + if self.run_line is None and self.pre_run_line is None: self.sub_run_line = sub_run_line + else: + self.sub_run_line = str(self.pre_run_line) + str(self.run_line) if self.engine == 'namd': folders = ['equilibration', 'simulation'] @@ -511,7 +534,7 @@ def get_options(self): :return: None ''' - other_user_options = ['sub_header', 'sub_run_line'] + other_user_options = ['sub_header', 'pre_run_line', 'run_line'] for arg in self.all_args+other_user_options: print('{}: {}'.format(arg, self.__getattribute__(arg))) @@ -522,8 +545,8 @@ def run(self): :return: None ''' if self.split_run: - if self.node_id is None: - raise ValueError('For a split run set --node_id on the command line, or pass node_id as an ' + if self.rep_id is None: + raise ValueError('For a split run set --rep_id on the command line, or pass rep_id as an ' 'argument to the TIES() class.') system = AlchSys(self.cwd, self.exp_name, self.temperature, self.pressure, self.constraint_file, @@ -531,7 +554,7 @@ def run(self): self.periodic, self.platform) if self.split_run: - system_ids = [System_ID(self.devices[0], self.node_id)] + system_ids = [System_ID(self.devices[0], self.rep_id)] else: system_ids = [System_ID(self.devices[i % len(self.devices)], i) for i in range(self.total_reps)] @@ -539,7 +562,7 @@ def run(self): for rep in system_ids: for lam in self.lam.str_lams: lam_dir = 'LAMBDA_{}'.format(lam) - path = os.path.join(self.cwd, lam_dir, 'rep{}'.format(rep.node_id)) + path = os.path.join(self.cwd, lam_dir, 'rep{}'.format(rep.rep_id)) if not os.path.exists(path): raise ValueError('Output dir {} missing.'.format(path)) @@ -1073,7 +1096,7 @@ def get_header_and_run(engine, namd_version, split_run, num_windows, reps, exp_n #BSUB -e eLIGPAIR.%J""".format(int(np.ceil(num_jobs/gpus_per_node))) sub_run_line = 'jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 TIES_MD --config_file=$ties_dir/TIES.cfg' \ ' --exp_name={} --windows_mask=$lambda,$(expr $lambda + 1)' \ - ' --node_id=$i > $ties_dir/$lambda_$i.out&'.format(exp_name) + ' --rep_id=$i > $ties_dir/$lambda_$i.out&'.format(exp_name) else: #summit specific gpus_per_node = 6 diff --git a/TIES_MD/alch.py b/TIES_MD/alch.py index 2d2dc4e..13238db 100644 --- a/TIES_MD/alch.py +++ b/TIES_MD/alch.py @@ -608,12 +608,12 @@ class System_ID(object): what number repeat this simulation is out of some total number of repeats. :param device_id: int, for OpenMM GPU device id - :param node_id: str, id number denoting which replica this is + :param rep_id: str, id number denoting which replica this is ''' - def __init__(self, device_id, node_id): + def __init__(self, device_id, rep_id): self.device_id = str(device_id) - self.node_id = str(node_id) + self.rep_id = str(rep_id) def minimization(NVT, constraint): @@ -787,7 +787,7 @@ def simulate_system(ids, alch_sys, Lam, mask, cwd, niter, equili_steps, steps_pe beta = 1.0 / (unit.BOLTZMANN_CONSTANT_kB * alch_sys.temp) print('Running simulation on device {}'.format(ids.device_id)) - print('Running replica {} of windows {}'.format(ids.node_id, list(range(mask[0], mask[1])))) + print('Running replica {} of windows {}'.format(ids.rep_id, list(range(mask[0], mask[1])))) nlambda = len(Lam.schedule[0]) nstates = len(Lam.schedule[mask[0]:mask[1]]) @@ -850,7 +850,7 @@ def simulate_system(ids, alch_sys, Lam, mask, cwd, niter, equili_steps, steps_pe #If velocities are randmozied is this still equilibriated? NPT['sim'].context.setVelocitiesToTemperature(alch_sys.temp) else: - equili_file = os.path.join(cwd, 'LAMBDA_{}'.format(Lam.str_lams[i+mask[0]]), 'rep{}'.format(ids.node_id), + equili_file = os.path.join(cwd, 'LAMBDA_{}'.format(Lam.str_lams[i+mask[0]]), 'rep{}'.format(ids.rep_id), 'equilibration', 'state') equili_state_f = equili_file+'_NPT.xml' @@ -867,7 +867,7 @@ def simulate_system(ids, alch_sys, Lam, mask, cwd, niter, equili_steps, steps_pe NPT['sim'].loadState(equili_state_f) #add reporter to simulation - log = os.path.join(cwd, 'LAMBDA_{}'.format(Lam.str_lams[i+mask[0]]), 'rep{}'.format(ids.node_id), 'simulation', + log = os.path.join(cwd, 'LAMBDA_{}'.format(Lam.str_lams[i+mask[0]]), 'rep{}'.format(ids.rep_id), 'simulation', 'log') add_simulation_reporters(NPT['sim'], total_sim_NPT, save=log) @@ -875,7 +875,7 @@ def simulate_system(ids, alch_sys, Lam, mask, cwd, niter, equili_steps, steps_pe for iteration in range(niter): print('Propagating iteration {}/{} in window {}/{} for replica {}'.format(iteration + 1, niter, i+mask[0]+1, - all_states, ids.node_id)) + all_states, ids.rep_id)) # propogate system in current state NPT['sim'].step(steps_per_iter) @@ -904,13 +904,13 @@ def simulate_system(ids, alch_sys, Lam, mask, cwd, niter, equili_steps, steps_pe print('Saving results') for i, j in enumerate(Lam.str_lams[mask[0]: mask[1]]): if 'TI' in alch_sys.methods: - file = os.path.join(cwd, 'LAMBDA_{}'.format(j), 'rep{}'.format(ids.node_id), 'results', + file = os.path.join(cwd, 'LAMBDA_{}'.format(j), 'rep{}'.format(ids.rep_id), 'results', 'TI.npy') #print('Saving {} result to disk'.format(file)) np.save(file, grads[i, :, :]) if 'FEP' in alch_sys.methods: - file = os.path.join(cwd, 'LAMBDA_{}'.format(j), 'rep{}'.format(ids.node_id), 'results', + file = os.path.join(cwd, 'LAMBDA_{}'.format(j), 'rep{}'.format(ids.rep_id), 'results', 'FEP.npy') #print('Saving {} result to disk'.format(file)) np.save(file, u_kln[i, :, :]) diff --git a/TIES_MD/cli.py b/TIES_MD/cli.py index c0d1f48..bf3970b 100644 --- a/TIES_MD/cli.py +++ b/TIES_MD/cli.py @@ -31,7 +31,7 @@ TIES_MD Command line input should be used as follows... Usage: -TIES_MD [--devices=LIST] [--run_type=STRING] [--config_file=STRING] [--node_id=INT] [--windows_mask=LIST] [--exp_name=STR]... +TIES_MD [--devices=LIST] [--run_type=STRING] [--config_file=STRING] [--rep_id=INT] [--windows_mask=LIST] [--exp_name=STR]... """ def main(argv=None): @@ -88,13 +88,13 @@ def main(argv=None): else: devices = None - if args['--node_id']: + if args['--rep_id']: if not_openmm: - raise ValueError(not_openmm_msg.format('--node_id')) - node_id = args['--node_id'] - node_id = int(node_id) + raise ValueError(not_openmm_msg.format('--rep_id')) + rep_id = args['--rep_id'] + rep_id = int(rep_id) else: - node_id = None + rep_id = None print(msg.format('node id string', 'None')) if args['--windows_mask']: @@ -109,5 +109,5 @@ def main(argv=None): # removed this as an option there is no need to expose it for now periodic=True - TIES(input_folder, exp_name, run_type, devices, node_id, mask, periodic, **args_dict) + TIES(input_folder, exp_name, run_type, devices, rep_id, mask, periodic, **args_dict) diff --git a/TIES_MD/doc/source/HPC_submissions.rst b/TIES_MD/doc/source/HPC_submissions.rst index 5550b9d..9f9e3e2 100644 --- a/TIES_MD/doc/source/HPC_submissions.rst +++ b/TIES_MD/doc/source/HPC_submissions.rst @@ -4,7 +4,7 @@ HPC Submission scripts Here we provide some example submission scripts for various HPC systems. ``TIES MD`` will attempt to automatically write sensible submission scripts for ``NAMD2`` targeting `ARCHER 2 `_ and for ``OpenMM`` targeting `Summit `_. In general the user can make there own script for whichever HPC or cluster they prefer. To aid with writing general -scripts ``TIES MD`` exposes 2 options in the :ref:`API` called ``sub_header`` and ``sub_run_line``. The strings passed +scripts ``TIES MD`` exposes 3 options in the :ref:`API` called ``sub_header``, ``pre_run_line`` and ``run_line``. The strings passed with these options will be injected into a general template for a ``NAMD2`` or ``OpenMM`` submission. All generated submission scripts are written to the base ``TIES MD`` directory as sub.sh. An example of this is provided in here :ref:`Running`. @@ -91,12 +91,12 @@ Here we provide an example of ``TIES MD`` running with ``OpenMM`` on `Summit $ties_dir/0.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id="0" > $ties_dir/1.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id="0" > $ties_dir/2.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id="0" > $ties_dir/3.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id="0" > $ties_dir/4.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id="0" > $ties_dir/5.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=0 > $ties_dir/0.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=0 > $ties_dir/1.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=0 > $ties_dir/2.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=0 > $ties_dir/3.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=0 > $ties_dir/4.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=0 > $ties_dir/5.out& wait NAMD 3 diff --git a/TIES_MD/doc/source/binding_free_energies.rst b/TIES_MD/doc/source/binding_free_energies.rst index 120453d..7725f25 100644 --- a/TIES_MD/doc/source/binding_free_energies.rst +++ b/TIES_MD/doc/source/binding_free_energies.rst @@ -35,9 +35,7 @@ hybrid ligands but also setup binding free energy calculations for the TIES prot simulations as follows:: #ties20 imports - from ties import Pair, Ligand - from ties import Config - from ties.protein import Protein + from ties import Pair, Config, Ligand, Protein #Setting for system building config = Config() @@ -68,7 +66,7 @@ simulations as follows:: #now declare protein config.protein = 'receptor.pdb' config.protein_ff = 'leaprc.protein.ff14SB' - protein = Protein(config.protein, config) + protein = Protein(config) #re-prepare simulation input, now protein is declared and passed as argument com simulation is built hybrid.prepare_inputs(protein=protein) @@ -86,12 +84,12 @@ At this point we have prepped a simulation of one thermodynamic cycle with two l set these legs up in the directories ``ties/ties-ligandA-ligandB/(lig/com)`` and these map to the ``system/ligand/thermodynamic_leg/`` directory structure that was discussed in the :ref:`Tutorial` section. In ``ties/ties-ligandA-ligandB/(lig/com)`` there will be the ``build`` directory and ``TIES.cfg`` files as also seen in -the :ref:`Tutorial`. The settings in ``TIES.cfg`` will be good for a default simulation but in general we may wish to +the :ref:`Tutorial`. The automatic settings in ``TIES.cfg`` will be good for a default simulation but in general we may wish to change these quickly and or write submission scripts for these simulations. To do this we can use the ``TIES_MD`` API as follows:: #tiesMD imports - from TIES_MD import TIES, cli + from TIES_MD import TIES import os #iterate over both legs of BFE calculation @@ -100,11 +98,10 @@ follows:: ties_dir = os.path.join(os.getcwd(), 'ties', 'ties-ligandA-ligandB', thermo_leg) #read the default TIES.cfg to initialize - args_dict = cli.read_config(os.path.join(ties_dir, 'TIES.cfg')) - md = TIES.TIES(cwd=ties_dir, exp_name='complex', **args_dict) + md = TIES(ties_dir) #change some settings in TIES.cfg - md.reps_per_exec = 1 + md.split_run = 1 md.total_reps = 6 #inspect all the options we can configure and change @@ -120,41 +117,20 @@ follows:: #BSUB -o oLIGPAIR.%J #BSUB -e eLIGPAIR.%J""" - #run line in submission scripts can also be changed - md.sub_run_line = 'jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i > $ties_dir/$lambda$i.out&' + #Setting HPC specific elements of run line (example here is Summit) + md.pre_run_line = 'jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ' + + #Setting ties_md part of run line + md.run_line = 'ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i' #setup the new simulation with changed options (also writes submission script) md.setup() - #must make sure the TIES.cfg on disk is updated with new settings. - md.update_cfg() - -This changes the TIES.cfg options ``reps_per_exec`` to 1 and ``total_reps`` to 6. To see all configurable options the user +This changes the TIES.cfg options ``split_run`` to 1 (True) and ``total_reps`` to 6. To see all configurable options the user can run ``md.get_options()`` as shown above. To generate a general submission script we are modifying the -``sub_header`` and ``sub_run_line`` internal options and these set what ``TIES_MD`` writes into the submission script. The -settings above yield the following script:: - - #!/bin/bash - #Example script for Summit OpenMM - #BSUB -P CHM155_001 - #BSUB -W 120 - #BSUB -nnodes 13 - #BSUB -alloc_flags "gpudefault smt1" - #BSUB -J LIGPAIR - #BSUB -o oLIGPAIR.%J - #BSUB -e eLIGPAIR.%J - - export ties_dir="ties/ties-ligandA-ligandB/lig" - cd $ties_dir - - for lambda in 0 1 2 3 4 5 6 7 8 9 10 11 12; do - for i in {0..5}; do - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i > $ties_dir/$lambda$i.out& - done - done - wait - -These scripts can be summited to the HPC scheduler, once they finish the last step to get a :math:`{ΔΔ G}` is analysis. +``sub_header``, ``pre_run_line`` and ``run_line`` internal options and these set what ``TIES_MD`` writes into the +submission script, for more details see :ref:`API`. These scripts can be summited to the HPC scheduler, once they +finish the last step to get a :math:`{ΔΔ G}` is analysis. BFE Analysis ------------ diff --git a/TIES_MD/doc/source/parallelization.rst b/TIES_MD/doc/source/parallelization.rst index 4e650ac..0c98a1c 100644 --- a/TIES_MD/doc/source/parallelization.rst +++ b/TIES_MD/doc/source/parallelization.rst @@ -27,15 +27,13 @@ If we wanted to parallelize 3 repeats over 3 GPUs on one node we would run:: Each ``CUDA`` device will then run 8 windows of the 1 replica. Equally ths could be spit into to separate runs of ``TIES MD`` masked to only see one device:: - ties_md --exp_name=sys_solv --devices=0 --node_id=0 - ties_md --exp_name=sys_solv --devices=1 --node_id=1 - ties_md --exp_name=sys_solv --devices=3 --node_id=1 + ties_md --exp_name=sys_solv --devices=0 --rep_id=0& + ties_md --exp_name=sys_solv --devices=1 --rep_id=1& + ties_md --exp_name=sys_solv --devices=2 --rep_id=2& -To run in this configuration the options ``total_reps=3`` and ``reps_per_exec=1`` are set in TIES.cfg to tell ``TIES MD`` that -there are a total of 3 replicas being run and that each execution of ``TIES MD`` should run only one. Also note we have set -``--node_id`` to some different values for otherwise identical run lines and this ensures these parallel runs write output -to unique locations. ``--node_id`` only needs to be set when identical replicas of a simulation are run in separate executions -of ``TIES MD``. +To run in this configuration the options ``total_reps=3`` and ``split_run=1`` are set in TIES.cfg to tell ``TIES MD`` that +there are a total of 3 replicas being run and that each execution of ``TIES MD`` should run only one. ``--rep_id`` +determines which replica each instance will run. ``--rep_id`` only needs to be set when using ``split_run=1``. If we need further parallelization over alchemical windows we can use the command line option ``--windows_mask`` this option takes a ``Python`` range (start inclusive and end exclusive) of the windows which that instance of @@ -50,27 +48,27 @@ this option takes a ``Python`` range (start inclusive and end exclusive) of the ties_md --exp_name=sys_solv --windows_mask=6,7 --devices=6& ties_md --exp_name=sys_solv --windows_mask=7,8 --devices=7& -Again using the configuration options ``total_reps=3`` and ``reps_per_exec=1`` the above runs 1 replica of each alchemical +Now sing the configuration options ``total_reps=3`` and ``split_run=0`` the above runs 3 replica of each alchemical window on a different GPU. For maximum parallelism we combine parallelizing over replicas and alchemical windows. For clarity we now consider the same example as above but now with 6 alchemical windows, 2 replica simulations and one simulation per GPU, so in -TIES.cfg ``global_lambdas=0.0, 0.1, 0.4, 0.6, 0.9, 1.0``, ``total_reps=2`` and ``reps_per_exec=1``. To scale over multiple node +TIES.cfg ``global_lambdas=0.0, 0.1, 0.4, 0.6, 0.9, 1.0``, ``total_reps=2`` and ``split_run=1``. To scale over multiple node we could use the resource allocator of the HPC for example `jsrun `_ on `Summit `_. would allow us to run with 2 replicas of 6 windows as follows:: - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=1& Note here we do not set ``--devices`` as the masking of GPUs is handled by the resource allocator, this is not the general case. If a resource allocator is not available an alternative method to run multiple simulations across nodes is to use a message passing interface @@ -82,9 +80,9 @@ TIES-NAMD --------- The parallelization of TIES in ``NAMD2`` follows the same ideas as ``OpenMM`` above. We want to run independent simulations -for all alchemical window and replica simulations. To achieve parallelization over replica simulations there are two options. -If in TIES.cfg ``total_reps==reps_per_exec`` the submission script that ``TIES_MD`` writes will use the ``NAMD`` option -``+replicas X`` this makes each ``NAMD`` run ``X`` replicas and the run lines in sub.sh will look something like:: +for all alchemical window and replica simulations. If in TIES.cfg ``split_run=0`` the submission script that +``TIES_MD`` writes will use the ``NAMD`` option ``+replicas X`` this makes each ``NAMD`` run ``X`` replicas and the +run lines in sub.sh will look something like:: for stage in {0..3}; do for lambda in 0.00 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1.0; do @@ -94,7 +92,7 @@ If in TIES.cfg ``total_reps==reps_per_exec`` the submission script that ``TIES_M wait done -Alternatively if ``total_reps=!reps_per_exec`` with ``reps_per_exec=1`` the run lines will look like:: +Alternatively if ``split_run=1`` the run lines will look like:: for stage in {0..3}; do for lambda in 0.00 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1.0; do @@ -112,6 +110,6 @@ we have tested up to ``+replicas 135`` on `ARCHER 2 examples the parallelism over alchemical windows is achieved in the loop over lambda. Using ``NAMD3`` parallelization can be achieved like so (:ref:`NAMD 3`). ``NAMD`` in general has extensive options to provision -hardware and achieve parallelism, what have outlined here is not exhaustive and we would suggest consulting the `documentation `_ -for more a more comprehensive information. +hardware and achieve parallelism, what have outlined here is not exhaustive and we would suggest consulting +the `documentation `_ for more a more comprehensive information. diff --git a/TIES_MD/doc/source/tutorial.rst b/TIES_MD/doc/source/tutorial.rst index 90f3a0d..067a124 100644 --- a/TIES_MD/doc/source/tutorial.rst +++ b/TIES_MD/doc/source/tutorial.rst @@ -4,7 +4,7 @@ Tutorial Getting started --------------- -``TIES MD`` is a package which is intended to be used on the command line and submitted to a HPC system. In this document +``TIES MD`` is a package for the preparation, running and analysis of binding free energy calculations. In this document we will outline what commands should be run to calculate binding free energies. To start with any free energy calculations we must first outline what are the expected input files to the ``TIES MD`` program. @@ -13,22 +13,25 @@ In this tutorial we will refer to example systems which can be found in the git clone https://github.com/UCL-CCS/TIES_MD.git -and navigating to ``TIES_MD/TIES_MD/examples/`` +and found by navigating to ``TIES_MD/TIES_MD/examples/`` Input ------ ``TIES MD`` expects a number of input files, these are two essential files, e.g. ``complex.pdb`` and ``complex.prmtop``. These files contain information about the position, topology and parameters for the system. Currently we only support -the ``AMBER`` based format ``prmtop`` but provide a utility to `build `_ them online. ``complex.pdb`` also -contains the alchemical indexes denoting which atoms will appear and disappear during the simulation. There is also -an optional input file, ``constraints.pdb``, and this contains indexes denoting which atoms, if any, are constrained -during the pre-production simulation. This input should all be placed in a directory named build located -where the user wishes to run the simulation. Examples of these files can be found `here `_. +the ``AMBER`` based format ``prmtop``. ``complex.pdb`` also contains the alchemical indexes denoting which atoms will +appear and disappear during the simulation. There is also an optional input file, ``constraints.pdb``, and this +contains indexes denoting which atoms, if any, are constrained during the pre-production simulation. This input should +all be placed in a directory named build located where the user wishes to run the simulation. Examples of these files +can be found `here `_. + Please use a directory structure like ``study/system/ligand/thermodynamic_leg/build`` this will allow the analysis scripts to understand the structure and perform analysis automatically. ``study``, ``system``, ``ligand`` and ``thermodynamic_leg`` can be renamed to anything but the name of the ``build`` directory is fixed. If input for novel ligand transformations is desired the -`TIES20 `_ program can be used to generate all required inputs. +`TIES20 `_ program can be used to generate all required inputs. ``TIES 20`` can be +used via our online `service `_ or locally and details of how to use this will be provided +later in these documents. The only non standard input to ``TIES MD`` is a configuration file (``TIES.cfg``) which specifies options which the user my wish to occasionally change. This file must be placed alongside the build directory. Here we provide an example of such a file:: @@ -61,8 +64,8 @@ occasionally change. This file must be placed alongside the build directory. Her #How many total replicas of each window are run (we recommend at least 5). total_reps = 5 - #How many replicas should this evocation of TIES_MD run, used for parallelisation - reps_per_exec = 5 + #Boolean for if we will split all replicas into separate runs. (1 for maximum parallelism) + split_run = 0 #Where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing. elec_edges = 0.5, 1.0 @@ -79,13 +82,7 @@ occasionally change. This file must be placed alongside the build directory. Her #Which column in pdb are constraints provided valid options are occupancy/beta_factor. (beta_factor is standard) constraint_column = beta_factor - #What type of simulation cell is used valid options are cube, truncatedOctahedron, rhombicDodecahedron or na for manual. - box_type = na - - #The edge length used to compute the cube or truncatedOctahedron or rhombicDodecahedron box vectors - edge_length = 10*unit.nanometer - - #If box_type is na the manually specify box vectors of this simulation, unit Angstrom. + #Manually specify box vectors of this simulation, unit Angstrom. cell_basis_vec1 = 50, 0.0, 0.0 cell_basis_vec2 = 0.0, 50, 0.0 cell_basis_vec3 = 0.0, 0.0, 50 @@ -93,9 +90,9 @@ occasionally change. This file must be placed alongside the build directory. Her #What input type is provided, only AMBER supported. input_type = AMBER -``total_reps`` and ``reps_per_exec`` are options which can be used to achieve simple parallelism of the simulations. +``total_reps`` and ``split_run`` are options which can be used to achieve simple parallelism of the simulations. For example if you wished to run a total of 5 simulations on 5 GPUs in parallel one could use the settings -``total_reps = 5`` and ``reps_per_exec = 1``. See the :ref:`Parallelization` section for more details of how to +``total_reps = 5`` and ``split_run = 1``. See the :ref:`Parallelization` section for more details of how to achieve this. The following image shows ``TIES_MD`` applied to one alchemical transformation. @@ -113,11 +110,10 @@ energy functions of the system and for more information these settings please se Note the option ``constraint_column`` which determines if the constraint indexes will be read from the temperature factor or occupancy column of the constraints PDB. The alchemical indexes are always be read from the temperature factor column -in the main PDB ``complex.pdb``. The ``edge_length`` option can be found in the ``leap.log`` file created during system -preparation preformed by the users or ``TIES20``. ``TIES20`` will populate a TIES.cfg automatically with the correct box size. +in the main PDB ``complex.pdb``. ``TIES20`` will populate a TIES.cfg automatically with the correct box size. Typically a constraint file may be used during preproduction of simulations involving proteins but possibly not a small -drug like molecule in only solvent. It will be show later in the Binding Free Energy Calculations section when and +drug like molecule in only solvent. It will be shown later in the :ref:`Binding Free Energy Tutorial` section when and why we use a constraints file. Command Line @@ -146,7 +142,7 @@ values are as follows:: A comma separated list of integers which tells TIES OpenMM which GPUs to run on. If multiple GPUs are specified then TIES OpenMM will parallelize requested replicas over the available GPUs. - [--node_id=0] + [--rep_id=0] An int which will be used to generate the names of output files. Should be used if many independent replicas of the same simulation are run on different nodes to ensure output is writen to unique location. @@ -154,9 +150,6 @@ values are as follows:: Comma separated list of integers. These specify what alchemical windows the current instance of TIES OpenMM should run. By default all windows will be run. - [--periodic=1] - A value of 1 sets the simulation box as periodic a value of 0 sets the simulation box as non-periodic. - Simulation Preparation ---------------------- @@ -199,7 +192,7 @@ to ``1``, there is therefore 6x1 = 6 total simulations to perform. If a HPC subm ties_md --exp_name=sys_solv --windows_mask=4,5 --devices=4& ties_md --exp_name=sys_solv --windows_mask=5,6 --devices=5& -There are a lot of options for how these ``OpenMM`` calcualtions can be structured and parallelized with ``TIES_MD`` see our +There are a lot of options for how these ``OpenMM`` calculations can be structured and parallelized with ``TIES_MD`` see our :ref:`Parallelization` page for more information on this. For a ``NAMD`` calculation if the submission script requested 6 CPU nodes each with 128 cores the run lines in the submission script might look like:: diff --git a/TIES_MD/eng_scripts/cfg_scripts/TIES.cfg b/TIES_MD/eng_scripts/cfg_scripts/TIES.cfg index b7cf53b..ad0d2ec 100644 --- a/TIES_MD/eng_scripts/cfg_scripts/TIES.cfg +++ b/TIES_MD/eng_scripts/cfg_scripts/TIES.cfg @@ -46,11 +46,6 @@ constraint_column = {constraint_column} #AMBER only supported input. input_type = {input_type} -#If cell basis vectors are given then below options are ignored -#What type of simulation cell is used valid options are cube, truncatedOctahedron, rhombicDodecahedron or na for manual. -box_type = {box_type} -edge_length = {edge_length} - #simulation cell cell_basis_vec1 = {cbv1}, {cbv2}, {cbv3} cell_basis_vec2 = {cbv4}, {cbv5}, {cbv6} diff --git a/TIES_MD/examples/analysis/OpenMM/FEP/ethane/zero_sum/leg1/overlap0.npy b/TIES_MD/examples/analysis/OpenMM/FEP/ethane/zero_sum/leg1/overlap0.npy index 699a0610792ffe12213273f82cc5b5dfa9b56a7c..1c05e12fa1d92cdc49be9071c5a6351c9b8a6d1f 100644 GIT binary patch delta 176 zcmV;h08jsb1%L&Rm=V2o!MWn@zdx8@@`}o;x<3Swsec)UTqkvms<}UaDsw1*+_*oq z_D3AZR=7XClR*I=0j-l^0XGS)If<~nmcc)4lc5105d`I;e`LzIKQD|-{>AgSKZcXh z0T(GLQt>$J8N)v;g8{~gdc!}CC*09*q{BbL7kDBPf4D#VX3FO2Xt+OslMwx)r;KSH(Y*r%`kO delta 176 zcmV;h08jsb1%L&Rm=V5p!MWn@zdx8@@`}o;x<3Vxsec)TTqkvms<}UZDsw1*+_*oq z_D3AZR=7XDlR*I=0j!f@0XGS(If<~nmcc)3lc5105e4OAgSKZTRg z0T(GKQt>$J8N)v;g8{~gdc!}DC*09*q{BbL7kDBPf4D#VX3FO2Xt+OrlMwx)r;KSH(Y*2~l$Z diff --git a/TIES_MD/examples/analysis/OpenMM/FEP/ethane/zero_sum/leg1/overlap1.npy b/TIES_MD/examples/analysis/OpenMM/FEP/ethane/zero_sum/leg1/overlap1.npy index c8af17f33f052301c0b4ca0e583f144fa69d1e27..1ed6c95b18c4aedeecd801ab82ebe0d4b23c15bb 100644 GIT binary patch delta 171 zcmZo*ZD5_y!FY0Fr@Er>wl(FyrtGqR7w{uw(T`pBCwp6NvXmdT-;@#hYPe9s&RW delta 67 zcmV-J0KETz1%L&R@Bz1x@h2IuxpOpG+Q2{6#<_k%BfmdVYdOdDn!G<`lQ97w0kD%% Z0ha-Ilj#8;3AebtpwybXKV*{;0&f=#9s>XX diff --git a/TIES_MD/examples/analysis/OpenMM/TI/ethane/zero_sum/leg1/dUdlam.png b/TIES_MD/examples/analysis/OpenMM/TI/ethane/zero_sum/leg1/dUdlam.png index 5e1777277b04e5ccf0389a04d4b8211df6b20164..9f15bc768a5b2dea6ffdbf61d3c2023429e9e956 100644 GIT binary patch literal 96771 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 z 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%0Dbee4`xJk=L~#qdg^;DKdRYmNLS0K6R31s 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

xBnl{GYqi3&3>7EYdps^rSG8-FmOBa?` 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 N+SQ(`M6TP9{R2Gad29dx diff --git a/TIES_MD/examples/ethane/zero_sum/leg1/TIES.cfg b/TIES_MD/examples/ethane/zero_sum/leg1/TIES.cfg index c1fe13f..738a39c 100644 --- a/TIES_MD/examples/ethane/zero_sum/leg1/TIES.cfg +++ b/TIES_MD/examples/ethane/zero_sum/leg1/TIES.cfg @@ -25,8 +25,8 @@ methods = FEP,TI #How many total replicas of each window are run (we recommend at least 5). total_reps = 3 -#How many replicas should each instance of TIES_MD run -reps_per_exec = 3 +#bool, if we will split all replicas into separate runs +split_run = 0 #Where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing. elec_edges = 0.5,1.0 diff --git a/TIES_MD/examples/ethane_namd/zero_sum/leg1/TIES.cfg b/TIES_MD/examples/ethane_namd/zero_sum/leg1/TIES.cfg index a5f45a1..a1ad54f 100644 --- a/TIES_MD/examples/ethane_namd/zero_sum/leg1/TIES.cfg +++ b/TIES_MD/examples/ethane_namd/zero_sum/leg1/TIES.cfg @@ -25,8 +25,8 @@ methods = TI #How many total replicas of each window are run (we recommend at least 5). total_reps = 2 -#How many replicas should each instance of TIES_MD run -reps_per_exec = 1 +#bool, if we will split all replicas into separate runs +split_run = 0 #Where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing. elec_edges = 0.45, 1.0 diff --git a/TIES_MD/examples/hydration/l1-l2/leg1/TIES.cfg b/TIES_MD/examples/hydration/l1-l2/leg1/TIES.cfg index 33a4daa..d10af4b 100644 --- a/TIES_MD/examples/hydration/l1-l2/leg1/TIES.cfg +++ b/TIES_MD/examples/hydration/l1-l2/leg1/TIES.cfg @@ -25,8 +25,8 @@ methods = FEP, TI #How many total replicas of each window are run (we recommend at least 5). total_reps = 1 -#How many replicas should each instance of TIES_MD run -reps_per_exec = 1 +#bool, if we will split all replicas into separate runs +split_run = 0 #Where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing. elec_edges = 0.5, 1.0 diff --git a/TIES_MD/examples/ligand_protein/ties-l2-l1/com/TIES.cfg b/TIES_MD/examples/ligand_protein/ties-l2-l1/com/TIES.cfg index 942b6ee..4c36bb2 100644 --- a/TIES_MD/examples/ligand_protein/ties-l2-l1/com/TIES.cfg +++ b/TIES_MD/examples/ligand_protein/ties-l2-l1/com/TIES.cfg @@ -25,8 +25,8 @@ methods = FEP, TI #How many total replicas of each window are run (we recommend at least 5). total_reps = 1 -#How many replicas should each instance of TIES_MD run -reps_per_exec = 1 +#bool, if we will split all replicas into separate runs +split_run = 0 #Where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing. elec_edges = 0.5, 1.0 diff --git a/TIES_MD/examples/result.dat b/TIES_MD/examples/result.dat index 2d7b64d..a738c64 100644 --- a/TIES_MD/examples/result.dat +++ b/TIES_MD/examples/result.dat @@ -1 +1 @@ -{'OpenMM_FEP': {'ethane': {'zero_sum': [0.0066543761920464265, 0.024134991408633517]}}, 'OpenMM_TI': {'ethane': {'zero_sum': [0.027367754486809615, 0.05992671201405186]}}} +{'OpenMM_FEP': {'ethane': {'zero_sum': [0.00603386354750524, 0.02403031204797301]}}, 'OpenMM_TI': {'ethane': {'zero_sum': [0.02788597784813418, 0.05971823858786783]}}} diff --git a/TIES_MD/tests/test_TIES.py b/TIES_MD/tests/test_TIES.py index 8a7832a..ce19494 100644 --- a/TIES_MD/tests/test_TIES.py +++ b/TIES_MD/tests/test_TIES.py @@ -23,7 +23,6 @@ def test_initilization(self): 'global_lambdas': '0.0,0.5,1.0', 'constraint_file': 'cons.pdb', 'constraint_column': 'beta_factor', - 'box_type': 'na', 'input_type': 'AMBER', 'cell_basis_vec1': '46.644591,0.0,0.0', 'cell_basis_vec2': '0.0,46.888166,0.0', @@ -31,8 +30,8 @@ def test_initilization(self): test_msg = '{} was not initialized correctly.' - test_init = TIES(cwd='./', run_type='class', exp_name='sol', devices=[0], node_id='test', - windows_mask=[0,2], periodic=True, lam=None, **args_dict) + test_init = TIES(cwd='./', run_type='class', exp_name='sol', devices=[0], rep_id=None, + windows_mask=[0, 2], periodic=True, lam=None, **args_dict) self.assertEqual(test_init.sampling_per_window, unit.Quantity(2, unit.picoseconds), test_msg.format('Sampling per window')) diff --git a/TIES_MD/tests/test_alch.py b/TIES_MD/tests/test_alch.py index 6895c49..503d82a 100644 --- a/TIES_MD/tests/test_alch.py +++ b/TIES_MD/tests/test_alch.py @@ -250,8 +250,8 @@ def test_run_sim(self): system = AlchSys(cwd, exp_name, temp, pressure, None, args_dict['constraint_column'], args_dict['methods'], basis_vec, input_type='AMBER', absolute=False, periodic=True, platform=GLOBAL_PALT) - node_id = 0 - ids = System_ID(device_id='0', node_id=node_id) + rep_id = 0 + ids = System_ID(device_id='0', rep_id=rep_id) Lam = Lambdas([0.5, 1], [0.0, 0.5], [x/5 for x in range(0, 6)]) mask = [0, 2] @@ -262,7 +262,7 @@ def test_run_sim(self): #build some output dirs for d in ['results', 'simulation', 'equilibration']: for l in ['0.00', '0.20']: - path = os.path.join(cwd, 'LAMBDA_{}/rep{}/{}'.format(l, node_id, d)) + path = os.path.join(cwd, 'LAMBDA_{}/rep{}/{}'.format(l, rep_id, d)) Path(path).mkdir(parents=True, exist_ok=True) simulate_system(ids, system, Lam, mask, cwd, niter, equili_steps, steps_per_iter) @@ -273,7 +273,7 @@ def test_run_sim(self): #look for output for l in ['0.00', '0.20']: for ans, method in zip(expected_shapes, ['TI', 'FEP']): - path = os.path.join(cwd, 'LAMBDA_{}/rep{}/results/{}.npy'.format(l, node_id, method)) + path = os.path.join(cwd, 'LAMBDA_{}/rep{}/results/{}.npy'.format(l, rep_id, method)) array = np.load(path) self.assertEqual(array.shape, ans, 'Failed to generate results of expected shape') diff --git a/TIES_MD/ties_analysis/ties_analysis.py b/TIES_MD/ties_analysis/ties_analysis.py index 7ea1ace..75d69f2 100644 --- a/TIES_MD/ties_analysis/ties_analysis.py +++ b/TIES_MD/ties_analysis/ties_analysis.py @@ -108,6 +108,7 @@ def run(self): with open('./result.dat', 'w') as f: print(result, file=f) + nice_print('END') def nice_print(string): @@ -152,7 +153,6 @@ def make_exp(verbose=True): with open('exp.dat', 'w') as fp: json.dump(exp_dat, fp) - nice_print('END') def main(): ''' diff --git a/docs/API.html b/docs/API.html new file mode 100644 index 0000000..6a18d9d --- /dev/null +++ b/docs/API.html @@ -0,0 +1,226 @@ + + + + + + + TIES MD API — TIES_MD 1.0 documentation + + + + + + + + + + + + + + + + + +

+ + +
+ +
+
+
+ +
+
+
+
+ +
+

TIES MD API

+

TIES MD can be used on the command line but for greater automation we also provide an API that exposes some options that +may be routinely changed during setup.

+
+

API

+

Here we detail all the options in the API and what should be passed. The options that were previously on the command line +can be passed into the TIES class like so:

+
from TIES_MD import TIES
+md = TIES(cwd='./', windows_mask=[0,1], rep_id=0, exp_name='sys_solv')
+
+
+

Once the TIES class is constructed the options that were previously in TIES.cfg can now be set as attributes of the TIES +class like so:

+
# openmm.unit is needed to set values with units
+from openmm import unit
+
+#string for the molecular dynamics engine (openmm/namd2.14/namd3)
+md.engine = 'openmm'
+
+#Target temperature for the thermostat
+md.temperature = 300.0*unit.kelvin
+
+#Target pressure for barostat
+md.pressure = 1.0*unit.atmosphere
+
+#How much production sampling to run per alchemical window (4ns recommended)
+md.sampling_per_window = 0.04*unit.nanosecond
+
+#How much equilibration to run per alchemical window (2ns recommended)
+md.equili_per_window = 0.002*unit.nanosecond
+
+#List for which estimators to use.
+md.methods = ['FEP', 'TI']
+
+#How many total replicas of each window are run (we recommend at least 5).
+md.total_reps = 3
+
+#Boolean for if we will split all replicas into separate runs. (True for maximum parallelism)
+md.split_run = False
+
+#List for where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing.
+md.elec_edges = [0.5, 1.0]
+
+#List for where in lambda schedule (0->1) should the Lennard_Jones potentials begin, stop appearing.
+md.ster_edges = [0.0, 0.5]
+
+#List for the value the global controlling parameter takes in each window.
+md.global_lambdas = [0.00, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 1.00]
+
+#String for name of the pdb file with constraints in the build directory, i.e. 'cons.pdb'
+md.constraint_file = None
+
+#String for column in pdb are constraints provided valid options are 'occupancy'/'beta_factor'.
+md.constraint_column = None
+
+#String for what input type is provided, only AMBER supported.
+md.input_type = 'AMBER'
+
+#list of x, y, z floats for box vectors of this simulation, unit Angstrom.
+md.cell_basis_vec1 = [34.55, 0.0, 0.0]
+md.cell_basis_vec2 = [-11.516722937414105, 32.574214501232206, 0.0]
+md.cell_basis_vec3 = [-11.516722937414105, -16.287105279373797, 28.21009840448772]
+
+
+

Finally there are three additional options that don’t appear in TIES.cfg which are:

+
#A header to a the submission script that will be written for this job.
+md.sub_header = """#Example script for Summit OpenMM
+#BSUB -P CHM155_001
+#BSUB -W 120
+#BSUB -nnodes 13
+#BSUB -alloc_flags "gpudefault smt1"
+#BSUB -J LIGPAIR
+#BSUB -o oLIGPAIR.%J
+#BSUB -e eLIGPAIR.%J"""
+
+#The prefix for the run line of this job.
+md.pre_run_line = 'jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 '
+
+#the ties_md run line of this job.
+md.run_line = 'ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i'
+
+
+

The use of these three setting will produce a submission script which looks like:

+
#!/bin/bash
+#Example script for Summit OpenMM
+#BSUB -P CHM155_001
+#BSUB -W 120
+#BSUB -nnodes 13
+#BSUB -alloc_flags "gpudefault smt1"
+#BSUB -J LIGPAIR
+#BSUB -o oLIGPAIR.%J
+#BSUB -e eLIGPAIR.%J
+
+export ties_dir="ties/ties-ligandA-ligandB/lig"
+cd $ties_dir
+
+for lambda in 0 1 2 3 4 5 6 7 8 9 10 11 12; do
+  for i in {0..5}; do
+        jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i&
+    done
+    done
+wait
+
+
+

If sub_header, pre_run_line and run_line are not set TIES_MD will make a best guess for a submission script. +Ideally only small modification should be need to run using the best guess scripts. Any tweaks that are applied to get the +scripts working can then be passed into sub_header, pre_run_line and run_line for future system setups. For +general idea on how to make submission scripts see HPC Submission scripts.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/HPC_submissions.html b/docs/HPC_submissions.html index 70abdbf..4789406 100644 --- a/docs/HPC_submissions.html +++ b/docs/HPC_submissions.html @@ -42,6 +42,7 @@
  • Installation
  • Tutorial
  • +
  • TIES MD API
  • Binding Free Energy Tutorial
  • Parallelization
  • HPC Submission scripts
      @@ -86,7 +87,7 @@

      HPC Submission scriptsHere we provide some example submission scripts for various HPC systems. TIES MD will attempt to automatically write sensible submission scripts for NAMD2 targeting ARCHER 2 and for OpenMM targeting Summit. In general the user can make there own script for whichever HPC or cluster they prefer. To aid with writing general -scripts TIES MD exposes 2 options in the API called sub_header and sub_run_line. The strings passed +scripts TIES MD exposes 3 options in the API called sub_header, pre_run_line and run_line. The strings passed with these options will be injected into a general template for a NAMD2 or OpenMM submission. All generated submission scripts are written to the base TIES MD directory as sub.sh. An example of this is provided in here Running.

      @@ -169,12 +170,12 @@

      OpenMM diff --git a/docs/TIES_MD.eng_scripts.cfg_scripts.html b/docs/TIES_MD.eng_scripts.cfg_scripts.html index 8a0df34..39595de 100644 --- a/docs/TIES_MD.eng_scripts.cfg_scripts.html +++ b/docs/TIES_MD.eng_scripts.cfg_scripts.html @@ -42,6 +42,7 @@
      • Installation
      • Tutorial
      • +
      • TIES MD API
      • Binding Free Energy Tutorial
      • Parallelization
      • HPC Submission scripts
      • diff --git a/docs/TIES_MD.eng_scripts.html b/docs/TIES_MD.eng_scripts.html index 87ee7ff..501711d 100644 --- a/docs/TIES_MD.eng_scripts.html +++ b/docs/TIES_MD.eng_scripts.html @@ -42,6 +42,7 @@
        • Installation
        • Tutorial
        • +
        • TIES MD API
        • Binding Free Energy Tutorial
        • Parallelization
        • HPC Submission scripts
        • diff --git a/docs/TIES_MD.eng_scripts.namd_sub.html b/docs/TIES_MD.eng_scripts.namd_sub.html index b713335..fe269a4 100644 --- a/docs/TIES_MD.eng_scripts.namd_sub.html +++ b/docs/TIES_MD.eng_scripts.namd_sub.html @@ -42,6 +42,7 @@
          • Installation
          • Tutorial
          • +
          • TIES MD API
          • Binding Free Energy Tutorial
          • Parallelization
          • HPC Submission scripts
          • diff --git a/docs/TIES_MD.eng_scripts.namd_sub_split.html b/docs/TIES_MD.eng_scripts.namd_sub_split.html index 79cba6b..65d1f31 100644 --- a/docs/TIES_MD.eng_scripts.namd_sub_split.html +++ b/docs/TIES_MD.eng_scripts.namd_sub_split.html @@ -42,6 +42,7 @@
            • Installation
            • Tutorial
            • +
            • TIES MD API
            • Binding Free Energy Tutorial
            • Parallelization
            • HPC Submission scripts
            • diff --git a/docs/TIES_MD.eng_scripts.openmm_sub.html b/docs/TIES_MD.eng_scripts.openmm_sub.html new file mode 100644 index 0000000..4332ec4 --- /dev/null +++ b/docs/TIES_MD.eng_scripts.openmm_sub.html @@ -0,0 +1,138 @@ + + + + + + + TIES_MD.eng_scripts.openmm_sub package — TIES_MD 1.0 documentation + + + + + + + + + + + + + + + + + +
              + + +
              + +
              +
              +
              + +
              +
              +
              +
              + +
              +

              TIES_MD.eng_scripts.openmm_sub package

              +
              +

              Module contents

              +
              +
              + + +
              +
              + +
              +
              +
              +
              + + + + \ No newline at end of file diff --git a/docs/TIES_MD.eng_scripts.openmm_sub_split.html b/docs/TIES_MD.eng_scripts.openmm_sub_split.html index 7bff74b..3fb9c1f 100644 --- a/docs/TIES_MD.eng_scripts.openmm_sub_split.html +++ b/docs/TIES_MD.eng_scripts.openmm_sub_split.html @@ -42,6 +42,7 @@
              • Installation
              • Tutorial
              • +
              • TIES MD API
              • Binding Free Energy Tutorial
              • Parallelization
              • HPC Submission scripts
              • diff --git a/docs/TIES_MD.html b/docs/TIES_MD.html index 887f81e..2ea2540 100644 --- a/docs/TIES_MD.html +++ b/docs/TIES_MD.html @@ -42,6 +42,7 @@
                • Installation
                • Tutorial
                • +
                • TIES MD API
                • Binding Free Energy Tutorial
                • Parallelization
                • HPC Submission scripts
                • @@ -167,7 +168,7 @@

                  Submodules

                  TIES_MD.TIES module

                  -class TIES_MD.TIES.TIES(cwd, exp_name, run_type='class', devices=None, node_id=None, windows_mask=None, periodic=True, lam=None, platform='CUDA', **kwargs)
                  +class TIES_MD.TIES.TIES(cwd, exp_name='complex', run_type='class', devices=None, rep_id=None, windows_mask=None, periodic=True, lam=None, platform='CUDA', **kwargs)

                  Bases: object

                  Class to control TIES protocol, initializes variables and calls functions to start simulation or write input scripts

                  @@ -177,7 +178,7 @@

                  Submodules +
                  +build_results_dirs(folders)
                  +

                  Helper function to build output directories. +:param folders: List of strings for what folders to build.

                  +
                  +
                  Returns
                  +

                  None

                  +
                  +
                  +

                  +
                  -
                  -property box_type
                  -

                  What type of simulation box is being used (cube, truncatedOctahedron, rhombicDodecahedron or na for manual)

                  +
                  +property cell_basis_vec1
                  +

                  What is the 1st basis vector of the simulation cell

                  Returns
                  -

                  string for box type.

                  +

                  list of floats for x, y, z components of vector

                  -
                  -
                  -build_results_dirs(folders)
                  -

                  Helper function to build output directories. -:param folders: List of strings for what folders to build.

                  +
                  +
                  +property cell_basis_vec2
                  +

                  What is the 2nd basis vector of the simulation cell

                  Returns
                  -

                  None

                  +

                  list of floats for x, y, z components of vector

                  +
                  +
                  +
                  + +
                  +
                  +property cell_basis_vec3
                  +

                  What is the 3rd basis vector of the simulation cell

                  +
                  +
                  Returns
                  +

                  list of floats for x, y, z components of vector

                  @@ -685,7 +708,7 @@

                  Submodules
                  -class TIES_MD.alch.System_ID(device_id, node_id)
                  +class TIES_MD.alch.System_ID(device_id, rep_id)

                  Bases: object

                  Class as a ID for a simulation providing information for what GPU this simulation should run on and what number repeat this simulation is out of some total number of repeats.

                  @@ -693,7 +716,7 @@

                  SubmodulesParameters
                  • device_id – int, for OpenMM GPU device id

                  • -
                  • node_id – str, id number denoting which replica this is

                  • +
                  • rep_id – str, id number denoting which replica this is

                  diff --git a/docs/TIES_MD.openmmtools.html b/docs/TIES_MD.openmmtools.html index e577b29..ce69db7 100644 --- a/docs/TIES_MD.openmmtools.html +++ b/docs/TIES_MD.openmmtools.html @@ -42,6 +42,7 @@
                  +
                  TIES_MD.ties_analysis.ties_analysis.nice_print(string)
                  diff --git a/docs/TIES_MD.ties_analysis.methods.html b/docs/TIES_MD.ties_analysis.methods.html index 1c490b6..9a7de5a 100644 --- a/docs/TIES_MD.ties_analysis.methods.html +++ b/docs/TIES_MD.ties_analysis.methods.html @@ -41,6 +41,7 @@
                  • Installation
                  • Tutorial
                  • +
                  • TIES MD API
                  • Binding Free Energy Tutorial
                  • Parallelization
                  • HPC Submission scripts
                  • diff --git a/docs/_sources/API.rst.txt b/docs/_sources/API.rst.txt new file mode 100644 index 0000000..76c1696 --- /dev/null +++ b/docs/_sources/API.rst.txt @@ -0,0 +1,114 @@ +TIES MD API +=========== + +``TIES MD`` can be used on the command line but for greater automation we also provide an API that exposes some options that +may be routinely changed during setup. + +API +--- + +Here we detail all the options in the API and what should be passed. The options that were previously on the command line +can be passed into the TIES class like so:: + + from TIES_MD import TIES + md = TIES(cwd='./', windows_mask=[0,1], rep_id=0, exp_name='sys_solv') + +Once the TIES class is constructed the options that were previously in TIES.cfg can now be set as attributes of the TIES +class like so:: + + # openmm.unit is needed to set values with units + from openmm import unit + + #string for the molecular dynamics engine (openmm/namd2.14/namd3) + md.engine = 'openmm' + + #Target temperature for the thermostat + md.temperature = 300.0*unit.kelvin + + #Target pressure for barostat + md.pressure = 1.0*unit.atmosphere + + #How much production sampling to run per alchemical window (4ns recommended) + md.sampling_per_window = 0.04*unit.nanosecond + + #How much equilibration to run per alchemical window (2ns recommended) + md.equili_per_window = 0.002*unit.nanosecond + + #List for which estimators to use. + md.methods = ['FEP', 'TI'] + + #How many total replicas of each window are run (we recommend at least 5). + md.total_reps = 3 + + #Boolean for if we will split all replicas into separate runs. (True for maximum parallelism) + md.split_run = False + + #List for where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing. + md.elec_edges = [0.5, 1.0] + + #List for where in lambda schedule (0->1) should the Lennard_Jones potentials begin, stop appearing. + md.ster_edges = [0.0, 0.5] + + #List for the value the global controlling parameter takes in each window. + md.global_lambdas = [0.00, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 1.00] + + #String for name of the pdb file with constraints in the build directory, i.e. 'cons.pdb' + md.constraint_file = None + + #String for column in pdb are constraints provided valid options are 'occupancy'/'beta_factor'. + md.constraint_column = None + + #String for what input type is provided, only AMBER supported. + md.input_type = 'AMBER' + + #list of x, y, z floats for box vectors of this simulation, unit Angstrom. + md.cell_basis_vec1 = [34.55, 0.0, 0.0] + md.cell_basis_vec2 = [-11.516722937414105, 32.574214501232206, 0.0] + md.cell_basis_vec3 = [-11.516722937414105, -16.287105279373797, 28.21009840448772] + + +Finally there are three additional options that don't appear in TIES.cfg which are:: + + #A header to a the submission script that will be written for this job. + md.sub_header = """#Example script for Summit OpenMM + #BSUB -P CHM155_001 + #BSUB -W 120 + #BSUB -nnodes 13 + #BSUB -alloc_flags "gpudefault smt1" + #BSUB -J LIGPAIR + #BSUB -o oLIGPAIR.%J + #BSUB -e eLIGPAIR.%J""" + + #The prefix for the run line of this job. + md.pre_run_line = 'jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ' + + #the ties_md run line of this job. + md.run_line = 'ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i' + +The use of these three setting will produce a submission script which looks like:: + + #!/bin/bash + #Example script for Summit OpenMM + #BSUB -P CHM155_001 + #BSUB -W 120 + #BSUB -nnodes 13 + #BSUB -alloc_flags "gpudefault smt1" + #BSUB -J LIGPAIR + #BSUB -o oLIGPAIR.%J + #BSUB -e eLIGPAIR.%J + + export ties_dir="ties/ties-ligandA-ligandB/lig" + cd $ties_dir + + for lambda in 0 1 2 3 4 5 6 7 8 9 10 11 12; do + for i in {0..5}; do + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i& + done + done + wait + +If ``sub_header``, ``pre_run_line`` and ``run_line`` are not set ``TIES_MD`` will make a best guess for a submission script. +Ideally only small modification should be need to run using the best guess scripts. Any tweaks that are applied to get the +scripts working can then be passed into ``sub_header``, ``pre_run_line`` and ``run_line`` for future system setups. For +general idea on how to make submission scripts see :ref:`HPC Submission scripts`. + diff --git a/docs/_sources/HPC_submissions.rst.txt b/docs/_sources/HPC_submissions.rst.txt index 5550b9d..9f9e3e2 100644 --- a/docs/_sources/HPC_submissions.rst.txt +++ b/docs/_sources/HPC_submissions.rst.txt @@ -4,7 +4,7 @@ HPC Submission scripts Here we provide some example submission scripts for various HPC systems. ``TIES MD`` will attempt to automatically write sensible submission scripts for ``NAMD2`` targeting `ARCHER 2 `_ and for ``OpenMM`` targeting `Summit `_. In general the user can make there own script for whichever HPC or cluster they prefer. To aid with writing general -scripts ``TIES MD`` exposes 2 options in the :ref:`API` called ``sub_header`` and ``sub_run_line``. The strings passed +scripts ``TIES MD`` exposes 3 options in the :ref:`API` called ``sub_header``, ``pre_run_line`` and ``run_line``. The strings passed with these options will be injected into a general template for a ``NAMD2`` or ``OpenMM`` submission. All generated submission scripts are written to the base ``TIES MD`` directory as sub.sh. An example of this is provided in here :ref:`Running`. @@ -91,12 +91,12 @@ Here we provide an example of ``TIES MD`` running with ``OpenMM`` on `Summit $ties_dir/0.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id="0" > $ties_dir/1.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id="0" > $ties_dir/2.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id="0" > $ties_dir/3.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id="0" > $ties_dir/4.out& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id="0" > $ties_dir/5.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=0 > $ties_dir/0.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=0 > $ties_dir/1.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=0 > $ties_dir/2.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=0 > $ties_dir/3.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=0 > $ties_dir/4.out& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=0 > $ties_dir/5.out& wait NAMD 3 diff --git a/docs/_sources/TIES_MD.eng_scripts.openmm_sub.rst.txt b/docs/_sources/TIES_MD.eng_scripts.openmm_sub.rst.txt new file mode 100644 index 0000000..ebb9e7e --- /dev/null +++ b/docs/_sources/TIES_MD.eng_scripts.openmm_sub.rst.txt @@ -0,0 +1,10 @@ +TIES\_MD.eng\_scripts.openmm\_sub package +========================================= + +Module contents +--------------- + +.. automodule:: TIES_MD.eng_scripts.openmm_sub + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/binding_free_energies.rst.txt b/docs/_sources/binding_free_energies.rst.txt index 120453d..7725f25 100644 --- a/docs/_sources/binding_free_energies.rst.txt +++ b/docs/_sources/binding_free_energies.rst.txt @@ -35,9 +35,7 @@ hybrid ligands but also setup binding free energy calculations for the TIES prot simulations as follows:: #ties20 imports - from ties import Pair, Ligand - from ties import Config - from ties.protein import Protein + from ties import Pair, Config, Ligand, Protein #Setting for system building config = Config() @@ -68,7 +66,7 @@ simulations as follows:: #now declare protein config.protein = 'receptor.pdb' config.protein_ff = 'leaprc.protein.ff14SB' - protein = Protein(config.protein, config) + protein = Protein(config) #re-prepare simulation input, now protein is declared and passed as argument com simulation is built hybrid.prepare_inputs(protein=protein) @@ -86,12 +84,12 @@ At this point we have prepped a simulation of one thermodynamic cycle with two l set these legs up in the directories ``ties/ties-ligandA-ligandB/(lig/com)`` and these map to the ``system/ligand/thermodynamic_leg/`` directory structure that was discussed in the :ref:`Tutorial` section. In ``ties/ties-ligandA-ligandB/(lig/com)`` there will be the ``build`` directory and ``TIES.cfg`` files as also seen in -the :ref:`Tutorial`. The settings in ``TIES.cfg`` will be good for a default simulation but in general we may wish to +the :ref:`Tutorial`. The automatic settings in ``TIES.cfg`` will be good for a default simulation but in general we may wish to change these quickly and or write submission scripts for these simulations. To do this we can use the ``TIES_MD`` API as follows:: #tiesMD imports - from TIES_MD import TIES, cli + from TIES_MD import TIES import os #iterate over both legs of BFE calculation @@ -100,11 +98,10 @@ follows:: ties_dir = os.path.join(os.getcwd(), 'ties', 'ties-ligandA-ligandB', thermo_leg) #read the default TIES.cfg to initialize - args_dict = cli.read_config(os.path.join(ties_dir, 'TIES.cfg')) - md = TIES.TIES(cwd=ties_dir, exp_name='complex', **args_dict) + md = TIES(ties_dir) #change some settings in TIES.cfg - md.reps_per_exec = 1 + md.split_run = 1 md.total_reps = 6 #inspect all the options we can configure and change @@ -120,41 +117,20 @@ follows:: #BSUB -o oLIGPAIR.%J #BSUB -e eLIGPAIR.%J""" - #run line in submission scripts can also be changed - md.sub_run_line = 'jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i > $ties_dir/$lambda$i.out&' + #Setting HPC specific elements of run line (example here is Summit) + md.pre_run_line = 'jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ' + + #Setting ties_md part of run line + md.run_line = 'ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i' #setup the new simulation with changed options (also writes submission script) md.setup() - #must make sure the TIES.cfg on disk is updated with new settings. - md.update_cfg() - -This changes the TIES.cfg options ``reps_per_exec`` to 1 and ``total_reps`` to 6. To see all configurable options the user +This changes the TIES.cfg options ``split_run`` to 1 (True) and ``total_reps`` to 6. To see all configurable options the user can run ``md.get_options()`` as shown above. To generate a general submission script we are modifying the -``sub_header`` and ``sub_run_line`` internal options and these set what ``TIES_MD`` writes into the submission script. The -settings above yield the following script:: - - #!/bin/bash - #Example script for Summit OpenMM - #BSUB -P CHM155_001 - #BSUB -W 120 - #BSUB -nnodes 13 - #BSUB -alloc_flags "gpudefault smt1" - #BSUB -J LIGPAIR - #BSUB -o oLIGPAIR.%J - #BSUB -e eLIGPAIR.%J - - export ties_dir="ties/ties-ligandA-ligandB/lig" - cd $ties_dir - - for lambda in 0 1 2 3 4 5 6 7 8 9 10 11 12; do - for i in {0..5}; do - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --windows_mask=$lambda,$(expr $lambda + 1) --node_id=$i > $ties_dir/$lambda$i.out& - done - done - wait - -These scripts can be summited to the HPC scheduler, once they finish the last step to get a :math:`{ΔΔ G}` is analysis. +``sub_header``, ``pre_run_line`` and ``run_line`` internal options and these set what ``TIES_MD`` writes into the +submission script, for more details see :ref:`API`. These scripts can be summited to the HPC scheduler, once they +finish the last step to get a :math:`{ΔΔ G}` is analysis. BFE Analysis ------------ diff --git a/docs/_sources/parallelization.rst.txt b/docs/_sources/parallelization.rst.txt index 4e650ac..0c98a1c 100644 --- a/docs/_sources/parallelization.rst.txt +++ b/docs/_sources/parallelization.rst.txt @@ -27,15 +27,13 @@ If we wanted to parallelize 3 repeats over 3 GPUs on one node we would run:: Each ``CUDA`` device will then run 8 windows of the 1 replica. Equally ths could be spit into to separate runs of ``TIES MD`` masked to only see one device:: - ties_md --exp_name=sys_solv --devices=0 --node_id=0 - ties_md --exp_name=sys_solv --devices=1 --node_id=1 - ties_md --exp_name=sys_solv --devices=3 --node_id=1 + ties_md --exp_name=sys_solv --devices=0 --rep_id=0& + ties_md --exp_name=sys_solv --devices=1 --rep_id=1& + ties_md --exp_name=sys_solv --devices=2 --rep_id=2& -To run in this configuration the options ``total_reps=3`` and ``reps_per_exec=1`` are set in TIES.cfg to tell ``TIES MD`` that -there are a total of 3 replicas being run and that each execution of ``TIES MD`` should run only one. Also note we have set -``--node_id`` to some different values for otherwise identical run lines and this ensures these parallel runs write output -to unique locations. ``--node_id`` only needs to be set when identical replicas of a simulation are run in separate executions -of ``TIES MD``. +To run in this configuration the options ``total_reps=3`` and ``split_run=1`` are set in TIES.cfg to tell ``TIES MD`` that +there are a total of 3 replicas being run and that each execution of ``TIES MD`` should run only one. ``--rep_id`` +determines which replica each instance will run. ``--rep_id`` only needs to be set when using ``split_run=1``. If we need further parallelization over alchemical windows we can use the command line option ``--windows_mask`` this option takes a ``Python`` range (start inclusive and end exclusive) of the windows which that instance of @@ -50,27 +48,27 @@ this option takes a ``Python`` range (start inclusive and end exclusive) of the ties_md --exp_name=sys_solv --windows_mask=6,7 --devices=6& ties_md --exp_name=sys_solv --windows_mask=7,8 --devices=7& -Again using the configuration options ``total_reps=3`` and ``reps_per_exec=1`` the above runs 1 replica of each alchemical +Now sing the configuration options ``total_reps=3`` and ``split_run=0`` the above runs 3 replica of each alchemical window on a different GPU. For maximum parallelism we combine parallelizing over replicas and alchemical windows. For clarity we now consider the same example as above but now with 6 alchemical windows, 2 replica simulations and one simulation per GPU, so in -TIES.cfg ``global_lambdas=0.0, 0.1, 0.4, 0.6, 0.9, 1.0``, ``total_reps=2`` and ``reps_per_exec=1``. To scale over multiple node +TIES.cfg ``global_lambdas=0.0, 0.1, 0.4, 0.6, 0.9, 1.0``, ``total_reps=2`` and ``split_run=1``. To scale over multiple node we could use the resource allocator of the HPC for example `jsrun `_ on `Summit `_. would allow us to run with 2 replicas of 6 windows as follows:: - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id=0& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id=1& - jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=0& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=1& + jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=1& Note here we do not set ``--devices`` as the masking of GPUs is handled by the resource allocator, this is not the general case. If a resource allocator is not available an alternative method to run multiple simulations across nodes is to use a message passing interface @@ -82,9 +80,9 @@ TIES-NAMD --------- The parallelization of TIES in ``NAMD2`` follows the same ideas as ``OpenMM`` above. We want to run independent simulations -for all alchemical window and replica simulations. To achieve parallelization over replica simulations there are two options. -If in TIES.cfg ``total_reps==reps_per_exec`` the submission script that ``TIES_MD`` writes will use the ``NAMD`` option -``+replicas X`` this makes each ``NAMD`` run ``X`` replicas and the run lines in sub.sh will look something like:: +for all alchemical window and replica simulations. If in TIES.cfg ``split_run=0`` the submission script that +``TIES_MD`` writes will use the ``NAMD`` option ``+replicas X`` this makes each ``NAMD`` run ``X`` replicas and the +run lines in sub.sh will look something like:: for stage in {0..3}; do for lambda in 0.00 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1.0; do @@ -94,7 +92,7 @@ If in TIES.cfg ``total_reps==reps_per_exec`` the submission script that ``TIES_M wait done -Alternatively if ``total_reps=!reps_per_exec`` with ``reps_per_exec=1`` the run lines will look like:: +Alternatively if ``split_run=1`` the run lines will look like:: for stage in {0..3}; do for lambda in 0.00 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1.0; do @@ -112,6 +110,6 @@ we have tested up to ``+replicas 135`` on `ARCHER 2 examples the parallelism over alchemical windows is achieved in the loop over lambda. Using ``NAMD3`` parallelization can be achieved like so (:ref:`NAMD 3`). ``NAMD`` in general has extensive options to provision -hardware and achieve parallelism, what have outlined here is not exhaustive and we would suggest consulting the `documentation `_ -for more a more comprehensive information. +hardware and achieve parallelism, what have outlined here is not exhaustive and we would suggest consulting +the `documentation `_ for more a more comprehensive information. diff --git a/docs/_sources/tutorial.rst.txt b/docs/_sources/tutorial.rst.txt index 90f3a0d..067a124 100644 --- a/docs/_sources/tutorial.rst.txt +++ b/docs/_sources/tutorial.rst.txt @@ -4,7 +4,7 @@ Tutorial Getting started --------------- -``TIES MD`` is a package which is intended to be used on the command line and submitted to a HPC system. In this document +``TIES MD`` is a package for the preparation, running and analysis of binding free energy calculations. In this document we will outline what commands should be run to calculate binding free energies. To start with any free energy calculations we must first outline what are the expected input files to the ``TIES MD`` program. @@ -13,22 +13,25 @@ In this tutorial we will refer to example systems which can be found in the git clone https://github.com/UCL-CCS/TIES_MD.git -and navigating to ``TIES_MD/TIES_MD/examples/`` +and found by navigating to ``TIES_MD/TIES_MD/examples/`` Input ------ ``TIES MD`` expects a number of input files, these are two essential files, e.g. ``complex.pdb`` and ``complex.prmtop``. These files contain information about the position, topology and parameters for the system. Currently we only support -the ``AMBER`` based format ``prmtop`` but provide a utility to `build `_ them online. ``complex.pdb`` also -contains the alchemical indexes denoting which atoms will appear and disappear during the simulation. There is also -an optional input file, ``constraints.pdb``, and this contains indexes denoting which atoms, if any, are constrained -during the pre-production simulation. This input should all be placed in a directory named build located -where the user wishes to run the simulation. Examples of these files can be found `here `_. +the ``AMBER`` based format ``prmtop``. ``complex.pdb`` also contains the alchemical indexes denoting which atoms will +appear and disappear during the simulation. There is also an optional input file, ``constraints.pdb``, and this +contains indexes denoting which atoms, if any, are constrained during the pre-production simulation. This input should +all be placed in a directory named build located where the user wishes to run the simulation. Examples of these files +can be found `here `_. + Please use a directory structure like ``study/system/ligand/thermodynamic_leg/build`` this will allow the analysis scripts to understand the structure and perform analysis automatically. ``study``, ``system``, ``ligand`` and ``thermodynamic_leg`` can be renamed to anything but the name of the ``build`` directory is fixed. If input for novel ligand transformations is desired the -`TIES20 `_ program can be used to generate all required inputs. +`TIES20 `_ program can be used to generate all required inputs. ``TIES 20`` can be +used via our online `service `_ or locally and details of how to use this will be provided +later in these documents. The only non standard input to ``TIES MD`` is a configuration file (``TIES.cfg``) which specifies options which the user my wish to occasionally change. This file must be placed alongside the build directory. Here we provide an example of such a file:: @@ -61,8 +64,8 @@ occasionally change. This file must be placed alongside the build directory. Her #How many total replicas of each window are run (we recommend at least 5). total_reps = 5 - #How many replicas should this evocation of TIES_MD run, used for parallelisation - reps_per_exec = 5 + #Boolean for if we will split all replicas into separate runs. (1 for maximum parallelism) + split_run = 0 #Where in lambda schedule (0->1) should the electrostatic potentials begin, stop appearing. elec_edges = 0.5, 1.0 @@ -79,13 +82,7 @@ occasionally change. This file must be placed alongside the build directory. Her #Which column in pdb are constraints provided valid options are occupancy/beta_factor. (beta_factor is standard) constraint_column = beta_factor - #What type of simulation cell is used valid options are cube, truncatedOctahedron, rhombicDodecahedron or na for manual. - box_type = na - - #The edge length used to compute the cube or truncatedOctahedron or rhombicDodecahedron box vectors - edge_length = 10*unit.nanometer - - #If box_type is na the manually specify box vectors of this simulation, unit Angstrom. + #Manually specify box vectors of this simulation, unit Angstrom. cell_basis_vec1 = 50, 0.0, 0.0 cell_basis_vec2 = 0.0, 50, 0.0 cell_basis_vec3 = 0.0, 0.0, 50 @@ -93,9 +90,9 @@ occasionally change. This file must be placed alongside the build directory. Her #What input type is provided, only AMBER supported. input_type = AMBER -``total_reps`` and ``reps_per_exec`` are options which can be used to achieve simple parallelism of the simulations. +``total_reps`` and ``split_run`` are options which can be used to achieve simple parallelism of the simulations. For example if you wished to run a total of 5 simulations on 5 GPUs in parallel one could use the settings -``total_reps = 5`` and ``reps_per_exec = 1``. See the :ref:`Parallelization` section for more details of how to +``total_reps = 5`` and ``split_run = 1``. See the :ref:`Parallelization` section for more details of how to achieve this. The following image shows ``TIES_MD`` applied to one alchemical transformation. @@ -113,11 +110,10 @@ energy functions of the system and for more information these settings please se Note the option ``constraint_column`` which determines if the constraint indexes will be read from the temperature factor or occupancy column of the constraints PDB. The alchemical indexes are always be read from the temperature factor column -in the main PDB ``complex.pdb``. The ``edge_length`` option can be found in the ``leap.log`` file created during system -preparation preformed by the users or ``TIES20``. ``TIES20`` will populate a TIES.cfg automatically with the correct box size. +in the main PDB ``complex.pdb``. ``TIES20`` will populate a TIES.cfg automatically with the correct box size. Typically a constraint file may be used during preproduction of simulations involving proteins but possibly not a small -drug like molecule in only solvent. It will be show later in the Binding Free Energy Calculations section when and +drug like molecule in only solvent. It will be shown later in the :ref:`Binding Free Energy Tutorial` section when and why we use a constraints file. Command Line @@ -146,7 +142,7 @@ values are as follows:: A comma separated list of integers which tells TIES OpenMM which GPUs to run on. If multiple GPUs are specified then TIES OpenMM will parallelize requested replicas over the available GPUs. - [--node_id=0] + [--rep_id=0] An int which will be used to generate the names of output files. Should be used if many independent replicas of the same simulation are run on different nodes to ensure output is writen to unique location. @@ -154,9 +150,6 @@ values are as follows:: Comma separated list of integers. These specify what alchemical windows the current instance of TIES OpenMM should run. By default all windows will be run. - [--periodic=1] - A value of 1 sets the simulation box as periodic a value of 0 sets the simulation box as non-periodic. - Simulation Preparation ---------------------- @@ -199,7 +192,7 @@ to ``1``, there is therefore 6x1 = 6 total simulations to perform. If a HPC subm ties_md --exp_name=sys_solv --windows_mask=4,5 --devices=4& ties_md --exp_name=sys_solv --windows_mask=5,6 --devices=5& -There are a lot of options for how these ``OpenMM`` calcualtions can be structured and parallelized with ``TIES_MD`` see our +There are a lot of options for how these ``OpenMM`` calculations can be structured and parallelized with ``TIES_MD`` see our :ref:`Parallelization` page for more information on this. For a ``NAMD`` calculation if the submission script requested 6 CPU nodes each with 128 cores the run lines in the submission script might look like:: diff --git a/docs/_static/pygments.css b/docs/_static/pygments.css index 582d5c3..08bec68 100644 --- a/docs/_static/pygments.css +++ b/docs/_static/pygments.css @@ -5,22 +5,22 @@ td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5 span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #f8f8f8; } -.highlight .c { color: #408080; font-style: italic } /* Comment */ +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #008000; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ -.highlight .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ -.highlight .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ @@ -33,15 +33,15 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .kt { color: #B00040 } /* Keyword.Type */ .highlight .m { color: #666666 } /* Literal.Number */ .highlight .s { color: #BA2121 } /* Literal.String */ -.highlight .na { color: #7D9029 } /* Name.Attribute */ +.highlight .na { color: #687822 } /* Name.Attribute */ .highlight .nb { color: #008000 } /* Name.Builtin */ .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ .highlight .no { color: #880000 } /* Name.Constant */ .highlight .nd { color: #AA22FF } /* Name.Decorator */ -.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0000FF } /* Name.Function */ -.highlight .nl { color: #A0A000 } /* Name.Label */ +.highlight .nl { color: #767600 } /* Name.Label */ .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #19177C } /* Name.Variable */ @@ -58,11 +58,11 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ -.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ .highlight .sx { color: #008000 } /* Literal.String.Other */ -.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ .highlight .ss { color: #19177C } /* Literal.String.Symbol */ .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ diff --git a/docs/binding_free_energies.html b/docs/binding_free_energies.html index 12aba98..51b01b2 100644 --- a/docs/binding_free_energies.html +++ b/docs/binding_free_energies.html @@ -21,7 +21,7 @@ - + @@ -43,6 +43,7 @@

      BFE Analysis

      @@ -255,7 +232,7 @@

      BFE Analysis - + diff --git a/docs/genindex.html b/docs/genindex.html index d5a9719..0ae9873 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -39,6 +39,7 @@
      • Installation
      • Tutorial
      • +
      • TIES MD API
      • Binding Free Energy Tutorial
      • Parallelization
      • HPC Submission scripts
      • @@ -131,12 +132,10 @@

        A

        B

        @@ -145,16 +144,22 @@

        B

        C

        + -
        +
      • make_exp() (in module TIES_MD.ties_analysis.ties_analysis) +
      • MBAR_Analysis (class in TIES_MD.ties_analysis.methods.FEP)
      • minimization() (in module TIES_MD.alch) diff --git a/docs/index.html b/docs/index.html index ad3cad4..57bf765 100644 --- a/docs/index.html +++ b/docs/index.html @@ -41,6 +41,7 @@
      • +
      • TIES MD API +
      • Binding Free Energy Tutorial
        • General BFE background
        • Setup
        • diff --git a/docs/install.html b/docs/install.html index b26be80..9e3936b 100644 --- a/docs/install.html +++ b/docs/install.html @@ -46,6 +46,7 @@
      • Tutorial
      • +
      • TIES MD API
      • Binding Free Energy Tutorial
      • Parallelization
      • HPC Submission scripts
      • diff --git a/docs/modules.html b/docs/modules.html index 5d4d732..d434e68 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -42,6 +42,7 @@
        • Installation
        • Tutorial
        • +
        • TIES MD API
        • Binding Free Energy Tutorial
        • Parallelization
        • HPC Submission scripts
        • diff --git a/docs/objects.inv b/docs/objects.inv index 53012bc8eefd8e0c8a62e3d64c3ae045906347ca..ac3bfca23ec5fa6ff66af9c18374c3e665ea87d3 100644 GIT binary patch delta 2476 zcmV;d2~+mb6Nwa%cYjN7+&B`x_pcx@zN)dAEcP%r$9857jCUJj1A8$bP!hXMM6aQ! z*uB4gi?0@`rX)(;@&ZY0NmbuhEEbDok$HK1c#fa$QGNWasIoRE=x^vnz1zO=BL79b zjc!o1G4I9C*$OAEG{;SYzPL(W>21=|Jc}7=+MG9WMp+|i34ed9vM_{{X zb%An0%L}x@Uw_#J>P^aM&6`UQ+N7XOvn03`3iNkb6c)}57%{Sv>O zXVSoiVQ5=mpSl1A0e@DELbin5RaXt2k^3AdHDxulXn%9egG0lC$Vk#2;(f(ZvOrq| z$${aFl4ZUS`rt;w8i-JcvqMfUhe@h3yBtLfn1$WKi0T*(u>b)k84+Zhd=( z0`o@q;8u7d1x+suHclEYVr_=%?*3bx>oq~xC<7u+iumz9Tty7XZV12vuCAEq#5wt6 zOa6i$qkjpbr*RalD#FHcG3Hg#%mxq{g?A|>SQlnTTG0Q_x4H&D!Q9xUvo#qhs-NU? zmumn(l6@Yko91*@wg>rbfoX6XVHN94`+Xkk`yi(+152l1JWDnR+pI7qfsNoS)L5=s zgRzx(5JR`7nMChIXCen$-&Yu9vGy3jv8Q#me}8nklR2%YW7hDPbJoOrR)MXMYoq}| ziP+%bx+a*#VhDr|1*4kL<^pYz-pnKrqNjRPJgKVIne_eh&Ea8UIIN`H=Bj3O8FtZqa_2~ zYNW-UVO8+$ziyxIr~Azzn1Kv#&*k0~*5){%6BqNawsgnJ^?7933sP24+$<$v1U6SG zUX|mWmRa?_8igEUB1gu1nv*qXRN7o^TqyXl&FB@ZU%GF-2KB$;$J5hV4O8eVkAHlZ zYu(YWxmF&Y7R&VqsB%ciJf$TAhm4W_{;*pUd;9e5_Rsj%>f!Ogb%+))Y-a@1#atOl zE5^v2!E!NYoma57`bk)h>$t%DGdT6wiP!V(%j0T6`0@yU){8(Fe!HfN93pv)cVI)O zX4j;WA(ypra*VTl6}Gf0YS_NUNq-X)Q)rw_pz~>Dofa1{Z2tDwq*!Oa=RSo8@El{e z-54LZCv*Y!$eGkds6R+dKI-cuPhRL4z`or*qK0R`WmSrzF9;sxH>rkTj|ML`|J>a< z7iBE@-Y2CCFVS;%Ax59&m}c1O_9=sTKs8Q(-~;g<`FV8vCw|C#R5*<39De~$;P+1e z(d3ch2=D25aDvo19Yo^?jRAD}ks^?|~x< zJIm~uVV{(FSo>8tWdMIE5`}R1%DfVBNaQU%-AVJjzU*+MR(SFo1n)0?HwP(z)!*!@J_$m zINjVKwY*{!=O%@lNpOQ}>PnhiE`%V9CwqeYkO^%3C`9(25tyAySej9@w*#f3Fg&9A15j#HUDsL?@7Mn&G=(cu)*4`s2n6Y6s6S>wh?KT4e+QMq7}Q ztBX5MYe1KLDC>o2dmo^C0Q&T?8jvc)wNdhXtB8iHB+<|3(gsu9oX`%bJ0)PEESH~m@2 zZ|uw5j0i8E`+wfGz0-(njm~Ve>t1g}WLYC%&TzYtSxhMl9KHAn0_p&a)jp1dD)`*0Jydg#JPYd@m8PXF=uoJ_GR zoygUZ$olBQ`679u^E@;#^aM^Mlaa+0uBr2j(0z@?>3^*1Cx7QU?lF@6?X`hY|3gD3 z`(e0VHkV4ygA(Xq#ZBP3s6xm7y^jf7iP!$#+K+yA57@Yah&-Y`^j+hv7f!;EM-&hf&ul7!P+EVvMvd>I8Q-Z{(jc0|42?JlbsQh{=?e5%Gl#B1k6o!A`_^}bnr>(MSR$13_CCNL30h<#68eSH2^+V2QqOSf?COBL z;4v)`=1_ROs;w`NXi{Lp(q6W_W{PriWQdGqYuw-C*d-Zf=O#)sP8Hbf9qm1FS8Vkc qj3xV3vXl6`TX!>CM7QoXSS8ik5w9Z9j?6f53%FsWz5fAXYivC~Gs|lL delta 2419 zcmV-(35@oM6wwoqcYj-NZoL;}@q>Pw z+@NG--^-t~6^>e2fjLJ%`bt6R^``zv#i1cmtzmUTm^eggwtuw9Q$~1O2%hGYab++O z`#O(9AO*=%lJ5wg&rYfxtsj$9KxvQx;oss)ID4p*)E!zT%=+N*Wa9%GWIe$Z22FZ@$oRaf=A@#wHgmH*a zh_hWmE{ECFRem{&9582g3nRK?48$1-Fv-Xu6XZi0l5zoQ{2Z7)-GW=;iIgazk2U!RdW>!uJ&vPjRT(yp zi?OInK7SiPW)#t-lxSU;9cfAbH{a?8`~-7jo6Xi_q^!S_%Ux~&07>av0DYr5env4zIT1UjEa)oF2=!hhy(drgXE_Iv(Qd;rfecHNEffqOz1V2_+hU4S}y z?P37?x92O~ctZ-wCibLe2c7jgg~U_ns-Ec1dG8W5 zSnS{NArAZ~>;ONTcPp=(JAb5B)QsZ7re`}1tu|YN!YUisT2YAHEh8i)6)b+J-93R) za#Z^I?ZJW5N=PaprF1xQ$HVJSiTspkkmLyR)i8XM3=f*&)qGq9LEYdOW*rC4>YO0J zXiHKFeKp2w4d{{&ZM_ste9=3peeb>kz_P?uj?^*sNLLxTM9JM5rGMYyVWkc{E5Qd1 zxdC}Cvf9a}g7ai=Zy>yPtZo4(wnL11BKzG@|J9(%2E5k4!7SVRNcx>_#Ebs^Ea!av zUoqlMf06Pl_qsGA(#xm5_igVq5?7-$8$EZgS2D7k5in=C-KZ?4l_ic@+(ZF&09I?I zgVv2oCyddn`hVRO8i;l)C}-#Xi1iYdlt@6rBvY+n1|W==_9JPU?B|~fGKHaa5?@E5 zni9YFMe!u3*<@eTY^;pYH+MffZK;2AH)N)o??7VI#*^~Fgn@7VhBw|$_ZID_wMs6^=HA{r zY`GrBGo9PNTpTjkH=0UPXlQP
        • Installation
        • Tutorial
        • +
        • TIES MD API
        • Binding Free Energy Tutorial
        • Parallelization
          • TIES-OpenMM
          • @@ -105,16 +106,14 @@

            TIES-OpenMMCUDA device will then run 8 windows of the 1 replica. Equally ths could be spit into to separate runs of TIES MD masked to only see one device:

            -
            -

            Again using the configuration options total_reps=3 and reps_per_exec=1 the above runs 1 replica of each alchemical +

            Now sing the configuration options total_reps=3 and split_run=0 the above runs 3 replica of each alchemical window on a different GPU.

            For maximum parallelism we combine parallelizing over replicas and alchemical windows. For clarity we now consider the same example as above but now with 6 alchemical windows, 2 replica simulations and one simulation per GPU, so in -TIES.cfg global_lambdas=0.0, 0.1, 0.4, 0.6, 0.9, 1.0, total_reps=2 and reps_per_exec=1. To scale over multiple node +TIES.cfg global_lambdas=0.0, 0.1, 0.4, 0.6, 0.9, 1.0, total_reps=2 and split_run=1. To scale over multiple node we could use the resource allocator of the HPC for example jsrun on Summit. would allow us to run with 2 replicas of 6 windows as follows:

            -
            jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --node_id=0&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id=0&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id=0&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id=0&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id=0&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id=0&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --node_id=1&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --node_id=1&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --node_id=1&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --node_id=1&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --node_id=1&
            -jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --node_id=1&
            +
            jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=0&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=0&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=0&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=0&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=0&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=0&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=0,1 --rep_id=1&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=1,2 --rep_id=1&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=2,3 --rep_id=1&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=3,4 --rep_id=1&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=4,5 --rep_id=1&
            +jsrun --smpiargs="off" -n 1 -a 1 -c 1 -g 1 -b packed:1 ties_md --config_file=$ties_dir/TIES.cfg --exp_name='sys_solv' --windows_mask=5,6 --rep_id=1&
             

            Note here we do not set --devices as the masking of GPUs is handled by the resource allocator, this is not the general case. @@ -158,9 +157,9 @@

            TIES-OpenMM

            TIES-NAMD

            The parallelization of TIES in NAMD2 follows the same ideas as OpenMM above. We want to run independent simulations -for all alchemical window and replica simulations. To achieve parallelization over replica simulations there are two options. -If in TIES.cfg total_reps==reps_per_exec the submission script that TIES_MD writes will use the NAMD option -+replicas X this makes each NAMD run X replicas and the run lines in sub.sh will look something like:

            +for all alchemical window and replica simulations. If in TIES.cfg split_run=0 the submission script that +TIES_MD writes will use the NAMD option +replicas X this makes each NAMD run X replicas and the +run lines in sub.sh will look something like:

            for stage in {0..3}; do
             for lambda in 0.00 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1.0; do
                     srun -N $nodes_per_namd -n $cpus_per_namd namd2 +replicas 5 --tclmain run$stage-replicas.conf $lambda&
            @@ -170,7 +169,7 @@ 

            TIES-NAMDtotal_reps=!reps_per_exec with reps_per_exec=1 the run lines will look like:

            +

            Alternatively if split_run=1 the run lines will look like:

            for stage in {0..3}; do
             for lambda in 0.00 0.05 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95 1.0; do
             for i in {{0..4}}; do
            @@ -187,8 +186,8 @@ 

            TIES-NAMD+replicas 135 on ARCHER 2 with no crashes. In the two above examples the parallelism over alchemical windows is achieved in the loop over lambda.

            Using NAMD3 parallelization can be achieved like so (NAMD 3). NAMD in general has extensive options to provision -hardware and achieve parallelism, what have outlined here is not exhaustive and we would suggest consulting the documentation -for more a more comprehensive information.

            +hardware and achieve parallelism, what have outlined here is not exhaustive and we would suggest consulting +the documentation for more a more comprehensive information.

            diff --git a/docs/py-modindex.html b/docs/py-modindex.html index dee2596..a70dd1f 100644 --- a/docs/py-modindex.html +++ b/docs/py-modindex.html @@ -42,6 +42,7 @@
            • Installation
            • Tutorial
            • +
            • TIES MD API
            • Binding Free Energy Tutorial
            • Parallelization
            • HPC Submission scripts
            • diff --git a/docs/search.html b/docs/search.html index 1567a60..d80b6e8 100644 --- a/docs/search.html +++ b/docs/search.html @@ -42,6 +42,7 @@
              • Installation
              • Tutorial
              • +
              • TIES MD API
              • Binding Free Energy Tutorial
              • Parallelization
              • HPC Submission scripts
              • diff --git a/docs/searchindex.js b/docs/searchindex.js index 5e43be8..29f4ddc 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["HPC_submissions", "TIES_MD", "TIES_MD.eng_scripts", "TIES_MD.eng_scripts.cfg_scripts", "TIES_MD.eng_scripts.namd_sub", "TIES_MD.eng_scripts.namd_sub_split", "TIES_MD.eng_scripts.openmm_sub", "TIES_MD.eng_scripts.openmm_sub_split", "TIES_MD.openmmtools", "TIES_MD.ties_analysis", "TIES_MD.ties_analysis.engines", "TIES_MD.ties_analysis.methods", "binding_free_energies", "index", "install", "modules", "parallelization", "theory", "tutorial"], "filenames": ["HPC_submissions.rst", "TIES_MD.rst", "TIES_MD.eng_scripts.rst", "TIES_MD.eng_scripts.cfg_scripts.rst", "TIES_MD.eng_scripts.namd_sub.rst", "TIES_MD.eng_scripts.namd_sub_split.rst", "TIES_MD.eng_scripts.openmm_sub.rst", "TIES_MD.eng_scripts.openmm_sub_split.rst", "TIES_MD.openmmtools.rst", "TIES_MD.ties_analysis.rst", "TIES_MD.ties_analysis.engines.rst", "TIES_MD.ties_analysis.methods.rst", "binding_free_energies.rst", "index.rst", "install.rst", "modules.rst", "parallelization.rst", "theory.rst", "tutorial.rst"], "titles": ["HPC Submission scripts", "TIES_MD package", "TIES_MD.eng_scripts package", "TIES_MD.eng_scripts.cfg_scripts package", "TIES_MD.eng_scripts.namd_sub package", "TIES_MD.eng_scripts.namd_sub_split package", "TIES_MD.eng_scripts.openmm_sub package", "TIES_MD.eng_scripts.openmm_sub_split package", "TIES_MD.openmmtools package", "TIES_MD.ties_analysis package", "TIES_MD.ties_analysis.engines package", "TIES_MD.ties_analysis.methods package", "Binding Free Energy Tutorial", "Welcome to the TIES MD documentation.", "Installation", "TIES_MD", "Parallelization", "Theory", "Tutorial"], "terms": {"here": [0, 1, 14, 16, 17, 18], "we": [0, 1, 9, 10, 11, 12, 16, 17, 18], "provid": [0, 1, 14, 16, 17, 18], "some": [0, 1, 12, 14, 16, 17, 18], "exampl": [0, 1, 12, 14, 16, 17, 18], "variou": 0, "system": [0, 1, 8, 12, 13, 14, 16, 17, 18], "ti": [0, 9, 10, 12, 15, 17, 18], "md": [0, 12, 16, 17, 18], "attempt": [0, 14], "automat": [0, 18], "write": [0, 1, 12, 14, 16], "sensibl": 0, "namd2": [0, 1, 16, 18], "target": [0, 1, 14, 17, 18], "archer": [0, 16], "2": [0, 10, 12, 14, 16, 17, 18], "summit": [0, 1, 12, 16], "In": [0, 12, 14, 16, 18], "gener": [0, 9, 10, 13, 16, 17, 18], "user": [0, 1, 12, 14, 17, 18], "can": [0, 1, 8, 11, 12, 13, 14, 16, 17, 18], "make": [0, 1, 11, 12, 16], "own": [0, 12, 18], "whichev": 0, "cluster": [0, 12], "thei": [0, 1, 12], "prefer": 0, "To": [0, 12, 14, 16, 17, 18], "aid": 0, "expos": 0, "option": [0, 1, 8, 9, 10, 12, 16, 17, 18], "api": [0, 1, 12], "call": [0, 1, 12, 17, 18], "sub_head": [0, 12], "sub_run_lin": [0, 12], "The": [0, 1, 8, 12, 14, 16, 17, 18], "string": [0, 1, 9, 10, 11, 18], "pass": [0, 1, 11, 12, 16, 18], "inject": 0, "templat": 0, "all": [0, 1, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18], "ar": [0, 1, 8, 10, 11, 12, 13, 14, 16, 17, 18], "written": [0, 1, 18], "base": [0, 1, 8, 9, 10, 11, 13, 18], "directori": [0, 1, 10, 12, 14, 18], "sub": [0, 1, 16], "sh": [0, 14, 16], "an": [0, 1, 8, 10, 13, 14, 16, 17, 18], "thi": [0, 1, 8, 10, 11, 12, 13, 14, 16, 17, 18], "i": [0, 1, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18], "run": [0, 1, 9, 10, 13, 14, 16], "larg": 0, "100k": 0, "atom": [0, 1, 12, 17, 18], "supermuc": 0, "ng": 0, "bin": [0, 12, 14], "bash": [0, 12], "sbatch": 0, "job": [0, 1], "name": [0, 1, 8, 10, 12, 14, 18], "ligpair": [0, 12], "o": [0, 12], "x": [0, 1, 12, 14, 16, 17, 18], "j": [0, 12], "out": [0, 1, 12, 18], "e": [0, 1, 8, 10, 12, 17, 18], "err": 0, "d": [0, 1], "node": [0, 1, 16, 18], "130": 0, "task": 0, "per": [0, 1, 16, 18], "48": 0, "requeu": 0, "export": [0, 12, 14], "none": [0, 1, 8, 9, 11, 18], "get": [0, 1, 10, 12, 13], "env": 0, "account": 0, "xxx": 0, "partit": 0, "time": [0, 1, 10, 11, 12, 18], "10": [0, 12, 14, 18], "00": [0, 10, 14, 16, 18], "modul": [0, 14, 15], "load": [0, 14], "slurm_setup": 0, "14": [0, 1, 18], "gcc8": 0, "impi": 0, "nodes_per_namd": [0, 16], "cpus_per_namd": [0, 16], "480": 0, "echo": 0, "chang": [0, 1, 10, 12, 14, 17, 18], "line": [0, 1, 12, 13, 16], "point": [0, 1, 10, 11, 12, 18], "your": [0, 14], "project": 0, "ties_dir": [0, 12, 16], "hppf": 0, "work": [0, 1, 14, 16], "pn98ve": 0, "di67rov": 0, "test_ti": 0, "studi": [0, 18], "prot": [0, 10], "l2": 0, "l1": 0, "com": [0, 12, 14, 18], "cd": [0, 12, 14, 18], "replica": [0, 1, 10, 11, 12, 16, 18], "conf": [0, 1, 16, 18], "stage": [0, 1, 16, 18], "0": [0, 1, 8, 10, 12, 14, 16, 17, 18], "do": [0, 1, 10, 11, 12, 14, 16, 17, 18], "lambda": [0, 8, 10, 11, 12, 15, 16, 17, 18], "05": [0, 16, 17, 18], "1": [0, 1, 8, 10, 12, 14, 16, 17, 18], "4": [0, 12, 14, 16, 17, 18], "5": [0, 12, 16, 17, 18], "6": [0, 12, 14, 16, 17, 18], "7": [0, 12, 14, 16, 17, 18], "8": [0, 12, 14, 16, 17, 18], "9": [0, 12, 16, 17, 18], "95": [0, 16, 17, 18], "srun": [0, 16, 18], "n": [0, 12, 14, 16, 18], "tclmain": [0, 16, 18], "sleep": [0, 16, 18], "done": [0, 12, 16, 18], "wait": [0, 12, 16, 18], "first": [0, 17, 18], "20": [0, 13, 17], "could": [0, 14, 16, 18], "adapt": 0, "smaller": [0, 16], "10k": 0, "follow": [0, 12, 14, 16, 18], "13": [0, 12, 18], "45": 0, "micro": 0, "scale": [0, 16, 17], "up": [0, 9, 11, 12, 16, 18], "simul": [0, 1, 11, 12, 13, 14, 16, 17], "bsub": [0, 12], "p": [0, 12, 14], "w": [0, 1, 12], "nnode": [0, 12], "alloc_flag": [0, 12], "gpudefault": [0, 12], "smt1": [0, 12], "test": [0, 1, 8, 14, 16, 18], "otest": 0, "etest": 0, "ls_subcwd": 0, "path": [0, 1, 9, 10, 11, 12, 14, 17], "gpf": 0, "alpin": 0, "scratch": 0, "adw62": [0, 14], "chm155": 0, "ties_test": 0, "miniconda": [0, 14], "ties_md": [0, 12, 13, 14, 16, 18], "ethan": [0, 18], "zero_sum": [0, 18], "leg1": 0, "cuda": [0, 1, 14, 16], "168": 0, "date": [0, 18], "jsrun": [0, 12, 16], "smpiarg": [0, 12, 16], "off": [0, 12, 14, 16, 18], "c": [0, 12, 14, 16], "g": [0, 1, 12, 16, 17, 18], "b": [0, 12, 14, 16, 17], "pack": [0, 12, 16], "config_fil": [0, 1, 9, 12, 16, 18], "cfg": [0, 1, 9, 12, 16, 18], "exp_nam": [0, 1, 12, 16, 18], "sys_solv": [0, 16, 18], "windows_mask": [0, 1, 12, 16, 18], "node_id": [0, 1, 12, 16, 18], "namd3": [0, 1, 16, 18], "thetagpu": [0, 16], "cobalt": 0, "A": [0, 1, 8, 12, 14, 17, 18], "t": [0, 1], "100": 0, "q": 0, "full": 0, "mpirun": 0, "lu": 0, "theta": 0, "fs0": 0, "softwar": [0, 13], "openmpi": 0, "compbioaffin": 0, "awad": 0, "namd_3": 0, "0alpha9_linux": 0, "x86_64": [0, 14], "multicor": 0, "node1": 0, "sed": 0, "1q": 0, "cobalt_nodefil": 0, "node2": 0, "2q": 0, "many_rep": 0, "mcl1": 0, "l18": 0, "l39": 0, "host": 0, "cpu": [0, 1, 14, 18], "set": [0, 1, 8, 9, 12, 14, 16, 17, 18], "bind": [0, 1, 13, 17, 18], "core": [0, 18], "np": [0, 1, 10, 11], "devic": [0, 1, 16, 18], "30": 0, "40": 0, "50": [0, 18], "60": 0, "70": 0, "80": [0, 14], "90": 0, "alchem": [0, 1, 8, 12, 13, 14, 16, 18], "window": [0, 1, 10, 11, 16, 17, 18], "us": [0, 1, 8, 10, 11, 12, 13, 14, 16, 17, 18], "onli": [0, 16, 18], "each": [0, 1, 10, 11, 12, 16, 17, 18], "addition": 0, "gpu": [0, 1, 14, 16, 18], "idl": 0, "For": [0, 16, 17, 18], "real": 0, "world": 0, "applic": [0, 17, 18], "need": [0, 1, 12, 14, 16, 17, 18], "current": [0, 1, 18], "build": [0, 1, 9, 10, 12, 13, 14, 18], "creat": [0, 1, 16, 17, 18], "python": [0, 14, 16, 18], "veri": 0, "help": [0, 1], "would": [0, 16, 18], "allow": [0, 1, 10, 14, 16, 18], "u": [0, 1, 12, 16], "import": [0, 12], "__name__": 0, "__main__": 0, "acc_nam": 0, "how": [0, 1, 16, 17, 18], "mani": [0, 1, 16, 18], "want": [0, 1, 10, 11, 12, 14, 16], "what": [0, 1, 10, 11, 12, 16, 17, 18], "thermodynam": [0, 11, 12, 13, 14, 17], "leg": [0, 1, 10, 12, 18], "mai": [0, 1, 12, 18], "have": [0, 8, 12, 14, 16, 18], "differ": [0, 1, 8, 10, 11, 12, 14, 16, 18], "wall": 0, "where": [0, 1, 9, 10, 11, 14, 18], "binari": 0, "namd3_ex": 0, "cwd": [0, 1, 12], "getcwd": [0, 12], "give": [0, 12], "lig": [0, 10, 12], "wall_tim": 0, "els": [0, 11], "open": [0, 13], "join": [0, 12], "thetagpu_": 0, "format": [0, 1, 9, 10, 18], "f": 0, "header": [0, 1, 12], "instal": [0, 13, 18], "locat": [0, 1, 10, 16, 18], "read": [0, 1, 8, 9, 10, 11, 12, 14, 18], "file": [0, 1, 9, 10, 11, 12, 16, 17, 18], "rang": [0, 1, 16], "move": [0, 18], "iter": [0, 1, 10, 12], "over": [0, 1, 10, 12, 16, 18], "minim": [0, 1, 18], "nvt": [0, 1, 18], "eq": 0, "npt": [0, 1, 18], "product": [0, 1, 18], "run0": 0, "run1": 0, "run2": 0, "run3": 0, "count": 0, "lam": [0, 1], "rep": [0, 1, 10, 11], "2f": [0, 1], "number": [0, 1, 10, 11, 18], "next": [0, 12], "when": [0, 1, 12, 16, 17, 18], "fill": [0, 18], "sure": [0, 12], "between": [0, 1, 11, 12, 14, 16, 17, 18], "sim": [0, 1], "finish": [0, 1, 12, 18], "eng_script": [1, 15], "cfg_script": [1, 2], "namd_sub": [1, 2], "namd_sub_split": [1, 2], "openmm_sub": [1, 2], "openmm_sub_split": [1, 2], "openmmtool": [1, 14, 15], "alchemi": [1, 15], "ties_analysi": [1, 15, 18], "engin": [1, 9, 18], "namd": [1, 9, 13, 17, 18], "openmm": [1, 8, 9, 12, 13, 18], "method": [1, 9, 10, 12, 13, 16, 17, 18], "fep": [1, 9, 10, 14, 18], "config": [1, 12, 15, 16, 17, 18], "class": [1, 8, 9, 10, 11, 18], "run_typ": [1, 12, 18], "period": [1, 18], "true": [1, 8, 11], "platform": [1, 14], "kwarg": [1, 8], "object": [1, 8, 9, 10, 11], "control": [1, 16, 17, 18], "protocol": [1, 12, 13, 14], "initi": [1, 12], "variabl": [1, 8], "function": [1, 8, 9, 10, 11, 18], "start": [1, 13, 14, 16], "input": [1, 11, 12, 13, 17], "script": [1, 12, 13, 16, 18], "paramet": [1, 8, 9, 10, 11, 17, 18], "str": [1, 8, 9, 10], "experi": [1, 12, 18], "complex": [1, 12, 18], "pdb": [1, 12, 18], "prmtop": [1, 18], "flag": 1, "sai": 1, "should": [1, 11, 14, 16, 17, 18], "dynam": [1, 16, 18], "list": [1, 10, 11, 17, 18], "int": [1, 10, 11, 18], "which": [1, 8, 10, 11, 12, 14, 16, 17, 18], "float": [1, 8, 10, 11, 17, 18], "id": [1, 10, 14], "denot": [1, 18], "execut": [1, 12, 16, 18], "contain": [1, 9, 10, 11, 12, 17, 18], "end": [1, 11, 16, 17], "boolean": [1, 11], "determin": [1, 14, 17, 18], "custom": [1, 14], "schedul": [1, 10, 11, 12, 17, 18], "sting": 1, "valu": [1, 8, 10, 11, 12, 14, 16, 17, 18], "opencl": [1, 14], "dict": [1, 9, 11], "from": [1, 8, 10, 11, 12, 16, 17, 18], "properti": 1, "box_typ": [1, 18], "type": [1, 18], "box": [1, 16, 18], "being": [1, 8, 16, 17, 18], "cube": [1, 18], "truncatedoctahedron": [1, 18], "rhombicdodecahedron": [1, 18], "na": [1, 18], "manual": [1, 18], "return": [1, 8, 9, 10, 11, 14], "build_results_dir": 1, "folder": [1, 18], "helper": [1, 10], "output": [1, 10, 11, 14, 16, 18], "param": [1, 9], "elec_edg": [1, 17, 18], "electrostat": [1, 17, 18], "potenti": [1, 10, 11, 18], "begin": [1, 17, 18], "stop": [1, 18], "appear": [1, 10, 17, 18], "molecular": [1, 16, 18], "go": 1, "get_opt": [1, 9, 12], "print": [1, 9, 12], "global_lambda": [1, 16, 17, 18], "global": [1, 8, 18], "parallel": [1, 13, 18], "setup": [1, 9, 13, 18], "split_run": 1, "tiesmd": [1, 12], "subset": 1, "bool": [1, 10, 11], "split": 1, "ster_edg": [1, 17, 18], "lennard_jon": [1, 18], "update_cfg": [1, 12], "after": [1, 18], "made": [1, 18], "write_analysis_cfg": 1, "configur": [1, 12, 14, 16, 18], "analysi": [1, 9, 10, 11, 13, 14], "write_namd_eq": 1, "eq1": 1, "eq2": 1, "equilibr": [1, 18], "write_namd_min": 1, "eq0": 1, "write_namd_prod": 1, "sim1": 1, "write_namd_script": 1, "write_namd_submiss": 1, "submiss": [1, 12, 13, 16, 18], "hpc": [1, 12, 13, 16, 18], "archer2": 1, "write_openmm_submiss": 1, "get_box_vector": 1, "comput": [1, 11, 12, 14, 18], "vector": [1, 18], "know": 1, "edg": [1, 18], "length": [1, 18], "defin": [1, 8, 18], "bix": 1, "unit": [1, 8, 10, 11, 18], "angstrom": [1, 8, 18], "vec3": 1, "basi": 1, "get_header_and_run": 1, "namd_vers": [1, 10], "num_window": 1, "prep": [1, 12, 18], "inspect": [1, 10, 12], "best": [1, 17], "guess": 1, "version": [1, 8, 10, 14], "ani": [1, 10, 12, 14, 16, 18], "one": [1, 10, 11, 12, 16, 17, 18], "nice_print": [1, 9], "pad": [1, 9], "read_config": [1, 9, 12], "disk": [1, 12], "arg": [1, 8], "alchsi": 1, "temperatur": [1, 10, 11, 18], "pressur": [1, 18], "constraint_fil": [1, 18], "constraint_column": [1, 18], "basis_vector": 1, "input_typ": [1, 18], "amber": [1, 18], "absolut": 1, "fals": [1, 8, 11], "debug": 1, "free": [1, 11, 13, 16, 17, 18], "energi": [1, 11, 13, 16, 17, 18], "calcul": [1, 10, 11, 12, 13, 14, 16, 18], "thermostat": [1, 18], "barostat": [1, 18], "detail": [1, 12, 17, 18], "constraint": [1, 12, 18], "beta": 1, "occup": [1, 18], "column": [1, 18], "mbar": [1, 11], "explicit": 1, "cell": [1, 16, 18], "pme": 1, "cutoffnonperiod": 1, "remov": [1, 10, 11], "forc": [1, 14], "nonbond": 1, "note": [1, 12, 16, 18], "gromac": 1, "add_consraint": 1, "add": [1, 18], "constrain": [1, 18], "dure": [1, 18], "construct": [1, 18], "boundari": 1, "condit": 1, "amend_original_posit": 1, "posit": [1, 18], "updat": [1, 10, 12, 14], "store": [1, 9], "clash": 1, "found": [1, 12, 17, 18], "initialis": 1, "build_simul": 1, "device_id": 1, "take": [1, 12, 16, 17, 18], "index": [1, 10, 18], "integr": [1, 11, 13, 14, 17], "debug_forc": 1, "while": 1, "maintain": 1, "ensembl": [1, 16, 18], "modifi": [1, 8, 12, 18], "get_gradi": 1, "val": 1, "context": [1, 8], "h": 1, "analitic_ster": 1, "gradient": [1, 10, 11, 18], "r": 1, "eg": 1, "lambda_electrostatics_appear": 1, "finit": [1, 17], "analyt": 1, "steric": 1, "experiment": 1, "numer": [1, 11, 16], "get_intersect_angl": 1, "appear_idx": 1, "disappear_idx": 1, "idx": 1, "angl": 1, "straddl": 1, "region": 1, "dissapear": 1, "get_intersect_bond": 1, "bond": 1, "get_intersect_tors": 1, "torsion": 1, "disappear": [1, 10, 17, 18], "rebuild_tors": 1, "intersect_tors": 1, "rebuild": 1, "without": [1, 16, 18], "non": [1, 17, 18], "physic": [1, 13, 17, 18], "fulli": [1, 17], "result": [1, 10, 11, 12, 14, 16, 18], "nan": 1, "eval": 1, "refer": [1, 14, 16, 17, 18], "set_context_to_st": 1, "param_v": 1, "see": [1, 12, 13, 16, 18], "shift_alchemical_posit": 1, "small": [1, 17, 18], "pertub": 1, "resolv": 1, "caus": [1, 12], "overlap": [1, 11], "test_sim": 1, "find": 1, "undefin": [1, 8], "pdb_line": 1, "let": 1, "address": 1, "readabl": 1, "system_id": 1, "inform": [1, 10, 11, 13, 14, 16, 17, 18], "repeat": [1, 16], "total": [1, 16, 18], "add_simulation_report": 1, "total_step": 1, "save": [1, 11, 18], "report": 1, "step": [1, 12, 14, 17], "dcd": 1, "equilibri": 1, "save_fil": 1, "perform": [1, 10, 11, 12, 14, 18], "state": [1, 8, 11, 17, 18], "indic": 1, "whether": 1, "ha": [1, 8, 14, 16, 18], "get_alchemical_atom": 1, "pdb_file": 1, "pull": 1, "temp": [1, 10, 11, 14], "factor": [1, 18], "logic": 1, "get_constraint": 1, "fuction": 1, "row": 1, "data": [1, 10, 11], "strength": 1, "relax": 1, "preproduct": [1, 18], "equili_step": 1, "equili_state_fil": 1, "meta": 1, "wrap": 1, "togeth": 1, "equilib": 1, "remove_simulation_report": 1, "strip": 1, "simulate_system": 1, "alch_si": 1, "mask": [1, 16], "niter": 1, "steps_per_it": 1, "1000": 1, "main": [1, 9, 18], "Will": 1, "assign": 1, "worker": 1, "pre": [1, 18], "collect": [1, 10, 13], "requir": [1, 8, 18], "grad": [1, 11], "sampl": [1, 10, 11, 13, 17, 18], "much": [1, 18], "argv": 1, "entri": [1, 11, 18], "program": [1, 12, 17, 18], "command": [1, 12, 13, 14, 16], "argument": [1, 12], "global_lamb": 1, "fraction": 1, "electr": 1, "kei": [1, 18], "lambda_": 1, "_": [1, 8], "termin": [1, 9, 12, 14], "update_attrs_from_schedul": [1, 10], "attribut": 1, "self": [1, 10, 11], "lambda_sterics_appear": [1, 10], "appear_func": 1, "evalu": 1, "two": [1, 12, 13, 16, 17, 18], "y": [1, 17, 18], "disappear_func": 1, "get_lin": 1, "global_lam": 1, "numpi": [1, 10, 11], "arrai": [1, 10, 11], "interpol": 1, "across": [1, 16], "except": 8, "alchemicalstateerror": 8, "globalparametererror": 8, "error": [8, 11, 14, 16], "rais": 8, "alchemicalst": 8, "modifiedabsolutealchemicalfactori": 8, "consistent_except": 8, "switch_width": 8, "quantiti": 8, "alchemical_pme_treat": 8, "exact": [8, 18], "alchemical_rf_treat": 8, "switch": 8, "disable_alchemical_dispersion_correct": 8, "split_alchemical_forc": 8, "absolutealchemicalfactori": 8, "super": 8, "modifiedalchemicalst": 8, "parameters_name_suffix": 8, "globalparameterst": 8, "apply_to_context": 8, "put": [8, 12], "If": [8, 12, 14, 16, 18], "doe": [8, 12, 14, 18], "apply_to_system": 8, "check_system_consist": 8, "check": 8, "It": [8, 18], "consist": 8, "classmethod": 8, "from_system": 8, "constructor": 8, "specifi": [8, 10, 11, 16, 18], "search": 8, "parameter_nam": 8, "repres": 8, "same": [8, 12, 16, 18], "get_alchemical_vari": 8, "variable_nam": 8, "warn": 8, "deprec": 8, "get_function_vari": 8, "instead": [8, 14], "variable_valu": 8, "enter": 8, "mathemat": 8, "express": 8, "alchemicalfunct": 8, "enslav": 8, "arbitrari": 8, "lambda_angl": 8, "interv": 8, "standard": [8, 11, 18], "lambda_bond": 8, "lambda_electrostat": 8, "lambda_ster": 8, "lambda_tors": 8, "set_alchemical_paramet": 8, "new_valu": 8, "given": [8, 18], "those": 8, "remain": 8, "new": [8, 10, 12], "set_alchemical_vari": 8, "set_function_vari": 8, "analysis_cfg": 9, "hold": [9, 10], "chose": 9, "win_mask": 10, "distribut": [10, 11], "rep_convg": [10, 11], "sampling_convg": [10, 11], "vdw_a": 10, "vdw_d": 10, "ele_a": 10, "ele_d": 10, "dir": 10, "writen": [10, 18], "dg": [10, 11], "individu": [10, 11, 12, 16], "intermedi": [10, 17], "you": [10, 12, 14, 18], "wish": [10, 12, 14, 18], "converg": 10, "amount": 10, "describ": 10, "vdw": 10, "elec": 10, "alch": [10, 15], "collate_data": 10, "data_root": 10, "protein": [10, 12, 13, 17, 18], "ligand": [10, 12, 13, 17, 18], "thermo": 10, "run_analysi": 10, "kelvin": [10, 11, 18], "implement": [10, 13, 16, 17], "stdev": 10, "get_it": 10, "file_loc": 10, "get_replica": 10, "sort": 10, "specif": [10, 13, 17, 18], "rep0": 10, "get_window": 10, "lambda_0": 10, "read_alch_fil": 10, "file_path": 10, "namd_ver": 10, "ver": 10, "old": 10, "look": [10, 11, 14, 16, 18], "12": [10, 12], "about": [10, 11, 18], "easili": 10, "queryabl": 10, "etc": 10, "fep_combine_rep": 10, "openmm_ti": [10, 18], "combin": [10, 16], "seri": [10, 11], "concaten": 10, "mbar_analysi": 11, "analysis_dir": 11, "decorrel": 11, "averag": 11, "befor": 11, "process": 11, "u_kln": 11, "n_k": 11, "mask_window": 11, "rep_id": 11, "matrix": 11, "associ": [11, 12, 17, 18], "decorrelate_data": 11, "decorrol": 11, "turpl": 11, "plot_overlap_mat": 11, "mat": 11, "plot": [11, 17], "replica_analysi": 11, "consid": [11, 16, 17, 18], "trajectori": 11, "bootstrap": 11, "sem": [11, 12], "ti_analysi": 11, "deviat": [11, 18], "intergr": 11, "lambda_paramet": 11, "varianc": 11, "plot_du_by_dl": 11, "du": 11, "dlam": 11, "v": [11, 14], "includ": [11, 12, 17], "ci": 11, "compute_bs_error": 11, "var": 11, "boot": 11, "strap": 11, "get_lam_diff": 11, "lambda_arrai": 11, "adjac": 11, "discuss": [12, 16], "section": [12, 13, 14, 18], "outlin": [12, 13, 16, 18], "shorten": 12, "respect": [12, 18], "transform": [12, 14, 17, 18], "anoth": [12, 17], "water": 12, "now": [12, 16], "insid": 12, "\u03b4": 12, "g_": 12, "mutation1": 12, "mutation2": 12, "equal": [12, 16, 18], "\u03b4\u03b4": 12, "idea": [12, 16], "relat": 12, "shown": [12, 17, 18], "figur": [12, 17], "more": [12, 13, 16, 17, 18], "public": [12, 17], "cournia": 12, "et": 12, "al": 12, "whole": 12, "cycl": 12, "must": [12, 14, 18], "hand": 12, "ties20": [12, 17, 18], "principl": 12, "addit": [12, 16], "howev": [12, 16], "normal": 12, "avoid": 12, "rapid": 12, "crystal": 12, "structur": [12, 18], "conform": 12, "earli": 12, "close": 12, "contact": 12, "also": [12, 14, 16, 18], "so": [12, 14, 16, 18], "expens": 12, "computation": 12, "recommend": [12, 17, 18], "design": 12, "both": [12, 18], "parameter": 12, "hybrid": [12, 17], "browser": 12, "altern": [12, 16, 18], "pair": 12, "ligand_ff_nam": 12, "gaff2": 12, "ligand_net_charg": 12, "md_engin": 12, "liganda": 12, "mol2": 12, "antechamber_prepare_mol2": 12, "ligandb": 12, "ensur": [12, 14, 16, 18], "make_atom_names_uniqu": 12, "turn": [12, 18], "superimpos": 12, "sinc": 12, "declar": 12, "prepare_input": 12, "receptor": 12, "protein_ff": 12, "leaprc": 12, "ff14sb": 12, "re": 12, "prepar": [12, 13], "built": [12, 13, 17, 18], "order": [12, 14], "via": 12, "At": 12, "map": 12, "thermodynamic_leg": [12, 18], "wa": [12, 14, 18], "seen": 12, "good": [12, 18], "default": [12, 14, 18], "quickli": 12, "cli": [12, 15], "thermo_leg": 12, "args_dict": 12, "reps_per_exec": [12, 16, 18], "total_rep": [12, 16, 18], "chm155_001": 12, "120": 12, "oligpair": 12, "eligpair": 12, "expr": 12, "abov": [12, 14, 16, 18], "intern": 12, "yield": [12, 14], "3": [12, 13, 14, 16, 17, 18], "11": [12, 14], "These": [12, 14, 16, 17, 18], "onc": 12, "last": 12, "ties_ana": [12, 18], "Then": [12, 14], "our": [12, 13, 16, 18], "like": [12, 14, 16, 18], "minu": 12, "care": 12, "compar": 12, "depend": [12, 18], "again": [12, 16], "dat": [12, 18], "packag": [13, 14, 15, 18], "stand": 13, "enhanc": [13, 17], "accur": 13, "reproduc": 13, "rel": [13, 17], "pleas": [13, 18], "theori": 13, "within": [13, 14, 18], "avail": [13, 14, 16, 18], "onlin": [13, 18], "sourc": [13, 18], "explain": 13, "websit": 13, "builder": 13, "linux": 13, "ppc64le": 13, "tutori": [13, 14], "bfe": 13, "background": 13, "pathwai": [13, 18], "github": [13, 14, 16, 18], "conda": 14, "manag": 14, "assum": 14, "wget": 14, "http": [14, 18], "repo": 14, "continuum": 14, "io": 14, "miniconda3": 14, "latest": 14, "chmod": 14, "prefix": [14, 18], "match": 14, "machin": 14, "permiss": 14, "final": 14, "page": [14, 16, 18], "With": [14, 18], "forg": 14, "verifi": 14, "m": 14, "testinstal": 14, "older": 14, "simtk": 14, "instanc": [14, 16, 18], "wrong": 14, "cudatoolkit": 14, "happen": 14, "produc": [14, 18], "git": [14, 18], "revis": 14, "130124a3f9277b054ec40927360a6ad20c8f5fa6": 14, "There": [14, 18], "successfulli": 14, "cuda_error_unsupported_ptx_vers": 14, "222": 14, "median": 14, "30571e": 14, "06": 14, "76359e": 14, "05194e": 14, "07": 14, "toler": 14, "critic": [14, 16], "correct": [14, 18], "replac": 14, "particular": [14, 18], "One": 14, "appropri": 14, "nvidia": 14, "smi": 14, "460": 14, "driver": 14, "persist": 14, "bu": 14, "disp": 14, "volatil": 14, "uncorr": 14, "ecc": 14, "fan": 14, "perf": 14, "pwr": 14, "usag": 14, "cap": 14, "memori": 14, "util": [14, 18], "mig": 14, "quadro": 14, "m1000m": 14, "00000000": 14, "01": 14, "50c": 14, "p5": 14, "435mib": 14, "2002mib": 14, "top": 14, "right": 14, "my": [14, 18], "correctli": 14, "download": [14, 18], "clone": [14, 18], "ucl": [14, 18], "cc": [14, 18], "pymabr": 14, "therefor": [14, 18], "until": 14, "around": 14, "copi": 14, "elsewher": 14, "skip": 14, "And": 14, "mkdir": 14, "openmmtools_instal": 14, "powerpc": 14, "pip": 14, "featur": 14, "tree": 14, "subpackag": 15, "content": 15, "submodul": [15, 18], "domain": 16, "kind": 16, "spatial": 16, "were": 16, "decompos": 16, "difficult": 16, "achiev": [16, 18], "than": 16, "ones": 16, "focu": 16, "aleator": 16, "inher": 16, "chaotic": 16, "commun": 16, "other": 16, "embarrassingli": 16, "problem": [16, 18], "easi": 16, "likewis": 16, "remaind": 16, "explor": 16, "th": 16, "spit": 16, "separ": [16, 17, 18], "tell": [16, 18], "otherwis": 16, "ident": 16, "uniqu": [16, 18], "further": 16, "inclus": 16, "exclus": 16, "maximum": 16, "clariti": 16, "multipl": [16, 18], "resourc": 16, "alloc": 16, "handl": 16, "case": [16, 18], "messag": 16, "interfac": 16, "mpi": 16, "vari": [16, 18], "univers": 16, "solut": [16, 18], "independ": [16, 18], "someth": [16, 18], "notic": [16, 18], "loop": [16, 18], "65": 16, "anecdot": 16, "less": 16, "crash": 16, "135": 16, "extens": 16, "provis": 16, "hardwar": 16, "exhaust": 16, "suggest": [16, 18], "consult": [16, 17, 18], "document": [16, 17, 18], "comprehens": 16, "molecul": [17, 18], "coval": 17, "dual": 17, "topologi": [17, 18], "approach": 17, "complementari": 17, "involv": [17, 18], "chemic": 17, "moieti": 17, "destroi": 17, "stratifi": 17, "along": 17, "chosen": 17, "keep": 17, "track": 17, "\u03bb": [17, 18], "As": [17, 18], "three": [17, 18], "tune": 17, "wai": 17, "comma": [17, 18], "exactli": [17, 18], "lennard": 17, "jone": 17, "lj": 17, "interact": 17, "second": [17, 18], "graphic": 17, "guid": 17, "intend": 18, "submit": 18, "expect": 18, "code": 18, "navig": 18, "essenti": 18, "support": 18, "them": 18, "place": 18, "understand": 18, "renam": 18, "anyth": 18, "fix": 18, "novel": 18, "desir": 18, "occasion": 18, "alongsid": 18, "valid": 18, "300": 18, "atmospher": 18, "4n": 18, "sampling_per_window": 18, "nanosecond": 18, "2n": 18, "equili_per_window": 18, "estim": 18, "least": 18, "evoc": 18, "parallelis": 18, "space": 18, "con": 18, "beta_factor": 18, "edge_length": 18, "nanomet": 18, "cell_basis_vec1": 18, "cell_basis_vec2": 18, "cell_basis_vec3": 18, "simpl": 18, "imag": 18, "show": 18, "appli": 18, "alwai": 18, "leap": 18, "log": 18, "preform": 18, "popul": 18, "size": 18, "typic": 18, "possibli": 18, "drug": 18, "solvent": 18, "later": 18, "why": 18, "present": 18, "almost": 18, "readi": 18, "invok": 18, "just": 18, "taken": 18, "either": 18, "halt": 18, "advanc": 18, "below": 18, "silent": 18, "ignor": 18, "integ": 18, "request": 18, "By": 18, "intens": 18, "pc": 18, "head": 18, "lambda_x": 18, "repi": 18, "analys": 18, "zero": 18, "sum": 18, "smallest": 18, "branch": 18, "mind": 18, "6x1": 18, "lot": 18, "calcualt": 18, "128": 18, "might": 18, "explicitli": 18, "wide": 18, "solv": 18, "issu": 18, "miss": 18, "under": 18, "exp": 18, "theoret": 18, "\u03b4g": 18, "kcal": 18, "mol": 18, "unknown": 18, "measur": 18, "left": 18, "becaus": 18, "carri": 18, "special": 18, "infer": 18, "dictionari": 18, "methodologi": 18, "openmm_fep": 18, "023": 18, "003": 18, "076": 18}, "objects": {"": [[1, 0, 0, "-", "TIES_MD"]], "TIES_MD": [[1, 0, 0, "-", "TIES"], [1, 0, 0, "-", "alch"], [1, 0, 0, "-", "cli"], [2, 0, 0, "-", "eng_scripts"], [1, 0, 0, "-", "lambdas"], [8, 0, 0, "-", "openmmtools"], [9, 0, 0, "-", "ties_analysis"]], "TIES_MD.TIES": [[1, 1, 1, "", "TIES"], [1, 4, 1, "", "get_box_vectors"], [1, 4, 1, "", "get_header_and_run"], [1, 4, 1, "", "nice_print"], [1, 4, 1, "", "read_config"]], "TIES_MD.TIES.TIES": [[1, 2, 1, "", "box_type"], [1, 3, 1, "", "build_results_dirs"], [1, 2, 1, "", "elec_edges"], [1, 2, 1, "", "engine"], [1, 3, 1, "", "get_options"], [1, 2, 1, "", "global_lambdas"], [1, 3, 1, "", "run"], [1, 3, 1, "", "setup"], [1, 2, 1, "", "split_run"], [1, 2, 1, "", "ster_edges"], [1, 3, 1, "", "update_cfg"], [1, 3, 1, "", "write_analysis_cfg"], [1, 3, 1, "", "write_namd_eq"], [1, 3, 1, "", "write_namd_min"], [1, 3, 1, "", "write_namd_prod"], [1, 3, 1, "", "write_namd_scripts"], [1, 3, 1, "", "write_namd_submissions"], [1, 3, 1, "", "write_openmm_submission"]], "TIES_MD.alch": [[1, 1, 1, "", "AlchSys"], [1, 1, 1, "", "PDB_line"], [1, 1, 1, "", "System_ID"], [1, 4, 1, "", "add_simulation_reporters"], [1, 4, 1, "", "equilibriation"], [1, 4, 1, "", "get_alchemical_atoms"], [1, 4, 1, "", "get_constraints"], [1, 4, 1, "", "minimization"], [1, 4, 1, "", "preproduction"], [1, 4, 1, "", "remove_simulation_reporters"], [1, 4, 1, "", "simulate_system"]], "TIES_MD.alch.AlchSys": [[1, 3, 1, "", "add_consraints"], [1, 3, 1, "", "amend_original_positions"], [1, 3, 1, "", "build_simulation"], [1, 3, 1, "", "debug_force"], [1, 3, 1, "", "get_gradients"], [1, 3, 1, "", "get_intersect_angles"], [1, 3, 1, "", "get_intersect_bonds"], [1, 3, 1, "", "get_intersect_torsions"], [1, 3, 1, "", "rebuild_torsion"], [1, 3, 1, "", "set_context_to_state"], [1, 3, 1, "", "shift_alchemical_positions"], [1, 3, 1, "", "test_sim"]], "TIES_MD.cli": [[1, 4, 1, "", "main"]], "TIES_MD.eng_scripts": [[3, 0, 0, "-", "cfg_scripts"], [4, 0, 0, "-", "namd_sub"], [5, 0, 0, "-", "namd_sub_split"], [6, 0, 0, "-", "openmm_sub"], [7, 0, 0, "-", "openmm_sub_split"]], "TIES_MD.lambdas": [[1, 1, 1, "", "Lambdas"], [1, 4, 1, "", "appear_func"], [1, 4, 1, "", "disappear_func"], [1, 4, 1, "", "get_line"]], "TIES_MD.lambdas.Lambdas": [[1, 3, 1, "", "update_attrs_from_schedule"]], "TIES_MD.openmmtools": [[8, 0, 0, "-", "alchemy"]], "TIES_MD.openmmtools.alchemy": [[8, 5, 1, "", "AlchemicalStateError"], [8, 1, 1, "", "ModifiedAbsoluteAlchemicalFactory"], [8, 1, 1, "", "ModifiedAlchemicalState"]], "TIES_MD.openmmtools.alchemy.ModifiedAlchemicalState": [[8, 3, 1, "", "apply_to_context"], [8, 3, 1, "", "apply_to_system"], [8, 3, 1, "", "check_system_consistency"], [8, 3, 1, "", "from_system"], [8, 3, 1, "", "get_alchemical_variable"], [8, 3, 1, "", "get_function_variable"], [8, 6, 1, "", "lambda_angles"], [8, 6, 1, "", "lambda_bonds"], [8, 6, 1, "", "lambda_electrostatics"], [8, 6, 1, "", "lambda_sterics"], [8, 6, 1, "", "lambda_torsions"], [8, 3, 1, "", "set_alchemical_parameters"], [8, 3, 1, "", "set_alchemical_variable"], [8, 3, 1, "", "set_function_variable"]], "TIES_MD.ties_analysis": [[9, 0, 0, "-", "config"], [10, 0, 0, "-", "engines"], [11, 0, 0, "-", "methods"], [9, 0, 0, "-", "ties_analysis"]], "TIES_MD.ties_analysis.config": [[9, 1, 1, "", "Config"], [9, 4, 1, "", "read_config"]], "TIES_MD.ties_analysis.config.Config": [[9, 3, 1, "", "get_options"]], "TIES_MD.ties_analysis.engines": [[10, 0, 0, "-", "namd"], [10, 0, 0, "-", "openmm"]], "TIES_MD.ties_analysis.engines.namd": [[10, 1, 1, "", "NAMD"], [10, 4, 1, "", "get_iter"], [10, 4, 1, "", "get_replica"], [10, 4, 1, "", "get_window"], [10, 4, 1, "", "read_alch_file"]], "TIES_MD.ties_analysis.engines.namd.NAMD": [[10, 3, 1, "", "collate_data"], [10, 3, 1, "", "run_analysis"]], "TIES_MD.ties_analysis.engines.openmm": [[10, 1, 1, "", "Lambdas"], [10, 1, 1, "", "OpenMM"], [10, 4, 1, "", "get_replica"], [10, 4, 1, "", "get_window"]], "TIES_MD.ties_analysis.engines.openmm.Lambdas": [[10, 3, 1, "", "update_attrs_from_schedule"]], "TIES_MD.ties_analysis.engines.openmm.OpenMM": [[10, 3, 1, "", "collate_data"], [10, 3, 1, "", "run_analysis"]], "TIES_MD.ties_analysis.methods": [[11, 0, 0, "-", "FEP"], [11, 0, 0, "-", "TI"]], "TIES_MD.ties_analysis.methods.FEP": [[11, 1, 1, "", "MBAR_Analysis"]], "TIES_MD.ties_analysis.methods.FEP.MBAR_Analysis": [[11, 3, 1, "", "analysis"], [11, 3, 1, "", "decorrelate_data"], [11, 3, 1, "", "plot_overlap_mat"], [11, 3, 1, "", "replica_analysis"]], "TIES_MD.ties_analysis.methods.TI": [[11, 1, 1, "", "TI_Analysis"], [11, 4, 1, "", "compute_bs_error"], [11, 4, 1, "", "get_lam_diff"]], "TIES_MD.ties_analysis.methods.TI.TI_Analysis": [[11, 3, 1, "", "analysis"], [11, 3, 1, "", "intergrate"], [11, 3, 1, "", "plot_du_by_dl"]], "TIES_MD.ties_analysis.ties_analysis": [[9, 1, 1, "", "Analysis"], [9, 4, 1, "", "main"], [9, 4, 1, "", "nice_print"]], "TIES_MD.ties_analysis.ties_analysis.Analysis": [[9, 3, 1, "", "run"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:property", "3": "py:method", "4": "py:function", "5": "py:exception", "6": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "property", "Python property"], "3": ["py", "method", "Python method"], "4": ["py", "function", "Python function"], "5": ["py", "exception", "Python exception"], "6": ["py", "attribute", "Python attribute"]}, "titleterms": {"hpc": 0, "submiss": 0, "script": 0, "namd": [0, 10, 16], "openmm": [0, 10, 14, 16], "3": 0, "ties_md": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15], "packag": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "subpackag": [1, 2, 9], "submodul": [1, 8, 9, 10, 11], "ti": [1, 11, 13, 14, 16], "modul": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "alch": 1, "cli": 1, "lambda": 1, "content": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13], "eng_script": [2, 3, 4, 5, 6, 7], "cfg_script": 3, "namd_sub": 4, "namd_sub_split": 5, "openmm_sub": 6, "openmm_sub_split": 7, "openmmtool": 8, "alchemi": 8, "ties_analysi": [9, 10, 11], "config": 9, "engin": 10, "method": 11, "fep": 11, "bind": 12, "free": 12, "energi": 12, "tutori": [12, 18], "gener": 12, "bfe": 12, "background": 12, "setup": 12, "run": [12, 18], "analysi": [12, 18], "welcom": 13, "md": [13, 14], "document": 13, "code": 13, "instal": 14, "linux": 14, "ppc64le": 14, "parallel": 16, "theori": 17, "outlin": 17, "alchem": 17, "calcul": 17, "pathwai": 17, "get": 18, "start": 18, "input": 18, "command": 18, "line": 18, "simul": 18, "prepar": 18}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["API", "HPC_submissions", "TIES_MD", "TIES_MD.eng_scripts", "TIES_MD.eng_scripts.cfg_scripts", "TIES_MD.eng_scripts.namd_sub", "TIES_MD.eng_scripts.namd_sub_split", "TIES_MD.eng_scripts.openmm_sub", "TIES_MD.eng_scripts.openmm_sub_split", "TIES_MD.openmmtools", "TIES_MD.ties_analysis", "TIES_MD.ties_analysis.engines", "TIES_MD.ties_analysis.methods", "binding_free_energies", "index", "install", "modules", "parallelization", "theory", "tutorial"], "filenames": ["API.rst", "HPC_submissions.rst", "TIES_MD.rst", "TIES_MD.eng_scripts.rst", "TIES_MD.eng_scripts.cfg_scripts.rst", "TIES_MD.eng_scripts.namd_sub.rst", "TIES_MD.eng_scripts.namd_sub_split.rst", "TIES_MD.eng_scripts.openmm_sub.rst", "TIES_MD.eng_scripts.openmm_sub_split.rst", "TIES_MD.openmmtools.rst", "TIES_MD.ties_analysis.rst", "TIES_MD.ties_analysis.engines.rst", "TIES_MD.ties_analysis.methods.rst", "binding_free_energies.rst", "index.rst", "install.rst", "modules.rst", "parallelization.rst", "theory.rst", "tutorial.rst"], "titles": ["TIES MD API", "HPC Submission scripts", "TIES_MD package", "TIES_MD.eng_scripts package", "TIES_MD.eng_scripts.cfg_scripts package", "TIES_MD.eng_scripts.namd_sub package", "TIES_MD.eng_scripts.namd_sub_split package", "TIES_MD.eng_scripts.openmm_sub package", "TIES_MD.eng_scripts.openmm_sub_split package", "TIES_MD.openmmtools package", "TIES_MD.ties_analysis package", "TIES_MD.ties_analysis.engines package", "TIES_MD.ties_analysis.methods package", "Binding Free Energy Tutorial", "Welcome to the TIES MD documentation.", "Installation", "TIES_MD", "Parallelization", "Theory", "Tutorial"], "terms": {"can": [0, 1, 2, 9, 12, 13, 14, 15, 17, 18, 19], "us": [0, 1, 2, 9, 11, 12, 13, 14, 15, 17, 18, 19], "command": [0, 2, 13, 14, 15, 17], "line": [0, 1, 2, 13, 14, 17], "greater": 0, "autom": 0, "we": [0, 1, 2, 10, 11, 12, 13, 17, 18, 19], "also": [0, 13, 15, 17, 19], "provid": [0, 1, 2, 15, 17, 18, 19], "an": [0, 1, 2, 9, 11, 14, 15, 17, 18, 19], "expos": [0, 1], "some": [0, 1, 2, 13, 15, 17, 18, 19], "option": [0, 1, 2, 9, 10, 11, 13, 17, 18, 19], "mai": [0, 1, 2, 13, 19], "routin": 0, "chang": [0, 1, 2, 11, 13, 15, 18, 19], "dure": [0, 2, 19], "setup": [0, 2, 10, 14, 19], "here": [0, 1, 2, 13, 15, 17, 18, 19], "detail": [0, 2, 13, 18, 19], "all": [0, 1, 2, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19], "what": [0, 1, 2, 11, 12, 13, 17, 18, 19], "should": [0, 2, 12, 15, 17, 18, 19], "pass": [0, 1, 2, 12, 13, 17, 19], "The": [0, 1, 2, 9, 13, 15, 17, 18, 19], "were": [0, 17], "previous": 0, "class": [0, 2, 9, 10, 11, 12, 19], "like": [0, 13, 15, 17, 19], "so": [0, 13, 15, 17, 19], "from": [0, 2, 9, 11, 12, 13, 17, 18, 19], "ties_md": [0, 1, 13, 14, 15, 17, 19], "import": [0, 1, 13], "cwd": [0, 1, 2], "windows_mask": [0, 1, 2, 13, 17, 19], "0": [0, 1, 2, 9, 11, 13, 15, 17, 18, 19], "1": [0, 1, 2, 9, 11, 13, 15, 17, 18, 19], "rep_id": [0, 1, 2, 12, 17, 19], "exp_nam": [0, 1, 2, 17, 19], "sys_solv": [0, 1, 17, 19], "onc": [0, 13], "i": [0, 1, 2, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19], "construct": [0, 2, 19], "cfg": [0, 1, 2, 10, 13, 17, 19], "now": [0, 13, 17], "set": [0, 1, 2, 9, 10, 13, 15, 17, 18, 19], "attribut": [0, 2], "openmm": [0, 2, 9, 10, 13, 14, 19], "unit": [0, 2, 9, 11, 12, 19], "need": [0, 1, 2, 13, 15, 17, 18, 19], "valu": [0, 2, 9, 11, 12, 13, 15, 18, 19], "string": [0, 1, 2, 10, 11, 12, 19], "molecular": [0, 2, 17, 19], "dynam": [0, 2, 17, 19], "engin": [0, 2, 10, 19], "namd2": [0, 1, 2, 17, 19], "14": [0, 1, 2, 19], "namd3": [0, 1, 2, 17, 19], "target": [0, 1, 2, 15, 18, 19], "temperatur": [0, 2, 11, 12, 19], "thermostat": [0, 2, 19], "300": [0, 19], "kelvin": [0, 11, 12, 19], "pressur": [0, 2, 19], "barostat": [0, 2, 19], "atmospher": [0, 19], "how": [0, 1, 2, 17, 18, 19], "much": [0, 2, 19], "product": [0, 1, 2, 19], "sampl": [0, 2, 11, 12, 14, 18, 19], "run": [0, 1, 2, 10, 11, 14, 15, 17], "per": [0, 1, 2, 17, 19], "alchem": [0, 1, 2, 9, 13, 14, 15, 17, 19], "window": [0, 1, 2, 11, 12, 17, 18, 19], "4n": [0, 19], "recommend": [0, 13, 18, 19], "sampling_per_window": [0, 19], "04": 0, "nanosecond": [0, 19], "equilibr": [0, 2, 19], "2n": [0, 19], "equili_per_window": [0, 19], "002": 0, "list": [0, 2, 11, 12, 18, 19], "which": [0, 2, 9, 11, 12, 13, 15, 17, 18, 19], "estim": [0, 19], "method": [0, 2, 10, 11, 13, 14, 17, 18, 19], "fep": [0, 2, 10, 11, 15, 19], "mani": [0, 1, 2, 17, 19], "total": [0, 2, 17, 19], "replica": [0, 1, 2, 11, 12, 13, 17, 19], "each": [0, 1, 2, 11, 12, 13, 17, 18, 19], "ar": [0, 1, 2, 9, 11, 12, 13, 14, 15, 17, 18, 19], "least": [0, 19], "5": [0, 1, 17, 18, 19], "total_rep": [0, 13, 17, 19], "3": [0, 14, 15, 17, 18, 19], "boolean": [0, 2, 12, 19], "split": [0, 2, 19], "separ": [0, 17, 18, 19], "true": [0, 2, 9, 10, 12, 13], "maximum": [0, 17, 19], "parallel": [0, 2, 14, 19], "split_run": [0, 2, 13, 17, 19], "fals": [0, 2, 9, 12], "where": [0, 1, 2, 10, 11, 12, 15, 19], "lambda": [0, 1, 9, 11, 12, 13, 16, 17, 18, 19], "schedul": [0, 2, 11, 12, 13, 18, 19], "electrostat": [0, 2, 18, 19], "potenti": [0, 2, 11, 12, 19], "begin": [0, 2, 18, 19], "stop": [0, 2, 19], "appear": [0, 2, 11, 18, 19], "elec_edg": [0, 2, 18, 19], "lennard_jon": [0, 2, 19], "ster_edg": [0, 2, 18, 19], "global": [0, 2, 9, 19], "control": [0, 2, 17, 18, 19], "paramet": [0, 2, 9, 10, 11, 12, 18, 19], "take": [0, 2, 13, 17, 18, 19], "global_lambda": [0, 2, 17, 18, 19], "00": [0, 1, 11, 15, 17, 19], "05": [0, 1, 17, 18, 19], "2": [0, 1, 11, 15, 17, 18, 19], "4": [0, 1, 15, 17, 18, 19], "6": [0, 1, 13, 15, 17, 18, 19], "7": [0, 1, 15, 17, 18, 19], "8": [0, 1, 15, 17, 18, 19], "9": [0, 1, 17, 18, 19], "95": [0, 1, 17, 18, 19], "name": [0, 1, 2, 9, 11, 13, 15, 19], "pdb": [0, 2, 13, 19], "file": [0, 1, 2, 10, 11, 12, 13, 17, 18, 19], "constraint": [0, 2, 13, 19], "build": [0, 1, 2, 10, 11, 13, 14, 15, 19], "directori": [0, 1, 2, 11, 13, 15, 19], "e": [0, 1, 2, 9, 11, 13, 18, 19], "con": [0, 19], "constraint_fil": [0, 2, 19], "none": [0, 1, 2, 9, 10, 12, 19], "column": [0, 2, 19], "valid": [0, 19], "occup": [0, 2, 19], "beta_factor": [0, 19], "constraint_column": [0, 2, 19], "input": [0, 2, 12, 13, 14, 18], "type": [0, 2, 19], "onli": [0, 1, 17, 19], "amber": [0, 2, 19], "support": [0, 19], "input_typ": [0, 2, 19], "x": [0, 1, 2, 13, 15, 17, 18, 19], "y": [0, 2, 18, 19], "z": [0, 2], "float": [0, 2, 9, 11, 12, 18, 19], "box": [0, 2, 17, 19], "vector": [0, 2, 19], "thi": [0, 1, 2, 9, 11, 12, 13, 14, 15, 17, 18, 19], "simul": [0, 1, 2, 12, 13, 14, 15, 17, 18], "angstrom": [0, 2, 9, 19], "cell_basis_vec1": [0, 2, 19], "34": 0, "55": 0, "cell_basis_vec2": [0, 2, 19], "11": [0, 15], "516722937414105": 0, "32": 0, "574214501232206": 0, "cell_basis_vec3": [0, 2, 19], "16": 0, "287105279373797": 0, "28": 0, "21009840448772": 0, "final": [0, 15], "three": [0, 18, 19], "addit": [0, 13, 17], "don": 0, "t": [0, 1, 2], "A": [0, 1, 2, 9, 13, 15, 18, 19], "header": [0, 1, 2, 13], "submiss": [0, 2, 13, 14, 17, 19], "script": [0, 2, 13, 14, 17, 19], "written": [0, 1, 2, 19], "job": [0, 1, 2], "sub_head": [0, 1, 13], "exampl": [0, 1, 2, 13, 15, 17, 18, 19], "summit": [0, 1, 2, 13, 17], "bsub": [0, 1, 13], "p": [0, 1, 13, 15], "chm155_001": [0, 13], "w": [0, 1, 2, 13], "120": [0, 13], "nnode": [0, 1, 13], "13": [0, 1, 13, 19], "alloc_flag": [0, 1, 13], "gpudefault": [0, 1, 13], "smt1": [0, 1, 13], "j": [0, 1, 13], "ligpair": [0, 1, 13], "o": [0, 1, 13], "oligpair": [0, 13], "eligpair": [0, 13], "prefix": [0, 15, 19], "pre_run_lin": [0, 1, 13], "jsrun": [0, 1, 13, 17], "smpiarg": [0, 1, 13, 17], "off": [0, 1, 13, 15, 17, 19], "n": [0, 1, 13, 15, 17, 19], "c": [0, 1, 13, 15, 17], "g": [0, 1, 2, 13, 17, 18, 19], "b": [0, 1, 13, 15, 17, 18], "pack": [0, 1, 13, 17], "run_lin": [0, 1, 13], "config_fil": [0, 1, 2, 10, 13, 17, 19], "ties_dir": [0, 1, 13, 17], "expr": [0, 13], "node_id": [0, 13], "produc": [0, 15, 19], "look": [0, 11, 12, 15, 17, 19], "bin": [0, 1, 15], "bash": [0, 1], "export": [0, 1, 15], "liganda": [0, 13], "ligandb": [0, 13], "lig": [0, 1, 11, 13], "cd": [0, 1, 13, 15, 19], "10": [0, 1, 15], "12": [0, 11], "do": [0, 1, 2, 11, 12, 13, 15, 17, 18, 19], "done": [0, 1, 17, 19], "wait": [0, 1, 17, 19], "If": [0, 9, 13, 15, 17, 19], "make": [0, 1, 2, 12, 13, 17], "best": [0, 2, 18], "guess": [0, 2], "ideal": 0, "small": [0, 2, 18, 19], "modif": 0, "ani": [0, 2, 11, 13, 15, 17, 19], "tweak": 0, "appli": [0, 19], "get": [0, 1, 2, 11, 13, 14], "work": [0, 1, 2, 15, 17], "futur": 0, "system": [0, 1, 2, 9, 13, 14, 15, 17, 18, 19], "For": [0, 1, 17, 18, 19], "gener": [0, 1, 10, 11, 14, 17, 18, 19], "idea": [0, 13, 17], "see": [0, 2, 13, 14, 17, 19], "hpc": [0, 2, 13, 14, 17, 19], "variou": 1, "ti": [1, 10, 11, 13, 16, 18, 19], "md": [1, 13, 17, 18, 19], "attempt": [1, 15], "automat": [1, 13, 19], "write": [1, 2, 13, 15, 17], "sensibl": 1, "archer": [1, 17], "In": [1, 13, 15, 17, 19], "user": [1, 2, 13, 15, 18, 19], "own": [1, 13, 19], "whichev": 1, "cluster": [1, 13], "thei": [1, 2, 13], "prefer": 1, "To": [1, 13, 15, 17, 18, 19], "aid": 1, "api": [1, 2, 13, 14], "call": [1, 2, 13, 18, 19], "inject": 1, "templat": 1, "base": [1, 2, 9, 10, 11, 12, 14, 19], "sub": [1, 2, 17], "sh": [1, 15, 17], "larg": 1, "100k": 1, "atom": [1, 2, 13, 18, 19], "supermuc": 1, "ng": 1, "sbatch": 1, "out": [1, 2, 13, 19], "err": 1, "d": [1, 2], "node": [1, 2, 17, 19], "130": 1, "task": 1, "48": 1, "requeu": 1, "env": 1, "account": 1, "xxx": 1, "partit": 1, "time": [1, 2, 11, 12, 13, 19], "modul": [1, 15, 16], "load": [1, 15], "slurm_setup": 1, "gcc8": 1, "impi": 1, "nodes_per_namd": [1, 17], "cpus_per_namd": [1, 17], "480": 1, "echo": 1, "point": [1, 2, 11, 12, 13, 19], "your": [1, 15], "project": 1, "hppf": 1, "pn98ve": 1, "di67rov": 1, "test_ti": 1, "studi": [1, 19], "prot": [1, 11], "l2": 1, "l1": 1, "com": [1, 13, 15, 19], "conf": [1, 2, 17, 19], "stage": [1, 2, 17, 19], "srun": [1, 17, 19], "tclmain": [1, 17, 19], "sleep": [1, 17, 19], "first": [1, 18, 19], "20": [1, 14, 18, 19], "could": [1, 15, 17, 19], "adapt": 1, "smaller": [1, 17], "10k": 1, "follow": [1, 13, 15, 17, 19], "45": 1, "micro": 1, "scale": [1, 17, 18], "up": [1, 10, 12, 13, 17, 19], "test": [1, 2, 9, 15, 17, 19], "otest": 1, "etest": 1, "ls_subcwd": 1, "path": [1, 2, 10, 11, 12, 13, 15, 18], "gpf": 1, "alpin": 1, "scratch": 1, "adw62": [1, 15], "chm155": 1, "ties_test": 1, "miniconda": [1, 15], "ethan": [1, 19], "zero_sum": [1, 19], "leg1": 1, "cuda": [1, 2, 15, 17], "168": 1, "date": [1, 19], "thetagpu": [1, 17], "cobalt": 1, "100": 1, "q": 1, "full": 1, "mpirun": 1, "lu": 1, "theta": 1, "fs0": 1, "softwar": [1, 14], "openmpi": 1, "compbioaffin": 1, "awad": 1, "namd_3": 1, "0alpha9_linux": 1, "x86_64": [1, 15], "multicor": 1, "node1": 1, "sed": 1, "1q": 1, "cobalt_nodefil": 1, "node2": 1, "2q": 1, "many_rep": 1, "mcl1": 1, "l18": 1, "l39": 1, "host": 1, "cpu": [1, 2, 15, 19], "bind": [1, 2, 14, 18, 19], "core": [1, 19], "np": [1, 2, 11, 12], "devic": [1, 2, 17, 19], "30": 1, "40": 1, "50": [1, 19], "60": 1, "70": 1, "80": [1, 15], "90": 1, "addition": 1, "gpu": [1, 2, 15, 17, 19], "idl": 1, "real": 1, "world": 1, "applic": [1, 18, 19], "current": [1, 2, 19], "creat": [1, 2, 17, 18, 19], "python": [1, 15, 17, 19], "veri": 1, "help": [1, 2], "would": [1, 17, 19], "allow": [1, 2, 11, 15, 17, 19], "u": [1, 2, 13, 17], "__name__": 1, "__main__": 1, "acc_nam": 1, "want": [1, 2, 11, 12, 13, 15, 17], "thermodynam": [1, 12, 13, 14, 15, 18], "leg": [1, 2, 11, 13, 19], "have": [1, 9, 13, 15, 17, 19], "differ": [1, 2, 9, 11, 12, 13, 15, 17, 19], "wall": 1, "binari": 1, "namd3_ex": 1, "getcwd": [1, 13], "give": [1, 13], "wall_tim": 1, "els": [1, 12], "open": [1, 14], "join": [1, 13], "thetagpu_": 1, "format": [1, 2, 10, 11, 19], "f": 1, "instal": [1, 14, 19], "locat": [1, 2, 11, 19], "read": [1, 2, 9, 10, 11, 12, 13, 15, 19], "rang": [1, 2, 17], "move": [1, 19], "iter": [1, 2, 11, 13], "over": [1, 2, 11, 13, 17, 19], "minim": [1, 2, 19], "nvt": [1, 2, 19], "eq": 1, "npt": [1, 2, 19], "run0": 1, "run1": 1, "run2": 1, "run3": 1, "count": 1, "lam": [1, 2], "rep": [1, 2, 11, 12], "2f": [1, 2], "number": [1, 2, 11, 12, 19], "next": [1, 13], "when": [1, 2, 13, 17, 18, 19], "fill": [1, 19], "sure": 1, "between": [1, 2, 12, 13, 15, 17, 18, 19], "sim": [1, 2], "finish": [1, 2, 13, 19], "eng_script": [2, 16], "cfg_script": [2, 3], "namd_sub": [2, 3], "namd_sub_split": [2, 3], "openmm_sub": [2, 3], "openmm_sub_split": [2, 3], "openmmtool": [2, 15, 16], "alchemi": [2, 16], "ties_analysi": [2, 16, 19], "namd": [2, 10, 14, 18, 19], "config": [2, 13, 16, 17, 18, 19], "complex": [2, 13, 19], "run_typ": [2, 13, 19], "period": 2, "platform": [2, 15], "kwarg": [2, 9], "object": [2, 9, 10, 11, 12], "protocol": [2, 13, 14, 15], "initi": [2, 13], "variabl": [2, 9], "function": [2, 9, 10, 11, 12, 19], "start": [2, 14, 15, 17], "str": [2, 9, 10, 11], "experi": [2, 13, 19], "prmtop": [2, 19], "flag": 2, "sai": 2, "int": [2, 11, 12, 19], "id": [2, 11, 15], "denot": [2, 19], "execut": [2, 13, 17, 19], "contain": [2, 10, 11, 12, 13, 18, 19], "end": [2, 12, 17, 18], "determin": [2, 15, 17, 18, 19], "custom": [2, 15], "sting": 2, "opencl": [2, 15], "dict": [2, 10, 12], "build_results_dir": 2, "folder": [2, 19], "helper": [2, 11], "output": [2, 11, 12, 15, 19], "param": [2, 10], "return": [2, 9, 10, 11, 12, 15], "properti": 2, "1st": 2, "basi": 2, "cell": [2, 17], "compon": 2, "2nd": 2, "3rd": 2, "go": 2, "get_opt": [2, 10, 13], "print": [2, 10, 13], "tiesmd": [2, 13], "subset": 2, "bool": [2, 11, 12], "update_cfg": 2, "after": [2, 19], "made": [2, 19], "write_analysis_cfg": 2, "configur": [2, 13, 15, 17, 19], "analysi": [2, 10, 11, 12, 14, 15], "write_namd_eq": 2, "eq1": 2, "eq2": 2, "write_namd_min": 2, "eq0": 2, "write_namd_prod": 2, "sim1": 2, "write_namd_script": 2, "write_namd_submiss": 2, "archer2": 2, "write_openmm_submiss": 2, "get_box_vector": 2, "box_typ": 2, "comput": [2, 12, 13, 15, 19], "know": 2, "edg": 2, "length": 2, "defin": [2, 9, 19], "bix": 2, "vec3": 2, "get_header_and_run": 2, "namd_vers": [2, 11], "num_window": 2, "prep": [2, 13, 19], "inspect": [2, 11, 13], "version": [2, 9, 11, 15], "one": [2, 11, 12, 13, 17, 18, 19], "nice_print": [2, 10], "pad": [2, 10], "read_config": [2, 10], "disk": 2, "arg": [2, 9], "alchsi": 2, "basis_vector": 2, "absolut": 2, "debug": 2, "free": [2, 12, 14, 17, 18, 19], "energi": [2, 12, 14, 17, 18, 19], "calcul": [2, 11, 12, 13, 14, 15, 17, 19], "beta": 2, "mbar": [2, 12], "explicit": 2, "pme": 2, "cutoffnonperiod": 2, "remov": [2, 11, 12], "forc": [2, 15], "nonbond": 2, "note": [2, 13, 17, 19], "gromac": 2, "add_consraint": 2, "add": [2, 19], "constrain": [2, 19], "boundari": 2, "condit": 2, "amend_original_posit": 2, "posit": [2, 19], "updat": [2, 11, 15], "store": [2, 10], "clash": 2, "found": [2, 13, 18, 19], "initialis": 2, "build_simul": 2, "device_id": 2, "index": [2, 11, 19], "integr": [2, 12, 14, 15, 18], "debug_forc": 2, "while": 2, "maintain": 2, "ensembl": [2, 17, 19], "modifi": [2, 9, 13, 19], "get_gradi": 2, "val": 2, "context": [2, 9], "h": 2, "analitic_ster": 2, "gradient": [2, 11, 12, 19], "r": 2, "eg": 2, "lambda_electrostatics_appear": 2, "finit": [2, 18], "analyt": 2, "steric": 2, "experiment": 2, "numer": [2, 12, 17], "get_intersect_angl": 2, "appear_idx": 2, "disappear_idx": 2, "idx": 2, "angl": 2, "straddl": 2, "region": 2, "dissapear": 2, "get_intersect_bond": 2, "bond": 2, "get_intersect_tors": 2, "torsion": 2, "disappear": [2, 11, 18, 19], "rebuild_tors": 2, "intersect_tors": 2, "rebuild": 2, "without": [2, 17, 19], "non": [2, 18, 19], "physic": [2, 14, 18, 19], "fulli": [2, 18], "result": [2, 11, 12, 13, 15, 17, 19], "nan": 2, "eval": 2, "refer": [2, 15, 17, 18, 19], "set_context_to_st": 2, "param_v": 2, "shift_alchemical_posit": 2, "pertub": 2, "resolv": 2, "caus": [2, 13], "overlap": [2, 12], "test_sim": 2, "find": 2, "undefin": [2, 9], "pdb_line": 2, "let": 2, "address": 2, "readabl": 2, "system_id": 2, "inform": [2, 11, 12, 14, 15, 17, 18, 19], "repeat": [2, 17], "add_simulation_report": 2, "total_step": 2, "save": [2, 12, 19], "report": 2, "step": [2, 13, 15, 18], "dcd": 2, "equilibri": 2, "save_fil": 2, "perform": [2, 11, 12, 13, 15, 19], "state": [2, 9, 12, 18, 19], "indic": 2, "whether": 2, "ha": [2, 9, 15, 17, 19], "get_alchemical_atom": 2, "pdb_file": 2, "pull": 2, "temp": [2, 11, 12, 15], "factor": [2, 19], "logic": 2, "get_constraint": 2, "fuction": 2, "row": 2, "data": [2, 11, 12], "strength": 2, "relax": 2, "preproduct": [2, 19], "equili_step": 2, "equili_state_fil": 2, "meta": 2, "wrap": 2, "togeth": 2, "equilib": 2, "remove_simulation_report": 2, "strip": 2, "simulate_system": 2, "alch_si": 2, "mask": [2, 17], "niter": 2, "steps_per_it": 2, "1000": 2, "main": [2, 10, 19], "Will": 2, "assign": 2, "worker": 2, "pre": [2, 19], "collect": [2, 11, 14], "requir": [2, 9, 19], "grad": [2, 12], "argv": 2, "entri": [2, 12, 19], "program": [2, 13, 18, 19], "argument": [2, 13], "global_lamb": 2, "fraction": 2, "electr": 2, "kei": [2, 19], "lambda_": 2, "_": [2, 9], "termin": [2, 10, 13, 15], "update_attrs_from_schedul": [2, 11], "self": [2, 11, 12], "lambda_sterics_appear": [2, 11], "appear_func": 2, "evalu": 2, "two": [2, 13, 14, 17, 18, 19], "disappear_func": 2, "get_lin": 2, "global_lam": 2, "numpi": [2, 11, 12], "arrai": [2, 11, 12], "interpol": 2, "across": [2, 17], "except": 9, "alchemicalstateerror": 9, "globalparametererror": 9, "error": [9, 12, 15, 17], "rais": 9, "alchemicalst": 9, "modifiedabsolutealchemicalfactori": 9, "consistent_except": 9, "switch_width": 9, "quantiti": 9, "alchemical_pme_treat": 9, "exact": [9, 19], "alchemical_rf_treat": 9, "switch": 9, "disable_alchemical_dispersion_correct": 9, "split_alchemical_forc": 9, "absolutealchemicalfactori": 9, "super": 9, "modifiedalchemicalst": 9, "parameters_name_suffix": 9, "globalparameterst": 9, "apply_to_context": 9, "put": [9, 13], "doe": [9, 13, 15, 19], "apply_to_system": 9, "check_system_consist": 9, "check": 9, "It": [9, 19], "consist": 9, "classmethod": 9, "from_system": 9, "constructor": 9, "specifi": [9, 11, 12, 17, 19], "search": 9, "parameter_nam": 9, "repres": 9, "same": [9, 13, 17, 19], "get_alchemical_vari": 9, "variable_nam": 9, "warn": 9, "deprec": 9, "get_function_vari": 9, "instead": [9, 15], "variable_valu": 9, "enter": 9, "mathemat": 9, "express": 9, "alchemicalfunct": 9, "enslav": 9, "arbitrari": 9, "lambda_angl": 9, "interv": 9, "standard": [9, 12, 19], "lambda_bond": 9, "lambda_electrostat": 9, "lambda_ster": 9, "lambda_tors": 9, "set_alchemical_paramet": 9, "new_valu": 9, "given": [9, 19], "those": 9, "being": [9, 17, 18, 19], "remain": 9, "new": [9, 11, 13], "set_alchemical_vari": 9, "set_function_vari": 9, "analysis_cfg": 10, "hold": [10, 11], "chose": 10, "make_exp": 10, "verbos": 10, "win_mask": 11, "distribut": [11, 12], "rep_convg": [11, 12], "sampling_convg": [11, 12], "vdw_a": 11, "vdw_d": 11, "ele_a": 11, "ele_d": 11, "dir": 11, "writen": [11, 19], "dg": [11, 12], "individu": [11, 12, 13, 17], "intermedi": [11, 18], "you": [11, 13, 15, 19], "wish": [11, 13, 15, 19], "converg": 11, "amount": 11, "describ": 11, "vdw": 11, "elec": 11, "alch": [11, 16], "collate_data": 11, "data_root": 11, "protein": [11, 13, 14, 18, 19], "ligand": [11, 13, 14, 18, 19], "thermo": 11, "run_analysi": 11, "implement": [11, 14, 17, 18], "stdev": 11, "get_it": 11, "file_loc": 11, "get_replica": 11, "sort": 11, "specif": [11, 13, 14, 18, 19], "rep0": 11, "get_window": 11, "lambda_0": 11, "read_alch_fil": 11, "file_path": 11, "namd_ver": 11, "ver": 11, "old": 11, "about": [11, 12, 19], "easili": 11, "queryabl": 11, "etc": 11, "fep_combine_rep": 11, "openmm_ti": [11, 19], "combin": [11, 17], "seri": [11, 12], "concaten": 11, "mbar_analysi": 12, "analysis_dir": 12, "decorrel": 12, "averag": 12, "befor": 12, "process": 12, "u_kln": 12, "n_k": 12, "mask_window": 12, "matrix": 12, "associ": [12, 13, 18, 19], "decorrelate_data": 12, "decorrol": 12, "turpl": 12, "plot_overlap_mat": 12, "mat": 12, "plot": [12, 18], "replica_analysi": 12, "consid": [12, 17, 18, 19], "trajectori": 12, "bootstrap": 12, "sem": [12, 13], "ti_analysi": 12, "deviat": [12, 19], "intergr": 12, "lambda_paramet": 12, "varianc": 12, "plot_du_by_dl": 12, "du": 12, "dlam": 12, "v": [12, 15], "includ": [12, 13, 18], "ci": 12, "compute_bs_error": 12, "var": 12, "boot": 12, "strap": 12, "get_lam_diff": 12, "lambda_arrai": 12, "adjac": 12, "discuss": [13, 17], "section": [13, 14, 15, 19], "outlin": [13, 14, 17, 19], "shorten": 13, "respect": [13, 19], "transform": [13, 15, 18, 19], "anoth": [13, 18], "water": 13, "insid": 13, "\u03b4": 13, "g_": 13, "mutation1": 13, "mutation2": 13, "equal": [13, 17, 19], "\u03b4\u03b4": 13, "relat": 13, "shown": [13, 18, 19], "figur": [13, 18], "more": [13, 14, 17, 18, 19], "public": [13, 18], "cournia": 13, "et": 13, "al": 13, "whole": 13, "cycl": 13, "must": [13, 15, 19], "hand": 13, "ties20": [13, 18, 19], "principl": 13, "howev": [13, 17], "normal": 13, "avoid": 13, "rapid": 13, "crystal": 13, "structur": [13, 19], "conform": 13, "earli": 13, "close": 13, "contact": 13, "expens": 13, "computation": 13, "design": 13, "both": [13, 19], "parameter": 13, "hybrid": [13, 18], "browser": 13, "altern": [13, 17, 19], "pair": 13, "ligand_ff_nam": 13, "gaff2": 13, "ligand_net_charg": 13, "md_engin": 13, "mol2": 13, "antechamber_prepare_mol2": 13, "ensur": [13, 15, 19], "make_atom_names_uniqu": 13, "turn": [13, 19], "superimpos": 13, "sinc": 13, "declar": 13, "prepare_input": 13, "receptor": 13, "protein_ff": 13, "leaprc": 13, "ff14sb": 13, "re": 13, "prepar": [13, 14], "built": [13, 14, 18, 19], "order": [13, 15], "via": [13, 19], "At": 13, "map": 13, "thermodynamic_leg": [13, 19], "wa": [13, 15, 19], "seen": 13, "good": [13, 19], "default": [13, 15, 19], "quickli": 13, "thermo_leg": 13, "element": 13, "part": 13, "abov": [13, 15, 17, 19], "intern": 13, "These": [13, 15, 17, 18, 19], "last": 13, "ties_ana": [13, 19], "Then": [13, 15], "our": [13, 14, 17, 19], "minu": 13, "care": 13, "compar": 13, "depend": [13, 19], "again": 13, "dat": [13, 19], "packag": [14, 15, 16, 19], "stand": 14, "enhanc": [14, 18], "accur": 14, "reproduc": 14, "rel": [14, 18], "pleas": [14, 19], "theori": 14, "within": [14, 15, 19], "avail": [14, 15, 17, 19], "onlin": [14, 19], "sourc": [14, 19], "explain": 14, "websit": 14, "builder": 14, "linux": 14, "ppc64le": 14, "tutori": [14, 15], "bfe": 14, "background": 14, "pathwai": [14, 19], "github": [14, 15, 17, 19], "conda": 15, "manag": 15, "assum": 15, "wget": 15, "http": [15, 19], "repo": 15, "continuum": 15, "io": 15, "miniconda3": 15, "latest": 15, "chmod": 15, "match": 15, "machin": 15, "permiss": 15, "page": [15, 17, 19], "With": [15, 19], "forg": 15, "verifi": 15, "m": 15, "testinstal": 15, "older": 15, "simtk": 15, "instanc": [15, 17, 19], "wrong": 15, "cudatoolkit": 15, "happen": 15, "git": [15, 19], "revis": 15, "130124a3f9277b054ec40927360a6ad20c8f5fa6": 15, "There": [15, 19], "successfulli": 15, "cuda_error_unsupported_ptx_vers": 15, "222": 15, "median": 15, "30571e": 15, "06": 15, "76359e": 15, "05194e": 15, "07": 15, "toler": 15, "critic": [15, 17], "correct": [15, 19], "replac": 15, "particular": [15, 19], "One": 15, "appropri": 15, "nvidia": 15, "smi": 15, "yield": 15, "460": 15, "driver": 15, "persist": 15, "bu": 15, "disp": 15, "volatil": 15, "uncorr": 15, "ecc": 15, "fan": 15, "perf": 15, "pwr": 15, "usag": 15, "cap": 15, "memori": 15, "util": 15, "mig": 15, "quadro": 15, "m1000m": 15, "00000000": 15, "01": 15, "50c": 15, "p5": 15, "435mib": 15, "2002mib": 15, "top": 15, "right": 15, "my": [15, 19], "correctli": 15, "download": [15, 19], "clone": [15, 19], "ucl": [15, 19], "cc": [15, 19], "pymabr": 15, "therefor": [15, 19], "until": 15, "around": 15, "copi": 15, "elsewher": 15, "skip": 15, "And": 15, "mkdir": 15, "openmmtools_instal": 15, "powerpc": 15, "pip": 15, "featur": 15, "tree": 15, "subpackag": 16, "content": 16, "submodul": [16, 19], "cli": 16, "domain": 17, "kind": 17, "spatial": 17, "decompos": 17, "difficult": 17, "achiev": [17, 19], "than": 17, "ones": 17, "focu": 17, "aleator": 17, "inher": 17, "chaotic": 17, "commun": 17, "other": 17, "embarrassingli": 17, "problem": [17, 19], "easi": 17, "likewis": 17, "remaind": 17, "explor": 17, "th": 17, "spit": 17, "tell": [17, 19], "further": 17, "inclus": 17, "exclus": 17, "sing": 17, "clariti": 17, "multipl": [17, 19], "resourc": 17, "alloc": 17, "handl": 17, "case": [17, 19], "messag": 17, "interfac": 17, "mpi": 17, "vari": [17, 19], "univers": 17, "solut": [17, 19], "independ": [17, 19], "someth": [17, 19], "notic": [17, 19], "loop": [17, 19], "65": 17, "anecdot": 17, "less": 17, "crash": 17, "135": 17, "extens": 17, "provis": 17, "hardwar": 17, "exhaust": 17, "suggest": [17, 19], "consult": [17, 18, 19], "document": [17, 18, 19], "comprehens": 17, "molecul": [18, 19], "coval": 18, "dual": 18, "topologi": [18, 19], "approach": 18, "complementari": 18, "involv": [18, 19], "chemic": 18, "moieti": 18, "destroi": 18, "stratifi": 18, "along": 18, "chosen": 18, "keep": 18, "track": 18, "\u03bb": [18, 19], "As": [18, 19], "tune": 18, "wai": 18, "comma": [18, 19], "exactli": [18, 19], "lennard": 18, "jone": 18, "lj": 18, "interact": 18, "second": [18, 19], "graphic": 18, "guid": 18, "expect": 19, "code": 19, "navig": 19, "essenti": 19, "place": 19, "understand": 19, "renam": 19, "anyth": 19, "fix": 19, "novel": 19, "desir": 19, "servic": 19, "local": 19, "later": 19, "occasion": 19, "alongsid": 19, "space": 19, "na": 19, "manual": 19, "simpl": 19, "imag": 19, "show": 19, "alwai": 19, "popul": 19, "size": 19, "typic": 19, "possibli": 19, "drug": 19, "solvent": 19, "why": 19, "present": 19, "almost": 19, "readi": 19, "invok": 19, "just": 19, "taken": 19, "either": 19, "halt": 19, "advanc": 19, "below": 19, "silent": 19, "ignor": 19, "integ": 19, "request": 19, "uniqu": 19, "By": 19, "intens": 19, "pc": 19, "head": 19, "lambda_x": 19, "repi": 19, "analys": 19, "zero": 19, "sum": 19, "smallest": 19, "branch": 19, "mind": 19, "6x1": 19, "lot": 19, "128": 19, "might": 19, "explicitli": 19, "wide": 19, "solv": 19, "issu": 19, "submit": 19, "miss": 19, "under": 19, "exp": 19, "theoret": 19, "\u03b4g": 19, "kcal": 19, "mol": 19, "unknown": 19, "measur": 19, "left": 19, "becaus": 19, "carri": 19, "special": 19, "infer": 19, "dictionari": 19, "methodologi": 19, "openmm_fep": 19, "023": 19, "003": 19, "076": 19}, "objects": {"": [[2, 0, 0, "-", "TIES_MD"]], "TIES_MD": [[2, 0, 0, "-", "TIES"], [2, 0, 0, "-", "alch"], [2, 0, 0, "-", "cli"], [3, 0, 0, "-", "eng_scripts"], [2, 0, 0, "-", "lambdas"], [9, 0, 0, "-", "openmmtools"], [10, 0, 0, "-", "ties_analysis"]], "TIES_MD.TIES": [[2, 1, 1, "", "TIES"], [2, 4, 1, "", "get_box_vectors"], [2, 4, 1, "", "get_header_and_run"], [2, 4, 1, "", "nice_print"], [2, 4, 1, "", "read_config"]], "TIES_MD.TIES.TIES": [[2, 2, 1, "", "build_results_dirs"], [2, 3, 1, "", "cell_basis_vec1"], [2, 3, 1, "", "cell_basis_vec2"], [2, 3, 1, "", "cell_basis_vec3"], [2, 3, 1, "", "elec_edges"], [2, 3, 1, "", "engine"], [2, 2, 1, "", "get_options"], [2, 3, 1, "", "global_lambdas"], [2, 2, 1, "", "run"], [2, 2, 1, "", "setup"], [2, 3, 1, "", "split_run"], [2, 3, 1, "", "ster_edges"], [2, 2, 1, "", "update_cfg"], [2, 2, 1, "", "write_analysis_cfg"], [2, 2, 1, "", "write_namd_eq"], [2, 2, 1, "", "write_namd_min"], [2, 2, 1, "", "write_namd_prod"], [2, 2, 1, "", "write_namd_scripts"], [2, 2, 1, "", "write_namd_submissions"], [2, 2, 1, "", "write_openmm_submission"]], "TIES_MD.alch": [[2, 1, 1, "", "AlchSys"], [2, 1, 1, "", "PDB_line"], [2, 1, 1, "", "System_ID"], [2, 4, 1, "", "add_simulation_reporters"], [2, 4, 1, "", "equilibriation"], [2, 4, 1, "", "get_alchemical_atoms"], [2, 4, 1, "", "get_constraints"], [2, 4, 1, "", "minimization"], [2, 4, 1, "", "preproduction"], [2, 4, 1, "", "remove_simulation_reporters"], [2, 4, 1, "", "simulate_system"]], "TIES_MD.alch.AlchSys": [[2, 2, 1, "", "add_consraints"], [2, 2, 1, "", "amend_original_positions"], [2, 2, 1, "", "build_simulation"], [2, 2, 1, "", "debug_force"], [2, 2, 1, "", "get_gradients"], [2, 2, 1, "", "get_intersect_angles"], [2, 2, 1, "", "get_intersect_bonds"], [2, 2, 1, "", "get_intersect_torsions"], [2, 2, 1, "", "rebuild_torsion"], [2, 2, 1, "", "set_context_to_state"], [2, 2, 1, "", "shift_alchemical_positions"], [2, 2, 1, "", "test_sim"]], "TIES_MD.cli": [[2, 4, 1, "", "main"]], "TIES_MD.eng_scripts": [[4, 0, 0, "-", "cfg_scripts"], [5, 0, 0, "-", "namd_sub"], [6, 0, 0, "-", "namd_sub_split"], [7, 0, 0, "-", "openmm_sub"], [8, 0, 0, "-", "openmm_sub_split"]], "TIES_MD.lambdas": [[2, 1, 1, "", "Lambdas"], [2, 4, 1, "", "appear_func"], [2, 4, 1, "", "disappear_func"], [2, 4, 1, "", "get_line"]], "TIES_MD.lambdas.Lambdas": [[2, 2, 1, "", "update_attrs_from_schedule"]], "TIES_MD.openmmtools": [[9, 0, 0, "-", "alchemy"]], "TIES_MD.openmmtools.alchemy": [[9, 5, 1, "", "AlchemicalStateError"], [9, 1, 1, "", "ModifiedAbsoluteAlchemicalFactory"], [9, 1, 1, "", "ModifiedAlchemicalState"]], "TIES_MD.openmmtools.alchemy.ModifiedAlchemicalState": [[9, 2, 1, "", "apply_to_context"], [9, 2, 1, "", "apply_to_system"], [9, 2, 1, "", "check_system_consistency"], [9, 2, 1, "", "from_system"], [9, 2, 1, "", "get_alchemical_variable"], [9, 2, 1, "", "get_function_variable"], [9, 6, 1, "", "lambda_angles"], [9, 6, 1, "", "lambda_bonds"], [9, 6, 1, "", "lambda_electrostatics"], [9, 6, 1, "", "lambda_sterics"], [9, 6, 1, "", "lambda_torsions"], [9, 2, 1, "", "set_alchemical_parameters"], [9, 2, 1, "", "set_alchemical_variable"], [9, 2, 1, "", "set_function_variable"]], "TIES_MD.ties_analysis": [[10, 0, 0, "-", "config"], [11, 0, 0, "-", "engines"], [12, 0, 0, "-", "methods"], [10, 0, 0, "-", "ties_analysis"]], "TIES_MD.ties_analysis.config": [[10, 1, 1, "", "Config"], [10, 4, 1, "", "read_config"]], "TIES_MD.ties_analysis.config.Config": [[10, 2, 1, "", "get_options"]], "TIES_MD.ties_analysis.engines": [[11, 0, 0, "-", "namd"], [11, 0, 0, "-", "openmm"]], "TIES_MD.ties_analysis.engines.namd": [[11, 1, 1, "", "NAMD"], [11, 4, 1, "", "get_iter"], [11, 4, 1, "", "get_replica"], [11, 4, 1, "", "get_window"], [11, 4, 1, "", "read_alch_file"]], "TIES_MD.ties_analysis.engines.namd.NAMD": [[11, 2, 1, "", "collate_data"], [11, 2, 1, "", "run_analysis"]], "TIES_MD.ties_analysis.engines.openmm": [[11, 1, 1, "", "Lambdas"], [11, 1, 1, "", "OpenMM"], [11, 4, 1, "", "get_replica"], [11, 4, 1, "", "get_window"]], "TIES_MD.ties_analysis.engines.openmm.Lambdas": [[11, 2, 1, "", "update_attrs_from_schedule"]], "TIES_MD.ties_analysis.engines.openmm.OpenMM": [[11, 2, 1, "", "collate_data"], [11, 2, 1, "", "run_analysis"]], "TIES_MD.ties_analysis.methods": [[12, 0, 0, "-", "FEP"], [12, 0, 0, "-", "TI"]], "TIES_MD.ties_analysis.methods.FEP": [[12, 1, 1, "", "MBAR_Analysis"]], "TIES_MD.ties_analysis.methods.FEP.MBAR_Analysis": [[12, 2, 1, "", "analysis"], [12, 2, 1, "", "decorrelate_data"], [12, 2, 1, "", "plot_overlap_mat"], [12, 2, 1, "", "replica_analysis"]], "TIES_MD.ties_analysis.methods.TI": [[12, 1, 1, "", "TI_Analysis"], [12, 4, 1, "", "compute_bs_error"], [12, 4, 1, "", "get_lam_diff"]], "TIES_MD.ties_analysis.methods.TI.TI_Analysis": [[12, 2, 1, "", "analysis"], [12, 2, 1, "", "intergrate"], [12, 2, 1, "", "plot_du_by_dl"]], "TIES_MD.ties_analysis.ties_analysis": [[10, 1, 1, "", "Analysis"], [10, 4, 1, "", "main"], [10, 4, 1, "", "make_exp"], [10, 4, 1, "", "nice_print"]], "TIES_MD.ties_analysis.ties_analysis.Analysis": [[10, 2, 1, "", "run"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:property", "4": "py:function", "5": "py:exception", "6": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "property", "Python property"], "4": ["py", "function", "Python function"], "5": ["py", "exception", "Python exception"], "6": ["py", "attribute", "Python attribute"]}, "titleterms": {"ti": [0, 2, 12, 14, 15, 17], "md": [0, 14, 15], "api": 0, "hpc": 1, "submiss": 1, "script": 1, "namd": [1, 11, 17], "openmm": [1, 11, 15, 17], "3": 1, "ties_md": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16], "packag": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "subpackag": [2, 3, 10], "submodul": [2, 9, 10, 11, 12], "modul": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], "alch": 2, "cli": 2, "lambda": 2, "content": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14], "eng_script": [3, 4, 5, 6, 7, 8], "cfg_script": 4, "namd_sub": 5, "namd_sub_split": 6, "openmm_sub": 7, "openmm_sub_split": 8, "openmmtool": 9, "alchemi": 9, "ties_analysi": [10, 11, 12], "config": 10, "engin": 11, "method": 12, "fep": 12, "bind": 13, "free": 13, "energi": 13, "tutori": [13, 19], "gener": 13, "bfe": 13, "background": 13, "setup": 13, "run": [13, 19], "analysi": [13, 19], "welcom": 14, "document": 14, "code": 14, "instal": 15, "linux": 15, "ppc64le": 15, "parallel": 17, "theori": 18, "outlin": 18, "alchem": 18, "calcul": 18, "pathwai": 18, "get": 19, "start": 19, "input": 19, "command": 19, "line": 19, "simul": 19, "prepar": 19}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}}) \ No newline at end of file diff --git a/docs/theory.html b/docs/theory.html index c72e5d4..2a5db01 100644 --- a/docs/theory.html +++ b/docs/theory.html @@ -42,6 +42,7 @@ +
              • TIES MD API
              • Binding Free Energy Tutorial
              • Parallelization
              • HPC Submission scripts
              • @@ -88,7 +89,7 @@

                Tutorial

                Getting started

                -

                TIES MD is a package which is intended to be used on the command line and submitted to a HPC system. In this document +

                TIES MD is a package for the preparation, running and analysis of binding free energy calculations. In this document we will outline what commands should be run to calculate binding free energies. To start with any free energy calculations we must first outline what are the expected input files to the TIES MD program.

                In this tutorial we will refer to example systems which can be found in the @@ -96,21 +97,23 @@

                Getting started
                git clone https://github.com/UCL-CCS/TIES_MD.git
                 

            -

            and navigating to TIES_MD/TIES_MD/examples/

            +

            and found by navigating to TIES_MD/TIES_MD/examples/

            Input

            TIES MD expects a number of input files, these are two essential files, e.g. complex.pdb and complex.prmtop. These files contain information about the position, topology and parameters for the system. Currently we only support -the AMBER based format prmtop but provide a utility to build them online. complex.pdb also -contains the alchemical indexes denoting which atoms will appear and disappear during the simulation. There is also -an optional input file, constraints.pdb, and this contains indexes denoting which atoms, if any, are constrained -during the pre-production simulation. This input should all be placed in a directory named build located -where the user wishes to run the simulation. Examples of these files can be found here. -Please use a directory structure like study/system/ligand/thermodynamic_leg/build this will allow the analysis scripts to +the AMBER based format prmtop. complex.pdb also contains the alchemical indexes denoting which atoms will +appear and disappear during the simulation. There is also an optional input file, constraints.pdb, and this +contains indexes denoting which atoms, if any, are constrained during the pre-production simulation. This input should +all be placed in a directory named build located where the user wishes to run the simulation. Examples of these files +can be found here.

            +

            Please use a directory structure like study/system/ligand/thermodynamic_leg/build this will allow the analysis scripts to understand the structure and perform analysis automatically. study, system, ligand and thermodynamic_leg can be renamed to anything but the name of the build directory is fixed. If input for novel ligand transformations is desired the -TIES20 program can be used to generate all required inputs.

            +TIES20 program can be used to generate all required inputs. TIES 20 can be +used via our online service or locally and details of how to use this will be provided +later in these documents.

            The only non standard input to TIES MD is a configuration file (TIES.cfg) which specifies options which the user my wish to occasionally change. This file must be placed alongside the build directory. Here we provide an example of such a file:

            -

            total_reps and reps_per_exec are options which can be used to achieve simple parallelism of the simulations. +

            total_reps and split_run are options which can be used to achieve simple parallelism of the simulations. For example if you wished to run a total of 5 simulations on 5 GPUs in parallel one could use the settings -total_reps = 5 and reps_per_exec = 1. See the Parallelization section for more details of how to +total_reps = 5 and split_run = 1. See the Parallelization section for more details of how to achieve this.

            The following image shows TIES_MD applied to one alchemical transformation.

            Alternative text @@ -186,10 +183,9 @@

            Input energy functions of the system and for more information these settings please see the Alchemical Pathways section.

            Note the option constraint_column which determines if the constraint indexes will be read from the temperature factor or occupancy column of the constraints PDB. The alchemical indexes are always be read from the temperature factor column -in the main PDB complex.pdb. The edge_length option can be found in the leap.log file created during system -preparation preformed by the users or TIES20. TIES20 will populate a TIES.cfg automatically with the correct box size.

            +in the main PDB complex.pdb. TIES20 will populate a TIES.cfg automatically with the correct box size.

            Typically a constraint file may be used during preproduction of simulations involving proteins but possibly not a small -drug like molecule in only solvent. It will be show later in the Binding Free Energy Calculations section when and +drug like molecule in only solvent. It will be shown later in the Binding Free Energy Tutorial section when and why we use a constraints file.

            @@ -216,16 +212,13 @@

            Command Lineties_md --exp_name=sys_solv --windows_mask=5,6 --devices=5&

            -

            There are a lot of options for how these OpenMM calcualtions can be structured and parallelized with TIES_MD see our +

            There are a lot of options for how these OpenMM calculations can be structured and parallelized with TIES_MD see our Parallelization page for more information on this. For a NAMD calculation if the submission script requested 6 CPU nodes each with 128 cores the run lines in the submission script might look like:

            cd $build/replica-confs
            @@ -335,7 +328,7 @@ 

            Analysis - +