文|梁佐佐

一:
要想熟練得使用Geant4,C++的基本知識(shí)是要掌握的,其學(xué)習(xí)參考教材可任意選,剛?cè)腴T(mén)的同學(xué)推薦比較薄的譚浩強(qiáng)版本《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》,網(wǎng)上資源也豐富,比如:https://blog.csdn.net/zdh1995/article/details/78215863,一個(gè)星期左右就能把基礎(chǔ)知識(shí)了解的差不多,然后再買(mǎi)本C++ primer(白皮的)有時(shí)間就慢慢看。在C++中,類(lèi)/對(duì)象可以看作是一種帶有很多自定義函數(shù)的數(shù)據(jù)類(lèi)型(像int,double等),這個(gè)概念本身簡(jiǎn)潔,但需要啃一啃C++基礎(chǔ)知識(shí)才印象深刻。類(lèi)是一種特殊的類(lèi)型,帶有成員函數(shù),成員變量(某一C++大佬是這么官方解釋的)。
好啦,讓我們回到要解決的問(wèn)題本身,“為什么我在B1SteppingAction.hh中已經(jīng)定義了fEventAction這個(gè)變量,但卻無(wú)法在B1SteppingAction.cc中正常使用fEventAction ->AddEdep()函數(shù)?”。
解決方案是:
1. ? 在B1SteppingAction.hh中定義fEventAction這個(gè)變量,注意fEventAction的數(shù)據(jù)類(lèi)型是B1EventAction;
2. ? ? 在直接定義fEventAction這個(gè)對(duì)象指針的類(lèi)(B1EventAction.hh)中,聲明AddEdep()這個(gè)函數(shù)。
用C++的語(yǔ)法解釋分析這個(gè)問(wèn)題,答案是:
1. fEventAction->AddEdep(),表明fEventAction是某一個(gè)對(duì)象(B1EventAction)的指針,而AddEdep()是該對(duì)象中聲明的一個(gè)public函數(shù);
2.B1SteppingAction.hh中聲明fEventAction時(shí),一定要先囊括B1EventAction這個(gè)對(duì)象/類(lèi),然后在private:中定義fEventAction,即B1EventAction*fEventAction;
3.? 在B1EventAction.hh中,聲明定義AddEdep()這個(gè)函數(shù)。
Geant4中具體的代碼表現(xiàn)為:

總結(jié)來(lái)看這個(gè)問(wèn)題:1)在調(diào)用某個(gè)對(duì)象指針的函數(shù)功能時(shí),確保該對(duì)象指針的聲明是合理的;2)G4中,SteppingAction中可以調(diào)用EventAction中的函數(shù)或變量,而EventAction中可以調(diào)用RunAction中的函數(shù)變量,即細(xì)節(jié)上的信息總是統(tǒng)計(jì)給上一級(jí)的沒(méi)那么細(xì)節(jié)的目標(biāo),具體的調(diào)用關(guān)系參見(jiàn)往期教程。
另外,Geant4.9.6版本與Geant4.10往后的版本相比較,最明顯的改動(dòng)是4.10后的“多線(xiàn)程RunManager”和4.10后的#include"G4SystemOfUnits.hh"。
二:
Geant4的學(xué)習(xí)入門(mén),兩三個(gè)月是需要的,熟練掌握B1例子至關(guān)重要,包括其中涉及的基本C++語(yǔ)法。然后過(guò)了這個(gè)階段后,就需要考慮怎樣發(fā)揮主觀能動(dòng)性去干實(shí)際的項(xiàng)目?通常的途徑包括:1)找學(xué)長(zhǎng)學(xué)姐要往屆的例子;2)學(xué)會(huì)谷歌檢索(關(guān)鍵詞當(dāng)然得英文),此公眾號(hào)后臺(tái)回復(fù)“學(xué)術(shù)”即可獲得教程,真是無(wú)比感謝那些無(wú)償作技術(shù)分享的人;3)多看Geant4自帶的例子。
ROOT同樣是開(kāi)源的數(shù)據(jù)分析工具,題主目前嘗試用ROOT畫(huà)一遍常見(jiàn)的SCI論文數(shù)據(jù)插圖,并將于今年年底前發(fā)送全部例子和代碼。ROOT的學(xué)習(xí)套路與G4一模一樣,大家堅(jiān)持。
