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
const Structure& structure;
size_t dim;
std::unordered_map<std::string,size_t> index;
std::map<size_t,std::string> rIndex;
struct key_hash
{
......
......@@ -25,26 +25,8 @@
// - 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
{
......@@ -183,18 +165,18 @@ typedef std::vector<Atom> AtomView;
class Residue
{
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& operator=(const Residue& rhs) = delete;
Residue(Residue&& rhs);
Residue& operator=(Residue&& rhs);
Residue(const Structure& structure, const std::string& compoundID,
const std::string& asymID, int seqID = 0)
: mStructure(&structure), mCompoundID(compoundID)
, mAsymID(asymID), mSeqID(seqID) {}
virtual ~Residue() {}
virtual ~Residue();
const Compound& compound() const;
const AtomView& atoms() const;
......@@ -285,14 +267,13 @@ class Monomer : public Residue
class Polymer : public std::vector<Monomer>
{
public:
// Polymer(const Structure& s, const std::string& asymID);
Polymer(const Structure& s, const std::string& entityID, const std::string& asymID);
Polymer(const Polymer&) = delete;
Polymer& operator=(const Polymer&) = delete;
Polymer(Polymer&& rhs);
Polymer& operator=(Polymer&& rhs);
// Polymer(Polymer&& rhs) = delete;
// Polymer& operator=(Polymer&& rhs) = de;
Monomer& getBySeqID(int seqID);
const Monomer& getBySeqID(int seqID) const;
......@@ -360,7 +341,7 @@ class Structure
const AtomView& atoms() const;
AtomView waters() const;
const std::vector<Polymer>& polymers() const;
const std::list<Polymer>& polymers() const;
std::vector<Residue> nonPolymers() const;
......@@ -412,7 +393,7 @@ class Structure
File& mFile;
uint32 mModelNr;
AtomView mAtoms;
std::vector<Polymer> mPolymers;
std::list<Polymer> mPolymers;
// std::vector<Residue*> mResidues;
};
......
......@@ -58,7 +58,7 @@ DistanceMap::DistanceMap(const Structure& p, const clipper::Spacegroup& spacegro
{
const float kMaxDistance = 5, kMaxDistanceSQ = kMaxDistance * kMaxDistance;
auto atoms = p.atoms();
auto& atoms = p.atoms();
dim = atoms.size();
vector<clipper::Coord_orth> locations(dim);
......@@ -71,6 +71,7 @@ DistanceMap::DistanceMap(const Structure& p, const clipper::Spacegroup& spacegro
{
size_t ix = index.size();
index[atom.id()] = ix;
rIndex[ix] = atom.id();
locations[ix] = atom.location();
......@@ -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");
}
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)
continue;
auto ii =
ixa < ixb ?
dist.find(make_tuple(ixa, ixb)) :
dist.find(make_tuple(ixb, ixa));
if (ii == dist.end())
if (dixa != ixa and dixb != ixa)
continue;
float distance;
size_t rti;
tie(distance, rti) = ii->second;
tie(distance, rti) = di.second;
if (distance > maxDistance)
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)));
}
......
......@@ -773,7 +773,7 @@ struct DSSPImpl
DSSPImpl(const Structure& s);
const Structure& mStructure;
const vector<Polymer>& mPolymers;
const list<Polymer>& mPolymers;
vector<Res> mResidues;
};
......
......@@ -591,13 +591,13 @@ Residue::Residue(Residue&& rhs)
: mStructure(rhs.mStructure), mCompoundID(move(rhs.mCompoundID)), mAsymID(move(rhs.mAsymID))
, mSeqID(rhs.mSeqID), mAtoms(move(rhs.mAtoms))
{
cerr << "move constructor residue" << endl;
//cerr << "move constructor residue" << endl;
rhs.mStructure = nullptr;
}
Residue& Residue::operator=(Residue&& rhs)
{
cerr << "move assignment residue" << endl;
//cerr << "move assignment residue" << endl;
mStructure = rhs.mStructure; rhs.mStructure = nullptr;
mCompoundID = move(rhs.mCompoundID);
mAsymID = move(rhs.mAsymID);
......@@ -607,6 +607,11 @@ cerr << "move assignment residue" << endl;
return *this;
}
Residue::~Residue()
{
//cerr << "~Residue" << endl;
}
string Residue::authInsCode() const
{
assert(mStructure);
......@@ -1036,23 +1041,23 @@ bool Monomer::isCis(const mmcif::Monomer& a, const mmcif::Monomer& b)
//
//}
Polymer::Polymer(Polymer&& rhs)
: vector<Monomer>(move(rhs))
, mStructure(rhs.mStructure)
, mEntityID(move(rhs.mEntityID)), mAsymID(move(rhs.mAsymID)), mPolySeq(move(rhs.mPolySeq))
{
rhs.mStructure = nullptr;
}
Polymer& Polymer::operator=(Polymer&& rhs)
{
vector<Monomer>::operator=(move(rhs));
mStructure = rhs.mStructure; rhs.mStructure = nullptr;
mEntityID = move(rhs.mEntityID);
mAsymID = move(rhs.mAsymID);
mPolySeq = move(rhs.mPolySeq);
return *this;
}
//Polymer::Polymer(Polymer&& rhs)
// : vector<Monomer>(move(rhs))
// , mStructure(rhs.mStructure)
// , mEntityID(move(rhs.mEntityID)), mAsymID(move(rhs.mAsymID)), mPolySeq(move(rhs.mPolySeq))
//{
// rhs.mStructure = nullptr;
//}
//
//Polymer& Polymer::operator=(Polymer&& rhs)
//{
// vector<Monomer>::operator=(move(rhs));
// mStructure = rhs.mStructure; rhs.mStructure = nullptr;
// mEntityID = move(rhs.mEntityID);
// mAsymID = move(rhs.mAsymID);
// mPolySeq = move(rhs.mPolySeq);
// return *this;
//}
Polymer::Polymer(const Structure& s, const string& entityID, const string& 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
{
map<uint32,uint32> ix;
reserve(mPolySeq.size());
for (auto r: mPolySeq)
{
int seqID;
......@@ -1314,7 +1321,7 @@ AtomView Structure::waters() const
return result;
}
const vector<Polymer>& Structure::polymers() const
const list<Polymer>& Structure::polymers() const
{
// 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