#binary-data #alice #reader #verification #parser #detector #protocols

alice_protocol_reader

用于从ALICE探测器读取原始二进制数据到便于分析的结构的读取库

11个版本 (6个重大更改)

0.15.0 2024年5月23日
0.14.0 2024年3月10日
0.13.0 2024年2月10日
0.12.0 2023年10月9日
0.9.0 2023年7月26日

#1312解析器实现

Download history 157/week @ 2024-05-20 16/week @ 2024-06-03 10/week @ 2024-06-10

816 每月下载次数
用于 fastpasta

MIT/Apache

125KB
3K SLoC

ALICE 协议读取器

coverage report Crates.io docs.rs

目的

提供简单的、高效的读取器(stdio/file),允许用户将ALICE探测器的原始二进制协议读取到便于进一步分析的数据结构中。

示例

首先将 alice_protocol_reader 包添加到您的项目中

$ cargo add alice_protocol_reader

然后使用便利的 init_reader() 函数在运行时添加适当的读取器(stdin或文件)。使用读取器实例化 InputScanner 并开始读取ALICE数据。

use alice_protocol_reader::input_scanner::InputScanner;
use alice_protocol_reader::init_reader;
use alice_protocol_reader::rdh::RdhCru;

let reader = init_reader(&Some(test_file_path)).unwrap();

let mut input_scanner = InputScanner::minimal(reader);

let rdh = input_scanner.load_rdh_cru::<RdhCru<u8>>().unwrap();

println!("{rdh:?}");

示例输出

RdhCru
        Rdh0 { header_id: 7, header_size: 64, fee_id: 20522, priority_bit: 0, system_id: 32, reserved0: 0 }
        offset_new_packet: 5088
        memory_size: 5088
        link_id: 0
        packet_counter: 0
        cruid_dw: 24
        Rdh1 { bc_reserved0: 0, orbit: 192796021 }
        dataformat_reserved0: 2
        Rdh2 { trigger_type: 27139, pages_counter: 0, stop_bit: 0, reserved0: 0 }
        reserved1: 0
        Rdh3 { detector_field: 0, par_bit: 0, reserved0: 0 }
        reserved2: 0

使用配置自定义InputScanner行为

在您的自定义配置结构体上实现 FilterOpt 并将其传递给 InputScanner 以自定义其行为

use alice_protocol_reader::filter::FilterOpt;

struct MyCfg;

impl FilterOpt for MyCfg {
    fn skip_payload(&self) -> bool {
        // Implement your config rules for determining if you're skipping the payload (only reading `RDH`s)
    }

    fn filter_link(&self) -> Option<u8> {
        // Implement your config rules for setting a link to filter by
    }

    fn filter_fee(&self) -> Option<u16> {
        // Implement your config rules for setting a FEE ID to filter by
    }

    fn filter_its_stave(&self) -> Option<u16> {
        // Implement your config rules for setting an ITS Stave to filter by
    }
}

use alice_protocol_reader::input_scanner::InputScanner;
use alice_protocol_reader::init_reader;
use alice_protocol_reader::rdh::RdhCru;
pub fn main() {
    let reader = init_reader(&Some(test_file_path)).unwrap();

    let mut input_scanner = input_scanner::InputScanner::new(&MyCfg, reader, None); // None: Option<flume::Sender<InputStatType>>

    let rdh = input_scanner.load_cdp::<RdhCru<u8>>();
}

依赖项

~1MB
~15K SLoC