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())