9from AthenaConfiguration.TestDefaults
import defaultConditionsTags, defaultGeometryTags, defaultTestFiles
12 from argparse
import ArgumentParser
13 parser = ArgumentParser(description=
'Script for the ITk Alignment')
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')
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')
27 parser.add_argument(
"--alignmentConstants", default = [], nargs =
"+", help=
'Local alignment constants to use')
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')
35 parser.add_argument(
"--globalTag", default = defaultConditionsTags.RUN4_MC, help=
'Global tag')
36 parser.add_argument(
"--atlasVersion", default = defaultGeometryTags.RUN4, help=
'Global tag')
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')
43 parser.add_argument(
"--localgeo", action=
"store_true", help=
'Use local geometry XML files')
46 parser.add_argument(
"--localDB", default =
"", help=
'Use local DB file rather than from conditions tag')
49 parser.add_argument(
"--threads", default = 1, type = int, help=
'Number of threads')
51 return parser.parse_args()
56from AthenaConfiguration.AllConfigFlags
import initConfigFlags
57flags = initConfigFlags()
60from InDetConfig.ConfigurationHelpers
import OnlyTrackingPreInclude
61OnlyTrackingPreInclude(flags)
64flags.ITk.Align.accumulate = kwargs[
"accumulate"]
65flags.ITk.Align.baseDir = os.path.abspath(kwargs[
"baseDir"])
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
71flags.ITk.Align.writeSilicon =
False
73flags.ITk.Align.inputTFiles = kwargs[
"inputTFiles"]
75flags.Input.Files = kwargs[
"input"]
76flags.Exec.MaxEvents = kwargs[
"maxEvents"]
if not kwargs[
"solve"]
else 1
77flags.IOVDb.GlobalTag = kwargs[
"globalTag"]
79flags.addFlag(
"ConstrainedTrackProvider.InputTracksCollection", kwargs[
"inputTracksCollection"])
81flags.GeoModel.Align.Dynamic =
False
82flags.GeoModel.AtlasVersion = kwargs[
"atlasVersion"]
84if not flags.Input.isMC
and kwargs[
"isCosmics"]:
85 from AthenaConfiguration.Enums
import BeamType
87 flags.Beam.NumberOfCollisions = 0
88 flags.Beam.Type = BeamType.Cosmics
89 flags.Beam.Energy = 0.
90 flags.Beam.BunchSpacing = 50
92if kwargs[
"isHeavyIon"]:
93 flags.Beam.BunchSpacing = 50
94 flags.Reco.EnableHI =
True
95 flags.HeavyIon.doGlobal =
True
98 flags.Beam.BunchSpacing = 25
100if not kwargs[
"isBFieldOff"]:
101 flags.BField.solenoidOn =
True
102 flags.BField.barrelToroidOn =
True
103 flags.BField.endcapToroidOn =
True
106 flags.BField.solenoidOn =
False
107 flags.BField.barrelToroidOn =
False
108 flags.BField.endcapToroidOn =
False
111if kwargs[
"localgeo"]:
112 flags.ITk.Geometry.AllLocal =
True
116tag=
"InDetSi_MisalignmentMode_random misalignment"
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"
124if flags.ITk.Align.alignITkPixel:
125 flags.ITk.Geometry.pixelAlignable =
True
126if flags.ITk.Align.alignITkStrip:
127 flags.ITk.Geometry.stripAlignable =
True
129if kwargs[
"threads"] > 0:
130 flags.Concurrency.NumThreads = kwargs[
"threads"]
134from RecJobTransforms.RecoSteering
import RecoSteering
135cfg = RecoSteering(flags)
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"))
142from MuonConfig.MuonGeometryConfig
import MuonIdHelperSvcCfg
143cfg.getPrimaryAndMerge(MuonIdHelperSvcCfg(flags))
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))
153elif kwargs[
"solve"]
and not kwargs[
"accumulate"]:
154 os.makedirs(f
"{flags.ITk.Align.baseDir}/Solve", exist_ok =
True)
156 from InDetAlignConfig.SolveITkConfig
import ITkSolveCfg
157 cfg.merge(ITkSolveCfg(flags))
160 raise Exception(
"You can run either the acculumation step or the solve step, but not both or neither at the same time!")
void print(char *figname, TCanvas *c1)