source: trunk/examples/advanced/radiation_monitor/detector/src/RadmonDetectorMessenger.cc @ 1321

Last change on this file since 1321 was 807, checked in by garnier, 16 years ago

update

File size: 18.9 KB
Line 
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//
27// File name:     RadmonDetectorMessenger.cc
28// Creation date: Sep 2005
29// Main author:   Riccardo Capra <capra@ge.infn.it>
30//
31// Id:            $Id: RadmonDetectorMessenger.cc,v 1.3.2.2 2006/06/29 16:14:01 gunter Exp $
32// Tag:           $Name: geant4-09-01-patch-02 $
33//
34
35// Messenger commands path
36#define COMMANDS_PATH "/radmon/detector/"
37
38// Include files
39#include "RadmonDetectorMessenger.hh"
40#include "RadmonVDetectorLayout.hh"
41#include "G4UnitsTable.hh"
42
43
44
45                                                RadmonDetectorMessenger :: RadmonDetectorMessenger(RadmonVDetectorLayout * layout)
46:
47 RadmonMessenger(COMMANDS_PATH, "Interactive detector construction commands."),
48 detectorLayout(layout),
49 RADMON_INITIALIZE_COMMAND(EnableEnvironment),
50 RADMON_INITIALIZE_COMMAND(DisableEnvironment),
51 RADMON_INITIALIZE_COMMAND(SetEnvironmentType),
52 RADMON_INITIALIZE_COMMAND(SetEnvironmentAttribute),
53 RADMON_INITIALIZE_COMMAND(ClearEnvironmentAttribute),
54 RADMON_INITIALIZE_COMMAND(CreateMultilayer),
55 RADMON_INITIALIZE_COMMAND(RemoveMultilayer),
56 RADMON_INITIALIZE_COMMAND(SetMultilayerWidth),
57 RADMON_INITIALIZE_COMMAND(SetMultilayerHeight),
58 RADMON_INITIALIZE_COMMAND(AppendLayerToMultilayer),
59 RADMON_INITIALIZE_COMMAND(RemoveLayerFromMultilayer),
60 RADMON_INITIALIZE_COMMAND(RemoveAllLayersFromMultilayer),
61 RADMON_INITIALIZE_COMMAND(SetLayerThickness),
62 RADMON_INITIALIZE_COMMAND(SetLayerType),
63 RADMON_INITIALIZE_COMMAND(SetLayerAttribute),
64 RADMON_INITIALIZE_COMMAND(ClearLayerAttribute),
65 RADMON_INITIALIZE_COMMAND(CreatePlacement),
66 RADMON_INITIALIZE_COMMAND(RemovePlacement),
67 RADMON_INITIALIZE_COMMAND(SetPlacementPosition),
68 RADMON_INITIALIZE_COMMAND(SetPlacementRotation),
69 RADMON_INITIALIZE_COMMAND(SetRelativePlacementPosition),
70 RADMON_INITIALIZE_COMMAND(SetRelativePlacementRotation),
71 RADMON_INITIALIZE_COMMAND(DumpLayout),
72 RADMON_INITIALIZE_COMMAND(Load),
73 RADMON_INITIALIZE_COMMAND(Save)
74{
75 if (layout==0)
76  G4Exception("RadmonDetectorMessenger::RadmonDetectorMessenger: layout==0.");
77
78 RADMON_CREATE_COMMAND_0ARGS(EnableEnvironment,                 "Enables the environment");
79 RADMON_CREATE_COMMAND_0ARGS(DisableEnvironment,                "Disables the environment");
80 RADMON_CREATE_COMMAND_1ARG (SetEnvironmentType,                "Define the type of environment",                                                                       "type");
81 RADMON_CREATE_COMMAND_2ARGS(SetEnvironmentAttribute,           "Define an attribute of the environment",                                                               "name", "value");
82 RADMON_CREATE_COMMAND_1ARG (ClearEnvironmentAttribute,         "Removes an attribute of the environment",                                                              "name"); 
83 RADMON_CREATE_COMMAND_1ARG (CreateMultilayer,                  "Creates a new multilayer",                                                                             "name");
84 RADMON_CREATE_COMMAND_1ARG (RemoveMultilayer,                  "Removes a multilayer",                                                                                 "name");
85 RADMON_CREATE_COMMAND_3ARGS(SetMultilayerWidth,                "Set the width of a multilayer",                                                                        "name", "width", "unit");
86 RADMON_CREATE_COMMAND_3ARGS(SetMultilayerHeight,               "Set the height of a multilayer",                                                                       "name", "height", "unit");
87 RADMON_CREATE_COMMAND_2ARGS(AppendLayerToMultilayer,           "Adds a layer to a multilayer",                                                                         "multilayerName", "layerName");
88 RADMON_CREATE_COMMAND_2ARGS(RemoveLayerFromMultilayer,         "Removes a layer from a multilayer",                                                                    "multilayerName", "layerName");
89 RADMON_CREATE_COMMAND_1ARG (RemoveAllLayersFromMultilayer,     "Removes all the layers of a multilayer",                                                               "multilayerName");
90 RADMON_CREATE_COMMAND_4ARGS(SetLayerThickness,                 "Set the thickness of the layer of a multilayer",                                                       "multilayerName", "layerName", "width", "unit");
91 RADMON_CREATE_COMMAND_3ARGS(SetLayerType,                      "Set the layer type of a multilayer",                                                                   "multilayerName", "layerName", "type");
92 RADMON_CREATE_COMMAND_4ARGS(SetLayerAttribute,                 "Set an attribute of a layer of a multilayer",                                                          "multilayerName", "layerName", "attributeName", "value");
93 RADMON_CREATE_COMMAND_3ARGS(ClearLayerAttribute,               "Removes an attribute of a layer of a multilayer",                                                      "multilayerName", "layerName", "attributeName");
94 RADMON_CREATE_COMMAND_2ARGS(CreatePlacement,                   "Creates a new multilayer placement",                                                                   "placementName",  "multilayerName");
95 RADMON_CREATE_COMMAND_1ARG (RemovePlacement,                   "Removes a multilayer placement",                                                                       "name");
96 RADMON_CREATE_COMMAND_5ARGS(SetPlacementPosition,              "Changes the position of a placement",                                                                  "name", "x", "y", "z", "unit");
97 RADMON_CREATE_COMMAND_5ARGS(SetPlacementRotation,              "Changes the orientation of a placement performing a rotation of delta along axis (theta, phi)",        "name", "theta", "phi", "delta", "unit");
98 RADMON_CREATE_COMMAND_6ARGS(SetRelativePlacementPosition,      "Changes the position of a placement relative to another placement",                                    "name", "fromName", "x", "y", "z", "unit");
99 RADMON_CREATE_COMMAND_6ARGS(SetRelativePlacementRotation,      "Changes the orientation of a placement relative to another placement",                                 "name", "fromName", "theta", "phi", "delta", "unit");
100 RADMON_CREATE_COMMAND_0ARGS(DumpLayout,                        "Print out the current layout");
101 RADMON_CREATE_COMMAND_1ARG (Load,                              "Loads a layout from file",                                                                             "fileName");
102 RADMON_CREATE_COMMAND_1ARG (Save,                              "Saves a layout to file",                                                                               "fileName");
103}
104
105
106
107                                                RadmonDetectorMessenger :: ~RadmonDetectorMessenger()
108{
109 RADMON_DESTROY_COMMAND(Save);
110 RADMON_DESTROY_COMMAND(Load);
111 RADMON_DESTROY_COMMAND(DumpLayout);
112 RADMON_DESTROY_COMMAND(SetRelativePlacementRotation);
113 RADMON_DESTROY_COMMAND(SetRelativePlacementPosition);
114 RADMON_DESTROY_COMMAND(SetPlacementRotation);
115 RADMON_DESTROY_COMMAND(SetPlacementPosition);
116 RADMON_DESTROY_COMMAND(RemovePlacement);
117 RADMON_DESTROY_COMMAND(CreatePlacement);
118 RADMON_DESTROY_COMMAND(ClearLayerAttribute);
119 RADMON_DESTROY_COMMAND(SetLayerAttribute);
120 RADMON_DESTROY_COMMAND(SetLayerType);
121 RADMON_DESTROY_COMMAND(SetLayerThickness);
122 RADMON_DESTROY_COMMAND(RemoveAllLayersFromMultilayer);
123 RADMON_DESTROY_COMMAND(RemoveLayerFromMultilayer);
124 RADMON_DESTROY_COMMAND(AppendLayerToMultilayer);
125 RADMON_DESTROY_COMMAND(SetMultilayerHeight);
126 RADMON_DESTROY_COMMAND(SetMultilayerWidth);
127 RADMON_DESTROY_COMMAND(RemoveMultilayer);
128 RADMON_DESTROY_COMMAND(CreateMultilayer);
129 RADMON_DESTROY_COMMAND(ClearEnvironmentAttribute);
130 RADMON_DESTROY_COMMAND(SetEnvironmentAttribute);
131 RADMON_DESTROY_COMMAND(SetEnvironmentType);
132 RADMON_DESTROY_COMMAND(DisableEnvironment);
133 RADMON_DESTROY_COMMAND(EnableEnvironment);
134}
135
136
137
138
139
140G4String                                        RadmonDetectorMessenger :: GetCurrentValue(G4UIcommand * /* command */)
141{
142 G4cout << "RadmonDetectorMessenger::GetCurrentValue(): Not supported" << G4endl;
143 
144 return G4String();
145}
146
147
148
149void                                            RadmonDetectorMessenger :: SetNewValue(G4UIcommand * command, G4String newValue)
150{
151 RADMON_BEGIN_LIST_SET_COMMANDS
152  RADMON_SET_COMMAND(EnableEnvironment)
153  RADMON_SET_COMMAND(DisableEnvironment)
154  RADMON_SET_COMMAND(SetEnvironmentType)
155  RADMON_SET_COMMAND(SetEnvironmentAttribute)
156  RADMON_SET_COMMAND(ClearEnvironmentAttribute)
157  RADMON_SET_COMMAND(CreateMultilayer)
158  RADMON_SET_COMMAND(RemoveMultilayer)
159  RADMON_SET_COMMAND(SetMultilayerWidth)
160  RADMON_SET_COMMAND(SetMultilayerHeight)
161  RADMON_SET_COMMAND(AppendLayerToMultilayer)
162  RADMON_SET_COMMAND(RemoveLayerFromMultilayer)
163  RADMON_SET_COMMAND(RemoveAllLayersFromMultilayer)
164  RADMON_SET_COMMAND(SetLayerThickness)
165  RADMON_SET_COMMAND(SetLayerType)
166  RADMON_SET_COMMAND(SetLayerAttribute)
167  RADMON_SET_COMMAND(ClearLayerAttribute)
168  RADMON_SET_COMMAND(CreatePlacement)
169  RADMON_SET_COMMAND(RemovePlacement)
170  RADMON_SET_COMMAND(SetPlacementPosition)
171  RADMON_SET_COMMAND(SetPlacementRotation)
172  RADMON_SET_COMMAND(SetRelativePlacementPosition)
173  RADMON_SET_COMMAND(SetRelativePlacementRotation)
174  RADMON_SET_COMMAND(DumpLayout)
175  RADMON_SET_COMMAND(Load)
176  RADMON_SET_COMMAND(Save)
177 RADMON_END_LIST_SET_COMMANDS
178}
179
180
181
182
183
184// Events
185void                                            RadmonDetectorMessenger :: OnEnableEnvironment(const G4String & /* value */)
186{
187 detectorLayout->EnableEnvironment();
188}
189
190
191
192void                                            RadmonDetectorMessenger :: OnDisableEnvironment(const G4String & /* value */)
193{
194 detectorLayout->DisableEnvironment();
195}
196
197
198
199void                                            RadmonDetectorMessenger :: OnSetEnvironmentType(const G4String & value)
200{
201 G4String args[1];
202
203 if (!ProcessArguments(value, 1, args))
204  return; 
205
206 detectorLayout->SetEnvironmentType(args[0]);
207}
208
209
210
211void                                            RadmonDetectorMessenger :: OnSetEnvironmentAttribute(const G4String & value)
212{
213 G4String args[2];
214
215 if (!ProcessArguments(value, 2, args))
216  return; 
217
218 detectorLayout->SetEnvironmentAttribute(args[0], args[1]);
219}
220
221
222
223void                                            RadmonDetectorMessenger :: OnClearEnvironmentAttribute(const G4String & value)
224{
225 G4String args[1];
226
227 if (!ProcessArguments(value, 1, args))
228  return; 
229
230 detectorLayout->ClearEnvironmentAttribute(args[0]);
231}
232
233
234
235void                                            RadmonDetectorMessenger :: OnCreateMultilayer(const G4String & value)
236{
237 G4String args[1];
238
239 if (!ProcessArguments(value, 1, args))
240  return; 
241
242 detectorLayout->CreateMultilayer(args[0]);
243}
244
245
246
247void                                            RadmonDetectorMessenger :: OnRemoveMultilayer(const G4String & value)
248{
249 G4String args[1];
250
251 if (!ProcessArguments(value, 1, args))
252  return; 
253
254 detectorLayout->RemoveMultilayer(args[0]);
255}
256
257
258
259void                                            RadmonDetectorMessenger :: OnSetMultilayerWidth(const G4String & value)
260{
261 G4String args[3];
262
263 if (!ProcessArguments(value, 3, args))
264  return; 
265 
266 G4double dbl(GetUnit(args[2], "Length"));
267 
268 if (dbl<=0.)
269  return;
270 
271 dbl*=G4UIcommand::ConvertToDouble(args[1]);
272
273 if (dbl<0.)
274 {
275  G4cout << "RadmonDetectorMessenger::OnSetMultilayerWidth(): Cannot set negative width." << G4endl;
276  return;
277 }
278 
279 detectorLayout->SetMultilayerWidth(args[0], dbl);
280}
281
282
283
284void                                            RadmonDetectorMessenger :: OnSetMultilayerHeight(const G4String & value)
285{
286 G4String args[3];
287
288 if (!ProcessArguments(value, 3, args))
289  return; 
290 
291 G4double dbl(GetUnit(args[2], "Length"));
292 
293 if (dbl<=0.)
294  return;
295 
296 dbl*=G4UIcommand::ConvertToDouble(args[1]);
297 
298 if (dbl<0)
299 {
300  G4cout << "RadmonDetectorMessenger::OnSetMultilayerHeight(): Cannot set negative height." << G4endl;
301  return;
302 }
303 
304 detectorLayout->SetMultilayerHeight(args[0], dbl);
305}
306
307
308
309void                                            RadmonDetectorMessenger :: OnAppendLayerToMultilayer(const G4String & value)
310{
311 G4String args[2];
312
313 if (!ProcessArguments(value, 2, args))
314  return; 
315
316 detectorLayout->AppendLayerToMultilayer(args[0], args[1]);
317}
318
319
320
321void                                            RadmonDetectorMessenger :: OnRemoveLayerFromMultilayer(const G4String & value)
322{
323 G4String args[2];
324
325 if (!ProcessArguments(value, 2, args))
326  return; 
327
328 detectorLayout->RemoveLayerFromMultilayer(args[0], args[1]);
329}
330
331
332
333void                                            RadmonDetectorMessenger :: OnRemoveAllLayersFromMultilayer(const G4String & value)
334{
335 G4String args[1];
336
337 if (!ProcessArguments(value, 1, args))
338  return; 
339
340 detectorLayout->RemoveAllLayersFromMultilayer(args[0]);
341}
342
343
344
345void                                            RadmonDetectorMessenger :: OnSetLayerThickness(const G4String & value)
346{
347 G4String args[4];
348
349 if (!ProcessArguments(value, 4, args))
350  return; 
351 
352 G4double dbl(GetUnit(args[3], "Length"));
353 
354 if (dbl<=0.)
355  return;
356 
357 if (dbl<0.)
358 {
359  G4cout << "RadmonDetectorMessenger::OnSetLayerThickness(): Cannot set negative thickness." << G4endl;
360  return;
361 }
362 
363 dbl*=G4UIcommand::ConvertToDouble(args[2]);
364 detectorLayout->SetLayerThickness(args[0], args[1], dbl);
365}
366
367
368
369void                                            RadmonDetectorMessenger :: OnSetLayerType(const G4String & value)
370{
371 G4String args[3];
372
373 if (!ProcessArguments(value, 3, args))
374  return; 
375
376 detectorLayout->SetLayerType(args[0], args[1], args[2]);
377}
378
379
380
381void                                            RadmonDetectorMessenger :: OnSetLayerAttribute(const G4String & value)
382{
383 G4String args[4];
384
385 if (!ProcessArguments(value, 4, args))
386  return; 
387
388 detectorLayout->SetLayerAttribute(args[0], args[1], args[2], args[3]);
389}
390
391
392
393void                                            RadmonDetectorMessenger :: OnClearLayerAttribute(const G4String & value)
394{
395 G4String args[3];
396
397 if (!ProcessArguments(value, 3, args))
398  return; 
399
400 detectorLayout->ClearLayerAttribute(args[0], args[1], args[2]);
401}
402
403
404
405void                                            RadmonDetectorMessenger :: OnCreatePlacement(const G4String & value)
406{
407 G4String args[2];
408
409 if (!ProcessArguments(value, 2, args))
410  return; 
411
412 detectorLayout->CreatePlacement(args[0], args[1]);
413}
414
415
416
417void                                            RadmonDetectorMessenger :: OnRemovePlacement(const G4String & value)
418{
419 G4String args[1];
420
421 if (!ProcessArguments(value, 1, args))
422  return; 
423
424 detectorLayout->RemovePlacement(args[0]);
425}
426
427
428
429void                                            RadmonDetectorMessenger :: OnSetPlacementPosition(const G4String & value)
430{
431 G4String args[5];
432
433 if (!ProcessArguments(value, 5, args))
434  return; 
435
436 G4double x(GetUnit(args[4], "Length"));
437 
438 if (x<=0.)
439  return;
440 
441 G4double y(x*G4UIcommand::ConvertToDouble(args[2]));
442 G4double z(x*G4UIcommand::ConvertToDouble(args[3]));
443 x*=G4UIcommand::ConvertToDouble(args[1]);
444
445 detectorLayout->SetPlacementPosition(args[0], G4ThreeVector(x, y, z));
446}
447
448
449
450void                                            RadmonDetectorMessenger :: OnSetPlacementRotation(const G4String & value)
451{
452 G4String args[5];
453
454 if (!ProcessArguments(value, 5, args))
455  return; 
456
457 G4double theta(GetUnit(args[4], "Angle"));
458 
459 if (theta<=0.)
460  return;
461 
462 G4double phi(theta*G4UIcommand::ConvertToDouble(args[2]));
463 G4double delta(theta*G4UIcommand::ConvertToDouble(args[3]));
464 theta*=G4UIcommand::ConvertToDouble(args[1]);
465
466 G4ThreeVector axis;
467 axis.setRThetaPhi(1., theta/rad, phi/rad);
468 detectorLayout->SetPlacementRotation(args[0], G4RotationMatrix(axis, delta/rad));
469}
470
471
472
473void                                            RadmonDetectorMessenger :: OnSetRelativePlacementPosition(const G4String & value)
474{
475 G4String args[6];
476
477 if (!ProcessArguments(value, 6, args))
478  return; 
479
480 G4double x(GetUnit(args[5], "Length"));
481 
482 if (x<=0.)
483  return;
484 
485 G4double y(x*G4UIcommand::ConvertToDouble(args[3]));
486 G4double z(x*G4UIcommand::ConvertToDouble(args[4]));
487 x*=G4UIcommand::ConvertToDouble(args[2]);
488
489 detectorLayout->SetPlacementPosition(args[0], args[1], G4ThreeVector(x, y, z));
490}
491
492
493
494void                                            RadmonDetectorMessenger :: OnSetRelativePlacementRotation(const G4String & value)
495{
496 G4String args[6];
497
498 if (!ProcessArguments(value, 6, args))
499  return; 
500
501 G4double theta(GetUnit(args[5], "Angle"));
502 
503 if (theta<=0.)
504  return;
505 
506 G4double phi(theta*G4UIcommand::ConvertToDouble(args[3]));
507 G4double delta(theta*G4UIcommand::ConvertToDouble(args[4]));
508 theta*=G4UIcommand::ConvertToDouble(args[2]);
509
510 G4ThreeVector axis;
511 axis.setRThetaPhi(1., theta, phi);
512 detectorLayout->SetPlacementRotation(args[0], args[1], G4RotationMatrix(axis, delta));
513}
514
515
516
517void                                            RadmonDetectorMessenger :: OnDumpLayout(const G4String & /* value */)
518{
519 detectorLayout->DumpLayout(G4cout);
520 G4cout << G4endl;
521}
522
523
524
525void                                            RadmonDetectorMessenger :: OnLoad(const G4String & value)
526{
527 G4String args[1];
528
529 if (!ProcessArguments(value, 1, args))
530  return; 
531 
532 std::istream * in(OpenForInput(args[0]));
533 
534 if (!in)
535  return;
536
537 if (!detectorLayout->Load(*in)) 
538  G4cout << "RadmonDetectorMessenger::OnLoad(): Error reading from file \"" << args[0] << "\"." << G4endl;
539 
540 delete in;
541}
542
543
544
545void                                            RadmonDetectorMessenger :: OnSave(const G4String & value)
546{
547 G4String args[1];
548
549 if (!ProcessArguments(value, 1, args))
550  return; 
551 
552 std::ostream * out(OpenForOutput(args[0]));
553 
554 if (!out)
555  return;
556
557 if (!detectorLayout->Save(*out))
558  G4cout << "RadmonDetectorMessenger::OnSave(): Cannot write layout into file \"" << args[0] << "\"." << G4endl;
559 
560 delete out;
561}
Note: See TracBrowser for help on using the repository browser.