File indexing completed on 2026-04-18 07:42:22
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
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #include "DetectorMessenger.hh"
0042 #include "DetectorConstruction.hh"
0043 #include "PhysicsList.hh"
0044
0045 #include "G4UIcmdWithABool.hh"
0046 #include "G4UIcmdWithAString.hh"
0047 #include "G4UIcmdWithoutParameter.hh"
0048 #include "G4UIcommand.hh"
0049 #include "G4UIdirectory.hh"
0050 #include "G4UIparameter.hh"
0051 #include "G4UIcmdWithADoubleAndUnit.hh"
0052
0053
0054
0055 DetectorMessenger::DetectorMessenger(DetectorConstruction* Det)
0056 : G4UImessenger(), fpDetector(Det)
0057 {
0058 fpDetDir = new G4UIdirectory("/psp/");
0059 fpDetDir->SetGuidance("psp test commands");
0060
0061 fpMaterCmd = new G4UIcmdWithAString("/psp/setMat", this);
0062 fpMaterCmd->SetGuidance("Select material of the world.");
0063 fpMaterCmd->SetParameterName("Material", false);
0064 fpMaterCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
0065 fpMaterCmd->SetToBeBroadcasted(false);
0066
0067 fpDensityCmd = new G4UIcommand("/psp/setMatDens",this);
0068 fpDensityCmd->SetGuidance("Set density of the target material");
0069 G4UIparameter* symbPrm = new G4UIparameter("name",'s',false);
0070 symbPrm->SetGuidance("material name");
0071 fpDensityCmd->SetParameter(symbPrm);
0072 G4UIparameter* densityPrm = new G4UIparameter("density",'d',false);
0073 densityPrm->SetGuidance("density of material");
0074 densityPrm->SetParameterRange("density>0.");
0075 fpDensityCmd->SetParameter(densityPrm);
0076 G4UIparameter* unitPrm = new G4UIparameter("unit",'s',false);
0077 unitPrm->SetGuidance("unit of density");
0078 G4String unitList = G4UIcommand::UnitsList(G4UIcommand::CategoryOf("g/cm3"));
0079 unitPrm->SetParameterCandidates(unitList);
0080 fpDensityCmd->SetParameter(unitPrm);
0081 fpDensityCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
0082
0083 fpWorldSizeCmd = new G4UIcmdWithADoubleAndUnit("/psp/setWorldSize",this);
0084 fpWorldSizeCmd->SetGuidance("Set size of the World");
0085 fpWorldSizeCmd->SetParameterName("Size",false);
0086 fpWorldSizeCmd->SetRange("Size>0.");
0087 fpWorldSizeCmd->SetUnitCategory("Length");
0088 fpWorldSizeCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
0089
0090 fpScorerRadiusCmd = new G4UIcmdWithADoubleAndUnit("/psp/setScorerRadius",this);
0091 fpScorerRadiusCmd->SetGuidance("Set radius of the scoring sphere");
0092 fpScorerRadiusCmd->SetParameterName("Size",false);
0093 fpScorerRadiusCmd->SetRange("Size>0.");
0094 fpScorerRadiusCmd->SetUnitCategory("Length");
0095 fpScorerRadiusCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
0096 }
0097
0098
0099
0100 DetectorMessenger::~DetectorMessenger()
0101 {
0102 delete fpDetDir;
0103
0104 delete fpMaterCmd;
0105 delete fpDensityCmd;
0106 delete fpWorldSizeCmd;
0107 delete fpScorerRadiusCmd;
0108 }
0109
0110
0111
0112 void DetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue)
0113 {
0114 if (command == fpMaterCmd) fpDetector->SetMaterial(newValue);
0115
0116 if (command == fpDensityCmd)
0117 {
0118 G4double dens;
0119 G4String name, unt;
0120 std::istringstream is(newValue);
0121 is >> name >> dens >> unt;
0122 dens *= G4UIcommand::ValueOf(unt);
0123 fpDetector->MaterialWithDensity(name,dens);
0124 fpDetector->SetMaterial(name);
0125 }
0126
0127 if (command == fpWorldSizeCmd)
0128 fpDetector->SetWorldSize(fpWorldSizeCmd->GetNewDoubleValue(newValue));
0129
0130 if (command == fpScorerRadiusCmd)
0131 fpDetector->SetScorerRadius(fpScorerRadiusCmd->GetNewDoubleValue(newValue));
0132 }