Back to home page

EIC code displayed by LXR

 
 

    


Warning, file /npsim/src/dd4pod/python/npsim.py was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 #!/usr/bin/env python
0002 """
0003 DD4hep simulation with some argument parsing
0004 Based on M. Frank and F. Gaede runSim.py
0005    @author  A.Sailer
0006    @version 0.1
0007 
0008 Modified with standard EIC EPIC requirements.
0009 """
0010 from __future__ import absolute_import, unicode_literals
0011 import logging
0012 import sys
0013 
0014 from DDSim.DD4hepSimulation import DD4hepSimulation
0015 
0016 
0017 if __name__ == "__main__":
0018   logging.basicConfig(format='%(name)-16s %(levelname)s %(message)s', level=logging.INFO, stream=sys.stdout)
0019   logger = logging.getLogger('DDSim')
0020 
0021   RUNNER = DD4hepSimulation()
0022 
0023   # Parse remaining options (command line and steering file override above)
0024   # This is done before updating the settings to workaround issue reported in
0025   # https://github.com/AIDASoft/DD4hep/pull/1376
0026   RUNNER.parseOptions()
0027 
0028   # Ensure that Cerenkov and optical physics are always loaded
0029   def setupCerenkov(kernel):
0030     from DDG4 import PhysicsList
0031     seq = kernel.physicsList()
0032     cerenkov = PhysicsList(kernel, 'Geant4CerenkovPhysics/CerenkovPhys')
0033     cerenkov.MaxNumPhotonsPerStep = 10
0034     cerenkov.MaxBetaChangePerStep = 10.0
0035     cerenkov.TrackSecondariesFirst = False
0036     cerenkov.VerboseLevel = 0
0037     cerenkov.enableUI()
0038     seq.adopt(cerenkov)
0039     ph = PhysicsList(kernel, 'Geant4OpticalPhotonPhysics/OpticalGammaPhys')
0040     ph.addParticleConstructor('G4OpticalPhoton')
0041     ph.VerboseLevel = 0
0042     ph.enableUI()
0043     seq.adopt(ph)
0044     return None
0045   RUNNER.physics.setupUserPhysics(setupCerenkov)
0046 
0047   # Allow energy depositions to 0 energy in trackers (which include optical detectors)
0048   RUNNER.filter.tracker = 'edep0'
0049 
0050   # Some detectors are only sensitive to optical photons
0051   RUNNER.filter.filters['opticalphotons'] = dict(
0052     name='ParticleSelectFilter/OpticalPhotonSelector',
0053     parameter={"particle": "opticalphoton"},
0054   )
0055   # This could probably be a substring
0056   RUNNER.filter.mapDetFilter['DRICH'] = 'opticalphotons'
0057   RUNNER.filter.mapDetFilter['RICHEndcapN'] = 'opticalphotons'
0058   RUNNER.filter.mapDetFilter['DIRC'] = 'opticalphotons'
0059 
0060   # Use the optical tracker for the DRICH
0061   RUNNER.action.mapActions['DRICH'] = 'Geant4OpticalTrackerAction'
0062   RUNNER.action.mapActions['RICHEndcapN'] = 'Geant4OpticalTrackerAction'
0063   RUNNER.action.mapActions['DIRC'] = 'Geant4OpticalTrackerAction'
0064 
0065   # Use the optical photon efficiency stacking action for hpDIRC
0066   RUNNER.action.stack = [
0067     {
0068       "name": "OpticalPhotonEfficiencyStackingAction",
0069       "parameter": {
0070         "LambdaMin": "180*nm",
0071         "LambdaMax": "678*nm",
0072         "LogicalVolume": "bar_vol",
0073         "Efficiency": [e/100. for e in [
0074           0,    0,    14.0, 14.8, 14.5, 14.9, 14.4, 14.2, 13.9, 14.6, 15.2, 15.7, 16.4, 16.9, 17.5,
0075           17.7, 18.1, 18.8, 19.3, 19.8, 20.6, 21.4, 22.4, 23.1, 23.6, 24.1, 24.2, 24.6, 24.8, 25.2,
0076           25.7, 26.5, 27.1, 28.2, 29.0, 29.9, 30.8, 31.1, 31.7, 31.8, 31.6, 31.5, 31.5, 31.3, 31.0,
0077           30.8, 30.8, 30.4, 30.2, 30.3, 30.2, 30.1, 30.1, 30.1, 29.8, 29.9, 29.8, 29.7, 29.7, 29.7,
0078           29.8, 29.8, 29.9, 29.9, 29.8, 29.9, 29.8, 29.9, 29.8, 29.7, 29.8, 29.7, 29.8, 29.6, 29.5,
0079           29.7, 29.7, 29.8, 30.1, 30.4, 31.0, 31.3, 31.5, 31.8, 31.8, 31.9, 32.0, 32.0, 32.0, 32.0,
0080           32.2, 32.2, 32.1, 31.8, 31.8, 31.8, 31.7, 31.6, 31.6, 31.7, 31.5, 31.5, 31.4, 31.3, 31.3,
0081           31.2, 30.8, 30.7, 30.5, 30.3, 29.9, 29.5, 29.3, 29.2, 28.6, 28.2, 27.9, 27.8, 27.3, 27.0,
0082           26.6, 26.1, 25.9, 25.5, 25.0, 24.6, 24.2, 23.8, 23.4, 23.0, 22.7, 22.4, 21.9, 21.4, 21.2,
0083           20.7, 20.3, 19.8, 19.6, 19.3, 18.9, 18.7, 18.3, 17.9, 17.8, 17.8, 16.7, 16.5, 16.4, 16.0,
0084           15.6, 15.6, 15.2, 14.9, 14.6, 14.4, 14.1, 13.8, 13.6, 13.3, 13.0, 12.8, 12.6, 12.3, 12.0,
0085           11.9, 11.7, 11.5, 11.2, 11.1, 10.9, 10.7, 10.4, 10.3, 9.9,  9.8,  9.6,  9.3,  9.1,  9.0,
0086           8.8,  8.5,  8.3,  8.3,  8.2,  7.9,  7.8,  7.7,  7.5,  7.3,  7.1,  6.9,  6.7,  6.6,  6.3,
0087           6.2,  6.0,  5.8,  5.7,  5.6,  5.4,  5.2,  5.1,  4.9,  4.8,  4.6,  4.5,  4.4,  4.2,  4.1,
0088           4.0,  3.8,  3.7,  3.5,  3.3,  3.2,  3.1,  3.0,  2.9,  2.5,  2.4,  2.4,  2.3,  2.3,  2.1,
0089           1.8,  1.6,  1.5,  1.5,  1.6,  1.8,  1.9,  1.4,  0.8,  0.9,  0.8,  0.7,  0.6,  0.3,  0.3,
0090           0.5,  0.3,  0.4,  0.3,  0.1,  0.2,  0.1,  0.2,  0.3,  0.0
0091         ]]
0092       }
0093     }
0094   ]
0095 
0096   try:
0097     sys.exit(RUNNER.run())
0098   except NameError as e:
0099     if "global name" in str(e):
0100       globalToSet = str(e).split("'")[1]
0101       logger.fatal("Unknown global variable, please add\nglobal %s\nto your steeringFile" % globalToSet)