File indexing completed on 2026-03-28 07:50:40
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 #include "DetectorMessenger.hh"
0041 #include "DetectorConstruction.hh"
0042 #include "PhysicsList.hh"
0043
0044 #include "G4UIcmdWithABool.hh"
0045 #include "G4UIcmdWithAString.hh"
0046 #include "G4UIcmdWithoutParameter.hh"
0047 #include "G4UIcommand.hh"
0048 #include "G4UIdirectory.hh"
0049 #include "G4UIparameter.hh"
0050 #include "G4UIcmdWithADoubleAndUnit.hh"
0051
0052
0053
0054 DetectorMessenger::DetectorMessenger(DetectorConstruction* Det, PhysicsList* PL)
0055 : G4UImessenger(), fpDetector(Det), fpPhysList(PL)
0056 {
0057 fpDetDir = new G4UIdirectory("/dna/test/");
0058 fpDetDir->SetGuidance("dna test commands");
0059
0060 fpMaterCmd = new G4UIcmdWithAString("/dna/test/setMat", this);
0061 fpMaterCmd->SetGuidance("Select material of the world.");
0062 fpMaterCmd->SetParameterName("Material", false);
0063 fpMaterCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
0064 fpMaterCmd->SetToBeBroadcasted(false);
0065
0066 fpPhysCmd = new G4UIcmdWithAString("/dna/test/addPhysics", this);
0067 fpPhysCmd->SetGuidance("Added Physics List");
0068 fpPhysCmd->SetParameterName("Physics", false);
0069 fpPhysCmd->AvailableForStates(G4State_PreInit);
0070 fpPhysCmd->SetToBeBroadcasted(false);
0071
0072 fpTrackingCutCmd = new G4UIcmdWithABool("/dna/test/addIonsTrackingCut", this);
0073 fpTrackingCutCmd->SetGuidance("Added Ions Tracking Cut");
0074 fpTrackingCutCmd->SetDefaultValue(false);
0075 fpTrackingCutCmd->AvailableForStates(G4State_PreInit);
0076 fpTrackingCutCmd->SetToBeBroadcasted(false);
0077
0078 fDensityCmd = new G4UIcommand("/dna/test/setMatDens",this);
0079 fDensityCmd->SetGuidance("Set density of the target material");
0080 G4UIparameter* symbPrm = new G4UIparameter("name",'s',false);
0081 symbPrm->SetGuidance("material name");
0082 fDensityCmd->SetParameter(symbPrm);
0083 G4UIparameter* densityPrm = new G4UIparameter("density",'d',false);
0084 densityPrm->SetGuidance("density of material");
0085 densityPrm->SetParameterRange("density>0.");
0086 fDensityCmd->SetParameter(densityPrm);
0087 G4UIparameter* unitPrm = new G4UIparameter("unit",'s',false);
0088 unitPrm->SetGuidance("unit of density");
0089 G4String unitList = G4UIcommand::UnitsList(G4UIcommand::CategoryOf("g/cm3"));
0090 unitPrm->SetParameterCandidates(unitList);
0091 fDensityCmd->SetParameter(unitPrm);
0092 fDensityCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
0093
0094 fSizeCmd = new G4UIcmdWithADoubleAndUnit("/dna/test/setSize",this);
0095 fSizeCmd->SetGuidance("Set size of the World");
0096 fSizeCmd->SetParameterName("Size",false);
0097 fSizeCmd->SetRange("Size>0.");
0098 fSizeCmd->SetUnitCategory("Length");
0099 fSizeCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
0100 }
0101
0102
0103
0104 DetectorMessenger::~DetectorMessenger()
0105 {
0106 delete fpDetDir;
0107
0108 delete fpMaterCmd;
0109 delete fpPhysCmd;
0110 delete fpTrackingCutCmd;
0111 delete fDensityCmd;
0112 delete fSizeCmd;
0113 }
0114
0115
0116
0117 void DetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue)
0118 {
0119 if (command == fpMaterCmd) fpDetector->SetMaterial(newValue);
0120
0121 if (command == fpPhysCmd) fpPhysList->AddPhysics(newValue);
0122
0123 if (command == fpTrackingCutCmd)
0124 fpPhysList->SetTrackingCut(fpTrackingCutCmd->GetNewBoolValue(newValue));
0125
0126 if (command == fDensityCmd)
0127 {
0128 G4double dens;
0129 G4String name, unt;
0130 std::istringstream is(newValue);
0131 is >> name >> dens >> unt;
0132 dens *= G4UIcommand::ValueOf(unt);
0133 fpDetector->MaterialWithDensity(name,dens);
0134 fpDetector->SetMaterial(name);
0135 }
0136
0137 if (command == fSizeCmd)
0138 fpDetector->SetSize(fSizeCmd->GetNewDoubleValue(newValue));
0139 }