ATLAS Offline Software
Public Member Functions | Private Attributes | List of all members
python.trfValidation.eventMatch Class Reference

Small class used for vailiadating event counts between input and output files. More...

Inheritance diagram for python.trfValidation.eventMatch:
Collaboration diagram for python.trfValidation.eventMatch:

Public Member Functions

def __init__ (self, executor, eventCountConf=None, eventCountConfOverwrite=False)
 check in- and output event counts More...
 
def eventCount (self)
 
def configureCheck (self, override=False)
 Setup the parameters needed to define particular checks. More...
 
def decide (self)
 Perform an event count check. More...
 

Private Attributes

 _executor
 
 _eventCount
 
 _eventCountConf
 
 _inEventDict
 
 _outEventDict
 
 _skipEvents
 
 _maxEvents
 
 _evAccEff
 

Detailed Description

Small class used for vailiadating event counts between input and output files.

Definition at line 943 of file trfValidation.py.

Constructor & Destructor Documentation

◆ __init__()

def python.trfValidation.eventMatch.__init__ (   self,
  executor,
  eventCountConf = None,
  eventCountConfOverwrite = False 
)

check in- and output event counts

Class to verify that in- and output event counts are in a reasonable relationship.

Parameters

Definition at line 952 of file trfValidation.py.

