Geant4系列讲座四

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

提纲一、SensitiveDetector二、G4MultiFunctionalDetector三、VectorMethod四、Debug方法介绍五、文件输出技巧六、散射实验编程算法技巧G4Vhit代表一次碰撞。它可以看作是sensitivedetector区域内粒子物理作用的“快照”(snapshot)。可以通过G4Step对象保存粒子信息。G4Vhit是基类,实际应用中必须由用户派生,它有两个虚拟函数,Draw()Print()(个人理解是,在Sensitviedetector里头一些碰撞感兴趣,通过Draw()可以将感兴趣的碰撞分离draw出!同理Print()做输出)一、SensitiveDetectorG4VsensitiveDetector类模拟探测器。其原理是在粒子输运过程中通过Step创建一系列hit对象。G4VsensitiveDetector类的ProcessHits()方法使用G4Step对象作为输入。G4VsensitiveDetector类又三个主要的虚拟函数:G4boolProcessHits(G4Step*,G4TouchableHistory*)VoidInitialize(G4HCofThisEvent*)VoidEndOfEvent(G4HCofThisEvent*)当粒子输运到sensitivedetector的指针指到对应的G4LogicalVolume时,G4SteppingManager调用该方法。该方法又两个参数,头一个参数传递的是当前Step指针,通过当前Step指针可以得到当前Step粒子信息;第二个参数传递的是G4TouchableHistory对象指针。在ReadOfGeometry中使用G4boolProcessHits(G4Step*,G4TouchableHistory*)VoidInitialize(G4HCofThisEvent*)每一次Event开始时调用该方法,此方法传递的参数为G4HcofThisEvent类指针,Event的Hit可以存放其中(个人理解是类似指针数组的东西,Hit就是存放的内容,而G4HCofThisEvent就是一个指向Hit的指针数组,通过这些指针就能找到对应的Hit)。VoidEndOfEvent(G4HCofThisEvent*)Event结束时调用该方法,此方法的参数也为G4HCofThisEvent类指针,可以用来做输出。注意,如果这里输出,那么意味着每一Event完毕都会有个输出,具体输出内容视程序而定。比如每次Event在sensitivedetector中产生多次碰撞,要记录每次损失能量大于40keV的碰撞,那么就必须在Hit中编程,记录损失能大于40keV的碰撞(多个Hit对象)然后用G4HCofThisEvent“组装”起来。G4SDManager*SDman=G4SDManager::GetSDMpointer();G4StringtrackerChamberSDname=ExN02/TrackerChamberSD;ExN02TrackerSD*aTrackerSD=newExN02TrackerSD(trackerChamberSDname);SDman-AddNewDetector(aTrackerSD);logicChamber-SetSensitiveDetector(aTrackerSD);以例子N02为例:在:ExN02DetectorConstruction.cc的Construct()方法中对SDManger实例化,并通过LogcialVolume指定SensitiveDetector#预处理命令classExN02TrackerHit:publicG4VHit{public:ExN02TrackerHit();~ExN02TrackerHit();ExN02TrackerHit(constExN02TrackerHit&);constExN02TrackerHit&operator=(constExN02TrackerHit&);G4intoperator==(constExN02TrackerHit&)const;inlinevoid*operatornew(size_t);inlinevoidoperatordelete(void*);voidDraw();voidPrint();public:voidSetTrackID(G4inttrack){trackID=track;};voidSetChamberNb(G4intchamb){chamberNb=chamb;};voidSetEdep(G4doublede){edep=de;};voidSetPos(G4ThreeVectorxyz){pos=xyz;};G4intGetTrackID(){returntrackID;};G4intGetChamberNb(){returnchamberNb;};G4doubleGetEdep(){returnedep;};G4ThreeVectorGetPos(){returnpos;};ExN02TrackerHit.hhprivate:G4inttrackID;G4intchamberNb;G4doubleedep;G4ThreeVectorpos;};typedefG4THitsCollectionExN02TrackerHitExN02TrackerHitsCollection;externG4AllocatorExN02TrackerHitExN02TrackerHitAllocator;inlinevoid*ExN02TrackerHit::operatornew(size_t){void*aHit;aHit=(void*)ExN02TrackerHitAllocator.MallocSingle();returnaHit;}inlinevoidExN02TrackerHit::operatordelete(void*aHit){ExN02TrackerHitAllocator.FreeSingle((ExN02TrackerHit*)aHit);}#endifExN02TrackerHit.hh#预处理命令G4AllocatorExN02TrackerHitExN02TrackerHitAllocator;ExN02TrackerHit::ExN02TrackerHit(){}ExN02TrackerHit::~ExN02TrackerHit(){}ExN02TrackerHit::ExN02TrackerHit(constExN02TrackerHit&right):G4VHit(){trackID=right.trackID;chamberNb=right.chamberNb;edep=right.edep;pos=right.pos;}constExN02TrackerHit&ExN02TrackerHit::operator=(constExN02TrackerHit&right){trackID=right.trackID;chamberNb=right.chamberNb;edep=right.edep;pos=right.pos;return*this;}ExN02TrackerHit.ccG4intExN02TrackerHit::operator==(constExN02TrackerHit&right)const{return(this==&right)?1:0;}voidExN02TrackerHit::Draw(){G4VVisManager*pVVisManager=G4VVisManager::GetConcreteInstance();if(pVVisManager){G4Circlecircle(pos);circle.SetScreenSize(2.);circle.SetFillStyle(G4Circle::filled);G4Colourcolour(1.,0.,0.);G4VisAttributesattribs(colour);circle.SetVisAttributes(attribs);pVVisManager-Draw(circle);}}voidExN02TrackerHit::Print(){G4couttrackID:trackIDchamberNb:chamberNbenergydeposit:G4BestUnit(edep,Energy)position:G4BestUnit(pos,Length)G4endl;}ExN02TrackerHit.cc#ifndefExN02TrackerSD_h#defineExN02TrackerSD_h1#includeG4VSensitiveDetector.hh#includeExN02TrackerHit.hhclassG4Step;classG4HCofThisEvent;classExN02TrackerSD:publicG4VSensitiveDetector{public:ExN02TrackerSD(G4String);~ExN02TrackerSD();voidInitialize(G4HCofThisEvent*);G4boolProcessHits(G4Step*,G4TouchableHistory*);voidEndOfEvent(G4HCofThisEvent*);private:ExN02TrackerHitsCollection*trackerCollection;};#endifExN02TrackerSD.hhExN02TrackerSD::ExN02TrackerSD(G4Stringname):G4VSensitiveDetector(name){G4StringHCname;collectionName.insert(HCname=trackerCollection);}ExN02TrackerSD::~ExN02TrackerSD(){}voidExN02TrackerSD::Initialize(G4HCofThisEvent*HCE){trackerCollection=newExN02TrackerHitsCollection(SensitiveDetectorName,collectionName[0]);staticG4intHCID=-1;if(HCID0){HCID=G4SDManager::GetSDMpointer()-GetCollectionID(collectionName[0]);}HCE-AddHitsCollection(HCID,trackerCollection);}G4boolExN02TrackerSD::ProcessHits(G4Step*aStep,G4TouchableHistory*){G4doubleedep=aStep-GetTotalEnergyDeposit();if(edep==0.)returnfalse;ExN02TrackerSD.ccExN02TrackerHit*newHit=newExN02TrackerHit();newHit-SetTrackID(aStep-GetTrack()-GetTrackID());newHit-SetChamberNb(aStep-GetPreStepPoint()-GetTouchableHand

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功