光学光子したい(G4OpticalPhoton

 1#include "G4OpticalPhoton.hh"
 2#include "G4PhysicalConstants.hh"
 3#include "G4VProcess.hh"
 4#include "G4AnalysisManager.hh"
 5
 6G4bool OpticalSD::ProcessHits(G4Step* aStep, G4TouchableHistory*)
 7{
 8    // OpticalSDは、PMTやSiPMなどを想定して自作した光センサー用のSensitiveDetector
 9    // ProcessHitsの中で「光学光子」をフィルタリング
10
11    G4Track* track = aStep->GetTrack();
12
13    // 1. 光学光子であるかの確認
14    // 光学光子 =
15    // G4OpticalPhoton::Definitions() or
16    // G4OpticalPhoton::OpticalPhoton() or
17    // G4OpticalPhoton::OpticalPhotonDefinition()
18    if (track->GetDefinition() != G4OpticalPhoton::Definition()) {
19        return false;
20    }
21
22    // 2. 光学光子を計測
23    G4double energy = track->GetTotalEnergy();
24    G4double wavelength = (h_Planck * c_light) / energy;
25    G4double time = track->GetGlobalTime();
26    G4ThreeVector pos = aStep->GetPostStepPoint()->GetPosition();
27
28    // 3. 光学光子を生成したプロセス名を取得
29    // プロセス名が取得できない場合は"Primary"(一次入射)
30    const G4VProcess* process = track->GetCreatorProcess();
31    G4String processName = (process) ? process->GetProcessName() : "Primary";
32
33    // 4. AnalysisManagerに保存
34    G4AnalysisManager* am = G4AnalysisManager::Instance();
35    am->FillNtupleDColumn(0, energy / eV);
36    am->FillNtupleDColumn(1, wavelength / nm);
37    am->FillNtupleDColumn(2, time / ns);
38    am->FillNtupleDColumn(3, pos.x() / mm);
39    am->FillNtupleDColumn(4, pos.y() / mm);
40    am->FillNtupleDColumn(5, pos.z() / mm);
41    am->FillNtupleSColumn(6, processName);
42    am->AddNtupleRow();
43
44    // 5. 検出した光子を消去
45    // 光センサーの受光面で吸収。計算コストを抑える。
46    track->SetTrackStatus(fStopAndKill);
47
48    return true;
49}

G4OpticalPhoton(光学光子)は、光を「波」として扱うクラスです。 反射、屈折、吸収、波長変換などの物理プロセスをシミュレーションしたい場合に使います。

上記のサンプルは、 光電子増倍管(PMT)や半導体光検出器(SiPM)の受光面で、 光学光子を測定することを想定したものです。 トラック情報からG4OpticalPhotonであることを確認し、 光学光子1つずつの基本情報と生成元のプロセスを取得しています。 受光面に到達したあとの計算は不要なので、fStopAndKillで吸収されたものとみなしています。