10
11 from AthenaConfiguration.AllConfigFlags import initConfigFlags
12 from AthenaConfiguration.TestDefaults import defaultTestFiles
13 from AthenaCommon.Logging import log
14
15 flags = initConfigFlags()
16
17 parser = flags.getArgumentParser(description='Run Tile TB digitization.')
18 parser.add_argument('--preExec', help='Code to execute before locking configs')
19 parser.add_argument('--postExec', help='Code to execute after setup')
20
21 parser.add_argument('--run-number', default=None, help='Override run number for conditions')
22 parser.add_argument('--conditions-tag', default=None, help='Override conditions tag')
23 parser.add_argument('--layout', default='5B', choices=['2B1EB', '2B2EB', '3B', '5B'], help='Tile TB layout')
24 parser.add_argument('--no-calo-noise', action='store_true', help='Switch off Calo noise')
25 parser.add_argument('--aant-ntuple', action='store_true', help='Produce output Tile (TB) AANT ntuple (h1000/h2000)')
26 parser.add_argument('--hits-ntuple', action='store_true', help='Produce output ntuple with Tile hits')
27 parser.add_argument('--digits-ntuple', action='store_true', help='Produce output ntuple with Tile digits')
28 parser.add_argument('--channels-ntuple', action='store_true', help='Produce output ntuple with Tile raw channels')
29 parser.add_argument('--d3pd', action='store_true', help='Produce output Tile D3PD file')
30 parser.add_argument('--hits-d3pd', action='store_true', help='Save Tile hits into D3PD')
31 parser.add_argument('--hits-info-d3pd', action='store_true', help='Save Tile hits info into D3PD')
32 parser.add_argument('--digits-d3pd', action='store_true', help='Save Tile digits into D3PD')
33 parser.add_argument('--channels-d3pd', action='store_true', help='Save Tile raw channels into D3PD')
34 parser.add_argument('--cells-d3pd', action='store_true', help='Save Tile cells into D3PD')
35 parser.add_argument('--cells-info-d3pd', action='store_true', help='Save Tile cells into D3PD')
36 parser.add_argument('--mbts-d3pd', action='store_true', help='Save Tile MBTS into D3PD')
37 parser.add_argument('--rdo', action='store_true', help='Produce output Tile RDO file')
38 parser.add_argument('--file-prefix', default=None, help='Prefix to be used in names of output files')
39 parser.add_argument('--sfr-tag', default=None, help='Override Tile sampling fraction tag')
40 parser.add_argument('--testbeam', action='store_true', help='Digitize Test beam simulation')
41 parser.add_argument('--trigger', action='store_true', help='Simulate Tile trigger output')
42 parser.add_argument('--alldigits-rdo', action='store_true', help='Save all Tile digits into RDO')
43
44 args, _ = parser.parse_known_args()
45
46 flags.Input.Files = defaultTestFiles.HITS_RUN3
47 flags.Exec.MaxEvents = 3
48
49 flags.Tile.RunType = TileRunType.PHY
50 flags.Tile.doFit = True
51 flags.Tile.doOpt2 = True
52
53 if args.testbeam:
54 flags.Beam.Type = BeamType.TestBeam
55 flags.TestBeam.Layout = f'tb_Tile2000_2003_{args.layout}'
56
57 flags.Common.ProductionStep = ProductionStep.Digitization
58 flags.Digitization.PileUp = False
59 flags.Digitization.DoCaloNoise = not args.no_calo_noise
60
61 if args.run_number:
62 flags.Input.OverrideRunNumber = True
63 flags.Input.ConditionsRunNumber = args.run_number
64
65 if args.conditions_tag:
66 flags.IOVDb.GlobalTag = args.conditions_tag
67
68
69 flags.fillFromArgs(parser=parser)
70
71 filePrefix = ""
72 if args.file_prefix:
73 filePrefix = args.file_prefix
74 else:
75 prefix = 'tiletb' if args.testbeam else 'tile'
76 filePrefix = f'{prefix}_{flags.Input.RunNumbers[0]}'
77
78 if args.rdo:
79 flags.Output.doWriteRDO = True
80 outputRDO = f'{filePrefix}.RDO.pool.root'
81 flags.Output.RDOFileName = outputRDO
82
83 if args.preExec:
84 log.info('Executing preExec: %s', args.preExec)
85 exec(args.preExec)
86
87 flags.lock()
88
89 log.info('Final configuration flags follow:')
90 flags.dump()
91
92
93 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
94 cfg = MainServicesCfg(flags)
95
96 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
97 cfg.merge(PoolReadCfg(flags))
98
99 from TileSimAlgs.TileDigitizationConfig import TileDigitizationCfg
100 cfg.merge(TileDigitizationCfg(flags))
101
102 if args.trigger:
103 from TileSimAlgs.TileDigitizationConfig import TileTriggerDigitizationCfg
104 cfg.merge(TileTriggerDigitizationCfg(flags))
105
106 if any([args.cells_info_d3pd, args.cells_d3pd, args.mbts_d3pd]):
107 from TileRecUtils.TileCellMakerConfig import TileCellMakerCfg
108 cfg.merge(TileCellMakerCfg(flags))
109 cfg.getEventAlgo('TileCellMaker').CaloCellMakerToolNames['TileCellBuilder'].maskBadChannels = False
110
111 if args.aant_ntuple:
112 outputAANtuple = f'{filePrefix}.aant.root'
113 if args.testbeam:
114 from TileTBRec.TileTBAANtupleConfig import TileTBAANtupleCfg
115 cfg.merge(TileTBAANtupleCfg(flags, outputFile=outputAANtuple))
116 else:
117 from TileRec.TileAANtupleConfig import TileAANtupleCfg
118 cfg.merge(TileAANtupleCfg(flags, outputFile=outputAANtuple,
119 TileL2Cnt='TileL2Cnt' if args.trigger else "",
120 TileMuRcvContainer='TileMuRcvCnt' if args.trigger else "",
121 TileMuRcvDigitsContainer='MuRcvDigitsCnt' if args.trigger else "",
122 TileMuRcvRawChannelContainer='MuRcvRawChCnt' if args.trigger else ""))
123
124 if args.hits_ntuple:
125 outputHitsNtuple = f'{filePrefix}.ntup.root'
126 from TileRec.TileHitVecToNtupleConfig import TileHitVecToNtupleCfg
127 cfg.merge(TileHitVecToNtupleCfg(flags, outputFile=outputHitsNtuple))
128
129 if args.digits_ntuple:
130 outputHitsNtuple = f'{filePrefix}.ntup.root'
131 from TileRec.TileDigitsToNtupleConfig import TileDigitsToNtupleCfg
132 cfg.merge(TileDigitsToNtupleCfg(flags, outputFile=outputHitsNtuple))
133
134 if args.channels_ntuple:
135 outputHitsNtuple = f'{filePrefix}.ntup.root'
136 from TileRec.TileRawChannelToNtupleConfig import TileRawChannelToNtupleCfg
137 cfg.merge(TileRawChannelToNtupleCfg(flags, outputFile=outputHitsNtuple))
138
139 if args.d3pd:
140 outputD3PD = f'{filePrefix}.d3pd.root'
141 from TileSimEx.TileSimD3PDConfig import TileSimD3PDCfg
142 cfg.merge(TileSimD3PDCfg(flags, outputFile=outputD3PD,
143 saveHitsInfo=args.hits_info_d3pd,
144 saveHits=args.hits_d3pd,
145 saveDigits=args.digits_d3pd,
146 saveChannels=args.channels_d3pd,
147 saveCellsInfo=args.cells_info_d3pd,
148 saveCells=args.cells_d3pd,
149 saveMBTS=args.mbts_d3pd))
150
151 if args.sfr_tag:
152 from IOVDbSvc.IOVDbSvcConfig import addOverride
153 cfg.merge(addOverride(flags, '/TILE/OFL02/CALIB/SFR', f'{args.sfr_tag}'))
154
155 if args.rdo:
156 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
157 outputItemList = []
158 if args.alldigits_rdo:
159 outputItemList += ['TileDigitsContainer#TileDigitsCnt']
160 cfg.merge(OutputStreamCfg(flags, streamName='RDO', ItemList=outputItemList))
161
162
163 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
164 cfg.merge(SetupMetaDataForStreamCfg(flags, "RDO"))
165
166
167 if args.postExec:
168 log.info('Executing postExec: %s', args.postExec)
169 exec(args.postExec)
170
171 cfg.printConfig(withDetails=True, summariseProps=True, printDefaults=True)
172
173 if args.config_only:
174 with open('TileDigiRec.pkl', 'wb') as f:
175 cfg.store(f)
176 else:
177 sc = cfg.run()
178 sys.exit(0 if sc.isSuccess() else 1)
179
180