documentation/notes/experiment_heavily_distorted.md
## Experiment: heavily distorted molecule
To test the system I made a really nastily distorted xylene and
checked what would happen passing it to Fragmenstein.
Make a distorted xylene:
```python
from rdkit import Chem
from rdkit.Geometry.rdGeometry import Point3D
from rdkit.Chem import AllChem
import random
from rdkit_to_params import Params
xylene = Chem.MolFromSmiles('c1ccc(C)cc1C')
AllChem.EmbedMolecule(xylene)
Params.load_mol(xylene, name='XYL') # adds atomnames in place basically
Chem.MolToMolFile(xylene, 'xylene.pre.mol')
conf = xylene.GetConformers()[0]
alpha, beta = 0.3, 0.5 # scale & shape
for ai in range(xylene.GetNumAtoms()): #type: int
point :Point3D = conf.GetAtomPosition(ai)
point.x += random.weibullvariate(alpha,beta)
point.y += random.weibullvariate(alpha,beta)
point.z += random.weibullvariate(alpha,beta)
conf.SetAtomPosition(ai, point)
Chem.MolToMolFile(xylene, 'xylene.post.mol')
```
Now, let's make a PDB file with a calcium 100 Å from the origin.
This is because the coordinate constraints require a second point
in order to fix to the origin basically.
As a result, the Fragmenstein protocol cannot work with out a template.
```python
import pyrosetta
import pyrosetta_help as ph
pyrosetta.init(extra_options=ph.make_option_string(no_optH=False,
ignore_unrecognized_res=True,
load_PDB_components=False,
ignore_waters=False),
set_logging_handler='logging'
)
pose = pyrosetta.pose_from_sequence('X[CA]')
res = pose.residue(1)
far = pyrosetta.rosetta.numeric.xyzVector_double_t(100,0,0)
for i in range(1, 1+res.natoms()):
xyz = res.xyz(i)
xyz.x += 100
res.set_xyz(i, xyz)
pose.dump_pdb('ref.pdb')
```
Now lets feed it the janky xylene
```python
from fragmenstein import Victor
import nglview as nv
victor = Victor(hits=[xylene, ],
pdb_filename='ref.pdb',
ligand_resn='XYL',
covalent_resi=1)
# victor.monster_mmff_minisation = False/True
victor.combine()
# show it!
view = nv.show_file(StringIO(victor.unminimised_pdbblock), ext='pdb')
view.update_ball_and_stick(colorValue='#00B4C4', smoothSheet=True) # mid-dark cyan
c2 = view.add_component(StringIO(victor.minimized_pdbblock), ext='pdb')
c2.update_ball_and_stick(colorValue='#F8766D', smoothSheet=True) # salmon
view
```
Whereas `place` stretches into place a provided idealised molecule,
`combine` stretches out of place into a more ideal state a fragmenstein molecule.
So the combined janky xylene with nothing else will be ugly.
To speed things up and to work without PyRosetta
an optional pre-minimisation step using rdkit is done which
can be disabled via `victor.monster_mmff_minisation = False`.
If PyRosetta is run, the result is the same as the FastRelax call
uses `ref2015_cart` scorefunction with cartersian extra enabled.
If the initial distorsion is too much it fails as 4 Å is too long.