提纲一、SensitiveDetector二、G4MultiFunctionalDetector三、VectorMethod四、Debug方法介绍五、文件输出技巧六、散射实验编程算法技巧第一页,共三十五页。G4Vhit代表一次碰撞。它可以看作是sensitivedetector区域内粒子物理作用的“快照”(snapshot)。可以通过G4Step对象保存粒子信息。G4Vhit是基类,实际应用中必须由用户派生,它有两个虚拟函数,Draw()Print()(个人理解是,在Sensitviedetector里头一些碰撞感兴趣,通过Draw()可以将感兴趣的碰撞分离draw出!同理Print()做输出)一、SensitiveDetector第二页,共三十五页。G4VsensitiveDetector类模拟探测器。其原理是在粒子输运过程中通过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;};typedefG4THitsCollectionExN02TrackerHitsCollection;externG4AllocatorExN02TrackerHitAllocator;inlinevoid*ExN02TrackerHit::operatornew(size_t){void*aHit;aHit=(void*)ExN02TrackerHitAllocator.MallocSingle();returnaHit;}inlinevoidExN02TrackerHit::operatordelete(void*aHit){...