ATLAS Offline Software
runIDAlign.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
4 
5 # File: InDetAlignConfig/scripts/runIDAlign.py
6 # Author: David Brunner (david.brunner@cern.ch), Thomas Strebler (thomas.strebler@cern.ch)
7 
8 import os
9 from AthenaConfiguration.TestDefaults import defaultConditionsTags, defaultGeometryTags, defaultTestFiles
10 
11 def parser():
12  from argparse import ArgumentParser
13  parser = ArgumentParser(description='Script for the IDAlignment')
14 
15 
16  parser.add_argument("-a", '--accumulate', action="store_true", help='Run accumulation step')
17  parser.add_argument("-s", '--solve', action="store_true", help='Run solve step')
18  parser.add_argument("-d", '--dryRun', action="store_true", help='Only configure, print and dont execute')
19  parser.add_argument("-b", '--baseDir', default = "./", help='Base dir where output is placed')
20 
21 
22  parser.add_argument("-i", "--input", default = defaultTestFiles.RAW_RUN3, nargs = "+", help='Input file(s)')
23  parser.add_argument("--maxEvents", default = -1, type = int, help='Number of maximal processed events')
24  parser.add_argument("-t", "--inputTracksCollection", default = "CombinedInDetTracks", type = str, help='Name of the track collection to use')
25  parser.add_argument("--inputTFiles", default = "AlignmentTFile.root", type = str, help='ROOT file produced in MatrixTool in the accumulation step')
26 
27  parser.add_argument("--alignmentConstants", default = [], nargs = "+", help='Local alignment constants to use')
28  parser.add_argument("--bowingDatabase", default = "", help='Local bowing database to use')
29  parser.add_argument("--dynamicGlobalDatabase", default = "", help='Local dynamic global database to use')
30 
31 
32  parser.add_argument("--alignInDet", action="store_true", help='Align whole inner detector')
33  parser.add_argument("--alignSilicon", action="store_true", help='Align silicon part of the inner detector')
34  parser.add_argument("--alignPixel", action="store_true", help='Align pixel')
35  parser.add_argument("--alignSCT", action="store_true", help='Align SCT')
36  parser.add_argument("--alignTRT", action="store_true", help='Align TRT')
37 
38 
39  parser.add_argument("--globalTag", default = defaultConditionsTags.RUN3_DATA, help='Global tag')
40  parser.add_argument("--atlasVersion", default = defaultGeometryTags.RUN3, help='Global tag')
41  parser.add_argument("--projectName", default = "data23_13p6TeV", help='Global tag')
42 
43  parser.add_argument("--isBFieldOff", action="store_true", help='Check if Bfield is off')
44  parser.add_argument("--isCosmics", action="store_true", help='Check if cosmics run')
45  parser.add_argument("--isHeavyIon", action="store_true", help='Check if heavy ion run')
46 
47  return parser.parse_args()
48 
49 kwargs = vars(parser())
50 
51 
52 from AthenaConfiguration.AllConfigFlags import initConfigFlags
53 flags = initConfigFlags()
54 
55 
56 from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
58 
59 
60 flags.InDet.Align.accumulate = kwargs["accumulate"]
61 flags.InDet.Align.baseDir = os.path.abspath(kwargs["baseDir"])
62 
63 flags.InDet.Align.alignInDet = kwargs["alignInDet"]
64 flags.InDet.Align.alignSilicon = kwargs["alignInDet"] or kwargs["alignSilicon"]
65 flags.InDet.Align.alignPixel = kwargs["alignInDet"] or kwargs["alignSilicon"] or kwargs["alignPixel"]
66 flags.InDet.Align.alignSCT = kwargs["alignInDet"] or kwargs["alignSilicon"] or kwargs["alignSCT"]
67 flags.InDet.Align.alignTRT = kwargs["alignInDet"] or kwargs["alignTRT"]
68 
69 flags.InDet.Align.writeSilicon = flags.InDet.Align.alignPixel or flags.InDet.Align.alignSCT
70 flags.InDet.Align.writeTRT = flags.InDet.Align.alignTRT
71 
72 flags.InDet.Align.useDynamicAlignFolders = bool(kwargs["dynamicGlobalDatabase"])
73 flags.InDet.Align.inputAlignmentConstants = kwargs["alignmentConstants"]
74 flags.InDet.Align.inputBowingDatabase = kwargs["bowingDatabase"]
75 flags.InDet.Align.inputDynamicGlobalDatabase = kwargs["dynamicGlobalDatabase"]
76 flags.InDet.Align.inputTFiles = kwargs["inputTFiles"]
77 
78 flags.Input.Files = kwargs["input"]
79 flags.Exec.MaxEvents = kwargs["maxEvents"] if not kwargs["solve"] else 1
80 flags.IOVDb.GlobalTag = kwargs["globalTag"]
81 
82 flags.addFlag("ConstrainedTrackProvider.InputTracksCollection", kwargs["inputTracksCollection"])
83 
84 flags.GeoModel.Align.Dynamic = True
85 flags.GeoModel.AtlasVersion = kwargs["atlasVersion"]
86 
87 if not flags.Input.isMC and kwargs["isCosmics"]:
88  from AthenaConfiguration.Enums import BeamType
89 
90  flags.Beam.NumberOfCollisions = 0
91  flags.Beam.Type = BeamType.Cosmics
92  flags.Beam.Energy = 0.
93  flags.Beam.BunchSpacing = 50
94 
95 if kwargs["isHeavyIon"]:
96  flags.Beam.BunchSpacing = 50
97  flags.Reco.EnableHI = True
98  flags.HeavyIon.doGlobal = True
99 
100 else:
101  flags.Beam.BunchSpacing = 25
102 
103 if not kwargs["isBFieldOff"]:
104  flags.BField.solenoidOn = True
105  flags.BField.barrelToroidOn = True
106  flags.BField.endcapToroidOn = True
107 
108 else:
109  flags.BField.solenoidOn = False
110  flags.BField.barrelToroidOn = False
111  flags.BField.endcapToroidOn = False
112 
113 if not flags.InDet.Align.alignTRT:
114  flags.Detector.GeometryTRT = False
115  flags.Detector.EnableTRT = False
116 
117 flags.lock()
118 
119 from RecJobTransforms.RecoSteering import RecoSteering
120 cfg = RecoSteering(flags)
121 
122 from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
123 cfg.getPrimaryAndMerge(MuonIdHelperSvcCfg(flags))
124 
125 
128 
129 
130 if kwargs["accumulate"] and not kwargs["solve"]:
131  os.makedirs(f"{flags.InDet.Align.baseDir}/Accumulate", exist_ok = True)
132  os.chdir("Accumulate")
133  from InDetAlignConfig.AccumulateConfig import AccumulateCfg
134  cfg.merge(AccumulateCfg(flags))
135 
136 
137 elif kwargs["solve"] and not kwargs["accumulate"]:
138  os.makedirs(f"{flags.InDet.Align.baseDir}/Solve", exist_ok = True)
139  os.chdir("Solve")
140  from InDetAlignConfig.SolveConfig import SolveCfg
141  cfg.merge(SolveCfg(flags))
142 
143 else:
144  raise Exception("You can run either the acculumation step or the solve step, but not both or neither at the same time!")
145 
146 
147 
148 if kwargs["dryRun"]:
149  cfg.printConfig()
150 
151 else:
152  cfg.run()
runIDAlign.parser
def parser()
Definition: runIDAlign.py:11
python.RecoSteering.RecoSteering
def RecoSteering(flags)
Definition: RecoSteering.py:6
MuonGeometryConfig.MuonIdHelperSvcCfg
def MuonIdHelperSvcCfg(flags)
Definition: MuonGeometryConfig.py:15
AccumulateConfig.AccumulateCfg
def AccumulateCfg(flags, **kwargs)
Definition: AccumulateConfig.py:132
python.ConfigurationHelpers.OnlyTrackingPreInclude
def OnlyTrackingPreInclude(flags)
Definition: InnerDetector/InDetConfig/python/ConfigurationHelpers.py:6
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
SolveConfig.SolveCfg
def SolveCfg(flags, **kwargs)
Definition: SolveConfig.py:40