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 return parser.parse_args()
54from AthenaConfiguration.AllConfigFlags
import initConfigFlags
55flags = initConfigFlags()
58from InDetConfig.ConfigurationHelpers
import OnlyTrackingPreInclude
59OnlyTrackingPreInclude(flags)
62flags.ITk.Align.accumulate = kwargs[
"accumulate"]
63flags.ITk.Align.baseDir = os.path.abspath(kwargs[
"baseDir"])
65flags.ITk.Align.alignITk = kwargs[
"alignITk"]
or (
not kwargs[
"alignITk"]
and not kwargs[
"alignITkPixel"]
and not kwargs[
"alignITkStrip"])
66flags.ITk.Align.alignITkPixel = kwargs[
"alignITkPixel"]
or flags.ITk.Align.alignITk
67flags.ITk.Align.alignITkStrip = kwargs[
"alignITkStrip"]
or flags.ITk.Align.alignITk
69flags.ITk.Align.writeSilicon =
False
71flags.ITk.Align.inputTFiles = kwargs[
"inputTFiles"]
73flags.Input.Files = kwargs[
"input"]
74flags.Exec.MaxEvents = kwargs[
"maxEvents"]
if not kwargs[
"solve"]
else 1
75flags.IOVDb.GlobalTag = kwargs[
"globalTag"]
77flags.addFlag(
"ConstrainedTrackProvider.InputTracksCollection", kwargs[
"inputTracksCollection"])
79flags.GeoModel.Align.Dynamic =
False
80flags.GeoModel.AtlasVersion = kwargs[
"atlasVersion"]
82if not flags.Input.isMC
and kwargs[
"isCosmics"]:
83 from AthenaConfiguration.Enums
import BeamType
85 flags.Beam.NumberOfCollisions = 0
86 flags.Beam.Type = BeamType.Cosmics
87 flags.Beam.Energy = 0.
88 flags.Beam.BunchSpacing = 50
90if kwargs[
"isHeavyIon"]:
91 flags.Beam.BunchSpacing = 50
92 flags.Reco.EnableHI =
True
93 flags.HeavyIon.doGlobal =
True
96 flags.Beam.BunchSpacing = 25
98if not kwargs[
"isBFieldOff"]:
99 flags.BField.solenoidOn =
True
100 flags.BField.barrelToroidOn =
True
101 flags.BField.endcapToroidOn =
True
104 flags.BField.solenoidOn =
False
105 flags.BField.barrelToroidOn =
False
106 flags.BField.endcapToroidOn =
False
109if kwargs[
"localgeo"]:
110 flags.ITk.Geometry.AllLocal =
True
114tag=
"InDetSi_MisalignmentMode_random misalignment"
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"
122if flags.ITk.Align.alignITkPixel:
123 flags.ITk.Geometry.pixelAlignable =
True
124if flags.ITk.Align.alignITkStrip:
125 flags.ITk.Geometry.stripAlignable =
True
129from RecJobTransforms.RecoSteering
import RecoSteering
130cfg = RecoSteering(flags)
132if 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"))
137from MuonConfig.MuonGeometryConfig
import MuonIdHelperSvcCfg
138cfg.getPrimaryAndMerge(MuonIdHelperSvcCfg(flags))
141if 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))
148elif kwargs[
"solve"]
and not kwargs[
"accumulate"]:
149 os.makedirs(f
"{flags.ITk.Align.baseDir}/Solve", exist_ok =
True)
151 from InDetAlignConfig.SolveITkConfig
import ITkSolveCfg
152 cfg.merge(ITkSolveCfg(flags))
155 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)