ATLAS Offline Software
ZdcRecConfig.py
Go to the documentation of this file.
1 #
2 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 #
4 
5 from AthenaConfiguration.ComponentFactory import CompFactory
6 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
7 from AthenaConfiguration.Enums import Format
8 from AthenaConfiguration.Enums import LHCPeriod
9 
10 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD
11 from OutputStreamAthenaPool.OutputStreamConfig import addToESD
12 
13 from TriggerJobOpts.TriggerByteStreamConfig import ByteStreamReadCfg
14 
15 # FIXME: removing for MC
16 from TrigConfigSvc.TriggerConfigAccess import getL1MenuAccess
17 # added getRun3NavigationContainerFromInput as per Tim Martin's suggestions
18 from TrigDecisionTool.TrigDecisionToolConfig import TrigDecisionToolCfg, getRun3NavigationContainerFromInput
19 
20 
21 def ZdcRecOutputCfg(flags):
22 
23  acc = ComponentAccumulator()
24 
25  ZDC_ItemList=[]
26  if flags.Input.Format is Format.BS:
27  ZDC_ItemList.append("xAOD::ZdcModuleContainer#ZdcModules")
28  ZDC_ItemList.append("xAOD::ZdcModuleAuxContainer#ZdcModulesAux.")
29  ZDC_ItemList.append("xAOD::ZdcModuleContainer#ZdcSums")
30  ZDC_ItemList.append("xAOD::ZdcModuleAuxContainer#ZdcSumsAux.")
31 
32  acc.merge(addToESD(flags,ZDC_ItemList))
33  acc.merge(addToAOD(flags,ZDC_ItemList))
34 
35  from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
36  acc.merge(SetupMetaDataForStreamCfg(flags,streamName="AOD"))
37 
38 
39  return acc
40 
41 
42 def ZdcAnalysisToolCfg(flags, run, config="PbPb2023", DoCalib=False, DoTimeCalib=False, DoTrigEff=False):
43  acc = ComponentAccumulator()
44 
45  print('ZdcAnalysisToolCfg: setting up ZdcAnalysisTool with config='+config)
46 
47  acc.setPrivateTools(CompFactory.ZDC.ZdcAnalysisTool(
48  name = 'ZdcAnalysisTool'+config,
49  Configuration = config,
50  DoCalib = DoCalib,
51  DoTimeCalib = DoTimeCalib,
52  DoTrigEff = DoTrigEff,
53  LHCRun = run ))
54  return acc
55 
56 def ZdcLEDAnalysisToolCfg(flags, config = 'ppPbPb2023'):
57  acc = ComponentAccumulator()
58 
59  print('ZdcAnalysisToolCfg: setting up ZdcAnalysisTool with config='+config)
60  acc.setPrivateTools(CompFactory.ZDC.ZdcLEDAnalysisTool(name = 'ZdcLEDAnalysisTool'+config,
61  Configuration = config))
62  return acc
63 
64 
65 def ZdcTrigValToolCfg(flags, config = 'PbPb2023'):
66  acc = ComponentAccumulator()
67 
68  acc.merge(TrigDecisionToolCfg(flags))
69 
70  trigValTool = CompFactory.ZDC.ZdcTrigValidTool(
71  name = 'ZdcTrigValTool',
72  WriteAux = True,
73  AuxSuffix = '',
74  filepath_LUT = 'TrigT1ZDC/zdc_json_PbPb5.36TeV_2023.json') # changed on Oct 13 to accomodate Zdc 1n peak shift
75 
76  trigValTool.TrigDecisionTool = acc.getPublicTool('TrigDecisionTool')
77 
78  trigValTool.triggerList = [c for c in getL1MenuAccess(flags) if 'L1_ZDC_BIT' in c]
79 
80  acc.setPrivateTools(trigValTool)
81 
82  return acc
83 
85  acc = ComponentAccumulator()
86  acc.setPrivateTools(CompFactory.ZDC.RpdSubtractCentroidTool(name = 'RpdSubtractCentroidTool'))
87  return acc
88 
89 def ZdcRecRun2Cfg(flags):
90  acc = ComponentAccumulator()
91  config = "default"
92  doCalib = False
93  doTimeCalib = False
94  doTrigEff = False
95 
96  if flags.Input.ProjectName == "data15_hi":
97  config = "PbPb2015"
98  doCalib = True
99  doTimeCalib = True
100  doTrigEff = True
101  elif flags.Input.ProjectName == "data17_13TeV":
102  config = "PbPb2015"
103  doCalib = False
104  doTimeCalib = False
105  doTrigEff = False
106  elif flags.Input.ProjectName == "data16_hip":
107  config = "pPb2016"
108  doCalib = True
109  doTimeCalib = False
110  doTrigEff = False
111  elif flags.Input.ProjectName == "data18_hi":
112  config = "PbPb2018"
113  doCalib = True
114  doTimeCalib = False
115  doTrigEff = False
116 
117  acc.merge(ByteStreamReadCfg(flags, type_names=['xAOD::TriggerTowerContainer/ZdcTriggerTowers',
118  'xAOD::TriggerTowerAuxContainer/ZdcTriggerTowersAux.']))
119 
120  acc.addEventAlgo(CompFactory.ZdcByteStreamRawDataV2())
121  acc.addEventAlgo(CompFactory.ZdcRecV3Decode())
122 
123  anaTool = acc.popToolsAndMerge(ZdcAnalysisToolCfg(flags,2,config,doCalib,doTimeCalib,doTrigEff))
124 
125  acc.addEventAlgo(CompFactory.ZdcRecV3("ZdcRecV3",ZdcAnalysisTool=anaTool))
126 
127  return acc
128 
129 def ZdcRecRun3Cfg(flags):
130 
131  acc = ComponentAccumulator()
132  config = "PbPb2023"
133  doCalib = False
134  doTimeCalib = False
135  doTrigEff = False
136 
137  if flags.Input.ProjectName == "data22_13p6TeV":
138  config = "LHCf2022"
139  elif flags.Input.ProjectName == "data23_900GeV":
140  config = "pp2023"
141  elif flags.Input.ProjectName == "data23_comm":
142  config = "PbPb2023"
143  doCalib = True
144  elif flags.Input.ProjectName == "data23_13p6TeV":
145  config = "pp2023"
146  elif flags.Input.ProjectName == "data23_5p36TeV":
147  config = "pp2023"
148  elif flags.Input.ProjectName == "data23_hi":
149  config = "PbPb2023"
150  doCalib = True
151  doTimeCalib = True
152 
153  print('ZdcRecRun3Cfg: doCalib = '+str(doCalib)+' for project '+flags.Input.ProjectName)
154 
155  anaTool = acc.popToolsAndMerge(ZdcAnalysisToolCfg(flags,3,config,doCalib,doTimeCalib,doTrigEff))
156  centroidTool = acc.popToolsAndMerge(RpdSubtractCentroidToolCfg(flags))
157 
158  if ( flags.Input.isMC ):
159  zdcTools = [anaTool,centroidTool] # expand list as needed
160  elif ( flags.Trigger.doZDC ): # if doZDC flag is true we are in a trigger reprocessing -> no TrigValidTool
161  zdcTools = [anaTool] # expand list as needed
162  elif (flags.Common.isOnline): # running online, no trigger info
163  zdcTools = [anaTool,centroidTool] # expand list as needed
164  else: # default (not MC, not trigger repoc, not online)
165  trigTool = acc.popToolsAndMerge(ZdcTrigValToolCfg(flags,config))
166  zdcTools = [anaTool,trigTool,centroidTool] # expand list as needed
167 
168  if flags.Input.Format is Format.BS:
169  acc.addEventAlgo(CompFactory.ZdcByteStreamLucrodData())
170  acc.addEventAlgo(CompFactory.ZdcRecRun3Decode())
171  if flags.Input.isMC:
172  from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
173  acc.merge(PoolReadCfg(flags))
174 
175  zdcAlg = CompFactory.ZdcRecRun3("ZdcRecRun3",ZdcAnalysisTools=zdcTools)
176  acc.addEventAlgo(zdcAlg, primary=True)
177 
178  return acc
179 
180 def ZdcNtupleCfg(flags):
181 
182  acc = ComponentAccumulator()
183  run = flags.GeoModel.Run
184 
185  if (run == LHCPeriod.Run2):
186  print ('ZdcRecConfig.py: setting up Run 2 ntuple!')
187  acc.merge(ZdcNtupleRun2Cfg(flags))
188  elif (run == LHCPeriod.Run3):
189  print ('ZdcRecConfig.py: setting up Run 3 ntuples!')
190  acc.merge(ZdcNtupleRun3Cfg(flags))
191  else:
192  print ('ZdcRecConfig.py: setting up no ntuple!')
193 
194  return acc
195 
196 def ZdcNtupleRun2Cfg(flags):
197 
198  acc = ComponentAccumulator()
199  zdcNtuple = CompFactory.ZdcNtuple("ZdcNtuple")
200  zdcNtuple.useGRL = False
201  zdcNtuple.zdcOnly = True
202  zdcNtuple.enableTrigger = False
203  zdcNtuple.enableOutputSamples = True
204  zdcNtuple.enableOutputTree = True
205  zdcNtuple.writeOnlyTriggers = False
206  zdcNtuple.nsamplesZdc = 7
207  acc.addEventAlgo(zdcNtuple)
208  acc.addService(CompFactory.THistSvc(Output = ["ANALYSIS DATAFILE='zdctree.root' OPT='RECREATE'"]))
209  acc.setAppProperty("HistogramPersistency","ROOT")
210  return acc
211 
212 def ZdcNtupleRun3Cfg(flags):
213 
214  acc = ComponentAccumulator()
215  zdcNtuple = CompFactory.ZdcNtuple("ZdcNtuple")
216  zdcNtuple.useGRL = False
217  zdcNtuple.zdcOnly = True
218  zdcNtuple.lhcf2022 = False
219  zdcNtuple.lhcf2022zdc = False
220  zdcNtuple.lhcf2022afp = False
221  zdcNtuple.enableTrigger = False if flags.Input.isMC else True
222  zdcNtuple.enableOutputSamples = True
223  zdcNtuple.enableOutputTree = True
224  zdcNtuple.writeOnlyTriggers = False
225  zdcNtuple.enableRPD = True
226  zdcNtuple.enableCentroid = True
227  zdcNtuple.reprocZdc = False
228  acc.addEventAlgo(zdcNtuple)
229  acc.addService(CompFactory.THistSvc(Output = ["ANALYSIS DATAFILE='NTUP.root' OPT='RECREATE'"]))
230  #acc.setAppProperty("HistogramPersistency","ROOT")
231  return acc
232 
233 def ZdcLEDRecCfg(flags):
234 
235  acc = ComponentAccumulator()
236 
237  if flags.Input.Format is Format.BS:
238  run = flags.GeoModel.Run
239 
240  # debugging message since the metadata isn't working for calibration files yet
241  print ("ZdcRecConfig.py: run = "+run.name)
242 
243  config = 'ppPbPb2023'
244  #config = 'ppALFA2023'
245 
246  acc.addEventAlgo(CompFactory.ZdcByteStreamLucrodData())
247  acc.addEventAlgo(CompFactory.ZdcRecRun3Decode())
248 
249  anaTool = acc.popToolsAndMerge(ZdcLEDAnalysisToolCfg(flags, config)) #anatool for zdcLED calibration
250 
251  zdcTools = []
252  zdcTools += [anaTool] # add trigTool after deocration migration
253 
254  # FIXME these are dependent on !65768
255  zdcAlg = CompFactory.ZdcRecRun3("ZdcRecRun3",DAQMode=2, ForcedEventType=2, ZdcAnalysisTools=zdcTools) # DAQMode set to PhysicsPEB, event type set to ZdcEventLED
256  acc.addEventAlgo(zdcAlg, primary=True)
257 
258  zdcLEDNtuple = CompFactory.ZdcLEDNtuple("ZdcLEDNtuple")
259  zdcLEDNtuple.enableOutputTree = True
260  acc.addEventAlgo(zdcLEDNtuple)
261  acc.addService(CompFactory.THistSvc(Output = ["ANALYSIS DATAFILE='NTUP.root' OPT='RECREATE'"]))
262 
263  if flags.Output.doWriteESD or flags.Output.doWriteAOD:
264  acc.merge(ZdcRecOutputCfg(flags))
265 
266  return acc
267 
268 def ZdcLEDTrigCfg(flags):
269 
270  acc = ComponentAccumulator()
271 
272  # suggested by Tim Martin
273  tdmv = CompFactory.TrigDec.TrigDecisionMakerValidator()
274  tdmv.errorOnFailure = True
275  tdmv.TrigDecisionTool = acc.getPrimaryAndMerge(TrigDecisionToolCfg(flags))
276  tdmv.NavigationKey = getRun3NavigationContainerFromInput(flags)
277  acc.addEventAlgo( tdmv )
278  # end of Tim's suggestions
279  return acc
280 
281 def ZdcRecCfg(flags):
282  """Configure Zdc analysis alg
283  Additional arguments are useful in calibration runs
284  """
285 
286  acc = ComponentAccumulator()
287 
288  run = flags.GeoModel.Run
289 
290  # debugging message since the metadata isn't working for calibration files yet
291  print ("ZdcRecConfig.py: run = "+run.name)
292 
293  if (run == LHCPeriod.Run2):
294  print ('ZdcRecConfig.py: setting up Run 2!')
295  acc.merge(ZdcRecRun2Cfg(flags))
296  elif (run == LHCPeriod.Run3):
297  print ('ZdcRecConfig.py: setting up Run 3!')
298  acc.merge(ZdcRecRun3Cfg(flags))
299  else:
300  print ('ZdcRecConfig.py: setting up nothing (problem)!')
301 
302  if flags.Output.doWriteESD or flags.Output.doWriteAOD:
303  acc.merge(ZdcRecOutputCfg(flags))
304 
305  return acc
306 
307 if __name__ == '__main__':
308 
309  """ This is selftest & ZDC calibration transform at the same time"""
310  from AthenaConfiguration.AllConfigFlags import initConfigFlags
311  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
312  from AthenaConfiguration.TestDefaults import defaultGeometryTags
313 
314  flags = initConfigFlags()
315 
316  flags.Scheduler.CheckDependencies = True
317  flags.Scheduler.ShowDataDeps = True
318  flags.Scheduler.ShowDataFlow = True
319  flags.Scheduler.ShowControlFlow = True
320  flags.Scheduler.EnableVerboseViews = True
321 
322  flags.Detector.GeometryZDC=True
323  flags.Detector.GeometryAFP=False
324  flags.Detector.GeometryALFA=False
325  flags.Detector.GeometryLucid=False
326  flags.Detector.GeometryMDT=False
327  flags.Detector.GeometryMM=False
328  flags.Detector.GeometryMuon=False
329  flags.Trigger.decodeHLT=False
330  flags.Trigger.enableL1MuonPhase1=False
331  flags.Trigger.L1.doMuon=False
332  flags.Trigger.L1.doCalo=False
333  flags.Trigger.L1.doTopo=False
334  #flags.Reco.EnableTrigger = False
335 
336  # This does not work in this context
337  # run = flags.GeoModel.Run
338  # The EDM Version should be auto configured, but is not working at the moment, so is set by hand
339 
340  flags.Output.AODFileName="AOD.pool.root"
341  flags.Output.HISTFileName="HIST.root"
342  flags.Output.doWriteAOD=True
343 
344  flags.fillFromArgs()
345 
346  # check for LED running, and configure appropriately
347 
348  isLED = (flags.Input.TriggerStream == "calibration_ZDCLEDCalib")
349  isCalib = (flags.Input.TriggerStream == "calibration_ZDCCalib" or flags.Input.TriggerStream == "physics_MinBias" or flags.Input.TriggerStream == "express_express" )
350 
351  if (isLED):
352  print('ZdcRecConfig: Running LED data!')
353  if (isCalib):
354  print('ZdcRecConfig: Running ZDC calibration data!')
355 
356  # supply missing metadata based on project name
357  pn = flags.Input.ProjectName
358  if not pn:
359  raise ValueError('Unknown project name')
360 
361 
362  if not isLED:
363  year = int(pn.split('_')[0].split('data')[1])
364  if (year < 20):
365  flags.Trigger.EDMVersion=2
366  flags.GeoModel.Run = LHCPeriod.Run2
367  elif (year > 20):
368  flags.Trigger.EDMVersion=3
369  flags.GeoModel.Run = LHCPeriod.Run3
370  flags.GeoModel.AtlasVersion=defaultGeometryTags.RUN3
371  else:
372  flags.Trigger.EDMVersion=3
373  flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
374  flags.GeoModel.Run = LHCPeriod.Run3
375 
376  if (flags.Input.isMC):
377  print('ZdcRecConfig: Overriding MC run to be Run 3!')
378  flags.GeoModel.Run = LHCPeriod.Run3
379 
380  flags.lock()
381 
382  acc=MainServicesCfg(flags)
383 
384  from AtlasGeoModel.ForDetGeoModelConfig import ForDetGeometryCfg
385  acc.merge(ForDetGeometryCfg(flags))
386 
387  if not flags.Input.isMC:
388  from TriggerJobOpts.TriggerRecoConfig import TriggerRecoCfgData
389  acc.merge(TriggerRecoCfgData(flags))
390 
391  if isLED:
392  #acc.merge(ZdcLEDTrigCfg(flags))
393  acc.merge(ZdcLEDRecCfg(flags))
394  else:
395  acc.merge(ZdcRecCfg(flags))
396 
397 
398  if not flags.Input.isMC:
399  if (isLED):
400  from ZdcMonitoring.ZdcLEDMonitorAlgorithm import ZdcLEDMonitoringConfig
401  acc.merge(ZdcLEDMonitoringConfig(flags,'PbPb2023'))
402  else:
403  from ZdcMonitoring.ZdcMonitorAlgorithm import ZdcMonitoringConfig
404  acc.merge(ZdcMonitoringConfig(flags,'PbPb2023'))
405  if (isCalib): # don't configure ntuple for typical reco jobs
406  acc.merge(ZdcNtupleCfg(flags))
407 
408  acc.printConfig(withDetails=True)
409 
410  with open("config.pkl", "wb") as f:
411  acc.store(f)
412  status = acc.run()
413  if status.isFailure():
414  import sys
415  sys.exit(-1)
416 
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
python.ZdcRecConfig.ZdcRecRun2Cfg
def ZdcRecRun2Cfg(flags)
Definition: ZdcRecConfig.py:89
ZdcLEDMonitorAlgorithm.ZdcLEDMonitoringConfig
def ZdcLEDMonitoringConfig(inputFlags, run_type)
Definition: ZdcLEDMonitorAlgorithm.py:14
python.ZdcRecConfig.RpdSubtractCentroidToolCfg
def RpdSubtractCentroidToolCfg(flags)
Definition: ZdcRecConfig.py:84
python.ForDetGeoModelConfig.ForDetGeometryCfg
def ForDetGeometryCfg(flags)
Definition: ForDetGeoModelConfig.py:33
python.ZdcRecConfig.ZdcLEDAnalysisToolCfg
def ZdcLEDAnalysisToolCfg(flags, config='ppPbPb2023')
Definition: ZdcRecConfig.py:56
python.ZdcRecConfig.ZdcTrigValToolCfg
def ZdcTrigValToolCfg(flags, config='PbPb2023')
Definition: ZdcRecConfig.py:65
python.TriggerRecoConfig.TriggerRecoCfgData
def TriggerRecoCfgData(flags)
Definition: TriggerRecoConfig.py:23
python.ByteStreamConfig.ByteStreamReadCfg
def ByteStreamReadCfg(flags, type_names=None)
Definition: Event/ByteStreamCnvSvc/python/ByteStreamConfig.py:25
python.ZdcRecConfig.ZdcRecCfg
def ZdcRecCfg(flags)
Definition: ZdcRecConfig.py:281
python.ZdcRecConfig.ZdcNtupleRun3Cfg
def ZdcNtupleRun3Cfg(flags)
Definition: ZdcRecConfig.py:212
python.ZdcRecConfig.ZdcRecRun3Cfg
def ZdcRecRun3Cfg(flags)
Definition: ZdcRecConfig.py:129
python.TriggerConfigAccess.getL1MenuAccess
L1MenuAccess getL1MenuAccess(flags=None)
Definition: TriggerConfigAccess.py:129
python.TrigDecisionToolConfig.getRun3NavigationContainerFromInput
def getRun3NavigationContainerFromInput(flags)
Definition: TrigDecisionToolConfig.py:75
python.ZdcRecConfig.ZdcLEDRecCfg
def ZdcLEDRecCfg(flags)
Definition: ZdcRecConfig.py:233
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:252
python.OutputStreamConfig.addToESD
def addToESD(flags, itemOrList, **kwargs)
Definition: OutputStreamConfig.py:127
python.ZdcRecConfig.ZdcNtupleRun2Cfg
def ZdcNtupleRun2Cfg(flags)
Definition: ZdcRecConfig.py:196
python.TriggerInterface.TrigDecisionToolCfg
def TrigDecisionToolCfg(flags)
Definition: TriggerInterface.py:14
Trk::open
@ open
Definition: BinningType.h:40
ZdcMonitorAlgorithm.ZdcMonitoringConfig
def ZdcMonitoringConfig(inputFlags, run_type)
Definition: ZdcMonitorAlgorithm.py:28
python.ZdcRecConfig.ZdcAnalysisToolCfg
def ZdcAnalysisToolCfg(flags, run, config="PbPb2023", DoCalib=False, DoTimeCalib=False, DoTrigEff=False)
Definition: ZdcRecConfig.py:42
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
python.OutputStreamConfig.addToAOD
def addToAOD(flags, itemOrList, **kwargs)
Definition: OutputStreamConfig.py:142
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
python.ZdcRecConfig.ZdcRecOutputCfg
def ZdcRecOutputCfg(flags)
Definition: ZdcRecConfig.py:21
str
Definition: BTagTrackIpAccessor.cxx:11
python.ZdcRecConfig.ZdcLEDTrigCfg
def ZdcLEDTrigCfg(flags)
Definition: ZdcRecConfig.py:268
InfileMetaDataConfig.SetupMetaDataForStreamCfg
def SetupMetaDataForStreamCfg(flags, streamName="", AcceptAlgs=None, createMetadata=None, propagateMetadataFromInput=True, *args, **kwargs)
Definition: InfileMetaDataConfig.py:216
python.PoolReadConfig.PoolReadCfg
def PoolReadCfg(flags)
Definition: PoolReadConfig.py:69
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
python.ZdcRecConfig.ZdcNtupleCfg
def ZdcNtupleCfg(flags)
Definition: ZdcRecConfig.py:180