Geant4
9.6.p02
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
geant4_9_6_p02
examples
advanced
medical_linac
ml2.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
// The code was written by :
27
// ^Claudio Andenna claudio.andenna@ispesl.it, claudio.andenna@iss.infn.it
28
// *Barbara Caccia barbara.caccia@iss.it
29
// with the support of Pablo Cirrone (LNS, INFN Catania Italy)
30
// with the contribute of Alessandro Occhigrossi*
31
//
32
// ^INAIL DIPIA - ex ISPESL and INFN Roma, gruppo collegato Sanità , Italy
33
// *Istituto Superiore di Sanità and INFN Roma, gruppo collegato Sanità , Italy
34
// Viale Regina Elena 299, 00161 Roma (Italy)
35
// tel (39) 06 49902246
36
// fax (39) 06 49387075
37
//
38
// more information:
39
// http://g4advancedexamples.lngs.infn.it/Examples/medical-linac
40
//
41
//*******************************************************//
42
43
44
#include "
ML2Main.hh
"
45
46
#include "
ML2PrimaryGenerationAction.hh
"
47
#include "
ML2WorldConstruction.hh
"
48
#include "
ML2PhysicsList.hh
"
49
#include "
ML2SteppingAction.hh
"
50
#include "
ML2EventAction.hh
"
51
#include "
ML2TrackingAction.hh
"
52
53
#include "
G4UImanager.hh
"
54
#include "
G4Timer.hh
"
55
56
57
#ifdef G4VIS_USE
58
#include "
G4VisExecutive.hh
"
59
#endif
60
#ifdef G4UI_USE
61
#include "
G4UIExecutive.hh
"
62
#endif
63
64
65
66
#ifdef G4VIS_USE
67
void
visio(
int
argc,
char
* argv[])
68
{
69
G4VisManager
*visManager=
new
G4VisExecutive
;
70
visManager->
Initialize
();
71
#ifdef G4UI_USE
72
G4UIExecutive
*ui =
new
G4UIExecutive
(argc, argv);
73
G4UImanager
*UImanager =
G4UImanager::GetUIpointer
();
74
UImanager->
ApplyCommand
(
"/control/execute vis.mac"
);
75
ui->
SessionStart
();
76
delete
ui;
77
#endif
78
delete
visManager;
79
}
80
#endif
81
82
int
main
(
int
argc,
char
* argv[])
83
{
84
// instantiate the world class
85
CML2WorldConstruction
*myWorld=
CML2WorldConstruction::GetInstance
();
86
87
G4RunManager
*runManager=
new
G4RunManager
();
88
ML2PhysicsList
*physics=
new
ML2PhysicsList
();
89
runManager->
SetUserInitialization
(physics);
90
91
// build the primary generator
92
CML2PrimaryGenerationAction
*gun;
93
gun =
CML2PrimaryGenerationAction::GetInstance
();
94
95
// build the main messenger class for the input data
96
CML2CInputData
*myInputData;
97
myInputData=
new
CML2CInputData
();
98
99
// initialize the primary generator variables
100
gun->
inizialize
(&myInputData->
inputData
.
primaryParticleData
);
101
102
// according to the number of the launching line
103
if
(argc==1)
104
{
105
myInputData->
inputData
.
generalData
.
seed
=1;
106
myInputData->
inputData
.
generalData
.
StartFileInputData
=
"ml2.mac"
;
107
}
108
if
(argc==2)
109
{
110
myInputData->
inputData
.
generalData
.
seed
=1;
111
myInputData->
inputData
.
generalData
.
StartFileInputData
=(
G4String
)argv[1];
112
}
113
if
(argc==3)
114
{
115
sscanf(argv[2],
"%d"
, &myInputData->
inputData
.
generalData
.
seed
);
116
myInputData->
inputData
.
generalData
.
StartFileInputData
=(
G4String
)argv[1];
117
}
118
119
// read the main mac file and execute the commands
120
G4UImanager
* UImanager =
G4UImanager::GetUIpointer
();
121
G4String
command =
"/control/execute "
;
122
UImanager->
ApplyCommand
(command+myInputData->
inputData
.
generalData
.
StartFileInputData
);
123
124
125
// set and initialize the random generator
126
CLHEP::HepRandom::setTheEngine
(
new
CLHEP::RanecuEngine
);
127
CLHEP::HepRandom :: setTheSeed
(myInputData->
inputData
.
generalData
.
seed
);
128
129
// create the world class
130
if
(!myWorld->
create
(&myInputData->
inputData
, myInputData->
getbOnlyVisio
()))
131
{
132
return
1;
// if it fails to create the world
133
}
134
else
135
{
136
// initialize the primary generator according to the choosen particle source
137
gun->
design
(myWorld->
getCML2AcceleratorConstruction
()->
getAcceleratorIsoCentre
());
138
}
139
140
// instantiate the convergence control class and assign it to myStepAction
141
CML2Convergence
*convergence=
new
CML2Convergence
(myInputData->
inputData
.
generalData
.
seed
, myInputData->
inputData
.
generalData
.
saving_in_Selected_Voxels_every_events
, myInputData->
inputData
.
generalData
.
fileExperimentalData
, myInputData->
inputData
.
generalData
.
fileExperimentalDataOut
, myInputData->
inputData
.
generalData
.
bCompareExp
, myInputData->
inputData
.
generalData
.
maxNumberOfEvents
, gun->
getNrecycling
(), myInputData->
inputData
.
generalData
.
nMaxLoop
);
142
143
144
// build the ML2RunAction to assign the single phantom name at each run
145
CML2RunAction
*myRunAction=
new
CML2RunAction
(convergence, myInputData->
inputData
.
generalData
.
nBeam
, myInputData->
bOnlyVisio
);
146
147
CML2SteppingAction
*myStepAction=
new
CML2SteppingAction
(convergence);
148
CML2EventAction
*ML2EventAction =
new
CML2EventAction
();
149
150
runManager->
SetUserInitialization
(myWorld);
151
runManager->
SetUserAction
(myRunAction);
152
runManager->
SetUserAction
(gun);
153
runManager->
SetUserAction
(myStepAction);
154
runManager->
SetUserAction
(ML2EventAction);
155
runManager->
SetUserAction
(
new
CML2TrackingAction
);
156
runManager->
Initialize
();
157
158
// performances info
159
int
nLoop=0;
160
G4Timer
MyFullTime;
161
G4double
loopElapsedTime;
162
G4bool
bStopRun=
false
;
163
G4bool
bNewGeometry=
true
;
164
if
(myInputData->
bOnlyVisio
)
165
{
166
#ifdef G4VIS_USE
167
// visualization
168
myWorld->
newGeometry
();
169
convergence->
setNewGeometry
();
170
visio(argc, argv);
171
#endif
172
}
173
else
174
{
175
MyFullTime.
Start
();
176
// compute
177
while
(bNewGeometry)
178
{
179
bNewGeometry=myWorld->
newGeometry
();
180
convergence->
setNewGeometry
();
181
if
(bNewGeometry)
182
{
183
if
(
CML2PhantomConstruction::GetInstance
()->getPhantomName()!=
"Dicom1"
)
184
{
CML2WorldConstruction::GetInstance
()->
checkVolumeOverlap
();}
185
std::cout<<
"################ START NEW GEOMETRY ########################"
<<
'\n'
;
186
myRunAction->setActualLoop(nLoop);
187
while
(!bStopRun)
188
{
189
runManager->
BeamOn
(myInputData->
inputData
.
generalData
.
nBeam
);
190
// check if the run has to be reapeted
191
bStopRun=convergence->
stopRun
();
192
}
193
nLoop=0;
194
std::cout<<
"################ END NEW GEOMETRY ########################"
<<
'\n'
;
195
}
196
bStopRun=
false
;
197
}
198
MyFullTime.
Stop
();
199
loopElapsedTime=MyFullTime.
GetUserElapsed
();
200
std::cout <<
"loop elapsed time [s] : "
<< loopElapsedTime <<
'\n'
;
201
std::cout <<
'\n'
;
202
}
203
delete
runManager;
204
return
0;
205
}
206
Generated on Sat May 25 2013 14:32:13 for Geant4 by
1.8.4