952  def __init__(self, executor, eventCountConf=None, eventCountConfOverwrite=False):
953  self._executor = executor
954  self._eventCount = None
955 
956 
967  simEventEff = 0.995
968  self._eventCountConf = {}
969  self._eventCountConf['EVNT'] = {'EVNT_MRG':"match", "HITS": simEventEff, "EVNT_TR": "filter", "DAOD_TRUTH*" : "match"}
970  self._eventCountConf['EVNT_TR'] = {'HITS': simEventEff}
971  self._eventCountConf['HITS'] = {'RDO':"match", 'HITS_RSM': simEventEff, "HITS_MRG":"match", 'HITS_FILT': simEventEff, "RDO_FILT": "filter", "DAOD_TRUTH*" : "match", "HIST_SIM" : "match"}
972  self._eventCountConf['BS'] = {'ESD': "match", 'DRAW_*':"filter", 'NTUP_*':"filter", "BS_MRG":"match", 'DESD*': "filter", 'AOD':"match", 'DAOD*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
973  self._eventCountConf['RDO*'] = {'ESD': "match", 'DRAW_*':"filter", 'NTUP_*':"filter", "RDO_MRG":"match", "RDO_TRIG":"match", 'AOD':"match", 'DAOD*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match", "HIST_DIGI":"match"}
974  self._eventCountConf['ESD'] = {'ESD_MRG': "match", 'AOD':"match", 'DESD*':"filter", 'DAOD_*':"filter", 'NTUP_*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
975  self._eventCountConf['AOD'] = {'AOD_MRG' : "match", 'TAG':"match", "NTUP_*":"filter", "DAOD_*":"filter", 'NTUP_*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
976  self._eventCountConf['AOD_MRG'] = {'TAG':"match"}
977  self._eventCountConf['DAOD_*'] = {'DAOD_*_MRG' : "match"}
978  self._eventCountConf['TAG'] = {'TAG_MRG': "match"}
979  self._eventCountConf['HIST'] = {'HIST_MRG': "match"}
980  self._eventCountConf['NTUP_COMMON'] = {'DNTUP*': "filter"}
981  self._eventCountConf['NTUP_*'] = {'NTUP_*_MRG': "match"}
982  # Next one comprises special data type names for smart merging of AthenaMP worker outputs
983  self._eventCountConf['POOL_MRG_INPUT'] = {'POOL_MRG_OUTPUT': "match"}
984 
985 
986  if eventCountConf:
987  if eventCountConfOverwrite is True:
988  self._eventCountConf = eventCountConf
989  else:
990  self._eventCountConf.update(eventCountConf)
991 
992  msg.debug('Event count check configuration is: {0}'.format(self._eventCountConf))
993  if hasattr(self._executor, 'name'):
994  msg.debug('Event count check ready for executor {0}'.format(self._executor.name))
995 
996  if self._executor is not None:
997  self.configureCheck(override=False)
998 

Member Function Documentation

◆ configureCheck()

def python.trfValidation.eventMatch.configureCheck (   self,
  override = False 
)

Setup the parameters needed to define particular checks.

Parameters
overrideIf set then configure the checks using this dictionary, which needs to have keys inEventDict, outEventDict, skipEvents, maxEvents, evAccEff
Note
Default is to configure the checks from the associated executor

Definition at line 1007 of file trfValidation.py.

1007  def configureCheck(self, override=False):
1008  if override:
1009  msg.info('Overriding check configuration with: {0}'.format(override))
1010  self._inEventDict = override['inEventDict']
1011  self._outEventDict = override['outEventDict']
1012  self._skipEvents = override['skipEvents']
1013  self._maxEvents = override['maxEvents']
1014  self._evAccEff = override['evAccEff']
1015  else:
1016  # Input data from executor
1017  self._inEventDict = {}
1018  for dataTypeName in self._executor.input:
1019  try:
1020  self._inEventDict[dataTypeName] = self._executor.conf.dataDictionary[dataTypeName].nentries
1021  msg.debug('Input data type {0} has {1} events'.format(dataTypeName, self._inEventDict[dataTypeName]))
1022  except KeyError:
1023  msg.warning('Found no dataDictionary entry for input data type {0}'.format(dataTypeName))
1024 
1025  # Output data from executor
1026  self._outEventDict = {}
1027  for dataTypeName in self._executor.output:
1028  try:
1029  self._outEventDict[dataTypeName] = self._executor.conf.dataDictionary[dataTypeName].nentries
1030  msg.debug('Output data type {0} has {1} events'.format(dataTypeName, self._outEventDict[dataTypeName]))
1031  except KeyError:
1032  msg.warning('Found no dataDictionary entry for output data type {0}'.format(dataTypeName))
1033 
1034  # Find if we have a skipEvents applied
1035  if "skipEvents" in self._executor.conf.argdict:
1036  self._skipEvents = self._executor.conf.argdict['skipEvents'].returnMyValue(exe=self._executor)
1037  else:
1038  self._skipEvents = None
1039 
1040  # Find if we have a maxEvents applied
1041  if "maxEvents" in self._executor.conf.argdict:
1042  self._maxEvents = self._executor.conf.argdict['maxEvents'].returnMyValue(exe=self._executor)
1043  if self._maxEvents == -1:
1044  self._maxEvents = None
1045  else:
1046  self._maxEvents = None
1047 
1048  # Executor substeps handling
1049  if self._executor.conf.totalExecutorSteps > 1 and self._executor.conf.executorStep < self._executor.conf.totalExecutorSteps - 1:
1050  executorEventCounts, executorEventSkips = getExecutorStepEventCounts(self._executor)
1051  self._maxEvents = executorEventCounts[self._executor.conf.executorStep]
1052  self._skipEvents = executorEventSkips[self._executor.conf.executorStep]
1053 
1054  # Global eventAcceptanceEfficiency set?
1055  if "eventAcceptanceEfficiency" in self._executor.conf.argdict:
1056  self._evAccEff = self._executor.conf.argdict['eventAcceptanceEfficiency'].returnMyValue(exe=self._executor)
1057  if (self._evAccEff is None):
1058  self._evAccEff = 0.99
1059  else:
1060  self._evAccEff = 0.99
1061 
1062  msg.debug("Event check conf: {0} {1}, {2}, {3}, {4}".format(self._inEventDict, self._outEventDict, self._skipEvents,
1063  self._maxEvents, self._evAccEff))
1064 
1065 

◆ decide()

def python.trfValidation.eventMatch.decide (   self)

Perform an event count check.

Definition at line 1067 of file trfValidation.py.

1067  def decide(self):
1068  # We have all that we need to proceed: input and output data, skip and max events plus any efficiency factor
1069  # So loop over the input and output data and make our checks
1070  for inData, neventsInData in self._inEventDict.items():
1071  if not isinstance(neventsInData, int):
1072  msg.warning('File size metadata for {inData} was not countable, found {neventsInData}. No event checks possible for this input data.'.format(inData=inData, neventsInData=neventsInData))
1073  continue
1074  if inData in self._eventCountConf:
1075  inDataKey = inData
1076  else:
1077  # OK, try a glob match in this case (YMMV)
1078  matchedInData = False
1079  for inDataKey in self._eventCountConf:
1080  if fnmatch.fnmatch(inData, inDataKey):
1081  msg.info("Matched input data type {inData} to {inDataKey} by globbing".format(inData=inData, inDataKey=inDataKey))
1082  matchedInData = True
1083  break
1084  if not matchedInData:
1085  msg.warning('No defined event count match for {inData} -> {outData}, so no check(s) possible in this case.'.format(inData=inData, outData=list(self._outEventDict)))
1086  continue
1087 
1088  # Now calculate the expected number of processed events for this input
1089  expectedEvents = neventsInData
1090  if self._skipEvents is not None and self._skipEvents > 0:
1091  expectedEvents -= self._skipEvents
1092  if expectedEvents < 0:
1093  msg.warning('skipEvents was set higher than the input events in {inData}: {skipEvents} > {neventsInData}. This is not an error, but it is not a normal configuration. Expected events is now 0.'.format(inData=inData, skipEvents=self._skipEvents, neventsInData=neventsInData))
1094  expectedEvents = 0
1095  if self._maxEvents is not None:
1096  if expectedEvents < self._maxEvents:
1097  if self._skipEvents is not None:
1098  msg.warning('maxEvents was set higher than inputEvents-skipEvents for {inData}: {maxEvents} > {neventsInData}-{skipEvents}. This is not an error, but it is not a normal configuration. Expected events remains {expectedEvents}.'.format(inData=inData, maxEvents=self._maxEvents, neventsInData=neventsInData, skipEvents=self._skipEvents, expectedEvents=expectedEvents))
1099  else:
1100  msg.warning('maxEvents was set higher than inputEvents for {inData}: {maxEvents} > {neventsInData}. This is not an error, but it is not a normal configuration. Expected events remains {expectedEvents}.'.format(inData=inData, maxEvents=self._maxEvents, neventsInData=neventsInData, expectedEvents=expectedEvents))
1101  else:
1102  expectedEvents = self._maxEvents
1103  msg.debug('Expected number of processed events for {0} is {1}'.format(inData, expectedEvents))
1104 
1105  # Loop over output data - first find event count configuration
1106  for outData, neventsOutData in self._outEventDict.items():
1107  if not isinstance(neventsOutData, int):
1108  msg.warning('File size metadata for {outData} was not countable, found "{neventsOutData}". No event checks possible for this output data.'.format(outData=outData, neventsOutData=neventsOutData))
1109  continue
1110  if outData in self._eventCountConf[inDataKey]:
1111  checkConf = self._eventCountConf[inDataKey][outData]
1112  outDataKey = outData
1113  else:
1114  # Look for glob matches
1115  checkConf = None
1116  for outDataKey, outDataConf in self._eventCountConf[inDataKey].items():
1117  if fnmatch.fnmatch(outData, outDataKey):
1118  msg.info('Matched output data type {outData} to {outDatakey} by globbing'.format(outData=outData, outDatakey=outDataKey))
1119  outDataKey = outData
1120  checkConf = outDataConf
1121  break
1122  if not checkConf:
1123  msg.warning('No defined event count match for {inData} -> {outData}, so no check possible in this case.'.format(inData=inData, outData=outData))
1124  continue
1125  msg.debug('Event count check for {inData} to {outData} is {checkConf}'.format(inData=inData, outData=outData, checkConf=checkConf))
1126 
1127  # Do the check for thsi input/output combination
1128  if checkConf == 'match':
1129  # We need an exact match
1130  if neventsOutData == expectedEvents:
1131  msg.info("Event count check for {inData} to {outData} passed: all processed events found ({neventsOutData} output events)".format(inData=inData, outData=outData, neventsOutData=neventsOutData))
1132  else:
1133  raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1134  'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData, expectedEvents=expectedEvents))
1135  elif checkConf == 'filter':
1136  if neventsOutData <= expectedEvents and neventsOutData >= 0:
1137  msg.info("Event count check for {inData} to {outData} passed: found ({neventsOutData} output events selected from {expectedEvents} processed events)".format(inData=inData, outData=outData, neventsOutData=neventsOutData, expectedEvents=expectedEvents))
1138  else:
1139  raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1140  'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected from 0 to {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData, expectedEvents=expectedEvents))
1141  elif checkConf == 'minEff':
1142  if neventsOutData >= int(expectedEvents * self._evAccEff) and neventsOutData <= expectedEvents:
1143  msg.info("Event count check for {inData} to {outData} passed: found ({neventsOutData} output events selected from {expectedEvents} processed events)".format(inData=inData, outData=outData, neventsOutData=neventsOutData, expectedEvents=expectedEvents))
1144  else:
1145  raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1146  'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected from {minEvents} to {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData,
1147  minEvents=int(expectedEvents * self._evAccEff), expectedEvents=expectedEvents))
1148  elif isinstance(checkConf, (float, int)):
1149  checkConf = float(checkConf)
1150  if checkConf < 0.0 or checkConf > 1.0:
1151  raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1152  'Event count check for {inData} to {outData} is misconfigured: the efficiency factor of {eff} is not between 0 and 1.'.format(inData=inData, outData=outData, eff=checkConf))
1153  if neventsOutData >= int(expectedEvents * checkConf) and neventsOutData <= expectedEvents:
1154  msg.info("Event count check for {inData} to {outData} passed: found ({neventsOutData} output events selected from {expectedEvents} processed events)".format(inData=inData, outData=outData, neventsOutData=neventsOutData, expectedEvents=expectedEvents))
1155  else:
1156  raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1157  'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected from {minEvents} to {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData,
1158  minEvents=int(expectedEvents * checkConf), expectedEvents=expectedEvents))
1159  else:
1160  raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1161  'Unrecognised event count configuration for {inData} to {outData}: "{conf}" is not known'.format(inData=inData, outData=outData, conf=checkConf))
1162  self._eventCount = expectedEvents
1163  return True

