91def SetupVP1():
92 from AthenaConfiguration.Enums import Format
93 from AthenaCommon.Logging import logging
95
96
97 _logger = logging.getLogger("VP1")
98 _logger.setLevel(VERBOSE)
99
100 from AthenaConfiguration.AllConfigFlags import initConfigFlags
101
102 flags = initConfigFlags()
103 flags.Concurrency.NumThreads = 0
104
105
106
107
108
109
110
111 parser = flags.getArgumentParser()
112 parser.prog = "vp1"
113 parser.description = """
114 VP1, or Virtual Point 1, is the interactive 3D event display for the ATLAS experiment at CERN.
115 Detailed documentation can be found at the webpage: https://atlas-vp1.web.cern.ch/atlas-vp1
116 but below are the flags that can be used to configure VP1 (most are standard Athena flags, but some are VP1-specific).
117 """
118 parser.description = """
119 So for example, to run VP1 on a file: vp1 [options] myESD.pool.root"""
120
121 group = parser.add_argument_group("VP1 specific")
122 group.add_argument(
123 "Filename",
124 nargs='?',
125 help="Input file to pass to VP1 (i.e. vp1 myESD.pool.root as an alternative to vp1 --filesInput=[])",
126 metavar="File name",
127 )
128 group.add_argument(
129 "--config",
130 nargs="*",
131 help="Config file to use for VP1. If not specified, the default configuration will be used.",
132 )
133 group.add_argument(
134 "--verboseAthena",
135 action="store_true",
136 help="If false, tell Athena to suppress INFO messages and below.",
137 )
138 group.add_argument(
139 "--online", action="store_true", help="Use this flag for running VP1 at P1."
140 )
141 group.add_argument(
142 "--cruise",
143 type=int,
144 help="Start in cruise mode, changing events after N seconds.",
145 )
146
147 group.add_argument(
148 "--phaseII", action="store_true", help="Launch VP1 with the current default Run4 geometry tag for Phase-II [that is, it sets 'flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN4']. It cannot be used when running VP1 on a data file, otherwise it interferes with the auto-configuration from the metadata stored in the file."
149 )
150
151 group.add_argument(
152 "--batch",
153 action="store_true",
154 help="Run VP1 in 'batch' mode with a given configuration file.",
155 )
156 group.add_argument(
157 "--batch-all-events",
158 action="store_true",
159 help="Process all events in the input data file in '-batch' mode. Use this together with '-batch'.",
160 )
161 group.add_argument(
162 "--batch-n-events",
163 type=int,
164 help="Process 'N' events in the input data file in '-batch' mode. Use this together with '-batch'.",
165 )
166 group.add_argument(
167 "--batch-output-folder",
168 help="Specify an output folder to store the event displays produced with the '-batch' option.",
169 )
170 group.add_argument(
171 "--batch-random-config",
172 action="store_true",
173 help="Run VP1 in 'batch' mode; for each single event a configuration file will be randomly picked out of the configuration files provided by the user. Use this together with '-batch'.",
174 )
175
176 group.add_argument(
177 "--live", action="store_true", help="Run on live events from point 1."
178 )
179 group.add_argument(
180 "--livelocal",
181 action="store_true",
182 help="Run on live events from point 1 in local directory.",
183 )
184 group.add_argument(
185 "--eventsrc",
186 help="Directory to take single event files from (do not specify input files in this case). To get files from a web server (i.e. live events), put instead the url to the file residing in the same directory (most users should just use the --live option instead).",
187 )
188 group.add_argument(
189 "--extraevtsrcdir",
190 help="Directory to take single event files from (do not specify input files in this case). To get files from a web server (i.e. live events), put instead the url to the file residing in the same directory (most users should just use the -live option instead).",
191 )
192 group.add_argument(
193 "--eventcpy",
194 help="Directory to keep local copies of processed event files. If --eventsrc is set, then -eventcpy will default to /tmp/emoyse/vp1events/6897 .",
195 )
196
197
198
199 args = flags.fillFromArgs(parser=parser)
200
201 if args.help:
203
204 import sys
205 sys.exit()
206
207
208 if args.Filename and (
209 flags.Input.Files == []
210 or flags.Input.Files == ["_ATHENA_GENERIC_INPUTFILE_NAME_"]
211 ):
212 flags.Input.Files = [args.Filename]
213
214 _logger.verbose("+ About to set flags related to the input")
215
216
217
218 vp1config = {}
219
220
221
222
223 vp1_empty_input = False
224
225
226 if (flags.Input.Files == [] or flags.Input.Files == ["_ATHENA_GENERIC_INPUTFILE_NAME_"]):
227 if not args.phaseII:
228 from Campaigns.Utils import Campaign
229 from AthenaConfiguration.TestDefaults import defaultGeometryTags
230
231 vp1_empty_input = True
232 vp1config.setdefault("EmptyInput", vp1_empty_input)
233
234
235
236
237
238
239
240
241 flags.Input.ProjectName = "mc20_13TeV"
242 flags.Input.RunNumbers = [330000]
243 flags.Input.TimeStamps = [1]
244 flags.Input.TypedCollections = []
245
246
247 flags.IOVDb.GlobalTag = "OFLCOND-MC23-SDR-RUN3-02"
248 flags.Input.isMC = True
249 flags.Input.MCCampaign = Campaign.Unknown
250 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
251 elif args.phaseII:
252 _logger.verbose("Phase-II mode!")
253 from Campaigns.Utils import Campaign
254 from AthenaConfiguration.TestDefaults import defaultGeometryTags
255 vp1_empty_input = True
256 flags.Input.ProjectName = "mc21_14TeV"
257 flags.Input.RunNumbers = [601229]
258 flags.Input.TimeStamps = [1]
259 flags.Input.TypedCollections = []
260
261
262 flags.IOVDb.GlobalTag = "OFLCOND-MC16-SDR-15"
263 flags.Input.isMC = True
264 flags.Input.MCCampaign = Campaign.Unknown
265 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN4
266
267
268
269
270
271 else:
272
273 if args.phaseII:
274 _logger.error("VP1: The use of the `--phaseII` flag with input data file is not supported. When you run VP1 on input data file, metadata are taken from the data file itself. Please remove `--phaseII` and relaunch. However, if needed, you can still steer Athena by using the standard Athena flags and options. Exiting...\n")
275 import sys
276 sys.exit(2)
277
278
279 from os import path
280
281 for file in flags.Input.Files:
282 if not path.exists(flags.Input.Files[0]):
283 _logger.warning("Input file '%s' does not exist", file)
284 import sys
285 sys.exit(1)
286
287
288 if args.online:
289 flags.Common.isOnline = args.online
290 elif "HLTP" in flags.IOVDb.GlobalTag:
292 "HLTP detected in the global tag, but --online mode is not enabled. Enabling it now."
293 )
294 flags.Common.isOnline = True
295
296 _logger.verbose("+ ... Input flags done")
297
298 _logger.verbose("+ About to set the detector flags")
299
300 from AthenaConfiguration.DetectorConfigFlags import setupDetectorFlags
301
302 setupDetectorFlags(
303 flags,
304 None,
305 use_metadata=not vp1_empty_input,
306 toggle_geometry=True,
307 keep_beampipe=True,
308 )
309 _logger.verbose("+ ... Detector flags done")
310
311
312 flags.lock()
313
314
315 flags.dump()
316
317
318
319
320
321
322
323
324
325 _logger.verbose("+ Setup main services, and input file reading")
326
327 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
328
329 cfg = MainServicesCfg(flags)
330
331 if not vp1_empty_input:
332
333
334 if flags.Input.Format is Format.POOL:
335 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
336
337 cfg.merge(PoolReadCfg(flags))
338
339 if "EventInfo" not in flags.Input.Collections:
340 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
341 cfg.merge(EventInfoCnvAlgCfg(flags))
342
343 from TrkConfig.TrackCollectionReadConfig import TrackCollectionReadCfg
344 cfg.merge(TrackCollectionReadCfg(flags, "Tracks"))
345
346
347 from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg
348 toolAtlasExtrapolator = cfg.popToolsAndMerge(AtlasExtrapolatorCfg(flags))
349 cfg.addPublicTool(toolAtlasExtrapolator)
350 vp1config.setdefault("ExtrapolatorTool", toolAtlasExtrapolator)
351
352
353 from TrkEventCnvTools.TrkEventCnvToolsConfig import TrkEventCnvSuperToolCfg
354 cfg.merge(TrkEventCnvSuperToolCfg(flags))
355
356
357 if flags.Input.isMC and "xAOD::TruthEventContainer#TruthEvents" not in flags.Input.TypedCollections:
358
359 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
360 cfg.merge(GEN_AOD2xAODCfg(flags))
361
362 _logger.verbose("+ ... Main services done")
363
364 _logger.verbose("+ About to setup geometry")
365 configureGeometry(flags, cfg)
366 _logger.verbose("+ ... Geometry done")
367
368
369 if not args.verboseAthena:
370
371 _logger.warning("From here, we are suppressing most messages from Athena.")
372 _logger.info("To see more, use the --verboseAthena flag; e.g., 'vp1 myESD.root --verboseAthena'")
373 msgService = cfg.getService("MessageSvc")
374 msgService.OutputLevel = 4
375
376 if args.cruise:
377 vp1config.setdefault("InitialCruiseMode", "EVENT")
378 vp1config.setdefault("InitialCruiseModePeriod", args.cruise)
379
380 if args.config:
381 print(
"Using config file", args.config)
382 vp1config.setdefault("InitialInputVP1Files", args.config)
383
384
385 if args.batch:
386 setup_batch_mode(args)
387
388
389 if args.eventsrc:
390 vp1config.setdefault("MultipleFilesON", True)
391
392 if args.live or args.livelocal:
393 setup_live_mode(args, vp1config)
394
395
396 cfg.merge(VP1AlgCfg(flags, **vp1config))
397 cfg.run()
398
399
void print(char *figname, TCanvas *c1)