ATLAS Offline Software
Loading...
Searching...
No Matches
CreateMisalignmentITk.py
Go to the documentation of this file.
1#!/usr/bin/env python
2
3#Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
4
9
10from AthenaConfiguration.AllConfigFlags import initConfigFlags
11from AthenaConfiguration.MainServicesConfig import MainServicesCfg
12from InDetAlignGenAlgs.InDetAlignAlgsConfig import CreateITkMisalignAlgCfg
13from AthenaConfiguration.DetectorConfigFlags import setupDetectorFlags
14from InDetAlignGenTools.InDetAlignGenToolsConfig import ITkAlignDBTool
15import sys
16from AthenaConfiguration.ComponentFactory import CompFactory
17
18
19
20def getFlags(**kwargs):
21 flags=initConfigFlags()
22
23 flags.Input.isMC = True
24
25 flags.Input.Files = []
26
27 from AthenaConfiguration.TestDefaults import defaultGeometryTags,defaultConditionsTags
28 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN4
29 flags.GeoModel.Align.Dynamic = False
30
31 flags.ITk.Geometry.isAlignable = True
32 flags.ITk.Align.alignITkPixel = True
33 flags.ITk.Align.alignITkStrip = True
34
35
36
37 flags.ITk.Geometry.AllLocal = False
38 detectors = [
39 "ITkPixel",
40 "ITkStrip",
41 "Bpipe"
42 ]
43 setupDetectorFlags(flags, custom_list=detectors, toggle_geometry=True)
44 flags.TrackingGeometry.MaterialSource = "Input"
45
46
47 #Define the output database file name and add it to the flags
48 if 'MisalignMode' not in kwargs.keys():
49 MisalignMode = 11 # Radial
50 else:
51 MisalignMode=int(kwargs.get('MisalignMode',11))
52 databaseFilename = 'MisalignmentSet%s.db' % (MisalignMode)
53 flags.IOVDb.DBConnection="sqlite://;schema=%s;dbname=OFLCOND" % (databaseFilename)
54 flags.IOVDb.GlobalTag = defaultConditionsTags.RUN4_MC
55
56
57 # This should run serially for the moment.
58 flags.Concurrency.NumThreads = 1
59 flags.Concurrency.NumConcurrentEvents = 1
60 flags.lock()
61
62 return flags
63
64def CreateMis(flags,name="CreateITkMisalignAlg",**kwargs):
65 #
66 #--------------------------------------------------------------
67 # Geometry section
68 #--------------------------------------------------------------
69 misalignmentOnTopOfExistingSet = False
70 readDBPoolFile = False
71
72 createFreshDB = not(readDBPoolFile or misalignmentOnTopOfExistingSet)
73
74 MisalignMode = kwargs.pop('MisalignMode',11)
75
76 shiftInMicrons = 100
77
78 if MisalignMode in [11, 12, 31]:
79 shiftInMicrons = 500
80
81 outFiles = 'MisalignmentSet%s' % (MisalignMode)
82 misalignModeMap = {0:'no Misalignment',
83 1: 'misalignment by 6 parameters',
84 2: 'random misalignment',
85 3: 'IBL-stave temperature dependent bowing',
86 7: 'misalignment according to module indices',
87 41: 'ITk endcap beam-pipe z shift',
88 42: 'ITk pixel barrel layer bowing',
89 43: 'ITk barrel radial expansion',
90 11: 'R deltaR (radial expansion)', 12: 'Phi deltaR (ellipse)',13: 'Z deltaR (funnel)',
91 21: 'R deltaPhi (curl)', 22: 'Phi deltaPhi (clamshell) ',23:'Z deltaPhi (twist)',
92 31: 'R deltaZ (telescope)',32:'Phi deltaZ (skew)',33:'Z deltaZ (z-expansion)'}
93
94
95 local_translation_str = kwargs.pop('Local_Translation', '0.0,0.0,0.0')
96 local_rotation_str = kwargs.pop('Local_Rotation', '0.0,0.0,0.0')
97 Local_Translation = [float(x) for x in local_translation_str.split(',')]
98 Local_Rotation = [float(x) for x in local_rotation_str.split(',')]
99 translation_scale_str = kwargs.pop('Translation_Scale', '0.1,0.1,0.1')
100 rotation_scale_str = kwargs.pop('Rotation_Scale', '0.1,0.1,0.1')
101 Translation_Scale = [float(x) for x in translation_scale_str.split(',')]
102 Rotation_Scale = [float(x) for x in rotation_scale_str.split(',')]
103 acc=MainServicesCfg(flags)
104 print ("\n CreateMisalignAlg: Creation of misalignment mode %s: %s \n" % (int(MisalignMode),misalignModeMap.get(int(MisalignMode),'unknown')))
105 kwargs.setdefault("ASCIIFilenameBase",outFiles)
106 kwargs.setdefault("SQLiteTag",'MisalignmentMode_'+str(misalignModeMap.get(int(MisalignMode),'unknown')))
107 kwargs.setdefault("MisalignMode",int(MisalignMode))
108 kwargs.setdefault("TargetLayer", int(kwargs.pop('TargetLayer', 0)))
109 kwargs.setdefault("TargetLayerMax", int(kwargs.pop('TargetLayerMax', -999)))
110 kwargs.setdefault("IBLBowingTshift", float(kwargs.pop('IBLBowingTshift', 0.0)))
111 kwargs.setdefault("EndcapShiftConvention", kwargs.pop('EndcapShiftConvention', 'outward'))
112 kwargs.setdefault("RadialShift", float(kwargs.pop('RadialShift', 0.0)))
113 kwargs.setdefault("RadialShiftConvention", kwargs.pop('RadialShiftConvention', 'outward'))
114 kwargs.setdefault("RadialSubdetector", kwargs.pop('RadialSubdetector', 'Pixel'))
115 kwargs.setdefault("Translation_Scale",Translation_Scale)
116 kwargs.setdefault("Rotation_Scale",Rotation_Scale)
117 kwargs.setdefault("Local_Translation",Local_Translation)
118 kwargs.setdefault("Local_Rotation",Local_Rotation)
119 kwargs.setdefault("Index", str(kwargs.pop('Index', '')))
120 kwargs.setdefault("MaxShift",shiftInMicrons)
121 kwargs.setdefault("CreateFreshDB",createFreshDB)
122 #Create and configure the AlignDB tool
123
124 outputAlignFolder="/Indet/AlignITk" #The folder name from which initial misalignments should be read - currently may clash if this is the same is the input folder!
125
126 writeDBPoolFile=True #Activate or deactivate writing to outFiles + '.pool.root'
127 kargsTool={}
128 kargsTool.setdefault("SCTTwoSide",True)
129 kargsTool.setdefault("DBRoot",outputAlignFolder)
130 kargsTool.setdefault("forceUserDBConfig",True)
131 if writeDBPoolFile:
132 print("Writing DB Pool File")
133 InDetCondStream=CompFactory.AthenaOutputStreamTool("CondStream_write",OutputFile = outFiles+'.pool.root')
134 InDetCondStream.PoolContainerPrefix="<type>"
135 InDetCondStream.TopLevelContainerName=""
136 InDetCondStream.SubLevelBranchName="<key>"
137 kargsTool.setdefault("CondStream",InDetCondStream)
138 dbTool = acc.popToolsAndMerge(ITkAlignDBTool(flags,**kargsTool))
139
140 kwargs.setdefault("IDAlignDBTool",dbTool)
141
142 cfg=CreateITkMisalignAlgCfg(flags,name=name,**kwargs)
143
144 acc.merge(cfg)
145 if writeDBPoolFile:
146 print("To be writen DB pool File")
147
148 return acc
149
150if __name__ == "__main__":
151 if(len(sys.argv[1:])):
152 kwargs=dict(arg.split('=') for arg in sys.argv[1:])
153 print(kwargs)
154 else:
155 kwargs={}
156 print("no args")
157 #Get the basic configuration flags
158 flags=getFlags(**kwargs)
159 flags.dump()
160 #Add the tools and the algorithm to the accumulator
161 acc=CreateMis(flags,**kwargs)
162 acc.printConfig()
163
164 #run
165 sc=acc.run(10)
166 if sc.isFailure():
167 print("Failed to run the Misalignment Algorithm")
168 sys.exit(-1)
if(pathvar)
void print(char *figname, TCanvas *c1)
CreateMis(flags, name="CreateITkMisalignAlg", **kwargs)