Commit 834a3a50 by maarten

werk van vandaaag

git-svn-id: svn+ssh://gitlab/srv/svn-repos/pdb-redo/trunk@304 a1961a4f-ab94-4bcc-80e8-33b5a54de466
parent 7a423aec
...@@ -389,10 +389,10 @@ namespace detail ...@@ -389,10 +389,10 @@ namespace detail
return mRow[mColumns[ix]]; return mRow[mColumns[ix]];
} }
getRowResult(Row& r, C... columns) getRowResult(const Row& r, C... columns)
: mRow(r), mColumns({{columns...}}) {} : mRow(r), mColumns({{columns...}}) {}
Row& mRow; const Row& mRow;
std::array<const char*, N> mColumns; std::array<const char*, N> mColumns;
}; };
...@@ -519,7 +519,7 @@ class Row ...@@ -519,7 +519,7 @@ class Row
} }
template<typename... C> template<typename... C>
auto get(C... columns) -> detail::getRowResult<C...> auto get(C... columns) const -> detail::getRowResult<C...>
{ {
return detail::getRowResult<C...>(*this, columns...); return detail::getRowResult<C...>(*this, columns...);
} }
......
...@@ -21,8 +21,6 @@ namespace mmcif ...@@ -21,8 +21,6 @@ namespace mmcif
// Entities themselves are made up of compounds. And compounds // Entities themselves are made up of compounds. And compounds
// contain CompoundAtom records for each atom. // contain CompoundAtom records for each atom.
class Composition;
class Entity;
class Compound; class Compound;
class Link; class Link;
struct CompoundAtom; struct CompoundAtom;
......
...@@ -96,7 +96,6 @@ class Atom ...@@ -96,7 +96,6 @@ class Atom
void location(Point p); void location(Point p);
const Compound& comp() const; const Compound& comp() const;
const Entity& ent() const;
bool isWater() const; bool isWater() const;
int charge() const; int charge() const;
...@@ -142,6 +141,13 @@ class Atom ...@@ -142,6 +141,13 @@ class Atom
// the energy-type field // the energy-type field
std::string energyType() const; std::string energyType() const;
// convenience routine
bool isBackBone() const
{
return labelAtomId() == "N" or labelAtomId() == "O" or
labelAtomId() == "C" or labelAtomId() == "CA";
}
private: private:
struct AtomImpl* mImpl; struct AtomImpl* mImpl;
}; };
...@@ -210,8 +216,8 @@ class Monomer : public Residue ...@@ -210,8 +216,8 @@ class Monomer : public Residue
Monomer(const Monomer& rhs); Monomer(const Monomer& rhs);
Monomer& operator=(const Monomer& rhs); Monomer& operator=(const Monomer& rhs);
Monomer(Polymer& polymer, uint32 index); Monomer(const Polymer& polymer, uint32 index);
Monomer(Polymer& polymer, uint32 index, int seqID, Monomer(const Polymer& polymer, uint32 index, int seqID,
const std::string& compoundID, const std::string& altID); const std::string& compoundID, const std::string& altID);
// Assuming this is really an amino acid... // Assuming this is really an amino acid...
...@@ -236,7 +242,7 @@ class Monomer : public Residue ...@@ -236,7 +242,7 @@ class Monomer : public Residue
static bool isCis(const Monomer& a, const Monomer& b); static bool isCis(const Monomer& a, const Monomer& b);
private: private:
Polymer* mPolymer; const Polymer* mPolymer;
uint32 mIndex; uint32 mIndex;
}; };
...@@ -245,6 +251,7 @@ class Monomer : public Residue ...@@ -245,6 +251,7 @@ class Monomer : public Residue
class Polymer class Polymer
{ {
public: public:
Polymer(const Structure& s, const std::string& asymID);
Polymer(const Structure& s, const std::string& entityID, const std::string& asymID); Polymer(const Structure& s, const std::string& entityID, const std::string& asymID);
Polymer(const Polymer&); Polymer(const Polymer&);
Polymer& operator=(const Polymer&); Polymer& operator=(const Polymer&);
...@@ -255,7 +262,7 @@ class Polymer ...@@ -255,7 +262,7 @@ class Polymer
typedef base_type::reference reference; typedef base_type::reference reference;
typedef base_type::pointer pointer; typedef base_type::pointer pointer;
iterator(Polymer& p, uint32 index); iterator(const Polymer& p, uint32 index);
iterator(iterator&& rhs); iterator(iterator&& rhs);
iterator(const iterator& rhs); iterator(const iterator& rhs);
...@@ -285,22 +292,26 @@ class Polymer ...@@ -285,22 +292,26 @@ class Polymer
bool operator!=(const iterator& rhs) const { return mPolymer != rhs.mPolymer or mIndex != rhs.mIndex; } bool operator!=(const iterator& rhs) const { return mPolymer != rhs.mPolymer or mIndex != rhs.mIndex; }
private: private:
Polymer* mPolymer; const Polymer* mPolymer;
uint32 mIndex; uint32 mIndex;
Monomer mCurrent; Monomer mCurrent;
}; };
iterator begin(); iterator begin() const;
iterator end(); iterator end() const;
size_t size() const { return mPolySeq.size(); } size_t size() const { return mPolySeq.size(); }
Monomer operator[](size_t index) const; Monomer operator[](size_t index) const;
Monomer getBySeqID(int seqID) const;
Structure* structure() const { return mStructure; } Structure* structure() const { return mStructure; }
std::string asymID() const { return mAsymID; } std::string asymID() const { return mAsymID; }
std::string entityID() const { return mEntityID; } std::string entityID() const { return mEntityID; }
int Distance(const Monomer& a, const Monomer& b) const;
private: private:
friend struct iterator; friend struct iterator;
...@@ -332,8 +343,6 @@ class File : public std::enable_shared_from_this<File> ...@@ -332,8 +343,6 @@ class File : public std::enable_shared_from_this<File>
struct FileImpl& impl() const { return *mImpl; } struct FileImpl& impl() const { return *mImpl; }
std::vector<const Entity*> entities();
cif::Datablock& data(); cif::Datablock& data();
cif::File& file(); cif::File& file();
......
...@@ -708,7 +708,7 @@ Monomer& Monomer::operator=(const Monomer& rhs) ...@@ -708,7 +708,7 @@ Monomer& Monomer::operator=(const Monomer& rhs)
return *this; return *this;
} }
Monomer::Monomer(Polymer& polymer, uint32 index) Monomer::Monomer(const Polymer& polymer, uint32 index)
: Residue(*polymer.structure()) : Residue(*polymer.structure())
, mPolymer(&polymer) , mPolymer(&polymer)
, mIndex(index) , mIndex(index)
...@@ -716,7 +716,7 @@ Monomer::Monomer(Polymer& polymer, uint32 index) ...@@ -716,7 +716,7 @@ Monomer::Monomer(Polymer& polymer, uint32 index)
} }
Monomer::Monomer(Polymer& polymer, uint32 index, int seqID, const string& compoundID, const string& altID) Monomer::Monomer(const Polymer& polymer, uint32 index, int seqID, const string& compoundID, const string& altID)
: Residue(*polymer.structure(), compoundID, polymer.asymID(), seqID, altID) : Residue(*polymer.structure(), compoundID, polymer.asymID(), seqID, altID)
, mPolymer(&polymer) , mPolymer(&polymer)
, mIndex(index) , mIndex(index)
...@@ -841,7 +841,7 @@ bool Monomer::isCis(const mmcif::Monomer& a, const mmcif::Monomer& b) ...@@ -841,7 +841,7 @@ bool Monomer::isCis(const mmcif::Monomer& a, const mmcif::Monomer& b)
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// polymer // polymer
Polymer::iterator::iterator(Polymer& p, uint32 index) Polymer::iterator::iterator(const Polymer& p, uint32 index)
: mPolymer(&p), mIndex(index), mCurrent(p, index) : mPolymer(&p), mIndex(index), mCurrent(p, index)
{ {
auto& polySeq = mPolymer->mPolySeq; auto& polySeq = mPolymer->mPolySeq;
...@@ -916,22 +916,73 @@ Polymer::Polymer(const Polymer& rhs) ...@@ -916,22 +916,73 @@ Polymer::Polymer(const Polymer& rhs)
} }
Polymer::Polymer(const Structure& s, const string& asymID)
: mStructure(const_cast<Structure*>(&s)), mAsymID(asymID)
, mPolySeq(s.category("pdbx_poly_seq_scheme").find(cif::Key("asym_id") == mAsymID))
{
mEntityID = mPolySeq.front()["entity_id"].as<string>();
#if DEBUG
for (auto r: mPolySeq)
assert(r["entity_id"] == mEntityID);
#endif
}
Polymer::Polymer(const Structure& s, const string& entityID, const string& asymID) Polymer::Polymer(const Structure& s, const string& entityID, const string& asymID)
: mStructure(const_cast<Structure*>(&s)), mEntityID(entityID), mAsymID(asymID) : mStructure(const_cast<Structure*>(&s)), mEntityID(entityID), mAsymID(asymID)
, mPolySeq(s.category("pdbx_poly_seq_scheme").find(cif::Key("asym_id") == mAsymID and cif::Key("entity_id") == mEntityID)) , mPolySeq(s.category("pdbx_poly_seq_scheme").find(cif::Key("asym_id") == mAsymID and cif::Key("entity_id") == mEntityID))
{ {
} }
Polymer::iterator Polymer::begin() Polymer::iterator Polymer::begin() const
{ {
return iterator(*this, 0); return iterator(*this, 0);
} }
Polymer::iterator Polymer::end() Polymer::iterator Polymer::end() const
{ {
return iterator(*this, mPolySeq.size()); return iterator(*this, mPolySeq.size());
} }
Monomer Polymer::getBySeqID(int seqID) const
{
for (auto m: *this)
if (m.seqID() == seqID)
return m;
if (VERBOSE)
cerr << "Monomer with seqID " << seqID << " not found in polymer " << mAsymID << endl;
return Monomer();
}
int Polymer::Distance(const Monomer& a, const Monomer& b) const
{
int result = numeric_limits<int>::max();
if (a.asymID() == b.asymID())
{
int ixa = numeric_limits<int>::max(), ixb = numeric_limits<int>::max();
int ix = 0, f = 0;
for (auto m: *this)
{
if (m.seqID() == a.seqID())
ixa = ix, ++f;
if (m.seqID() == b.seqID())
ixb = ix, ++f;
if (f == 2)
{
result = abs(ixa - ixb);
break;
}
}
}
return result;
}
//cif::RowSet Polymer::polySeqRows() const //cif::RowSet Polymer::polySeqRows() const
//{ //{
// auto& cat = mStructure->category("pdbx_poly_seq_scheme"); // auto& cat = mStructure->category("pdbx_poly_seq_scheme");
......
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