Unit クラス

libbuilcule での Unit クラスは,その系に含まれる全原子を格納るためのクラスです.
メンバとして,系全体の原子処理するための関数,分子 を表現するクラスオブジェクト,特定の分子や原子を処理するための関数などをを有します.
libbuilcule の主要なインターフェースとして利用することを想定しています.


考え方

系の表現

libbuilcule では原子を Atom というクラスで表現しています.
Atom を 0 個以上集めれば一つの系が作成できます.すなわち,


#include <vector>

class Unit {
 private:
  std::vector<std::shared_ptr<Atom>> Atom1D;
}

分子の検知

原子が 2 個以上含まれれる系には,複数の分子が含まれる可能性があります.
Atom には,共有結合している相手を格納するベクトル型オブジェクト Bond が定義されています.
Bond を通してみると,Atom は双方向リンクリストのノードと解釈できます.すなわち,Bond をたどれば,分子を検知することができます.

分子が検知できれば,これをメンバとするクラス Molecule が定義できます.
ここでは,分子の一意性を担保するために,Molecule は std::unique_ptr としてインスタンス化します.
この場合の副作用として,分子をコピーする場合は専用の関数を定義する必要が生じます.
そうすると,Unit クラスは,次のように表現することができます.


#include <vector>

class Unit {
 private:
  std::vector<std::shared_ptr<Atom>> Atom1D;
  std::vector<std::unique_ptr<Molecule>> Mol1D;
}

この Unit の宣言だと,Atom1D と Mol1D には同じ原子を表す std::shared_ptr<Atom> が含まれることになります.
例えば Atom1D の Atom インスタンスの内部情報(位置とか元素とか)を変更すると,Mol1D の Atom インスタンスの内部情報も変更されます.
原子の削除については Atom1D と Mol1D の両方を処理する必要があります.
Atom1D と Mol1D の両方が必要かどうかは,そのライブラリの目的によります.

領域

const std::vector<std::shared_ptr<buic::Atom>> * のかたちで引数となる場合があるので,ここに記します.
ここでいう領域とは,分子の一部分です.もう少し厳密に言うと,分子の他の部分とは,結合 1 個でつながった分子の一部分です.
置換基として使ったり,コンフォメーションの変更用の部分構造として使ったりと,いろいろな目的で使います.


private メンバ

private メンバは多くありません.

std::vector<std::unique_ptr<buic::Molecule>> Mol1D;

分子の一意性を担保するために,Molecule は std::unique_ptr としてインスタンス化しています.
軽全体の原子を処理するためには,for 文で全ての std::unique_ptr<buic::Molecule> を処理します.

Unit_Atom_Dist AtomDist;

Unit の中心や半径を計算して保持するためのクラスオブジェクトです.
例えば Builcule での描画に使います.

Unit_Affine UnitAffine;

Unit 全体を回転したり平行移動したりするためのクラスオブジェクトです.
例えば Builcule でのマウス処理で使います.

int RegionCurtMol;

処理中の領域(分子の一部)が属する分子の番号を保持します.

std::vector<std::vector<AA_Memo>> AAMemo;

アミノ酸の分子番号,ペプチド番号,配列番号,アミノ酸コード等をメンバとする構造体です.
Builcule でのアミノ酸セレクタの構築,変異やホモロージーモデリングでの情報の授受などに使います.


コンストラクタ

Unit();

各オブジェクトを初期化しているだけで,定義を記しても数行で済みます.


buic::Unit::Unit()
 : AtomDist(&Mol1D),
   UnitAffine(&Mol1D),
   RegionCurtMol(-1)
{}

コンストラクタは単純で private メンバも少ないのですが,public メンバ関数はいろいろあります.
Unit 全体(全ての分子),特定の分子,特定の原子等を処理する必要があるからです.
また,別途定義しているオブジェクトを引数にしている場合があります.

構築と解体

void clear();

void import_seed_1d_as_unit(const std::vector<buic::Atom_Seed> *seed_1d);

引数に出てくる Atom_Seed というクラスは,基本的に,原子の元素と三次元座標を保持するためのクラスです.
すなわちこの関数は,ファイルを開いて得られた元素と三次元座標から Unit を構築するときに使います.

void import_seed_1d_as_mol(const std::vector<buic::Atom_Seed> *seed_1d);

この関数は,分子単位のペーストに使います.

void clear();

Unit 全体を初期化します.

void delete_mol(const std::vector<int> *mol_idx);

mol_index が示す分子を削除します.

情報の開示

const Eigen::Vector3d *get_unit_center() const;

原子の三次元座標の算術平均を返します.主に描画用です.

double get_unit_radius() const;

原子の三次元座標の算術平均から各原子への距離の最大値を返します.主に描画用です.

int get_mol_cnt() const;

分子数を返します.

