lumenairy 5.32.0 @ D:\Metacept\Neurophos\Python_Test_Scripts\Free_Space_Optics\Lumenairy\lumenairy\__init__.py
  _lens_traced.py 34ef5a9d95279b8f
  carrier.py 5a1b0d1021969df1
D:\Metacept\Neurophos\Python_Test_Scripts\Free_Space_Optics\Lumenairy\validation\repro_traced_carrier_121\_d121_common.py:78: UserWarning: D:\Metacept\Neurophos\Python_Test_Scripts\Free_Space_Optics\Reverse_Symmetric_ASM\tx4designstudy121\20260707 dll Tx02-MSOP16.zmx: Zemax surface 9 is a DGRATING.  Its GEOMETRY is imported as the flat/conic surface it is, and its grating data (period 113.7656 um, design order -4, azimuth 0.0 deg) is attached at prescription['diffractives'] -- but NO diffraction is applied by apply_real_lens / apply_real_lens_traced, which propagate the surface as flat.  Run the orders explicitly: put {'doe': rx['diffractives'][k]} in propagate_traced_carrier_chain's groups list (its gap_before 51.5393 mm / gap_after 0.0000 mm are then bookkept for you -- give the group that FOLLOWS the last DOE entry gap_before=0, since gap_after already carries that leg), one order per congruence via propagate_traced_carrier_chain_multi.
  rx = la.load_zemax_zmx(ZMX)
D:\Metacept\Neurophos\Python_Test_Scripts\Free_Space_Optics\Lumenairy\validation\repro_traced_carrier_121\_d121_common.py:78: UserWarning: D:\Metacept\Neurophos\Python_Test_Scripts\Free_Space_Optics\Reverse_Symmetric_ASM\tx4designstudy121\20260707 dll Tx02-MSOP16.zmx: Zemax surface 11 is a DGRATING.  Its GEOMETRY is imported as the flat/conic surface it is, and its grating data (period 113.7656 um, design order -2, azimuth 270.0 deg) is attached at prescription['diffractives'] -- but NO diffraction is applied by apply_real_lens / apply_real_lens_traced, which propagate the surface as flat.  Run the orders explicitly: put {'doe': rx['diffractives'][k]} in propagate_traced_carrier_chain's groups list (its gap_before 0.0000 mm / gap_after 7.0000 mm are then bookkept for you -- give the group that FOLLOWS the last DOE entry gap_before=0, since gap_after already carries that leg), one order per congruence via propagate_traced_carrier_chain_multi.
  rx = la.load_zemax_zmx(ZMX)

   order    oracle     shipped  concentric   offcentre res shippedres concentricres offcentre
     0,0   90.5324     90.5801     90.5801     90.5801     -0.0477     -0.0477     -0.0477   shas 4e9effd4/4e9effd4/4e9effd4  [130s]
    -1,0   90.5768     90.5477     90.6753     90.5493      0.0290     -0.0985      0.0275   shas b2a8b150/79aa25da/21f8d4a3  [144s]
    -2,0   90.6650     90.6016     90.7918     90.6028      0.0634     -0.1267      0.0623   shas 88f726eb/432ca6c1/9a78c2b6  [145s]
    -3,0   90.6961     90.6062     88.6630     90.6052      0.0898      2.0331      0.0909   shas cf0bc1f3/57fa522d/807dcc5e  [159s]
    -4,0   90.5035     90.3625     23.1918     90.3625      0.1410     67.3117      0.1410   shas 7845b7a8/f33e8077/7845b7a8  [150s]
   -4,-2   90.1071     89.9554     10.9619     89.9554      0.1517     79.1452      0.1517   shas c4b850ea/7ed98c93/c4b850ea  [158s]

NULL: on axis all three arms must be BYTE-IDENTICAL (zero decentre -> no branch to choose).
