using namespace OpenBabel; #define Overlap_Fragment_Diameter 4 /** * @file Overlap.hpp * @brief Overlapクラスで使うボンド情報を扱う * @author C.Kanai */ #include class NBond { public: /** */ int idx_ref; /** */ int idx_fra; /** 結合次数 */ int order; /** 結合の立体情報 */ int flags; /** * @brief コンストラクタ */ NBond() { idx_ref=-1; idx_fra=-1; order=-1; flags=0; } /** * @brief デストラクタ */ virtual ~NBond() {} /** * @brief コピーコンストラクタ */ NBond(const NBond &obj) { idx_ref=obj.idx_ref; idx_fra=obj.idx_fra; order=obj.order; flags=obj.flags; } /** * @brief 代入演算子 */ NBond &operator=(const NBond &obj) { if (this == &obj) return *this; idx_ref=obj.idx_ref; idx_fra=obj.idx_fra; order=obj.order; flags=obj.flags; return *this; } /** * @brief ソート用比較演算子 */ bool operator<(const NBond &obj) const { if (idx_ref < obj.idx_ref) return true; else if (idx_ref == obj.idx_ref) { return idx_fra < obj.idx_fra; } else return false; } /** * @brief ソート用比較演算子 */ bool operator==(const NBond &obj) const { if (idx_ref == obj.idx_ref && idx_fra == obj.idx_fra) return true; else return false; } }; /** * @brief 糊代部分の情報を格納するためのクラス */ class Overlap : public ECMol { public: /** 糊代のID番号 */ int id; /** 糊代のユニットID番号 */ int uid; /** 分子①と対応する原子インデックス番号のリスト */ vector list1; /** 分子①と対応する原子インデックス番号のリストでAnyAtomを含まない */ vector list1b; /** 分子②と対応する原子インデックス番号のリスト */ vector list2; /** 分子②と対応する原子インデックス番号のリスト全部(現在未使用) */ vector< vector > all_list2; /** 新しく作るボンド中の原子ペア */ vector NewBond; /** 後で削除するかどうか */ bool Del; /** * @brief コンストラクタ */ Overlap() { id=-1; Del=false; } /** * @brief デストラクタ */ virtual ~Overlap() {} /** * @brief コピーコンストラクタ */ Overlap(const Overlap &obj); /** * @brief 代入演算子 */ Overlap &operator=(const Overlap &obj); /** * @brief ダウンキャスト用コピーコンストラクタ */ Overlap(const ECMol &obj); /** * @brief ダウンキャスト用代入演算子 */ Overlap &operator=(const ECMol &obj); /** * @brief 変数をクリア */ bool Clear(void); /** * @brief list1に①分子に対応する原子インデックス番号をセット * list1bにもAnyAtom2を含まない番号をセットする * @param HE2 真の時は重元素セット2(100~111)をlist1bに含める * 偽の時はセット1(90~92)をlist1bに含める */ void Set_list1(bool HE2=true); /** * @brief 新しく作るボンドの原子ペアを作成 */ void MkNewBond(void); /** * @brief 参照分子側の削除すべき原子インデックス番号をゲット! * @return 原子インデックスのベクター */ vector GetDeleteAtomIds_Ref(void); /** * @brief フラグメント分子側の削除すべき原子インデックス番号をゲット! * @return 原子インデックスのベクター */ vector GetDeleteAtomIds_Fra(void); /** * @brief Fm,Mdについてチェックします * * 環を構成するAnyAtomを含む糊代が、フラグメントを結合させて閉じた環の形成が可能かどうかを判定する * * @return 糊代として問題無いかどうか * @retval true おk * @retval false 問題あり */ bool Check(void) { int n=0; for (OBAtomIterator aa=this->BeginAtoms(); aa!=this->EndAtoms(); aa++) { if ( (*aa)->GetAtomicNum() == 100 || (*aa)->GetAtomicNum() == 101) { OBBondIterator itr; for (OBBond *b=(*aa)->BeginBond(itr); b; b=(*aa)->NextBond(itr)) { if (b->GetBondOrder() >= USER_AROMATIC_BOND) n++; } } } if (n%2 != 0) return false; return true; } /** * @brief ボンドの各種情報を標準出力する */ void PrintBondInfo(void); };