VMC Examples
Version 6.8
Toggle main menu visibility
Loading...
Searching...
No Matches
examples
E03
E03a
src
Ex03MCApplication.cxx
Go to the documentation of this file.
1
//------------------------------------------------
2
// The Virtual Monte Carlo examples
3
// Copyright (C) 2014 - 2018 Ivana Hrivnacova
4
// All rights reserved.
5
//
6
// For the licensing terms see geant4_vmc/LICENSE.
7
// Contact: root-vmc@cern.ch
8
//-------------------------------------------------
9
10
/// \file Ex03MCApplication.cxx
11
/// \brief Implementation of the Ex03MCApplication class
12
///
13
/// Geant4 ExampleN03 adapted to Virtual Monte Carlo
14
///
15
/// \date 06/03/2002
16
/// \author I. Hrivnacova; IPN, Orsay
17
18
#include "
Ex03MCApplication.h
"
19
#include "Ex03DetectorConstructionOld.h"
20
#include "Ex03MCStack.h"
21
#include "Ex03PrimaryGenerator.h"
22
23
#include <TMCRootManager.h>
24
25
#include <Riostream.h>
26
#include <TGeoManager.h>
27
#include <TGeoUniformMagField.h>
28
#include <TInterpreter.h>
29
#include <TPDGCode.h>
30
#include <TParticle.h>
31
#include <TROOT.h>
32
#include <TRandom.h>
33
#include <TVector3.h>
34
#include <TVirtualGeoTrack.h>
35
#include <TVirtualMC.h>
36
37
using namespace
std;
38
39
/// \cond CLASSIMP
40
ClassImp(
Ex03MCApplication
)
41
/// \endcond
42
43
//_____________________________________________________________________________
44
Ex03MCApplication
::
Ex03MCApplication
(const
char
* name, const
char
* title)
45
:
TVirtualMCApplication
(name, title),
46
fRootManager
(0),
47
fPrintModulo
(1),
48
fEventNo
(0),
49
fVerbose
(0),
50
fStack
(0),
51
fDetConstruction
(0),
52
fCalorimeterSD
(0),
53
fPrimaryGenerator
(0),
54
fMagField
(0),
55
fOldGeometry
(kFALSE),
56
fIsControls
(kFALSE),
57
fIsMaster
(kTRUE)
58
{
59
/// Standard constructor
60
/// \param name The MC application name
61
/// \param title The MC application description
62
63
cout <<
"--------------------------------------------------------------"
64
<< endl;
65
cout <<
" VMC Example E03"
<< endl;
66
cout <<
"--------------------------------------------------------------"
67
<< endl;
68
69
// Create a user stack
70
fStack
=
new
Ex03MCStack
(1000);
71
72
// Create detector construction
73
fDetConstruction
=
new
Ex03DetectorConstruction
();
74
75
// Create a calorimeter SD
76
fCalorimeterSD
=
new
Ex03CalorimeterSD
(
"Calorimeter"
,
fDetConstruction
);
77
78
// Create a primary generator
79
fPrimaryGenerator
=
new
Ex03PrimaryGenerator
(
fStack
);
80
81
// Constant magnetic field (in kiloGauss)
82
fMagField
=
new
TGeoUniformMagField();
83
}
84
85
//_____________________________________________________________________________
86
Ex03MCApplication::Ex03MCApplication
(
const
Ex03MCApplication
& origin)
87
:
TVirtualMCApplication
(origin.GetName(), origin.GetTitle()),
88
fRootManager
(0),
89
fPrintModulo
(origin.
fPrintModulo
),
90
fEventNo
(0),
91
fVerbose
(origin.
fVerbose
),
92
fStack
(0),
93
fDetConstruction
(origin.
fDetConstruction
),
94
fCalorimeterSD
(0),
95
fPrimaryGenerator
(0),
96
fMagField
(0),
97
fOldGeometry
(origin.
fOldGeometry
),
98
fIsMaster
(kFALSE)
99
{
100
/// Copy constructor for cloning application on workers (in multithreading
101
/// mode) \param origin The source MC application
102
103
// Create new user stack
104
fStack
=
new
Ex03MCStack
(1000);
105
106
// Create a calorimeter SD
107
fCalorimeterSD
=
108
new
Ex03CalorimeterSD
(*(origin.
fCalorimeterSD
),
fDetConstruction
);
109
110
// Create a primary generator
111
fPrimaryGenerator
=
112
new
Ex03PrimaryGenerator
(*(origin.
fPrimaryGenerator
),
fStack
);
113
114
// Constant magnetic field (in kiloGauss)
115
fMagField
=
new
TGeoUniformMagField(origin.
fMagField
->GetFieldValue()[0],
116
origin.
fMagField
->GetFieldValue()[1], origin.
fMagField
->GetFieldValue()[2]);
117
}
118
119
//_____________________________________________________________________________
120
Ex03MCApplication::Ex03MCApplication
()
121
:
TVirtualMCApplication
(),
122
fRootManager
(0),
123
fPrintModulo
(1),
124
fEventNo
(0),
125
fStack
(0),
126
fDetConstruction
(0),
127
fCalorimeterSD
(0),
128
fPrimaryGenerator
(0),
129
fMagField
(0),
130
fOldGeometry
(kFALSE),
131
fIsControls
(kFALSE),
132
fIsMaster
(kTRUE)
133
{
134
/// Default constructor
135
}
136
137
//_____________________________________________________________________________
138
Ex03MCApplication::~Ex03MCApplication
()
139
{
140
/// Destructor
141
142
// cout << "Ex03MCApplication::~Ex03MCApplication " << this << endl;
143
144
delete
fRootManager
;
145
delete
fStack
;
146
if
(
fIsMaster
)
delete
fDetConstruction
;
147
delete
fCalorimeterSD
;
148
delete
fPrimaryGenerator
;
149
delete
fMagField
;
150
delete
gMC;
151
152
// cout << "Done Ex03MCApplication::~Ex03MCApplication " << this << endl;
153
}
154
155
//
156
// private methods
157
//
158
159
//_____________________________________________________________________________
160
void
Ex03MCApplication::RegisterStack
()
const
161
{
162
/// Register stack in the Root manager.
163
164
if
(
fRootManager
) {
165
// cout << "Ex03MCApplication::RegisterStack: " << endl;
166
fRootManager
->Register(
"stack"
,
"Ex03MCStack"
, &
fStack
);
167
}
168
}
169
170
//
171
// public methods
172
//
173
174
//_____________________________________________________________________________
175
void
Ex03MCApplication::InitMC
(
const
char
* setup)
176
{
177
/// Initialize MC.
178
/// The selection of the concrete MC is done in the macro.
179
/// \param setup The name of the configuration macro
180
181
fVerbose
.InitMC();
182
183
if
(TString(setup) !=
""
) {
184
gROOT->LoadMacro(setup);
185
gInterpreter->ProcessLine(
"Config()"
);
186
if
(!gMC) {
187
Fatal(
188
"InitMC"
,
"Processing Config() has failed. (No MC is instantiated.)"
);
189
}
190
}
191
192
// MT support available from root v 5.34/18
193
#if ROOT_VERSION_CODE >= 336402
194
// Create Root manager
195
if
(!gMC->IsMT()) {
196
fRootManager
=
new
TMCRootManager(GetName(), TMCRootManager::kWrite);
197
// fRootManager->SetDebug(true);
198
}
199
#else
200
// Create Root manager
201
fRootManager
=
new
TMCRootManager(GetName(), TMCRootManager::kWrite);
202
// fRootManager->SetDebug(true);
203
#endif
204
205
gMC->SetStack(
fStack
);
206
gMC->SetMagField(
fMagField
);
207
gMC->Init();
208
gMC->BuildPhysics();
209
210
RegisterStack
();
211
}
212
213
//_____________________________________________________________________________
214
void
Ex03MCApplication::RunMC
(Int_t nofEvents)
215
{
216
/// Run MC.
217
/// \param nofEvents Number of events to be processed
218
219
fVerbose
.RunMC(nofEvents);
220
221
gMC->ProcessRun(nofEvents);
222
FinishRun
();
223
}
224
225
//_____________________________________________________________________________
226
void
Ex03MCApplication::FinishRun
()
227
{
228
/// Finish MC run.
229
230
fVerbose
.FinishRun();
231
// cout << "Ex03MCApplication::FinishRun: " << endl;
232
if
(
fRootManager
) {
233
fRootManager
->WriteAll();
234
fRootManager
->Close();
235
}
236
}
237
238
//_____________________________________________________________________________
239
TVirtualMCApplication
*
Ex03MCApplication::CloneForWorker
()
const
240
{
241
return
new
Ex03MCApplication
(*
this
);
242
}
243
244
//_____________________________________________________________________________
245
void
Ex03MCApplication::InitOnWorker
()
246
{
247
// cout << "Ex03MCApplication::InitForWorker " << this << endl;
248
249
// Create Root manager
250
Int_t threadRank = 1;
251
// The real thread rank will be set in MCRootManager
252
fRootManager
=
new
TMCRootManager(GetName(), TMCRootManager::kWrite, threadRank);
253
// fRootManager->SetDebug(true);
254
255
// Set data to MC
256
gMC->SetStack(
fStack
);
257
gMC->SetMagField(
fMagField
);
258
259
RegisterStack
();
260
}
261
262
//_____________________________________________________________________________
263
void
Ex03MCApplication::FinishRunOnWorker
()
264
{
265
// cout << "Ex03MCApplication::FinishWorkerRun: " << endl;
266
if
(
fRootManager
) {
267
fRootManager
->WriteAll();
268
fRootManager
->Close();
269
}
270
}
271
272
//_____________________________________________________________________________
273
void
Ex03MCApplication::ReadEvent
(Int_t i)
274
{
275
/// Read \em i -th event and prints hits.
276
/// \param i The number of event to be read
277
278
if
( !
fRootManager
) {
279
fRootManager
=
new
TMCRootManager(GetName(), TMCRootManager::kRead);
280
}
281
282
fCalorimeterSD
->Register();
283
RegisterStack
();
284
fRootManager
->ReadEvent(i);
285
}
286
287
//_____________________________________________________________________________
288
void
Ex03MCApplication::ConstructGeometry
()
289
{
290
/// Construct geometry using detector contruction class.
291
/// The detector contruction class is using TGeo functions or
292
/// TVirtualMC functions (if oldGeometry is selected)
293
294
fVerbose
.ConstructGeometry();
295
296
if
(!
fOldGeometry
) {
297
fDetConstruction
->ConstructMaterials();
298
fDetConstruction
->ConstructGeometry();
299
// TGeoManager::Import("geometry.root");
300
// gMC->SetRootGeometry();
301
}
302
else
{
303
Ex03DetectorConstructionOld
detConstructionOld;
304
detConstructionOld.
ConstructMaterials
();
305
detConstructionOld.
ConstructGeometry
();
306
}
307
}
308
309
//_____________________________________________________________________________
310
void
Ex03MCApplication::InitGeometry
()
311
{
312
/// Initialize geometry
313
314
fVerbose
.InitGeometry();
315
316
fDetConstruction
->SetCuts();
317
318
if
(
fIsControls
)
fDetConstruction
->SetControls();
319
320
fCalorimeterSD
->Initialize();
321
}
322
323
//_____________________________________________________________________________
324
void
Ex03MCApplication::AddParticles
()
325
{
326
/// Example of user defined particle with user defined decay mode
327
328
fVerbose
.AddParticles();
329
330
// Define particle
331
gMC->DefineParticle(1000020050,
"He5"
, kPTHadron, 5.03427, 2.0, 0.002,
"Ion"
,
332
0.0, 0, 1, 0, 0, 0, 0, 0, 5, kFALSE);
333
334
// Define the 2 body phase space decay for He5
335
Int_t mode[6][3];
336
Float_t bratio[6];
337
338
for
(Int_t kz = 0; kz < 6; kz++) {
339
bratio[kz] = 0.;
340
mode[kz][0] = 0;
341
mode[kz][1] = 0;
342
mode[kz][2] = 0;
343
}
344
bratio[0] = 100.;
345
mode[0][0] = kNeutron;
// neutron (2112)
346
mode[0][1] = 1000020040;
// alpha
347
348
gMC->SetDecayMode(1000020050, bratio, mode);
349
350
// Overwrite a decay mode already defined in MCs
351
// Kaon Short: 310 normally decays in two modes
352
// pi+, pi- 68.61 %
353
// pi0, pi0 31.39 %
354
// and we force only the mode pi0, pi0
355
356
Int_t mode2[6][3];
357
Float_t bratio2[6];
358
359
for
(Int_t kz = 0; kz < 6; kz++) {
360
bratio2[kz] = 0.;
361
mode2[kz][0] = 0;
362
mode2[kz][1] = 0;
363
mode2[kz][2] = 0;
364
}
365
bratio2[0] = 100.;
366
mode2[0][0] = kPi0;
// pi0 (111)
367
mode2[0][1] = kPi0;
// pi0 (111)
368
369
gMC->SetDecayMode(kK0Short, bratio2, mode2);
370
}
371
372
//_____________________________________________________________________________
373
void
Ex03MCApplication::AddIons
()
374
{
375
/// Example of user defined ion
376
377
fVerbose
.AddIons();
378
379
gMC->DefineIon(
"MyIon"
, 34, 70, 12, 0.);
380
}
381
382
//_____________________________________________________________________________
383
void
Ex03MCApplication::GeneratePrimaries
()
384
{
385
/// Fill the user stack (derived from TVirtualMCStack) with primary particles.
386
387
fVerbose
.GeneratePrimaries();
388
389
TVector3 origin(
fDetConstruction
->GetWorldSizeX(),
390
fDetConstruction
->GetCalorSizeYZ(),
fDetConstruction
->GetCalorSizeYZ());
391
392
fPrimaryGenerator
->GeneratePrimaries(origin);
393
}
394
395
//_____________________________________________________________________________
396
void
Ex03MCApplication::BeginEvent
()
397
{
398
/// User actions at beginning of event
399
400
fVerbose
.BeginEvent();
401
402
// Clear TGeo tracks (if filled)
403
if
(TString(gMC->GetName()) ==
"TGeant3TGeo"
&&
404
gGeoManager->GetListOfTracks() && gGeoManager->GetTrack(0) &&
405
((TVirtualGeoTrack*)gGeoManager->GetTrack(0))->HasPoints()) {
406
407
gGeoManager->ClearTracks();
408
// if (gPad) gPad->Clear();
409
}
410
411
fEventNo
++;
412
if
(
fEventNo
%
fPrintModulo
== 0) {
413
cout <<
"\n---> Begin of event: "
<<
fEventNo
<< endl;
414
// ??? How to do this in VMC
415
// HepRandom::showEngineStatus();
416
}
417
}
418
419
//_____________________________________________________________________________
420
void
Ex03MCApplication::BeginPrimary
()
421
{
422
/// User actions at beginning of a primary track.
423
/// If test for user defined decay is activated,
424
/// the primary track ID is printed on the screen.
425
426
fVerbose
.BeginPrimary();
427
428
if
(
fPrimaryGenerator
->GetUserDecay()) {
429
cout <<
" Primary track ID = "
<<
fStack
->GetCurrentTrackNumber() << endl;
430
}
431
}
432
433
//_____________________________________________________________________________
434
void
Ex03MCApplication::PreTrack
()
435
{
436
/// User actions at beginning of each track
437
/// If test for user defined decay is activated,
438
/// the decay products of the primary track (K0Short)
439
/// are printed on the screen.
440
441
fVerbose
.PreTrack();
442
443
// print info about K0Short decay products
444
if
(
fPrimaryGenerator
->GetUserDecay()) {
445
Int_t parentID =
fStack
->GetCurrentParentTrackNumber();
446
447
if
(parentID >= 0 &&
448
fStack
->GetParticle(parentID)->GetPdgCode() == kK0Short &&
449
fStack
->GetCurrentTrack()->GetUniqueID() == kPDecay) {
450
// The production process is saved as TParticle unique ID
451
// via Ex03MCStack
452
453
cout <<
" Current track "
<<
fStack
->GetCurrentTrack()->GetName()
454
<<
" is a decay product of Parent ID = "
455
<<
fStack
->GetCurrentParentTrackNumber() << endl;
456
}
457
}
458
}
459
460
//_____________________________________________________________________________
461
void
Ex03MCApplication::Stepping
()
462
{
463
/// User actions at each step
464
465
// Work around for Fluka VMC, which does not call
466
// MCApplication::PreTrack()
467
//
468
469
static
Int_t trackId = 0;
470
if
(TString(gMC->GetName()) ==
"TFluka"
&&
471
gMC->GetStack()->GetCurrentTrackNumber() != trackId) {
472
fVerbose
.PreTrack();
473
trackId = gMC->GetStack()->GetCurrentTrackNumber();
474
}
475
476
fVerbose
.Stepping();
477
478
fCalorimeterSD
->ProcessHits();
479
}
480
481
//_____________________________________________________________________________
482
void
Ex03MCApplication::PostTrack
()
483
{
484
/// User actions after finishing of each track
485
486
fVerbose
.PostTrack();
487
}
488
489
//_____________________________________________________________________________
490
void
Ex03MCApplication::FinishPrimary
()
491
{
492
/// User actions after finishing of a primary track
493
494
fVerbose
.FinishPrimary();
495
496
if
(
fPrimaryGenerator
->GetUserDecay()) {
497
cout << endl;
498
}
499
}
500
501
//_____________________________________________________________________________
502
void
Ex03MCApplication::FinishEvent
()
503
{
504
/// User actions after finishing of an event
505
506
fVerbose
.FinishEvent();
507
508
// Geant3 + TGeo
509
// (use TGeo functions for visualization)
510
if
(TString(gMC->GetName()) ==
"TGeant3TGeo"
) {
511
512
// Draw volume
513
gGeoManager->SetVisOption(0);
514
gGeoManager->SetTopVisible();
515
gGeoManager->GetTopVolume()->Draw();
516
517
// Draw tracks (if filled)
518
// Available when this feature is activated via
519
// gMC->SetCollectTracks(kTRUE);
520
if
(gGeoManager->GetListOfTracks() && gGeoManager->GetTrack(0) &&
521
((TVirtualGeoTrack*)gGeoManager->GetTrack(0))->HasPoints()) {
522
523
gGeoManager->DrawTracks(
"/*"
);
// this means all tracks
524
}
525
}
526
527
fRootManager
->Fill();
528
529
if
(
fEventNo
%
fPrintModulo
== 0)
fCalorimeterSD
->PrintTotal();
530
531
fCalorimeterSD
->EndOfEvent();
532
533
fStack
->Reset();
534
}
Ex03MCApplication.h
Definition of the Ex03MCApplication class.
Ex03CalorimeterSD
The calorimeter sensitive detector.
Definition
Ex03CalorimeterSD.h:36
Ex03DetectorConstructionOld
The old detector construction (via VMC functions).
Definition
Ex03DetectorConstructionOld.h:35
Ex03DetectorConstructionOld::ConstructGeometry
void ConstructGeometry()
Definition
Ex03DetectorConstructionOld.cxx:256
Ex03DetectorConstructionOld::ConstructMaterials
void ConstructMaterials()
Definition
Ex03DetectorConstructionOld.cxx:89
Ex03DetectorConstruction
The detector construction (via TGeo ).
Definition
Ex03DetectorConstruction.h:35
Ex03MCApplication
Implementation of the TVirtualMCApplication.
Definition
Ex03MCApplication.h:40
Ex03MCApplication::fPrintModulo
Int_t fPrintModulo
The event modulus number to be printed.
Definition
Ex03MCApplication.h:90
Ex03MCApplication::~Ex03MCApplication
virtual ~Ex03MCApplication()
Definition
Ex03MCApplication.cxx:138
Ex03MCApplication::fMagField
TGeoUniformMagField * fMagField
Magnetic field.
Definition
Ex03MCApplication.h:97
Ex03MCApplication::fIsControls
Bool_t fIsControls
Option to activate special controls.
Definition
Ex03MCApplication.h:99
Ex03MCApplication::fVerbose
TMCVerbose fVerbose
VMC verbose helper.
Definition
Ex03MCApplication.h:92
Ex03MCApplication::fIsMaster
Bool_t fIsMaster
If is on master thread.
Definition
Ex03MCApplication.h:100
Ex03MCApplication::fPrimaryGenerator
Ex03PrimaryGenerator * fPrimaryGenerator
Primary generator.
Definition
Ex03MCApplication.h:96
Ex03MCApplication::Ex03MCApplication
Ex03MCApplication()
Definition
Ex03MCApplication.cxx:120
Ex03MCApplication::FinishRun
void FinishRun()
Definition
Ex03MCApplication.cxx:226
Ex03MCApplication::RegisterStack
void RegisterStack() const
Definition
Ex03MCApplication.cxx:160
Ex03MCApplication::fStack
Ex03MCStack * fStack
VMC stack.
Definition
Ex03MCApplication.h:93
Ex03MCApplication::fCalorimeterSD
Ex03CalorimeterSD * fCalorimeterSD
Calorimeter SD.
Definition
Ex03MCApplication.h:95
Ex03MCApplication::Ex03MCApplication
Ex03MCApplication(const char *name, const char *title)
Definition
Ex03MCApplication.cxx:44
Ex03MCApplication::fDetConstruction
Ex03DetectorConstruction * fDetConstruction
Dector construction.
Definition
Ex03MCApplication.h:94
Ex03MCApplication::fOldGeometry
Bool_t fOldGeometry
Option for geometry definition.
Definition
Ex03MCApplication.h:98
Ex03MCApplication::fEventNo
Int_t fEventNo
Event counter.
Definition
Ex03MCApplication.h:91
Ex03MCApplication::fRootManager
TMCRootManager * fRootManager
Root manager.
Definition
Ex03MCApplication.h:89
Ex03MCStack
Implementation of the TVirtualMCStack interface.
Definition
Ex03MCStack.h:36
Ex03PrimaryGenerator
The primary generator.
Definition
Ex03PrimaryGenerator.h:34
Ex03bMCApplication::BeginPrimary
virtual void BeginPrimary()
Definition
Ex03bMCApplication.cxx:439
Ex03bMCApplication::GeneratePrimaries
virtual void GeneratePrimaries()
Definition
Ex03bMCApplication.cxx:402
Ex03bMCApplication::CloneForWorker
virtual TVirtualMCApplication * CloneForWorker() const
Definition
Ex03bMCApplication.cxx:239
Ex03bMCApplication::PostTrack
virtual void PostTrack()
Definition
Ex03bMCApplication.cxx:501
Ex03bMCApplication::InitMC
void InitMC(const char *setup)
Definition
Ex03bMCApplication.cxx:175
Ex03bMCApplication::BeginEvent
virtual void BeginEvent()
Definition
Ex03bMCApplication.cxx:415
Ex03bMCApplication::InitGeometry
virtual void InitGeometry()
Definition
Ex03bMCApplication.cxx:329
Ex03bMCApplication::Stepping
virtual void Stepping()
Definition
Ex03bMCApplication.cxx:480
Ex03bMCApplication::RunMC
void RunMC(Int_t nofEvents)
Definition
Ex03bMCApplication.cxx:214
Ex03bMCApplication::AddParticles
virtual void AddParticles()
Definition
Ex03bMCApplication.cxx:343
Ex03bMCApplication::FinishRunOnWorker
virtual void FinishRunOnWorker()
Definition
Ex03bMCApplication.cxx:263
Ex03bMCApplication::FinishPrimary
virtual void FinishPrimary()
Definition
Ex03bMCApplication.cxx:509
Ex03bMCApplication::ConstructGeometry
virtual void ConstructGeometry()
Definition
Ex03bMCApplication.cxx:288
Ex03bMCApplication::AddIons
virtual void AddIons()
Definition
Ex03bMCApplication.cxx:392
Ex03bMCApplication::FinishEvent
virtual void FinishEvent()
Definition
Ex03bMCApplication.cxx:531
Ex03bMCApplication::FinishRun
void FinishRun()
Definition
Ex03bMCApplication.cxx:226
Ex03bMCApplication::ReadEvent
void ReadEvent(Int_t i)
Definition
Ex03bMCApplication.cxx:273
Ex03bMCApplication::RegisterStack
void RegisterStack() const
Definition
Ex03bMCApplication.cxx:160
Ex03bMCApplication::PreTrack
virtual void PreTrack()
Definition
Ex03bMCApplication.cxx:453
Ex03bMCApplication::InitOnWorker
virtual void InitOnWorker()
Definition
Ex03bMCApplication.cxx:245
TVirtualMCApplication
Generated on
for VMC Examples by
1.17.0