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;
}