-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathStructureList.cpp
128 lines (93 loc) · 2.99 KB
/
StructureList.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <map>
#include <iostream>
#include <fstream>
#include "Structure.h"
#include "StructureList.h"
#include "CrystalFpExceptions.h"
using namespace cfp_internal;
StructureList::StructureList()
{
}
StructureList::~StructureList()
{
clear();
}
void StructureList::addStructure(Structure& aElement)
{
mStructures.insert(std::pair<int,Structure>(aElement.mStepId, aElement));
}
void StructureList::clear(void)
{
mStructures.clear();
mStructuresDirectory.clear();
}
void StructureList::filterOnEnergy(float aEnergyThreshold)
{
std::map<int,Structure>::iterator im;
mStructuresDirectory.clear();
for(im=mStructures.begin(); im != mStructures.end(); ++im)
{
if(!im->second.mHasEnergy || im->second.mEnergyPerAtom <= aEnergyThreshold) mStructuresDirectory.push_back(im);
}
}
void StructureList::selectAll(void)
{
std::map<int,Structure>::iterator im;
mStructuresDirectory.clear();
for(im=mStructures.begin(); im != mStructures.end(); ++im) mStructuresDirectory.push_back(im);
}
void StructureList::selectNone(void)
{
mStructuresDirectory.clear();
}
Structure& StructureList::getStructureBySequence(int aSequence)
{
std::map<int,Structure>::iterator im;
if((im = mStructures.find(aSequence)) == mStructures.end()) throw cfp::CrystalFpFatal("Sequence not found");
return im->second;
}
Structure& StructureList::getStructureByIndex(size_t aIdx) const
{
if(aIdx >= mStructuresDirectory.size()) throw cfp::CrystalFpFatal("Index out of range");
return mStructuresDirectory[aIdx]->second;
}
void StructureList::selectAllIncluded(const std::vector<bool>& aIncluded)
{
std::vector<std::map<int, Structure>::iterator> temp_structures_directory;
for(unsigned int idx=0; idx < mStructuresDirectory.size(); ++idx)
{
if(aIncluded[idx]) temp_structures_directory.push_back(mStructuresDirectory[idx]);
}
mStructuresDirectory = temp_structures_directory;
}
void StructureList::serialize(std::ofstream& aStream) const
{
// Write number of structures
unsigned int ns = static_cast<unsigned int>(mStructuresDirectory.size());
aStream.write((char *)&ns, sizeof(unsigned int));
// Write the included (or selected) structures
unsigned int idx;
for(idx=0; idx < ns; ++idx)
{
mStructuresDirectory[idx]->second.serialize(aStream);
}
}
void StructureList::unserialize(std::ifstream& aStream, bool aAppend, int aStepOffset)
{
// Read the number of structures
unsigned int ns;
aStream.read((char *)&ns, sizeof(unsigned int));
// Recreate the structures list (empting it if no append required)
if(!aAppend) mStructures.clear();
unsigned int idx;
for(idx=0; idx < ns; ++idx)
{
Structure s;
s.unserialize(aStream);
if(aAppend) s.mStepId += aStepOffset;
mStructures.insert(std::pair<int,Structure>(s.mStepId, s));
}
mStructuresDirectory.clear();
std::map<int,Structure>::iterator im;
for(im=mStructures.begin(); im != mStructures.end(); ++im) mStructuresDirectory.push_back(im);
}