B2a实例学习记录

文章介绍了在B2a框架中如何基于hit和sensitivedetector(SD)实现对特定chamber能量的累加。首先,定义了hit和Hitcollection,然后通过设置SD与logicalVolume关联,获取step信息。在DetectorConstruction中锁定关键体积并创建SD。在TrackerSD中初始化Hitcollection并处理hits。最后,通过UserSteppingAction和SD的ProcessHits方法收集和统计能量沉积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B2a简介

只是把hit存到了hitcollection,只是统计了各自event结果,将每次event的运行结果存起来了,并没有做总的求和
在这里插入图片描述
在这里插入图片描述

如何在B2a的基础上,实现对某一个chamber的能量的累加

1 hit和SD(sensitive detector)

每一个step的能量沉积的结果就是一个hit。
在这里插入图片描述

2 Hitcollection

用来装hit的
在这里插入图片描述

3 sensitive detector的使用,ProcessHits

其实将某个物体设置为 sensitive detector之后,他就有点像真实实际的探测器了,程序就可以后续获取这个物体里面的相关信息了。也就是使用SD的第一步是要人为指定SD; SD必须和logicalVolume联系起来、

B1里面获取每一个step的信息是通过steppingAction函数来获取的,但是在B2里面是通过ProcessHits来实现hit的获取
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
####(a) 在DetectorConstruction里面,提前锁定要提取的物理信息所相关的体积
关键点记录,5个chamber,他们的logicalVolumne被整体的存在一个指针数组里面

DetectorConstruction.hh文件
//二级指针存放重复结构 logicalVolume
  G4LogicalVolume** fLogicChamber = nullptr; // pointer to the logical Chamber

DetectorConstruction.cc文件,5重复结构,公用一个logicalVolume名字

fLogicChamber[copyNo] =
              new G4LogicalVolume(chamberS,fChamberMaterial,"Chamber_LV",0,0,0);

DetectorConstruction.cc文件
探测器的名字

void DetectorConstruction::ConstructSDandField()
{
  // Sensitive detectors

//"/TrackerChamberSD";最后一个/后面的名字就是SD的名字探测器的名字
  G4String trackerChamberSDname = "/TrackerChamberSD";
  //实例化SD
  TrackerSD* aTrackerSD = new TrackerSD(trackerChamberSDname,
                                        "TrackerHitsCollection");
  G4SDManager::GetSDMpointer()->AddNewDetector(aTrackerSD);
  // Setting aTrackerSD to all logical volumes with the same name
  // of "Chamber_LV".connetc 建立的SD和要检测物理量的logicalvolume
  SetSensitiveDetector("Chamber_LV", aTrackerSD, true);
  G4AutoDelete::Register(fMagFieldMessenger);
}

####(b) 先定义Hit所要收集和存储的信息
定义hitcollection来装hit,使用的是G4HitsCollection,B5建立了多个SD和多个hit,
当需要统计不同类型的粒子的能量沉积的时候,就需要多个G4HitsCollection,
真正决定统计的物理量的不同,是靠建立G4HitsCollection。也就是一个SD可以对其建立多个SD

每一个G4HitsCollection需要给他一个名字,也就是colNam
该函数需要传两个参数,detName,是SD的名字
在这里插入图片描述

在TrackerHit.hh文件里面

//创建别名,之后实例化 collection 来庄hit的时候,就可以直接 new  TrackerHitsCollection即可
typedef G4THitsCollection<TrackerHit> TrackerHitsCollection;

//模拟的时候,会产生很多的hit,然后需要很多的实例化,这个函数就是用来释放内存的
extern G4ThreadLocal G4Allocator<TrackerHit>* TrackerHitAllocator;

不需要太纠结,就两个一块用就行。
注意这两个参数都在什么地方被调用即可,模仿别人的应用

在TrackerSD.cc文件里面
对TrackerHitsCollection进行了初始化

void TrackerSD::Initialize(G4HCofThisEvent* hce)
{
  // Create hits collection
  //TrackerHitsCollection类似vector
  fHitsCollection
    = new TrackerHitsCollection(SensitiveDetectorName, collectionName[0]);
 }

