Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/run/src/G4AdjointSimMessenger.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 // G4AdjointSimMessenger implementation
 27 //
 28 // --------------------------------------------------------------------
 29 //   Class Name:   G4AdjointSimMessenger
 30 //   Author:       L. Desorgher, 2007-2009
 31 //   Organisation: SpaceIT GmbH
 32 //   Contract:     ESA contract 21435/08/NL/AT
 33 //   Customer:     ESA/ESTEC
 34 // --------------------------------------------------------------------
 35 
 36 #include "G4AdjointSimMessenger.hh"
 37 
 38 #include "G4AdjointSimManager.hh"
 39 #include "G4RunManager.hh"
 40 #include "G4UIcmdWith3VectorAndUnit.hh"
 41 #include "G4UIcmdWithABool.hh"
 42 #include "G4UIcmdWithADouble.hh"
 43 #include "G4UIcmdWithADoubleAndUnit.hh"
 44 #include "G4UIcmdWithAString.hh"
 45 #include "G4UIcmdWithAnInteger.hh"
 46 #include "G4UIcmdWithoutParameter.hh"
 47 #include "G4UIdirectory.hh"
 48 #include "G4UnitsTable.hh"
 49 
 50 #include <sstream>
 51 
 52 // --------------------------------------------------------------------
 53 //
 54 G4AdjointSimMessenger::G4AdjointSimMessenger(G4AdjointSimManager* pAdjointRunManager)
 55   : theAdjointRunManager(pAdjointRunManager)
 56 {
 57   AdjointSimDir = new G4UIdirectory("/adjoint/");
 58   AdjointSimDir->SetGuidance("Control of the adjoint or reverse monte carlo simulation");
 59 
 60   // Start and adjoint Run
 61   //---------------------
 62 
 63 
 64   beamOnCmd = new G4UIcommand("/adjoint/start_run", this);
 65   beamOnCmd->SetGuidance("Start an adjoint Run.");
 66   beamOnCmd->SetGuidance("Default number of events to be processed is 1.");
 67   beamOnCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
 68   auto p1 = new G4UIparameter("numberOfEvent", 'i', true);
 69   p1->SetDefaultValue(1);
 70   p1->SetParameterRange("numberOfEvent >= 0");
 71   beamOnCmd->SetParameter(p1);
 72 
 73   // Commands to define parameters relative to the external source
 74   //------------------------------------------------------------
 75 
 76   auto pos_x_par = new G4UIparameter("X", 'd', true);
 77 
 78   auto pos_y_par = new G4UIparameter("Y", 'd', true);
 79 
 80   auto pos_z_par = new G4UIparameter("Z", 'd', true);
 81 
 82   auto radius_par = new G4UIparameter("R", 'd', true);
 83 
 84   radius_par->SetParameterRange("R >= 0");
 85 
 86   auto unit_par = new G4UIparameter("unit", 's', true);
 87 
 88   DefineSpherExtSourceCmd = new G4UIcommand("/adjoint/DefineSphericalExtSource", this);
 89   DefineSpherExtSourceCmd->SetGuidance("Define a spherical external source.");
 90   DefineSpherExtSourceCmd->SetParameter(pos_x_par);
 91   DefineSpherExtSourceCmd->SetParameter(pos_y_par);
 92   DefineSpherExtSourceCmd->SetParameter(pos_z_par);
 93   DefineSpherExtSourceCmd->SetParameter(radius_par);
 94   DefineSpherExtSourceCmd->SetParameter(unit_par);
 95 
 96   auto phys_vol_name_par = new G4UIparameter("phys_vol_name", 's', true);
 97 
 98   DefineSpherExtSourceCenteredOnAVolumeCmd =
 99     new G4UIcommand("/adjoint/DefineSphericalExtSourceCenteredOnAVolume", this);
100   DefineSpherExtSourceCenteredOnAVolumeCmd->SetGuidance(
101     "Define a spherical external source with the center located at the center "
102     "of a "
103     "physical volume");
104   DefineSpherExtSourceCenteredOnAVolumeCmd->SetParameter(phys_vol_name_par);
105   DefineSpherExtSourceCenteredOnAVolumeCmd->SetParameter(radius_par);
106   DefineSpherExtSourceCenteredOnAVolumeCmd->SetParameter(unit_par);
107 
108   DefineExtSourceOnAVolumeExtSurfaceCmd =
109     new G4UIcmdWithAString("/adjoint/DefineExtSourceOnExtSurfaceOfAVolume", this);
110   DefineExtSourceOnAVolumeExtSurfaceCmd->SetGuidance(
111     "Set the external source on the external surface of a physical volume");
112   DefineExtSourceOnAVolumeExtSurfaceCmd->SetParameterName("phys_vol_name", false);
113 
114   setExtSourceEMaxCmd = new G4UIcmdWithADoubleAndUnit("/adjoint/SetExtSourceEmax", this);
115   setExtSourceEMaxCmd->SetGuidance("Set the maximum  energy of the external source");
116   setExtSourceEMaxCmd->SetParameterName("Emax", false);
117   setExtSourceEMaxCmd->SetUnitCategory("Energy");
118   setExtSourceEMaxCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
119 
120   // Commands to define the adjoint source
121   //------------------------------------------------------------
122 
123   DefineSpherAdjSourceCmd = new G4UIcommand("/adjoint/DefineSphericalAdjSource", this);
124   DefineSpherAdjSourceCmd->SetGuidance("Define a spherical adjoint source.");
125   DefineSpherAdjSourceCmd->SetParameter(pos_x_par);
126   DefineSpherAdjSourceCmd->SetParameter(pos_y_par);
127   DefineSpherAdjSourceCmd->SetParameter(pos_z_par);
128   DefineSpherAdjSourceCmd->SetParameter(radius_par);
129   DefineSpherAdjSourceCmd->SetParameter(unit_par);
130 
131   DefineSpherAdjSourceCenteredOnAVolumeCmd =
132     new G4UIcommand("/adjoint/DefineSphericalAdjSourceCenteredOnAVolume", this);
133   DefineSpherAdjSourceCenteredOnAVolumeCmd->SetGuidance(
134     "Define a spherical adjoint source with the center located at the center "
135     "of a "
136     "physical volume");
137   DefineSpherAdjSourceCenteredOnAVolumeCmd->SetParameter(phys_vol_name_par);
138   DefineSpherAdjSourceCenteredOnAVolumeCmd->SetParameter(radius_par);
139   DefineSpherAdjSourceCenteredOnAVolumeCmd->SetParameter(unit_par);
140 
141   DefineAdjSourceOnAVolumeExtSurfaceCmd =
142     new G4UIcmdWithAString("/adjoint/DefineAdjSourceOnExtSurfaceOfAVolume", this);
143   DefineAdjSourceOnAVolumeExtSurfaceCmd->SetGuidance(
144     "Set the adjoint source on the external surface of physical volume");
145   DefineAdjSourceOnAVolumeExtSurfaceCmd->SetParameterName("phys_vol_name", false);
146 
147   setAdjSourceEminCmd = new G4UIcmdWithADoubleAndUnit("/adjoint/SetAdjSourceEmin", this);
148   setAdjSourceEminCmd->SetGuidance("Set the minimum energy  of the adjoint source");
149   setAdjSourceEminCmd->SetParameterName("Emin", false);
150   setAdjSourceEminCmd->SetUnitCategory("Energy");
151   setAdjSourceEminCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
152 
153   setAdjSourceEmaxCmd = new G4UIcmdWithADoubleAndUnit("/adjoint/SetAdjSourceEmax", this);
154   setAdjSourceEmaxCmd->SetGuidance("Set the maximum energy of the adjoint source");
155   setAdjSourceEmaxCmd->SetParameterName("Emax", false);
156   setAdjSourceEmaxCmd->SetUnitCategory("Energy");
157   setAdjSourceEmaxCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
158 
159   ConsiderParticleAsPrimaryCmd = new G4UIcmdWithAString("/adjoint/ConsiderAsPrimary", this);
160   ConsiderParticleAsPrimaryCmd->SetGuidance("Set the selected particle as primary");
161   ConsiderParticleAsPrimaryCmd->SetParameterName("particle", false);
162   ConsiderParticleAsPrimaryCmd->SetCandidates("e- gamma proton ion");
163 
164   NeglectParticleAsPrimaryCmd = new G4UIcmdWithAString("/adjoint/NeglectAsPrimary", this);
165   NeglectParticleAsPrimaryCmd->SetGuidance(
166     "Remove the selected particle from the list of primaries");
167   NeglectParticleAsPrimaryCmd->SetParameterName("particle", false);
168   NeglectParticleAsPrimaryCmd->SetCandidates("e- gamma proton ion");
169 
170   setNbOfPrimaryFwdGammasPerEventCmd =
171     new G4UIcmdWithAnInteger("/adjoint/SetNbOfPrimaryFwdGammasPerEvent", this);
172   setNbOfPrimaryFwdGammasPerEventCmd->SetGuidance(
173     "Set the nb of primary fwd gamm  generated on the adjoint source");
174   setNbOfPrimaryFwdGammasPerEventCmd->SetParameterName("Nb_gammas", false);
175   setNbOfPrimaryFwdGammasPerEventCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
176 
177   setNbOfPrimaryAdjGammasPerEventCmd =
178     new G4UIcmdWithAnInteger("/adjoint/SetNbOfPrimaryAdjGammasPerEvent", this);
179   setNbOfPrimaryAdjGammasPerEventCmd->SetGuidance(
180     "Set the nb of primary fwd gamm  generated on the adjoint source");
181   setNbOfPrimaryAdjGammasPerEventCmd->SetParameterName("Nb_gammas", false);
182   setNbOfPrimaryAdjGammasPerEventCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
183 
184   setNbOfPrimaryAdjElectronsPerEventCmd =
185     new G4UIcmdWithAnInteger("/adjoint/SetNbOfPrimaryAdjElectronsPerEvent", this);
186   setNbOfPrimaryAdjElectronsPerEventCmd->SetGuidance(
187     "Set the nb of primary fwd gamm  generated on the adjoint source");
188   setNbOfPrimaryAdjElectronsPerEventCmd->SetParameterName("Nb_gammas", false);
189   setNbOfPrimaryAdjElectronsPerEventCmd->AvailableForStates(G4State_PreInit, G4State_Idle);
190 }
191 
192 // --------------------------------------------------------------------
193 //
194 G4AdjointSimMessenger::~G4AdjointSimMessenger()
195 {
196   delete setNbOfPrimaryAdjElectronsPerEventCmd;
197   delete setNbOfPrimaryAdjGammasPerEventCmd;
198   delete setNbOfPrimaryFwdGammasPerEventCmd;
199   delete NeglectParticleAsPrimaryCmd;
200   delete ConsiderParticleAsPrimaryCmd;
201   delete setAdjSourceEmaxCmd;
202   delete setAdjSourceEminCmd;
203   delete DefineAdjSourceOnAVolumeExtSurfaceCmd;
204   delete DefineSpherAdjSourceCenteredOnAVolumeCmd;
205   delete DefineSpherAdjSourceCmd;
206   delete setExtSourceEMaxCmd;
207   delete DefineExtSourceOnAVolumeExtSurfaceCmd;
208   delete DefineSpherExtSourceCenteredOnAVolumeCmd;
209   delete DefineSpherExtSourceCmd;
210   delete beamOnCmd;
211   delete AdjointSimDir;
212 }
213 
214 // --------------------------------------------------------------------
215 //
216 void G4AdjointSimMessenger::SetNewValue(G4UIcommand* command, G4String newValue)
217 {
218   if (command == nullptr) return;
219   if (command == beamOnCmd) {
220     G4int nev;
221     const auto nv = (const char*)newValue;
222     std::istringstream is(nv);
223     is >> nev;
224     theAdjointRunManager->RunAdjointSimulation(nev);
225   }
226   else if (command == ConsiderParticleAsPrimaryCmd) {
227     theAdjointRunManager->ConsiderParticleAsPrimary(newValue);
228   }
229   else if (command == NeglectParticleAsPrimaryCmd) {
230     theAdjointRunManager->NeglectParticleAsPrimary(newValue);
231   }
232   if (command == DefineSpherExtSourceCmd) {
233     G4double x, y, z, r;
234     G4String unit;
235     const auto nv = (const char*)newValue;
236     std::istringstream is(nv);
237     is >> x >> y >> z >> r >> unit;
238 
239     x *= G4UnitDefinition::GetValueOf(unit);
240     y *= G4UnitDefinition::GetValueOf(unit);
241     z *= G4UnitDefinition::GetValueOf(unit);
242     r *= G4UnitDefinition::GetValueOf(unit);
243     theAdjointRunManager->DefineSphericalExtSource(r, G4ThreeVector(x, y, z));
244   }
245   else if (command == DefineSpherExtSourceCenteredOnAVolumeCmd) {
246     G4double r;
247     G4String vol_name, unit;
248     const auto nv = (const char*)newValue;
249     std::istringstream is(nv);
250     is >> vol_name >> r >> unit;
251     r *= G4UnitDefinition::GetValueOf(unit);
252     theAdjointRunManager->DefineSphericalExtSourceWithCentreAtTheCentreOfAVolume(r, vol_name);
253   }
254   else if (command == DefineExtSourceOnAVolumeExtSurfaceCmd) {
255     theAdjointRunManager->DefineExtSourceOnTheExtSurfaceOfAVolume(newValue);
256   }
257   else if (command == setExtSourceEMaxCmd) {
258     theAdjointRunManager->SetExtSourceEmax(setExtSourceEMaxCmd->GetNewDoubleValue(newValue));
259   }
260   else if (command == DefineSpherAdjSourceCmd) {
261     G4double x, y, z, r;
262     G4String unit;
263     const auto nv = (const char*)newValue;
264     std::istringstream is(nv);
265     is >> x >> y >> z >> r >> unit;
266 
267     x *= G4UnitDefinition::GetValueOf(unit);
268     y *= G4UnitDefinition::GetValueOf(unit);
269     z *= G4UnitDefinition::GetValueOf(unit);
270     r *= G4UnitDefinition::GetValueOf(unit);
271     theAdjointRunManager->DefineSphericalAdjointSource(r, G4ThreeVector(x, y, z));
272   }
273   else if (command == DefineSpherAdjSourceCenteredOnAVolumeCmd) {
274     G4double r;
275     G4String vol_name, unit;
276     const auto nv = (const char*)newValue;
277     std::istringstream is(nv);
278     is >> vol_name >> r >> unit;
279     r *= G4UnitDefinition::GetValueOf(unit);
280     theAdjointRunManager->DefineSphericalAdjointSourceWithCentreAtTheCentreOfAVolume(r, vol_name);
281   }
282   else if (command == DefineAdjSourceOnAVolumeExtSurfaceCmd) {
283     theAdjointRunManager->DefineAdjointSourceOnTheExtSurfaceOfAVolume(newValue);
284   }
285   else if (command == setAdjSourceEminCmd) {
286     theAdjointRunManager->SetAdjointSourceEmin(setAdjSourceEminCmd->GetNewDoubleValue(newValue));
287   }
288   else if (command == setAdjSourceEmaxCmd) {
289     theAdjointRunManager->SetAdjointSourceEmax(setAdjSourceEmaxCmd->GetNewDoubleValue(newValue));
290   }
291   else if (command == setNbOfPrimaryFwdGammasPerEventCmd) {
292     theAdjointRunManager->SetNbOfPrimaryFwdGammasPerEvent(
293       setNbOfPrimaryFwdGammasPerEventCmd->GetNewIntValue(newValue));
294   }
295   else if (command == setNbOfPrimaryAdjGammasPerEventCmd) {
296     theAdjointRunManager->SetNbAdjointPrimaryGammasPerEvent(
297       setNbOfPrimaryAdjGammasPerEventCmd->GetNewIntValue(newValue));
298   }
299   else if (command == setNbOfPrimaryAdjElectronsPerEventCmd) {
300     theAdjointRunManager->SetNbAdjointPrimaryElectronsPerEvent(
301       setNbOfPrimaryAdjElectronsPerEventCmd->GetNewIntValue(newValue));
302   }
303 }
304