From acca041d290120f868c8e71994e44b5f1f1b8880 Mon Sep 17 00:00:00 2001 From: Gabriel Studer <gabriel.studer@unibas.ch> Date: Wed, 15 Feb 2023 17:43:53 +0100 Subject: [PATCH] OMF - raw data access for per residue bfactor averages --- modules/io/pymod/export_omf_io.cc | 1 + modules/io/src/mol/omf.cc | 25 +++++++++++++++++++++++++ modules/io/src/mol/omf.hh | 2 ++ 3 files changed, 28 insertions(+) diff --git a/modules/io/pymod/export_omf_io.cc b/modules/io/pymod/export_omf_io.cc index fb98237b0..43355a4a9 100644 --- a/modules/io/pymod/export_omf_io.cc +++ b/modules/io/pymod/export_omf_io.cc @@ -77,6 +77,7 @@ void export_omf_io() { .def("GetChainNames", &wrap_get_chain_names) .def("GetPositions", &OMF::GetPositions, return_value_policy<reference_existing_object>(),(arg("cname"))) .def("GetBFactors", &OMF::GetBFactors, return_value_policy<reference_existing_object>(),(arg("cname"))) + .def("GetAvgBFactors", &OMF::GetAvgBFactors,(arg("cname"))) .def("GetSequence", &OMF::GetSequence, (arg("cname"))) ; } diff --git a/modules/io/src/mol/omf.cc b/modules/io/src/mol/omf.cc index 973595161..91fdca413 100644 --- a/modules/io/src/mol/omf.cc +++ b/modules/io/src/mol/omf.cc @@ -3833,6 +3833,31 @@ const std::vector<Real>& OMF::GetBFactors(const String& cname) const { return it->second->bfactors; } +std::vector<Real> OMF::GetAvgBFactors(const String& cname) const { + auto it = chain_data_.find(cname); + if(it == chain_data_.end()) { + throw ost::Error("Provided chain name not in OMF structure"); + } + const std::vector<Real>& bfactors = it->second->bfactors; + const std::vector<int>& res_def_indices = it->second->res_def_indices; + std::vector<Real> avg_bfactors; + avg_bfactors.reserve(it->second->res_def_indices.size()); + int current_atom_idx = 0; + for(auto i = res_def_indices.begin(); i != res_def_indices.end(); ++i) { + int size = residue_definitions_[*i].anames.size(); + Real summed_bfac = 0.0; + for(int j = 0; j < size; ++j) { + summed_bfac += bfactors[current_atom_idx]; + ++current_atom_idx; + } + if(size > 0) { + summed_bfac /= size; + } + avg_bfactors.push_back(summed_bfac); + } + return avg_bfactors; +} + String OMF::GetSequence(const String& cname) const { auto it = chain_data_.find(cname); if(it == chain_data_.end()) { diff --git a/modules/io/src/mol/omf.hh b/modules/io/src/mol/omf.hh index f5bb8b996..9503b1f54 100644 --- a/modules/io/src/mol/omf.hh +++ b/modules/io/src/mol/omf.hh @@ -199,6 +199,8 @@ public: const std::vector<Real>& GetBFactors(const String& cname) const; + std::vector<Real> GetAvgBFactors(const String& cname) const; + String GetSequence(const String& cname) const; private: -- GitLab