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