source: trunk/source/geometry/solids/test/SBT/src/SBTMessenger.cc@ 1330

Last change on this file since 1330 was 1316, checked in by garnier, 15 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 11.4 KB
RevLine 
[1316]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// SBTMessenger.cc
28//
29// Implementation of the messenger for controlling test 3
30//
31
32#include "SBTMessenger.hh"
33#include "SBTrun.hh"
34#include "SBTVisManager.hh"
35#include "G4SolidQuery.hh"
36
37#include "G4ios.hh"
38#include "G4UIdirectory.hh"
39#include "G4UIcommand.hh"
40#include "G4UIcmdWith3VectorAndUnit.hh"
41#include "G4UIcmdWithAnInteger.hh"
42#include "G4UIcmdWithAString.hh"
43#include "G4UIcmdWithoutParameter.hh"
44
45#include <fstream>
46
47//
48// Constructor
49//
50SBTMessenger::SBTMessenger( const G4String prefix, const G4SolidQuery *theSolidQuery, SBTVisManager *theVisManager )
51{
52 //
53 // Store solid query
54 //
55 solidQuery = theSolidQuery;
56
57 //
58 // Store visualization manager
59 //
60 visManager = theVisManager;
61
62 //
63 // Defaults (of locally stored values)
64 //
65 errorFile = "sbt.log";
66
67 //
68 // Create tester
69 //
70 tester = new SBTrun();
71
72 //
73 // Declare directory
74 //
75 test3Directory = new G4UIdirectory( prefix );
76 test3Directory->SetGuidance( "Controls for CSG batch test" );
77
78 //
79 // Target command
80 //
81 G4String com = prefix+"target";
82 targetCmd = new G4UIcmdWith3VectorAndUnit( com, this );
83 targetCmd->SetGuidance( "Center of distribution of random points" );
84 targetCmd->SetParameterName( "X", "Y", "Z", true, true );
85
86 //
87 // Widths command
88 //
89 com = prefix+"widths";
90 widthsCmd = new G4UIcmdWith3VectorAndUnit( com, this );
91 widthsCmd->SetGuidance( "Widths of distribution of random points" );
92 widthsCmd->SetParameterName( "Dx", "Dy", "Dz", true, true );
93
94 //
95 // Grid Size command
96 //
97 com = prefix+"gridSizes";
98 gridSizesCmd = new G4UIcmdWith3VectorAndUnit( com, this );
99 gridSizesCmd->SetGuidance( "Grid size, or zero for no grid" );
100 gridSizesCmd->SetParameterName( "Dx", "Dy", "Dz", true, true );
101
102 //
103 // Max Points command
104 //
105 com = prefix+"maxPoints";
106 maxPointsCmd = new G4UIcmdWithAnInteger( com, this );
107 maxPointsCmd->SetGuidance( "Maximum number of points before test ends" );
108
109 //
110 // Max Errors command
111 //
112 com = prefix+"maxErrors";
113 maxErrorsCmd = new G4UIcmdWithAnInteger( com, this );
114 maxErrorsCmd->SetGuidance( "Maximum number of errors before test ends" );
115
116 //
117 // Error filename command
118 //
119 com = prefix+"errorFileName";
120 errorFileCmd = new G4UIcmdWithAString( com, this );
121 errorFileCmd->SetGuidance( "Filename in which to send error listings" );
122
123 //
124 // Run command
125 //
126 com = prefix+"run";
127 runCmd = new G4UIcmdWithoutParameter( com, this );
128 runCmd->SetGuidance( "Execute test 3" );
129
130 //
131 // Debug commands
132 //
133 com = prefix+"draw";
134 drawCmd = new G4UIcmdWithAnInteger( com, this );
135 drawCmd->SetGuidance( "Draw error listed in log file" );
136
137 com = prefix+"debugInside";
138 debugInsideCmd = new G4UIcmdWithAnInteger( com, this );
139 debugInsideCmd->SetGuidance( "Call G4VSolid::Inside for error listed in log file" );
140
141 com = prefix+"debugToInP";
142 debugToInPCmd = new G4UIcmdWithAnInteger( com, this );
143 debugToInPCmd->SetGuidance( "Call G4VSolid::DistanceToIn(p) for error listed in log file" );
144
145 com = prefix+"debugToInPV";
146 debugToInPVCmd = new G4UIcmdWithAnInteger( com, this );
147 debugToInPVCmd->SetGuidance( "Call G4VSolid::DistanceToIn(p,v) for error listed in log file" );
148
149 com = prefix+"debugToOutP";
150 debugToOutPCmd = new G4UIcmdWithAnInteger( com, this );
151 debugToOutPCmd->SetGuidance( "Call G4VSolid::DistanceToOut(p) for error listed in log file" );
152
153 com = prefix+"debugToOutPV";
154 debugToOutPVCmd = new G4UIcmdWithAnInteger( com, this );
155 debugToOutPVCmd->SetGuidance( "Call G4VSolid::DistanceToOut(p,v) for error listed in log file" );
156
157 com = prefix+"debugSurfNorm";
158 debugSurfNormCmd = new G4UIcmdWithAnInteger( com, this );
159 debugSurfNormCmd->SetGuidance( "Call G4VSolid::SurfaceNormal(p) for error listed in log file" );
160
161 //
162 // Pause command
163 //
164 com = prefix+"pause";
165 pauseCmd = new G4UIcmdWithoutParameter( com, this );
166 pauseCmd->SetGuidance( " Wait for a key " );
167
168}
169
170
171//
172// Destructor
173//
174SBTMessenger::~SBTMessenger()
175{
176 delete targetCmd;
177 delete widthsCmd;
178 delete gridSizesCmd;
179 delete maxPointsCmd;
180 delete maxErrorsCmd;
181 delete errorFileCmd;
182 delete test3Directory;
183}
184
185
186//
187// InvokeTest3
188//
189// Run test 3
190//
191void SBTMessenger::InvokeTest3()
192{
193 //
194 // Is there a Solid to test?
195 //
196 G4VSolid *testSolid = solidQuery->GetSolid();
197 if (testSolid == 0) {
198 G4cerr << "Please initialize geometry before running test 3" << G4endl;
199 G4cerr << "Test 3 ABORTED" << G4endl;
200 return;
201 }
202
203 //
204 // Open output file
205 //
206 std::ofstream logFile( errorFile );
207
208 //
209 // Run the test
210 //
211 tester->RunTest( testSolid, logFile );
212}
213
214
215//
216// Debug
217//
218// Run an event that should (approximately) duplicate the conditions
219// of one of the bugs discovered in a previous test3 run and stored
220// in a log file
221//
222void SBTMessenger::Debug( const G4int errorIndex, SBTMessenger::Debugger *debugger )
223{
224 //
225 // Is there a Solid to test?
226 //
227 // If I was really clever (I'm not) I would also check
228 // to make sure we have the same solid type and even the
229 // same solid parameters.
230 //
231 G4VSolid *testSolid = solidQuery->GetSolid();
232 if (testSolid == 0) {
233 G4cerr << "Please initialize geometry before debugging/drawing" << G4endl;
234 return;
235 }
236
237 //
238 // Open output file
239 //
240 std::ifstream logFile( errorFile );
241 if (!logFile) {
242 G4cerr << "Cannot open input file " << errorFile << G4endl;
243 return;
244 }
245
246 //
247 // Debug
248 //
249 if (debugger->DebugMe( logFile, errorIndex )) {
250 G4cerr << "Error reading index " << errorIndex << " from input file " << errorFile << G4endl;
251 }
252}
253
254
255//
256// DebugMe (various classes)
257//
258G4int SBTMessenger::DrawError::DebugMe( std::ifstream &logFile, const G4int errorIndex )
259{
260 if (visManager) {
261 //
262 // Make sure we're kosher
263 //
264 if (visManager->BuildFakeWorld()) return 2;
265
266 return tester->DrawError( testSolid, logFile, errorIndex, visManager );
267 }
268
269
270 G4cerr << "Visualization is not available in this executable" << G4endl;
271 return 1;
272}
273
274G4int SBTMessenger::DebugInside::DebugMe( std::ifstream &logFile, const G4int errorIndex )
275{
276 return tester->DebugInside( testSolid, logFile, errorIndex );
277}
278
279G4int SBTMessenger::DebugToInP::DebugMe( std::ifstream &logFile, const G4int errorIndex )
280{
281 return tester->DebugToInP( testSolid, logFile, errorIndex );
282}
283
284G4int SBTMessenger::DebugToInPV::DebugMe( std::ifstream &logFile, const G4int errorIndex )
285{
286 return tester->DebugToInPV( testSolid, logFile, errorIndex );
287}
288
289G4int SBTMessenger::DebugToOutP::DebugMe( std::ifstream &logFile, const G4int errorIndex )
290{
291 return tester->DebugToOutP( testSolid, logFile, errorIndex );
292}
293
294G4int SBTMessenger::DebugToOutPV::DebugMe( std::ifstream &logFile, const G4int errorIndex )
295{
296 return tester->DebugToOutPV( testSolid, logFile, errorIndex );
297}
298
299G4int SBTMessenger::DebugSurfNorm::DebugMe( std::ifstream &logFile, const G4int errorIndex )
300{
301 return tester->DebugSurfNorm( testSolid, logFile, errorIndex );
302}
303
304//
305// SetNewValue
306//
307// Call by the UI when user requests a change
308//
309void SBTMessenger::SetNewValue( G4UIcommand *command, G4String newValues )
310{
311 if (command == targetCmd) {
312 tester->SetTarget( targetCmd->GetNew3VectorValue( newValues ) );
313 }
314 else if (command == widthsCmd) {
315 tester->SetWidths( widthsCmd->GetNew3VectorValue( newValues ) );
316 }
317 else if (command == gridSizesCmd) {
318 tester->SetGrids( gridSizesCmd->GetNew3VectorValue( newValues ) );
319 }
320 else if (command == maxPointsCmd) {
321 tester->SetMaxPoints( maxPointsCmd->GetNewIntValue( newValues ) );
322 }
323 else if (command == maxErrorsCmd) {
324 tester->SetMaxErrors( maxErrorsCmd->GetNewIntValue( newValues ) );
325 }
326 else if (command == errorFileCmd) {
327 errorFile = newValues;
328 }
329 else if (command == runCmd) {
330 InvokeTest3();
331 }
332 else if (command == drawCmd) {
333 SBTMessenger::DrawError debugger( solidQuery->GetSolid(), tester, visManager );
334 Debug( drawCmd->GetNewIntValue( newValues ), &debugger );
335 }
336 else if (command == debugInsideCmd) {
337 SBTMessenger::DebugInside debugger( solidQuery->GetSolid(), tester );
338 Debug( debugInsideCmd->GetNewIntValue( newValues ), &debugger );
339 }
340 else if (command == debugToInPCmd) {
341 SBTMessenger::DebugToInP debugger( solidQuery->GetSolid(), tester );
342 Debug( debugToInPCmd->GetNewIntValue( newValues ), &debugger );
343 }
344 else if (command == debugToInPVCmd) {
345 SBTMessenger::DebugToInPV debugger( solidQuery->GetSolid(), tester );
346 Debug( debugToInPVCmd->GetNewIntValue( newValues ), &debugger );
347 }
348 else if (command == debugToOutPCmd) {
349 SBTMessenger::DebugToOutP debugger( solidQuery->GetSolid(), tester );
350 Debug( debugToOutPCmd->GetNewIntValue( newValues ), &debugger );
351 }
352 else if (command == debugToOutPVCmd) {
353 SBTMessenger::DebugToOutPV debugger( solidQuery->GetSolid(), tester );
354 Debug( debugToOutPVCmd->GetNewIntValue( newValues ), &debugger );
355 }
356 else if (command == debugSurfNormCmd) {
357 SBTMessenger::DebugSurfNorm debugger( solidQuery->GetSolid(), tester );
358 Debug( debugSurfNormCmd->GetNewIntValue( newValues ), &debugger );
359 }
360 else if (command == pauseCmd) {
361 char c;
362
363 G4cout << "Press ENTER to continue..." << std::flush ;
364 G4cin.get(c);
365 }
366 else {
367 G4Exception( "Unrecognized command" );
368 }
369}
370
371
372//
373// GetCurrentValue
374//
375G4String SBTMessenger::GetCurrentValue( G4UIcommand *command )
376{
377 if (command == targetCmd) {
378 return targetCmd->ConvertToString( tester->GetTarget(), "m" );
379 }
380 else if (command == widthsCmd) {
381 return widthsCmd->ConvertToString( tester->GetWidths(), "m" );
382 }
383 else if (command == gridSizesCmd) {
384 return gridSizesCmd->ConvertToString( tester->GetGrids(), "m" );
385 }
386 else if (command == maxPointsCmd) {
387 return maxPointsCmd->ConvertToString( tester->GetMaxPoints() );
388 }
389 else if (command == maxErrorsCmd) {
390 return maxErrorsCmd->ConvertToString( tester->GetMaxErrors() );
391 }
392 else if (command == errorFileCmd) {
393 return errorFile;
394 }
395 else if (command == runCmd) {
396 return "";
397 }
398 else if (command == drawCmd ||
399 command == debugInsideCmd ||
400 command == debugToInPCmd ||
401 command == debugToInPVCmd ||
402 command == debugToOutPCmd ||
403 command == debugToOutPVCmd ||
404 command == debugSurfNormCmd ) {
405 return "";
406 }
407
408 G4Exception( "Unrecognized command" );
409 return "foo!";
410}
411
Note: See TracBrowser for help on using the repository browser.