Geant4のExample3のCORBA化(C++)
これはGeant4の例題であり、C++言語で書かれた、ExampleNo3をCORBAを使って
リモートにオブジェクトを渡すための枠組をつくり出すためになされました。
ここでリモートに渡されるオブジェクトはHitCollectionです。ですから、
HitCollectionオブジェクトを定義するためのIDL(Interface Definition Language)
ファイル、Geant4でイベント生成するためのクライアントプログラム、
リモートオブジェクトを処理するサーバプログラムを作成します。
CORBAはPortable Object Architecture (POA)になってから、異機種間の
互換性が保証されました。ORBackus4.0はPOAをベースにしています。
これから使われるCORBAはこのORBackus4.0です。
さて、Geant4のExample3をCORBA化する上で、まず押えないといけないのは
Makefileです。Geant4のユーザ用MakefileはGNUmakefileで提供されます。
初期設定などをした後、最後は
include $(G4INSTALL)/config/binmake.gmk
を呼ぶため、このbinmake.gmkにCORBAに必要なライブラリを与えないと
いけません。その方法は次の通りです。
LDLIBS4 =
ここに必要な情報を入れればよいのです。
CORBA用に修正された
GNUmakefile
をみてください。
CORBAでインターフェースする場合、まずはIDLを定義する必要があります。
Geant4のExampleNo3ではProcessHitsCollectionを定義します。ファイル名は
ProcessHitsCollection.idlです。コンパイルは
% idl ProcessHitsCollection.idl
とします。このコンパイラによって生成されるファイルはIDLファイルの
内容に依存します。このHitCollectionの場合、中でもProcessHitsCollection.cpp
ファイルは重要です。
2つのプログラムリスト、
ProcessHitsCollection.idl及びコンパイラによって生成される
ProcessHitsCollection.cppをみてください。
ProcessHitsCollection.idlを説明します。
LDLIBS4 = /home/amako/geant4/examples/novice/CORBA/src/ProcessHitsCollection.o -lOB
これはコンパイル済のProcessHitsCollection.cppとORBacusのCORBA/C++のための
ライブラリをGeant4に渡します。これでCORBAのためにリンクすべきファイルは
すべてです。
サーバプログラムは型どおりのプログラムです。多少の違いはありますが、
いろいろなリモートオブジェクトを扱うサーバとして汎用に使えます。
プログラムリスト
を示します。
このサーバプログラムの説明をします。
このプログラムは2つのサブプログラムから成っています。mainからみてみましょう。
CORBA::ORB_var orb;
orb = CORBA::ORB_init(argc, argv);
この2つが重要です。これでORBの初期化を行なっています。次はrunです。
手順としては、まずRootPOAのオブジェクトリファレンスを取得します。
次にそのRootPOAを使って、POAマネージャのオブジェクトリファレンスを
取得します。ProcessHitsCollectionのためにオブジェクト生成が多少
複雑になっています。オブジェクトリファレンスをクライアントプログラムが
参照するためにはいろいろの方法がありますが、この場合は文字列に
して出力しています。この方法はどの機種においても互換性があります。
最後はこのサーバプログラムはPOAマネージャを活性化し、サーバとして
自分を走らせます。
クライアントプログラムも1つの型を持っています。Geant4 Example3のプログラムに
そのままCORBAを組み込みこんであるので、アプリケーションによって違いが
あるように写るかも知れませんが。
プログラムリスト
を示します。
#include "src/GetServerProcess.cpp"
これで、複雑なCORBAの処理を隠蔽します。
メインプログラムではORBとHitCollectionのオブジェクトを定義し、
CORBA::ORB_ptr orb;
ProcessHitsCollection_var aProcess_var;
GetServerProcessにそれらを渡し、初期処理をします。
int status;
status = GetServerProcess(orb, aProcess_var);
actionEvent->SetCorbaProcess(aProcess_var);
CORBAの処理、
GetServerProcess.cppをみてみましょう。
orb = CORBA::ORB_init(argc, argv);
これでまずは初期化します。次に、
CORBA::Object_var obj = orb -> string_to_object(refFile);
これで
サーバプログラムで生成されたオブジェクトリファレンスを
取得します。
aProcess_var = ProcessHitsCollection::_narrow(obj);
assert(!CORBA::is_nil(aProcess_var));
これはHitCollectionオブジェクトを生成し、アクティブにします。
actionEvent->SetCorbaProcessはGeant4のイベント処理において
そのオブジェクトをリモートのサーバに転送する処理を行なうように
そのオブジェクトを登録します。
SetCorbaProcessは
ExN03EventAction.hhにあります。
実際にイベントが入って処理されるのは
ExN03EventAction.ccです。
実行例を示します。