GEANT4 是一個基於 C++ 語言的軟體開發工具包(toolkit),用於開發粒子在物質中輸運的模擬計算程序。它提供了粒子在物質中輸運計算所需要的關鍵工具,可應用於核物理與粒子物理、核醫學、核技術應用等多種領域。
設計方法
GEANT4 是在 GEANT3 基礎上重新設計的。 GEANT 源自於 GEometry ANd Tracking, 即「幾何與追蹤」,這二者是粒子輸運計算的關鍵內容。GEANT 第一個版本在 1974 年發布。 GEANT3 於 1982 年發布第一個版本,於 2000 年發布最後一個版本,即 3.21。GEANT4 是重新設計並採用 C++ 語言重新開發的版本,其名字的含義可視為「GEANT 的第四代程序」。
GEANT4 在設計時(1998 年以前)使用的是 Grady Booch 在 20 世紀 90年發展出來的面向對象方法表示方法,即 Booch 圖。如今,Booch 圖已經與其他很多面向對象的設計方法合併,形成了統一的建模標準語言,即 UML。
GEANT4 設計時使用的是「類別」(class category)這個概念來組織軟體架構中的各個類,這是 Booch 圖中的概念,可等同於UML 中的「包」(package)。本文中所提到的「包」,如果沒有特別說明,指的就是 class category。
GEANT4 經歷 19 年的發展,最新發布的是 10.3.2 版本。目前,它的代碼量如下:
在 10.3 版本中共定義了 143 個模塊,可生成 34 個獨立的庫。
從 github 檢出的 10.3 版本,共 493,933 行,其中 source 目錄 412,872 行。
包及其關係
G4 整體上是由初始的17個包加上後續引入的5個包(共計22個包)構成。每個包又是由若干個「模塊」(Module)組成,每個模塊由滿足特定目的的一組類構成。
用 Booch 圖表示的 GEANT4 結構如圖 1 所示:
圖1 GEANT4 設計時的框架結構
所有的包可分為四個優先級別:
依賴的包 – 整體框架結構中都需要的。
核心包 – 實現軟體目標的核心內容。
對外接口的包 – 提供對外部的接口,方便使用以及拓展功能。
可選的包 – 針對非核心需求提供的可選內容。
圖 1 中給出了 GEANT4 設計之初的 16 個最基本的包。根據它們的依賴關係與設計邏輯,可用如下的框圖來表示它們之間的依賴關係(下層是被上層所依賴的):
圖2. GEANT4 16個基本包的依賴關係
如果將最初可選的包及後來拓展出來的 5 個包加進去,全部 22 個包之間的依賴關係如下:
圖3. GEANT4 包的依賴關係
GEANT4 最初包含的 17 個包:
global – 全局包
包含了整個軟體框架都會用到的那些內容,涵蓋了系統單位、常量、數值和隨機數處理等。 G4 對外部軟體包的調用也通過 global 包來實現。
intercoms – 內部通訊包
即 inter-communication 的簡寫,即「內部通訊」,可擴展的命令解析包。這是 G4 實現可定製的及依賴於狀態的用戶交互的核心機制。所有 G4 的命令交互都會通過抽象類 `G4UIsession` 來處理。通過這個機制,程式設計師不需要知道具體的圖形界面編程知識,只需要知道如何註冊並實現相應的命令處理過程。
interfaces – 接口包
涵蓋了構建 G4 應用程式的用戶界面所需要的內容。包括通用的會話(session)類、基本的交互式會話及各種依賴於具體平臺的擴展圖形會話,比如 Qt, Win32, Xt, Wt 等圖形界面的接口。可以將 interfaces 包視為intercoms 包的對外包裝。外部程序調用 G4 需要通過這個包來實現。
graphics_reps – 圖形依賴包
這個包涵蓋了用於表示 3D 圖形對象所需要的類,包括顏色、文本、可視化屬性等。
materials – 材料包
這個包反映了自然界存在的東西,材料是由單個元素或多個元素混合而成,元素是由同位素或多種同位素混合而成。最初的材料定義是非結晶型的。從 10.3 開始,則可以自由定義結晶型及帶有分子結構的材料。
geometry – 幾何包
用於描述粒子在其中輸運的幾何結構。
particles – 粒子包
用於描述粒子屬性及模擬粒子物質相互作用所必須的內容。
track – 蹤跡包
用於描述粒子輸運每一「步」(step)的內容。
processes – 作用過程包
實現粒子輸運及物理過程。
digits_hits – 數位化碰撞包
用於獲取並描述探測器的輸出內容。
tracking – 追蹤包
用於追蹤粒子輸運過程的內容。
event – 事件包
在高能物理中,一個「事件」指的是一組基本粒子與一組探測器相互作用的過程。這個包實現了高能物理中事件的處理內容。
run – 運行包
在高能物理中,一次「運行」指的是發生的一組事件,它們具有某些相同的條件,比如相同的探測器與初始條件(加速器能量等)。這個包實現了高能物理中運行的處理內容。
persistency – 固化包
提供了一個接口,用於從 ODMG1 兼容的對象資料庫中存儲和提取模擬的運行、事件、撞擊、數位化及幾何信息,從而讓用戶可在獨立的程序中進行模擬後的分析。
readout – 讀出包
實現了信號「堆積」(pile-up)的模擬,即用於模擬在數位化模塊中累積的輸出。
visualization – 可視化包
用於顯示探測器幾何、粒子徑跡、單步追蹤和碰撞,它也提供了與外部圖形系統銜接的可視化驅動接口。
g3tog4 – 幾何轉換包
可選包,用於在程序中讀取由 GEANT3 所產生的幾何描述。
G4 設計時只有 17 個包:16 個基本包和一個 g3tog4。至 10.3 版本,又逐漸增加了如下的包:
parameterisations – 參數化包
這個包作為幾何包(geometry)的一個補充,用於實現複雜的參數化幾何設置,比如相似幾何的多重複制,等等。自 3.0.0 版本引入。
analysis – 分析包
分析包用於將數位化碰撞、讀出等的內容以指定的外部工具輸出。最初,自 3.0.0 版本引入時只有針對 JAS 的接口,在 4.0.0 版本中被去除。隨著 G4模擬結果分析代碼的發展,從 9.5.0 版本中又重新引入了這個包,並逐漸豐富起來,包含了 hbook, root, csv, xml 等接口。
physics_lists – 物理列表包
作為運行包的補充,預定義了一些較通用的和常用的物理列表。自 8.2.0 版本引入。在 8.2.0 版本以前,在 G4社區曾收集了一批用戶所編寫的物理列表,這些物理列表後來經過梳理,合併到了G4 正式發行版本中。
error_propagation – 誤差傳遞包
作為追蹤包的補充,追蹤粒子在特定軌跡狀態下誤差的傳遞。自 9.0.0 版本引入。誤差傳遞在 G3 中是基於 EMC (Eurpeon Muon Collaboration) 的公式實現的。
externals – 外部包
包含了 G4整體所依賴的那些特殊的外部庫。G4最初的依賴 CLHEP庫需要獨立安裝,需要解決版本匹配等問題。自 9.5.0版本引入此包,將匹配版本的 CLHEP 等包合併到 G4 中。