Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
TrigL2MuonSAConfig.py
Go to the documentation of this file.
1 #
2 # Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 #
4 # This file configs the L2MuonSA reco alg in the newJO way,
5 # but now is located here temporarily until newJO migrations are done in all trigger signatures.
6 # This should be moved at somewhere in offline.
7 
8 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
9 from AthenaConfiguration.ComponentFactory import CompFactory
10 from AthenaConfiguration.AccumulatorCache import AccumulatorCache
11 
12 
13 # Get Rpc data decoder for MuFast data preparator
14 def RpcDataPreparatorCfg( flags ):
15 
16  acc = ComponentAccumulator()
17 
18  # Set Rpc data preparator for MuFast data preparator
19  from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig import RPCRecRoiToolCfg
20  from RegionSelector.RegSelToolConfig import regSelTool_RPC_Cfg
21 
22  recRoiTool = acc.popToolsAndMerge(RPCRecRoiToolCfg(flags, useRun3Config=flags.Trigger.enableL1MuonPhase1))
23  RpcDataPreparator = CompFactory.getComp("TrigL2MuonSA::RpcDataPreparator")(
24  TrigT1RPCRecRoiTool = recRoiTool,
25  RpcClusterPreparator = CompFactory.getComp("TrigL2MuonSA::RpcClusterPreparator")(
26  TrigT1RPCRecRoiTool = recRoiTool),
27  RegSel_RPC = acc.popToolsAndMerge( regSelTool_RPC_Cfg( flags ) )
28  )
29 
30  return acc, RpcDataPreparator
31 
32 # Get Tgc data decoder for MuFast data preparator
33 def TgcDataPreparatorCfg( flags ):
34 
35  acc = ComponentAccumulator()
36 
37  # Set Tgc data preparator for MuFast data preparator
38  TgcDataPreparator = CompFactory.getComp("TrigL2MuonSA::TgcDataPreparator")()
39 
40  return acc, TgcDataPreparator
41 
42 # Get Mdt data decoder for MuFast data preparator
43 def MdtDataPreparatorCfg( flags ):
44 
45  acc = ComponentAccumulator()
46 
47  # Set Mdt data preparator for MuFast data preparator
48  from RegionSelector.RegSelToolConfig import regSelTool_MDT_Cfg
49  MdtDataPreparator = CompFactory.getComp("TrigL2MuonSA::MdtDataPreparator")(
50  RegSel_MDT = acc.popToolsAndMerge( regSelTool_MDT_Cfg( flags ) ),
51  isPhase2 = flags.Muon.usePhaseIIGeoSetup
52  )
53  return acc, MdtDataPreparator
54 
55 # Get Csc data decoder for MuFast data preparator
56 def CscDataPreparatorCfg( flags ):
57 
58  acc = ComponentAccumulator()
59 
60  # Set Csc data preparator for MuFast data preparator
61  CscDataPreparator = CompFactory.getComp("TrigL2MuonSA::CscDataPreparator")()
62 
63  return acc, CscDataPreparator
64 
65 def StgcDataPreparatorCfg( flags ):
66 
67  acc = ComponentAccumulator()
68 
69  # Set Stgc data preparator for MuFast data preparator
70  from RegionSelector.RegSelToolConfig import regSelTool_STGC_Cfg
71  StgcDataPreparator = CompFactory.getComp("TrigL2MuonSA::StgcDataPreparator")(
72  RegSel_STGC = acc.popToolsAndMerge( regSelTool_STGC_Cfg( flags ) )
73  )
74  return acc, StgcDataPreparator
75 
76 def MmDataPreparatorCfg( flags ):
77 
78  acc = ComponentAccumulator()
79 
80  # Set Mm data preparator for MuFast data preparator
81  TrigL2MuonSA__MmDataPreparator=CompFactory.getComp("TrigL2MuonSA::MmDataPreparator")
82  MmDataPreparator = TrigL2MuonSA__MmDataPreparator()
83  from RegionSelector.RegSelToolConfig import regSelTool_MM_Cfg
84  MmDataPreparator.RegSel_MM = acc.popToolsAndMerge( regSelTool_MM_Cfg( flags ) )
85 
86  return acc, MmDataPreparator
87 
88 def RpcRoadDefinerCfg( flags ):
89 
90  acc = ComponentAccumulator()
91 
92  # Set RPC road definer for MuFast data preparator
93  from RegionSelector.RegSelToolConfig import regSelTool_MDT_Cfg
94  RpcRoadDefiner = CompFactory.getComp("TrigL2MuonSA::RpcRoadDefiner")(
95  RegionSelectionTool = acc.popToolsAndMerge( regSelTool_MDT_Cfg( flags ) )
96  )
97  return acc, RpcRoadDefiner
98 
99 def TgcRoadDefinerCfg( flags ):
100 
101  acc = ComponentAccumulator()
102 
103  # Set TGC road definer for MuFast data preparator
104  from RegionSelector.RegSelToolConfig import regSelTool_MDT_Cfg
105  TgcRoadDefiner = CompFactory.getComp("TrigL2MuonSA::TgcRoadDefiner")(
106  RegionSelectionTool = acc.popToolsAndMerge( regSelTool_MDT_Cfg( flags ) )
107  )
108  return acc, TgcRoadDefiner
109 
111 
112  acc = ComponentAccumulator()
113 
114  from RegionSelector.RegSelToolConfig import regSelTool_MDT_Cfg
115  ClusterRoadDefiner = CompFactory.getComp("TrigL2MuonSA::ClusterRoadDefiner")(
116  RegionSelectionTool = acc.popToolsAndMerge(regSelTool_MDT_Cfg(flags))
117  )
118  return acc, ClusterRoadDefiner
119 
120 
121 def muFastSteeringCfg( flags, roisKey="", setup="", **kwargs ):
122  from MuonConfig.MuonCalibrationConfig import MdtCalibrationToolCfg
123 
124  acc = ComponentAccumulator()
125 
126  # Get RPC decoder
127  rpcAcc, RpcDataPreparator = RpcDataPreparatorCfg( flags )
128  acc.merge( rpcAcc )
129 
130  # Get TGC decoder
131  tgcAcc, TgcDataPreparator = TgcDataPreparatorCfg( flags )
132  acc.merge( tgcAcc )
133 
134  # Get MDT decoder
135  mdtAcc, MdtDataPreparator = MdtDataPreparatorCfg( flags )
136  acc.merge( mdtAcc )
137 
138  # Get CSC decoder
139  if flags.Detector.GeometryCSC:
140  cscAcc, CscDataPreparator = CscDataPreparatorCfg( flags )
141  acc.merge( cscAcc )
142  else:
143  CscDataPreparator = ""
144 
145  # Get sTGC decoder
146  if flags.Detector.GeometrysTGC:
147  stgcAcc, StgcDataPreparator = StgcDataPreparatorCfg( flags )
148  acc.merge( stgcAcc )
149  else:
150  StgcDataPreparator = ""
151 
152  # Get MM decoder
153  if flags.Detector.GeometryMM:
154  mmAcc, MmDataPreparator = MmDataPreparatorCfg( flags )
155  acc.merge( mmAcc )
156  else:
157  MmDataPreparator = ""
158 
159  # Get RPC road definer
160  rpcRDAcc, RpcRoadDefiner = RpcRoadDefinerCfg( flags )
161  acc.merge( rpcRDAcc )
162 
163  # Get TGC road definer
164  tgcRDAcc, TgcRoadDefiner = TgcRoadDefinerCfg( flags )
165  acc.merge( tgcRDAcc )
166 
167  # Get Cluster Road Definer
168  clusRDAcc, ClusterRoadDefiner = ClusterRoadDefinerCfg(flags)
169  acc.merge(clusRDAcc)
170 
171  # Set MuFast data preparator
172  TrigL2MuonSA__MuFastDataPreparator=CompFactory.getComp("TrigL2MuonSA::MuFastDataPreparator")
173 
174  from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig import RPCRecRoiToolCfg
175  MuFastDataPreparator = TrigL2MuonSA__MuFastDataPreparator( CSCDataPreparator = CscDataPreparator,
176  MDTDataPreparator = MdtDataPreparator,
177  RPCDataPreparator = RpcDataPreparator,
178  TGCDataPreparator = TgcDataPreparator,
179  STGCDataPreparator = StgcDataPreparator,
180  MMDataPreparator = MmDataPreparator,
181  RpcRoadDefiner = RpcRoadDefiner,
182  TgcRoadDefiner = TgcRoadDefiner,
183  ClusterRoadDefiner = ClusterRoadDefiner,
184  TrigT1RPCRecRoiTool = acc.popToolsAndMerge(RPCRecRoiToolCfg(flags, useRun3Config=flags.Trigger.enableL1MuonPhase1)) )
185 
186  # Setup the station fitter
187  TrigL2MuonSA__MuFastStationFitter,TrigL2MuonSA__PtFromAlphaBeta=CompFactory.getComps("TrigL2MuonSA::MuFastStationFitter","TrigL2MuonSA::PtFromAlphaBeta")
188  PtFromAlphaBeta = TrigL2MuonSA__PtFromAlphaBeta()
189  PtFromAlphaBeta.useCscPt = True
190  PtFromAlphaBeta.AvoidMisalignedCSCs = False
191 
192  MuFastStationFitter = TrigL2MuonSA__MuFastStationFitter( PtFromAlphaBeta = PtFromAlphaBeta )
193  TrigL2MuonSA__MuFastPatternFinder,TrigL2MuonSA__MuFastTrackFitter,TrigL2MuonSA__MuFastTrackExtrapolator,TrigL2MuonSA__MuCalStreamerTool,TrigL2MuonSA__CscSegmentMaker=CompFactory.getComps("TrigL2MuonSA::MuFastPatternFinder","TrigL2MuonSA::MuFastTrackFitter","TrigL2MuonSA::MuFastTrackExtrapolator","TrigL2MuonSA::MuCalStreamerTool","TrigL2MuonSA::CscSegmentMaker")
194  MuFastPatternFinder = TrigL2MuonSA__MuFastPatternFinder(CalibrationTool=acc.popToolsAndMerge( MdtCalibrationToolCfg(flags)))
195  MuFastTrackFitter = TrigL2MuonSA__MuFastTrackFitter()
196  MuFastTrackExtrapolator = TrigL2MuonSA__MuFastTrackExtrapolator()
197 
198  from RegionSelector.RegSelToolConfig import regSelTool_MDT_Cfg, regSelTool_TGC_Cfg
199  MuCalStreamerTool = TrigL2MuonSA__MuCalStreamerTool(
200  RegSel_MDT = acc.popToolsAndMerge(regSelTool_MDT_Cfg(flags)),
201  RegSel_TGC = acc.popToolsAndMerge(regSelTool_TGC_Cfg(flags)) )
202 
203 
204  CscSegmentMaker = TrigL2MuonSA__CscSegmentMaker()
205 
206  if not flags.Detector.GeometrysTGC and not flags.Detector.GeometryMM:
207  MuFastStationFitter.NswStationFitter=""
208 
209  # Set Reco alg of muFast step
210  useNSW = (( not flags.Muon.runCommissioningChain ) and ( not flags.Muon.disableNSWForL2SA ))
211  from TrigL2MuonSA.TrigL2MuonSAMonitoring import TrigL2MuonSAMonitoring
212  from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
213  muFastAlg = CompFactory.MuFastSteering(
214  name = "MuFastSteering_Muon"+setup,
215  DataPreparator = MuFastDataPreparator,
216  StationFitter = MuFastStationFitter,
217  PatternFinder = MuFastPatternFinder,
218  TrackFitter = MuFastTrackFitter,
219  TrackExtrapolator = MuFastTrackExtrapolator,
220  FtfRoadDefiner = CompFactory.TrigL2MuonSA.FtfRoadDefiner(
221  IOExtrapolator=acc.popToolsAndMerge(AtlasExtrapolatorCfg(flags))),
222  CalibrationStreamer = MuCalStreamerTool,
223  MuonCalibrationStream = "MuonCalibrationStream"+setup,
224  CscSegmentMaker = CscSegmentMaker,
225  MuRoIs = roisKey,
226  R_WIDTH_TGC_FAILED = 200,
227  R_WIDTH_RPC_FAILED = 400,
228  DoCalibrationStream = False,
229  USE_ROIBASEDACCESS_CSC = True,
230  # NSW on/off
231  USE_STGC = useNSW,
232  USE_MM = useNSW,
233 
235  USE_ROIBASEDACCESS_STGC= False,
236  USE_ROIBASEDACCESS_MM = False,
237 
238  RpcErrToDebugStream = True,
239  topoRoad = True,
240  dEtasurrRoI = 0.14,
241  dPhisurrRoI = 0.14,
242  MonTool = TrigL2MuonSAMonitoring(flags),
243  UseRun3Config = flags.Trigger.enableL1MuonPhase1,
244  UseEndcapInnerFromBarrel = True,
245  **kwargs )
246 
247  # Default backextrapolator is for MC Misaligned Detector
248  TrigMuonBackExtrapolator=CompFactory.TrigMuonBackExtrapolator
249  muFastAlg.BackExtrapolator = TrigMuonBackExtrapolator( name = "MisalignedBackExtrapolator",
250  Aligned = False,
251  DataSet = False )
252 
253  if setup == '900GeV':
254  muFastAlg.WinPt = 4.0
255  muFastAlg.Scale_Road_BarrelInner = 3
256  muFastAlg.Scale_Road_BarrelMiddle = 3
257  muFastAlg.Scale_Road_BarrelOuter = 3
258  else:
259  muFastAlg.WinPt = 6.0
260  muFastAlg.Scale_Road_BarrelInner = 1
261  muFastAlg.Scale_Road_BarrelMiddle = 1
262  muFastAlg.Scale_Road_BarrelOuter = 1
263 
264  if setup == 'Calib':
265  muFastAlg.DoCalibrationStream = True
266  muFastAlg.MuonCalDataScouting = False
267  muFastAlg.MuonCalBufferSize = 1024*1024
268 
269  elif setup == 'MuonCalibDataScouting':
270  muFastAlg.DoCalibrationStream = True
271  muFastAlg.MuonCalDataScouting = True
272  muFastAlg.MuonCalBufferSize = 1024*1024
273 
274  elif setup == 'l2mtmode':
275  muFastAlg.multitrackMode = True
276  muFastAlg.doEndcapForl2mt = False
277 
278  elif setup == 'IOmode':
279  # Do not run topo road and inside-out mode at the same time
280  muFastAlg.topoRoad = False
281  muFastAlg.InsideOutMode = True
282 
283  return acc, muFastAlg
284 
285 def PtBarrelLUTSvcCfg( flags ):
286 
287  acc = ComponentAccumulator()
288  ptBarrelLUTSvc = CompFactory.getComp("TrigL2MuonSA::PtBarrelLUTSvc")(name = 'PtBarrelLUTSvc')
289  ptBarrelLUTSvc.LUTfile = "pt_barrel.lut"
290  ptBarrelLUTSvc.SP_LUTfile = "pt_barrelSP_new.lut"
291 
292  acc.addService( ptBarrelLUTSvc )
293 
294  return acc, ptBarrelLUTSvc
295 
296 def PtBarrelLUTSvcCfg_MC( flags ):
297 
298  acc = ComponentAccumulator()
299  ptBarrelLUTSvc_MC = CompFactory.getComp("TrigL2MuonSA::PtBarrelLUTSvc")(name = 'PtBarrelLUTSvc_MC')
300  ptBarrelLUTSvc_MC.LUTfile = "pt_barrel.mc10.lut"
301  acc.addService( ptBarrelLUTSvc_MC )
302 
303  return acc, ptBarrelLUTSvc_MC
304 
305 def PtEndcapLUTSvcCfg( flags ):
306 
307  acc = ComponentAccumulator()
308  ptEndcapLUTSvc = CompFactory.getComp("TrigL2MuonSA::PtEndcapLUTSvc")(name = 'PtEndcapLUTSvc')
309  ptEndcapLUTSvc.FileName = "pt_endcap.lut"
310  ptEndcapLUTSvc.EMeanLUT = "pt_comb_mean.lut"
311  ptEndcapLUTSvc.ESigmaLUT = "pt_comb_sigma.lut"
312  if flags.Detector.GeometrysTGC or flags.Detector.GeometryMM:
313  ptEndcapLUTSvc.UseRun3LUT = True
314  else:
315  ptEndcapLUTSvc.UseRun3LUT = False
316  acc.addService( ptEndcapLUTSvc )
317 
318  return acc, ptEndcapLUTSvc
319 
320 def PtEndcapLUTSvcCfg_MC( flags ):
321 
322  acc = ComponentAccumulator()
323  ptEndcapLUTSvc_MC = CompFactory.getComp("TrigL2MuonSA::PtEndcapLUTSvc")(name = 'PtEndcapLUTSvc_MC')
324  ptEndcapLUTSvc_MC.FileName = "pt_endcap.mc10.lut"
325  ptEndcapLUTSvc_MC.EMeanLUT = "pt_comb_mean.lut"
326  ptEndcapLUTSvc_MC.ESigmaLUT = "pt_comb_sigma.lut"
327  if flags.Detector.GeometrysTGC or flags.Detector.GeometryMM:
328  ptEndcapLUTSvc_MC.UseRun3LUT = True
329  else:
330  ptEndcapLUTSvc_MC.UseRun3LUT = False
331  acc.addService( ptEndcapLUTSvc_MC )
332 
333  return acc, ptEndcapLUTSvc_MC
334 
335 
337 
338  acc = ComponentAccumulator()
339  alignmentBarrelLUTSvc = CompFactory.getComp("TrigL2MuonSA::AlignmentBarrelLUTSvc")(name = 'AlignmentBarrelLUTSvc')
340  alignmentBarrelLUTSvc.LUTfile = "dZ_barrel.lut"
341  acc.addService( alignmentBarrelLUTSvc )
342 
343  return acc, alignmentBarrelLUTSvc
344 
345 
346 @AccumulatorCache
347 def l2MuFastAlgCfg( flags, roisKey, setup="", **kwargs ):
348 
349  acc = ComponentAccumulator()
350 
351  if not roisKey:
352  from HLTSeeding.HLTSeedingConfig import mapThresholdToL1RoICollection
353  roisKey = mapThresholdToL1RoICollection("MU")
354 
355  # Get Reco alg of muFast step
356  muFastAcc, muFastFex = muFastSteeringCfg( flags, roisKey, setup, **kwargs )
357  acc.merge( muFastAcc )
358 
359  # Get services of the Reco alg
360  acc.merge( PtBarrelLUTSvcCfg(flags)[0] )
361  acc.merge( PtBarrelLUTSvcCfg_MC(flags)[0] )
362  acc.merge( PtEndcapLUTSvcCfg(flags)[0] )
363  acc.merge( PtEndcapLUTSvcCfg_MC(flags)[0] )
364  acc.merge( AlignmentBarrelLUTSvcCfg(flags)[0] )
365  acc.addEventAlgo(muFastFex)
366 
367  return acc
368 
369 
370 
371 if __name__ == "__main__":
372  from AthenaConfiguration.TestDefaults import defaultTestFiles, defaultGeometryTags
373  from AthenaConfiguration.AllConfigFlags import initConfigFlags
374  flags = initConfigFlags()
375  flags.Input.Files = defaultTestFiles.RAW_RUN2
376  flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN2
377  flags.lock()
378 
379  cfg = l2MuFastAlgCfg(flags, roisKey="MURoIs")
380  cfg.printConfig(withDetails=True, summariseProps=True)
381  cfg.wasMerged()
TrigT1MuonRecRoiToolConfig.RPCRecRoiToolCfg
def RPCRecRoiToolCfg(flags, name="RPCRecRoiTool", useRun3Config=True)
Definition: TrigT1MuonRecRoiToolConfig.py:8
RegSelToolConfig.regSelTool_MDT_Cfg
def regSelTool_MDT_Cfg(flags)
Definition: RegSelToolConfig.py:134
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
TrigL2MuonSAConfig.l2MuFastAlgCfg
def l2MuFastAlgCfg(flags, roisKey, setup="", **kwargs)
Definition: TrigL2MuonSAConfig.py:347
RegSelToolConfig.regSelTool_STGC_Cfg
def regSelTool_STGC_Cfg(flags)
Definition: RegSelToolConfig.py:185
TrigL2MuonSAConfig.muFastSteeringCfg
def muFastSteeringCfg(flags, roisKey="", setup="", **kwargs)
Definition: TrigL2MuonSAConfig.py:121
TrigMuonBackExtrapolator
Definition: TrigMuonBackExtrapolator.h:16
RegSelToolConfig.regSelTool_TGC_Cfg
def regSelTool_TGC_Cfg(flags)
Definition: RegSelToolConfig.py:161
TrigL2MuonSAMonitoring
Definition: TrigL2MuonSAMonitoring.py:1
TrigL2MuonSAConfig.AlignmentBarrelLUTSvcCfg
def AlignmentBarrelLUTSvcCfg(flags)
Definition: TrigL2MuonSAConfig.py:336
python.AtlasExtrapolatorConfig.AtlasExtrapolatorCfg
def AtlasExtrapolatorCfg(flags, name='AtlasExtrapolator')
Definition: AtlasExtrapolatorConfig.py:63
TrigL2MuonSAConfig.StgcDataPreparatorCfg
def StgcDataPreparatorCfg(flags)
Definition: TrigL2MuonSAConfig.py:65
TrigL2MuonSAConfig.PtBarrelLUTSvcCfg
def PtBarrelLUTSvcCfg(flags)
Definition: TrigL2MuonSAConfig.py:285
TrigL2MuonSAConfig.TgcDataPreparatorCfg
def TgcDataPreparatorCfg(flags)
Definition: TrigL2MuonSAConfig.py:33
TrigL2MuonSAConfig.PtEndcapLUTSvcCfg
def PtEndcapLUTSvcCfg(flags)
Definition: TrigL2MuonSAConfig.py:305
TrigL2MuonSAConfig.MmDataPreparatorCfg
def MmDataPreparatorCfg(flags)
Definition: TrigL2MuonSAConfig.py:76
python.MuonCalibrationConfig.MdtCalibrationToolCfg
def MdtCalibrationToolCfg(flags, name="MdtCalibrationTool", **kwargs)
Definition: MuonCalibrationConfig.py:82
TrigL2MuonSAConfig.MdtDataPreparatorCfg
def MdtDataPreparatorCfg(flags)
Definition: TrigL2MuonSAConfig.py:43
RegSelToolConfig.regSelTool_MM_Cfg
def regSelTool_MM_Cfg(flags)
Definition: RegSelToolConfig.py:191
TrigL2MuonSAConfig.ClusterRoadDefinerCfg
def ClusterRoadDefinerCfg(flags)
Definition: TrigL2MuonSAConfig.py:110
TrigL2MuonSAConfig.RpcDataPreparatorCfg
def RpcDataPreparatorCfg(flags)
Definition: TrigL2MuonSAConfig.py:14
TrigL2MuonSAConfig.TgcRoadDefinerCfg
def TgcRoadDefinerCfg(flags)
Definition: TrigL2MuonSAConfig.py:99
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
HLTSeedingConfig.mapThresholdToL1RoICollection
def mapThresholdToL1RoICollection(threshold)
Definition: HLTSeedingConfig.py:91
TrigL2MuonSAConfig.PtEndcapLUTSvcCfg_MC
def PtEndcapLUTSvcCfg_MC(flags)
Definition: TrigL2MuonSAConfig.py:320
TrigL2MuonSAConfig.PtBarrelLUTSvcCfg_MC
def PtBarrelLUTSvcCfg_MC(flags)
Definition: TrigL2MuonSAConfig.py:296
TrigL2MuonSAConfig.RpcRoadDefinerCfg
def RpcRoadDefinerCfg(flags)
Definition: TrigL2MuonSAConfig.py:88
RegSelToolConfig.regSelTool_RPC_Cfg
def regSelTool_RPC_Cfg(flags)
Definition: RegSelToolConfig.py:149
TrigL2MuonSAConfig.CscDataPreparatorCfg
def CscDataPreparatorCfg(flags)
Definition: TrigL2MuonSAConfig.py:56