The script is intended to be used from PyMol molecular visualization system and allows one to generate &QM_KIND, &LINK and &CELL parts of CP2K input easily. Given a molecular object name and QM part selection name (which can be defined using either approach available in PyMol) it generates output file with corresponding input groups.
To use the script:
1. Save it to some file
2. Start PyMol and issue the following command from it’s shell:
> run /path/to/script.py
3. Select qm part of your system using either mechanism available ni pymol, the issue a command:
> gen_cp2k_qmmm filename, qm_part_selection_name, the_whole_system_object
The output will be saved to file «filename».
N.B.: The file will be overwritten!
The script:
# PyMol script to generate part of the &QMMM section of CP2K input.
#
# USAGE:
# gen_cp2k_qmmm filename, qm_part_selection_name, the_whole_system_object
#
# N.B.: The output is written to file "filename". "Filename" is overwritten!
#
# REFERENCES:
# CP2K: http://cp2k.berlios.de/
# PyMol: http://www.pymol.org/
#
# AUTHOR: piton_at_erg.biophys.msu.ru
from pymol import cmd, stored
def gen_cp2k_qmmm (filename, qmsele, mmsele):
f = open(filename, 'w')
print >> f, "&QMMM"
# QMMM CELL setup
# n.b. 6A padding
# n.b. cell should be cubic in case of PSOLVER=WAVELET
ext = cmd.get_extent(qmsele)
cell = (ext[1][0]-ext[0][0] + 6, ext[1][1]-ext[0][1] + 6, ext[1][2]-ext[0][2] + 6)
print >> f, " &CELL\n ABC %.2f %.2f %.2f\n &END CELL" % cell
# KINDS
stored.elems=[]
cmd.iterate_state(1, qmsele, "stored.elems.append(elem)")
kinds = set(stored.elems)
for kind in kinds:
print >> f, " &QM_KIND", kind
stored.ids=[]
cmd.iterate_state(1, qmsele + ' & elem '+kind, "stored.ids.append(ID)")
print >> f, " MM_INDEX",
for id in stored.ids:
print >> f, id,
print >> f, "\n &END QM_KIND"
# LINKS
stored.qm_ids = []
cmd.iterate_state(1, qmsele, "stored.qm_ids.append(ID)")
model = cmd.get_model(mmsele)
for bond in model.bond:
[ia, ib] = bond.index
a = model.atom[ia].id
b = model.atom[ib].id
link = 0
if ((a in stored.qm_ids) and not (b in stored.qm_ids)):
qmid = a
mmid = b
link = 1
if ((b in stored.qm_ids) and not (a in stored.qm_ids)):
mmid = a
qmid = b
link = 1
if link: print >> f, " &LINK\n QM_INDEX %d\n MM_INDEX %d\n QM_KIND H\n &END LINK" % (qmid, mmid)
print >> f, "&END QMMM"
cmd.extend("gen_cp2k_qmmm", gen_cp2k_qmmm)