# _eightyseven_—read and write `gro` files, pretty quickly A `gro` file (Gromos87) describes molecular structures in a plain-text format. (See [the Gromacs manual][gro_man] or [the old pretty manual][gro_man_legacy].) Note that, for now, only reading and writing of the classic fixed format is supported. The additional precision reading mode is on the agenda. _eightyseven_ can format the atoms section of a gro file in a parallel fashion, with `WriteGro::write_par` and related methods. This library comes with its own `Structure` type, which mirrors the information that is stored in `gro` files. For `Structure`, the `ReadGro`, `WriteGro`, and `WriteGroPar` traits are implemented. The reading and writing functionality provided by these traits are provided as good default implementations, which rely on a couple of easy to implement bridging functions. This makes implementing the traits for custom types very easy. Moreover, rather specialized readers that read only a subset of the atom line fields can be implemented easily and efficiently by setting the flags of the `ReadGro::PARSE_LIST` constant. ```rust use eightyseven::structure::Structure; // Read the structure from a file. use eightyseven::reader::ReadGro; let mut structure = Structure::open_gro("tests/eq.gro")?; println!(" title: {}", structure.title); println!("natoms: {}", structure.natoms()); // Modify the structure. // For example, center the structure such that the `BB` beads are centered. let bb_positions = structure .atoms .iter() .filter(|&atom| atom.atomname.as_str() == "BB") .map(|atom| atom.position); let bb_center = bb_positions.clone().sum::() / bb_positions.count() as f32; for atom in &mut structure.atoms { atom.position -= bb_center; } // And write the structure. use eightyseven::writer::WriteGro; structure.save_gro("eq_offset.gro")?; // Or, for fast writing of large files, format the atom section in parallel. use eightyseven::writer::WriteGroPar; structure.save_gro_par("eq_offset.gro")?; // For both single-threaded and parallel formatting, generic writers exist as well. // They can write to any type that implements `io::Write`. structure.write_par(&mut std::io::empty())?; ``` ## Documentation Documentation is available at [docs.rs][docs]. Or locally, with `cargo doc`. ## Installation The usual installation procedure applies. ```console $ cargo add eightyseven ``` ## Tests and benchmarks Tests and benchmarks are included. Run them in the cloned repository. ```console $ git clone https://git.sr.ht/~ma3ke/eightyseven $ cd eightyseven $ cargo test $ cargo bench ``` ## See also I have written an `xtc` reader library as well, called [_molly_][molly]. `xtc` is a compressed trajectory format for Gromacs. The graphing data format that is output by Gromacs analysis commands is `xvg`. [_phrace_][phrace] is a terminal viewer for that data format. [gro_man]: https://manual.gromacs.org/current/reference-manual/file-formats.html#gro [gro_man_legacy]: https://manual.gromacs.org/archive/5.0.3/online/gro.html [docs]: https://docs.rs/eightyseven/latest [molly]: https://git.sr.ht/~ma3ke/molly [phrace]: https://git.sr.ht/~ma3ke/phrace --- By Marieke Westendorp, 2024.