Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 from InDetAlignConfig.IDAlignFlags import createInDetAlignFlags
54 
55 flags = initConfigFlags()
56 flags.addFlagsCategory("InDet.Align", createInDetAlignFlags, prefix=True)
57 
58 
59 from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
61 
62 
63 flags.InDet.Align.accumulate = kwargs["accumulate"]
64 flags.InDet.Align.baseDir = os.path.abspath(kwargs["baseDir"])
65 
66 flags.InDet.Align.alignInDet = kwargs["alignInDet"]
67 flags.InDet.Align.alignSilicon = kwargs["alignInDet"] or kwargs["alignSilicon"]
68 flags.InDet.Align.alignPixel = kwargs["alignInDet"] or kwargs["alignSilicon"] or kwargs["alignPixel"]
69 flags.InDet.Align.alignSCT = kwargs["alignInDet"] or kwargs["alignSilicon"] or kwargs["alignSCT"]
70 flags.InDet.Align.alignTRT = kwargs["alignInDet"] or kwargs["alignTRT"]
71 
72 flags.InDet.Align.writeSilicon = flags.InDet.Align.alignPixel or flags.InDet.Align.alignSCT
73 flags.InDet.Align.writeTRT = flags.InDet.Align.alignTRT
74 
75 flags.InDet.Align.useDynamicAlignFolders = bool(kwargs["dynamicGlobalDatabase"])
76 flags.InDet.Align.inputAlignmentConstants = kwargs["alignmentConstants"]
77 flags.InDet.Align.inputBowingDatabase = kwargs["bowingDatabase"]
78 flags.InDet.Align.inputDynamicGlobalDatabase = kwargs["dynamicGlobalDatabase"]
79 flags.InDet.Align.inputTFiles = kwargs["inputTFiles"]
80 
81 flags.Input.Files = kwargs["input"]
82 flags.Exec.MaxEvents = kwargs["maxEvents"] if not kwargs["solve"] else 1
83 flags.IOVDb.GlobalTag = kwargs["globalTag"]
84 
85 flags.addFlag("ConstrainedTrackProvider.InputTracksCollection", kwargs["inputTracksCollection"])
86 
87 flags.GeoModel.Align.Dynamic = True
88 flags.GeoModel.AtlasVersion = kwargs["atlasVersion"]
89 
90 if not flags.Input.isMC and kwargs["isCosmics"]:
91  from AthenaConfiguration.Enums import BeamType
92 
93  flags.Beam.NumberOfCollisions = 0
94  flags.Beam.Type = BeamType.Cosmics
95  flags.Beam.Energy = 0.
96  flags.Beam.BunchSpacing = 50
97 
98 if kwargs["isHeavyIon"]:
99  flags.Beam.BunchSpacing = 50
100  flags.Reco.EnableHI = True
101  flags.HeavyIon.doGlobal = True
102 
103 else:
104  flags.Beam.BunchSpacing = 25
105 
106 if not kwargs["isBFieldOff"]:
107  flags.BField.solenoidOn = True
108  flags.BField.barrelToroidOn = True
109  flags.BField.endcapToroidOn = True
110 
111 else:
112  flags.BField.solenoidOn = False
113  flags.BField.barrelToroidOn = False
114  flags.BField.endcapToroidOn = False
115 
116 if not flags.InDet.Align.alignTRT:
117  flags.Detector.GeometryTRT = False
118  flags.Detector.EnableTRT = False
119 
120 flags.lock()
121 
122 from RecJobTransforms.RecoSteering import RecoSteering
123 cfg = RecoSteering(flags)
124 
125 from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
126 cfg.getPrimaryAndMerge(MuonIdHelperSvcCfg(flags))
127 
128 
131 
132 
133 if kwargs["accumulate"] and not kwargs["solve"]:
134  os.makedirs(f"{flags.InDet.Align.baseDir}/Accumulate", exist_ok = True)
135  os.chdir("Accumulate")
136  from InDetAlignConfig.AccumulateConfig import AccumulateCfg
137  cfg.merge(AccumulateCfg(flags))
138 
139 
140 elif kwargs["solve"] and not kwargs["accumulate"]:
141  os.makedirs(f"{flags.InDet.Align.baseDir}/Solve", exist_ok = True)
142  os.chdir("Solve")
143  from InDetAlignConfig.SolveConfig import SolveCfg
144  cfg.merge(SolveCfg(flags))
145 
146 else:
147  raise Exception("You can run either the acculumation step or the solve step, but not both or neither at the same time!")
148 
149 
150 
151 if kwargs["dryRun"]:
152  cfg.printConfig()
153 
154 else:
155  cfg.run()
runIDAlign.parser
def parser()
Definition: runIDAlign.py:11
python.RecoSteering.RecoSteering
def RecoSteering(flags)
Definition: RecoSteering.py:6
AccumulateConfig.AccumulateCfg
def AccumulateCfg(flags, **kwargs)
Definition: AccumulateConfig.py:131
python.ConfigurationHelpers.OnlyTrackingPreInclude
def OnlyTrackingPreInclude(flags)
Definition: InnerDetector/InDetConfig/python/ConfigurationHelpers.py:6
python.MuonGeometryConfig.MuonIdHelperSvcCfg
def MuonIdHelperSvcCfg(flags)
Definition: MuonGeometryConfig.py:15
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