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="Use this flag for running VP1 with PhaseII setup."
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 vp1_empty_input = False
219
220
221 if (flags.Input.Files == [] or flags.Input.Files == [
222 "_ATHENA_GENERIC_INPUTFILE_NAME_"
223 ]) and not args.phaseII:
224 from Campaigns.Utils import Campaign
225 from AthenaConfiguration.TestDefaults import defaultGeometryTags
226
227 vp1_empty_input = True
228
229
230
231
232
233
234
235 flags.Input.ProjectName = "mc20_13TeV"
236 flags.Input.RunNumbers = [330000]
237 flags.Input.TimeStamps = [1]
238 flags.Input.TypedCollections = []
239
240
241 flags.IOVDb.GlobalTag = "OFLCOND-MC23-SDR-RUN3-02"
242 flags.Input.isMC = True
243 flags.Input.MCCampaign = Campaign.Unknown
244 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN3
245 elif args.phaseII:
246 _logger.verbose("Phase-II mode!")
247 from Campaigns.Utils import Campaign
248 from AthenaConfiguration.TestDefaults import defaultGeometryTags
249 vp1_empty_input = True
250 flags.Input.ProjectName = "mc21_14TeV"
251 flags.Input.RunNumbers = [601229]
252
253
254 flags.Input.TimeStamps = [1]
255 flags.Input.TypedCollections = []
256
257
258 flags.IOVDb.GlobalTag = "OFLCOND-MC16-SDR-15"
259 flags.Input.isMC = True
260 flags.Input.MCCampaign = Campaign.Unknown
261 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN4
262
263 else:
264
265 from os import path
266
267 for file in flags.Input.Files:
268 if not path.exists(flags.Input.Files[0]):
269 _logger.warning("Input file '%s' does not exist", file)
270 import sys
271 sys.exit(1)
272
273
274 if args.online:
275 flags.Common.isOnline = args.online
276 elif "HLTP" in flags.IOVDb.GlobalTag:
278 "HLTP detected in the global tag, but --online mode is not enabled. Enabling it now."
279 )
280 flags.Common.isOnline = True
281
282 _logger.verbose("+ ... Input flags done")
283
284 _logger.verbose("+ About to set the detector flags")
285
286 from AthenaConfiguration.DetectorConfigFlags import setupDetectorFlags
287
288 setupDetectorFlags(
289 flags,
290 None,
291 use_metadata=not vp1_empty_input,
292 toggle_geometry=True,
293 keep_beampipe=True,
294 )
295 _logger.verbose("+ ... Detector flags done")
296
297
298 flags.lock()
299
300
301 flags.dump()
302
303
304
305
306
307
308
309
310
311 _logger.verbose("+ Setup main services, and input file reading")
312
313 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
314
315 cfg = MainServicesCfg(flags)
316
317 if not vp1_empty_input:
318
319
320 if flags.Input.Format is Format.POOL:
321 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
322
323 cfg.merge(PoolReadCfg(flags))
324
325 if "EventInfo" not in flags.Input.Collections:
326 from xAODEventInfoCnv.xAODEventInfoCnvConfig import EventInfoCnvAlgCfg
327 cfg.merge(EventInfoCnvAlgCfg(flags))
328
329 from TrkConfig.TrackCollectionReadConfig import TrackCollectionReadCfg
330 cfg.merge(TrackCollectionReadCfg(flags, "Tracks"))
331
332 from TrkConfig.AtlasExtrapolationEngineConfig import AtlasExtrapolationEngineCfg
333 AtlasExtrapolationEngine = cfg.getPrimaryAndMerge(AtlasExtrapolationEngineCfg(flags))
334 cfg.addPublicTool(AtlasExtrapolationEngine)
335
336 from TrkEventCnvTools.TrkEventCnvToolsConfig import TrkEventCnvSuperToolCfg
337 cfg.merge(TrkEventCnvSuperToolCfg(flags))
338
339
340 if flags.Input.isMC and "xAOD::TruthEventContainer#TruthEvents" not in flags.Input.TypedCollections:
341
342 from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg
343 cfg.merge(GEN_AOD2xAODCfg(flags))
344
345 _logger.verbose("+ ... Main services done")
346
347 _logger.verbose("+ About to setup geometry")
348 configureGeometry(flags, cfg)
349 _logger.verbose("+ ... Geometry done")
350
351
352 vp1config = {}
353 if not args.verboseAthena:
354
355 print(
"Suppressing most messages from Athena.")
356 print(
"To see more, set the --verboseAthena flag to true.")
357 msgService = cfg.getService("MessageSvc")
358 msgService.OutputLevel = 4
359
360 if args.cruise:
361 vp1config.setdefault("InitialCruiseMode", "EVENT")
362 vp1config.setdefault("InitialCruiseModePeriod", args.cruise)
363
364 if args.config:
365 print(
"Using config file", args.config)
366 vp1config.setdefault("InitialInputVP1Files", args.config)
367
368
369 if args.batch:
370 setup_batch_mode(args)
371
372
373 if args.eventsrc:
374 vp1config.setdefault("MultipleFilesON", True)
375
376 if args.live or args.livelocal:
377 setup_live_mode(args, vp1config)
378
379
380 cfg.merge(VP1AlgCfg(flags, **vp1config))
381 cfg.run()
382
383
void print(char *figname, TCanvas *c1)