#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.
	}
}