在RunAction中如何取得PrimaryGeneratorAction中发射的粒子信息? - 核能革新 ChinaNet
热图推荐
    查看: 6912|回复: 1
    打印 上一主题 下一主题

    在RunAction中如何取得PrimaryGeneratorAction中发射的粒子信息?

    [复制链接]

    39

    主题

    49

    帖子

    152

    积分

    QQ游客

    积分
    152
    跳转到指定楼层
    楼主
    发表于 2015-4-8 09:57:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    我的做法是这样的:
    SteppingAction里面判断一下step号(track->GetCurrentStepNumber),挑step号为1的那个,就有初始粒子信息了;
    然后EventAction和RunAction里面就能利用SteppingAction里得到的初始粒子信息了(可能中间需要设几个变量倒一倒)。

    应该还有别的做法。


    转自www.52mc.net
    回复

    使用道具 举报

    39

    主题

    49

    帖子

    152

    积分

    QQ游客

    积分
    152
    沙发
     楼主| 发表于 2015-4-8 09:57:55 | 只看该作者
    本文仅为在蒙卡学术论坛(52mc.net)答复相关问题使用,任何人未经作者本人许可不得转载至其他论坛,作者保留追究转载者相关责任的权利!
    [sell=10]这些调用都可以直接通过类的调用来实现,比如你把PGAction作为RunAction的一个参数  
    但是,我觉得你这个问题有些奇怪,光只是在runAction里面调用PGAction的信息没有意义  
    RunAction是每次beamOn的开始和结束的时候各调用一次的,而PGAction是每个event调用一次的  
    如果你在RunAction里面调用PGAction的信息的话,只能得到最后一个event对应的PGAction信息  
    除非你再在其他类,比如SteppingAction里面调用RunAction  
    如果你是想要看每一个event对应的PGAction信息的话,我建议你在RunAction里面设定一个public的数组  
    然后在PGAction里面访问RunAction里面的这个public数组,把每次的PG信息写入这个数组  
    在Run结束的时候由EndOfRunAction把这个数组输出  

    举例如下:  
    首先需要在main.cc里面定义PGAction是RunAction的函数  
    testRunAction* testRun = new testRunAction;  
    runManager->SetUserAction(testRun);   
    runManager->SetUserAction(new testPrimaryGeneratorAction(testRun));    //这就是把一个RunAction类型的指针作为PGAction的变量了  

    然后需要在PGAction.hh文件里同样定义PGAction的构造器  
    class testPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction  
    {  
      public:  
        testPrimaryGeneratorAction(testRunAction*);     
      ~testPrimaryGeneratorAction();  

      public:  
        testRunAction* theRun;  //这是为testRunAction类生成一个实例,作为PGAction的变量  

      private:  
        ……  
    };  

    然后你需要在PGAction.cc里面为theRun赋值  
    testPrimaryGeneratorAction::testPrimaryGeneratorAction(testRunAction* tRun):theRun(tRun)   
    {  
    ……  
    }  

    然后你就可以直接在PGAction.cc里面访问RunAction里面设定为public的函数和变量了  
    void testPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)  
    {  
    ……  
    particleGun->SetParticlePosition();  
    ……  
    i=theRun->EventNumber;      //EventNumber是在RunAction.hh里面定义为public的整型变量,是用来统计event数的  
    theRun->theParticleEnergy=particleGun->GetParticleEnergy;  //theParticleEnergy是在RunAction.hh里面定义为public的G4double型数组变量,是用来记录每次发射粒子能量的  
    ……  
    theRun->EventNumber++;  //将event计数+1  
    ……  
    particleGun->GeneratePrimaryVertex(anEvent);  
    }  

    然后你就可以在RunAction的EndOfRunAction里面输出每次发射的粒子信息了  
    void testRunAction::EndOfRunAction(const G4Run* )  
    {  
    ……  
    fstream datafile;  
    datafile.open("articleEnergy.dat",ios:ut|ios::app);  
    datafile<<"下面输出本次模拟中每次发射的粒子能量信息"<<endl;  
    datafile<<"Event计数"<<"\t"<<"粒子能量"<<endl;  
    for (i=0;i++;i<EventNumber)  
    {  
      datafile<<i+1<<"\t"<<articleEnergy<<endl;  
    }  
    datafile.close;  
    ……  
    }  

    这样运行结束后你只要打开ParticleEnergy.dat文件就可以看到每次发射的粒子能量了  
    同样,你可以多定义几个数组记录粒子的其他信息 [/sell]
    回复 支持 反对

    使用道具 举报

      关注我们
    • 微信公众号:
    • NuclearNet
    • 扫描二维码加关注

    Powered by Discuz! X3.2 © 2001-2013 Comsenz Inc.

    联系我们|网站声明|中国核网-核能领域第一垂直门户网站

    快速回复 返回顶部 返回列表