ATLAS Offline Software
CreateMisalignmentITk.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 #Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
4 
9 
10 from AthenaConfiguration.AllConfigFlags import initConfigFlags
11 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
12 from InDetAlignGenAlgs.InDetAlignAlgsConfig import CreateITkMisalignAlgCfg
13 from AthenaConfiguration.DetectorConfigFlags import setupDetectorFlags
14 from InDetAlignGenTools.InDetAlignGenToolsConfig import ITkAlignDBTool
15 import sys
16 from AthenaConfiguration.ComponentFactory import CompFactory
17 
18 
19 
20 def 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  if MisalignMode == 2:
53  translation_scale_str = kwargs.pop('Translation_Scale', '0.1,0.1,0.1')
54  rotation_scale_str = kwargs.pop('Rotation_Scale', '0.1,0.1,0.1')
55  Translation_Scale = [float(x) for x in translation_scale_str.split(',')]
56  Rotation_Scale = [float(x) for x in rotation_scale_str.split(',')]
57  if MisalignMode == 7:
58  local_translation_str = kwargs.pop('Local_Translation', '0.0,0.0,0.0')
59  local_rotation_str = kwargs.pop('Local_Rotation', '0.0,0.0,0.0')
60  Local_Translation = [float(x) for x in local_translation_str.split(',')]
61  Local_Rotation = [float(x) for x in local_rotation_str.split(',')]
62  databaseFilename = 'MisalignmentSet%s.db' % (MisalignMode)
63  flags.IOVDb.DBConnection="sqlite://;schema=%s;dbname=OFLCOND" % (databaseFilename)
64  flags.IOVDb.GlobalTag = defaultConditionsTags.RUN4_MC
65 
66 
67  # This should run serially for the moment.
68  flags.Concurrency.NumThreads = 1
69  flags.Concurrency.NumConcurrentEvents = 1
70  flags.lock()
71 
72  return flags
73 
74 def CreateMis(flags,name="CreateITkMisalignAlg",**kwargs):
75  #
76  #--------------------------------------------------------------
77  # Geometry section
78  #--------------------------------------------------------------
79  misalignmentOnTopOfExistingSet = False
80  readDBPoolFile = False
81 
82  createFreshDB = not(readDBPoolFile or misalignmentOnTopOfExistingSet)
83 
84  MisalignMode = kwargs.pop('MisalignMode',11)
85 
86  shiftInMicrons = 100
87 
88  if MisalignMode in [11, 12, 31]:
89  shiftInMicrons = 500
90 
91  outFiles = 'MisalignmentSet%s' % (MisalignMode)
92  misalignModeMap = {0:'no Misalignment',
93  1: 'misalignment by 6 parameters',
94  2: 'random misalignment',
95  3: 'IBL-stave temperature dependent bowing',
96  7: 'misalignment according to module indices',
97  11: 'R deltaR (radial expansion)', 12: 'Phi deltaR (ellipse)',13: 'Z deltaR (funnel)',
98  21: 'R deltaPhi (curl)', 22: 'Phi deltaPhi (clamshell) ',23:'Z deltaPhi (twist)',
99  31: 'R deltaZ (telescope)',32:'Phi deltaZ (skew)',33:'Z deltaZ (z-expansion)'}
100 
101 
102  local_translation_str = kwargs.pop('Local_Translation', '0.0,0.0,0.0')
103  local_rotation_str = kwargs.pop('Local_Rotation', '0.0,0.0,0.0')
104  Local_Translation = [float(x) for x in local_translation_str.split(',')]
105  Local_Rotation = [float(x) for x in local_rotation_str.split(',')]
106  translation_scale_str = kwargs.pop('Translation_Scale', '0.1,0.1,0.1')
107  rotation_scale_str = kwargs.pop('Rotation_Scale', '0.1,0.1,0.1')
108  Translation_Scale = [float(x) for x in translation_scale_str.split(',')]
109  Rotation_Scale = [float(x) for x in rotation_scale_str.split(',')]
110  acc=MainServicesCfg(flags)
111  print ("\n CreateMisalignAlg: Creation of misalignment mode %s: %s \n" % (int(MisalignMode),misalignModeMap.get(int(MisalignMode),'unknown')))
112  kwargs.setdefault("ASCIIFilenameBase",outFiles)
113  kwargs.setdefault("SQLiteTag",'MisalignmentMode_'+str(misalignModeMap.get(int(MisalignMode),'unknown')))
114  kwargs.setdefault("MisalignMode",int(MisalignMode))
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 
150 if __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)
CreateMisalignmentITk.CreateMis
def CreateMis(flags, name="CreateITkMisalignAlg", **kwargs)
Definition: CreateMisalignmentITk.py:74
InDetAlignAlgsConfig.CreateITkMisalignAlgCfg
def CreateITkMisalignAlgCfg(flags, name="CreateITkMisalignAlg", **kwargs)
Definition: InDetAlignAlgsConfig.py:6
CreateMisalignmentITk.getFlags
def getFlags(**kwargs)
Definition: CreateMisalignmentITk.py:20
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:312
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:26
python.DetectorConfigFlags.setupDetectorFlags
def setupDetectorFlags(flags, custom_list=None, use_metadata=False, toggle_geometry=False, validate_only=False, keep_beampipe=False)
Definition: DetectorConfigFlags.py:292
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
InDetAlignGenToolsConfig.ITkAlignDBTool
def ITkAlignDBTool(flags, name="ITkAlignDBTool", **kwargs)
Definition: InDetAlignGenToolsConfig.py:6
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
str
Definition: BTagTrackIpAccessor.cxx:11
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65