# hepmc2
Read and write event files in the `hepmc2` format, also known as
`IO_GenEvent`.
## Caveats
This crate is inspired by the code for the `ReaderAsciiHepMC2` in the
[HepMC3 library](https://gitlab.cern.ch/hepmc/HepMC3), version
3.2.0. The aim is to be fully compatible, but be aware that the
current tests are not exhaustive.
## Example
```rust
// Read events from `events_in.hepmc2` and write them to `events_out.hepmc2`
use hepmc2::{Reader, Writer};
use std::io::BufReader;
use std::fs::File;
let input = BufReader::new(File::open("events_in.hepmc2")?);
let in_events = Reader::from(input);
let output = File::create("events_out.hepmc2")?;
let mut writer = Writer::try_from(output)?;
for event in in_events {
let event = event?;
println!("Current cross section: {}", event.xs);
writer.write(&event)?
}
writer.finish()?;
```
## Async API
By default this crate enables the `sync` feature which exposes a sync API. You
can however switch to using a `tokio`-backed async API by disabling the `sync`
feature and enabling the `tokio` feature.
Either run the following in the root of your crate:
```sh
cargo add hepmc2 --no-default-features -F tokio
```
or make sure a line like the following is present in your `Cargo.toml`:
```toml
hepmc2 = { version = "0.6.0", default-features = false, features = ["tokio"] }
```
The async API is exactly the same as the sync one but IO operations will return
futures that you will, as usual, need to call `await` on.
### Example
```rust
// Read events from `events_in.hepmc2` and write them to `events_out.hepmc2`
use hepmc2::{Reader, Writer};
use tokio::io::BufReader;
use tokio::fs::File;
let input = BufReader::new(File::open("events_in.hepmc2").await?);
let mut in_events = Reader::from(input);
let output = File::create("events_out.hepmc2").await?;
let mut writer = Writer::try_from(output).await?;
while let Some(event) = in_events.next().await {
let event = event?;
println!("Current cross section: {}", event.xs);
writer.write(&event).await?
}
writer.finish().await?;
```
License: GPL-3.0-or-later