6 from AthenaConfiguration.ComponentFactory
import CompFactory
7 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
8 from AthenaConfiguration.Enums
import Format
9 from AthenaConfiguration.Enums
import LHCPeriod
11 from OutputStreamAthenaPool.OutputStreamConfig
import addToAOD
12 from OutputStreamAthenaPool.OutputStreamConfig
import addToESD
14 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamReadCfg
16 from ZdcNtuple.ZdcNtupleConfig
import ZdcNtupleCfg
19 from TrigConfigSvc.TriggerConfigAccess
import getL1MenuAccess
21 from TrigDecisionTool.TrigDecisionToolConfig
import TrigDecisionToolCfg, getRun3NavigationContainerFromInput
22 from AthenaConfiguration.TestDefaults
import defaultGeometryTags, defaultConditionsTags
24 from AthenaCommon.Logging
import logging
25 log = logging.getLogger(
"ZdcRecConfig")
30 projName = flags.Input.ProjectName
33 return defaultGeometryTags.RUN2_ZDC
35 return defaultGeometryTags.RUN2_ZDC
37 return defaultGeometryTags.RUN2_ZDC
39 return defaultGeometryTags.RUN2_ZDC
41 return defaultGeometryTags.RUN3_ZDC23
43 return defaultGeometryTags.RUN3_ZDC24
45 return defaultGeometryTags.RUN3_ZDC24
47 return defaultGeometryTags.RUN3_ZDC24
49 return defaultGeometryTags.RUN3_ZDC24
50 case
"data25_hipcomm":
51 return defaultGeometryTags.RUN3_ZDC24
53 return defaultGeometryTags.RUN3_ZDC24
55 run = flags.GeoModel.Run
56 if run == LHCPeriod.Run2:
57 return defaultGeometryTags.RUN2_ZDC
58 if run == LHCPeriod.Run3:
59 return defaultGeometryTags.RUN3_ZDC24
64 zdcConfigMap[
'data15_hi'] = {}
65 zdcConfigMap[
'data16_hip'] = {}
66 zdcConfigMap[
'data17_13TeV'] = {}
67 zdcConfigMap[
'data18_hi'] = {}
68 zdcConfigMap[
'data22_13p6TeV'] = {}
69 zdcConfigMap[
'data23_5p36TeV'] = {}
70 zdcConfigMap[
'data23_13p6TeV'] = {}
71 zdcConfigMap[
'data23_hi'] = {}
72 zdcConfigMap[
'data23_comm'] = {}
73 zdcConfigMap[
'data23_5p36TeV'] = {}
74 zdcConfigMap[
'data24_900GeV'] = {}
76 zdcConfigMap[
'data24_13p6TeV'] = {}
77 zdcConfigMap[
'data24_13p6TeV'][
'default'] =
'pp2024'
79 zdcConfigMap[
'data24_refcomm'] = {}
80 zdcConfigMap[
'data24_refcomm'][
'default'] =
'pp2024'
81 zdcConfigMap[
'data24_refcomm'][
'calibration_ZdcInjCalib'] =
'Injectorpp2024'
83 zdcConfigMap[
'data24_hicomm'] = {}
84 zdcConfigMap[
'data24_hicomm'][
'default'] =
'PbPb2024'
85 zdcConfigMap[
'data24_hicomm'][
'calibration_ZdcInjCalib'] =
'InjectorPbPb2024'
87 zdcConfigMap[
'data24_hi'] = {}
88 zdcConfigMap[
'data24_hi'][
'default']=
"PbPb2024"
89 zdcConfigMap[
'data24_hi'][
'calibration_ZdcInjCalib']=
"InjectorPbPb2024"
94 if flags.Input.ProjectName ==
"data25_comm" and flags.Input.TriggerStream ==
"calibration_ZDCCalib":
95 config =
"InjectorpOOONeNe2025"
97 elif flags.Input.TriggerStream ==
"calibration_ZDCInjCalib" or flags.Input.TriggerStream ==
"calibration_DcmDummyProcessor":
98 config =
"InjectorpOOONeNe2025"
99 if flags.Input.ProjectName ==
"data24_5p36TeV" or flags.Input.ProjectName ==
"data24_900GeV" or flags.Input.ProjectName ==
"data24_13p6TeV" or flags.Input.ProjectName ==
"data24_refcomm":
100 config =
"Injectorpp2024"
101 if flags.Input.ProjectName
in [
"data24_hi",
"data24_hicomm"]:
102 config =
"InjectorPbPb2024"
103 if flags.Input.ProjectName
in [
"data25_hi",
"data25_hicomm",
"data25_hip"] :
104 config =
"InjectorpOOONeNe2025"
109 run = flags.GeoModel.Run
110 if run == LHCPeriod.Run3:
112 config =
"MonteCarloPbPb2023"
113 elif flags.Input.ProjectName ==
"data22_13p6TeV":
115 elif flags.Input.ProjectName
in [
"data23_5p36TeV",
"data23_900GeV",
"data23_13p6TeV"]:
117 elif flags.Input.ProjectName
in [
"data23_hi",
"data23_comm"]:
119 elif flags.Input.ProjectName
in [
"data24_5p36TeV",
"data24_900GeV",
"data24_13p6TeV",
"data24_refcomm"]:
121 elif flags.Input.ProjectName
in [
"data24_hi",
"data24_hicomm"]:
123 elif flags.Input.ProjectName
in [
"data25_hipcomm"]:
125 elif flags.Input.ProjectName
in [
"data25_hip"]:
127 elif flags.Input.ProjectName
in [
"data25_hi",
"data25_hicomm"]:
128 config =
"OONeNe2025"
129 elif run == LHCPeriod.Run2:
130 if flags.Input.ProjectName ==
"data15_hi":
132 elif flags.Input.ProjectName ==
"data17_13TeV":
134 elif flags.Input.ProjectName ==
"data16_hip":
136 elif flags.Input.ProjectName ==
"data18_hi":
143 '''set generic flags needed for ZDC reconstruction that are independent of stream type
144 Also fills flags from input arguments'''
146 flags.Scheduler.CheckDependencies =
True
147 flags.Scheduler.ShowDataDeps =
True
148 flags.Scheduler.ShowDataFlow =
True
149 flags.Scheduler.ShowControlFlow =
True
150 flags.Scheduler.EnableVerboseViews =
True
152 flags.Detector.GeometryZDC=
True
153 flags.Detector.GeometryAFP=
False
154 flags.Detector.GeometryALFA=
False
155 flags.Detector.GeometryLucid=
False
156 flags.Detector.GeometryMDT=
False
157 flags.Detector.GeometryMM=
False
158 flags.Detector.GeometryMuon=
False
160 flags.Trigger.decodeHLT=
False
161 flags.Trigger.enableL1MuonPhase1=
False
162 flags.Trigger.L1.doMuon=
False
163 flags.Trigger.L1.doCalo=
False
164 flags.Trigger.L1.doTopo=
False
170 parser = flags.getArgumentParser()
171 parser.add_argument(
'--runInjForStandaloneData',default=
"Inj",help=
"indicate if we run inj/LED reconstruction for standalone data: inj (default) --> run injected-pulse reconstruction for injector-pulse events; LED --> run LED reconstruction for LED events")
172 flags.fillFromArgs(parser=parser)
176 '''Function that checks on data type from triggerstream tag
177 and sets run-type-and-year-dependent settings
178 Returns: a tuple of the following four values
179 isLED - bool, true if running on LED data
180 isInj - bool, true if running on Inj data
181 isCalib - bool, true if running on Calib data
182 pn - string, project name such as data24_hi
185 isComm = (flags.Input.ProjectName ==
"data25_comm" and flags.Input.TriggerStream ==
"calibration_ZDCCalib")
186 isLED = (flags.Input.TriggerStream ==
"calibration_ZDCLEDCalib")
187 isInj = (flags.Input.TriggerStream ==
"calibration_ZDCInjCalib" or isComm)
188 isCalib = (flags.Input.TriggerStream ==
"calibration_ZDCCalib" or "physics_" in flags.Input.TriggerStream
or flags.Input.TriggerStream ==
"express_express" and not isComm)
190 if flags.Input.TriggerStream ==
"calibration_DcmDummyProcessor":
191 runInjForStandaloneDataArgValid =
False
193 if flags.hasFlag(
"runInjForStandaloneData"):
194 if flags.runInjForStandaloneData.lower() ==
"inj":
196 runInjForStandaloneDataArgValid =
True
197 elif flags.runInjForStandaloneData.lower() ==
"led":
199 runInjForStandaloneDataArgValid =
True
201 if not runInjForStandaloneDataArgValid:
202 log.warning(
"runInjForStandaloneData is either not a defined flag or has invalid value (value must be Inj / LED, case insensitive).")
203 log.warning(
"Running nominal reconstruction (injector-pulse) by default for standalone data")
204 log.warning(
"Could lead to undesired behavior if pulsing LED in standalone mode")
208 log.info(
'ZdcRecConfig: Running LED data!')
210 log.info(
'ZdcRecConfig: Running Injected pulse data!')
212 log.info(
'ZdcRecConfig: Running ZDC calibration data!')
214 log.info(
'ZdcRecConfig: Running over MC Samples')
215 flags.Input.ProjectName =
"data23_hi"
216 flags.Reco.EnableTrigger =
False
219 pn = flags.Input.ProjectName
221 raise ValueError(
'Unknown project name')
223 if isLED
or isInj
or pn ==
'data_test':
224 flags.Trigger.EDMVersion=3
225 flags.GeoModel.Run = LHCPeriod.Run3
226 flags.IOVDb.GlobalTag=defaultConditionsTags.RUN3_DATA
228 year =
int(pn.split(
'_')[0].
split(
'data')[1])
230 flags.Trigger.EDMVersion=2
231 flags.GeoModel.Run = LHCPeriod.Run2
232 flags.IOVDb.GlobalTag=defaultConditionsTags.RUN2_DATA
234 flags.Trigger.EDMVersion=3
235 flags.GeoModel.Run = LHCPeriod.Run3
236 flags.IOVDb.GlobalTag=defaultConditionsTags.RUN3_DATA
239 log.info(
'ZdcRecConfig: Overriding MC run to be Run 3!')
240 flags.GeoModel.Run = LHCPeriod.Run3
243 or flags.Input.TriggerStream ==
"calibration_DcmDummyProcessor"
244 or pn ==
"data22_13p6TeV"):
245 flags.Detector.EnableZDC_RPD =
False
247 if flags.Input.TriggerStream ==
"calibration_DcmDummyProcessor":
248 flags.DQ.useTrigger =
False
249 flags.DQ.triggerDataAvailable =
False
253 return isLED, isInj, isCalib, pn
261 if flags.Input.Format
is Format.BS:
262 ZDC_ItemList.append(
"xAOD::ZdcModuleContainer#ZdcModules")
263 ZDC_ItemList.append(
"xAOD::ZdcModuleAuxContainer#ZdcModulesAux.")
264 ZDC_ItemList.append(
"xAOD::ZdcModuleContainer#ZdcSums")
265 ZDC_ItemList.append(
"xAOD::ZdcModuleAuxContainer#ZdcSumsAux.")
267 acc.merge(
addToESD(flags,ZDC_ItemList))
268 acc.merge(
addToAOD(flags,ZDC_ItemList))
270 if flags.Output.doWriteAOD:
271 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
277 def ZdcAnalysisToolCfg(flags, run, config="PbPb2023", DoCalib=False, DoFADCCorr=False, DoNonLinCorr=False, DoTimeCalib=False, DoTrigEff=False, ForceCalibRun=-1, ForceCalibLB=814, AuxSuffix=""):
280 log.info(
'ZdcAnalysisToolCfg: setting up ZdcAnalysisTool with config='+config)
282 acc.setPrivateTools(CompFactory.ZDC.ZdcAnalysisTool(
283 name =
'ZdcAnalysisTool'+config,
284 Configuration = config,
286 DoFADCCorr = DoFADCCorr,
287 DoNonLinCorr = DoNonLinCorr,
288 DoTimeCalib = DoTimeCalib,
289 DoTrigEff = DoTrigEff,
290 ForceCalibRun = ForceCalibRun,
291 ForceCalibLB = ForceCalibLB,
292 AuxSuffix = AuxSuffix,
299 log.info(
'ZdcAnalysisToolCfg: setting up ZdcAnalysisTool with config='+config)
300 acc.setPrivateTools(CompFactory.ZDC.ZdcLEDAnalysisTool(name =
'ZdcLEDAnalysisTool'+config,
301 Configuration = config,
302 DoFADCCorr = DoFADCCorr))
311 trigValTool = CompFactory.ZDC.ZdcTrigValidTool(
312 name =
'ZdcTrigValTool',
315 filepath_LUT =
'TrigT1ZDC/zdc_json_PbPb5.36TeV_2023.json')
317 trigValTool.TrigDecisionTool = acc.getPublicTool(
'TrigDecisionTool')
319 trigValTool.triggerList = [c
for c
in getL1MenuAccess(flags)
if 'L1_ZDC_BIT' in c]
321 acc.setPrivateTools(trigValTool)
328 CompFactory.ZDC.RPDAnalysisTool(
329 name=
"RPDAnalysisTool",
330 Configuration=config,
331 AuxSuffix = AuxSuffix
339 CompFactory.ZDC.RpdSubtractCentroidTool(
340 name=
"RpdSubtractCentroidTool",
341 Configuration=config,
342 AuxSuffix = AuxSuffix
350 log.info (
'ZdcRecConfig.py: Running with config tag%s', config)
358 if flags.Input.ProjectName ==
"data15_hi":
362 elif flags.Input.ProjectName ==
"data17_13TeV":
366 elif flags.Input.ProjectName ==
"data16_hip":
370 elif flags.Input.ProjectName ==
"data18_hi":
375 acc.merge(
ByteStreamReadCfg(flags, type_names=[
'xAOD::TriggerTowerContainer/ZdcTriggerTowers',
376 'xAOD::TriggerTowerAuxContainer/ZdcTriggerTowersAux.']))
378 acc.addEventAlgo(CompFactory.ZdcByteStreamRawDataV2())
379 acc.addEventAlgo(CompFactory.ZdcRecV3Decode())
381 anaTool = acc.popToolsAndMerge(
ZdcAnalysisToolCfg(flags,2,config,doCalib,doFADCCorr,doNonLinCorr,doTimeCalib,doTrigEff))
383 acc.addEventAlgo(CompFactory.ZdcRecV3(
"ZdcRecV3",ZdcAnalysisTool=anaTool))
391 log.info (
'ZdcRecConfig.py: Running with config tag %s', config)
402 if flags.Input.TriggerStream !=
"calibration_ZDCInjCalib" and flags.Input.TriggerStream !=
"calibration_DcmDummyProcessor":
403 if flags.Common.isOnline:
406 if flags.Input.ProjectName ==
"data24_5p36TeV" or flags.Input.ProjectName ==
"data24_refcomm":
407 ForceCalibRun = 488239
409 elif flags.Input.ProjectName ==
"data24_hi" or flags.Input.ProjectName ==
"data24_hicomm":
410 ForceCalibRun = 488980
415 elif flags.Input.ProjectName ==
"data23_comm":
417 elif flags.Input.ProjectName ==
"data23_hi":
420 elif flags.Input.ProjectName ==
"data24_hi":
425 elif flags.Input.ProjectName
in [
"data25_hip",
"data25_hipcomm"]:
430 elif flags.Input.ProjectName
in [
"data25_hi",
"data25_hicomm"]:
440 doRPD = flags.Detector.EnableZDC_RPD
442 log.info(
'ZdcRecRun3Cfg: doCalib = '+
str(doCalib)+
' for project '+flags.Input.ProjectName)
443 log.info(
'RPD enable flag is '+
str(doRPD))
446 if "ZdcModules" in flags.Input.Collections:
447 log.info(
'ZdcRecConfig.py: found ZdcModules in input, reprocessing mode set')
451 anaTool = acc.popToolsAndMerge(
ZdcAnalysisToolCfg(flags,3,config,doCalib,doFADCCorr,doNonLinCorr,doTimeCalib,doTrigEff,ForceCalibRun,ForceCalibLB, AuxSuffix))
458 if flags.Input.isMC :
461 zdcTools += [rpdAnaTool,centroidTool]
462 elif flags.Trigger.doZDC :
464 elif flags.Input.TriggerStream ==
"calibration_ZDCInjCalib" or flags.Input.TriggerStream ==
"calibration_DcmDummyProcessor":
466 elif flags.Common.isOnline:
469 zdcTools += [rpdAnaTool,centroidTool]
473 zdcTools += [rpdAnaTool,centroidTool]
476 zdcTools = [anaTool,trigTool]
478 zdcTools += [rpdAnaTool,centroidTool]
480 if flags.Input.Format
is Format.BS:
481 acc.addEventAlgo(CompFactory.ZdcByteStreamLucrodData())
482 acc.addEventAlgo(CompFactory.ZdcRecRun3Decode())
484 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
486 acc.addEventAlgo(CompFactory.ZdcMCTruthAlg())
488 zdcAlg = CompFactory.ZdcRecRun3(
"ZdcRecRun3",ZdcAnalysisTools=zdcTools)
489 acc.addEventAlgo(zdcAlg, primary=
True)
496 run = flags.GeoModel.Run
498 if run == LHCPeriod.Run2:
499 log.info (
'ZdcRecConfig.py: setting up Run 2 ntuple!')
501 elif run == LHCPeriod.Run3:
502 log.info (
'ZdcRecConfig.py: setting up Run 3 ntuples!')
505 log.info (
'ZdcRecConfig.py: setting up no ntuple!')
515 enableTrigger =
False,
516 enableOutputSamples =
True,
517 enableOutputTree =
True,
518 writeOnlyTriggers =
False,
522 acc.addService(CompFactory.THistSvc(Output = [
"ANALYSIS DATAFILE='zdctree.root' OPT='RECREATE'"]))
534 isMC = flags.Input.isMC,
535 enableTrigger =
not flags.Input.isMC,
536 enableOutputSamples =
True,
537 enableOutputTree =
True,
538 writeOnlyTriggers =
False,
539 enableRPD = flags.Detector.EnableZDC_RPD,
540 enableCentroid = flags.Detector.EnableZDC_RPD,
544 acc.addService(CompFactory.THistSvc(Output = [
"ANALYSIS DATAFILE='NTUP.root' OPT='RECREATE'"]))
558 enableTrigger =
False,
559 enableOutputSamples =
True,
560 enableOutputTree =
True,
561 writeOnlyTriggers =
False,
563 enableCentroid =
False,
567 acc.addService(CompFactory.THistSvc(Output = [
"ANALYSIS DATAFILE='NTUP.root' OPT='RECREATE'"]))
573 zdcLEDNtuple = CompFactory.ZdcLEDNtuple(
"ZdcLEDNtuple")
574 zdcLEDNtuple.enableOutputTree =
True
575 acc.addEventAlgo(zdcLEDNtuple)
576 acc.addService(CompFactory.THistSvc(Output = [
"ANALYSIS DATAFILE='NTUP.root' OPT='RECREATE'"]))
583 if flags.Input.Format
is Format.BS:
584 run = flags.GeoModel.Run
587 log.info (
"ZdcRecConfig.py: run = "+run.name)
589 config =
'ppPbPb2023'
593 if (flags.GeoModel.Run == LHCPeriod.Run3):
596 acc.addEventAlgo(CompFactory.ZdcByteStreamLucrodData())
597 acc.addEventAlgo(CompFactory.ZdcRecRun3Decode())
602 zdcTools += [anaTool]
605 zdcAlg = CompFactory.ZdcRecRun3(
"ZdcRecRun3",DAQMode=2, ForcedEventType=2, ZdcAnalysisTools=zdcTools)
606 acc.addEventAlgo(zdcAlg, primary=
True)
608 if flags.Output.doWriteESD
or flags.Output.doWriteAOD:
618 tdmv = CompFactory.TrigDec.TrigDecisionMakerValidator()
619 tdmv.errorOnFailure =
True
622 acc.addEventAlgo( tdmv )
627 """Configure Zdc analysis alg
628 Additional arguments are useful in calibration runs
633 run = flags.GeoModel.Run
636 log.info (
"ZdcRecConfig.py: run = "+run.name)
638 if run == LHCPeriod.Run2:
639 log.info (
'ZdcRecConfig.py: setting up Run 2!')
641 elif run == LHCPeriod.Run3:
642 log.info (
'ZdcRecConfig.py: setting up Run 3!')
645 log.warning (
'ZdcRecConfig.py: setting up nothing (problem)!')
647 if flags.Output.doWriteESD
or flags.Output.doWriteAOD:
653 if __name__ ==
'__main__':
655 """ This is selftest & ZDC calibration transform at the same time"""
661 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
662 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
668 flags.Output.AODFileName=
"AOD.pool.root"
669 flags.Output.HISTFileName=
"HIST.root"
670 flags.Output.doWriteAOD=
True
679 from AtlasGeoModel.ForDetGeoModelConfig
import ForDetGeometryCfg
682 if not flags.Input.isMC
and pn !=
'data_test':
683 from TriggerJobOpts.TriggerRecoConfig
import TriggerRecoCfgData
693 if not flags.Input.isMC:
695 from ZdcMonitoring.ZdcLEDMonitorAlgorithm
import ZdcLEDMonitoringConfig
700 from ZdcMonitoring.ZdcMonitorAlgorithm
import ZdcMonitoringConfig
702 acc.merge(zdcMonitorAcc)
703 if flags.Input.TriggerStream !=
"calibration_DcmDummyProcessor":
706 from ZdcMonitoring.ZdcMonitorAlgorithm
import ZdcMonitoringConfig
708 acc.merge(zdcMonitorAcc)
714 acc.printConfig(withDetails=
True)
717 with open(
"config.pkl",
"wb")
as f:
721 sys.exit(status.isFailure())