Commit ae0e9fbe by Maarten L. Hekkelman

fix cif::item constructor

fix ordering atoms
parent 3484c3dd
...@@ -378,7 +378,7 @@ struct item_handle ...@@ -378,7 +378,7 @@ struct item_handle
template <typename T> template <typename T>
item_handle &operator=(T &&value) item_handle &operator=(T &&value)
{ {
assign_value(item{ "", std::move(value) }.value()); assign_value(item{ "", std::forward<T>(value) }.value());
return *this; return *this;
} }
......
...@@ -2886,7 +2886,7 @@ static int compare_numbers(std::string_view a, std::string_view b) ...@@ -2886,7 +2886,7 @@ static int compare_numbers(std::string_view a, std::string_view b)
ra = selected_charconv<double>::from_chars(a.data(), a.data() + a.length(), da); ra = selected_charconv<double>::from_chars(a.data(), a.data() + a.length(), da);
rb = selected_charconv<double>::from_chars(b.data(), b.data() + b.length(), db); rb = selected_charconv<double>::from_chars(b.data(), b.data() + b.length(), db);
if (not (bool)ra.ec and not (bool)rb.ec) if (not(bool) ra.ec and not(bool) rb.ec)
{ {
auto d = da - db; auto d = da - db;
if (std::abs(d) > std::numeric_limits<double>::epsilon()) if (std::abs(d) > std::numeric_limits<double>::epsilon())
...@@ -2901,7 +2901,7 @@ static int compare_numbers(std::string_view a, std::string_view b) ...@@ -2901,7 +2901,7 @@ static int compare_numbers(std::string_view a, std::string_view b)
result = 1; result = 1;
else else
result = -1; result = -1;
return result; return result;
} }
...@@ -2910,26 +2910,51 @@ void structure::reorder_atoms() ...@@ -2910,26 +2910,51 @@ void structure::reorder_atoms()
auto &atom_site = m_db["atom_site"]; auto &atom_site = m_db["atom_site"];
atom_site.sort([](row_handle a, row_handle b) atom_site.sort([](row_handle a, row_handle b)
{ {
int d; int d;
// First by model number // First by model number
d = a.get<int>("pdbx_PDB_model_num") - b.get<int>("pdbx_PDB_model_num"); d = a.get<int>("pdbx_PDB_model_num") - b.get<int>("pdbx_PDB_model_num");
if (d == 0) if (d == 0)
d = a.get<std::string>("label_asym_id").compare(b.get<std::string>("label_asym_id")); d = a.get<std::string>("label_asym_id").compare(b.get<std::string>("label_asym_id"));
if (d == 0) if (d == 0)
d = a.get<int>("label_seq_id") - b.get<int>("label_seq_id"); {
if (d == 0) auto na = a.get<std::optional<int>>("label_seq_id");
d = compare_numbers(a.get<std::string>("id"), b.get<std::string>("id")); auto nb = b.get<std::optional<int>>("label_seq_id");
if (na.has_value() and nb.has_value())
d = *na - *nb;
else if (na.has_value())
d = 1;
else if (nb.has_value())
d = -1;
}
return d; if (d == 0)
}); {
auto na = a.get<std::optional<int>>("auth_seq_id");
auto nb = b.get<std::optional<int>>("auth_seq_id");
if (na.has_value() and nb.has_value())
d = *na - *nb;
else if (na.has_value())
d = 1;
else if (nb.has_value())
d = -1;
}
if (d == 0)
d = compare_numbers(a.get<std::string>("id"), b.get<std::string>("id"));
return d;
//
});
// atom_site.set_validator(nullptr, m_db); // atom_site.set_validator(nullptr, m_db);
// for (int nr = 1; auto r : atom_site) // for (int nr = 1; auto r : atom_site)
// r["id"] = nr++; // r["id"] = nr++;
// atom_site.set_validator(m_db.get_validator(), m_db); // atom_site.set_validator(m_db.get_validator(), m_db);
} }
......
...@@ -590,18 +590,18 @@ void checkAtomAnisotropRecords(datablock &db) ...@@ -590,18 +590,18 @@ void checkAtomAnisotropRecords(datablock &db)
row["type_symbol"] = parent["type_symbol"].text(); row["type_symbol"] = parent["type_symbol"].text();
} }
if (row["pdbx_auth_alt_id"].empty()) if (row["pdbx_auth_alt_id"].empty() and not parent["pdbx_auth_alt_id"].empty())
row["pdbx_auth_alt_id"] = parent["pdbx_auth_alt_id"].text(); row["pdbx_auth_alt_id"] = parent["pdbx_auth_alt_id"].text();
if (row["pdbx_label_seq_id"].empty()) if (row["pdbx_label_seq_id"].empty() and not parent["pdbx_label_seq_id"].empty())
row["pdbx_label_seq_id"] = parent["label_seq_id"].text(); row["pdbx_label_seq_id"] = parent["label_seq_id"].text();
if (row["pdbx_label_asym_id"].empty()) if (row["pdbx_label_asym_id"].empty() and not parent["pdbx_label_asym_id"].empty())
row["pdbx_label_asym_id"] = parent["label_asym_id"].text(); row["pdbx_label_asym_id"] = parent["label_asym_id"].text();
if (row["pdbx_label_atom_id"].empty()) if (row["pdbx_label_atom_id"].empty() and not parent["pdbx_label_atom_id"].empty())
row["pdbx_label_atom_id"] = parent["label_atom_id"].text(); row["pdbx_label_atom_id"] = parent["label_atom_id"].text();
if (row["pdbx_label_comp_id"].empty()) if (row["pdbx_label_comp_id"].empty() and not parent["pdbx_label_comp_id"].empty())
row["pdbx_label_comp_id"] = parent["label_comp_id"].text(); row["pdbx_label_comp_id"] = parent["label_comp_id"].text();
if (row["pdbx_PDB_model_num"].empty()) // if (row["pdbx_PDB_model_num"].empty() and not parent["pdbx_PDB_model_num"].empty())
row["pdbx_PDB_model_num"] = parent["pdbx_PDB_model_num"].text(); // row["pdbx_PDB_model_num"] = parent["pdbx_PDB_model_num"].text();
} }
if (not to_be_deleted.empty()) if (not to_be_deleted.empty())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment