物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

C++のクラスをPythonから使うためにBoost::Pythonを使うまで

BoostのPython用ライブラリを使いたかったのでコンパイルする

参考文献。

Boostライブラリのビルド方法 - boostjp

Boost 最新版をソースコードからビルドし、インストール(MSVC ビルドツールを使用)(Windows 上)

Visual Studio 2019の x64 Native Tools Command Prompt for VS 2019 を使って、

cd (解凍したディレクトリ)
bootstrap.bat
mkdir stage
b2.exe install -j2 --prefix=stage toolset=msvc-14.2 link=static,shared address-model=64 --with-python

を行う。 -j2 の1は1並列で行うの意味。Visual Studio側では、Visual Studio 2019は v142 となっているため、msvc-16.0 とはしない。

次に、Visual Studio 2019で次のサイトで書いてることをやってみる。

Boost.Python Tutorial - 1.70.0

Visual Studio 2019で、プロジェクト名「hello_ext」を「C++ 空のプロジェクト」で作成する。

  • Pathを正しく通す
    • インクルードディレクトリには、boostだけでなく、 $(USERPROFILE)\Anaconda3\include; も通す。(Anaconda3の場合)
    • ライブラリディレクトリには、boostだけでなく、 $(USERPROFILE)\Anaconda3\libs; も通す。
  • 構成プロパティ-> 全般 -> 構成の種類 は ダイナミックライブラリ (.dll) にする
  • 構成プロパティ-> 全般 -> ターゲットの拡張子 は .pyd にする

hello_ext.pyd が x64のRelease内に出力されるので、それをpythonを実行するディレクトリにコピーし、そこでpythonを起動する

>>> import hello_ext
>>> print hello_ext.greet()
hello, world

これで動くはずである。

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

ここの、 BOOST_PYTHON_MODULE 内 今回の例では、hello_ext はプロジェクト名 (=出力する .pyd 名)と同じでなければならない。

boost::python(1) classと関数の使用方法(PythonからC++の呼び出し) - のんびりしているエンジニアの日記

yaml-cppをWindows10 Visual Studio 2019でコンパイルする

git clone https://github.com/jbeder/yaml-cpp

cmake for Windowsで、

Where is the source code に ***/yaml-cpp

Where to build the binaries に ***/yaml-cpp/build

Configure から Visual Studio 2019 x64 を選ぶ

Xドライブにインストールしたい。Debug版と、デバッグ情報付きRelease版が欲しいので、設定は以下のようにした

f:id:onsanai:20200923103106p:plain

でGenerate

build内のYAML_CPP.slnをVisual Studio 2019で開く

Debug版とRelWithDebInfo版でそれぞれ

ALL_BUILDをビルド

INSTALLをビルド

で終わり。

最新のリリースyaml-cpp-0.6.3では、C++17に対応したので、Visual Studio 2019 でもコンパイルできる。

Windows10 + Visual Studio 2017で32bit版 GEANT4を動かす (2019年)

http://geant4.web.cern.ch/geant4/

WindowsでGeant4を入れたお話。

皆さん誤解しているかもしれませんが、WindowsでGeant4は動きます。GUIや、他のLinuxにしか対応していないツールや、マルチスレッド関連を除けば、ちゃんと動きます。 深いことをやろうとすると動かなくなることがありますが、とりあえず構造を作って粒子を打ち込むのであればできる。

と思っていたわけだ。こんなに苦労するとは思わなかった(8時間ほど)。詰まったのは G4LIB_BUILD_DLL をプリプロセッサに追加するところだった。一通り導入方法を書きます。質問があればコメントでどうぞ。

Geant4のWindows + Visual Studioでの導入方法

Geant4の入手

まず、ダウンロードページからデータファイルとコンパイル済みのライブラリを入手しましょう。

http://geant4.web.cern.ch/support/download

いまはないので、過去のバージョンをさかのぼってください

https://geant4.web.cern.ch/support/download_archive?page=1 など。

「compiled using Visual Studio 2017 (version 15.9.3) on Windows 7, 32 bits, executable installer」と書いてありますが、Windows10でも動きます。

コンパイル済みのライブラリは C:\Program Files (x86)\Geant4 10.5 にインストールしたとします。初期設定でそうなっていると思います。 変更する点は次の絵のPATHを通すところ。とりあえず下記のようにしておこう。

Geant4 Windows10 Install Options

ソースファイルの入手

インストールした先のexamplesにサンプルコードはありますが、分かりにくいです。全然ベーシックじゃねぇです。KEKのGean4初心者講習の実習用ソースコードの方が分かりやすいです。KEK万歳です。 Geant4Tutorial20171129\TutorialMaterials\P01_FirstStep\source にあります。 直下にある *.cc と、srcにある *.cc includeにある *.hh を使います。

KEK wiki https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソリューション、プロジェクトを作る

Visual Studio 2017で、適当な名前を付けて作ってください。

先ほどの *.cc *.hh を全部コピーして、ソースファイルとヘッダーファイルに突っ込みます。正しい流儀ではありませんが、気にしたら負けです。

プロジェクトの設定

Visual Studio内で、インクルードパスを設定し、ライブラリファイルを設定します。

  • インクルードパス: プロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトリ C:\Program Files (x86)\Geant4 10.5\include\Geant4
  • ライブラリファイル: プロパティ→構成プロパティ→リンカー→入力→追加の依存ファイル C:\Program Files (x86)\Geant4 10.5\lib\*.lib

適宜インストール先に置きかえてください。

いくつかのプリプロセッサを設定する必要があります。プリプロセッサは プロパティ→構成プロパティ→C/C++→プリプロセッサ→プリプロセッサの定義に、

G4LIB_BUILD_DLL
WIN32
_CRT_SECURE_NO_WARNINGS

を設定してください。

上から、DLLを呼び出す(dllimport を使う)設定、Windowsのヘッダにするための設定、古いCの関数でエラーを出さないための設定です。

環境変数

環境変数のpathに C:\Program Files (x86)\Geant4 10.5\bin を追加しましょう。

データファイルの環境変数は適宜下記のものを設定してください。使う物理リストによっては他の変数を要求されることもあります。

G4ENSDFSTATEDATA=C:\G4ENSDFSTATE2.2
G4LEDATA=C:\G4EMLOW7.7
G4LEVELGAMMADATA=C:\PhotonEvaporation5.3
G4SAIDXSDATA=C:\G4SAIDDATA2.0
G4PARTICLEXSDATA=C:\G4PARTICLEXS1.1

以前は G4NEUTRONXSDATA=C:\G4NEUTRONXS1.4 が必要だったが、G4PARTICLEXSDATAに統合された?

コードの修正

下記のようなエラーが出ると思います。

Geant4\Geometry.cc(43): error C2039: 'Invisible': 'G4VisAttributes' のメンバーではありません。
Geant4\G4VisAttributes.hh(68): note: 'G4VisAttributes' の宣言を確認してください
Geant4\Geometry.cc(43): error C2065: 'Invisible': 定義されていない識別子です。

Geometry.cc の43行目を下記のように修正してください。

   logVol_World->SetVisAttributes (G4VisAttributes::GetInvisible());

動かしてみる

P1というサンプルコードを動かすと、次のようにコンソールに表示されて止まります。ここにコマンドを入れていくと、粒子を買えたりビームを打ったりすることができます。warningが出ていますが、とりあえず気にしません。なぜ出るのかエラい人教えてください。

**************************************************************
 Geant4 version Name: geant4-10-05    (7-December-2018)
                       Copyright : Geant4 Collaboration
                      References : NIM A 506 (2003), 250-303
                                 : IEEE-TNS 53 (2006), 270-278
                                 : NIM A 835 (2016), 186-225
                             WWW : http://geant4.org/
**************************************************************

<<< Geant4 Physics List simulation engine: FTFP_BERT 2.0


 FTFP_BERT : new threshold between BERT and FTFP is over the interval
 for pions :   3 to 12 GeV
 for kaons :   3 to 12 GeV
 for proton :  3 to 12 GeV
 for neutron : 3 to 12 GeV

### Adding tracking cuts for neutron  TimeCut(ns)= 10000  KinEnergyCut(MeV)= 0
Available UI session types: [ Win32, GAG, csh ]

-------- WWWW ------- G4Exception-START -------- WWWW -------
*** G4Exception : UI0002
      issued by : G4UIExecutive::G4UIExecutive()
Specified session type is not build in your system,
or no session type is specified.
A fallback session type is used.
*** This is just a warning message. ***
-------- WWWW -------- G4Exception-END --------- WWWW -------

Idle>

講義資料の「ユーザ・アプリケーション作成の基礎」に使い方が載っています。コマンドを実際に打ちながら、色々動かしてみましょう。

https://wiki.kek.jp/display/geant4/Geant4+Japanese+Tutorial+for+Detector+Simulation+2017

ソースコードを書く

好きにソースコードを書きましょう。例えば、Geant4でHello World!を書くには次のようにするそうです。

#include <G4coutDestination.hh>

int main() {
    G4cout << "Hello world!" << G4endl;
}

IO部分はとりあえずの実装で良いなら、 std::coutstd::ofstream を使っても動きます。

では、良いシュミレーションライフを。