Skip to content

Generic functions for chunked event writing - #2691

Draft
mads-bertelsen wants to merge 26 commits into
mccode-dev:mainfrom
mads-bertelsen-agentic:DETECTOR_OUT_LIST
Draft

mads-bertelsen wants to merge 26 commits into
mccode-dev:mainfrom
mads-bertelsen-agentic:DETECTOR_OUT_LIST

Conversation

@mads-bertelsen

Copy link
Copy Markdown
Contributor

Free-form text area

Please describe what your PR is adding in terms of features or bugfixes:

Ongoing work to create a dedicated set of functions to handle event buffering and writing. Currently Monitor_nD has the most complete system for event handling implemented at component level, though there are issues with actually chunk saving while using MPI, so the buffer has to be large enough that is not filled during trace.

On this branch I am trying to create a set of functions that take care of the buffer and chunk writing during MPI to both ASCII and NEXUS and with both CPU and GPU to hide that complexity from components. It's also migrating Monitor_nD and other existing components to use these functions instead of it having to implement a buffer on component level or inheriting from Monitor_nD.

There is still work to be done, but putting this pull request up now for transparency so anyone interested can follow the development and chime in with any suggestions.


Declaration of use of AI-tools

  • Please add a checkmark here if you used AI-tools during the work for this contribution
  • Furter, please describe how / where and for what the tools were used:

Development OS / boundary conditions

Please describe what OS you developed and tested your additions on, and if any special dependencies are required:


PR Checklist for contributing to McStas/McXtrace

For a coherent and useful contribution to McStas/McXtrace, please fill in relevant parts of the checklist:

  • My contribution includes patches to an existing component file

    • I have used the mcdoc utility and rendered a reasonable documentation page for the component (please attach as screenshot in comments!)
    • I have ensured that basic use of the component is OK (e.g. an instrument using it compiles?)
    • I have used the mctest utility to test one or more instruments making use of the component (please attach mcviewtest report as screenshot in comments)
    • I have used the mccode-clangformat tool to apply the standard McCode component indentation scheme
    • I have used the mcrun --c-lint "linter" and followed advice to remove most / all warnings that are raised
  • My contribution includes patches to an existing instrument file

    • I have used the mcdoc utility and rendered a reasonable documentation page for the instrument (please attach as screenshot in comments!)
    • I have used the mctest utility to test the instrument (please attach mcviewtest report as screenshot in comments)
    • I have used the mcrun --c-lint "linter" and followed advice to remove most / all warnings that are raised
  • My contribution includes a new component file

    • I have ensured that naming of parameters are in the style of existing components. (Please check the McStas or McXtrace NOMENCLATURE docs.)
    • I have ensured that component parameters are in the usually units of McStas or McXtrace (SI + neutron/x-ray 'usual' units)
    • I have used the mcdoc utility and rendered a reasonable documentation page for the component (please attach as screenshot in comments!)
    • I have ensured that basic use of the component is OK (e.g. an instrument using it compiles?)
    • I have included a corresponding example instrument and will fill in the new instrument section below
    • I have used the mccode-clangformat tool to apply the standard McCode component indentation scheme
    • My new component is added within the contrib component category
  • My contribution includes a new instrument file

    • I have used the mcdoc utility and rendered a reasonable documentation page for the instrument (please attach as screenshot in comments!)
    • I have ensured that basic use of the instrument is OK (e.g. it compiles?)
    • ... and provided reasonable default parameters in that instrument that produce reasonable output
    • ... and maybe even added a %Example: line to describe expected behaviour
    • I have used the mcrun --c-lint "linter" and followed advice to remove most / all warnings that are raised
    • My new instrument is added within the examples hierarchy in a folder in the style of examples/ESS/New_stuff/New_stuff.instr
    • My new instrument has a new, unique filename, not clashing with existing example instruments
    • My new instrument requires a data/input file. If the datafile is specific for my instrument I have left it in the same example folder, but if general use I have placed it in the global data folder.
  • My work touches the code-generator in mccode/src

    • I have added reasoning and documentation for the change through an ADR record in our GRAMMAR section
    • I am attaching test output in the comments
  • My work touches / adds to the runtime lib code (.c,.h etc in multiple locations

    • I am have added reasoning and documentation for the change below
    • I am attaching test output in the comments
  • My PR is meant to fix a specific, existing issue

    • I have indicated the issue number here:
    • I have added documentation for the fix and possible side effects
  • My contribution contains something else

    • Explanation is added in free form text above or below the checklist

Complete generic_event_functions.md Steps 1 and 2:\n\n- Add deterministic McStas and McXtrace event-list fixtures.\n- Add mcevent_out_list and the DETECTOR_OUT_LIST macro.\n- Validate dimensions, null data, empty columns, and zero-event lists.\n- Preserve the existing list backend and fix rank-1 list output.\n\nVerified with McStas ASCII and NeXus output plus the McXtrace fixture.
Complete generic_event_functions.md Step 3:\n\n- Add MC_EVENT_BUFFER lifecycle and fixed-capacity append APIs.\n- Add deterministic overflow, zero-capacity, zero-width, and free-idempotence fixture coverage.\n- Preserve row-major output through DETECTOR_OUT_LIST.\n\nVerified with full McStas and McXtrace rebuilds and the CPU Test_EventBuffer fixture. OpenACC remains unexecuted because nvc is unavailable.
@mads-bertelsen
mads-bertelsen marked this pull request as draft September 25, 2026 08:46
@mads-bertelsen mads-bertelsen changed the title Detector out list Generic functions for chunked event writing Sep 25, 2026
Complete generic_event_functions.md Steps 1 and 2:\n\n- Add deterministic McStas and McXtrace event-list fixtures.\n- Add mcevent_out_list and the DETECTOR_OUT_LIST macro.\n- Validate dimensions, null data, empty columns, and zero-event lists.\n- Preserve the existing list backend and fix rank-1 list output.\n\nVerified with McStas ASCII and NeXus output plus the McXtrace fixture.
Complete generic_event_functions.md Step 3:\n\n- Add MC_EVENT_BUFFER lifecycle and fixed-capacity append APIs.\n- Add deterministic overflow, zero-capacity, zero-width, and free-idempotence fixture coverage.\n- Preserve row-major output through DETECTOR_OUT_LIST.\n\nVerified with full McStas and McXtrace rebuilds and the CPU Test_EventBuffer fixture. OpenACC remains unexecuted because nvc is unavailable.
- Track ASCII and NeXus output failures (write, flush, close, and NeXus
  serialization) in the MC_EVENT_OUTPUT session and surface a rejected
  save as an invalid detector.
- Propagate failures through the serial and MPI writer sessions; MPI ranks
  still drain data after a failure so no collective deadlocks.
- Reject per-rank position/rotation metadata mismatches in MPI saves.
- Clear the writer before begin() validation so a rejected begin is safe to
  finish with end().
- Return a real NXstatus from mcdetector_out_data_nexus() (NX_ERROR when a
  group or the data write could not be opened) so NeXus serialization
  failures are actually detected; existing callers ignore the return and are
  unaffected.
- Add expected-failure fixture cases (invalid begin, invalid output path, and
  an MPI metadata mismatch) and document them.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants