MMTF-C++
The C++ language MMTF libraries
encoder.hpp
Go to the documentation of this file.
1 // *************************************************************************
2 //
3 // Licensed under the MIT License (see accompanying LICENSE file).
4 //
5 // The author of this code is: Daniel Farrell
6 //
7 // Based on mmtf_python, adapted to c++ standards 2018
8 //
9 // *************************************************************************
10 
11 
12 #ifndef MMTF_ENCODER_H
13 #define MMTF_ENCODER_H
14 
15 #include "structure_data.hpp"
16 #include "errors.hpp"
17 #include "msgpack_encoders.hpp"
18 #include "binary_encoder.hpp"
19 #include <string>
20 #include <fstream>
21 
22 namespace mmtf {
23 
36 inline void encodeToFile(const StructureData& data,
37  const std::string& filename, int32_t coord_divider = 1000,
38  int32_t occupancy_b_factor_divider = 100,
39  int32_t chain_name_max_length = 4);
40 
50 template <typename Stream>
51 inline void encodeToStream(const StructureData& data, Stream& stream,
52  int32_t coord_divider = 1000, int32_t occupancy_b_factor_divider = 100,
53  int32_t chain_name_max_length = 4);
54 
64 inline std::map<std::string, msgpack::object>
65 encodeToMap(const StructureData& data, msgpack::zone& m_zone,
66  int32_t coord_divider = 1000, int32_t occupancy_b_factor_divider = 100,
67  int32_t chain_name_max_length = 4);
68 
69 // *************************************************************************
70 // IMPLEMENTATION
71 // *************************************************************************
72 inline void encodeToFile(const StructureData& data,
73  const std::string& filename, int32_t coord_divider,
74  int32_t occupancy_b_factor_divider, int32_t chain_name_max_length) {
75  // encode to a file
76  std::ofstream ofs(filename.c_str(), std::ios::binary | std::ios::out );
77  if ( !ofs ) {
78  throw EncodeError("Could not open >" + filename + "< for writing, exiting.");
79  }
80  encodeToStream(data, ofs, coord_divider,
81  occupancy_b_factor_divider, chain_name_max_length);
82 }
83 
84 template <typename Stream>
85 inline void encodeToStream(const StructureData& data, Stream& stream,
86  int32_t coord_divider, int32_t occupancy_b_factor_divider,
87  int32_t chain_name_max_length) {
88  msgpack::pack(stream, encodeToMap(data, data.msgpack_zone, coord_divider,
89  occupancy_b_factor_divider, chain_name_max_length));
90 }
91 
92 inline std::map<std::string, msgpack::object>
93 encodeToMap(const StructureData& data, msgpack::zone& m_zone,
94  int32_t coord_divider, int32_t occupancy_b_factor_divider,
95  int32_t chain_name_max_length) {
96  if (!data.hasConsistentData(true, chain_name_max_length)) {
97  throw mmtf::EncodeError("mmtf EncoderError, StructureData does not have Consistent data... exiting!");
98  }
99 
100 
101  std::map<std::string, msgpack::object> data_map;
102  // std::string
103  data_map["mmtfVersion"] = msgpack::object(data.mmtfVersion, m_zone);
104  data_map["mmtfProducer"] = msgpack::object(data.mmtfProducer, m_zone);
105  if (!mmtf::isDefaultValue(data.spaceGroup)) {
106  data_map["spaceGroup"] = msgpack::object(data.spaceGroup, m_zone);
107  }
108  if (!mmtf::isDefaultValue(data.structureId)) {
109  data_map["structureId"] = msgpack::object(data.structureId, m_zone);
110  }
111  if (!mmtf::isDefaultValue(data.title)) {
112  data_map["title"] = msgpack::object(data.title, m_zone);
113  }
115  data_map["depositionDate"] = msgpack::object(data.depositionDate, m_zone);
116  }
117  if (!mmtf::isDefaultValue(data.releaseDate)) {
118  data_map["releaseDate"] = msgpack::object(data.releaseDate, m_zone);
119  }
120  // std::vector<std::string>
121  data_map["chainIdList"] = msgpack::object(mmtf::encodeStringVector(data.chainIdList, chain_name_max_length), m_zone);
122  if (!mmtf::isDefaultValue(data.chainNameList)) {
123  data_map["chainNameList"] = msgpack::object(mmtf::encodeStringVector(data.chainNameList, chain_name_max_length), m_zone);
124  }
126  data_map["experimentalMethods"] =
127  msgpack::object(data.experimentalMethods, m_zone);
128  }
129  // std::vector<char>
130  if (!mmtf::isDefaultValue(data.altLocList)) {
131  data_map["altLocList"] =
132  msgpack::object(mmtf::encodeRunLengthChar(data.altLocList), m_zone);
133  }
134  if (!mmtf::isDefaultValue(data.insCodeList)) {
135  data_map["insCodeList"] = msgpack::object(mmtf::encodeRunLengthChar(data.insCodeList), m_zone);
136  }
137  // std::vector<int8_t>
138  if (!mmtf::isDefaultValue(data.bondOrderList)) {
139  data_map["bondOrderList"] =
140  msgpack::object(mmtf::encodeInt8ToByte(data.bondOrderList), m_zone);
141  }
142  // std::vector<int8_t>
144  data_map["bondResonanceList"] =
145  msgpack::object(mmtf::encodeRunLengthInt8(data.bondResonanceList), m_zone);
146  }
147  if (!mmtf::isDefaultValue(data.secStructList)) {
148  data_map["secStructList"] =
149  msgpack::object(mmtf::encodeInt8ToByte(data.secStructList), m_zone);
150  }
151  // int32_t
152  data_map["numBonds"] = msgpack::object(data.numBonds, m_zone);
153  data_map["numAtoms"] = msgpack::object(data.numAtoms, m_zone);
154  data_map["numGroups"] = msgpack::object(data.numGroups, m_zone);
155  data_map["numChains"] = msgpack::object(data.numChains, m_zone);
156  data_map["numModels"] = msgpack::object(data.numModels, m_zone);
157  // std::vector<int32_t>
158  data_map["groupTypeList"] = msgpack::object(mmtf::encodeFourByteInt(data.groupTypeList), m_zone);
159  data_map["groupIdList"] = msgpack::object(mmtf::encodeRunLengthDeltaInt(data.groupIdList), m_zone);
160  data_map["groupsPerChain"] = msgpack::object(data.groupsPerChain, m_zone);
161  data_map["chainsPerModel"] = msgpack::object(data.chainsPerModel, m_zone);
162  if (!mmtf::isDefaultValue(data.bondAtomList)) {
163  data_map["bondAtomList"] = msgpack::object(mmtf::encodeFourByteInt(data.bondAtomList), m_zone);
164  }
165  if (!mmtf::isDefaultValue(data.atomIdList)) {
166  data_map["atomIdList"] = msgpack::object(mmtf::encodeRunLengthDeltaInt(data.atomIdList), m_zone);
167  }
169  data_map["sequenceIndexList"] = msgpack::object(mmtf::encodeRunLengthDeltaInt(data.sequenceIndexList), m_zone);
170  }
171  // float
172  if (!mmtf::isDefaultValue(data.resolution)) {
173  data_map["resolution"] = msgpack::object(data.resolution, m_zone);
174  }
175  if (!mmtf::isDefaultValue(data.rFree)) {
176  data_map["rFree"] = msgpack::object(data.rFree, m_zone);
177  }
178  if (!mmtf::isDefaultValue(data.rWork)) {
179  data_map["rWork"] = msgpack::object(data.rWork, m_zone);
180  }
181  // std::vector<float>
182  data_map["xCoordList"] = msgpack::object(mmtf::encodeDeltaRecursiveFloat(data.xCoordList, coord_divider), m_zone);
183  data_map["yCoordList"] = msgpack::object(mmtf::encodeDeltaRecursiveFloat(data.yCoordList, coord_divider), m_zone);
184  data_map["zCoordList"] = msgpack::object(mmtf::encodeDeltaRecursiveFloat(data.zCoordList, coord_divider), m_zone);
185  if (!mmtf::isDefaultValue(data.bFactorList)) {
186  data_map["bFactorList"] = msgpack::object(mmtf::encodeDeltaRecursiveFloat(data.bFactorList, occupancy_b_factor_divider), m_zone);
187  }
188  if (!mmtf::isDefaultValue(data.occupancyList)) {
189  data_map["occupancyList"] = msgpack::object(mmtf::encodeRunLengthFloat(data.occupancyList, occupancy_b_factor_divider), m_zone);
190  }
191  if (!mmtf::isDefaultValue(data.unitCell)) {
192  data_map["unitCell"] = msgpack::object(data.unitCell, m_zone);
193  }
194  // std::vector<GroupType>
195  data_map["groupList"] = msgpack::object(data.groupList, m_zone);
196  // std::vector<BioAssembly>
198  data_map["bioAssemblyList"] = msgpack::object(data.bioAssemblyList, m_zone);
199  }
200  // std::vector<Entity>
201  if (!mmtf::isDefaultValue(data.entityList)) {
202  data_map["entityList"] = msgpack::object(data.entityList, m_zone);
203  }
204  // std::vector<std::vector<float>>
206  data_map["ncsOperatorList"] = msgpack::object(data.ncsOperatorList, m_zone);
207  }
208  // extraProperties
210  data_map["bondProperties"] = msgpack::object(data.bondProperties, m_zone);
211  }
213  data_map["atomProperties"] = msgpack::object(data.atomProperties, m_zone);
214  }
216  data_map["groupProperties"] = msgpack::object(data.groupProperties, m_zone);
217  }
219  data_map["chainProperties"] = msgpack::object(data.chainProperties, m_zone);
220  }
222  data_map["modelProperties"] = msgpack::object(data.modelProperties, m_zone);
223  }
225  data_map["extraProperties"] = msgpack::object(data.extraProperties, m_zone);
226  }
227  return data_map;
228 }
229 
230 } // mmtf namespace
231 
232 #endif
std::map< std::string, msgpack::object > encodeToMap(const StructureData &data, msgpack::zone &m_zone, int32_t coord_divider=1000, int32_t occupancy_b_factor_divider=100, int32_t chain_name_max_length=4)
Encode an MMTF data structure into a map of msgpack objects.
Definition: encoder.hpp:93
std::vector< int8_t > bondOrderList
Definition: structure_data.hpp:180
std::vector< int8_t > secStructList
Definition: structure_data.hpp:191
std::map< std::string, msgpack::object > bondProperties
Definition: structure_data.hpp:199
msgpack::zone msgpack_zone
Definition: structure_data.hpp:198
std::vector< char > altLocList
Definition: structure_data.hpp:187
std::string mmtfVersion
Definition: structure_data.hpp:158
std::map< std::string, msgpack::object > chainProperties
Definition: structure_data.hpp:202
std::vector< std::string > experimentalMethods
Definition: structure_data.hpp:169
int32_t numGroups
Definition: structure_data.hpp:175
std::vector< float > yCoordList
Definition: structure_data.hpp:183
std::vector< int32_t > groupsPerChain
Definition: structure_data.hpp:196
std::vector< char > insCodeList
Definition: structure_data.hpp:192
std::string structureId
Definition: structure_data.hpp:162
std::vector< GroupType > groupList
Definition: structure_data.hpp:178
std::map< std::string, msgpack::object > modelProperties
Definition: structure_data.hpp:203
Top level MMTF data container.
Definition: structure_data.hpp:157
std::vector< int32_t > groupTypeList
Definition: structure_data.hpp:190
Exception thrown when failing during encoding.
Definition: errors.hpp:31
std::vector< int32_t > groupIdList
Definition: structure_data.hpp:189
bool hasConsistentData(bool verbose=false, uint32_t chain_name_max_length=4) const
Check consistency of structural data.
Definition: structure_data.hpp:572
void encodeToStream(const StructureData &data, Stream &stream, int32_t coord_divider=1000, int32_t occupancy_b_factor_divider=100, int32_t chain_name_max_length=4)
Encode an MMTF data structure into a stream.
Definition: encoder.hpp:85
std::map< std::string, msgpack::object > groupProperties
Definition: structure_data.hpp:201
std::vector< int32_t > chainsPerModel
Definition: structure_data.hpp:197
std::vector< Entity > entityList
Definition: structure_data.hpp:168
int32_t numChains
Definition: structure_data.hpp:176
std::vector< char > encodeInt8ToByte(std::vector< int8_t > vec_in)
Definition: binary_encoder.hpp:235
std::vector< int32_t > atomIdList
Definition: structure_data.hpp:186
std::vector< std::string > chainNameList
Definition: structure_data.hpp:195
std::vector< char > encodeRunLengthInt8(std::vector< int8_t > const &int8_vec)
Definition: binary_encoder.hpp:325
std::vector< std::vector< float > > ncsOperatorList
Definition: structure_data.hpp:166
float resolution
Definition: structure_data.hpp:170
float rFree
Definition: structure_data.hpp:171
int32_t numBonds
Definition: structure_data.hpp:173
std::vector< float > xCoordList
Definition: structure_data.hpp:182
Definition: binary_decoder.hpp:25
std::vector< float > zCoordList
Definition: structure_data.hpp:184
std::vector< float > unitCell
Definition: structure_data.hpp:160
std::vector< char > encodeDeltaRecursiveFloat(std::vector< float > const &floats_in, int32_t const multiplier)
Definition: binary_encoder.hpp:311
std::vector< int8_t > bondResonanceList
Definition: structure_data.hpp:181
std::vector< char > encodeRunLengthFloat(std::vector< float > const &floats_in, int32_t const multiplier)
Definition: binary_encoder.hpp:298
std::string releaseDate
Definition: structure_data.hpp:165
int32_t numModels
Definition: structure_data.hpp:177
std::string depositionDate
Definition: structure_data.hpp:164
std::vector< std::string > chainIdList
Definition: structure_data.hpp:194
std::vector< char > encodeRunLengthChar(std::vector< char > const &in_cv)
Definition: binary_encoder.hpp:274
int32_t numAtoms
Definition: structure_data.hpp:174
std::vector< BioAssembly > bioAssemblyList
Definition: structure_data.hpp:167
float rWork
Definition: structure_data.hpp:172
bool isDefaultValue(const T &value)
Definition: structure_data.hpp:409
std::vector< int32_t > sequenceIndexList
Definition: structure_data.hpp:193
std::string title
Definition: structure_data.hpp:163
std::map< std::string, msgpack::object > atomProperties
Definition: structure_data.hpp:200
std::vector< char > encodeRunLengthDeltaInt(std::vector< int32_t > int_vec)
Definition: binary_encoder.hpp:286
std::vector< char > encodeFourByteInt(std::vector< int32_t > const &vec_in)
Definition: binary_encoder.hpp:245
std::vector< char > encodeStringVector(std::vector< std::string > const &in_sv, int32_t const CHAIN_LEN)
Definition: binary_encoder.hpp:256
std::string spaceGroup
Definition: structure_data.hpp:161
std::string mmtfProducer
Definition: structure_data.hpp:159
std::vector< float > bFactorList
Definition: structure_data.hpp:185
std::vector< int32_t > bondAtomList
Definition: structure_data.hpp:179
void encodeToFile(const StructureData &data, const std::string &filename, int32_t coord_divider=1000, int32_t occupancy_b_factor_divider=100, int32_t chain_name_max_length=4)
Encode an MMTF data structure into a file.
Definition: encoder.hpp:72
std::vector< float > occupancyList
Definition: structure_data.hpp:188
std::map< std::string, msgpack::object > extraProperties
Definition: structure_data.hpp:204