加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Geant4编程点滴

(2014-04-08 14:45:24)
标签:

geant4

平行

root

几何

Geant4平行世界编程


1. 头文件需要包括

 

#include "G4VUserParallelWorld.hh"

class ParallelWorld public G4VUserParallelWorld
{ 
 public:
    ParallelWorld(G4String worldName);
    virtual ~ParallelWorld();

    virtual void ConstructSD();

 private
    virtual void Construct();
}

 

有两个虚函数,其中一个用来构建几何一个构建灵敏探测器,后者不是必须的。

 

2. 构造函数的代码段,获取平行世界的名字和指针。


void ParallelWorld::Construct()

{

      G4VPhysicalVolume* GhostWorld GetWorld();

      G4cout << "ghost World Name= << GhostWorld->GetName() << G4endl;

fworldLogic GhostWorld->GetLogicalVolume();

}

 

3. 构建灵敏探测器。下面的代码使用了原生多功能探测器,最后一行是设置探测器到逻辑体。

void ParallelWorld::ConstructSD()

{

       G4SDManager::GetSDMpointer()->SetVerboseLevel(1);

       G4MultiFunctionalDetector* MultiFD new G4MultiFunctionalDetector("ghost");

       G4VPrimitiveScorer* primitiv new G4PSDoseDeposit("dose");

       MultiFD->RegisterPrimitive(primitiv);

G4SDManager::GetSDMpointer()->AddNewDetector(MultiFD);

//SetSensitiveDetector(fScoreLogic,MultiFD);

}

 

最后一行注释了,可以在其它函数中这样设置。

  

    G4VSensitiveDetector* sd G4SDManager::GetSDMpointer()

     ->FindSensitiveDetector("ghost");

     fScoreLogic->SetSensitiveDetector(sd);

 

3.  必须在物理列表子类的成员函数ConstructProcess()中添加AddScoringProcess()。

 

void PhysicsList::ConstructProcess()

{

    AddTransportation();

    fEmPhysicsList->ConstructProcess();

    AddScoringProcess();

}

 

 

include "G4ParallelWorldScoringProcess.hh"


void PhysicsList::AddScoringProcess()

{

    G4ParallelWorldScoringProcess* theParallelWorldScoringProcess

        new G4ParallelWorldScoringProcess("ParaWorldScoringProc");

    theParallelWorldScoringProcess->SetParallelWorld("ParallelScoringWorld");

    theParticleIterator->reset();

while((*theParticleIterator)()){ 

    G4ParticleDefinition* particle theParticleIterator->value();

        if(!particle->IsShortLived()){

           G4ProcessManager* pmanager particle->GetProcessManager();

           pmanager->AddProcess(theParallelWorldScoringProcess);                         

           pmanager->SetProcessOrderingToLast(theParallelWorldScoringProcess,idxAtRest);

           pmanager->SetProcessOrdering(theParallelWorldScoringProcess,idxAlongStep,1);          

           pmanager->SetProcessOrderingToLast(theParallelWorldScoringProcess,idxPostStep);

}}}

 

4. 主程序中的代码

 

    G4VUserDetectorConstruction* detector new DetectorConstruction;

    detector->RegisterParallelWorld(new ParallelWorld("ParallelScoringWorld"));

    runManager->SetUserInitialization(detector);


5. 可视化场景中显示平行世界,宏命令:

Draw geometry:

/vis/drawVolume worlds

 

 Geant4内置分析工具


运行开始时创建一个二维直方图

 

void RunAction::BeginOfRunAction(const G4Run* aRun)

{

    G4AnalysisManager* analysisManager G4AnalysisManager::Instance();

    analysisManager->SetVerboseLevel(0);

    analysisManager->SetFileName(fFileName);

 

    if(!fCreateH2) analysisManager->CreateH2("h2d","dose",NX,0,NY,NZ,0,NZ);

    else analysisManager->SetH2(0,NY,0,NY,NZ,0,NZ);

    fCreateH2 true;

    analysisManager->OpenFile();

}

 

保存文件:

 

void RunAction::save()

{

    G4AnalysisManager* analysisManager G4AnalysisManager::Instance();

    analysisManager->Write();

    analysisManager->CloseFile();

}

 

7. 获取平行世界对象的指针,传递变量


    G4RunManager* mgr G4RunManager::GetRunManager();

    const G4VUserDetectorConstruction* vdet mgr->GetUserDetectorConstruction();

    const G4VUserParallelWorld* vpar vdet->GetParallelWorld(0);

    ParallelWorld* para=(ParallelWorld*)vpar;


 

8记录数据,下面的代码把数据存入二维柱状图,copy编号按行列转二维。


 

void EventAction::BeginOfEventAction(const G4Event* evt)

{

   if (fHHCID==-1) {

      fHHCID G4SDManager::GetSDMpointer()->GetCollectionID("ghost/dose");

}}

 

void EventAction::EndOfEventAction(const G4Event* evt)

{

   G4AnalysisManager* analysisManager G4AnalysisManager::Instance();

   G4HCofThisEvent* HCE evt->GetHCofThisEvent();

   if (!HCE)

      G4ExceptionDescription msg;

        msg << "No hits collection of this event found.\n";

        G4Exception("EventAction::EndOfEventAction()","Code001", JustWarning,           msg);

        return;

    }

    G4THitsMap* evtMap1 static_cast*>(HCE->GetHC(fHHCID));

    G4double dose 0.;

    std::map::iterator itr;

    for (itr evtMap1->GetMap()->begin(); itr != evtMap1->GetMap()->end(); itr++)

    {

       G4int copyNb  (itr->first);

       G4double *(itr->second);

       dose += d;

       analysisManager->FillH2(0,(G4int)(copyNb/NZ),copyNb%NZ,d/gray);

}}

 

使用ROOT画图

 

9ROOT解释执行的C++程序所以写一个程序 .c打开运行,或在命令行状态直接输入表达式。下面是一个简单的实例代码,简单的只要写在大括号内。

 

{

   TCanvas *c new TCanvas("H2D","TH2D Drawing", 0, 0,1280,728);

   TFile f("camera100000.root");      //文件

   TH2D* h2d (TH2D*)f->Get("h2d");  // book()的名字

   c.Divide(2,2);

   c.cd(1);

      TH1D* h1= h2d->ProjectionX(); 

      h1->GetXaxis()->CenterTitle();

      h1>SetYTitle("dose"); 

      h1->GetYaxis()->CenterTitle();

      h1->SetMinimum(0);

      h1->SetStats(kFALSE);

      h1->GetYaxis()->SetNoExponent(kTRUE);

      h1->Draw("LP*"); 

   c.cd(2);

      TH1D* hy h2d->ProjectionY(); 

      h2->SetMinimum(0);

      h2->SetStats(kFALSE);

      h2->GetYaxis()->SetNoExponent(kTRUE);

      h2->Draw("LP*");

    c.cd(3);

      h2d->SetStats(kFALSE);

      h2d->Draw("CONT"); //"SCAT","BOX","ARR","COLZ","CONTZ","CONT1"-2-3

    c.cd(4);

      h2d->Draw("SURF2"); //"SURF"-1-2-3-4-5,"LOGO"-0-1-2,+Z      

}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有