File indexing completed on 2025-08-02 07:47:55
0001 import os
0002 import acts
0003 import argparse
0004 from acts import (
0005 logging,
0006 GeometryContext,
0007 CylindricalContainerBuilder,
0008 DetectorBuilder,
0009 GeometryIdGenerator,
0010 )
0011
0012 from acts.examples import (
0013 AlgorithmContext,
0014 WhiteBoard,
0015 ObjTrackingGeometryWriter,
0016 )
0017 from acts import geomodel as gm
0018 from acts import examples
0019
0020 from pathlib import Path
0021 from propagation import runPropagation
0022
0023
0024 def runGeant4(
0025 detector,
0026 trackingGeometry,
0027 field,
0028 outputDir,
0029 materialMappings=[],
0030 volumeMappings=[],
0031 s: acts.examples.Sequencer = None,
0032 events=100,
0033 nMuonPerEvt=1,
0034 ):
0035 from acts.examples.simulation import (
0036 addParticleGun,
0037 addGeant4,
0038 EtaConfig,
0039 MomentumConfig,
0040 PhiConfig,
0041 ParticleConfig,
0042 )
0043 from pathlib import Path
0044
0045 s = s or acts.examples.Sequencer(events=events, numThreads=1)
0046 s.config.logLevel = acts.logging.INFO
0047 rnd = acts.examples.RandomNumbers()
0048 u = acts.UnitConstants
0049 outputDir = Path(outputDir)
0050 addParticleGun(
0051 s,
0052 outputDirRoot=outputDir / "PG",
0053 momentumConfig=MomentumConfig(50.0 * u.GeV, 60.0 * u.GeV, transverse=True),
0054 etaConfig=EtaConfig(-1.0, 1.0, uniform=True),
0055 phiConfig=PhiConfig(0.0, 360.0 * u.degree),
0056 particleConfig=ParticleConfig(1, acts.PdgParticle.eMuon, randomizeCharge=True),
0057 vtxGen=acts.examples.GaussianVertexGenerator(
0058 mean=acts.Vector4(0, 0, 0, 0),
0059 stddev=acts.Vector4(0.0125 * u.mm, 0.0125 * u.mm, 55.5 * u.mm, 1.0 * u.ns),
0060 ),
0061 multiplicity=nMuonPerEvt,
0062 rnd=rnd,
0063 printParticles=False,
0064 )
0065
0066 addGeant4(
0067 s,
0068 detector,
0069 trackingGeometry,
0070 field,
0071 outputDirCsv=outputDir / "csv",
0072 outputDirRoot=outputDir,
0073 outputDirObj=outputDir / "obj",
0074 rnd=rnd,
0075 materialMappings=materialMappings,
0076 volumeMappings=volumeMappings,
0077 )
0078 return s
0079
0080
0081 def main():
0082 from argparse import ArgumentParser
0083
0084 u = acts.UnitConstants
0085
0086 parser = ArgumentParser()
0087 parser.add_argument(
0088 "-i",
0089 "--input",
0090 type=str,
0091 default="",
0092 help="Input SQL file",
0093 )
0094 parser.add_argument(
0095 "--mockupDetector",
0096 type=str,
0097 choices=["Muon"],
0098 help="Predefined mockup detector which is built transiently",
0099 default="Muon",
0100 )
0101 parser.add_argument("--outDir", default="./", help="Output")
0102 parser.add_argument("--nEvents", default=100, type=int, help="Number of events")
0103
0104 args = parser.parse_args()
0105
0106 gContext = acts.GeometryContext()
0107 logLevel = logging.INFO
0108
0109
0110 gmBuilderConfig = gm.GeoModelMuonMockupBuilder.Config()
0111
0112
0113 gmTree = None
0114
0115 if len(args.input):
0116 gmTree = gm.readFromDb(args.input)
0117 gmBuilderConfig.stationNames = ["BIL", "BML", "BOL"]
0118
0119 elif args.mockupDetector == "Muon":
0120 mockUpCfg = gm.GeoMuonMockupExperiment.Config()
0121 mockUpCfg.dumpTree = True
0122 mockUpCfg.dbName = "ActsGeoMS.db"
0123 mockUpCfg.nSectors = 12
0124 mockUpCfg.nEtaStations = 8
0125 mockUpCfg.buildEndcaps = False
0126 mockUpBuilder = gm.GeoMuonMockupExperiment(mockUpCfg, "GeoMockUpMS", logLevel)
0127 gmBuilderConfig.stationNames = ["Inner", "Middle", "Outer"]
0128
0129 gmTree = mockUpBuilder.constructMS()
0130 else:
0131 raise RuntimeError(f"{args.mockupDetector} not implemented yet")
0132
0133 gmFactoryConfig = gm.GeoModelDetectorObjectFactory.Config()
0134 gmFactoryConfig.nameList = [
0135 "RpcGasGap",
0136 "MDTDriftGas",
0137 ]
0138 gmFactoryConfig.convertSubVolumes = True
0139 gmFactoryConfig.convertBox = ["MDT", "RPC"]
0140
0141 gmFactory = gm.GeoModelDetectorObjectFactory(gmFactoryConfig, logLevel)
0142
0143 gmFactoryOptions = gm.GeoModelDetectorObjectFactory.Options()
0144 gmFactoryOptions.queries = ["Muon"]
0145
0146
0147 gmFactoryCache = gm.GeoModelDetectorObjectFactory.Cache()
0148 gmFactory.construct(gmFactoryCache, gContext, gmTree, gmFactoryOptions)
0149
0150 gmBuilderConfig.volumeBoxFPVs = gmFactoryCache.boundingBoxes
0151
0152 gmDetectorCfg = gm.GeoModelDetector.Config()
0153 gmDetectorCfg.geoModelTree = gmTree
0154 detector = gm.GeoModelDetector(gmDetectorCfg)
0155
0156 field = acts.ConstantBField(acts.Vector3(0, 0, 0 * u.T))
0157
0158 trackingGeometryBuilder = gm.GeoModelMuonMockupBuilder(
0159 gmBuilderConfig, "GeoModelMuonMockupBuilder", acts.logging.INFO
0160 )
0161
0162 trackingGeometry = detector.buildTrackingGeometry(gContext, trackingGeometryBuilder)
0163
0164 runGeant4(
0165 detector=detector,
0166 trackingGeometry=trackingGeometry,
0167 field=field,
0168 outputDir=args.outDir,
0169 volumeMappings=gmFactoryConfig.nameList,
0170 events=args.nEvents,
0171 ).run()
0172
0173
0174
0175 wb = WhiteBoard(acts.logging.INFO)
0176
0177 context = AlgorithmContext(0, 0, wb, 10)
0178 obj_dir = Path(args.outDir) / "obj"
0179 obj_dir.mkdir(exist_ok=True)
0180
0181 writer = ObjTrackingGeometryWriter(level=acts.logging.INFO, outputDir=str(obj_dir))
0182
0183 writer.write(context, trackingGeometry)
0184
0185
0186 if __name__ == "__main__":
0187 main()