Commit 58f1b626 by Maarten L. Hekkelman

change getResidue

parent c104a08e
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
# set the project name # set the project name
project(cifpp VERSION 3.0.5 LANGUAGES CXX) project(cifpp VERSION 4.0.0 LANGUAGES CXX)
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
......
Version 4.0.0
- getResidue in mmcif::Structure now requires both a
sequence ID and an auth sequence ID. Very unfortunate.
Version 3.0.5 Version 3.0.5
- mmcif::Structure redesign. It is now a wrapper around a cif::Datablock. - mmcif::Structure redesign. It is now a wrapper around a cif::Datablock.
......
...@@ -296,7 +296,7 @@ class Residue ...@@ -296,7 +296,7 @@ class Residue
public: public:
// constructor // constructor
Residue(const Structure &structure, const std::string &compoundID, Residue(const Structure &structure, const std::string &compoundID,
const std::string &asymID, int seqID = 0, const std::string &authSeqID = {}) const std::string &asymID, int seqID, const std::string &authSeqID)
: mStructure(&structure) : mStructure(&structure)
, mCompoundID(compoundID) , mCompoundID(compoundID)
, mAsymID(asymID) , mAsymID(asymID)
...@@ -383,9 +383,6 @@ class Residue ...@@ -383,9 +383,6 @@ class Residue
const Structure *mStructure = nullptr; const Structure *mStructure = nullptr;
std::string mCompoundID, mAsymID; std::string mCompoundID, mAsymID;
int mSeqID = 0; int mSeqID = 0;
// Watch out, this is used only to label waters... The rest of the code relies on
// MapLabelToAuth to get this info. Perhaps we should rename this member field.
std::string mAuthSeqID; std::string mAuthSeqID;
AtomView mAtoms; AtomView mAtoms;
}; };
...@@ -625,26 +622,41 @@ class Structure ...@@ -625,26 +622,41 @@ class Structure
/// \brief Return the atom closest to point \a p with atom type \a type in a residue of type \a res_type /// \brief Return the atom closest to point \a p with atom type \a type in a residue of type \a res_type
Atom getAtomByPositionAndType(Point p, std::string_view type, std::string_view res_type) const; Atom getAtomByPositionAndType(Point p, std::string_view type, std::string_view res_type) const;
/// \brief Get a residue, if \a seqID is zero, the non-polymers are searched /// \brief Get a residue for an asym with id \a asymID seq id \a seqID and authSeqID \a authSeqID
const Residue &getResidue(const std::string &asymID, const std::string &compID, int seqID = 0) const; Residue &getResidue(const std::string &asymID, int seqID, const std::string &authSeqID);
/// \brief Get a residue, if \a seqID is zero, the non-polymers are searched /// \brief Get a the single residue for an asym with id \a asymID seq id \a seqID and authSeqID \a authSeqID
Residue &getResidue(const std::string &asymID, const std::string &compID, int seqID = 0); const Residue &getResidue(const std::string &asymID, int seqID, const std::string &authSeqID) const
{
return const_cast<Structure*>(this)->getResidue(asymID, seqID, authSeqID);
}
/// \brief Get a the single residue for an asym with id \a asymID /// \brief Get a residue for an asym with id \a asymID, compound id \a compID, seq id \a seqID and authSeqID \a authSeqID
const Residue &getResidue(const std::string &asymID) const; Residue &getResidue(const std::string &asymID, const std::string &compID, int seqID, const std::string &authSeqID);
/// \brief Get a the single residue for an asym with id \a asymID and seq id \a seqID /// \brief Get a residue for an asym with id \a asymID, compound id \a compID, seq id \a seqID and authSeqID \a authSeqID
const Residue &getResidue(const std::string &asymID, int seqID) const; const Residue &getResidue(const std::string &asymID, const std::string &compID, int seqID, const std::string &authSeqID) const
{
return const_cast<Structure*>(this)->getResidue(asymID, compID, seqID, authSeqID);
}
/// \brief Get a the single residue for an asym with id \a asymID /// \brief Get a the single residue for an asym with id \a asymID
Residue &getResidue(const std::string &asymID); Residue &getResidue(const std::string &asymID);
/// \brief Get a the single residue for an asym with id \a asymID
const Residue &getResidue(const std::string &asymID) const
{
return const_cast<Structure*>(this)->getResidue(asymID);
}
/// \brief Get a the residue for atom \a atom /// \brief Get a the residue for atom \a atom
Residue &getResidue(const mmcif::Atom &atom); Residue &getResidue(const mmcif::Atom &atom);
/// \brief Get a the residue for atom \a atom /// \brief Get a the residue for atom \a atom
const Residue &getResidue(const mmcif::Atom &atom) const; const Residue &getResidue(const mmcif::Atom &atom) const
{
return const_cast<Structure*>(this)->getResidue(atom);
}
// map between auth and label locations // map between auth and label locations
...@@ -697,11 +709,14 @@ class Structure ...@@ -697,11 +709,14 @@ class Structure
/// \brief Create a new (sugar) branch with one first NAG containing atoms \a nag_atoms /// \brief Create a new (sugar) branch with one first NAG containing atoms \a nag_atoms
Branch& createBranch(std::vector<std::vector<cif::Item>> &nag_atoms); Branch& createBranch(std::vector<std::vector<cif::Item>> &nag_atoms);
/// \brief Extend an existing (sugar) branch identified by \a asymID with one sugar containing atoms \a atoms
Branch& extendBranch(const std::string &asym_id, std::vector<std::vector<cif::Item>> &atoms);
/// \brief Remove a residue, can be monomer or nonpoly /// \brief Remove a residue, can be monomer or nonpoly
/// ///
/// \param asym_id The asym ID /// \param asym_id The asym ID
/// \param seq_id The sequence ID /// \param seq_id The sequence ID
void removeResidue(const std::string &sym_id, int seq_id); void removeResidue(const std::string &asym_id, int seq_id);
/// \brief To sort the atoms in order of model > asym-id > res-id > atom-id /// \brief To sort the atoms in order of model > asym-id > res-id > atom-id
/// Will asssign new atom_id's to all atoms. Be carefull /// Will asssign new atom_id's to all atoms. Be carefull
......
...@@ -255,10 +255,10 @@ BondMap::BondMap(const Structure &p) ...@@ -255,10 +255,10 @@ BondMap::BondMap(const Structure &p)
cif::Progress progress(compounds.size(), "Creating bond map"); cif::Progress progress(compounds.size(), "Creating bond map");
// some helper indices to speed things up a bit // some helper indices to speed things up a bit
std::map<std::tuple<std::string, int, std::string>, std::string> atomMapByAsymSeqAndAtom; std::map<std::tuple<std::string, int, std::string, std::string>, std::string> atomMapByAsymSeqAndAtom;
for (auto &a : p.atoms()) for (auto &a : p.atoms())
{ {
auto key = make_tuple(a.labelAsymID(), a.labelSeqID(), a.labelAtomID()); auto key = make_tuple(a.labelAsymID(), a.labelSeqID(), a.labelAtomID(), a.authSeqID());
atomMapByAsymSeqAndAtom[key] = a.id(); atomMapByAsymSeqAndAtom[key] = a.id();
} }
...@@ -280,8 +280,8 @@ BondMap::BondMap(const Structure &p) ...@@ -280,8 +280,8 @@ BondMap::BondMap(const Structure &p)
continue; continue;
} }
auto c = atomMapByAsymSeqAndAtom[make_tuple(asymID, lastSeqID, "C")]; auto c = atomMapByAsymSeqAndAtom[make_tuple(asymID, lastSeqID, "C", "")];
auto n = atomMapByAsymSeqAndAtom[make_tuple(asymID, seqID, "N")]; auto n = atomMapByAsymSeqAndAtom[make_tuple(asymID, seqID, "N", "")];
if (not(c.empty() or n.empty())) if (not(c.empty() or n.empty()))
bindAtoms(c, n); bindAtoms(c, n);
...@@ -293,14 +293,16 @@ BondMap::BondMap(const Structure &p) ...@@ -293,14 +293,16 @@ BondMap::BondMap(const Structure &p)
{ {
std::string asym1, asym2, atomId1, atomId2; std::string asym1, asym2, atomId1, atomId2;
int seqId1 = 0, seqId2 = 0; int seqId1 = 0, seqId2 = 0;
cif::tie(asym1, asym2, atomId1, atomId2, seqId1, seqId2) = std::string authSeqId1, authSeqId2;
cif::tie(asym1, asym2, atomId1, atomId2, seqId1, seqId2, authSeqId1, authSeqId2) =
l.get("ptnr1_label_asym_id", "ptnr2_label_asym_id", l.get("ptnr1_label_asym_id", "ptnr2_label_asym_id",
"ptnr1_label_atom_id", "ptnr2_label_atom_id", "ptnr1_label_atom_id", "ptnr2_label_atom_id",
"ptnr1_label_seq_id", "ptnr2_label_seq_id"); "ptnr1_label_seq_id", "ptnr2_label_seq_id",
"ptnr1_auth_seq_id", "ptnr2_auth_seq_id");
std::string a = atomMapByAsymSeqAndAtom[make_tuple(asym1, seqId1, atomId1)];
std::string b = atomMapByAsymSeqAndAtom[make_tuple(asym2, seqId2, atomId2)];
std::string a = atomMapByAsymSeqAndAtom[make_tuple(asym1, seqId1, atomId1, authSeqId1)];
std::string b = atomMapByAsymSeqAndAtom[make_tuple(asym2, seqId2, atomId2, authSeqId2)];
if (not(a.empty() or b.empty())) if (not(a.empty() or b.empty()))
linkAtoms(a, b); linkAtoms(a, b);
} }
...@@ -373,15 +375,12 @@ BondMap::BondMap(const Structure &p) ...@@ -373,15 +375,12 @@ BondMap::BondMap(const Structure &p)
} }
// loop over pdbx_branch_scheme // loop over pdbx_branch_scheme
for (auto r : db["pdbx_branch_scheme"].find(cif::Key("mon_id") == c)) for (const auto &[asym_id, pdb_seq_num] : db["pdbx_branch_scheme"].find<std::string,std::string>(cif::Key("mon_id") == c, "asym_id", "pdb_seq_num"))
{ {
std::string asymID;
cif::tie(asymID) = r.get("asym_id");
std::vector<Atom> rAtoms; std::vector<Atom> rAtoms;
copy_if(atoms.begin(), atoms.end(), back_inserter(rAtoms), copy_if(atoms.begin(), atoms.end(), back_inserter(rAtoms),
[&](auto &a) [&](const Atom &a)
{ return a.labelAsymID() == asymID; }); { return a.labelAsymID() == asym_id and a.authSeqID() == pdb_seq_num; });
for (uint32_t i = 0; i + 1 < rAtoms.size(); ++i) for (uint32_t i = 0; i + 1 < rAtoms.size(); ++i)
{ {
......
...@@ -32,7 +32,7 @@ int main(int argc, char* argv[]) ...@@ -32,7 +32,7 @@ int main(int argc, char* argv[])
mmcif::File f(testdir / ".."/"examples"/"1cbs.cif.gz"); mmcif::File f(testdir / ".."/"examples"/"1cbs.cif.gz");
mmcif::Structure structure(f); mmcif::Structure structure(f);
auto &res = structure.getResidue("B", "REA"); auto &res = structure.getResidue("B");
structure.changeResidue(res, "RXA", {}); structure.changeResidue(res, "RXA", {});
structure.cleanupEmptyCategories(); structure.cleanupEmptyCategories();
......
...@@ -123,8 +123,8 @@ _pdbx_nonpoly_scheme.asym_id A ...@@ -123,8 +123,8 @@ _pdbx_nonpoly_scheme.asym_id A
_pdbx_nonpoly_scheme.ndb_seq_num 1 _pdbx_nonpoly_scheme.ndb_seq_num 1
_pdbx_nonpoly_scheme.entity_id 1 _pdbx_nonpoly_scheme.entity_id 1
_pdbx_nonpoly_scheme.mon_id HEM _pdbx_nonpoly_scheme.mon_id HEM
_pdbx_nonpoly_scheme.pdb_seq_num 0 _pdbx_nonpoly_scheme.pdb_seq_num 1
_pdbx_nonpoly_scheme.auth_seq_num 0 _pdbx_nonpoly_scheme.auth_seq_num 1
_pdbx_nonpoly_scheme.pdb_mon_id HEM _pdbx_nonpoly_scheme.pdb_mon_id HEM
_pdbx_nonpoly_scheme.auth_mon_id HEM _pdbx_nonpoly_scheme.auth_mon_id HEM
_pdbx_nonpoly_scheme.pdb_strand_id A _pdbx_nonpoly_scheme.pdb_strand_id A
......
...@@ -1634,7 +1634,7 @@ PRO OXT HXT SING N N 17 ...@@ -1634,7 +1634,7 @@ PRO OXT HXT SING N N 17
for (const auto &[compound, seqnr] : std::initializer_list<std::tuple<std::string, int>>{{"PRO", 1}, {"ASN", 2}, {"PHE", 3}}) for (const auto &[compound, seqnr] : std::initializer_list<std::tuple<std::string, int>>{{"PRO", 1}, {"ASN", 2}, {"PHE", 3}})
{ {
auto &res = structure.getResidue("A", compound, seqnr); auto &res = structure.getResidue("A", compound, seqnr, "");
auto atoms = res.atoms(); auto atoms = res.atoms();
auto dc = components.get(compound); auto dc = components.get(compound);
......
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