NXoptical_spectroscopy and NXellipsometry¶
NXellipsometry is the NeXus application definition this reader converts into. It builds on the more generic NXoptical_spectroscopy base structure (entry, instrument, sample, user) and adds ellipsometry-specific concepts under ENTRY/data_collection, ENTRY/instrument, and ENTRY/derived_parameters.
The data_collection group¶
ENTRY/data_collection is an NXdata group holding both the raw measurement and its NeXus default-plot metadata:
measured_data— the full result set, shape(N_measurements, N_observables, N_spectrum). For a VASE/CompleteEASE Psi/Delta scan,N_measurementsis the number of angles of incidence,N_observablesis 2 (Psi, Delta), andN_spectrumis the number of wavelength points.NAME_spectrum(e.g.wavelength_spectrum) — the 1D spectral axis, lengthN_spectrum.DATA[*](e.g.Psi_50deg,Delta_60deg) — one field per (angle, observable) combination, each a 1D slice ofmeasured_dataalong the spectrum dimension.
Why the default-plot signal must be 1D, not 3D¶
NeXus's NXdata convention requires the @signal field's shape to line up dimension-by-dimension with its @axes field(s) — a viewer like h5web reads @signal/@axes and expects signal.shape[i] == len(axes[i]). measured_data is intentionally 3D (the application definition says so explicitly), but wavelength_spectrum is 1D, so measured_data itself can never be the default-plot @signal — only a 1D slice of it can be.
That's what the per-field DATA[Psi_50deg] etc. entries are for: each is written as an HDF5 virtual dataset (VDS) — a {"link": "/entry/data_collection/measured_data", "shape": np.index_exp[angle_index, observable_index, :]} template entry — a real, separate 1D dataset that shares storage with measured_data rather than copying it. data_collection/@signal points at the first of these (e.g. Psi_50deg), @axes points at wavelength, and @auxiliary_signals lists the rest, so h5web (or any NeXus-aware viewer) can render a proper multi-line default plot.