File indexing completed on 2026-05-04 08:06:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include "DetectorMessenger.hh"
0030
0031 #include "DetectorConstruction.hh"
0032
0033 #include "G4UIcmdWithADoubleAndUnit.hh"
0034 #include "G4UIcmdWithAString.hh"
0035 #include "G4UIcmdWithoutParameter.hh"
0036 #include "G4UIdirectory.hh"
0037
0038
0039
0040 DetectorMessenger::DetectorMessenger(DetectorConstruction* Det)
0041 : G4UImessenger(),
0042 fDetector(Det),
0043 fTestemDir(0),
0044 fDetDir(0),
0045 fMaterCmd(0),
0046 fSizeCmd(0),
0047 fMagFieldCmd(0),
0048 fMaxStepCmd(0),
0049 fUpdateCmd(0)
0050 {
0051 fTestemDir = new G4UIdirectory("/testem/");
0052 fTestemDir->SetGuidance(" detector control.");
0053
0054 fDetDir = new G4UIdirectory("/testem/det/");
0055 fDetDir->SetGuidance("detector construction commands");
0056
0057 fMaterCmd = new G4UIcmdWithAString("/testem/det/setMat", this);
0058 fMaterCmd->SetGuidance("Select material of the box.");
0059 fMaterCmd->SetParameterName("choice", false);
0060 fMaterCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
0061
0062 fSizeCmd = new G4UIcmdWithADoubleAndUnit("/testem/det/setSize", this);
0063 fSizeCmd->SetGuidance("Set size of the box");
0064 fSizeCmd->SetParameterName("Size", false);
0065 fSizeCmd->SetRange("Size>0.");
0066 fSizeCmd->SetUnitCategory("Length");
0067 fSizeCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
0068
0069 fMagFieldCmd = new G4UIcmdWithADoubleAndUnit("/testem/det/setField", this);
0070 fMagFieldCmd->SetGuidance("Define magnetic field.");
0071 fMagFieldCmd->SetGuidance("Magnetic field will be in Z direction.");
0072 fMagFieldCmd->SetParameterName("Bz", false);
0073 fMagFieldCmd->SetUnitCategory("Magnetic flux density");
0074 fMagFieldCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
0075
0076 fUpdateCmd = new G4UIcmdWithoutParameter("/testem/det/update", this);
0077 fUpdateCmd->SetGuidance("Update calorimeter geometry.");
0078 fUpdateCmd->SetGuidance("This command MUST be applied before \"beamOn\" ");
0079 fUpdateCmd->SetGuidance("if you changed geometrical value(s).");
0080 fUpdateCmd->AvailableForStates(G4State_Idle);
0081
0082 fMaxStepCmd = new G4UIcmdWithADoubleAndUnit("/testem/tracking/stepMax", this);
0083 fMaxStepCmd->SetGuidance("Set max allowed step size");
0084 fMaxStepCmd->SetParameterName("Size", false);
0085 fMaxStepCmd->SetRange("Size>0.");
0086 fMaxStepCmd->SetUnitCategory("Length");
0087 fMaxStepCmd->AvailableForStates(G4State_Idle);
0088 }
0089
0090
0091
0092 DetectorMessenger::~DetectorMessenger()
0093 {
0094 delete fMaterCmd;
0095 delete fSizeCmd;
0096 delete fMagFieldCmd;
0097 delete fUpdateCmd;
0098 delete fMaxStepCmd;
0099 delete fDetDir;
0100 delete fTestemDir;
0101 }
0102
0103
0104
0105 void DetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue)
0106 {
0107 if (command == fMaterCmd) {
0108 fDetector->SetMaterial(newValue);
0109 }
0110
0111 if (command == fSizeCmd) {
0112 fDetector->SetSize(fSizeCmd->GetNewDoubleValue(newValue));
0113 }
0114
0115 if (command == fMagFieldCmd) {
0116 fDetector->SetMagField(fMagFieldCmd->GetNewDoubleValue(newValue));
0117 }
0118
0119 if (command == fUpdateCmd) {
0120 fDetector->UpdateGeometry();
0121 }
0122
0123 if (command == fMaxStepCmd) {
0124 fDetector->SetMaxStepSize(fMaxStepCmd->GetNewDoubleValue(newValue));
0125 }
0126 }
0127
0128