GEANT4学习 第三节 B2中的SD 敏感探测器 1

您所在的位置:网站首页 能量沉积和能量损失区别 GEANT4学习 第三节 B2中的SD 敏感探测器 1

GEANT4学习 第三节 B2中的SD 敏感探测器 1

2023-09-25 11:38| 来源: 网络整理| 查看: 265

GEANT4学习 第三节 B2中的SD 敏感探测器 1

SD探测器是G4里面比较常用的一个类,在我们领域还是非常重要的。

在之前,read-out的工作都是通过自己写step发生点的判断,然后计算event的能量沉积来输出沉积能量谱(实质上就是自己写的SD探测器)。

这一部分呢,我们尝试通过B2a这个例子,来使用SD探测器read-out。

1. B2 README固定靶实验

README中大概讲了这么几个事情:

1.1几何:

一个靶和六个电离室,都是圆柱体。 这个粒子包涵磁场(这一部分我不懂),通过交互命令可以来设置场强。 在B2中,使用了B2TrackerSD类,并注册了一个逻辑体作为探测器。 同样的,靶和电离室的材料也可以通过交互命令来更改。

1.2物理列表

和B1不同,B2使用的是FTFP_BERT。

1.3用户初始化

没啥可讲的

1.4初始粒子产生

还是G4ParticleGun这个类,这个和B1一样。这里提一句,我们组用的比较多的还是GPS来写源,更改更加方便。GPS在G4别的例子里面也有。

1.5探测器响应

使用 HIT 来记录能量的沉积

在这个例子中,电离室被定义成了SD,

那么,某一step中的一个 HIT 就是4个信息的集合: 1.track ID 2.电离室号 3.step内的能量沉积 4.能量沉积位置。

B2TrackSD::ProcessHits()会在粒子输运过程中的每一个step来实例化B2TrackHit的对象,即一个HIT。然后这个HIT会被收集到HitsCollection里面,

HitsCollection会在event结束时被打印在日志文件中。

2.main函数

和B1的区别只有一个物理列表是不同的。

运行还是一样,进入init_vis.mac,然后vis.mac,然后beamon

还是跟着代码的逻辑来,第一个类是B2aDetectorConstruction

3.B2aDetectorConstruction

我们先列一下这个类里面所有的参数和函数,这里我们稍微粗糙点,不管他们是公有还是私有的了。

序号函数备注1B2aDetectorConstruction构造函数2~B2aDetectorConstruction析构函数3Construct4ConstructSDandField5SetTargetMaterial6SetChamberMaterial7SetMaxStep8SetCheckOverlaps9DefineMaterials10DefineVolumes 序号参数备注1fNbOfChambers电离室的个数2fLogicTarget靶的逻辑体指针3fLogicChamber电离室逻辑体指针4fTargetMaterial靶材料指针5fChamberMaterial电离室材料指针6fStepLimitstep limits 的指针7fMessengerB2aDetectorMessenger的对象8fMagFieldMessenger磁场Messenger对象9fCheckOverlapsoverlap检查选项

构造函数和析构函数就不想说了。

B2a为了使用交互命令来修改探测器的几何结构,特意写了一个B2aDetectorMessenger,几何结构通过fMessenger来实现,这也让B2aDetectorConstruction显得有一点复杂,仔细梳理应该还是没问题的。

主要的还是 B2aDetectorConstruction::ConstructSDandField这个函数。首先,这个函数在G4VUserDetectorConstruction里面也有,猜测G4VUserDetectorConstruction的构造函数会首先检查并调用该函数。

我们把这个函数拿出来看一下:

void B2aDetectorConstruction::ConstructSDandField() { // Sensitive detectors G4String trackerChamberSDname = "B2/TrackerChamberSD"; B2TrackerSD* aTrackerSD = new B2TrackerSD(trackerChamberSDname, "TrackerHitsCollection"); //实例化了一个TrackSD对象 G4SDManager::GetSDMpointer()->AddNewDetector(aTrackerSD); //添加探测器 // Setting aTrackerSD to all logical volumes with the same name // of "Chamber_LV". SetSensitiveDetector("Chamber_LV", aTrackerSD, true); //设置探测器 // 这三个参数分别为 SD的逻辑体名字,一个G4VSensitiveDetector对象指针,以及是否多线程运行;最后一个参数可以省略 // Create global magnetic field messenger. // Uniform magnetic field is then created automatically if // the field value is not zero. G4ThreeVector fieldValue = G4ThreeVector(); fMagFieldMessenger = new G4GlobalMagFieldMessenger(fieldValue); fMagFieldMessenger->SetVerboseLevel(1); // Register the field messenger for deleting G4AutoDelete::Register(fMagFieldMessenger); }

在这个类里面,需要将探测器设置一下,即

SetSensitiveDetector("Chamber_LV", aTrackerSD, true);

这一句话。而这一句话的aTrackerSD是B2TrackerSD的一个对象,我们需要去看这个类写了些什么。

4.B2TrackerSD

这个类里面的函数和参数如下:

序号函数备注1B2TrackerSD构造函数2~B2TrackerSD析构函数3Initialize4ProcessHits这个函数需要返回bool5EndOfEvent 序号参数备注1fHitsCollectionB2TrackerHitsCollection类的指针 4.1 B2TrackerSD 构造函数 B2TrackerSD::B2TrackerSD(const G4String& name, const G4String& hitsCollectionName) : G4VSensitiveDetector(name), fHitsCollection(NULL) { collectionName.insert(hitsCollectionName); }

构造的时候插了一个hitsCollectionName到collectionName里面

但我没找到collectionName在哪里定义的。

4.2 Initialize() void B2TrackerSD::Initialize(G4HCofThisEvent* hce) { // Create hits collection fHitsCollection = new B2TrackerHitsCollection(SensitiveDetectorName, collectionName[0]); //这里实例化了B2TrackerHitsCollection // Add this collection in hce G4int hcID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]); hce->AddHitsCollection( hcID, fHitsCollection ); } 4.3 ProcessHits() G4bool B2TrackerSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) { // energy deposit G4double edep = aStep->GetTotalEnergyDeposit(); if (edep==0.) return false; B2TrackerHit* newHit = new B2TrackerHit(); newHit->SetTrackID (aStep->GetTrack()->GetTrackID()); newHit->SetChamberNb(aStep->GetPreStepPoint()->GetTouchableHandle() ->GetCopyNumber()); newHit->SetEdep(edep); newHit->SetPos (aStep->GetPostStepPoint()->GetPosition()); fHitsCollection->insert( newHit ); //newHit->Print(); return true; } 4.4 EndOfEvent()

这个是输出信息了

void B2TrackerSD::EndOfEvent(G4HCofThisEvent*) { if ( verboseLevel>1 ) { G4int nofHits = fHitsCollection->entries(); G4cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3