Fix dropped residues with cif_use_auth and inscodes

This commit is contained in:
Jarrett Johnson
2026-02-21 01:16:36 -05:00
parent ede1553a9c
commit d30a289129
3 changed files with 375 additions and 8 deletions

View File

@@ -11,6 +11,7 @@
#include <string>
#include <map>
#include <set>
#include <unordered_map>
#include <vector>
#include <memory>
#include <array>
@@ -134,6 +135,13 @@ struct CifContentInfo {
std::set<std::string> polypeptide_entities; // entity ids
std::map<std::string, seqvec_t> sequences; // entity_id -> [resn1, resn2, ...]
// _pdbx_poly_seq_scheme: label_asym_id -> (label_seq_id -> auth numbering)
struct SeqSchemeEntry {
int auth_seq_id;
char ins_code;
};
std::unordered_map<std::string, std::unordered_map<int, SeqSchemeEntry>> seq_scheme;
bool is_excluded_chain(const char * chain) const {
if (chains_filter.empty())
return false;
@@ -1331,6 +1339,44 @@ static bool read_entity_poly(PyMOLGlobals * G, const pymol::cif_data * data, Cif
return true;
}
/**
* Read _pdbx_poly_seq_scheme to get the mapping from label_seq_id to
* auth_seq_id + insertion code. This is needed to correctly number
* missing residues when cif_use_auth is on and insertion codes are involved.
*/
static bool read_pdbx_poly_seq_scheme(PyMOLGlobals * G,
const pymol::cif_data * data, CifContentInfo &info) {
if (!info.use_auth)
return false;
const cif_array *arr_asym_id, *arr_seq_id, *arr_pdb_seq_num;
if (!(arr_asym_id = data->get_arr("_pdbx_poly_seq_scheme.asym_id")) ||
!(arr_seq_id = data->get_arr("_pdbx_poly_seq_scheme.seq_id")) ||
!(arr_pdb_seq_num = data->get_arr("_pdbx_poly_seq_scheme.pdb_seq_num")))
return false;
const cif_array *arr_pdb_ins_code =
data->get_arr("_pdbx_poly_seq_scheme.pdb_ins_code");
for (unsigned i = 0, n = arr_asym_id->size(); i < n; i++) {
if (arr_pdb_seq_num->is_missing(i))
continue;
CifContentInfo::SeqSchemeEntry entry;
entry.auth_seq_id = arr_pdb_seq_num->as_i(i);
entry.ins_code = '\0';
if (arr_pdb_ins_code && !arr_pdb_ins_code->is_missing(i)) {
entry.ins_code = makeInscode(arr_pdb_ins_code->as_s(i)[0]);
}
info.seq_scheme[arr_asym_id->as_s(i)][arr_seq_id->as_i(i)] = entry;
}
return true;
}
/**
* Sub-routine for `add_missing_ca`
*
@@ -1346,6 +1392,7 @@ static void add_missing_ca_sub(PyMOLGlobals * G,
const int i_ref, int resv,
const seqvec_t * current_seq,
const char * entity_id,
const std::unordered_map<int, CifContentInfo::SeqSchemeEntry> * scheme = nullptr,
bool at_terminus = true)
{
if (!atInfo[i_ref].temp1)
@@ -1360,12 +1407,28 @@ static void add_missing_ca_sub(PyMOLGlobals * G,
if (!resn)
continue;
int added_resv = current_resv + (atInfo[i_ref].resv - atInfo[i_ref].temp1);
int added_resv;
char added_inscode = '\0';
bool from_scheme = false;
if (!at_terminus && ((i_ref > 0 && added_resv <= atInfo[i_ref - 1].resv) ||
added_resv >= atInfo[i_ref].resv)) {
// don't use insertion codes
continue;
// look up auth numbering from _pdbx_poly_seq_scheme
if (scheme) {
auto entry_it = scheme->find(current_resv);
if (entry_it != scheme->end()) {
added_resv = entry_it->second.auth_seq_id;
added_inscode = entry_it->second.ins_code;
from_scheme = true;
}
}
if (!from_scheme) {
added_resv = current_resv + (atInfo[i_ref].resv - atInfo[i_ref].temp1);
if (!at_terminus && ((i_ref > 0 && added_resv <= atInfo[i_ref - 1].resv) ||
added_resv >= atInfo[i_ref].resv)) {
// don't use insertion codes
continue;
}
}
AtomInfoType *ai = atInfo.check(atomCount);
@@ -1381,6 +1444,7 @@ static void add_missing_ca_sub(PyMOLGlobals * G,
ai->temp1 = current_resv;
ai->resv = added_resv;
ai->setInscode(added_inscode);
AtomInfoAssignParameters(G, ai);
AtomInfoAssignColors(G, ai);
@@ -1408,6 +1472,7 @@ static bool add_missing_ca(PyMOLGlobals * G,
int current_resv = 0;
const seqvec_t * current_seq = nullptr;
const char * current_entity_id = "";
const std::unordered_map<int, CifContentInfo::SeqSchemeEntry> * current_scheme = nullptr;
for (int i = 0; i < oldAtomCount; ++i) {
const char * entity_id = LexStr(G, atInfo[i].custom);
@@ -1420,11 +1485,12 @@ static bool add_missing_ca(PyMOLGlobals * G,
add_missing_ca_sub(G,
atInfo, current_resv, atomCount,
i - 1, current_seq->size() + 1,
current_seq, current_entity_id);
current_seq, current_entity_id, current_scheme);
}
current_resv = 0;
current_seq = nullptr;
current_scheme = nullptr;
current_entity_id = entity_id;
if (info.is_polypeptide(entity_id) && !info.is_excluded_chain(atInfo[i].segi)) {
@@ -1433,6 +1499,14 @@ static bool add_missing_ca(PyMOLGlobals * G,
if (it != info.sequences.end()) {
current_seq = &it->second;
}
// get auth numbering scheme for this chain
if (!info.seq_scheme.empty()) {
auto scheme_it = info.seq_scheme.find(LexStr(G, atInfo[i].segi));
if (scheme_it != info.seq_scheme.end()) {
current_scheme = &scheme_it->second;
}
}
}
} else if (i > 0 && atInfo[i].temp1 == atInfo[i - 1].temp1) {
@@ -1443,7 +1517,7 @@ static bool add_missing_ca(PyMOLGlobals * G,
add_missing_ca_sub(G,
atInfo, current_resv, atomCount,
i, atInfo[i].temp1,
current_seq, entity_id, false);
current_seq, entity_id, current_scheme, false);
}
}
@@ -1452,7 +1526,7 @@ static bool add_missing_ca(PyMOLGlobals * G,
add_missing_ca_sub(G,
atInfo, current_resv, atomCount,
oldAtomCount - 1, current_seq->size() + 1,
current_seq, current_entity_id);
current_seq, current_entity_id, current_scheme);
}
atInfo.resize(atomCount);
@@ -2098,6 +2172,7 @@ ObjectMolecule *ObjectMoleculeReadCifData(PyMOLGlobals * G,
// polymer information
read_entity_poly(G, datablock, info);
read_pdbx_poly_seq_scheme(G, datablock, info);
// missing residues
if (!I->DiscreteFlag && !SettingGetGlobal_i(G, cSetting_retain_order)) {

View File

@@ -0,0 +1,282 @@
data_1HBB
#
loop_
_entity_poly.entity_id
_entity_poly.type
_entity_poly.nstd_linkage
_entity_poly.nstd_monomer
_entity_poly.pdbx_seq_one_letter_code
_entity_poly.pdbx_strand_id
1 'polypeptide(L)' no no
;VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNAL
SALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR
;
A
#
loop_
_pdbx_poly_seq_scheme.asym_id
_pdbx_poly_seq_scheme.entity_id
_pdbx_poly_seq_scheme.seq_id
_pdbx_poly_seq_scheme.mon_id
_pdbx_poly_seq_scheme.pdb_seq_num
_pdbx_poly_seq_scheme.pdb_strand_id
_pdbx_poly_seq_scheme.pdb_ins_code
A 1 1 VAL 1 A .
A 1 2 LEU 2 A .
A 1 3 SER 3 A .
A 1 4 PRO 4 A .
A 1 5 ALA 5 A .
A 1 6 ASP 6 A .
A 1 7 LYS 7 A .
A 1 8 THR 8 A .
A 1 9 ASN 9 A .
A 1 10 VAL 9 A A
A 1 11 LYS 9 A B
A 1 12 ALA 9 A C
A 1 13 ALA 9 A D
A 1 14 TRP 9 A E
A 1 15 GLY 9 A F
A 1 16 LYS 9 A G
A 1 17 VAL 9 A H
A 1 18 GLY 9 A I
A 1 19 ALA 9 A J
A 1 20 HIS 10 A .
A 1 21 ALA 11 A .
A 1 22 GLY 12 A .
A 1 23 GLU 13 A .
A 1 24 TYR 14 A .
A 1 25 GLY 15 A .
A 1 26 ALA 16 A .
A 1 27 GLU 17 A .
A 1 28 ALA 18 A .
A 1 29 LEU 19 A .
A 1 30 GLU 30 A .
A 1 31 ARG 31 A .
A 1 32 MET 32 A .
A 1 33 PHE 33 A .
A 1 34 LEU 34 A .
A 1 35 SER 35 A .
A 1 36 PHE 36 A .
A 1 37 PRO 37 A .
A 1 38 THR 38 A .
A 1 39 THR 39 A .
A 1 40 LYS 40 A .
#
loop_
_atom_site.type_symbol
_atom_site.label_atom_id
_atom_site.label_alt_id
_atom_site.label_comp_id
_atom_site.label_asym_id
_atom_site.label_entity_id
_atom_site.label_seq_id
_atom_site.pdbx_PDB_ins_code
_atom_site.Cartn_x
_atom_site.Cartn_y
_atom_site.Cartn_z
_atom_site.auth_seq_id
O OG . SER A 1 3 ? 15.226 19.253 6.158 3
N N . PRO A 1 4 ? 15.482 22.408 4.967 4
C CA . PRO A 1 4 ? 16.666 22.979 4.309 4
C C . PRO A 1 4 ? 17.686 21.870 4.153 4
O O . PRO A 1 4 ? 18.302 21.692 3.105 4
C CB . PRO A 1 4 ? 17.127 24.101 5.240 4
C CG . PRO A 1 4 ? 15.822 24.569 5.841 4
C CD . PRO A 1 4 ? 15.090 23.241 6.116 4
N N . ALA A 1 5 ? 17.783 21.099 5.227 5
C CA . ALA A 1 5 ? 18.704 19.941 5.288 5
C C . ALA A 1 5 ? 18.433 18.924 4.195 5
O O . ALA A 1 5 ? 19.327 18.435 3.508 5
C CB . ALA A 1 5 ? 18.545 19.336 6.677 5
N N . ASP A 1 6 ? 17.164 18.558 4.042 6
C CA . ASP A 1 6 ? 16.762 17.621 2.990 6
C C . ASP A 1 6 ? 17.203 18.179 1.634 6
O O . ASP A 1 6 ? 17.682 17.447 0.751 6
C CB . ASP A 1 6 ? 15.221 17.443 2.959 6
C CG . ASP A 1 6 ? 14.659 16.636 4.095 6
O OD1 . ASP A 1 6 ? 15.304 15.686 4.574 6
O OD2 . ASP A 1 6 ? 13.537 16.973 4.537 6
N N . LYS A 1 7 ? 16.930 19.486 1.485 7
C CA . LYS A 1 7 ? 17.230 20.147 0.181 7
C C . LYS A 1 7 ? 18.697 20.097 -0.148 7
O O . LYS A 1 7 ? 19.142 19.769 -1.264 7
C CB . LYS A 1 7 ? 16.658 21.533 0.111 7
C CG . LYS A 1 7 ? 15.126 21.608 0.162 7
C CD . LYS A 1 7 ? 14.715 23.062 0.385 7
C CE . LYS A 1 7 ? 13.239 23.292 0.519 7
N NZ . LYS A 1 7 ? 12.961 24.677 1.001 7
N N . THR A 1 8 ? 19.510 20.370 0.861 8
C CA . THR A 1 8 ? 20.975 20.302 0.679 8
C C . THR A 1 8 ? 21.411 18.899 0.305 8
O O . THR A 1 8 ? 22.262 18.732 -0.582 8
C CB . THR A 1 8 ? 21.665 20.739 2.043 8
O OG1 . THR A 1 8 ? 21.263 22.125 2.225 8
C CG2 . THR A 1 8 ? 23.170 20.513 2.049 8
N N . ASN A 1 9 ? 20.824 17.931 1.014 9
C CA . ASN A 1 9 ? 21.145 16.503 0.809 9
C C . ASN A 1 9 ? 20.831 16.034 -0.603 9
O O . ASN A 1 9 ? 21.601 15.311 -1.231 9
C CB . ASN A 1 9 ? 20.445 15.614 1.839 9
C CG . ASN A 1 9 ? 20.991 15.746 3.235 9
O OD1 . ASN A 1 9 ? 20.348 15.285 4.183 9
N ND2 . ASN A 1 9 ? 22.151 16.376 3.368 9
N N . HIS A 1 20 ? 25.132 10.904 -15.253 10
C CA . HIS A 1 20 ? 24.759 9.486 -15.198 10
C C . HIS A 1 20 ? 23.274 9.318 -14.973 10
O O . HIS A 1 20 ? 22.793 8.182 -15.063 10
C CB . HIS A 1 20 ? 25.557 8.704 -14.133 10
C CG . HIS A 1 20 ? 27.010 8.651 -14.521 10
N ND1 . HIS A 1 20 ? 27.607 7.578 -15.126 10
C CD2 . HIS A 1 20 ? 27.966 9.602 -14.397 10
C CE1 . HIS A 1 20 ? 28.881 7.862 -15.349 10
N NE2 . HIS A 1 20 ? 29.121 9.084 -14.925 10
N N . ALA A 1 21 ? 22.602 10.417 -14.696 11
C CA . ALA A 1 21 ? 21.151 10.400 -14.438 11
C C . ALA A 1 21 ? 20.404 9.501 -15.407 11
O O . ALA A 1 21 ? 19.592 8.645 -14.998 11
C CB . ALA A 1 21 ? 20.599 11.824 -14.441 11
N N . GLY A 1 22 ? 20.637 9.687 -16.689 12
C CA . GLY A 1 22 ? 19.975 8.915 -17.737 12
C C . GLY A 1 22 ? 20.122 7.416 -17.531 12
O O . GLY A 1 22 ? 19.119 6.673 -17.514 12
N N . GLU A 1 23 ? 21.363 6.991 -17.404 13
C CA . GLU A 1 23 ? 21.708 5.569 -17.205 13
C C . GLU A 1 23 ? 21.099 5.042 -15.925 13
O O . GLU A 1 23 ? 20.581 3.908 -15.844 13
C CB . GLU A 1 23 ? 23.204 5.371 -17.269 13
C CG . GLU A 1 23 ? 23.972 4.606 -16.206 13
C CD . GLU A 1 23 ? 25.476 4.738 -16.269 13
O OE1 . GLU A 1 23 ? 26.071 5.601 -16.904 13
O OE2 . GLU A 1 23 ? 26.052 3.852 -15.598 13
N N . TYR A 1 24 ? 21.096 5.864 -14.898 14
C CA . TYR A 1 24 ? 20.538 5.451 -13.603 14
C C . TYR A 1 24 ? 19.017 5.354 -13.731 14
O O . TYR A 1 24 ? 18.408 4.476 -13.112 14
C CB . TYR A 1 24 ? 21.011 6.374 -12.494 14
C CG . TYR A 1 24 ? 22.488 6.440 -12.180 14
C CD1 . TYR A 1 24 ? 23.436 5.631 -12.789 14
C CD2 . TYR A 1 24 ? 22.956 7.356 -11.220 14
C CE1 . TYR A 1 24 ? 24.787 5.728 -12.476 14
C CE2 . TYR A 1 24 ? 24.298 7.466 -10.889 14
C CZ . TYR A 1 24 ? 25.218 6.647 -11.525 14
O OH . TYR A 1 24 ? 26.565 6.717 -11.244 14
N N . GLY A 1 25 ? 18.416 6.216 -14.520 15
C CA . GLY A 1 25 ? 16.954 6.223 -14.726 15
C C . GLY A 1 25 ? 16.546 4.919 -15.385 15
O O . GLY A 1 25 ? 15.588 4.246 -14.965 15
N N . ALA A 1 26 ? 17.310 4.551 -16.396 16
C CA . ALA A 1 26 ? 17.079 3.297 -17.136 16
C C . ALA A 1 26 ? 17.256 2.077 -16.236 16
O O . ALA A 1 26 ? 16.454 1.106 -16.261 16
C CB . ALA A 1 26 ? 17.962 3.245 -18.371 16
N N . GLU A 1 27 ? 18.286 2.104 -15.411 17
C CA . GLU A 1 27 ? 18.558 0.998 -14.490 17
C C . GLU A 1 27 ? 17.431 0.848 -13.479 17
O O . GLU A 1 27 ? 17.022 -0.272 -13.146 17
C CB . GLU A 1 27 ? 19.857 1.177 -13.713 17
C CG . GLU A 1 27 ? 20.200 0.062 -12.720 17
C CD . GLU A 1 27 ? 21.496 0.240 -11.964 17
O OE1 . GLU A 1 27 ? 22.383 0.725 -12.697 17
O OE2 . GLU A 1 27 ? 21.660 -0.056 -10.794 17
N N . ALA A 1 28 ? 16.943 1.974 -12.995 18
C CA . ALA A 1 28 ? 15.831 1.957 -12.033 18
C C . ALA A 1 28 ? 14.607 1.293 -12.670 18
O O . ALA A 1 28 ? 13.911 0.512 -11.975 18
C CB . ALA A 1 28 ? 15.502 3.332 -11.515 18
N N . LEU A 1 29 ? 14.369 1.577 -13.937 19
C CA . LEU A 1 29 ? 13.197 0.984 -14.645 19
C C . LEU A 1 29 ? 13.380 -0.530 -14.730 19
O O . LEU A 1 29 ? 12.474 -1.285 -14.347 19
C CB . LEU A 1 29 ? 13.006 1.663 -15.991 19
C CG . LEU A 1 29 ? 12.508 3.101 -16.021 19
C CD1 . LEU A 1 29 ? 12.623 3.632 -17.445 19
C CD2 . LEU A 1 29 ? 11.076 3.156 -15.533 19
N N . GLU A 1 30 ? 14.538 -0.955 -15.207 30
C CA . GLU A 1 30 ? 14.819 -2.407 -15.298 30
C C . GLU A 1 30 ? 14.671 -3.106 -13.966 30
O O . GLU A 1 30 ? 14.074 -4.191 -13.869 30
C CB . GLU A 1 30 ? 16.199 -2.682 -15.821 30
C CG . GLU A 1 30 ? 16.473 -3.999 -16.560 30
C CD . GLU A 1 30 ? 17.767 -3.871 -17.347 30
O OE1 . GLU A 1 30 ? 17.820 -3.249 -18.395 30
O OE2 . GLU A 1 30 ? 18.702 -4.407 -16.734 30
N N . ARG A 1 31 ? 15.209 -2.514 -12.895 31
C CA . ARG A 1 31 ? 15.065 -3.131 -11.564 31
C C . ARG A 1 31 ? 13.580 -3.250 -11.234 31
O O . ARG A 1 31 ? 13.106 -4.226 -10.629 31
C CB . ARG A 1 31 ? 15.808 -2.328 -10.487 31
C CG . ARG A 1 31 ? 17.340 -2.395 -10.667 31
C CD . ARG A 1 31 ? 18.019 -1.574 -9.618 31
N NE . ARG A 1 31 ? 19.477 -1.649 -9.716 31
C CZ . ARG A 1 31 ? 20.242 -2.599 -9.191 31
N NH1 . ARG A 1 31 ? 19.728 -3.536 -8.391 31
N NH2 . ARG A 1 31 ? 21.549 -2.616 -9.473 31
N N . MET A 1 32 ? 12.813 -2.225 -11.590 32
C CA . MET A 1 32 ? 11.367 -2.213 -11.299 32
C C . MET A 1 32 ? 10.598 -3.298 -12.056 32
O O . MET A 1 32 ? 9.703 -3.986 -11.510 32
C CB . MET A 1 32 ? 10.794 -0.812 -11.538 32
C CG . MET A 1 32 ? 9.331 -0.839 -11.126 32
S SD . MET A 1 32 ? 8.582 0.705 -11.695 32
C CE . MET A 1 32 ? 8.605 0.510 -13.472 32
N N . PHE A 1 33 ? 10.932 -3.464 -13.325 33
C CA . PHE A 1 33 ? 10.306 -4.458 -14.185 33
C C . PHE A 1 33 ? 10.595 -5.861 -13.677 33
O O . PHE A 1 33 ? 9.644 -6.673 -13.741 33
C CB . PHE A 1 33 ? 10.618 -4.268 -15.660 33
C CG . PHE A 1 33 ? 10.060 -2.993 -16.221 33
C CD1 . PHE A 1 33 ? 8.800 -2.541 -15.824 33
C CD2 . PHE A 1 33 ? 10.812 -2.254 -17.131 33
C CE1 . PHE A 1 33 ? 8.271 -1.372 -16.327 33
C CE2 . PHE A 1 33 ? 10.287 -1.055 -17.655 33
C CZ . PHE A 1 33 ? 9.020 -0.625 -17.247 33
N N . LEU A 1 34 ? 11.805 -6.081 -13.193 34
C CA . LEU A 1 34 ? 12.234 -7.383 -12.675 34
C C . LEU A 1 34 ? 11.685 -7.696 -11.296 34
O O . LEU A 1 34 ? 11.257 -8.840 -11.035 34
C CB . LEU A 1 34 ? 13.748 -7.559 -12.720 34
C CG . LEU A 1 34 ? 14.491 -7.623 -14.030 34
C CD1 . LEU A 1 34 ? 15.953 -8.003 -13.783 34
C CD2 . LEU A 1 34 ? 13.859 -8.653 -14.964 34
N N . SER A 1 35 ? 11.717 -6.733 -10.397 35
C CA . SER A 1 35 ? 11.223 -6.961 -9.048 35
C C . SER A 1 35 ? 9.718 -6.863 -8.895 35
O O . SER A 1 35 ? 9.175 -7.552 -7.997 35
C CB . SER A 1 35 ? 11.921 -6.013 -8.055 35
O OG . SER A 1 35 ? 13.325 -6.227 -8.168 35
N N . PHE A 1 36 ? 9.070 -6.024 -9.677 36
C CA . PHE A 1 36 ? 7.616 -5.772 -9.572 36
C C . PHE A 1 36 ? 7.021 -5.864 -10.971 36
O O . PHE A 1 36 ? 6.747 -4.853 -11.628 36
C CB . PHE A 1 36 ? 7.403 -4.396 -8.926 36
C CG . PHE A 1 36 ? 8.193 -4.126 -7.672 36
C CD1 . PHE A 1 36 ? 7.833 -4.691 -6.457 36
C CD2 . PHE A 1 36 ? 9.315 -3.295 -7.709 36
C CE1 . PHE A 1 36 ? 8.571 -4.463 -5.278 36
C CE2 . PHE A 1 36 ? 10.061 -3.047 -6.564 36
C CZ . PHE A 1 36 ? 9.703 -3.628 -5.348 36
N N . PRO A 1 37 ? 6.843 -7.098 -11.415 37
C CA . PRO A 1 37 ? 6.369 -7.401 -12.768 37
C C . PRO A 1 37 ? 5.046 -6.793 -13.151 37
O O . PRO A 1 37 ? 4.804 -6.645 -14.365 37
C CB . PRO A 1 37 ? 6.333 -8.922 -12.860 37
C CG . PRO A 1 37 ? 7.315 -9.365 -11.808 37
C CD . PRO A 1 37 ? 7.174 -8.337 -10.676 37
N N . THR A 1 38 ? 4.223 -6.489 -12.173 38
C CA . THR A 1 38 ? 2.910 -5.881 -12.423 38
C C . THR A 1 38 ? 3.064 -4.500 -13.027 38
O O . THR A 1 38 ? 2.097 -4.023 -13.648 38
C CB . THR A 1 38 ? 1.998 -5.880 -11.146 38
O OG1 . THR A 1 38 ? 2.605 -4.967 -10.180 38
C CG2 . THR A 1 38 ? 1.789 -7.265 -10.525 38
N N . THR A 1 39 ? 4.211 -3.860 -12.881 39
C CA . THR A 1 39 ? 4.430 -2.495 -13.430 39
C C . THR A 1 39 ? 4.538 -2.525 -14.936 39
O O . THR A 1 39 ? 4.356 -1.540 -15.673 39
C CB . THR A 1 39 ? 5.666 -1.792 -12.732 39
O OG1 . THR A 1 39 ? 6.849 -2.604 -13.036 39
C CG2 . THR A 1 39 ? 5.467 -1.594 -11.227 39
N N . LYS A 1 40 ? 4.819 -3.706 -15.459 40
C CA . LYS A 1 40 ? 4.950 -3.931 -16.894 40
C C . LYS A 1 40 ? 3.637 -3.711 -17.637 40
O O . LYS A 1 40 ? 3.647 -3.387 -18.854 40

View File

@@ -40,3 +40,13 @@ class TestPYMOL2727(testing.PyMOLTestCase):
seq = self._get_seq('segi A')
self.assertEqual(seq, 'VLSPADKTNHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR')
@testing.requires_version('2.4')
def testMissingResInsScheme(self):
# With _pdbx_poly_seq_scheme, missing residues with insertion codes
# should be inserted correctly (GH #303)
cmd.set('cif_use_auth', 1)
cmd.load(self.datafile('1hbb_pdbx_seq_one_letter_code-ins-scheme.cif'), '1hbb')
seq = self._get_seq('segi A')
self.assertEqual(seq, 'VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR')