Detectorの移動や回転など | emacsのブログ

emacsのブログ

いろいろ。

Runごとにジオメトリーを変更する方法のメモ。本当はEventでやりたかったけど、まだ上手く行かない。

取り敢えず、自分がやった方法。

弄ったファイルはDetectorConstruction.ccとRunAction.cc (&それぞれのヘッダー)
やりたい事としては、BeginOfRunAction()とかで動かしたいDetectorのPhysical Volumeを取得してDetectorを一定条件でRunごとに更新して動かす、とういことがしたい。
最初のRunではそのまま、次のRunでは30度回転させる、また次のRunでは・・・という感じ。

一々DetectorConstructionを書きなおしてコンパイルするのは面倒なので、RunかEventで更新していったほうが楽なのではなかろうか。

Detectoronstruction.ccの変更:
普通に書く。最後にDetectorを移動や回転させる関数を作る。
こんな感じ↓
void DetectorConstruction::SetAngle(double val)
{
if(!wbox_phys){
G4cout<<"error"< return ;
}
Angle = val;
*Rotation = G4RotationMatrix();
Rotation->rotateY(Angle);
}
ここでwbox_physってのが移動とかさせたいPhysical VolumeでこいつはDetectorConstruction.hhにメンバ変数として定義しておくのがいいんじゃなかろうか。

RunAction.ccの変更:
取り敢えず動けば何でもよかったので、コンストラクタで初期化してBeginOfRunActionで動かす。
↓のような感じ。
RunAction::RunAction(DetectorConstruction* mpga):target(mpga)
{
counts = 0;
timer = new G4Timer;
}

void RunAction::BeginOfRunAction(const G4Run* aRun)
{
// G4cout<<"Start of Run!!!! "< G4int id = aRun->GetNumberOfEventToBeProcessed();
target->SetAngle(id*45*deg);
}
RunAction.hhとかもうまく書き換える。

これでコンパイルして実行すると、/Run/beamOn をやる度にディテクタが45度回転していたのでまあ、おkということで。

マクロとかで動かしたほうが賢いと思ふ。でもいつか役に立つ時が来るかもしれないのでメモとして残しておきます。

⊂(゚Д゚⊂⌒`つズザー