文|梁佐佐
一:
要想熟练得使用Geant4,C++的基本知识是要掌握的,其学习参考教材可任意选,刚入门的同学推荐比较薄的谭浩强版本《C++面向对象程序设计》,网上资源也丰富,比如:https://blog.csdn.net/zdh1995/article/details/78215863,一个星期左右就能把基础知识了解的差不多,然后再买本C++ primer(白皮的)有时间就慢慢看。在C++中,类/对象可以看作是一种带有很多自定义函数的数据类型(像int,double等),这个概念本身简洁,但需要啃一啃C++基础知识才印象深刻。类是一种特殊的类型,带有成员函数,成员变量(某一C++大佬是这么官方解释的)。
好啦,让我们回到要解决的问题本身,“为什么我在B1SteppingAction.hh中已经定义了fEventAction这个变量,但却无法在B1SteppingAction.cc中正常使用fEventAction ->AddEdep()函数?”。
解决方案是:
1. 在B1SteppingAction.hh中定义fEventAction这个变量,注意fEventAction的数据类型是B1EventAction;
2. 在直接定义fEventAction这个对象指针的类(B1EventAction.hh)中,声明AddEdep()这个函数。
用C++的语法解释分析这个问题,答案是:
1. fEventAction->AddEdep(),表明fEventAction是某一个对象(B1EventAction)的指针,而AddEdep()是该对象中声明的一个public函数;
2.B1SteppingAction.hh中声明fEventAction时,一定要先囊括B1EventAction这个对象/类,然后在private:中定义fEventAction,即B1EventAction*fEventAction;
3. 在B1EventAction.hh中,声明定义AddEdep()这个函数。
Geant4中具体的代码表现为:
总结来看这个问题:1)在调用某个对象指针的函数功能时,确保该对象指针的声明是合理的;2)G4中,SteppingAction中可以调用EventAction中的函数或变量,而EventAction中可以调用RunAction中的函数变量,即细节上的信息总是统计给上一级的没那么细节的目标,具体的调用关系参见往期教程。
另外,Geant4.9.6版本与Geant4.10往后的版本相比较,最明显的改动是4.10后的“多线程RunManager”和4.10后的#include"G4SystemOfUnits.hh"。
二:
Geant4的学习入门,两三个月是需要的,熟练掌握B1例子至关重要,包括其中涉及的基本C++语法。然后过了这个阶段后,就需要考虑怎样发挥主观能动性去干实际的项目?通常的途径包括:1)找学长学姐要往届的例子;2)学会谷歌检索(关键词当然得英文),此公众号后台回复“学术”即可获得教程,真是无比感谢那些无偿作技术分享的人;3)多看Geant4自带的例子。
ROOT同样是开源的数据分析工具,题主目前尝试用ROOT画一遍常见的SCI论文数据插图,并将于今年年底前发送全部例子和代码。ROOT的学习套路与G4一模一样,大家坚持。
喜欢的话,分享一下吧~^o^~
网友评论