Commit 17034d3b by maarten

backup voor nu

git-svn-id: svn+ssh://gitlab/srv/svn-repos/pdb-redo/trunk@217 a1961a4f-ab94-4bcc-80e8-33b5a54de466
parent 4632a417
...@@ -820,7 +820,7 @@ struct Key ...@@ -820,7 +820,7 @@ struct Key
return Condition(new detail::KeyIsConditionImpl<std::string>(mItemTag, value)); return Condition(new detail::KeyIsConditionImpl<std::string>(mItemTag, value));
} }
Condition operator==(Empty&) const Condition operator==(const Empty&) const
{ {
return Condition(new detail::KeyIsEmptyConditionImpl(mItemTag)); return Condition(new detail::KeyIsEmptyConditionImpl(mItemTag));
} }
...@@ -875,6 +875,13 @@ Condition Key::operator==(const std::regex& rx) const ...@@ -875,6 +875,13 @@ Condition Key::operator==(const std::regex& rx) const
return Condition(new detail::KeyMatchesConditionImpl(mItemTag, rx)); return Condition(new detail::KeyMatchesConditionImpl(mItemTag, rx));
} }
template<>
inline
Condition Key::operator==(const Empty&) const
{
return Condition(new detail::KeyIsEmptyConditionImpl(mItemTag));
}
struct any struct any
{ {
template<typename T> template<typename T>
......
...@@ -149,10 +149,10 @@ class Residue ...@@ -149,10 +149,10 @@ class Residue
Residue(const Structure& structure) Residue(const Structure& structure)
: mStructure(&structure) {} : mStructure(&structure) {}
Residue(const Structure& structure, const std::string& compoundID, Residue(const Structure& structure, const std::string& compoundID,
const std::string& asymID, const std::string& seqID = "", const std::string& asymID, int seqID = 0,
const std::string& altID = "") const std::string& altID = "")
: mStructure(&structure), mCompoundID(compoundID) : mStructure(&structure), mCompoundID(compoundID)
, mAsymID(asymID), mSeqID(seqID), mAltID(altID) {} , mAsymID(asymID), mAltID(altID), mSeqID(seqID) {}
const Compound& comp() const; const Compound& comp() const;
AtomView atoms() const; AtomView atoms() const;
...@@ -161,13 +161,14 @@ class Residue ...@@ -161,13 +161,14 @@ class Residue
const std::string& compoundID() const { return mCompoundID; } const std::string& compoundID() const { return mCompoundID; }
const std::string& asymID() const { return mAsymID; } const std::string& asymID() const { return mAsymID; }
const std::string& seqID() const { return mSeqID; } int seqID() const { return mSeqID; }
const std::string& altID() const { return mAltID; } const std::string& altID() const { return mAltID; }
protected: protected:
const Structure* mStructure; const Structure* mStructure;
std::string mCompoundID, mAsymID, mSeqID, mAltID; std::string mCompoundID, mAsymID, mAltID;
int mSeqID;
mutable AtomView mAtoms; mutable AtomView mAtoms;
}; };
...@@ -181,7 +182,7 @@ class Monomer : public Residue ...@@ -181,7 +182,7 @@ class Monomer : public Residue
Monomer& operator=(const Monomer& rhs); Monomer& operator=(const Monomer& rhs);
Monomer(Polymer& polymer); Monomer(Polymer& polymer);
Monomer(Polymer& polymer, uint32 seqID, Monomer(Polymer& polymer, int seqID,
const std::string& compoundID, const std::string& altID); const std::string& compoundID, const std::string& altID);
private: private:
......
...@@ -164,7 +164,8 @@ struct AtomImpl ...@@ -164,7 +164,8 @@ struct AtomImpl
{ {
// Prefetch some data // Prefetch some data
string symbol; string symbol;
cif::tie(symbol) = mRow.get("type_symbol"); cif::tie(symbol, mAtomID, mCompID, mAsymID, mSeqID, mAltID) =
mRow.get("type_symbol", "label_atom_id", "label_comp_id", "label_asym_id", "label_seq_id", "label_alt_id");
mType = AtomTypeTraits(symbol).type(); mType = AtomTypeTraits(symbol).type();
...@@ -264,20 +265,39 @@ struct AtomImpl ...@@ -264,20 +265,39 @@ struct AtomImpl
return mRadius; return mRadius;
} }
const string& property(const string& name)
{
static string kEmptyString;
auto i = mCachedProperties.find(name);
if (i == mCachedProperties.end())
{
auto v = mRow[name];
if (v.empty())
return kEmptyString;
return mCachedProperties[name] = v.as<string>();
}
else
return i->second;
}
const File& mFile; const File& mFile;
string mId; string mId;
AtomType mType;
string mAtomID;
string mCompID;
string mAsymID;
int mSeqID;
string mAltID;
Point mLocation;
int mRefcount; int mRefcount;
cif::Row mRow; cif::Row mRow;
const Compound* mCompound; const Compound* mCompound;
Point mLocation;
AtomType mType;
float mRadius = nan("4"); float mRadius = nan("4");
map<string,string> mCachedProperties;
// const entity& mEntity;
// std::string mAsymId;
// std::string mAtomId;
// Point mLoc;
// propertyList mProperties;
}; };
Atom::Atom(const File& f, const string& id) Atom::Atom(const File& f, const string& id)
...@@ -317,19 +337,19 @@ Atom& Atom::operator=(const Atom& rhs) ...@@ -317,19 +337,19 @@ Atom& Atom::operator=(const Atom& rhs)
template<> template<>
string Atom::property<string>(const std::string& name) const string Atom::property<string>(const std::string& name) const
{ {
return mImpl->mRow[name].as<string>(); return mImpl->property(name);
} }
template<> template<>
int Atom::property<int>(const std::string& name) const int Atom::property<int>(const std::string& name) const
{ {
return mImpl->mRow[name].as<int>(); return stoi(mImpl->property(name));
} }
template<> template<>
float Atom::property<float>(const std::string& name) const float Atom::property<float>(const std::string& name) const
{ {
return mImpl->mRow[name].as<float>(); return stof(mImpl->property(name));
} }
string Atom::id() const string Atom::id() const
...@@ -351,10 +371,10 @@ float Atom::uIso() const ...@@ -351,10 +371,10 @@ float Atom::uIso() const
{ {
float result; float result;
if (not mImpl->mRow["U_iso_or_equiv"].empty()) if (not property<string>("U_iso_or_equiv").empty())
result = mImpl->mRow["U_iso_or_equiv"].as<float>(); result = property<float>("U_iso_or_equiv");
else if (not mImpl->mRow["B_iso_or_equiv"].empty()) else if (not property<string>("B_iso_or_equiv").empty())
result = mImpl->mRow["B_iso_or_equiv"].as<float>() / (8 * kPI * kPI); result = property<float>("B_iso_or_equiv") / (8 * kPI * kPI);
else else
throw runtime_error("Missing B_iso or U_iso"); throw runtime_error("Missing B_iso or U_iso");
...@@ -368,22 +388,22 @@ float Atom::occupancy() const ...@@ -368,22 +388,22 @@ float Atom::occupancy() const
string Atom::labelAtomId() const string Atom::labelAtomId() const
{ {
return property<string>("label_atom_id"); return mImpl->mAtomID;
} }
string Atom::labelCompId() const string Atom::labelCompId() const
{ {
return property<string>("label_comp_id"); return mImpl->mCompID;
} }
string Atom::labelAsymId() const string Atom::labelAsymId() const
{ {
return property<string>("label_asym_id"); return mImpl->mAsymID;
} }
int Atom::labelSeqId() const int Atom::labelSeqId() const
{ {
return property<int>("label_seq_id"); return mImpl->mSeqID;
} }
string Atom::authAsymId() const string Atom::authAsymId() const
...@@ -453,7 +473,7 @@ float Atom::radius() const ...@@ -453,7 +473,7 @@ float Atom::radius() const
Residue::Residue(const Residue& rhs) Residue::Residue(const Residue& rhs)
: mStructure(rhs.mStructure) : mStructure(rhs.mStructure)
, mCompoundID(rhs.mCompoundID), mAsymID(rhs.mAsymID), mSeqID(rhs.mSeqID), mAltID(rhs.mAltID) , mCompoundID(rhs.mCompoundID), mAsymID(rhs.mAsymID), mAltID(rhs.mAltID), mSeqID(rhs.mSeqID)
{ {
} }
...@@ -466,6 +486,8 @@ Residue& Residue::operator=(const Residue& rhs) ...@@ -466,6 +486,8 @@ Residue& Residue::operator=(const Residue& rhs)
mAsymID = rhs.mAsymID; mAsymID = rhs.mAsymID;
mSeqID = rhs.mSeqID; mSeqID = rhs.mSeqID;
mAltID = rhs.mAltID; mAltID = rhs.mAltID;
mAtoms = rhs.mAtoms;
} }
return *this; return *this;
...@@ -488,18 +510,40 @@ AtomView Residue::atoms() const ...@@ -488,18 +510,40 @@ AtomView Residue::atoms() const
{ {
for (auto& a: mStructure->atoms()) for (auto& a: mStructure->atoms())
{ {
if (a.property<string>("label_asym_id") != mAsymID or if (mSeqID > 0 and a.labelSeqId() != mSeqID)
a.property<string>("label_comp_id") != mCompoundID)
continue;
if (not mSeqID.empty() and a.property<string>("label_seq_id") != mSeqID)
continue; continue;
if (a.labelAsymId() != mAsymID or
a.labelCompId() != mCompoundID)
continue;
if (not mAltID.empty() and a.property<string>("label_alt_id") != mAltID) if (not mAltID.empty() and a.property<string>("label_alt_id") != mAltID)
continue; continue;
mAtoms.push_back(a); mAtoms.push_back(a);
} }
//
// auto& atomSites = mStructure->category("atom_site");
//
// auto query = cif::Key("label_asym_id") == mAsymID and cif::Key("label_comp_id") == mCompoundID;
//
// if (not mSeqID.empty())
// query = move(query) and cif::Key("label_seq_id") == mSeqID;
//
// if (not mAltID.empty())
// query = move(query) and (cif::Key("label_alt_id") == cif::Empty() or cif::Key("label_alt_id") == mAltID);
//
// auto cifAtoms = atomSites.find(move(query));
//
// set<string> ids;
// for (auto cifAtom: cifAtoms)
// ids.insert(cifAtom["id"].as<string>());
//
// for (auto& a: mStructure->atoms())
// {
// if (ids.count(a.id()))
// mAtoms.push_back(a);
// }
} }
return mAtoms; return mAtoms;
...@@ -525,7 +569,7 @@ Atom Residue::atomByID(const string& atomID) const ...@@ -525,7 +569,7 @@ Atom Residue::atomByID(const string& atomID) const
return a; return a;
} }
throw runtime_error("Atom with atom_id " + atomID + " not found in residue " + mAsymID + ':' + mSeqID); throw runtime_error("Atom with atom_id " + atomID + " not found in residue " + mAsymID + ':' + to_string(mSeqID));
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
...@@ -554,8 +598,8 @@ Monomer::Monomer(Polymer& polymer) ...@@ -554,8 +598,8 @@ Monomer::Monomer(Polymer& polymer)
} }
Monomer::Monomer(Polymer& polymer, uint32 seqID, const string& compoundID, const string& altID) Monomer::Monomer(Polymer& polymer, int seqID, const string& compoundID, const string& altID)
: Residue(*polymer.structure(), compoundID, polymer.asymID(), to_string(seqID), altID) : Residue(*polymer.structure(), compoundID, polymer.asymID(), seqID, altID)
, mPolymer(&polymer) , mPolymer(&polymer)
{ {
} }
......
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