5#ifndef GEMMI_REFLN_HPP_
6#define GEMMI_REFLN_HPP_
36 if (
const std::string* hm = impl::find_spacegroup_hm_value(
block))
40 const char*
wave_tag =
"_diffrn_radiation_wavelength.wavelength";
58 if (
o.diffrn_refln_loop)
78 for (
size_t i = 0;
i !=
labels.size(); ++
i)
96 fail(
"Column not found: " + tag);
119 for (
int i = 0;
i != 3; ++
i)
126 fail(
"Unit cell is not known");
131 for (
int i = 0;
i != 3; ++
i)
140 for (
double&
d : vec)
141 d = 1.0 / std::sqrt(
d);
149 std::vector<ReflnBlock>
rvec;
150 rvec.reserve(blocks.size());
152 rvec.emplace_back(std::move(block));
160 else if (!
rblock.spacegroup)
162 if (
rblock.cell.is_crystal()) {
175 const std::vector<std::string>&
labels,
176 const char* block_name=
nullptr) {
180 if (
const std::string* hm = impl::find_spacegroup_hm_value(block)) {
184 impl::set_cell_from_mmcif(block, cell);
189 if (block_name && block.name != block_name)
191 if (
cif::Loop* loop = block.find_loop(
"_refln.index_h").get_loop())
193 [&](
const std::string& s) { return loop->has_tag(
"_refln."+s); })) {
200 fail(
"Required block or tags not found in the SF-mmCIF file.");
205 rb.block.swap(block);
206 rb.entry_id =
rb.block.name;
207 impl::set_cell_from_mmcif(
rb.block,
rb.cell,
false);
208 const char*
hm_tag =
"_symmetry_space_group_name_H-M";
209 if (
const std::string* hm =
rb.block.find_value(
hm_tag))
211 rb.cell.alpha,
rb.cell.gamma);
212 rb.cell.set_cell_images_from_spacegroup(
rb.spacegroup);
213 rb.refln_loop =
rb.block.find_loop(
"_refln_index_h").get_loop();
214 rb.default_loop =
rb.refln_loop;
221 std::array<size_t,3> hkl_cols_;
223 : rb_(
rb), hkl_cols_(rb_.get_hkl_column_indices()) {}
224 size_t stride()
const {
return loop().tags.size(); }
225 size_t size()
const {
return loop().values.size(); }
231 return {{get_int(
offset + hkl_cols_[0]),
232 get_int(
offset + hkl_cols_[1]),
233 get_int(
offset + hkl_cols_[2])}};
238 int get_int(
size_t n)
const {
return cif::as_int(loop().values[n]); }
int as_any(const std::string &s, int null)
double as_number(const std::string &s, double nan=NAN)
std::string as_string(const std::string &value)
int as_int(const std::string &str)
MtzDataProxy data_proxy(const Mtz &mtz)
std::vector< ReflnBlock > as_refln_blocks(std::vector< cif::Block > &&blocks)
ReflnBlock hkl_cif_as_refln_block(cif::Block &block)
const SpaceGroup * find_spacegroup_by_name(std::string name, double alpha=0., double gamma=0.) noexcept
std::array< int, 3 > Miller
A synonym for convenient passing of hkl.
ReflnBlock get_refln_block(std::vector< cif::Block > &&blocks, const std::vector< std::string > &labels, const char *block_name=nullptr)
void fail(const std::string &msg)
int find_column_index(const std::string &tag) const
size_t tag_offset() const
std::vector< T > make_vector(const std::string &tag, T null) const
void use_unmerged(bool unmerged)
ReflnBlock & operator=(const ReflnBlock &o)
std::vector< Miller > make_miller_vector() const
cif::Loop * diffrn_refln_loop
ReflnBlock & operator=(ReflnBlock &&)=default
const SpaceGroup * spacegroup
size_t get_column_index(const std::string &tag) const
std::vector< double > make_d_vector() const
ReflnBlock(cif::Block &&block_)
std::array< size_t, 3 > get_hkl_column_indices() const
ReflnBlock(ReflnBlock &&rblock_)=default
std::vector< double > make_1_d2_vector() const
std::vector< std::string > column_labels() const
ReflnDataProxy(const ReflnBlock &rb)
Miller get_hkl(size_t offset) const
double get_num(size_t n) const
const UnitCell & unit_cell() const
const SpaceGroup * spacegroup() const
size_t column_index(const std::string &label) const
double calculate_1_d2(const Miller &hkl) const
void set_cell_images_from_spacegroup(const SpaceGroup *sg)
Column find_values(const std::string &tag)
Column find_loop(const std::string &tag)
const std::string * find_value(const std::string &tag) const
std::vector< std::string > tags
std::vector< std::string > values