Commit bc50f868 by maarten

some optimisations

git-svn-id: svn+ssh://gitlab/srv/svn-repos/pdb-redo/trunk@343 a1961a4f-ab94-4bcc-80e8-33b5a54de466
parent 909a33c0
...@@ -34,6 +34,7 @@ class DistanceMap ...@@ -34,6 +34,7 @@ class DistanceMap
const Structure& structure; const Structure& structure;
size_t dim; size_t dim;
std::unordered_map<std::string,size_t> index; std::unordered_map<std::string,size_t> index;
std::map<size_t,std::string> rIndex;
struct key_hash struct key_hash
{ {
......
...@@ -25,26 +25,8 @@ ...@@ -25,26 +25,8 @@
// - Add alternate Residue // - Add alternate Residue
- -
Other important design principles:
- all objects here are references to the actual data. Not models of
the data itself. That means that if you copy an atom, you copy the
reference to an atom in the structure. You're not creating a new
atom. This may sound obvious, but it is not if you are used to
copy semantics in the C++ world.
*/ */
//// forward declaration
//namespace cif
//{
// class Category;
// class Datablock;
// class File;
// class RowSet;
//};
namespace mmcif namespace mmcif
{ {
...@@ -183,18 +165,18 @@ typedef std::vector<Atom> AtomView; ...@@ -183,18 +165,18 @@ typedef std::vector<Atom> AtomView;
class Residue class Residue
{ {
public: public:
Residue(const Structure& structure, const std::string& compoundID,
const std::string& asymID, int seqID = 0)
: mStructure(&structure), mCompoundID(compoundID)
, mAsymID(asymID), mSeqID(seqID) {}
Residue(const Residue& rhs) = delete; Residue(const Residue& rhs) = delete;
Residue& operator=(const Residue& rhs) = delete; Residue& operator=(const Residue& rhs) = delete;
Residue(Residue&& rhs); Residue(Residue&& rhs);
Residue& operator=(Residue&& rhs); Residue& operator=(Residue&& rhs);
Residue(const Structure& structure, const std::string& compoundID, virtual ~Residue();
const std::string& asymID, int seqID = 0)
: mStructure(&structure), mCompoundID(compoundID)
, mAsymID(asymID), mSeqID(seqID) {}
virtual ~Residue() {}
const Compound& compound() const; const Compound& compound() const;
const AtomView& atoms() const; const AtomView& atoms() const;
...@@ -285,14 +267,13 @@ class Monomer : public Residue ...@@ -285,14 +267,13 @@ class Monomer : public Residue
class Polymer : public std::vector<Monomer> class Polymer : public std::vector<Monomer>
{ {
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&) = delete; Polymer(const Polymer&) = delete;
Polymer& operator=(const Polymer&) = delete; Polymer& operator=(const Polymer&) = delete;
Polymer(Polymer&& rhs); // Polymer(Polymer&& rhs) = delete;
Polymer& operator=(Polymer&& rhs); // Polymer& operator=(Polymer&& rhs) = de;
Monomer& getBySeqID(int seqID); Monomer& getBySeqID(int seqID);
const Monomer& getBySeqID(int seqID) const; const Monomer& getBySeqID(int seqID) const;
...@@ -360,7 +341,7 @@ class Structure ...@@ -360,7 +341,7 @@ class Structure
const AtomView& atoms() const; const AtomView& atoms() const;
AtomView waters() const; AtomView waters() const;
const std::vector<Polymer>& polymers() const; const std::list<Polymer>& polymers() const;
std::vector<Residue> nonPolymers() const; std::vector<Residue> nonPolymers() const;
...@@ -412,7 +393,7 @@ class Structure ...@@ -412,7 +393,7 @@ class Structure
File& mFile; File& mFile;
uint32 mModelNr; uint32 mModelNr;
AtomView mAtoms; AtomView mAtoms;
std::vector<Polymer> mPolymers; std::list<Polymer> mPolymers;
// std::vector<Residue*> mResidues; // std::vector<Residue*> mResidues;
}; };
......
...@@ -58,7 +58,7 @@ DistanceMap::DistanceMap(const Structure& p, const clipper::Spacegroup& spacegro ...@@ -58,7 +58,7 @@ DistanceMap::DistanceMap(const Structure& p, const clipper::Spacegroup& spacegro
{ {
const float kMaxDistance = 5, kMaxDistanceSQ = kMaxDistance * kMaxDistance; const float kMaxDistance = 5, kMaxDistanceSQ = kMaxDistance * kMaxDistance;
auto atoms = p.atoms(); auto& atoms = p.atoms();
dim = atoms.size(); dim = atoms.size();
vector<clipper::Coord_orth> locations(dim); vector<clipper::Coord_orth> locations(dim);
...@@ -71,6 +71,7 @@ DistanceMap::DistanceMap(const Structure& p, const clipper::Spacegroup& spacegro ...@@ -71,6 +71,7 @@ DistanceMap::DistanceMap(const Structure& p, const clipper::Spacegroup& spacegro
{ {
size_t ix = index.size(); size_t ix = index.size();
index[atom.id()] = ix; index[atom.id()] = ix;
rIndex[ix] = atom.id();
locations[ix] = atom.location(); locations[ix] = atom.location();
...@@ -281,29 +282,26 @@ vector<Atom> DistanceMap::near(const Atom& a, float maxDistance) const ...@@ -281,29 +282,26 @@ vector<Atom> DistanceMap::near(const Atom& a, float maxDistance) const
throw runtime_error("atom " + a.id() + " not found in distance map"); throw runtime_error("atom " + a.id() + " not found in distance map");
} }
for (auto& i: index) for (auto& di: dist)
{ {
size_t ixb = i.second; size_t dixa, dixb;
tie(dixa, dixb) = di.first;
if (ixb == ixa) if (dixa != ixa and dixb != ixa)
continue;
auto ii =
ixa < ixb ?
dist.find(make_tuple(ixa, ixb)) :
dist.find(make_tuple(ixb, ixa));
if (ii == dist.end())
continue; continue;
float distance; float distance;
size_t rti; size_t rti;
tie(distance, rti) = ii->second; tie(distance, rti) = di.second;
if (distance > maxDistance) if (distance > maxDistance)
continue; continue;
Atom a = structure.getAtomById(i.first); size_t ixb = dixa;
if (ixb == ixa)
ixb = dixb;
Atom a = structure.getAtomById(rIndex.at(ixb));
result.push_back(a.symmetryCopy(mD, mRtOrth.at(rti))); result.push_back(a.symmetryCopy(mD, mRtOrth.at(rti)));
} }
......
...@@ -773,7 +773,7 @@ struct DSSPImpl ...@@ -773,7 +773,7 @@ struct DSSPImpl
DSSPImpl(const Structure& s); DSSPImpl(const Structure& s);
const Structure& mStructure; const Structure& mStructure;
const vector<Polymer>& mPolymers; const list<Polymer>& mPolymers;
vector<Res> mResidues; vector<Res> mResidues;
}; };
......
...@@ -591,13 +591,13 @@ Residue::Residue(Residue&& rhs) ...@@ -591,13 +591,13 @@ Residue::Residue(Residue&& rhs)
: mStructure(rhs.mStructure), mCompoundID(move(rhs.mCompoundID)), mAsymID(move(rhs.mAsymID)) : mStructure(rhs.mStructure), mCompoundID(move(rhs.mCompoundID)), mAsymID(move(rhs.mAsymID))
, mSeqID(rhs.mSeqID), mAtoms(move(rhs.mAtoms)) , mSeqID(rhs.mSeqID), mAtoms(move(rhs.mAtoms))
{ {
cerr << "move constructor residue" << endl; //cerr << "move constructor residue" << endl;
rhs.mStructure = nullptr; rhs.mStructure = nullptr;
} }
Residue& Residue::operator=(Residue&& rhs) Residue& Residue::operator=(Residue&& rhs)
{ {
cerr << "move assignment residue" << endl; //cerr << "move assignment residue" << endl;
mStructure = rhs.mStructure; rhs.mStructure = nullptr; mStructure = rhs.mStructure; rhs.mStructure = nullptr;
mCompoundID = move(rhs.mCompoundID); mCompoundID = move(rhs.mCompoundID);
mAsymID = move(rhs.mAsymID); mAsymID = move(rhs.mAsymID);
...@@ -607,6 +607,11 @@ cerr << "move assignment residue" << endl; ...@@ -607,6 +607,11 @@ cerr << "move assignment residue" << endl;
return *this; return *this;
} }
Residue::~Residue()
{
//cerr << "~Residue" << endl;
}
string Residue::authInsCode() const string Residue::authInsCode() const
{ {
assert(mStructure); assert(mStructure);
...@@ -1036,23 +1041,23 @@ bool Monomer::isCis(const mmcif::Monomer& a, const mmcif::Monomer& b) ...@@ -1036,23 +1041,23 @@ bool Monomer::isCis(const mmcif::Monomer& a, const mmcif::Monomer& b)
// //
//} //}
Polymer::Polymer(Polymer&& rhs) //Polymer::Polymer(Polymer&& rhs)
: vector<Monomer>(move(rhs)) // : vector<Monomer>(move(rhs))
, mStructure(rhs.mStructure) // , mStructure(rhs.mStructure)
, mEntityID(move(rhs.mEntityID)), mAsymID(move(rhs.mAsymID)), mPolySeq(move(rhs.mPolySeq)) // , mEntityID(move(rhs.mEntityID)), mAsymID(move(rhs.mAsymID)), mPolySeq(move(rhs.mPolySeq))
{ //{
rhs.mStructure = nullptr; // rhs.mStructure = nullptr;
} //}
//
Polymer& Polymer::operator=(Polymer&& rhs) //Polymer& Polymer::operator=(Polymer&& rhs)
{ //{
vector<Monomer>::operator=(move(rhs)); // vector<Monomer>::operator=(move(rhs));
mStructure = rhs.mStructure; rhs.mStructure = nullptr; // mStructure = rhs.mStructure; rhs.mStructure = nullptr;
mEntityID = move(rhs.mEntityID); // mEntityID = move(rhs.mEntityID);
mAsymID = move(rhs.mAsymID); // mAsymID = move(rhs.mAsymID);
mPolySeq = move(rhs.mPolySeq); // mPolySeq = move(rhs.mPolySeq);
return *this; // return *this;
} //}
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)
...@@ -1060,6 +1065,8 @@ Polymer::Polymer(const Structure& s, const string& entityID, const string& asymI ...@@ -1060,6 +1065,8 @@ Polymer::Polymer(const Structure& s, const string& entityID, const string& asymI
{ {
map<uint32,uint32> ix; map<uint32,uint32> ix;
reserve(mPolySeq.size());
for (auto r: mPolySeq) for (auto r: mPolySeq)
{ {
int seqID; int seqID;
...@@ -1314,7 +1321,7 @@ AtomView Structure::waters() const ...@@ -1314,7 +1321,7 @@ AtomView Structure::waters() const
return result; return result;
} }
const vector<Polymer>& Structure::polymers() const const list<Polymer>& Structure::polymers() const
{ {
// vector<Polymer> result; // vector<Polymer> result;
// //
......
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