JASCO Spectra Manager .jws
JASCO Spectra Manager saves FT-IR, Raman, UV-Vis, circular dichroism and fluorescence measurements as .jws files. OpenReadout returns every channel as a spectrum with its axis, plus instrument, sample and acquisition settings (table below). Derived from public files written by FT/IR-4600, FT/IR-4700, NRS-5100, V-630, V-730, J-1500 and FP-8300 instruments, Spectra Manager text and CSV exports of the same measurements, and jws2txt (MIT) as a second opinion. Provenance: docs/provenance/jasco-jws.md. Crate: openreadout-spectro.
| format id | files | reads | confidence |
|---|---|---|---|
jasco-jws |
.jws of JASCO Spectra Manager (compound-file and flat containers); .jrs from the instruments’ firmware (flat) |
every channel as a spectrum (%T, %R, absorbance, single-beam, intensity, CD, HT voltage), its axis (wavenumber, Raman shift, wavelength, time), instrument model and serial, sample name and comment, measurement time, FT-IR acquisition settings | high (evidence rubric, docs/assurance.md) |
Not read: interval/kinetics files (.jwb), spectra-manager projects, JASCO’s text exports (they
are text; jcamp-dx-like but not JCAMP).
Containers
The first bytes decide; the extension is the same.
Compound file (D0 CF 11 E0; Spectra Manager 1.x and 2.x)
| stream | content | our reading |
|---|---|---|
Header |
UTF-16 L~, SPCMAN2, R2.00.00, 80x86, VC++6.0 |
detection (L~ … SPCMAN); format_version |
DataInfo |
u32 version (3); u32; u32; u32 channel count; u32 grid flag (1 regular, 0 explicit X-Data); u32 points; f64 first x, last x, step (negative when descending); four u32 descriptors: the x axis, then one per channel, the remaining slots repeating from the start; then the saved plot view. 96 bytes for one channel, +44 per further channel |
axis, channels |
Y-Data |
float32, channel-major, exactly 4 × channels × points bytes | one trace per channel |
X-Data |
float32 per point (when the grid flag is 0: Raman CCD axes) | irregular axis (trace channel 0) |
ModuleInfo |
u32 version, module name, u16, u16 module id, model, serial (UTF-16 strings with a u32 byte length) | instrument |
SampleInfo |
u32, sample name, comment, a record count, then records (u32 tag, u16 type, value); record 1 is the measurement time (OLE date, UTC) |
sample, comment, started_at |
MeasParam |
u32, u32, a record count, records | FT-IR settings (module 9, below); other instruments’ records raw in the vendor tree |
BaseInfo |
u32, 16-byte id, u8, original path, f64 saved, f64 measured (OLE dates, UTC) | vendor tree; started_at when SampleInfo/MeasParam have none (Raman) |
Record value types: 2 u16, 3 u32, 4 f32, 5 and 7 f64, 8 UTF-16 string; records after a type not in this list are kept as an undecoded byte count.
Axis descriptors: 0x10000100 wavenumber (1/cm, INFRARED SPECTRUM), 0x10000101 Raman shift
(1/cm, RAMAN SPECTRUM), 0x10000103 wavelength (nm), 0x20000203 time (a V-630 time course;
no unit: the time unit is not in a validated field). Any other descriptor is refused (exit 6).
Channel codes: 0x00 transmittance (%), 0x03 absorbance (AU), 0x08 single-beam (FT-IR
background), 0x0E intensity (FP-8300 fluorescence, NRS-5100 CCD counts), 0x1001 circular
dichroism (mdeg when the file’s CD sensitivity text, MeasParam record 20, says mdeg), 0x2001
HT voltage (V). A code not in this list is returned as channel_0x… with a finding.
Refused (exit 6, with a hint): DataInfo version other than 3, more than three channels,
descriptor slots that do not follow the pattern or hold an axis descriptor where a channel code
belongs, grid flags other than 0 and 1. Y-Data/X-Data
sizes that do not match are corrupt (exit 4).
Flat file (L~S ; Spectra Manager 2.x, instrument firmware)
| offset | content |
|---|---|
| 0x08 | SPECMAN (Spectra Manager) or SPECIRM (firmware) |
| 0x20 | R2.0.0 |
| 0x84 | i32 points |
| 0x88, 0x90, 0x98 | f64 first x, last x, step |
| 0xA0 | x unit: 0 cm⁻¹, 3 nm (followed by 01 00 10) |
| 0xA4 | y mode: 0 %T, 2 %R, 3 absorbance, 9 single-beam reference, 10 single-beam sample (followed by 00 00 00) |
| 0xC8 | i64 data length (= 4 × points) |
| 0x140, 0x160, 0x180, 0x1C0 | model, serial, title, comment (NUL-terminated) |
| 0x2C0 | i32 time (Unix seconds, UTC) |
| 0x740 to the end | float32 y values (the data run from file length − data length, which is 0x740 in every file; any other value is refused as a truncated or extended file) |
Other container ids, versions, x units or y modes are refused.
What the reader returns
- One trace per channel, one sweep: the channel’s name as trace name and y quantity
(
transmittance,absorbance,reflectance,single_beam,single_beam_reference,single_beam_sample,intensity,circular_dichroism,ht_voltage), values as stored (float32; JASCO’s −1.18e-38 invalid-point marker is kept, as its exports print it).extra.axis={quantity, unit, first, last, step, size}with x = first + step × i (the stored last x is only compared: a finding when it disagrees by more than one step); anX-Dataaxis is{irregular: true, channel: 0}and the trace has two channels.extra.data_type:INFRARED SPECTRUM,RAMAN SPECTRUM,UV/VIS SPECTRUM,CIRCULAR DICHROISM SPECTRUM,FLUORESCENCE SPECTRUM,UV/VIS KINETICS;extra.channel_code,extra.title. - Experiment: instrument vendor JASCO, model and serial; sample name; acquisition comment and
started_at(UTC); for FT-IR (module 9) method parametersaccumulations,resolution(cm⁻¹),aperture(mm),scan_speed(mm/s),gain,filter(Hz),light_source,detector— named from the exports’ footers (records 1, 2, 3, 4, 6, 32, 47, 48). - Vendor tree
jasco: the container, header text,DataInfofields and descriptors, module, sample records, measurement-parameter records (tag, type, value), base info (original path, saved and measured times), the stream list; for flat files every header field. info --view structure: the compound file’s streams, or the flat file’s header and data blocks.
Validation
cargo test -p openreadout-corpus-tests --features corpus (tests/jasco_oracle/mod.rs,
oracle/jasco_oracle.py):
- Spectra Manager exports of five measurements (FT-IR %T compound files in two locales, the Raman
compound file with its
X-Dataaxis, the V-730 flat file): point count, axis unit, y quantity, x within 0.005 and y to the export’s six significant digits at 256 rows; model and serial; the eight FT-IR settings; the measurement time equal to the export’s local time minus whole hours. One more export has the same name but is another acquisition: its instrument facts only. - jws2txt (MIT, black box) on every compound file: the same channels (count, names), point counts and values at 64 points per channel (CD/HT/absorbance files included).
- One further depositor’s file is held out (
docs/benchmark/heldout.md).
Vocabulary (public API of openreadout-spectro, JASCO)
| identifier | meaning |
|---|---|
JwsReader |
reader of JASCO .jws/.jrs files |
JWS_FORMAT_ID |
jasco-jws |
SpectroDataset |
the dataset the spectroscopy readers share |
How this reader was derived, file by file: provenance log.