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 return parser.parse_args()
50
51kwargs = vars(parser())
52
53
54from AthenaConfiguration.AllConfigFlags import initConfigFlags
55flags = initConfigFlags()
56
57
58from InDetConfig.ConfigurationHelpers import OnlyTrackingPreInclude
59OnlyTrackingPreInclude(flags)
60
61
62flags.ITk.Align.accumulate = kwargs["accumulate"]
63flags.ITk.Align.baseDir = os.path.abspath(kwargs["baseDir"])
64
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
68
69flags.ITk.Align.writeSilicon = False #Issues with folders ATM - should be flags.ITk.Align.alignITkPixel or flags.ITk.Align.alignITkStrip
70
71flags.ITk.Align.inputTFiles = kwargs["inputTFiles"]
72
73flags.Input.Files = kwargs["input"]
74flags.Exec.MaxEvents = kwargs["maxEvents"] if not kwargs["solve"] else 1
75flags.IOVDb.GlobalTag = kwargs["globalTag"]
76
77flags.addFlag("ConstrainedTrackProvider.InputTracksCollection", kwargs["inputTracksCollection"])
78
79flags.GeoModel.Align.Dynamic = False
80flags.GeoModel.AtlasVersion = kwargs["atlasVersion"]
81
82if 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
90if kwargs["isHeavyIon"]:
91 flags.Beam.BunchSpacing = 50
92 flags.Reco.EnableHI = True
93 flags.HeavyIon.doGlobal = True
94
95else:
96 flags.Beam.BunchSpacing = 25
97
98if not kwargs["isBFieldOff"]:
99 flags.BField.solenoidOn = True
100 flags.BField.barrelToroidOn = True
101 flags.BField.endcapToroidOn = True
102
103else:
104 flags.BField.solenoidOn = False
105 flags.BField.barrelToroidOn = False
106 flags.BField.endcapToroidOn = False
107
108
109if kwargs["localgeo"]:
110 flags.ITk.Geometry.AllLocal = True
111
112DBFile = ""
113DBName="OFLCOND"
114tag="InDetSi_MisalignmentMode_random misalignment"
115
116if 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
122if flags.ITk.Align.alignITkPixel:
123 flags.ITk.Geometry.pixelAlignable = True
124if flags.ITk.Align.alignITkStrip:
125 flags.ITk.Geometry.stripAlignable = True
126
127flags.lock()
128
129from RecJobTransforms.RecoSteering import RecoSteering
130cfg = RecoSteering(flags)
131
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"))
136
137from MuonConfig.MuonGeometryConfig import MuonIdHelperSvcCfg
138cfg.getPrimaryAndMerge(MuonIdHelperSvcCfg(flags))
139
140
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))
146
147
148elif 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
154else:
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
159if kwargs["dryRun"]:
160 cfg.printConfig()
161
162else:
163 cfg.run()
void print(char *figname, TCanvas *c1)