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 11: 'R deltaR (radial expansion)', 12: 'Phi deltaR (ellipse)',13: 'Z deltaR (funnel)',
88 21: 'R deltaPhi (curl)', 22: 'Phi deltaPhi (clamshell) ',23:'Z deltaPhi (twist)',
89 31: 'R deltaZ (telescope)',32:'Phi deltaZ (skew)',33:'Z deltaZ (z-expansion)'}
90
91
92 local_translation_str = kwargs.pop('Local_Translation', '0.0,0.0,0.0')
93 local_rotation_str = kwargs.pop('Local_Rotation', '0.0,0.0,0.0')
94 Local_Translation = [float(x) for x in local_translation_str.split(',')]
95 Local_Rotation = [float(x) for x in local_rotation_str.split(',')]
96 translation_scale_str = kwargs.pop('Translation_Scale', '0.1,0.1,0.1')
97 rotation_scale_str = kwargs.pop('Rotation_Scale', '0.1,0.1,0.1')
98 Translation_Scale = [float(x) for x in translation_scale_str.split(',')]
99 Rotation_Scale = [float(x) for x in rotation_scale_str.split(',')]
100 acc=MainServicesCfg(flags)
101 print ("\n CreateMisalignAlg: Creation of misalignment mode %s: %s \n" % (int(MisalignMode),misalignModeMap.get(int(MisalignMode),'unknown')))
102 kwargs.setdefault("ASCIIFilenameBase",outFiles)
103 kwargs.setdefault("SQLiteTag",'MisalignmentMode_'+str(misalignModeMap.get(int(MisalignMode),'unknown')))
104 kwargs.setdefault("MisalignMode",int(MisalignMode))
105 kwargs.setdefault("Translation_Scale",Translation_Scale)
106 kwargs.setdefault("Rotation_Scale",Rotation_Scale)
107 kwargs.setdefault("Local_Translation",Local_Translation)
108 kwargs.setdefault("Local_Rotation",Local_Rotation)
109 kwargs.setdefault("Index", str(kwargs.pop('Index', '')))
110 kwargs.setdefault("MaxShift",shiftInMicrons)
111 kwargs.setdefault("CreateFreshDB",createFreshDB)
112 #Create and configure the AlignDB tool
113
114 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!
115
116 writeDBPoolFile=True #Activate or deactivate writing to outFiles + '.pool.root'
117 kargsTool={}
118 kargsTool.setdefault("SCTTwoSide",True)
119 kargsTool.setdefault("DBRoot",outputAlignFolder)
120 kargsTool.setdefault("forceUserDBConfig",True)
121 if writeDBPoolFile:
122 print("Writing DB Pool File")
123 InDetCondStream=CompFactory.AthenaOutputStreamTool("CondStream_write",OutputFile = outFiles+'.pool.root')
124 InDetCondStream.PoolContainerPrefix="<type>"
125 InDetCondStream.TopLevelContainerName=""
126 InDetCondStream.SubLevelBranchName="<key>"
127 kargsTool.setdefault("CondStream",InDetCondStream)
128 dbTool = acc.popToolsAndMerge(ITkAlignDBTool(flags,**kargsTool))
129
130 kwargs.setdefault("IDAlignDBTool",dbTool)
131
132 cfg=CreateITkMisalignAlgCfg(flags,name=name,**kwargs)
133
134 acc.merge(cfg)
135 if writeDBPoolFile:
136 print("To be writen DB pool File")
137
138 return acc
139
140if __name__ == "__main__":
141 if(len(sys.argv[1:])):
142 kwargs=dict(arg.split('=') for arg in sys.argv[1:])
143 print(kwargs)
144 else:
145 kwargs={}
146 print("no args")
147 #Get the basic configuration flags
148 flags=getFlags(**kwargs)
149 flags.dump()
150 #Add the tools and the algorithm to the accumulator
151 acc=CreateMis(flags,**kwargs)
152 acc.printConfig()
153
154 #run
155 sc=acc.run(10)
156 if sc.isFailure():
157 print("Failed to run the Misalignment Algorithm")
158 sys.exit(-1)
if(febId1==febId2)
void print(char *figname, TCanvas *c1)
CreateMis(flags, name="CreateITkMisalignAlg", **kwargs)