ATLAS Offline Software
runITkAlign.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 ITk Alignment')
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.RDO_RUN4, 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 = "CombinedITkTracks", 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 
29 
30  parser.add_argument("--alignITk", action="store_true", help='Align whole ITk')
31  parser.add_argument("--alignITkPixel", action="store_true", help='Align ITkPixel')
32  parser.add_argument("--alignITkStrip", action="store_true", help='Align ITkStrip')
33 
34 
35  parser.add_argument("--globalTag", default = defaultConditionsTags.RUN4_MC, help='Global tag')
36  parser.add_argument("--atlasVersion", default = defaultGeometryTags.RUN4, help='Global tag')
37 
38  parser.add_argument("--isBFieldOff", action="store_true", help='Check if Bfield is off')
39  parser.add_argument("--isCosmics", action="store_true", help='Check if cosmics run')
40  parser.add_argument("--isHeavyIon", action="store_true", help='Check if heavy ion run')
41 
42 
43  parser.add_argument("--localgeo", action="store_true", help='Use local geometry XML files')
44 
45 
46  parser.add_argument("--localDB", default = "", help='Use local DB file rather than from conditions tag')
47 
48 
49  return parser.parse_args()
50 
51 kwargs = vars(parser())
52 
53 
54 from AthenaConfiguration.AllConfigFlags import initConfigFlags
55 flags = initConfigFlags()
56 
57 
58 from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
60 
61 
62 flags.ITk.Align.accumulate = kwargs["accumulate"]
63 flags.ITk.Align.baseDir = os.path.abspath(kwargs["baseDir"])
64 
65 flags.ITk.Align.alignITk = kwargs["alignITk"] or (not kwargs["alignITk"] and not kwargs["alignITkPixel"] and not kwargs["alignITkStrip"])
66 flags.ITk.Align.alignITkPixel = kwargs["alignITkPixel"] or flags.ITk.Align.alignITk
67 flags.ITk.Align.alignITkStrip = kwargs["alignITkStrip"] or flags.ITk.Align.alignITk
68 
69 flags.ITk.Align.writeSilicon = False #Issues with folders ATM - should be flags.ITk.Align.alignITkPixel or flags.ITk.Align.alignITkStrip
70 
71 flags.ITk.Align.inputTFiles = kwargs["inputTFiles"]
72 
73 flags.Input.Files = kwargs["input"]
74 flags.Exec.MaxEvents = kwargs["maxEvents"] if not kwargs["solve"] else 1
75 flags.IOVDb.GlobalTag = kwargs["globalTag"]
76 
77 flags.addFlag("ConstrainedTrackProvider.InputTracksCollection", kwargs["inputTracksCollection"])
78 
79 flags.GeoModel.Align.Dynamic = False
80 flags.GeoModel.AtlasVersion = kwargs["atlasVersion"]
81 
82 if not flags.Input.isMC and kwargs["isCosmics"]:
83  from AthenaConfiguration.Enums import BeamType
84 
85  flags.Beam.NumberOfCollisions = 0
86  flags.Beam.Type = BeamType.Cosmics
87  flags.Beam.Energy = 0.
88  flags.Beam.BunchSpacing = 50
89 
90 if kwargs["isHeavyIon"]:
91  flags.Beam.BunchSpacing = 50
92  flags.Reco.EnableHI = True
93  flags.HeavyIon.doGlobal = True
94 
95 else:
96  flags.Beam.BunchSpacing = 25
97 
98 if not kwargs["isBFieldOff"]:
99  flags.BField.solenoidOn = True
100  flags.BField.barrelToroidOn = True
101  flags.BField.endcapToroidOn = True
102 
103 else:
104  flags.BField.solenoidOn = False
105  flags.BField.barrelToroidOn = False
106  flags.BField.endcapToroidOn = False
107 
108 
109 if kwargs["localgeo"]:
110  flags.ITk.Geometry.AllLocal = True
111 
112 DBFile = ""
113 DBName="OFLCOND"
114 tag="InDetSi_MisalignmentMode_random misalignment"
115 
116 if kwargs["localDB"]:
117  flags.ITk.Align.useLocalDatabase = True
118  DBFile = kwargs["localDB"]
119  flags.IOVDb.DBConnection ="sqlite://;schema="+DBFile+";dbname="+DBName
120  flags.ITk.Geometry.alignmentFolder = "/Indet/AlignITk"
121 
122 if flags.ITk.Align.alignITkPixel:
123  flags.ITk.Geometry.pixelAlignable = True
124 if flags.ITk.Align.alignITkStrip:
125  flags.ITk.Geometry.stripAlignable = True
126 
127 flags.lock()
128 
129 from RecJobTransforms.RecoSteering import RecoSteering
130 cfg = RecoSteering(flags)
131 
132 if flags.ITk.Align.useLocalDatabase:
133  from IOVDbSvc.IOVDbSvcConfig import addFolders, getSqliteContent
134  print("Adding Align Folder "+flags.ITk.Geometry.alignmentFolder+" from local "+DBName+" Database in file "+DBFile)
135  cfg.merge(addFolders(flags,flags.ITk.Geometry.alignmentFolder,db=DBName,detDb=DBFile,tag=tag, className="AlignableTransformContainer"))
136 
137 from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
138 cfg.getPrimaryAndMerge(MuonIdHelperSvcCfg(flags))
139 
140 
141 if kwargs["accumulate"] and not kwargs["solve"]:
142  os.makedirs(f"{flags.ITk.Align.baseDir}/Accumulate", exist_ok = True)
143  os.chdir("Accumulate")
144  from InDetAlignConfig.AccumulateITkConfig import ITkAccumulateCfg
145  cfg.merge(ITkAccumulateCfg(flags))
146 
147 
148 elif kwargs["solve"] and not kwargs["accumulate"]:
149  os.makedirs(f"{flags.ITk.Align.baseDir}/Solve", exist_ok = True)
150  os.chdir("Solve")
151  from InDetAlignConfig.SolveITkConfig import ITkSolveCfg
152  cfg.merge(ITkSolveCfg(flags))
153 
154 else:
155  raise Exception("You can run either the acculumation step or the solve step, but not both or neither at the same time!")
156 
157 
158 
159 if kwargs["dryRun"]:
160  cfg.printConfig()
161 
162 else:
163  cfg.run()
python.RecoSteering.RecoSteering
def RecoSteering(flags)
Definition: RecoSteering.py:6
MuonGeometryConfig.MuonIdHelperSvcCfg
def MuonIdHelperSvcCfg(flags)
Definition: MuonGeometryConfig.py:15
runITkAlign.parser
def parser()
Definition: runITkAlign.py:11
python.ConfigurationHelpers.OnlyTrackingPreInclude
def OnlyTrackingPreInclude(flags)
Definition: InnerDetector/InDetConfig/python/ConfigurationHelpers.py:6
python.IOVDbSvcConfig.addFolders
def addFolders(flags, folderStrings, detDb=None, className=None, extensible=False, tag=None, db=None, modifiers='')
Definition: IOVDbSvcConfig.py:86
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
SolveITkConfig.ITkSolveCfg
def ITkSolveCfg(flags, **kwargs)
Definition: SolveITkConfig.py:38
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
AccumulateITkConfig.ITkAccumulateCfg
def ITkAccumulateCfg(flags, **kwargs)
Definition: AccumulateITkConfig.py:131