rugnux: several stills inputs in one run; inputs are files, never a directory

Every input is a file named on the command line, read in the order given (a shell glob gives them
sorted by name); a directory is refused with the glob form to use instead.

- Several Jungfraujoch/NXmx masters of stills are read as one run (JFJochMultiReader): their images
  one after another, the pixel masks combined, the per-image efficiency placed at each input's
  images. They must share the detector, wavelength (0.1%), distance (0.1 mm) and beam centre (1 px),
  since stills geometry refinement refines one geometry for all frames; rotation sweeps are refused.
  The log gives the indexing rate of each input beside the run's (ProcessResult::image_indexed).
- SACLA HDF5 / CXI (JFJochCrystFELReader::ReadFiles, ReadCXI, Open) and XTC
  (JFJochXTCReader::ReadFiles) take the list of files instead of scanning a directory;
  CanReadCXI and xtc::CanRead accept only a file; ListFiles and xtc::CollectStreams are gone.
- Several inputs must be one format, --mode mx, and stored files (no broker, no --simulate-live);
  one frame of a CBF/marCCD/SMV sweep still names the whole sweep.

Validated: two Jungfraujoch lysozyme stills runs together (49,920 frames, known cell) 57.1% indexed (59.3% /
54.9% per run), 1.22 A, CC1/2 0.986, R_split 8.8%, REFMAC R/R-free 0.253/0.269 against 0.257/0.273
for the earlier hand-built combined master. Rotation: 5reo and lyso_x10sa_90deg_1 unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015CeEGgpKdfkCTJb3YNMJcu
This commit is contained in:
leonarski_fandClaude Opus 5.5 committed 2026-10-20 23:30:17 +02:00
1 parent 093069be29
commit 6557ba87f4
18 files changed
+547 -158

No files matched your search

-16
View File
@@ -83,8 +83,6 @@ namespace xtc {
bool CanRead(const std::string &path) {
std::error_code ec;
if (std::filesystem::is_directory(path, ec))
return !CollectStreams(path).empty();
if (!std::filesystem::is_regular_file(path, ec) || !path.ends_with(".xtc") || path.ends_with(".smd.xtc"))
return false;
File f(fopen(path.c_str(), "rb"));
@@ -92,20 +90,6 @@ bool CanRead(const std::string &path) {
return f && fread(h, 1, DGRAM_HEADER, f.get()) == DGRAM_HEADER && PlausibleFirstDatagram(h);
}
std::vector<std::string> CollectStreams(const std::string &path) {
std::error_code ec;
if (!std::filesystem::is_directory(path, ec))
return {path};
std::vector<std::string> out;
for (const auto &e: std::filesystem::directory_iterator(path, ec)) {
const std::string p = e.path().string();
if (e.is_regular_file() && p.ends_with(".xtc") && !p.ends_with(".smd.xtc"))
out.push_back(p);
}
std::sort(out.begin(), out.end());
return out;
}
std::vector<Frame> IndexFrames(const std::string &file) {
File f = Open(file);
std::vector<Frame> out;