source: trunk/documents/UserDoc/DocBookUsersGuides/ForApplicationDeveloper/xml/UserActions/optionalActions.xml@ 989

Last change on this file since 989 was 904, checked in by garnier, 17 years ago

ajout de la doc

File size: 12.3 KB
Line 
1<!-- ******************************************************** -->
2<!-- -->
3<!-- [History] -->
4<!-- Changed by: Katsuya Amako, 9-Jul-1998 -->
5<!-- Changed by: Katsuya Amako, 4-Aug-1998 -->
6<!-- Changed by: John Allison, 4-Aug-1998 -->
7<!-- Changed by: Katsuya Amako, 30-Nov-1998 -->
8<!-- Changed by: Dennis Wright, 27-Nov-2001 -->
9<!-- Proof read by: Joe Chuma, 2-Jul-1999 -->
10<!-- Converted to DocBook: Katsuya Amako, Aug-2006 -->
11<!-- -->
12<!-- ******************************************************** -->
13
14
15<!-- ******************* Section (Level#1) ****************** -->
16<sect1 id="sect.OptUAct">
17<title>
18Optional User Actions
19</title>
20
21<para>
22There are five virtual classes whose methods the user may override
23in order to gain control of the simulation at various stages. Each
24method of each action class has an empty default implementation,
25allowing the user to inherit and implement desired classes and
26methods. Objects of user action classes must be registered with
27<literal>G4RunManager</literal>.
28</para>
29
30<!-- ******* Bridgehead ******* -->
31<bridgehead renderas='sect4'>
32<literal>G4UserRunAction</literal>
33</bridgehead>
34
35<para>
36This class has three virtual methods which are invoked by
37<literal>G4RunManager</literal> for each run:
38
39<variablelist><title></title>
40 <varlistentry>
41 <term>
42 <literal>GenerateRun()</literal>
43 </term>
44 <listitem><para>
45 This method is invoked at the beginning of <literal>BeamOn</literal>.
46 Because the user can inherit the class <literal>G4Run</literal> and create
47 his/her own concrete class to store some information about the run,
48 the <literal>GenerateRun()</literal> method is the place to instantiate such
49 an object. It is also the ideal place to set variables which affect
50 the physics table (such as production thresholds) for a particular
51 run, because <literal>GenerateRun()</literal> is invoked before the
52 calculation of the physics table.
53 </para></listitem>
54 </varlistentry>
55 <varlistentry>
56 <term>
57 <literal>BeginOfRunAction()</literal>
58 </term>
59 <listitem><para>
60 This method is invoked before entering the event loop. A
61 typical use of this method would be to initialize and/or book
62 histograms for a particular run. This method is invoked after the
63 calculation of the physics tables.
64 </para></listitem>
65 </varlistentry>
66 <varlistentry>
67 <term>
68 <literal>EndOfRunAction()</literal>
69 </term>
70 <listitem><para>
71 This method is invoked at the very end of the run processing.
72 It is typically used for a simple analysis of the processed run.
73 </para></listitem>
74 </varlistentry>
75</variablelist>
76</para>
77
78<para>
79<example id="programlist_OptUAct_1">
80<title>
81<literal>G4UserRunAction</literal>
82</title>
83<programlisting>
84 class G4UserRunAction
85 {
86 public:
87 G4UserRunAction();
88 virtual ~G4UserRunAction();
89
90 public:
91 virtual G4Run* GenerateRun();
92 virtual void BeginOfRunAction(const G4Run*);
93 virtual void EndOfRunAction(const G4Run*);
94 };
95</programlisting>
96</example>
97</para>
98
99
100<!-- ******* Bridgehead ******* -->
101<bridgehead renderas='sect4'>
102<literal>G4UserEventAction</literal>
103</bridgehead>
104
105<para>
106This class has two virtual methods which are invoked by
107<literal>G4EventManager</literal> for each event:
108
109<variablelist><title></title>
110 <varlistentry>
111 <term>
112 <literal>beginOfEventAction()</literal>
113 </term>
114 <listitem><para>
115 This method is invoked before converting the primary particles
116 to <literal>G4Track</literal> objects. A typical use of this method
117 would be to initialize and/or book histograms for a particular event.
118 </para></listitem>
119 </varlistentry>
120 <varlistentry>
121 <term>
122 <literal>endOfEventAction()</literal>
123 </term>
124 <listitem><para>
125 This method is invoked at the very end of event processing. It
126 is typically used for a simple analysis of the processed event.
127 If the user wants to keep the currently processing event until the
128 end of the current run, the user can invoke
129 <literal>fpEventManager->KeepTheCurrentEvent();</literal>
130 so that it is kept in <emphasis>G4Run</emphasis> object. This should
131 be quite useful if you simulate quite many events and want to
132 visualize only the most interest ones after the long execution.
133 Given the memory size of an event and its contents may be large,
134 it is the user's responsibility not to keep unnecessary events.
135 </para></listitem>
136 </varlistentry>
137</variablelist>
138</para>
139
140<para>
141<example id="programlist_OptUAct_2">
142<title>
143<literal>G4UserEventAction</literal>
144</title>
145
146<programlisting>
147 class G4UserEventAction
148 {
149 public:
150 G4UserEventAction() {;}
151 virtual ~G4UserEventAction() {;}
152 virtual void BeginOfEventAction(const G4Event*);
153 virtual void EndOfEventAction(const G4Event*);
154 protected:
155 G4EventManager* fpEventManager;
156 };
157</programlisting>
158</example>
159</para>
160
161<!-- ******* Bridgehead ******* -->
162<bridgehead renderas='sect4'>
163<literal>G4UserStackingAction</literal>
164</bridgehead>
165
166<para>
167This class has three virtual methods, <literal>ClassifyNewTrack</literal>,
168<literal>NewStage</literal> and <literal>PrepareNewEvent</literal> which the
169user may override in order to control the various track stacking mechanisms.
170ExampleN04 could be a good example to understand the usage of this class.
171</para>
172
173<para>
174<literal>ClassifyNewTrack()</literal> is invoked by
175<literal>G4StackManager</literal> whenever a new <literal>G4Track</literal>
176object is "pushed" onto a stack by <literal>G4EventManager</literal>.
177<literal>ClassifyNewTrack()</literal> returns an enumerator,
178<literal>G4ClassificationOfNewTrack</literal>, whose value indicates to which
179stack, if any, the track will be sent. This value should be
180determined by the user. <literal>G4ClassificationOfNewTrack</literal> has
181four possible values:
182
183<itemizedlist spacing="compact">
184 <listitem><para>
185 <literal>fUrgent</literal> - track is placed in the
186 <emphasis>urgent</emphasis> stack
187 </para></listitem>
188 <listitem><para>
189 <literal>fWaiting</literal> - track is placed in the
190 <emphasis>waiting</emphasis> stack, and will not be simulated until
191 the <emphasis>urgent</emphasis> stack is empty
192 </para></listitem>
193 <listitem><para>
194 <literal>fPostpone</literal> - track is postponed to the next event
195 </para></listitem>
196 <listitem><para>
197 <literal>fKill</literal> - the track is deleted immediately and not
198 stored in any stack.
199 </para></listitem>
200</itemizedlist>
201</para>
202
203<para>
204These assignments may be made based on the origin of the track
205which is obtained as follows:
206
207<informalexample>
208<programlisting>
209 G4int parent_ID = aTrack-&gt;get_parentID();
210</programlisting>
211</informalexample>
212
213where
214
215<itemizedlist spacing="compact">
216 <listitem><para>
217 <literal>parent_ID = 0</literal> indicates a primary particle
218 </para></listitem>
219 <listitem><para>
220 <literal>parent_ID &gt; 0</literal> indicates a secondary particle
221 </para></listitem>
222 <listitem><para>
223 <literal>parent_ID &lt; 0</literal> indicates postponed particle from
224 previous event.
225 </para></listitem>
226</itemizedlist>
227</para>
228
229<para>
230<literal>NewStage()</literal> is invoked when the <emphasis>urgent</emphasis>
231stack is empty and the <emphasis>waiting</emphasis> stack contains at least one
232<literal>G4Track</literal> object. Here the user may kill or re-assign to
233different stacks all the tracks in the <emphasis>waiting</emphasis> stack by
234calling the <literal>stackManager-&gt;ReClassify()</literal> method which, in
235turn, calls the <literal>ClassifyNewTrack()</literal> method. If no user
236action is taken, all tracks in the <emphasis>waiting</emphasis> stack are
237transferred to the <emphasis>urgent</emphasis> stack. The user may also decide to
238abort the current event even though some tracks may remain in the
239<emphasis>waiting</emphasis> stack by calling <literal>stackManager-&gt;clear()</literal>.
240This method is valid and safe only if it is called from the
241<literal>G4UserStackingAction</literal> class. A global method of event
242abortion is
243
244<informalexample>
245<programlisting>
246 G4UImanager * UImanager = G4UImanager::GetUIpointer();
247 UImanager-&gt;ApplyCommand("/event/abort");
248</programlisting>
249</informalexample>
250</para>
251
252<para>
253<literal>PrepareNewEvent()</literal> is invoked at the beginning of each
254event. At this point no primary particles have been converted to
255tracks, so the <emphasis>urgent</emphasis> and <emphasis>waiting</emphasis>
256stacks are empty. However, there may be tracks in the
257<emphasis>postponed-to-next-event</emphasis> stack;
258for each of these the <literal>ClassifyNewTrack()</literal> method is
259called and the track is assigned to the appropriate stack.
260
261<example id="programlist_OptUAct_3">
262<title>
263<literal>G4UserStackingAction</literal>
264</title>
265
266<programlisting>
267 #include "G4ClassificationOfNewTrack.hh"
268
269 class G4UserStackingAction
270 {
271 public:
272 G4UserStackingAction();
273 virtual ~G4UserStackingAction();
274 protected:
275 G4StackManager * stackManager;
276
277 public:
278 //---------------------------------------------------------------
279 // virtual methods to be implemented by user
280 //---------------------------------------------------------------
281 //
282 virtual G4ClassificationOfNewTrack
283 ClassifyNewTrack(const G4Track*);
284 //
285 //---------------------------------------------------------------
286 //
287 virtual void NewStage();
288 //
289 //---------------------------------------------------------------
290 //
291 virtual void PrepareNewEvent();
292 //
293 //---------------------------------------------------------------
294
295 };
296</programlisting>
297</example>
298</para>
299
300
301<!-- ******* Bridgehead ******* -->
302<bridgehead renderas='sect4'>
303<literal>G4UserTrackingAction</literal>
304</bridgehead>
305
306<para>
307<example id="programlist_OptUAct_4">
308<title>
309<literal>G4UserTrackingAction</literal>
310</title>
311
312<programlisting>
313 //---------------------------------------------------------------
314 //
315 // G4UserTrackingAction.hh
316 //
317 // Description:
318 // This class represents actions taken place by the user at each
319 // end of stepping.
320 //
321 //---------------------------------------------------------------
322
323 ///////////////////////////
324 class G4UserTrackingAction
325 ///////////////////////////
326 {
327
328 //--------
329 public:
330 //--------
331
332 // Constructor &amp; Destructor
333 G4UserTrackingAction(){};
334 virtual ~G4UserTrackingAction(){}
335
336 // Member functions
337 virtual void PreUserTrackingAction(const G4Track*){}
338 virtual void PostUserTrackingAction(const G4Track*){}
339
340 //-----------
341 protected:
342 //-----------
343
344 // Member data
345 G4TrackingManager* fpTrackingManager;
346
347 };
348</programlisting>
349</example>
350</para>
351
352
353<!-- ******* Bridgehead ******* -->
354<bridgehead renderas='sect4'>
355<literal>G4UserSteppingAction</literal>
356</bridgehead>
357
358<para>
359<example id="programlist_OptUAct_5">
360<title>
361<literal>G4UserSteppingAction</literal>
362</title>
363
364<programlisting>
365 //---------------------------------------------------------------
366 //
367 // G4UserSteppingAction.hh
368 //
369 // Description:
370 // This class represents actions taken place by the user at each
371 // end of stepping.
372 //
373 //---------------------------------------------------------------
374
375 ///////////////////////////
376 class G4UserSteppingAction
377 ///////////////////////////
378 {
379
380 //--------
381 public:
382 //--------
383
384 // Constructor and destructor
385 G4UserSteppingAction(){}
386 virtual ~G4UserSteppingAction(){}
387
388 // Member functions
389 virtual void UserSteppingAction(const G4Step*){}
390
391 //-----------
392 protected:
393 //-----------
394
395 // Member data
396 G4SteppingManager* fpSteppingManager;
397
398 };
399</programlisting>
400</example>
401</para>
402
403
404</sect1>
Note: See TracBrowser for help on using the repository browser.