ATLAS Offline Software
Loading...
Searching...
No Matches
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
8import os
9from AthenaConfiguration.TestDefaults import defaultConditionsTags, defaultGeometryTags, defaultTestFiles
10
11def 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 parser.add_argument("--threads", default = 1, type = int, help='Number of threads')
50
51 return parser.parse_args()
52
53kwargs = vars(parser())
54
55
56from AthenaConfiguration.AllConfigFlags import initConfigFlags
57flags = initConfigFlags()
58
59
60from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
61OnlyTrackingPreInclude(flags)
62
63
64flags.ITk.Align.accumulate = kwargs["accumulate"]
65flags.ITk.Align.baseDir = os.path.abspath(kwargs["baseDir"])
66
67flags.ITk.Align.alignITk = kwargs["alignITk"] or (not kwargs["alignITk"] and not kwargs["alignITkPixel"] and not kwargs["alignITkStrip"])
68flags.ITk.Align.alignITkPixel = kwargs["alignITkPixel"] or flags.ITk.Align.alignITk
69flags.ITk.Align.alignITkStrip = kwargs["alignITkStrip"] or flags.ITk.Align.alignITk
70
71flags.ITk.Align.writeSilicon = False #Issues with folders ATM - should be flags.ITk.Align.alignITkPixel or flags.ITk.Align.alignITkStrip
72
73flags.ITk.Align.inputTFiles = kwargs["inputTFiles"]
74
75flags.Input.Files = kwargs["input"]
76flags.Exec.MaxEvents = kwargs["maxEvents"] if not kwargs["solve"] else 1
77flags.IOVDb.GlobalTag = kwargs["globalTag"]
78
79flags.addFlag("ConstrainedTrackProvider.InputTracksCollection", kwargs["inputTracksCollection"])
80
81flags.GeoModel.Align.Dynamic = False
82flags.GeoModel.AtlasVersion = kwargs["atlasVersion"]
83
84if not flags.Input.isMC and kwargs["isCosmics"]:
85 from AthenaConfiguration.Enums import BeamType
86
87 flags.Beam.NumberOfCollisions = 0
88 flags.Beam.Type = BeamType.Cosmics
89 flags.Beam.Energy = 0.
90 flags.Beam.BunchSpacing = 50
91
92if kwargs["isHeavyIon"]:
93 flags.Beam.BunchSpacing = 50
94 flags.Reco.EnableHI = True
95 flags.HeavyIon.doGlobal = True
96
97else:
98 flags.Beam.BunchSpacing = 25
99
100if not kwargs["isBFieldOff"]:
101 flags.BField.solenoidOn = True
102 flags.BField.barrelToroidOn = True
103 flags.BField.endcapToroidOn = True
104
105else:
106 flags.BField.solenoidOn = False
107 flags.BField.barrelToroidOn = False
108 flags.BField.endcapToroidOn = False
109
110
111if kwargs["localgeo"]:
112 flags.ITk.Geometry.AllLocal = True
113
114DBFile = ""
115DBName="OFLCOND"
116tag="InDetSi_MisalignmentMode_random misalignment"
117
118if kwargs["localDB"]:
119 flags.ITk.Align.useLocalDatabase = True
120 DBFile = kwargs["localDB"]
121 flags.IOVDb.DBConnection ="sqlite://;schema="+DBFile+";dbname="+DBName
122 flags.ITk.Geometry.alignmentFolder = "/Indet/AlignITk"
123
124if flags.ITk.Align.alignITkPixel:
125 flags.ITk.Geometry.pixelAlignable = True
126if flags.ITk.Align.alignITkStrip:
127 flags.ITk.Geometry.stripAlignable = True
128
129if kwargs["threads"] > 0:
130 flags.Concurrency.NumThreads = kwargs["threads"]
131
132flags.lock()
133
134from RecJobTransforms.RecoSteering import RecoSteering
135cfg = RecoSteering(flags)
136
137if flags.ITk.Align.useLocalDatabase:
138 from IOVDbSvc.IOVDbSvcConfig import addFolders, getSqliteContent
139 print("Adding Align Folder "+flags.ITk.Geometry.alignmentFolder+" from local "+DBName+" Database in file "+DBFile)
140 cfg.merge(addFolders(flags,flags.ITk.Geometry.alignmentFolder,db=DBName,detDb=DBFile,tag=tag, className="AlignableTransformContainer"))
141
142from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
143cfg.getPrimaryAndMerge(MuonIdHelperSvcCfg(flags))
144
145
146if kwargs["accumulate"] and not kwargs["solve"]:
147 os.makedirs(f"{flags.ITk.Align.baseDir}/Accumulate", exist_ok = True)
148 os.chdir("Accumulate")
149 from InDetAlignConfig.AccumulateITkConfig import ITkAccumulateCfg
150 cfg.merge(ITkAccumulateCfg(flags))
151
152
153elif kwargs["solve"] and not kwargs["accumulate"]:
154 os.makedirs(f"{flags.ITk.Align.baseDir}/Solve", exist_ok = True)
155 os.chdir("Solve")
156 from InDetAlignConfig.SolveITkConfig import ITkSolveCfg
157 cfg.merge(ITkSolveCfg(flags))
158
159else:
160 raise Exception("You can run either the acculumation step or the solve step, but not both or neither at the same time!")
161
162
163
164if kwargs["dryRun"]:
165 cfg.printConfig()
166
167else:
168 cfg.run()
void print(char *figname, TCanvas *c1)