Repository navigation
v3.1.0
Measured efficiencies sampled differently along another axis (#252)
MeasuredMirror, MeasuredFilter and MeasuredRulings interpolate a measured efficiency along the axis of its wavelengths. Before this release they refused a measurement whose wavelengths also varied along another axis, such as a separate set of samples for each of several witness samples. The grating witnesses in esis are such a measurement, and efficiency() raised on them.
axis_wavelength, a new keyword-only field of each class, names the axis to interpolate along. The other axes of the wavelengths then broadcast against the rays, so a ray with achannelaxis is matched to the measurement of its own channel rather than crossed with all of them, and they are part ofshape.- Left at
None(the default), the wavelengths must vary along a single axis besidesaxis_angle, as before. Uncertain wavelengths now interpolate on this path too. - Measured at one angle. Without
axis_angle, the direction may now be repeated along any axis, as it is when measurements at the same angle are stacked withna.stack. It must still be the same everywhere. A measurement at several angles whoseaxis_anglewas forgotten is still refused, with a message asking for it. A stack's wavelengths vary along the stacking axis, so a stack also needsaxis_wavelength. - With
axis_angle, the angles may be repeated along the wavelength axis, as in a table of wavelength against angle, but may not vary along it. shaperefuses whateverefficiency()refuses. Before, it reported a shape for measurements whose efficiency always raised, such as angles which decrease or are not angles. It also now includes the axes the angles vary along besidesaxis_angle, which reach the efficiency through its weights in angle.
Every layer of a coating, written out (#253)
AbstractLayerSequence.layers_ is every Layer of a sequence, first to last. Each nested sequence is written out in place, and each period of a PeriodicLayerSequence in turn, so counting the layers of a material in it counts the layers of that material deposited. MultilayerMirror.layers holds the top-level items only, where a periodic block is one entry. On the ESIS grating coating, which repeats an Al/SiC/Mg period three times beneath a top group, layers_ gives four Mg layers where a count of layers gives one.
The linear forward model on a GPU (#229, by @jacobdparker)
LinearSystem.weights and LinearSystem.image take device, passed through to named_arrays.regridding.weights, so that the conservative regrid can be built and applied on a GPU. device=None, the default, gives exactly what it did before. The weights are no longer pulled back to the host by the units of the vignetting, since regridding 3.5 and named-arrays 2.14, which optika requires, handle dimensionless weights on the device.
Full Changelog: v3.0.0...v3.1.0