fastPASTA uses Semantic Versioning.
For extensive documentation of public facing source code see documentation or invoke cargo doc --open
.
For an exhaustive list of the data verification done via the check
subcommand, see list of checks.
Releases and associated changelogs can be found at releases.
To verify or view curated content of the scanned raw binary data from ALICE.
The rust toolchain is required to compile the binary. Use the link to download a Windows installer. On macOS, Linux or other Unix-like OS simply run
shell
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
and follow the on-screen instructions.
shell
cargo install fastpasta
Updating fastpasta simply requires rerunning cargo install fastpasta
Run cargo build -r
and find the binary in /target/release/fastpasta
shell
$ fastpasta -h
```shell
$ lz4 -d input.raw -c | fastpasta --filter-link 3 | fastpasta view rdh
lz4
```
Piping is often optional and avoiding it will improve performance. e.g. the following is equivalent to the previous example, but saves significant IO overhead, by using one less pipe.
shell
$ lz4 -d input.raw -c | fastpasta --filter-link 3 view rdh
Enable all generic checks: sanity
(stateless) AND running
(stateful)
shell
$ fastpasta input.raw --filter-link 0 check all
Enable all sanity
checks and include checks applicable to ITS
only
shell
$ fastpasta input.raw check sanity its --filter-link 0
less
Generate ITS readout frame view
shell
$ fastpasta input.raw view its-readout-frames | less
View only readout frames from link #3
shell
$ fastpasta input.raw view its-readout-frames -f 3 | less
```mermaid flowchart TD; start["fastpasta"] --> topsubcmd{"Check or view?"};
topsubcmd -- "view" --> viewtype{"Type of view"}; viewtype -- "rdh" --> viewrdh{{$ fastpasta view rdh}}; viewtype -- "its-readout-frames" --> viewroframes{{$ fastpasta view its-readout-frames}};
topsubcmd -- "check" --> check_type{"Type of check"};
checktype -- "sanity" --> checksanity{"$ fastpasta check sanity or target system"}; checksanity -- "its" --> checksanity_its{{$ fastpasta check sanity its}};
checktype -- "all" --> checkall{"$ fastpasta check all or target system"}; checkall -- "its" --> checkallits{{$ fastpasta check all its}}; checkall -- "its-stave" --> checkallitsstave{Which ITS stave?}; checkallitsstave -- "--filter-its-stave LXYZ" --> checkallitsstavefilter{{$ fastpasta check all its-stave --filter-its-stave L512}}; ```
shell
MEMORY_OFFSET: [ERROR_CODE] ERROR_MESSAGE
shell
0xE450FFD: [E10] RDH sanity check failed: data_format = 255
But they signify categories of errors.
E.g. all RDH sanity checks have the same error code, but the error message will specify which field failed.
The following is a list of error codes and their meaning, x
is a placeholder for any number 0-9.
* [Ex0] - Sanity check
* [E1x] - RDH
* [E3x] - IHW
* [E4x] - TDH
* [E5x] - TDT
* [E6x] - DDW0
* [E7x] - Data word (Even number: IB, Odd number: OB) E70 is sanity check for both IB/OB.
* [E8x] - CDW
* [E99] - Miscellaneous, such as error in ID when 2 or more words could be valid in the current state.
Run the full test suite with:
shell
$ cargo test -- --test-threads=1 --nocapture
Passing --test-threads=1
and --nocapture
is necessary as several tests asserts that content written to stdout matches expectations, which will break when tests are run concurrently or writing to stdout is suppressed.
Apache 2.0 or MIT at your option.
Passively Maintained. There are no plans for new features, but the maintainer intends to respond to issues that get filed.
In the tables below fastPASTA
is compared with rawdata-parser
and decode.py
in typical verification tasks. Hyperfine is used for benchmarking, with cache warmup
.
| Tool | Command | Mean [s] | Min [s] | Max [s] |
|:---|:---|---:|---:|---:|
|fastPASTA| fastpasta input.raw check all
| 0.039 ± 0.001 | 0.037 | 0.043 |
|rawdata-parser| ./rawdata-parser --skip-packet-counter-checks input.raw
| 0.381 ± 0.012 | 0.356 | 0.438|
|decode.py| python3 decode.py -i 20522 -f input.raw --skip_data
| 13.674 ± 0.386 | 13.610 | 14.499 |
| Tool | Command | Mean [s] | Min [s] | Max [s] |
|:---|:---|---:|---:|---:|
|fastPASTA| fastpasta input.raw check all
| 0.504 ± 0.010 | 0.482 | 0.530 |
|rawdata-parser| rawdata-parser input.raw
| 2.951 ± 0.102 | 2.867 | 3.300 |
|decode.py| Verifying multiple links simultaneously is not supported | N/A | N/A | N/A |
| Tool | Command | Mean [s] | Min [s] | Max [s] |
|:---|:---|---:|---:|---:|
|fastPASTA| fastpasta input.raw check all ITS
| 0.106 ± 0.002 | 0.103 | 0.111 |
|rawdata-parser| Verifying payloads is not supported | N/A | N/A | N/A |
|decode.py| python3 decode.py -i 20522 -f input.raw
| 55.903 ± 0.571 | 54.561 | 56.837 |
The primary release profile of fastPASTA is already very fast, but if you absolutely need 10-20% more speed, a faster build profile exists that utilizes the experimental rust nightly
toolchain.
The rust compiler rustc
does not yet provide access to all the features that its backend LLVM
has. But the experimental nightly
rust toolchain allows passing flags directly to LLVM
. fastPASTA includes configuration for a build profile release-nightly
which utilizes LLVM
to achieve more speed at the cost of compilation time and binary size. As of this writing, the stable channel of Rust does not have a way to pass compiler flags to the LLVM backend. The increased speed is mainly achieved through configuring a higher threshold for inlining, which will increase speed but also compilation time and binary size, and most crucially, cache pressure. The performance impact will be highly dependent on the machine fastPASTA runs on. Better/more CPU cache will lead to a higher performance gain. With >1 GB individual link data, the performance on one particular CERN machine running CentOS Stream 8, as measured by hyperfine
increased by ~17%.
shell
$ rustup toolchain install nightly
$ rustup run nightly rustc --version
release-nightly
experimental build profileshell
$ cargo +nightly build --profile release-nightly
/target/release-nightly/fastpasta