core/indigo-core/molecule/monomers_template_library.h (219 lines of code) (raw):
#ifndef __monomers_template_library__
#define __monomers_template_library__
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4251)
#endif
#include "base_cpp/exception.h"
#include "molecule/idt_alias.h"
#include "molecule/ket_objects.h"
#include "molecule/monomers_defs.h"
#include <map>
#include <memory>
#include <string>
#include <unordered_map>
namespace indigo
{
class MonomerTemplateLibrary;
class TGroup;
class DLLEXPORT MonomerTemplate : public KetBaseMonomerTemplate
{
public:
DECL_ERROR;
MonomerTemplate() = delete;
MonomerTemplate(const MonomerTemplate& other) = delete;
MonomerTemplate& operator=(const MonomerTemplate&) = delete;
MonomerTemplate(const std::string& id, MonomerClass mt_class, IdtAlias idt_alias, bool unresolved)
: KetBaseMonomerTemplate(TemplateType::MonomerTemplate, id, mt_class, idt_alias), _unresolved(unresolved){};
MonomerTemplate(const std::string& id, std::string mt_class, IdtAlias idt_alias, bool unresolved)
: KetBaseMonomerTemplate(TemplateType::MonomerTemplate, id, MonomerTemplate::StrToMonomerClass(mt_class), idt_alias), _unresolved(unresolved){};
MonomerTemplate(MonomerTemplate&& other) = default;
static inline const std::string ref_prefix = "monomerTemplate-";
static const std::string& MonomerClassToStr(MonomerClass monomer_type)
{
static const std::map<MonomerClass, std::string> _type_to_str{
{MonomerClass::AminoAcid, "AminoAcid"},
{MonomerClass::Sugar, "Sugar"},
{MonomerClass::Phosphate, "Phosphate"},
{MonomerClass::Base, "Base"},
{MonomerClass::Terminator, "Terminator"},
{MonomerClass::Linker, "Linker"},
{MonomerClass::Unknown, "Unknown"},
{MonomerClass::CHEM, "CHEM"},
{MonomerClass::DNA, "DNA"},
{MonomerClass::RNA, "RNA"},
};
return _type_to_str.at(monomer_type);
}
static const MonomerClass StrToMonomerClass(const std::string& monomer_type)
{
static const std::map<std::string, MonomerClass> _str_to_type = {
{"aminoacid", MonomerClass::AminoAcid},
{"sugar", MonomerClass::Sugar},
{"phosphate", MonomerClass::Phosphate},
{"base", MonomerClass::Base},
{"terminator", MonomerClass::Terminator},
{"linker", MonomerClass::Linker},
{"unknown", MonomerClass::Unknown},
{"chem", MonomerClass::CHEM},
{"dna", MonomerClass::DNA},
{"rna", MonomerClass::RNA},
};
std::string mt = monomer_type;
std::transform(mt.begin(), mt.end(), mt.begin(), [](unsigned char c) { return std::tolower(c); });
if (_str_to_type.count(mt))
return _str_to_type.at(mt);
return MonomerClass::Unknown;
}
const std::map<std::string, int>& getStringPropStrToIdx() const override;
KetAttachmentPoint& AddAttachmentPoint(const std::string& label, int att_atom);
KetAttachmentPoint& AddAttachmentPointId(const std::string& id, int att_atom);
const KetAttachmentPoint& getAttachmenPointById(const std::string& att_point_id);
std::unique_ptr<TGroup> getTGroup() const;
inline bool hasAttachmenPointWithId(const std::string& att_point_id)
{
return _attachment_points.count(att_point_id) != 0;
};
inline const std::string& monomerClassStr() const
{
return MonomerClassToStr(_monomer_class);
}
inline bool unresolved() const
{
return _unresolved;
};
using atom_ptr = std::shared_ptr<KetBaseAtomType>;
using atoms_type = std::vector<atom_ptr>;
const atoms_type& atoms() const
{
return _atoms;
}
const std::vector<KetBond> bonds() const
{
return _bonds;
}
void parseAtoms(const rapidjson::Value& atoms)
{
KetMolecule::parseKetAtoms(_atoms, atoms);
}
void parseBonds(const rapidjson::Value& bonds)
{
KetMolecule::parseKetBonds(_bonds, bonds);
}
void copy(const MonomerTemplate& other)
{
KetBaseMonomerTemplate::copy(other);
_unresolved = other._unresolved;
_atoms = other._atoms;
_bonds = other._bonds;
}
int AddAtom(const std::string& label, Vec3f location);
int AddBond(int bond_type, int atom1, int atom2);
private:
enum class StringProps
{
classHELM,
fullName,
alias,
naturalAnalog,
naturalAnalogShort
};
bool _unresolved;
atoms_type _atoms;
std::vector<KetBond> _bonds;
};
class DLLEXPORT MonomerGroupTemplate
{
public:
DECL_ERROR;
MonomerGroupTemplate() = delete;
MonomerGroupTemplate(const MonomerGroupTemplate& other) = delete;
MonomerGroupTemplate& operator=(const MonomerGroupTemplate&) = delete;
MonomerGroupTemplate(MonomerGroupTemplate&& other)
: _id(other._id), _name(other._name), _class(other._class), _idt_alias(other._idt_alias), _monomer_templates(std::move(other._monomer_templates))
{
;
};
MonomerGroupTemplate(const std::string& id, const std::string& name, const std::string& template_class)
: _id(id), _name(name), _class(template_class){};
MonomerGroupTemplate(const std::string& id, const std::string& name, const std::string& template_class, const std::string& idt_alias_base)
: _id(id), _name(name), _class(template_class), _idt_alias(idt_alias_base){};
MonomerGroupTemplate(const std::string& id, const std::string& name, const std::string& template_class, const IdtAlias& idt_alias)
: _id(id), _name(name), _class(template_class), _idt_alias(idt_alias){};
void addTemplate(MonomerTemplateLibrary& library, const std::string& template_id);
bool hasIdtAlias(const std::string& alias, IdtModification mod);
bool hasIdtAliasBase(const std::string& alias_base);
inline bool hasTemplateClass(MonomerClass monomer_class)
{
for (auto& id_template : _monomer_templates)
{
if (id_template.second.get().monomerClass() == monomer_class)
return true;
}
return false;
}
const MonomerTemplate& getTemplateByClass(MonomerClass monomer_class) const;
bool hasTemplate(MonomerClass monomer_class) const;
bool hasTemplate(MonomerClass monomer_class, const std::string monomer_id) const;
inline const std::string& id() const
{
return _id;
}
inline const IdtAlias& idtAlias() const
{
return _idt_alias;
}
private:
std::string _id;
std::string _name;
std::string _class;
IdtAlias _idt_alias;
std::map<std::string, std::reference_wrapper<const MonomerTemplate>> _monomer_templates;
};
class DLLEXPORT MonomerTemplateLibrary
{
public:
DECL_ERROR;
MonomerTemplateLibrary(){};
MonomerTemplateLibrary(const MonomerTemplateLibrary&) = delete;
MonomerTemplateLibrary(MonomerTemplateLibrary&&) = delete;
MonomerTemplateLibrary& operator=(const MonomerTemplateLibrary&) = delete;
MonomerTemplateLibrary& operator=(MonomerTemplateLibrary&&) = delete;
MonomerTemplate& addMonomerTemplate(const std::string& id, const std::string& monomer_class, IdtAlias idt_alias, bool unresolved = false);
inline void addMonomerGroupTemplate(MonomerGroupTemplate&& monomer_group_template)
{
auto res = _monomer_group_templates.emplace(monomer_group_template.id(), std::move(monomer_group_template));
if (res.second)
for (auto modification : {IdtModification::FIVE_PRIME_END, IdtModification::INTERNAL, IdtModification::THREE_PRIME_END})
{
if (monomer_group_template.idtAlias().hasModification(modification))
{
const std::string& alias = monomer_group_template.idtAlias().getModification(modification);
_id_alias_to_monomer_group_templates.emplace(alias, std::make_pair(std::ref(res.first->second), modification));
}
}
}
const MonomerTemplate& getMonomerTemplateById(const std::string& monomer_template_id);
const std::string& getMonomerTemplateIdByAlias(MonomerClass monomer_class, const std::string& monomer_template_alias);
MonomerGroupTemplate& getMonomerGroupTemplateById(const std::string& monomer_template_id);
const std::string& getMonomerTemplateIdByIdtAliasBase(const std::string& alias_base);
const std::string& getMGTidByIdtAliasBase(const std::string& alias_base);
const std::string& getMonomerTemplateIdByIdtAlias(const std::string& alias, IdtModification& mod);
const std::string& getMGTidByIdtAlias(const std::string& alias, IdtModification& mod);
const std::string& getIdtAliasByModification(IdtModification modification, const std::string sugar_id, const std::string base_id,
const std::string phosphate_id);
const std::map<std::string, MonomerTemplate>& monomerTemplates()
{
return _monomer_templates;
};
private:
std::map<std::string, MonomerTemplate> _monomer_templates;
std::map<std::string, MonomerGroupTemplate> _monomer_group_templates;
std::map<std::string, std::pair<MonomerTemplate&, IdtModification>> _id_alias_to_monomer_templates;
std::map<std::string, std::pair<MonomerGroupTemplate&, IdtModification>> _id_alias_to_monomer_group_templates;
};
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#endif