####(c) 自定义自己的SD,UserSteppingAction和SD统计信息的区别和联系
UserSteppingAction如何实现信息的采集
在这里插入图片描述

SD方法不需要去判断step是否有效以及判断step在不在要统计信息的volume里面,G4自己做了
在这里插入图片描述
在这里插入图片描述

collection调用,ReverrMc01案例SD里面定义多个hitcollection,
在这里插入图片描述

ProcesssHit是用来访问step,获取信息的
在这里插入图片描述

G4HCofThisEvent作用

G4HCofThisEvent是用来存hitCollection的,一个SD可能有多个hit。信息统计是以event为周期的。SD区别于userSteppingAction的很大的区别,一个event结束之后,可以通过event直接来获取hitCollection的每一个hit,那就先要用event访问每一个hitCollection,然后再获取到hitCollection里的hit。
在这里插入图片描述

使用方法
1.TrackerSD.cc文件里面

void TrackerSD::Initialize(G4HCofThisEvent* hce)
{
  // Create hits collection
  //TrackerHitsCollection类似vector
  fHitsCollection
    = new TrackerHitsCollection(SensitiveDetectorName, collectionName[0]);
    // SensitiveDetectorName :SD的名字 ,hitcollection的索引,如果一个SD有多个hitcollection
  // Add this collection in hce
  //告诉G4HCofThisEvent,现在要把hitcollection是fHitsCollection,
  //那么G4HCofThisEvent就可以来访问fHitsCollection了,这里只是初始化
  //是在EventAction.cc use it
  G4int hcID
    = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
  hce->AddHitsCollection( hcID, fHitsCollection );
}

4 stepMax的作用

保证粒子在SD里面至少走10多步,有时候SD太小,如果步长太大,可能走一两步反应就结束了,什么也统计不到
需要在主函数里面初始化

用下列初始化的前提是使用G4自带的physicilist
physicsList->RegisterPhysics(new G4StepLimiterPhysics());

5 如果要修改可视化的具体细节

修改 vis.mac即可

6 多线程

主函数里面
auto* runManager = G4RunManagerFactory::CreateRunManager();
G4int nThreads = 24;
runManager->SetNumberOfThreads(nThreads);

ActionInitialization.hh函数里面定义
void BuildForMaster() const override;  //对多线程情况初始化
然后 ActionInitialization.cc函数
void ActionInitialization::BuildForMaster() const
{
  SetUserAction(new RunAction);  //再度对RunAction初始化
}

7

获取某个物体的logicalVolume

  G4LogicalVolume* worldLV
    = G4LogicalVolumeStore::GetInstance()->GetVolume("World");

8 提取物理信息的四种方式

在这里插入图片描述

9 可视化设置 线形和表面绘制,世界可视化

在vis.mac里面注释和取消注释就可以在线形和表面表示之间切换

# Specify style (surface, wireframe, auxiliary edges,...)
/vis/viewer/set/style wireframe
/vis/viewer/set/auxiliaryEdge true
/vis/viewer/set/lineSegmentsPerCircle 100

10 查看已有的所有案例对某个函数的调用

会显示所有example里面用到这个函数二点语句,然后参考别人是怎么用的

输入
grep -r 函数名, 
如
grep -r G4BOX,

11 获取粒子的id

newHit->SetTrackID  (aStep->GetTrack()->GetTrackID());

在 TrackerSD.cc

//用来进入到每一个有效的step获取信息
G4bool TrackerSD::ProcessHits(G4Step* aStep,
                                     G4TouchableHistory*)
{
  // energy deposit
  G4double edep = aStep->GetTotalEnergyDeposit();

  if (edep==0.) return false;

  TrackerHit* newHit = new TrackerHit();

  newHit->SetTrackID  (aStep->GetTrack()->GetTrackID());
  newHit->SetChamberNb(aStep->GetPreStepPoint()->GetTouchableHandle()
                                               ->GetCopyNumber());
  newHit->SetEdep(edep);
  newHit->SetPos (aStep->GetPostStepPoint()->GetPosition());

  //fHitsCollection在这个实例里面是hitCollection,use for containing hits
  fHitsCollection->insert( newHit );

  //newHit->Print();

  return true;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值