◆ eventCount()

def python.trfValidation.eventMatch.eventCount (   self)

Definition at line 1000 of file trfValidation.py.

1000  def eventCount(self):
1001  return self._eventCount
1002 

Member Data Documentation

◆ _evAccEff

python.trfValidation.eventMatch._evAccEff
private

Definition at line 1014 of file trfValidation.py.

◆ _eventCount

python.trfValidation.eventMatch._eventCount
private

Definition at line 954 of file trfValidation.py.

◆ _eventCountConf

python.trfValidation.eventMatch._eventCountConf
private
Note
This double dictionary is formed of INPUT data, then a dictionary of the expected event counts from different output data types. If there is no exact match for the output datatype then globbing matches are allowed. Thus self._eventCountConf[input][output] gives the test for input -> output. The dictionary recognises the following options:
  • match : exact match of input and output events, n_in = n_out
  • filter : any event count from 0 up to input events is ok, 0 <= n_out <= n_in
  • minEff : any event count from n_in * eventAcceptanceEfficiency <= n_out <= n_in
  • float in range [0,1] : same as minEff with this efficiency factor For any case where the output events can be less than the input ones an integer conversion is applied, so the result is rounded down. i.e., 1 * 0.5 -> 0.

Definition at line 968 of file trfValidation.py.

◆ _executor

python.trfValidation.eventMatch._executor
private

Definition at line 953 of file trfValidation.py.

◆ _inEventDict

python.trfValidation.eventMatch._inEventDict
private

Definition at line 1010 of file trfValidation.py.

◆ _maxEvents

python.trfValidation.eventMatch._maxEvents
private

Definition at line 1013 of file trfValidation.py.

◆ _outEventDict

python.trfValidation.eventMatch._outEventDict
private

Definition at line 1011 of file trfValidation.py.

◆ _skipEvents

python.trfValidation.eventMatch._skipEvents
private

Definition at line 1012 of file trfValidation.py.


The documentation for this class was generated from the following file:
vtune_athena.format
format
Definition: vtune_athena.py:14
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
python.trfExeStepTools.getExecutorStepEventCounts
def getExecutorStepEventCounts(executor, argdict=None)
Definition: trfExeStepTools.py:44
TrigJetMonitorAlgorithm.items
items
Definition: TrigJetMonitorAlgorithm.py:71
python.processes.powheg.ZZ.ZZ.__init__
def __init__(self, base_directory, **kwargs)
Constructor: all process options are set here.
Definition: ZZ.py:18
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65