#include "G4UIdirectory.hh" #include "G4UIcmdWithAString.hh" #include "G4UIcmdWithADoubleAndUnit.hh" #include "G4HadronicProcessStore.hh" #include "G4MuonMinus.hh" #include "G4ProcessTable.hh" #include "G4HadronicProcess.hh" #include "MyPhysicsMessenger.hh" #include "MyMuonMinusAtomicCapture.hh" #include "MyEmCaptureCascade.hh" #include "G4HadronicProcess.hh" #include "G4HadronicInteraction.hh" #include "G4ParticleDefinition.hh" #include "G4HadronicProcessType.hh" #include "G4ThreadLocalSingleton.hh" #include "G4ProcessManager.hh" #include "G4HadronicInteractionRegistry.hh" #include "G4RunManager.hh" #include "G4ParticleTable.hh" #include "G4GenericMuonicAtom.hh" #include "G4MuonicAtomDecay.hh" MyPhysicsMessenger::MyPhysicsMessenger(MyPhysics* phy) : fMyPhysics(phy) { fDirectory = new G4UIdirectory("/EmCaptureCascade/"); fDirectory->SetGuidance("UI commands for setting emcapture data"); fDetDirectory = new G4UIdirectory("/EmCaptureCascade/mudirac/"); fDetDirectory->SetGuidance("Use Mudirac Data Or Not"); fMuMinusProcessCmd = new G4UIcmdWithABool("/EmCaptureCascade/mudirac/useData", this); fMuMinusProcessCmd->SetGuidance("Use Mudirac Data Or Not"); fMuMinusProcessCmd->AvailableForStates(G4State_PreInit,G4State_Idle); } MyPhysicsMessenger::~MyPhysicsMessenger() { delete fMuMinusProcessCmd; delete fDirectory; delete fDetDirectory; } void MyPhysicsMessenger::SetNewValue(G4UIcommand* command,G4String newValue) { G4bool value = fMuMinusProcessCmd->GetNewBoolValue(newValue); fBoolValue = value; } void MyPhysicsMessenger::Work() { if (fBoolValue) { // 获取mu-粒子,并添加过程 // Get mu- ParticleDefinition, then add MyMuonMinusAtomicCapture to mu-'s process manager. G4MuonMinus* muMinus = G4MuonMinus::MuonMinus(); if (muMinus) { G4ProcessManager* processManager = muMinus->GetProcessManager(); if (processManager) { MyMuonMinusAtomicCapture* myMinusMuonicCapture = new MyMuonMinusAtomicCapture("myMuonMinusAtomicCapture"); //跃迁之后,考虑缪子原子,构建Muonic Atom并为其注册一些过程 G4GenericMuonicAtom* genericMuonicAtom = G4GenericMuonicAtom::Definition(); G4ParticleTable* pt = G4ParticleTable::GetParticleTable(); pt->SetGenericMuonicAtom(genericMuonicAtom); G4ProcessManager* pManager = new G4ProcessManager(genericMuonicAtom); genericMuonicAtom->SetProcessManager(pManager); pManager->AddRestProcess(new G4MuonicAtomDecay); if (myMinusMuonicCapture) { processManager->AddRestProcess(myMinusMuonicCapture); } else { G4cout << "MyMuonMinusAtomicCapture construction process failed. exit!" << G4endl; exit(0); } } else { G4cout << "Can't get ProcessManager of mu-" << G4endl; exit(0); } G4cout << "添加成功!" << G4endl; } } else { //不需要执行任何操作 //We needn't do anything. } }