Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

孤立原子統合のアルゴリズム変更 #28

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

Conversation

smzmsys
Copy link
Collaborator

@smzmsys smzmsys commented Jul 23, 2024

変更内容

  • 孤立原子統合のアルゴリズム変更
    • 変更前:統合した場合の回転可能な結合を実際に回転させて構造の変化を見て、実際に統合するか判断
    • 変更後:暫定フラグメントAの原子aと暫定フラグメントBの原子bで統合する場合、「abベクトルとac(cは暫定フラグメントBの任意の原子)ベクトルのなす角の最大値」と「abベクトルとd(dは暫定フラグメントDの任意の原子)ベクトルのなす角の最大値」を見て、実際に統合するか判断
      • 角度の閾値は0.2 rad(約10°)にしている。手元で複数試したところ、最大値は0の次が0.4 radくらいであるため、0.1~0.3程度が妥当か。
  • IsMergeable()から関数切り出し
    • 前半で定義したオブジェクトを後半(角度計算)に用いなかったため、IsNewRing()として切り出し
      • 実際にIsNewRing()が必要な場面が想像できないため、そもそも不要かもしれない。

個人的にid_1id_2の所属フラグメント判定やcalc_max_angle()の入出力が綺麗ではないと思ってはいますが、他の箇所でもご指摘あればよろしくお願いいたします。

src/MoleculeToFragments.cc Outdated Show resolved Hide resolved
return nRings_prev != nRings_united;
}

fltype calc_max_angle(const Molecule &mol, int a, int b, const vector<int> & atomids_subst_b) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1件ずつの処理に分割できるにも関わらず複数件を同時に処理することになっている関数は基本的にはアヤシイと思った方が良いです。

今回のケースであれば、fltype calc_angle(const Atom &a, const Atom &b, const Atom &c) まで一般化させてしまえば、誰でもかなり理解しやすい関数になると思います。(それでも∠ABC であって ∠ACBではないとか書く必要あると思いますが)
計算した角度をどのように利用するか?は IsMeageable 側だけを見ればわかるようになっていると有難いです。

src/MoleculeToFragments.cc Outdated Show resolved Hide resolved
src/MoleculeToFragments.cc Outdated Show resolved Hide resolved
@smzmsys
Copy link
Collaborator Author

smzmsys commented Jul 24, 2024

最後のコメント以外を反映しました。
doneフラグの修正はこの後取り組む予定です。

@smzmsys
Copy link
Collaborator Author

smzmsys commented Jul 24, 2024

doneフラグの更新も修正しました。

uniteしたフラグメントの全原子についてフラグを立てるように変更しています。

src/MoleculeToFragments.cc Outdated Show resolved Hide resolved
uf.unite(a, b);
for (int id_a : atomids_subst_a) done[id_a] = true;
for (int id_b : atomids_subst_b) done[id_b] = true;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

うーーーーーん、どうしよう。これをやると、例えばベンゼン環に3つのクロロがくっついている時に、 c1(Cl)cc(*)cc(*)c1Cl*Cl* になった時点で併合が止まってしまいます。

@smzmsys
Copy link
Collaborator Author

smzmsys commented Jul 25, 2024

#変更内容

  • MoleculeToFragment.ccについて、Doxygenコメントを追加
  • is_mergeable()について、角度チェックから結合回転に変更
  • 回転による構造変化の計算をRMSDから原子の座標変化に変更
    • どれかの原子が1e-5Å以上移動していたらuniteしないと判断
    • 1e-5はRMSD計算時のものを流用しただけで、厳密な基準はなし
      • 1でも同じ結果になった

@@ -53,6 +53,13 @@ namespace {
return ( c.end() != std::find(c.begin(), c.end(), v) );
}

/**
* @brief Extract the substructure of the original molecule by the atom IDs.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

atomとともにbondも抜き出されることを明記しておきたいです。両端の原子が選ばれているbondもextractされる、というような表現になりますかね?

* @param mol Molecule to be rotated
* @param bond_id Bond ID that serves as the axis of rotation
* @param th Rotation angle in radian
* @param rotate_is_id1 Whether fragment is rotated around atom_id1 or atom_id2 (default: true)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rotateは動詞なので、is はおかしいと思います & rotateするのはatom id1 が属するフラグメントであって原子 atom_id1 自体ではない(こいつは回転しても座標は変わらない)と思います。

@param rotate_atom1_side
Specifies which substructure to rotate around the bond. If set to true, the substructure containing atom_id1 is rotated; otherwise, the substructure containing atom_id2 is rotated.

…chatGPT先生にお願いしたら結構長くなっちゃいました。

new_mol.translate(mol.getCenter() - new_mol.getCenter());

return new_mol;
}

bool IsMergeable(const Molecule &mol, const vector<int> &atomids_subst_a, const vector<int> &atomids_subst_b) {
// try to unite atoms a and b
/**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

構造変化だけでなく、そもそも分子が違う場合も含まれてしまっているので、関数名から想像されるものより広い領域をカバーしてしまっていると思います。また、structure という表現は 2D-structureか3D-structureか?などの曖昧性も含みます。

  • are_different_poses とすることを提案します。
    • poseはconformer + 並進移動 + 回転移動、と考えています。今回の場合、構造の重ね合わせなどを行わずに座標をチェックしているので、分子全体の並進移動や回転移動によっても、trueが返されることになり、poseと呼ぶのが最もふさわしいと考えました。
  • 異なる分子が入力された場合はエラーを出した方が安全です。

@@ -72,21 +79,29 @@ namespace {
return temp_mol;
}

Molecule bond_rotate(const Molecule& mol, int bond_id, fltype th) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

めちゃくちゃ今更なんですが、ththreshold に誤認するので theta とするのはいかがでしょうか…?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants