eightyseven 0.1.1

Read and write gro files, pretty quickly.
Documentation
# _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::<glam::Vec3>() / 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.