Initial commit

This commit is contained in:
redclawsystems
2026-03-04 00:08:42 +00:00
commit 4d88dc0584
4449 changed files with 1556714 additions and 0 deletions
@@ -0,0 +1,192 @@
//! CTF MEG Format Constants
//!
//! Constants for parsing CTF MEG data files.
/// MEG4 file magic header for version 4.1
pub const MEG4_MAGIC_V41: &[u8; 8] = b"MEG41CP\0";
/// MEG4 file magic header for version 4.2
pub const MEG4_MAGIC_V42: &[u8; 8] = b"MEG42CP\0";
/// RES4 file magic header for version 4.1
pub const RES4_MAGIC_V41: &[u8; 8] = b"MEG41RS\0";
/// RES4 file magic header for version 4.2
pub const RES4_MAGIC_V42: &[u8; 8] = b"MEG42RS\0";
/// Maximum number of coils per sensor
pub const MAX_COILS: usize = 8;
/// Maximum channel name length
pub const MAX_CHANNEL_NAME: usize = 32;
/// Size of the MEG4 header in bytes
pub const MEG4_HEADER_SIZE: usize = 8;
/// Size of each sample in bytes (int32)
pub const SAMPLE_SIZE: usize = 4;
/// Maximum MEG4 file size (2GB limit)
pub const MAX_MEG4_FILE_SIZE: u64 = 2_147_483_648;
// ============================================================================
// Channel type constants
// ============================================================================
/// MEG magnetometer/gradiometer channel
pub const CTF_MEG_CH: i16 = 0;
/// Reference MEG channel
pub const CTF_REF_MEG_CH: i16 = 1;
/// EEG channel
pub const CTF_EEG_CH: i16 = 2;
/// Stimulus/trigger channel
pub const CTF_STIM_CH: i16 = 3;
/// Analog to digital channel
pub const CTF_ADC_CH: i16 = 4;
/// Head localization coil channel
pub const CTF_HLC_CH: i16 = 5;
/// Digital input channel
pub const CTF_DIN_CH: i16 = 6;
/// Digital auxiliary channel
pub const CTF_DAC_CH: i16 = 7;
/// SCLK channel (system clock)
pub const CTF_SCLK_CH: i16 = 8;
/// SAM (synthetic aperture magnetometry) channel
pub const CTF_SAM_CH: i16 = 9;
/// Virtual channel
pub const CTF_VIRTUAL_CH: i16 = 10;
/// System channel
pub const CTF_SYS_CH: i16 = 11;
// ============================================================================
// Sensor type constants
// ============================================================================
/// Reference magnetometer
pub const CTF_REF_MAG: i16 = 0;
/// Reference gradiometer
pub const CTF_REF_GRAD: i16 = 1;
/// CTF 275 system MEG sensor
pub const CTF_275_MAG: i16 = 2;
/// CTF 275 system reference
pub const CTF_275_REF: i16 = 3;
// ============================================================================
// Gradient order constants
// ============================================================================
/// No gradient compensation
pub const CTF_NO_GRAD: i16 = 0;
/// First order gradient compensation
pub const CTF_G1BR: i16 = 1;
/// Second order gradient compensation
pub const CTF_G2BR: i16 = 2;
/// Third order gradient compensation
pub const CTF_G3BR: i16 = 3;
// ============================================================================
// RES4 file structure sizes (based on CTF specification)
// ============================================================================
/// Size of general header section
pub const RES4_GENERAL_HEADER_SIZE: usize = 1844;
/// Size of each channel info entry
pub const RES4_CHANNEL_INFO_SIZE: usize = 1360;
/// Offset to number of channels in header
pub const RES4_NCHAN_OFFSET: usize = 1288;
/// Offset to sampling frequency in header
pub const RES4_SFREQ_OFFSET: usize = 1296;
/// Offset to number of samples in header
pub const RES4_NSAMP_OFFSET: usize = 1304;
/// Offset to number of trials in header
pub const RES4_NTRIALS_OFFSET: usize = 1312;
/// Offset to channel info section
pub const RES4_CHANNEL_INFO_OFFSET: usize = 1844;
// ============================================================================
// Channel info offsets within RES4_CHANNEL_INFO_SIZE block
// ============================================================================
/// Offset to channel name (32 bytes string)
pub const CH_NAME_OFFSET: usize = 0;
/// Offset to channel type (i16)
pub const CH_TYPE_OFFSET: usize = 32;
/// Offset to sensor type (i16)
pub const CH_SENSOR_TYPE_OFFSET: usize = 34;
/// Offset to proper gain (f64)
pub const CH_PROPER_GAIN_OFFSET: usize = 48;
/// Offset to q_gain (f64)
pub const CH_Q_GAIN_OFFSET: usize = 56;
/// Offset to io_gain (f64)
pub const CH_IO_GAIN_OFFSET: usize = 64;
/// Offset to io_offset (f64)
pub const CH_IO_OFFSET_OFFSET: usize = 72;
/// Offset to number of coils (i16)
pub const CH_NUM_COILS_OFFSET: usize = 80;
/// Offset to gradient order (i16)
pub const CH_GRAD_ORDER_OFFSET: usize = 82;
/// Offset to first coil position (starts coil array)
pub const CH_COILS_OFFSET: usize = 96;
/// Size of each coil info entry
pub const COIL_INFO_SIZE: usize = 112;
// ============================================================================
// Coil info offsets within COIL_INFO_SIZE block
// ============================================================================
/// Offset to coil position X (f64)
pub const COIL_POS_X_OFFSET: usize = 0;
/// Offset to coil position Y (f64)
pub const COIL_POS_Y_OFFSET: usize = 8;
/// Offset to coil position Z (f64)
pub const COIL_POS_Z_OFFSET: usize = 16;
/// Offset to coil orientation X (f64)
pub const COIL_ORI_X_OFFSET: usize = 24;
/// Offset to coil orientation Y (f64)
pub const COIL_ORI_Y_OFFSET: usize = 32;
/// Offset to coil orientation Z (f64)
pub const COIL_ORI_Z_OFFSET: usize = 40;
/// Offset to coil area (f64)
pub const COIL_AREA_OFFSET: usize = 48;
/// Offset to coil turns (i32)
pub const COIL_TURNS_OFFSET: usize = 56;