MMTF-C++
The C++ language MMTF libraries
Loading...
Searching...
No Matches
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
22namespace mmtf {
23
36inline 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
50template <typename Stream>
51inline 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
64inline std::map<std::string, msgpack::object>
65encodeToMap(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// *************************************************************************
72inline 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
84template <typename Stream>
85inline 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
92inline std::map<std::string, msgpack::object>
93encodeToMap(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 }
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 }
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);
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 }
135 data_map["insCodeList"] = msgpack::object(mmtf::encodeRunLengthChar(data.insCodeList), m_zone);
136 }
137 // std::vector<int8_t>
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 }
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);
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);
186 data_map["bFactorList"] = msgpack::object(mmtf::encodeDeltaRecursiveFloat(data.bFactorList, occupancy_b_factor_divider), m_zone);
187 }
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
Exception thrown when failing during encoding.
Definition errors.hpp:31
Definition binary_decoder.hpp:25
std::vector< char > encodeDeltaRecursiveFloat(std::vector< float > const &floats_in, int32_t const multiplier)
Definition binary_encoder.hpp:311
std::vector< char > encodeRunLengthChar(std::vector< char > const &in_cv)
Definition binary_encoder.hpp:274
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< char > encodeInt8ToByte(std::vector< int8_t > vec_in)
Definition binary_encoder.hpp:235
std::vector< char > encodeRunLengthFloat(std::vector< float > const &floats_in, int32_t const multiplier)
Definition binary_encoder.hpp:298
std::vector< char > encodeFourByteInt(std::vector< int32_t > const &vec_in)
Definition binary_encoder.hpp:245
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< char > encodeRunLengthInt8(std::vector< int8_t > const &int8_vec)
Definition binary_encoder.hpp:325
std::vector< char > encodeStringVector(std::vector< std::string > const &in_sv, int32_t const CHAIN_LEN)
Definition binary_encoder.hpp:256
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
bool isDefaultValue(const T &value)
Definition structure_data.hpp:409
std::vector< char > encodeRunLengthDeltaInt(std::vector< int32_t > int_vec)
Definition binary_encoder.hpp:286
Top level MMTF data container.
Definition structure_data.hpp:157
int32_t numBonds
Definition structure_data.hpp:173
std::string mmtfVersion
Definition structure_data.hpp:158
float rFree
Definition structure_data.hpp:171
std::vector< int32_t > sequenceIndexList
Definition structure_data.hpp:193
std::vector< char > altLocList
Definition structure_data.hpp:187
std::vector< int8_t > bondOrderList
Definition structure_data.hpp:180
std::string structureId
Definition structure_data.hpp:162
std::vector< int8_t > bondResonanceList
Definition structure_data.hpp:181
int32_t numGroups
Definition structure_data.hpp:175
std::vector< float > zCoordList
Definition structure_data.hpp:184
std::map< std::string, msgpack::object > chainProperties
Definition structure_data.hpp:202
int32_t numModels
Definition structure_data.hpp:177
std::vector< float > xCoordList
Definition structure_data.hpp:182
std::map< std::string, msgpack::object > groupProperties
Definition structure_data.hpp:201
std::vector< int32_t > groupsPerChain
Definition structure_data.hpp:196
std::vector< float > bFactorList
Definition structure_data.hpp:185
std::vector< int32_t > atomIdList
Definition structure_data.hpp:186
int32_t numChains
Definition structure_data.hpp:176
std::vector< std::string > chainIdList
Definition structure_data.hpp:194
std::string spaceGroup
Definition structure_data.hpp:161
std::vector< int32_t > groupIdList
Definition structure_data.hpp:189
std::string depositionDate
Definition structure_data.hpp:164
std::vector< int32_t > bondAtomList
Definition structure_data.hpp:179
std::map< std::string, msgpack::object > atomProperties
Definition structure_data.hpp:200
std::vector< GroupType > groupList
Definition structure_data.hpp:178
std::map< std::string, msgpack::object > extraProperties
Definition structure_data.hpp:204
std::vector< char > insCodeList
Definition structure_data.hpp:192
bool hasConsistentData(bool verbose=false, uint32_t chain_name_max_length=4) const
Check consistency of structural data.
Definition structure_data.hpp:572
float rWork
Definition structure_data.hpp:172
float resolution
Definition structure_data.hpp:170
std::string mmtfProducer
Definition structure_data.hpp:159
std::vector< std::vector< float > > ncsOperatorList
Definition structure_data.hpp:166
msgpack::zone msgpack_zone
Definition structure_data.hpp:198
std::vector< int32_t > chainsPerModel
Definition structure_data.hpp:197
std::vector< int32_t > groupTypeList
Definition structure_data.hpp:190
std::vector< BioAssembly > bioAssemblyList
Definition structure_data.hpp:167
std::vector< std::string > chainNameList
Definition structure_data.hpp:195
std::string releaseDate
Definition structure_data.hpp:165
std::vector< float > unitCell
Definition structure_data.hpp:160
std::vector< int8_t > secStructList
Definition structure_data.hpp:191
std::vector< Entity > entityList
Definition structure_data.hpp:168
std::map< std::string, msgpack::object > bondProperties
Definition structure_data.hpp:199
int32_t numAtoms
Definition structure_data.hpp:174
std::vector< float > occupancyList
Definition structure_data.hpp:188
std::vector< float > yCoordList
Definition structure_data.hpp:183
std::map< std::string, msgpack::object > modelProperties
Definition structure_data.hpp:203
std::vector< std::string > experimentalMethods
Definition structure_data.hpp:169
std::string title
Definition structure_data.hpp:163