-
Notifications
You must be signed in to change notification settings - Fork 0
/
CLICSid.py
118 lines (107 loc) · 4.38 KB
/
CLICSid.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# ==========================================================================
# AIDA Detector description implementation
# --------------------------------------------------------------------------
# Copyright (C) Organisation europeenne pour la Recherche nucleaire (CERN)
# All rights reserved.
#
# For the licensing terms see $DD4hepINSTALL/LICENSE.
# For the list of contributors see $DD4hepINSTALL/doc/CREDITS.
#
# ==========================================================================
#
from __future__ import absolute_import, unicode_literals
import sys
import logging
import DDG4
logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
class CLICSid:
def __init__(self, tracker='Geant4TrackerCombineAction', no_physics=True):
self.kernel = DDG4.Kernel()
self.description = self.kernel.detectorDescription()
self.geant4 = DDG4.Geant4(self.kernel, tracker=tracker)
self.kernel.UI = ""
if no_physics:
self.noPhysics()
def loadGeometry(self, file=None):
import os
if file is None:
#install_dir = #os.environ['DD4hepINSTALL']
level = DDG4.printLevel()
DDG4.setPrintLevel(DDG4.OutputLevel.WARNING)
self.kernel.loadGeometry(str("/gpfs/slac/atlas/fs1/u/hjia625/C3/dd4hep/lcgeo/SiD/compact/sidloi3/sidloi3_v00.xml"))
#self.kernel.loadGeometry(str("/gpfs/slac/atlas/fs1/u/hjia625/C3/dd4hep/lcgeo/SiD/compact/SiD_o2_v04/SiD_o2_v04.xml"))
DDG4.setPrintLevel(level)
else:
ui = DDG4.DD4hepUI(self.description)
ui.importROOT(file)
return self
# Example to show how to configure G4 magnetic field tracking
def setupField(self, quiet=True):
return self.geant4.setupTrackingField(prt=True)
# Example to show how to setup random generator
def setupRandom(self, name, type=None, seed=None, quiet=True):
rndm = DDG4.Action(self.kernel, 'Geant4Random/' + name)
if seed:
rndm.Seed = seed
if type:
rndm.Type = type
rndm.initialize()
if not quiet:
rndm.showStatus()
return rndm
# Example to show how to configure the Geant4 physics list
def setupPhysics(self, model):
phys = self.geant4.setupPhysics(model)
ph = DDG4.PhysicsList(self.kernel, str('Geant4PhysicsList/Myphysics'))
# Add bosons to the model (redundant if already implemented by the model)
ph.addParticleGroup(str('G4BosonConstructor'))
# Add leptons to the model (redundant if already implemented by the model)
ph.addParticleGroup(str('G4LeptonConstructor'))
# Add multiple scattering in the material
ph.addParticleProcess(str('mu[+-]'), str('G4MuMultipleScattering'), -1, 1, 1)
ph.addParticleProcess(str('mu[+-]'), str('G4MuIonisation'), -1, 2, 2)
ph.addParticleProcess(str('mu[+-]'), str('G4MuBremsstrahlung'), -1, 3, 3)
# Add optical physics (RICH dets etc)
ph.addPhysicsConstructor(str('G4OpticalPhysics'))
# Interactivity
ph.enableUI()
phys.adopt(ph)
phys.dump()
return phys
# No physics list wanted for tests ? See how:
def noPhysics(self):
self.geant4.setupPhysics('')
return self
def setupDetectors(self):
logger.info("# First the tracking detectors")
seq, act = self.geant4.setupTracker('SiVertexBarrel')
seq, act = self.geant4.setupTracker('SiVertexEndcap')
seq, act = self.geant4.setupTracker('SiTrackerBarrel')
seq, act = self.geant4.setupTracker('SiTrackerEndcap')
seq, act = self.geant4.setupTracker('SiTrackerForward')
logger.info("# Now setup the calorimeters")
seq, act = self.geant4.setupCalorimeter('ECalBarrel')
seq, act = self.geant4.setupCalorimeter('ECalEndcap')
seq, act = self.geant4.setupCalorimeter('HCalBarrel')
seq, act = self.geant4.setupCalorimeter('HCalEndcap')
seq, act = self.geant4.setupCalorimeter('MuonBarrel')
seq, act = self.geant4.setupCalorimeter('MuonEndcap')
seq, act = self.geant4.setupCalorimeter('LumiCal')
seq, act = self.geant4.setupCalorimeter('BeamCal')
return self
# Test the configuration
def test_config(self, have_geo=True):
self.kernel.configure()
if have_geo:
self.kernel.initialize()
return self
# Test runner
def test_run(self, have_geo=True, have_physics=False, num_events=0):
self.test_config(have_geo)
if have_geo:
self.kernel.NumEvents = num_events
self.kernel.run()
self.kernel.terminate()
logger.info('+++++ All Done....\n\nTEST_PASSED')
sys.exit(0)