Skip to content

Conversation

@smzmsys
Copy link
Collaborator

@smzmsys smzmsys commented Nov 4, 2025

conformer-docking時、オプションで指定したdx_folder.dxが存在する原子タイプは.gridではなく.dxの方のデータを使う機能を追加しました。
.dxのグリッドが指定するボックスに一致しているかの判定機能は実装できていません。

@keisuke-yanagisawa
Copy link
Contributor

面倒事を発言しているかもしれないと思いつつ、、、

https://github.com/openbabel/openbabel/blob/openbabel-2-4-1/src/formats/opendxformat.cpp

openbabelに、opendxformatを読み込むモノがあるみたいです。自前実装はいろいろ怖いですし、v2.4.1でも入っているということは依存関係は増えないので、これをご確認いただけますか?

@keisuke-yanagisawa
Copy link
Contributor

chatGPTが示したコード例

#include <openbabel/obconversion.h>
#include <openbabel/mol.h>
#include <openbabel/griddata.h>   // ここが重要:グリッドデータを扱う
#include <iostream>

using namespace OpenBabel;

int main(int argc, char **argv)
{
    if (argc < 2)
    {
        std::cerr << "Usage: read_dx input.dx" << std::endl;
        return 1;
    }

    OBConversion conv;
    OBMol mol;

    // OpenDXフォーマットで読み込み
    if (!conv.SetInFormat("opendx"))
    {
        std::cerr << "OpenDX format not supported!" << std::endl;
        return 1;
    }

    if (!conv.ReadFile(&mol, argv[1]))
    {
        std::cerr << "Failed to read " << argv[1] << std::endl;
        return 1;
    }

    // --- グリッドデータ取得 ---
    OBGridData *grid = mol.GetData<OBGridData>();
    if (!grid)
    {
        std::cerr << "No grid data found in the molecule." << std::endl;
        return 1;
    }

    // グリッドのサイズを確認
    int nx = grid->GetXDim();
    int ny = grid->GetYDim();
    int nz = grid->GetZDim();
    std::cout << "Grid size: " << nx << " x " << ny << " x " << nz << std::endl;

    // 空間的な原点とセルサイズ
    vector3 origin = grid->GetOrigin();
    vector3 spacing = grid->GetSpacing();

    std::cout << "Origin: " << origin.x() << ", " << origin.y() << ", " << origin.z() << std::endl;
    std::cout << "Spacing: " << spacing.x() << ", " << spacing.y() << ", " << spacing.z() << std::endl;

    // --- 任意の (x, y, z) で値を取得する例 ---
    int ix = 10, iy = 20, iz = 30; // サンプルの格子インデックス

    double value = grid->GetValue(ix, iy, iz);
    std::cout << "Value at (" << ix << ", " << iy << ", " << iz << ") = " << value << std::endl;

    // --- 物理座標から最近傍の格子点値を得たい場合 ---
    double x = 5.0, y = 6.0, z = 7.0;
    int gx = (int)((x - origin.x()) / spacing.x());
    int gy = (int)((y - origin.y()) / spacing.y());
    int gz = (int)((z - origin.z()) / spacing.z());

    if (gx >= 0 && gx < nx && gy >= 0 && gy < ny && gz >= 0 && gz < nz)
    {
        double v = grid->GetValue(gx, gy, gz);
        std::cout << "Nearest grid value at (" << x << ", " << y << ", " << z << ") = " << v << std::endl;
    }
    else
    {
        std::cout << "Point is outside the grid." << std::endl;
    }

    return 0;
}

@smzmsys
Copy link
Collaborator Author

smzmsys commented Nov 5, 2025

openbabelでopendxファイルをパースする処理に変更しました。
もしかしたら別件になるのかもしれませんが、InterEnergyGridの各メソッドについて、何らかの処理失敗時にエラーメッセージだけ表示して処理は続行する形が気になっています。
returnではなくabortをした方が良いでしょうか。

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.

3 participants