Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4FukuiRenderer.cc
Go to the documentation of this file.
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// $Id$
28//
29//
30// Satoshi TANAKA
31// FukuiRenderer factory.
32
33//=================//
34#ifdef G4VIS_BUILD_DAWN_DRIVER
35//=================//
36
37//#define DEBUG_FR_SYSTEM
38
39
40#include "G4FukuiRenderer.hh"
41
42#define __G_ANSI_C__
43
44#include "G4VisManager.hh"
45//#include "G4VisFeaturesOfFukuiRenderer.hh"
46#include "G4VSceneHandler.hh"
49#include "G4FRClientServer.hh"
50#include "G4FRConst.hh"
51#include "G4FRFeatures.hh"
52
53 //----- constant
54const int FR_DEFAULT_CONNECTION_TIME = 5 ;
55const char FR_ENV_CONNECTION_TIME [] = "G4DAWN_CONNECTION_TIME";
56const char FR_ENV_DAWN_GUI_ALWAYS [] = "G4DAWN_GUI_ALWAYS";
57
58 //----- G4FukuiRenderer, constructor
59G4FukuiRenderer::G4FukuiRenderer ():
60 G4VGraphicsSystem ("FukuiRenderer",
61 "DAWN",
63 G4VGraphicsSystem::threeD),
64 fPrimDest() ,
65 fIPMode( G4FukuiRenderer::IP_UNIX ),
66 flag_use_gui (false) ,
67 flag_connected (0)
68{
69 //----- sorting of objects
70 if( ( getenv( FR_ENV_DAWN_GUI_ALWAYS ) != NULL ) && \
71 ( strcmp( getenv( FR_ENV_DAWN_GUI_ALWAYS ),"0" ) ) )
72 {
73 flag_use_gui = true ;
74 }
75}
76
77
78 //----- G4FukuiRenderer, destructor
79G4FukuiRenderer::~G4FukuiRenderer ()
80{
81 if( flag_connected ) {
82 //----- Terminate FukuiRenderer
83 fPrimDest.SendLine( FR_TERMINATE_DAWND ) ;
84
85 //----- disconnection
86 fPrimDest.DisConnect();
87 flag_connected = 0 ;
88 }
89}
90
91 //----- G4FukuiRenderer::CreateSceneHandler ()
92G4VSceneHandler* G4FukuiRenderer::CreateSceneHandler (const G4String& name)
93{
94 G4VSceneHandler* p = new G4FukuiRendererSceneHandler (*this, name);
95
96 if(!flag_connected) { delete p ; p = NULL ; }
97
98 return p;
99}
100
101 //----- G4FukuiRenderer::CreateViewer ()
102G4VViewer* G4FukuiRenderer::CreateViewer (G4VSceneHandler& scene, const G4String& name)
103{
104 if(!flag_connected) return NULL;
105 G4VViewer* pView =
106 new G4FukuiRendererViewer ((G4FukuiRendererSceneHandler&) scene, name);
107 return pView;
108}
109
110 //----- G4FukuiRenderer::UseInetDomainAuto()
111void G4FukuiRenderer::UseInetDomainAuto()
112{
113 int pid ;
114
115#if defined DEBUG_FR_SYSTEM
117 G4cout << "***** Unix Inet Domain (AUTO mode)" << G4endl;
118#endif
119 fIPMode = G4FukuiRenderer::IP_UNIX ;
120
121 if( ( pid = fork() ) == 0 ) { // child
122 if ( execlp ( "dawn", "dawn", "-G" , (char *)0 ) < 0 )
123 {
124 perror("dawn") ;
125 }
126 } else { // parent
127
128 //----- Set waiting time to ensure connection
129 int connection_time = FR_DEFAULT_CONNECTION_TIME ;
130 if( getenv( FR_ENV_CONNECTION_TIME ) != NULL ) {
131 int sscanf_status = \
132 sscanf( getenv( FR_ENV_CONNECTION_TIME ), "%d", &connection_time) ;
133 if ( sscanf_status == EOF ) {
134 connection_time = FR_DEFAULT_CONNECTION_TIME ;
135 }
136 }
137
138
139 //----- Wait for starting up of FukuiRenderer
140 sleep(connection_time);
141
142 //----- establish connection
143 this->ConnectPort();
144 }
145
146 if(!flag_connected) {
148 G4cout << "***** ERROR: Connection failed" << G4endl;
149 }
150 else {
152 G4cout << "***** GEANT4 is connected to FukuiRenderer DAWN ";
153 G4cout << "in the same host" << G4endl;
154 }
155 }
156
157} // G4FukuiRenderer::UseInetDomainAuto()
158
159
160 //----- G4FukuiRenderer::UseInetDomain()
161void
162G4FukuiRenderer::UseInetDomain()
163{
164#if defined DEBUG_FR_SYSTEM
166 G4cout << "***** INET Domain " << G4endl;
167#endif
168 fIPMode = G4FukuiRenderer::IP_INET ;
169
170 this->ConnectPort();
171
172 if(!flag_connected) {
174 G4cout << "***** ERROR: Connection failed" << G4endl;
175 }
176 else {
178 G4cout << "GEANT4 is connected to FukuiRenderer DAWN via socket" ;
179 G4cout << G4endl;
180 }
181 }
182
183} // G4FukuiRenderer::UseInetDomain()
184
185void
186G4FukuiRenderer::ConnectPort( int max_port_incr )
187{
188 //----- establish connection
189 int connect_trial = 0 ;
190 while(1) {
191 if ( ++connect_trial > max_port_incr ) {
192 this->flag_connected = 0 ;
194 G4cout << "***** INET Connection failed." << G4endl;
195 G4cout << " Maybe, you have not invoked DAWN yet," << G4endl;
196 G4cout << " or too many DAWN's are already running" << G4endl;
197 G4cout << " in the server host." << G4endl;
198 }
199 fPrimDest.IncrementPortNumber( (- FR_MAX_PORT_INCR) );
200 return ;
201 } else if ( fPrimDest.ConnectINET() ) {
202 // INET domain connection is established
203 this->flag_connected = 1 ;
205 G4cout << "***** GEANT4 is connected to port " ;
206 G4cout << fPrimDest.GetPortNumber() ;
207 G4cout << " of server" << G4endl;
208 }
209 break ;
210 } else {
211 // Connection failed. Try the next port.
212 this->flag_connected = 0 ;
213 fPrimDest.IncrementPortNumber();
215 G4cout << "***** GEANT4 incremented targeting port to " ;
216 G4cout << fPrimDest.GetPortNumber() << G4endl;
217 }
218
219 } // if-elseif-else
220
221 } // while (1)
222}
223
224
225 //----- G4FukuiRenderer::UseBSDUnixDomainAuto()
226void G4FukuiRenderer::UseBSDUnixDomainAuto()
227{
228 int pid ;
229
230#if defined DEBUG_FR_SYSTEM
232 G4cout << "***** UseBSDUnixDomainAuto " << G4endl;
233#endif
234 fIPMode = G4FukuiRenderer::IP_UNIX ; // Unix domain
235
236 if( ( pid = fork() ) == 0 ) { // child
237 if ( execlp ( "dawn", "dawn", "-g" , (char *)0 ) < 0 )
238 {
239 perror("dawn") ;
240 }
241 } else { // parent
242
243 //----- Sleep for a while to make sure that
244 //..... FukuiRenderer is ready
245 int connection_time = FR_DEFAULT_CONNECTION_TIME ;
246 if( getenv( FR_ENV_CONNECTION_TIME ) != NULL ) {
247 int sscanf_status = \
248 sscanf( getenv( FR_ENV_CONNECTION_TIME ), "%d", &connection_time) ;
249 if ( sscanf_status == EOF ) { connection_time = FR_DEFAULT_CONNECTION_TIME ;}
250 }
251 sleep(connection_time);
252
253 //----- connect GEANT4 to FukuiRenderer
254 this->flag_connected = fPrimDest.ConnectUnix();
255
256 //----- display status
257 if(!flag_connected) {
259 G4cout << "***** ERROR: Connection failed" << G4endl;
260 } else {
262 G4cout << "*** GEANT4 is connected to FukuiRenderer DAWN ";
263 G4cout << "in the same host" << G4endl;
264 }
265 }
266
267 } // if--else
268
269}// G4FukuiRenderer::UseBSDUnixDomainAuto()
270
271
272#endif // G4VIS_BUILD_DAWN_DRIVER
const char FR_TERMINATE_DAWND[]
Definition: G4FRConst.hh:52
const char FR_DAWNFILE_FEATURES[]
Definition: G4FRFeatures.hh:46
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
static Verbosity GetVerbosity()