Files
Jungfraujoch/reader/CMakeLists.txt
T
leonarski_fandClaude Opus 5.5 ebce906025 Serial XFEL stills inputs: readers from the files themselves, module geometry and its refinement
Combines the stills reader and module work (stills-readers, stills-modgeom, stills-euxfel) onto
rc178 with the owner's decisions for this release:

- Inputs are files, never a directory; several files of one format are one dataset (the multi-input
  CLI of the previous commit), so every reader takes an explicit list: JFJochXFELReader::ReadFiles,
  ReadCXI, ReadPanelTable and JFJochXTCReader::ReadFiles take std::vector<std::string>; ListFiles and
  xtc::CollectStreams are gone, CanRead* accept a regular file only.
- One HDF5 frame reader (JFJochCrystFELReader -> JFJochXFELReader) parameterised by what the file holds:
  per-shot groups or a 3D stack, a /metadata panel table (posx/posy/angle, pixel size, nominal camera
  length, pixel mask: as SACLA writes), a Cheetah CXI single panel (square frame; a tiled slab is
  refused with a message). At most 8 files open; every file checked against the first. Signed 32-bit
  decode, per-frame 3D masks, panels at their own coffset (from the EuXFEL work).
- Frames stored one chunk each are read the way the NXmx reader reads its images: only the chunk's
  place is asked of HDF5 under its lock (H5Dget_chunk_info_by_coord), the bytes are read through
  HDF5ImageSource::RawFile (positional, no lock) and decoded outside it - deflate(+shuffle) by zlib,
  bitshuffle/LZ4 (and zstd, plain LZ4) by CompressedImage's decoders. Bitshuffle/LZ4 used to go through
  HDF5's filter under the global lock, one frame at a time.
- LCLS-I XTC (Rayonix): wavelength from the beam record, pixel size from the Rayonix model and
  binning, only --detector-distance needed; damaged/compressed frames skipped, a truncated last event
  dropped; std::ifstream, no POSIX calls: builds with MSVC. No DIALS .expt support at all.
- CrystFEL .geom: module geometry only (panel ranges, fs/ss, corners, pixel size, coffset, data path)
  and optionally the camera length; everything else is ignored with a note in the log.
- --mask-good / --mask-bad <file>:<dataset>: a mask array in another HDF5 file, in the frames' stored
  layout (what a .geom's mask_file used to give).
- Gain measured on the background for panel-table and CXI input that states none (--gain overrides).
- Detector modules from explicit geometry only (DetectorModules: the reader's panels, an NXmx file with
  one NXdetector_module per module, or --module-geometry); never from the image. Spots and predictions
  are mapped through the modules, the image is not re-assembled.
- Module refinement in the stills bundle adjustment (Ceres; per-module shift and in-plane turn, gauge
  on mean shift/turn/scale and on the two tilt-like patterns when the tilt is refined; adopted only
  where it predicts held-out frames better). Applied for a foreign multi-panel detector (panel table,
  .geom panels); for a JUNGFRAU measured and reported only. Written to <prefix>_modules.h5 (NXmx
  NXdetector_module groups), read back with --module-geometry.
- A panel-table file's camera length is nominal: with a reference cell it is refined from the cell.
- Broker and writer output unchanged: masters keep the single NXdetector_module group, the start
  message carries no module list.

Tests: [CrystFELGeometry], JFJochXFELReader_*, JFJochXTCReader, [JFJochMultiReader], [CellPopulation],
SaturationCeiling_*, [DetectorModules], RefineGlobalGeometry_ModulePlacement, [reindex], Sublattice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015CeEGgpKdfkCTJb3YNMJcu
2026-10-20 23:30:48 +02:00

57 lines
1.8 KiB
CMake

ADD_LIBRARY(JFJochReader STATIC
JFJochReader.cpp JFJochReader.h
JFJochHDF5Reader.cpp
JFJochHDF5Reader.h
JFJochMultiReader.cpp
JFJochMultiReader.h
SweepLayout.cpp
SweepLayout.h
MiniCBF.cpp
MiniCBF.h
JFJochCBFReader.cpp
JFJochCBFReader.h
MarCCD.cpp
MarCCD.h
JFJochMarCCDReader.cpp
JFJochMarCCDReader.h
CrystFELGeometry.cpp
CrystFELGeometry.h
JFJochXFELReader.cpp
JFJochXFELReader.h
DetectorLayout.h
SMV.cpp
SMV.h
JFJochSMVReader.cpp
JFJochSMVReader.h
XTC.cpp
XTC.h
JFJochXTCReader.cpp
JFJochXTCReader.h
NXmxModules.cpp
NXmxModules.h
HDF5ImageLocator.cpp
JFJochStartMessageReader.cpp
JFJochStartMessageReader.h
JFJochImageBufferReader.cpp
JFJochImageBufferReader.h
HDF5ImageLocator.h
HDF5ImageSource.cpp
HDF5ImageSource.h
HDF5MetadataSource.cpp
HDF5MetadataSource.h
JFJochReaderImage.cpp
JFJochReaderImage.h
JFJochReaderDataset.cpp
JFJochReaderDataset.h
JFJochReaderSpots.h
)
# NB: JFJochHttpReader (the viewer's live-broker HTTP client) lives in viewer/ and links Mbed TLS;
# it is deliberately NOT part of this always-built library, so the broker/writer never pull in a
# TLS stack.
# tiff: the marCCD reader's files are ordinary uncompressed TIFFs, so libtiff - which the build
# already fetches for JFJochPreview in every mode - reads the pixels and there is no new dependency.
TARGET_LINK_LIBRARIES(JFJochReader JFJochImageAnalysis JFJochAPI JFJochCommon JFJochZMQ JFJochLogger
JFJochHDF5Wrappers CBORStream2FrameSerialize tiff ZLIB::ZLIB
${CMAKE_DL_LIBS})