Gemmi C++ API
Loading...
Searching...
No Matches
assembly.hpp
Go to the documentation of this file.
1// Copyright 2020 Global Phasing Ltd.
2//
3// Generating biological assemblies by applying operations
4// from struct Assembly to a Model.
5// Includes chain (re)naming utilities.
6
7#ifndef GEMMI_ASSEMBLY_HPP_
8#define GEMMI_ASSEMBLY_HPP_
9
10#include <ostream> // for ostream
11#include "model.hpp" // for Model
12#include "util.hpp" // for in_vector
13
14namespace gemmi {
15
17
21 std::vector<std::string> used_names;
22
23 ChainNameGenerator(How how_) : how(how_) {}
24 ChainNameGenerator(const Model& model, How how_) : how(how_) {
25 if (how != How::Dup)
26 for (const Chain& chain : model.chains)
27 used_names.push_back(chain.name);
28 }
29 bool has(const std::string& name) const {
30 return in_vector(name, used_names);
31 }
32 const std::string& added(const std::string& name) {
33 used_names.push_back(name);
34 return name;
35 }
36
37 std::string make_short_name(const std::string& preferred) {
38 static const char symbols[] = {
39 'A','B','C','D','E','F','G','H','I','J','K','L','M',
40 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
41 'a','b','c','d','e','f','g','h','i','j','k','l','m',
42 'n','o','p','q','r','s','t','u','v','w','x','y','z',
43 '0','1','2','3','4','5','6','7','8','9'
44 };
45 if (!has(preferred))
46 return added(preferred);
47 std::string name(1, 'A');
48 for (char symbol : symbols) {
49 name[0] = symbol;
50 if (!has(name))
51 return added(name);
52 }
53 name += 'A';
54 for (char symbol1 : symbols) {
55 name[0] = symbol1;
56 for (char symbol2 : symbols) {
57 name[1] = symbol2;
58 if (!has(name))
59 return added(name);
60 }
61 }
62 fail("run out of 1- and 2-letter chain names");
63 }
64
65 std::string make_name_with_numeric_postfix(const std::string& base, int n) {
66 std::string name = base;
67 name += std::to_string(n);
68 while (has(name)) {
69 name.resize(base.size());
70 name += std::to_string(++n);
71 }
72 return added(name);
73 }
74
75 std::string make_new_name(const std::string& old, int n) {
76 switch (how) {
77 case How::Short: return make_short_name(old);
78 case How::AddNumber: return make_name_with_numeric_postfix(old, n);
79 case How::Dup: return old;
80 }
82 }
83};
84
85inline void ensure_unique_chain_name(const Model& model, Chain& chain) {
87 for (const Chain& ch : model.chains)
88 if (&ch != &chain && !namegen.has(ch.name))
89 namegen.added(ch.name);
90 chain.name = namegen.make_short_name(chain.name);
91}
92
93GEMMI_DLL Model make_assembly(const Assembly& assembly, const Model& model,
94 HowToNameCopiedChain how, std::ostream* out);
95
97 Assembly assembly("unit_cell");
98 std::vector<Assembly::Operator> operators(cell.images.size() + 1);
99 // operators[0] stays as identity
100 for (size_t i = 1; i != operators.size(); ++i) {
101 const FTransform& op = cell.images[i-1];
102 operators[i].transform = cell.orth.combine(op.combine(cell.frac));
103 }
104 assembly.generators.push_back({{"(all)"}, {}, operators});
105 return assembly;
106}
107
110GEMMI_DLL void transform_to_assembly(Structure& st, const std::string& assembly_name,
111 HowToNameCopiedChain how, std::ostream* out,
112 bool keep_spacegroup=false, double merge_dist=0.2);
113
114
115GEMMI_DLL Model expand_ncs_model(const Model& model, const std::vector<NcsOp>& ncs,
117
121 double max_dist=0.2, bool compare_serial=true);
122
123
125
126GEMMI_DLL void expand_ncs(Structure& st, HowToNameCopiedChain how, double merge_dist=0.2);
127
130
131} // namespace gemmi
132#endif
#define GEMMI_DLL
Definition fail.hpp:53
GEMMI_DLL Model make_assembly(const Assembly &assembly, const Model &model, HowToNameCopiedChain how, std::ostream *out)
GEMMI_DLL Model expand_ncs_model(const Model &model, const std::vector< NcsOp > &ncs, HowToNameCopiedChain how)
HowToNameCopiedChain
Definition assembly.hpp:16
GEMMI_DLL void merge_atoms_in_expanded_model(Model &model, const UnitCell &cell, double max_dist=0.2, bool compare_serial=true)
Searches and merges overlapping equivalent atoms from different chains.
GEMMI_DLL void shorten_chain_names(Structure &st)
bool in_vector(const T &x, const std::vector< T > &v)
Definition util.hpp:241
GEMMI_DLL void expand_ncs(Structure &st, HowToNameCopiedChain how, double merge_dist=0.2)
GEMMI_DLL void split_chains_by_segments(Model &model, HowToNameCopiedChain how)
HowToNameCopiedChain::Dup adds segment name to chain name.
void fail(const std::string &msg)
Definition fail.hpp:59
void ensure_unique_chain_name(const Model &model, Chain &chain)
Definition assembly.hpp:85
void unreachable()
Definition fail.hpp:80
GEMMI_DLL void transform_to_assembly(Structure &st, const std::string &assembly_name, HowToNameCopiedChain how, std::ostream *out, bool keep_spacegroup=false, double merge_dist=0.2)
If called with assembly_name="unit_cell" changes structure to unit cell (P1).
Assembly pseudo_assembly_for_unit_cell(const UnitCell &cell)
Definition assembly.hpp:96
std::vector< Gen > generators
Definition metadata.hpp:357
std::string make_name_with_numeric_postfix(const std::string &base, int n)
Definition assembly.hpp:65
std::string make_new_name(const std::string &old, int n)
Definition assembly.hpp:75
std::string make_short_name(const std::string &preferred)
Definition assembly.hpp:37
const std::string & added(const std::string &name)
Definition assembly.hpp:32
bool has(const std::string &name) const
Definition assembly.hpp:29
std::vector< std::string > used_names
Definition assembly.hpp:21
ChainNameGenerator(const Model &model, How how_)
Definition assembly.hpp:24
std::string name
Definition model.hpp:464
Like Transform, but apply() arg is Fractional (not Vec3 - for type safety).
Definition unitcell.hpp:112
std::vector< Chain > chains
Definition model.hpp:700
Transform combine(const Transform &b) const
Definition math.hpp:382
Unit cell.
Definition unitcell.hpp:139
Transform frac
Definition unitcell.hpp:151
std::vector< FTransform > images
Definition unitcell.hpp:158
Transform orth
Definition unitcell.hpp:150