int get_mol_atom_cnt(int mol_idx) const;

原子数を返します.

int get_pept_cnt(int mol_idx) const;

mol_index が示す分子のペプチド数を返します.

const std::vector<std::shared_ptr<buic::Atom>> *get_mol_atom_1d(int mol_idx) const;

mol_index が示す原子を返します.言い換えると,その分子のメンバ変数である,Atom クラスの共有ポインタを格納したベクトル型配列へのポインタを返します.

const std::vector<std::unique_ptr<buic::Molecule>> *get_mol_1d() const;

戻り値は,ユニットに存在する全分子の情報が格納されたベクトルです.

const std::vector<std::vector<AA_Memo>> *get_aa_memo();

戻り値は,ユニットに存在する全アミノ酸情報が格納されたベクトルです.

const std::vector<buic::Atom_Seed> *get_region_leaf_seed();

領域の選択

buic::RegionErr select_region(const std::shared_ptr<buic::Atom> &root, const std::shared_ptr<buic::Atom> &leaf);

buic::RegionErr select_region(const std::shared_ptr<buic::Atom> ≈ref, const std::shared_ptr<buic::Atom> &root, const std::shared_ptr<buic::Atom> &leaf);

buic::RegionErr select_region(const std::shared_ptr<buic::Atom> &atom0, const std::shared_ptr<buic::Atom> &root, const std::shared_ptr<buic::Atom> &leaf, const std::shared_ptr<buic::Atom> &atom1);

void clear_region2_from_mouse();

void clear_region3_from_mouse();

void clear_region4_from_mouse();

コンフォメーション

void calc_unit_center_radius();

void set_rotation_center(const Eigen::Vector3d *pos);

void set_rotation_center(int mol_idx);

void rotate_xy_unit(int x, int y);

void rotate_xy_mol(int mol, int x, int y);

void move_xy_mol(int mol, double x, double y);

void move_unit(const Eigen::Vector3d *v);

void rotate_unit(const Eigen::Vector3d *center, const Eigen::Quaterniond *quat);

void add_bond_length(double len);

void set_bond_length(double len);

void add_bond_angle(double deg);

void set_bond_angle(double deg);

void add_diheadral(double deg);

void set_diheadral_angle(double deg);

コンフィギュレーション

void change_elmt(const std::vector<std::shared_ptr<buic::Atom>> *atom_1d, int elmt);

第一引数の原子の元素を,第二引数で示す元素に変更します.Builcule との兼ね合いで,同時に複数の原子を処理する使用としています.

void delete_atom(const std::vector<std::shared_ptr<buic::Atom>> *atom_1d);

引数の原子を削除します.Builcule との兼ね合いで,同時に複数の原子を処理する使用としています.

void create_bond_at_unit(const std::shared_ptr<buic::Atom> &atom_0, const std::shared_ptr<buic::Atom> &atom_1);

引数が示す原子間の結合を生成します._at_unit とついているのは,開発初期に,データ構造の再構築を忘れないようにしていた名残です.

void delete_bond_at_unit(const std::shared_ptr<buic::Atom> &atom_0, const std::shared_ptr<buic::Atom> &atom_1);

引数が示す原子間の結合を切断します._at_unit とついているのは,開発初期に,データ構造の再構築を忘れないようにしていた名残です.

int elong_atom(const std::vector<std::shared_ptr<buic::Atom>> *target_1d, int atom_num, buic::AtomOrbital orbital);

第一引数の原子に,第二引数で示す原子番号の元素を,第酸引数で示す軌道型に付加します.軌道型といっても,結合角を調整しているだけですが.

void delete_selected_region();

予め選択しておいた領域を削除します..

int connect_region(const std::vector<std::shared_ptr<buic::Atom>> *target_1d, const Eigen::Vector3d *root_pos, const std::vector<buic::Atom_Seed> *leaf_seed);

void mutate( const std::vector<buic::AA_Memo> *aa_memo_1d, const buic::AACode mutate_to);

分子インデックス,ペプチドインデックス,配列インデックス等が記述された AA_Memo 構造体で指定するアミノ酸を,引数で指定するアミノ酸に変異します.

void mutate( const std::vector<buic::AA_Memo> *aa_memo_1d, int mol_idx) ;

分子インデックス,ペプチドインデックス,配列インデックス,変異前後のアミノ酸コード等が記述された AA_Memo 構造体で指定するアミノ酸を変異します.
主にホモロジーモデリングで使います.

void delete_aa(const std::vector<buic::AA_Memo> *aa_memo_1d);

分子インデックス,ペプチドインデックス,配列インデックス等が記述された AA_Memo 構造体で指定するアミノ酸を欠失します.

void delete_H();

全ペプチドから水素を除去する関数です.

void add_H();

全ペプチドに水素を付加する関数です.