Back to home page

EIC code displayed by LXR

 
 

    


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="",  # "/eos/user/c/cimuonsw/GeometryFiles/MockUp.db",
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     # Create the tracking geometry builder for the muon system
0110     gmBuilderConfig = gm.GeoModelMuonMockupBuilder.Config()
0111 
0112     # Read the geometry model from the database
0113     gmTree = None
0114     ### Use an external geo model file
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     # The options
0143     gmFactoryOptions = gm.GeoModelDetectorObjectFactory.Options()
0144     gmFactoryOptions.queries = ["Muon"]
0145 
0146     # The Cache & construct call
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     # runPropagation(trackingGeometry, field, args.outDir).run()
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()