Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-22 09:38:17

0001 from __future__ import absolute_import, unicode_literals
0002 import sys
0003 import logging
0004 import DDG4
0005 
0006 logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
0007 logger = logging.getLogger(__name__)
0008 
0009 
0010 class LHeD:
0011   def __init__(self, tracker='Geant4TrackerCombineAction'):
0012     self.kernel = DDG4.Kernel()
0013     self.description = self.kernel.detectorDescription()
0014     self.geant4 = DDG4.Geant4(self.kernel, tracker=tracker)
0015     self.kernel.UI = ""
0016     self.noPhysics()
0017 
0018   def loadGeometry(self):
0019     import os
0020     install_dir = os.environ['DD4hepExamplesINSTALL']
0021     self.kernel.loadGeometry(str("file:" + install_dir + "/examples/LHeD/compact/compact_Lhe_dip_sol_ell.xml"))
0022     return self
0023 
0024   # Example to show how to configure G4 magnetic field tracking
0025   def setupField(self, quiet=True):
0026     return self.geant4.setupTrackingField(prt=True)
0027 
0028   # Example to show how to setup random generator
0029   def setupRandom(self, name, type=None, seed=None, quiet=True):   # noqa: A002
0030     rndm = DDG4.Action(self.kernel, 'Geant4Random/' + name)
0031     if seed:
0032       rndm.Seed = seed
0033     if type:
0034       rndm.Type = type
0035     rndm.initialize()
0036     if not quiet:
0037       rndm.showStatus()
0038     return rndm
0039 
0040   # Example to show how to configure the Geant4 physics list
0041   def setupPhysics(self, model):
0042     phys = self.geant4.setupPhysics(model)
0043     ph = DDG4.PhysicsList(self.kernel, 'Geant4PhysicsList/Myphysics')
0044     # Add bosons to the model (redundant if already implemented by the model)
0045     ph.addParticleGroup(str('G4BosonConstructor'))
0046     # Add leptons to the model (redundant if already implemented by the model)
0047     ph.addParticleGroup(str('G4LeptonConstructor'))
0048     # Add multiple scattering in the material
0049     ph.addParticleProcess(str('e[+-]'), str('G4eMultipleScattering'), -1, 1, 1)
0050     # Add optical physics (RICH dets etc)
0051     ph.addPhysicsConstructor(str('G4OpticalPhysics'))
0052     # Interactivity
0053     ph.enableUI()
0054     phys.adopt(ph)
0055     phys.dump()
0056     return phys
0057 
0058   # No physics list wanted for tests ? See how:
0059   def noPhysics(self):
0060     self.geant4.setupPhysics('')
0061     return self
0062 
0063   def setupDetectors(self):
0064     logger.info("#  First the tracking detectors")
0065     seq, act = self.geant4.setupTracker('SiVertexBarrel')
0066     seq, act = self.geant4.setupTracker('SiTrackerForward')
0067     seq, act = self.geant4.setupTracker('SiTrackerBarrel')
0068     seq, act = self.geant4.setupTracker('SiTrackerBackward')
0069     logger.info("#  Now setup the calorimeters")
0070     seq, act = self.geant4.setupCalorimeter('EcalBarrel')
0071     seq, act = self.geant4.setupCalorimeter('EcalEndcap_fwd')
0072     seq, act = self.geant4.setupCalorimeter('EcalEndcap_bwd')
0073     seq, act = self.geant4.setupCalorimeter('HcalBarrel')
0074     seq, act = self.geant4.setupCalorimeter('HcalEndcap_fwd')
0075     seq, act = self.geant4.setupCalorimeter('HcalEndcap_bwd')
0076     seq, act = self.geant4.setupCalorimeter('HcalPlug_fwd')
0077     seq, act = self.geant4.setupCalorimeter('HcalPlug_bwd')
0078     seq, act = self.geant4.setupCalorimeter('MuonBarrel')
0079     seq, act = self.geant4.setupCalorimeter('MuonEndcap_fwd1')
0080     seq, act = self.geant4.setupCalorimeter('MuonEndcap_fwd2')
0081     seq, act = self.geant4.setupCalorimeter('MuonEndcap_bwd1')
0082     seq, act = self.geant4.setupCalorimeter('MuonEndcap_bwd2')
0083     return self
0084 
0085   def test_config(self, have_geo=True):
0086     self.kernel.configure()
0087     if have_geo:
0088       self.kernel.initialize()
0089 
0090   # Test runner
0091   def test_run(self, have_geo=True, have_physics=False):
0092     self.test_config(have_geo)
0093     if have_geo:
0094       self.kernel.NumEvents = 0
0095       self.kernel.run()
0096     self.kernel.terminate()
0097     logger.info('+++++ All Done....\n\nTEST_PASSED')
0098     sys.exit(0)