Ligand Modeler ============== Create Ligand Modeler project ----------------------------- Let’s walk through how to create a Ligand Reader & Modeler project. You will need at least one ligand SDF file. If you plan to use a PDB Reader project, make sure that the corresponding PDB Reader project contains a ligand. In the example below, we’ll use only an SDF file. If you are creating the project based on a PDB Reader project, you will need to provide the following options: * pdbreader_project_id (str): The project ID of a PDB Reader project that contains at least one ligand. * native_ligand (str): The name of the native ligand from the specified PDB Reader project. * Optional Advanced Options when using `pdbreader_project_id`: - complete_ring_chain (bool): Match only when the atoms inside each ring are exactly the same — requires an identical ring subgraph (atoms and bonds). `default: False` - strict_match (bool): For pre-aligned molecules, tightly enforce coordinate agreement by snapping positions within a small tolerance for a stricter fit. `default: True` - handle_chirality (bool): Preserve stereochemistry during alignment by considering chirality centers and geometric isomers. `default: True` Note: You can check the available `native_ligand` values by using the `get_native_ligands(pdbreader_project_id)` method. :: lrmbuilder = molcube.create_ligand_modeler_project() # alt: pdbreader_project_id = pdbreader.projectId pdbreader_project_id = '78080ec8-bfcd-4141-8f22-f0ae805374ff' ligands_data = lrmbuilder.get_native_ligands(pdbreader_project_id) # Native ligand found - Chain: HETE_C, Residue Name: 53U, Residue Index: 2001 lrmbuilder.create_project( title="test_LRM", ff="amberff", sdf_paths=["./1a.sdf", "1b.sdf"], pdbreader_project_id=pdbreader_project_id, native_ligand={ "chainIndex": "HETE_C", "residueIndex": 2001 }, ) Modify SDF file (optional) -------------------------- You can optionally modify the dihedral angle in the ligand SDF file. This step can be skipped. To do this, first use the ``check_atom_index()`` method along with interactive clicking to identify the indices of the atoms involved. The ``check_atom_index()`` method requires the name of the SDF file as input, which you can find via ``lrmbuilder.files_data``. Once the desired atom indices are known, use the ``change_dihedral()`` method to obtain a dictionary containing the modified ligand data needed for the next step. You should create a ``list`` and ``append`` each output from ``change_dihedral()`` to this list for use in the following step. ``check_atom_index()`` options: * file_name (str): The name of the target SDF file where the dihedral will be changed. * visual_protein (bool): Whether to visualize the protein together with the ligand (default: False). ``change_dihedral()`` options: * file_name (str): The name of the target SDF file. * atom_index_1 (int): The first atom defining the rotation axis. The rotation axis is directed from atom_index_1 to atom_index_2. * atom_index_2 (int): The second atom defining the rotation axis. The part of the molecule connected to this atom (excluding the bond to atom_index_1) will be rotated. * angle (int): The rotation angle in degrees (between 0 and 360). * visual_protein (bool): Whether to visualize the protein together with the ligand (default: False). Note: The direction from ``atom_index_1`` to ``atom_index_2`` determines which fragment of the molecule will rotate. The atoms connected to ``atom_index_2``, excluding the path back to ``atom_index_1``, will be rotated around the axis defined by the bond. >>> lrmbuilder.check_atom_index('1a.sdf') [return value is a nglview; click an atom to show its index] >>> modified_ligand = lrmbuilder.change_dihedral('1a.sdf', 30, 8, 180) [another nglview object showing the new conformation] Finally, use the ``gen_ligand_ff()`` method to generate ligand force fields. The following arguments are available for this method: * ligand_ff (list[LigandForceField]): A list of ligand force fields to be generated. * modified_ligands (list, optional): A list of modified ligand outputs from the ``change_dihedral()`` method. Default is an empty list ([]). :: from molcube.ligand_modeler.enum import * ligand_ff = [LigandForceField.OPENFF_FAST] lrmbuilder.gen_ligand_ff(ligand_ff)