ATLAS Offline Software
Loading...
Searching...
No Matches
skel.ABtoEVGEN.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2#
3"""Functionality core of the Gen_tf transform"""
4
5
8
9
11
12import os, re, string
13import AthenaCommon.AlgSequence as acas
14import AthenaCommon.AppMgr as acam
15from AthenaCommon.AthenaCommonFlags import jobproperties
16
17from xAODEventInfoCnv.xAODEventInfoCnvConf import xAODMaker__EventInfoCnvAlg
18acam.athMasterSeq += xAODMaker__EventInfoCnvAlg(xAODKey="TMPEvtInfo")
19
20theApp = acam.theApp
21acam.athMasterSeq += acas.AlgSequence("EvgenGenSeq")
22genSeq = acam.athMasterSeq.EvgenGenSeq
23acam.athMasterSeq += acas.AlgSequence("EvgenPreFilterSeq")
24prefiltSeq = acam.athMasterSeq.EvgenPreFilterSeq
25acam.athMasterSeq += acas.AlgSequence("EvgenTestSeq")
26testSeq = acam.athMasterSeq.EvgenTestSeq
27
28from EvgenProdTools.LogicalExpressionFilter import LogicalExpressionFilter
29acam.athMasterSeq += LogicalExpressionFilter("EvgenFilterSeq")
30filtSeq = acam.athMasterSeq.EvgenFilterSeq
31topSeq = acas.AlgSequence()
32anaSeq = topSeq
33topSeq += acas.AlgSequence("EvgenPostSeq")
34postSeq = topSeq.EvgenPostSeq
35#topAlg = topSeq #< alias commented out for now, so that accidental use throws an error
36
37
38
41
42
43import AthenaCommon.AtlasUnixStandardJob
44include("PartPropSvc/PartPropSvc.py")
45
46
47from PerfMonComps.PerfMonFlags import jobproperties as perfmonjp
48perfmonjp.PerfMonFlags.doFastMonMT = True
49
50
51from RngComps.RngCompsConf import AthRNGSvc
52svcMgr += AthRNGSvc()
53
54
55jobproperties.AthenaCommonFlags.AllowIgnoreConfigError = False
56
57
60
61
62from AthenaCommon.Logging import logging
63evgenLog = logging.getLogger('Generate_ab')
64
65
66
69
70
71evgenLog.debug("****************** CHECKING EVENT GENERATION ARGS *****************")
72evgenLog.debug(str(runArgs))
73
74
76if not hasattr(runArgs, "outputEVNTFile") and not hasattr(runArgs, "outputEVNT_PreFile"):
77 raise RuntimeError("No output evgen EVNT or EVNT_Pre file provided.")
78
79
80if not hasattr(runArgs, "ecmEnergy"):
81 raise RuntimeError("No center of mass energy provided.")
82else:
83 evgenLog.info('ecmEnergy = ' + str(runArgs.ecmEnergy) )
84if not hasattr(runArgs, "randomSeed"):
85 raise RuntimeError("No random seed provided.")
86if not hasattr(runArgs, "firstEvent"):
87 raise RuntimeError("No first number provided.")
88if (runArgs.firstEvent <= 0):
89 evgenLog.warning("Run argument firstEvent should be > 0")
90
91if hasattr(runArgs, "inputEVNT_PreFile"):
92 evgenLog.info("inputEVNT_PreFile = " + ','.join(runArgs.inputEVNT_PreFile))
93
94
97
98
99evgenLog.debug("****************** CONFIGURING EVENT GENERATION *****************")
100
101
103from EvgenJobTransforms.EvgenConfig import evgenConfig
104from GeneratorConfig.GenConfigHelpers import gens_known, gens_lhef, gen_sortkey, gens_testhepmc, gens_notune
105
106
107from EvgenProdTools.EvgenProdToolsConf import TestHepMC
108testSeq += TestHepMC(CmEnergy=runArgs.ecmEnergy*Units.GeV)
109if not hasattr(svcMgr, 'THistSvc'):
110 from GaudiSvc.GaudiSvcConf import THistSvc
111 svcMgr += THistSvc()
112svcMgr.THistSvc.Output = ["TestHepMCname DATAFILE='TestHepMC.root' OPT='RECREATE'"]
113
114
116from EvgenProdTools.EvgenProdToolsConf import CountHepMC
117
118import AthenaPoolCnvSvc.ReadAthenaPool
119svcMgr.EventSelector.FirstEvent = runArgs.firstEvent
120theApp.EvtMax = -1
121if not hasattr(postSeq, "CountHepMC"):
122 postSeq += CountHepMC(InputEventInfo="TMPEvtInfo",
123 OutputEventInfo="EventInfo",
124 mcEventWeightsKey="")
125
126#postSeq.CountHepMC.RequestedOutput = evgenConfig.nEventsPerJob if runArgs.maxEvents == -1 else runArgs.maxEvents
127postSeq.CountHepMC.FirstEvent = runArgs.firstEvent
128postSeq.CountHepMC.CorrectHepMC = True
129postSeq.CountHepMC.CorrectEventID = True
130postSeq.CountHepMC.CorrectRunNumber = False
131
132if hasattr(runArgs,"inputEVNT_PreFile"):
133 from AthenaCommon.AppMgr import ServiceMgr
134 #fix iov metadata
135 if not hasattr(ServiceMgr.ToolSvc, 'IOVDbMetaDataTool'):
136 ServiceMgr.ToolSvc += CfgMgr.IOVDbMetaDataTool()
137 runNum = int((runArgs.jobConfig[0])[-6:])
138 ServiceMgr.ToolSvc.IOVDbMetaDataTool.MinMaxRunNumbers = [runNum, runNum+1]
139
140
142if hasattr(runArgs, "printEvts") and runArgs.printEvts > 0:
143 from TruthIO.TruthIOConf import PrintMC
144 postSeq += PrintMC()
145 postSeq.PrintMC.McEventKey = "GEN_EVENT"
146 postSeq.PrintMC.VerboseOutput = True
147 postSeq.PrintMC.PrintStyle = "Barcode"
148 postSeq.PrintMC.FirstEvent = 1
149 postSeq.PrintMC.LastEvent = runArgs.printEvts
150
151
153if hasattr(runArgs, "rivetAnas"):
154 from Rivet_i.Rivet_iConf import Rivet_i
155 anaSeq += Rivet_i()
156 anaSeq.Rivet_i.Analyses = runArgs.rivetAnas
157 anaSeq.Rivet_i.AnalysisPath = os.environ['PWD']
158 if hasattr(runArgs, "outputYODAFile"):
159 anaSeq.Rivet_i.HistoFile = runArgs.outputYODAFile
160
161
164
165
166evgenLog.debug("****************** LOADING PRE-INCLUDES AND JOB CONFIG *****************")
167
168
169if hasattr(runArgs, "preInclude"):
170 for fragment in runArgs.preInclude:
171 include(fragment)
172
173
174if hasattr(runArgs, "preExec"):
175 evgenLog.info("Transform pre-exec")
176 for cmd in runArgs.preExec:
177 evgenLog.info(cmd)
178 exec(cmd)
179
180# TODO: Explain!!!
182 outputTXTFile = None
183 if hasattr(runArgs,"outputTXTFile"): outputTXTFile=runArgs.outputTXTFile
184 return outputTXTFile
185
186
188if len(runArgs.jobConfig) != 1:
189 evgenLog.error("You must supply one and only one jobConfig file argument")
190 sys.exit(1)
191evgenLog.info("Using JOBOPTSEARCHPATH!! = '%s'" % os.environ["JOBOPTSEARCHPATH"])
192FIRST_DIR = (os.environ['JOBOPTSEARCHPATH']).split(":")[0]
193
194jofiles = [f for f in os.listdir(FIRST_DIR) if (f.startswith('mc') and f.endswith('.py'))]
195
196if len(jofiles) !=1:
197 evgenLog.error("You must supply one and only one jobOption file in DSID directory")
198 sys.exit(1)
199
200jofile = jofiles[0]
201joparts = (os.path.basename(jofile)).split(".")
202
203if joparts[0].startswith("mc"): #and all(c in string.digits for c in joparts[0][2:]):
204
205 if len(joparts) != 3:
206 evgenLog.error(jofile + " name format is wrong: must be of the form mc.<physicsShort>.py: please rename.")
207 sys.exit(1)
208
209 jo_physshortpart = joparts[1]
210 max_jo_physshort_length = 50
211 if len(jo_physshortpart) > max_jo_physshort_length:
212 evgenLog.error(f"{jofile} contains a physicsShort field of more than {max_jo_physshort_length} characters: please rename.")
213 sys.exit(1)
214
215 jo_physshortparts = jo_physshortpart.split("_")
216 if len(jo_physshortparts) < 2:
217 evgenLog.error(jofile + " has too few physicsShort fields separated by '_': should contain <generators>(_<tune+PDF_if_available>)_<process>. Please rename.")
218 sys.exit(1)
219
220 check_jofiles="/cvmfs/atlas.cern.ch/repo/sw/Generators/MC16JobOptions/scripts/check_jo_consistency.py"
221 if os.path.exists(check_jofiles):
222 include(check_jofiles)
223 check_naming(os.path.basename(jofile))
224 else:
225 evgenLog.error("check_jo_consistency.py not found")
226 sys.exit(1)
227
228
229include(jofile)
230
231
234
235
236evgenLog.debug("****************** CHECKING EVGEN CONFIGURATION *****************")
237
238
239for opt in str(evgenConfig).split(os.linesep):
240 evgenLog.info(opt)
241
242evgenLog.info(".transform = Gen_tf")
243
246if evgenConfig.obsolete:
247 evgenLog.error("JOs or icludes are obsolete, please check them")
248 sys.exit(1)
249
250if not evgenConfig.generators:
251 evgenLog.error("No entries in evgenConfig.generators: invalid configuration, please check your JO")
252 sys.exit(1)
253
254if len(evgenConfig.generators) > len(set(evgenConfig.generators)):
255 evgenLog.error("Duplicate entries in evgenConfig.generators: invalid configuration, please check your JO")
256 sys.exit(1)
257
258gennames = sorted(evgenConfig.generators, key=gen_sortkey)
259
260if joparts[0].startswith("MC"): #< if this is an "official" JO
261 genpart = jo_physshortparts[0]
262 expectedgenpart = ''.join(gennames)
263
264 expectedgenpart = expectedgenpart.replace("HerwigJimmy", "Herwig")
265 def _norm(s):
266 # TODO: add EvtGen to this normalization for MC14?
267 return s.replace("Photospp", "").replace("Photos", "").replace("TauolaPP", "").replace("Tauolapp", "").replace("Tauola", "")
268 def _norm2(s):
269 return s.replace("Py", "Pythia").replace("MG","MadGraph").replace("Ph","Powheg").replace("Hpp","Herwigpp").replace("H7","Herwig7").replace("Sh","Sherpa").replace("Ag","Alpgen").replace("EG","EvtGen").replace("PG","ParticleGun")
270
271 def _short2(s):
272 return s.replace("Pythia","Py").replace("MadGraph","MG").replace("Powheg","Ph").replace("Herwigpp","Hpp").replace("Herwig7","H7").replace("Sherpa","Sh").replace("Alpgen","Ag").replace("EvtGen","EG").replace("PG","ParticleGun")
273
274 if genpart != _norm(expectedgenpart) and _norm2(genpart) != _norm(expectedgenpart):
275 evgenLog.error("Expected first part of JO name to be '%s' or '%s', but found '%s'" % (_norm(expectedgenpart), _norm(_short2(expectedgenpart)), genpart))
276 evgenLog.error("gennames '%s' " %(expectedgenpart))
277 sys.exit(1)
278
279
280 del _norm
281
282 if not gens_notune(gennames) and len(jo_physshortparts) < 3:
283 evgenLog.error(jofile + " with generators " + expectedgenpart +
284 " has too few physicsShort fields separated by '_'." +
285 " It should contain <generators>_<tune+PDF_<process>. Please rename.")
286 sys.exit(1)
287
288
290rounding = 0
291if hasattr(runArgs,'inputGeneratorFile') and ',' in runArgs.inputGeneratorFile:
292 multiInput = runArgs.inputGeneratorFile.count(',')+1
293else:
294 multiInput = 0
295# check if default nEventsPErJob used
296if not evgenConfig.nEventsPerJob:
297 evgenLog.info('#############################################################')
298 evgenLog.info(' !!!! no nEventsPerJob set !!! The default 10000 used. !!! ')
299 evgenLog.info('#############################################################')
300else:
301 evgenLog.info(' nEventsPerJob = ' + str(evgenConfig.nEventsPerJob) )
302
303
304if evgenConfig.minevents > 0 :
305 raise RuntimeError("evgenConfig.minevents is obsolete and should be removed from the JOs")
306
307if evgenConfig.nEventsPerJob < 1:
308 raise RuntimeError("evgenConfig.nEventsPerJob must be at least 1")
309elif evgenConfig.nEventsPerJob > 100000:
310 raise RuntimeError("evgenConfig.nEventsPerJob can be max. 100000")
311else:
312 allowed_nEventsPerJob_lt1000 = [1, 2, 5, 10, 20, 25, 50, 100, 200, 500, 1000]
313 msg = "evgenConfig.nEventsPerJob = %d: " % evgenConfig.nEventsPerJob
314
315 if evgenConfig.nEventsPerJob >= 1000 and evgenConfig.nEventsPerJob <=10000 and (evgenConfig.nEventsPerJob % 1000 != 0 or 10000 % evgenConfig.nEventsPerJob != 0) :
316 msg += "nEventsPerJob in range [1K, 10K] must be a multiple of 1K and a divisor of 10K"
317 raise RuntimeError(msg)
318 elif evgenConfig.nEventsPerJob > 10000 and evgenConfig.nEventsPerJob % 10000 != 0:
319 msg += "nEventsPerJob >10K must be a multiple of 10K"
320 raise RuntimeError(msg)
321 elif evgenConfig.nEventsPerJob < 1000 and evgenConfig.nEventsPerJob not in allowed_nEventsPerJob_lt1000:
322 msg += "nEventsPerJob in range <= 1000 must be one of %s" % allowed_nEventsPerJob_lt1000
323 raise RuntimeError(msg)
324 postSeq.CountHepMC.RequestedOutput = evgenConfig.nEventsPerJob if runArgs.maxEvents == -1 else runArgs.maxEvents
325 evgenLog.info('Requested output events = '+str(postSeq.CountHepMC.RequestedOutput))
326
327 # Special case of N<100: adjust TestHepMC. We will allow _one_ event to fail the checks.
328 # This means the minimum efficiency is N/N+1 for N generated events. Note that if N<100,
329 # each failed event costs us more than 1% of efficiency.
330 if hasattr(testSeq, "TestHepMC") and postSeq.CountHepMC.RequestedOutput<100:
331 testSeq.TestHepMC.EffFailThreshold = postSeq.CountHepMC.RequestedOutput/(postSeq.CountHepMC.RequestedOutput+1) - 0.01
332
333
334if evgenConfig.keywords:
335 from GeneratorConfig.GenConfigHelpers import checkKeywords
336 checkKeywords(evgenConfig, evgenLog)
337
338
340if evgenConfig.findJets:
341 include("EvgenJobTransforms/Generate_TruthJets.py")
342
343
344from AthenaPoolCnvSvc.WriteAthenaPool import AthenaPoolOutputStream
345from AthenaPoolCnvSvc.AthenaPoolCnvSvcConf import AthenaPoolCnvSvc
346# remove because it was removed from Database/AthenaPOOL/AthenaPoolCnvSvc
347#svcMgr.AthenaPoolCnvSvc.CommitInterval = 10 #< tweak for MC needs
348if hasattr(runArgs, "outputEVNTFile"):
349 poolFile = runArgs.outputEVNTFile
350elif hasattr(runArgs, "outputEVNT_PreFile"):
351 poolFile = runArgs.outputEVNT_PreFile
352else:
353 raise RuntimeError("Output pool file, either EVNT or EVNT_Pre, is not known.")
354
355
356StreamEVGEN = AthenaPoolOutputStream("StreamEVGEN", poolFile, asAlg=True, noTag=True , eventInfoKey="EventInfo")
357if hasattr(runArgs, "inputEVNT_PreFile") :
358 svcMgr.EventSelector.InputCollections = runArgs.inputEVNT_PreFile
359 StreamEVGEN.TakeItemsFromInput = True
360 postSeq.CountHepMC.CorrectRunNumber = True
361
362StreamEVGEN.ForceRead = True
363StreamEVGEN.ItemList += ["EventInfo#*", "xAOD::EventInfo#EventInfo*", "xAOD::EventAuxInfo#EventInfoAux.*", "McEventCollection#*"]
364StreamEVGEN.RequireAlgs += ["EvgenFilterSeq"]
365
366if evgenConfig.saveJets:
367 StreamEVGEN.ItemList += ["xAOD::JetContainer#*"]
368 StreamEVGEN.ItemList += ["xAOD::JetAuxContainer#*Aux.TruthLabelID.PartonTruthLabelID"]
369if evgenConfig.savePileupTruthParticles:
370 StreamEVGEN.ItemList += ["xAOD::TruthParticleContainer#TruthPileupParticles*"]
371 StreamEVGEN.ItemList += ["xAOD::TruthParticleAuxContainer#TruthPileupParticlesAux.*"]
372
373
374
375dsid = os.path.basename(runArgs.jobConfig[0])
376if not dsid.isdigit():
377 dsid = "999999"
378svcMgr.EventSelector.RunNumber = int(dsid)
379
380if postSeq.CountHepMC.CorrectRunNumber == True:
381 postSeq.CountHepMC.NewRunNumber = int(dsid)
382 evgenLog.info("Set new run number in skel NewRunNumber = " + str(postSeq.CountHepMC.NewRunNumber))
383else:
384 evgenLog.info("No new run number set in skel RunNumber = " + dsid)
385
386
387import EventInfoMgt.EventInfoMgtInit
388svcMgr.TagInfoMgr.ExtraTagValuePairs.update({"beam_energy": str(int(runArgs.ecmEnergy*Units.GeV/2.0))})
389svcMgr.TagInfoMgr.ExtraTagValuePairs.update({"beam_type": 'collisions'})
390if len(evgenConfig.keywords)>0:
391 # Assume that this is the correct list of keywords we should keep
392 svcMgr.TagInfoMgr.ExtraTagValuePairs.update({"keywords": ", ".join(evgenConfig.keywords).lower()})
393
394# Set AMITag in in-file metadata
395from PyUtils import AMITagHelper
396AMITagHelper.SetAMITag(runArgs=runArgs)
397
398
399from OutputStreamAthenaPool.OutputStreamAthenaPoolConf import CopyEventStreamInfo
400streamInfoTool = CopyEventStreamInfo( "StreamEVGEN_CopyEventStreamInfo" )
401ToolSvc += streamInfoTool
402svcMgr.MetaDataSvc.MetaDataTools += [ streamInfoTool ]
403
404
406include("EvgenJobTransforms/Generate_ecmenergies.py")
407
408
409include("EvgenJobTransforms/Generate_dsid_ranseed.py")
410
411
412if (hasattr( runArgs, "VERBOSE") and runArgs.VERBOSE ) or (hasattr( runArgs, "loglevel") and runArgs.loglevel == "DEBUG") or (hasattr( runArgs, "loglevel")and runArgs.loglevel == "VERBOSE"):
413 include("EvgenJobTransforms/Generate_debug_level.py")
414
415
416svcMgr.TagInfoMgr.ExtraTagValuePairs.update({"specialConfiguration": evgenConfig.specialConfig})
417
418
420if hasattr(testSeq, "TestHepMC") and not gens_testhepmc(evgenConfig.generators):
421 evgenLog.info("Removing TestHepMC sanity checker")
422 del testSeq.TestHepMC
423
424
425
428
429if hasattr(runArgs, "postInclude"):
430 for fragment in runArgs.postInclude:
431 include(fragment)
432
433if hasattr(runArgs, "postExec"):
434 evgenLog.info("Transform post-exec")
435 for cmd in runArgs.postExec:
436 evgenLog.info(cmd)
437 exec(cmd)
438
439
440
443acas.dumpMasterSequence()
444
445
446
449
450
451evgenLog.debug("****************** HANDLING EVGEN INPUT FILES *****************")
452
453
454datFile = None
455if "McAtNlo" in evgenConfig.generators and "Herwig" in evgenConfig.generators:
456 datFile = "inparmMcAtNlo.dat"
457elif "Alpgen" in evgenConfig.generators:
458 datFile = "inparmAlpGen.dat"
459elif "Protos" in evgenConfig.generators:
460 datFile = "protos.dat"
461elif "ProtosLHEF" in evgenConfig.generators:
462 datFile = "protoslhef.dat"
463elif "AcerMC" in evgenConfig.generators:
464 datFile = "inparmAcerMC.dat"
465elif "CompHep" in evgenConfig.generators:
466 datFile = "inparmCompHep.dat"
467
468
469eventsFile = None
470
471
472def find_unique_file(pattern):
473 "Return a matching file, provided it is unique"
474 import glob
475 files = glob.glob(pattern)
476
477 if not files:
478 raise RuntimeError("No '%s' file found" % pattern)
479 elif len(files) > 1:
480 raise RuntimeError("More than one '%s' file found" % pattern)
481 return files[0]
482
483def mk_symlink(srcfile, dstfile):
484 "Make a symlink safely"
485 if dstfile:
486 if os.path.exists(dstfile) and not os.path.samefile(dstfile, srcfile):
487 os.remove(dstfile)
488 if not os.path.exists(dstfile):
489 evgenLog.info("Symlinking %s to %s" % (srcfile, dstfile))
490 os.symlink(srcfile, dstfile)
491 else:
492 evgenLog.debug("Symlinking: %s is already the same as %s" % (dstfile, srcfile))
493
494
495
496if evgenConfig.auxfiles:
497 from PyJobTransformsCore.trfutil import get_files
498 get_files(evgenConfig.auxfiles, keepDir=False, errorIfNotFound=True)
499
500
501
504
505def _checkattr(attr, required=False):
506 if not hasattr(evgenConfig, attr) or not getattr(evgenConfig, attr):
507 msg = "evgenConfig attribute '%s' not found." % attr
508 if required:
509 raise RuntimeError("Required " + msg)
510 return False
511 return True
512
513if _checkattr("description", required=True):
514 msg = evgenConfig.description
515 if _checkattr("notes"):
516 msg += " " + evgenConfig.notes
517 print ("MetaData: %s = %s" % ("physicsComment", msg))
518if _checkattr("generators", required=True):
519 print ("MetaData: %s = %s" % ("generatorName", "+".join(gennames)))
520if _checkattr("process"):
521 print ("MetaData: %s = %s" % ("physicsProcess", evgenConfig.process))
522if _checkattr("tune"):
523 print ("MetaData: %s = %s" % ("generatorTune", evgenConfig.tune))
524if _checkattr("hardPDF"):
525 print ("MetaData: %s = %s" % ("hardPDF", evgenConfig.hardPDF))
526if _checkattr("softPDF"):
527 print ("MetaData: %s = %s" % ("softPDF", evgenConfig.softPDF))
528if _checkattr("nEventsPerJob"):
529 print ("MetaData: %s = %s" % ("nEventsPerJob", evgenConfig.nEventsPerJob))
530if _checkattr("keywords"):
531 print ("MetaData: %s = %s" % ("keywords", ", ".join(evgenConfig.keywords).lower()))
532if _checkattr("specialConfig"):
533 print ("MetaData: %s = %s" % ("specialConfig", evgenConfig.specialConfig))
534# TODO: Require that a contact / JO author is always set
535if _checkattr("contact"):
536 print ("MetaData: %s = %s" % ("contactPhysicist", ", ".join(evgenConfig.contact)))
537
538# Output list of generator filters used
539filterNames = [alg.getType() for alg in acas.iter_algseq(filtSeq)]
540excludedNames = ['AthSequencer', 'PyAthena::Alg', 'TestHepMC']
541filterNames = list(set(filterNames) - set(excludedNames))
542print ("MetaData: %s = %s" % ("genFilterNames", ", ".join(filterNames)))
543
544
545
548
549from PyJobTransformsCore.runargs import RunArguments
550runPars = RunArguments()
551runPars.nEventsPerJob = evgenConfig.nEventsPerJob
552runPars.maxeventsstrategy = evgenConfig.maxeventsstrategy
553with open("config.pickle", "wb") as f:
554 import pickle
555 pickle.dump(runPars, f)
556
557
558
561evgenLog.info("****************** STARTING EVENT GENERATION *****************")
A service to manage multiple RNG streams in thread-safe way.
Definition AthRNGSvc.h:34
This class provides an algorithm to make the EventStreamInfo object and update it.
Count the number of events to pass all algorithms/filters.
Definition CountHepMC.h:26
Print MC event details for a range of event numbers.
Definition PrintMC.h:12
Interface to the Rivet analysis package.
Definition Rivet_i.h:31
Filtering algorithm to sanity check HepMC event features.
Definition TestHepMC.h:33
STL class.
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:312
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179
_checkattr(attr, required=False)
==============================================================
mk_symlink(srcfile, dstfile)
OutputTXTFile()
==============================================================