Source code for espressomd.io.writer.vtf

# Copyright (C) 2010-2022 The ESPResSo project
#
# This file is part of ESPResSo.
#
# ESPResSo is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ESPResSo is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


[docs]def vtf_pid_map(system, types='all'): """ Generates a VTF particle index map to ESPResSo ``id``. This fills the gap for particle ID's as required by VMD. Parameters ---------- system: :obj:`espressomd.system.System` types : :obj:`str` Specifies the particle types. The id mapping depends on which particles are going to be printed. This should be the same as the one used in :func:`writevsf()` and :func:`writevcf()`. Returns ------- dict: A dictionary where the values are the VTF indices and the keys are the ESPresSo particle ``id``. """ if not hasattr(types, '__iter__'): types = [types] if types == "all": types = [types] id_to_write = [] for p in system.part: for t in types: if t in (p.type, "all"): id_to_write.append(p.id) return dict(zip(id_to_write, range(len(id_to_write))))
[docs]def writevsf(system, fp, types='all'): """ writes a VST (VTF Structure Format) to a file. This can be used to write the header of a VTF file. Parameters ---------- system: :obj:`espressomd.system.System` types : :obj:`str` Specifies the particle types. The string 'all' will write all particles fp : file File pointer to write to. """ vtf_index = vtf_pid_map(system, types) fp.write(f"unitcell {' '.join(map(str, system.box_l))}\n") for pid, vtf_id, in vtf_index.items(): partcl = system.part.by_id(pid) fp.write( f"atom {vtf_id} radius 1 name {partcl.type} type {partcl.type} \n") for pid, vtf_id, in vtf_index.items(): for b in system.part.by_id(pid).bonds: if system.part.by_id(b[1]).id in vtf_index: fp.write( f"bond {vtf_id}:{vtf_index[system.part.by_id(b[1]).id]}\n")
[docs]def writevcf(system, fp, types='all'): """ writes a VCF (VTF Coordinate Format) to a file. This can be used to write a timestep to a VTF file. Parameters ---------- system: :obj:`espressomd.system.System` types : :obj:`str` Specifies the particle types. The string 'all' will write all particles fp : file File pointer to write to. """ vtf_index = vtf_pid_map(system, types) fp.write("\ntimestep indexed\n") for pid, vtf_id, in vtf_index.items(): fp.write(f"{vtf_id} {' '.join(map(str, system.part.by_id(pid).pos))}\n")