END message: optional merged / map_coefficients / placed_model blocks

Structured results of an analysis run inside the broker, for jfjoch_writer to
turn into <file_prefix>.mtz, _maps.mtz and _model.cif itself: the merged
reflections and the map coefficients one typed array per MTZ column, the placed
model one array per atom field (coordinates as float64). Each block is a nested
CBOR map under its own optional END key; a reader that does not know a key
skips it, as for every other END key, and unknown keys inside a block are
skipped the same way. Space groups travel as gemmi's extended H-M name, which
round-trips to the same table entry for all 564 settings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
leonarski_fandClaude Opus 5.5 committed 2026-10-17 12:10:35 +02:00
1 parent 5d8c6f4504
commit 91f6563953
4 files changed
+266

No files matched your search

+86
View File
@@ -515,6 +515,89 @@ inline void CBOR_ENC(CborEncoder &encoder, const char* key, const UnitCell &val)
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));
}
inline void CBOR_ENC(CborEncoder &encoder, const char* key, const std::vector<double>& v) {
cborErr(cbor_encode_text_stringz(&encoder, key));
cborErr(cbor_encode_tag(&encoder, TagDoubleLE));
cborErr(cbor_encode_byte_string(&encoder, reinterpret_cast<const uint8_t *>(v.data()), v.size() * sizeof(double)));
}
inline void CBOR_ENC(CborEncoder &encoder, const char* key, const MergedReflectionsMessage &m) {
CborEncoder mapEncoder;
cborErr(cbor_encode_text_stringz(&encoder, key));
cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, CborIndefiniteLength));
CBOR_ENC(mapEncoder, "unit_cell", m.unit_cell);
CBOR_ENC(mapEncoder, "space_group_name", m.space_group_name);
CBOR_ENC(mapEncoder, "wavelength", m.wavelength_A);
CBOR_ENC(mapEncoder, "crystal_name", m.crystal_name);
CBOR_ENC(mapEncoder, "history", m.history);
CBOR_ENC(mapEncoder, "h", m.h);
CBOR_ENC(mapEncoder, "k", m.k);
CBOR_ENC(mapEncoder, "l", m.l);
CBOR_ENC(mapEncoder, "i_mean", m.i_mean);
CBOR_ENC(mapEncoder, "sigma_i_mean", m.sigma_i_mean);
CBOR_ENC(mapEncoder, "i_plus", m.i_plus);
CBOR_ENC(mapEncoder, "sigma_i_plus", m.sigma_i_plus);
CBOR_ENC(mapEncoder, "i_minus", m.i_minus);
CBOR_ENC(mapEncoder, "sigma_i_minus", m.sigma_i_minus);
CBOR_ENC(mapEncoder, "f", m.f);
CBOR_ENC(mapEncoder, "sigma_f", m.sigma_f);
CBOR_ENC(mapEncoder, "f_plus", m.f_plus);
CBOR_ENC(mapEncoder, "sigma_f_plus", m.sigma_f_plus);
CBOR_ENC(mapEncoder, "f_minus", m.f_minus);
CBOR_ENC(mapEncoder, "sigma_f_minus", m.sigma_f_minus);
CBOR_ENC(mapEncoder, "free_flag", m.free_flag);
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));
}
inline void CBOR_ENC(CborEncoder &encoder, const char* key, const MapCoefficientsMessage &m) {
CborEncoder mapEncoder;
cborErr(cbor_encode_text_stringz(&encoder, key));
cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, CborIndefiniteLength));
CBOR_ENC(mapEncoder, "unit_cell", m.unit_cell);
CBOR_ENC(mapEncoder, "space_group_name", m.space_group_name);
CBOR_ENC(mapEncoder, "wavelength", m.wavelength_A);
CBOR_ENC(mapEncoder, "h", m.h);
CBOR_ENC(mapEncoder, "k", m.k);
CBOR_ENC(mapEncoder, "l", m.l);
CBOR_ENC(mapEncoder, "fp", m.fp);
CBOR_ENC(mapEncoder, "fc", m.fc);
CBOR_ENC(mapEncoder, "phic", m.phic);
CBOR_ENC(mapEncoder, "fwt", m.fwt);
CBOR_ENC(mapEncoder, "phwt", m.phwt);
CBOR_ENC(mapEncoder, "delfwt", m.delfwt);
CBOR_ENC(mapEncoder, "phdelwt", m.phdelwt);
CBOR_ENC(mapEncoder, "fom", m.fom);
CBOR_ENC(mapEncoder, "free_flag", m.free_flag);
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));
}
inline void CBOR_ENC(CborEncoder &encoder, const char* key, const PlacedModelMessage &m) {
CborEncoder mapEncoder;
cborErr(cbor_encode_text_stringz(&encoder, key));
cborErr(cbor_encoder_create_map(&encoder, &mapEncoder, CborIndefiniteLength));
CBOR_ENC(mapEncoder, "name", m.name);
CBOR_ENC(mapEncoder, "unit_cell", m.unit_cell);
CBOR_ENC(mapEncoder, "space_group_name", m.space_group_name);
CBOR_ENC(mapEncoder, "model_space_group_name", m.model_space_group_name);
CBOR_ENC(mapEncoder, "model_number", m.model_number);
CBOR_ENC(mapEncoder, "chain", m.chain);
CBOR_ENC(mapEncoder, "residue_name", m.residue_name);
CBOR_ENC(mapEncoder, "seq_num", m.seq_num);
CBOR_ENC(mapEncoder, "icode", m.icode);
CBOR_ENC(mapEncoder, "het_flag", m.het_flag);
CBOR_ENC(mapEncoder, "atom_name", m.atom_name);
CBOR_ENC(mapEncoder, "element", m.element);
CBOR_ENC(mapEncoder, "altloc", m.altloc);
CBOR_ENC(mapEncoder, "charge", m.charge);
CBOR_ENC(mapEncoder, "x", m.x);
CBOR_ENC(mapEncoder, "y", m.y);
CBOR_ENC(mapEncoder, "z", m.z);
CBOR_ENC(mapEncoder, "b_iso", m.b_iso);
CBOR_ENC(mapEncoder, "occupancy", m.occupancy);
CBOR_ENC(mapEncoder, "aniso", m.aniso);
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));
}
// Add encoder for LatticeMessage
inline void CBOR_ENC(CborEncoder &encoder, const char* key, const LatticeMessage &val) {
CborEncoder mapEncoder;
@@ -857,6 +940,9 @@ void CBORStream2Serializer::SerializeSequenceEnd(const EndMessage& message) {
// should take; the number is beside it for a reader written before the name existed.
CBOR_ENC(mapEncoder, "space_group_name", message.space_group_name);
CBOR_ENC(mapEncoder, "space_group_number", message.space_group_number);
CBOR_ENC(mapEncoder, "merged", message.merged);
CBOR_ENC(mapEncoder, "map_coefficients", message.map_coefficients);
CBOR_ENC(mapEncoder, "placed_model", message.placed_model);
cborErr(cbor_encoder_close_container(&encoder, &mapEncoder));