光学光子したい(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で吸収されたものとみなしています。