ATLAS Offline Software
Loading...
Searching...
No Matches
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

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

Protected Attributes

 _executor = executor
 _eventCount = None
dict _eventCountConf = {}
dict _inEventDict = override['inEventDict']
dict _outEventDict = override['outEventDict']
 _skipEvents = override['skipEvents']
int _maxEvents = override['maxEvents']
float _evAccEff = override['evAccEff']

Detailed Description

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

Definition at line 908 of file trfValidation.py.

Constructor & Destructor Documentation

◆ __init__()

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

c executor eventCountConf instance for this check

Parameters

c eventCountConf dictionary to replace or append to default, see code for details

Parameters

c eventCountConfOver write Replace rather than append eventCountConf (Default: False) Takes efficiencies into account. All data is taken from _trf dict

Definition at line 917 of file trfValidation.py.

917 def __init__(self, executor, eventCountConf=None, eventCountConfOverwrite=False):
918 self._executor = executor
919 self._eventCount = None
920
921
932 simEventEff = 0.995
933 self._eventCountConf = {}
934 self._eventCountConf['EVNT'] = {'EVNT_MRG':"match", "HITS": simEventEff, "EVNT_TR": "filter", "DAOD_TRUTH*" : "match"}
935 self._eventCountConf['EVNT_TR'] = {'HITS': simEventEff}
936 self._eventCountConf['HITS'] = {'RDO':"match", 'HITS_RSM': simEventEff, "HITS_MRG":"match", 'HITS_FILT': simEventEff, "RDO_FILT": "filter", "DAOD_TRUTH*" : "match", "HIST_SIM" : "match"}
937 self._eventCountConf['BS'] = {'ESD': "match", 'DRAW_*':"filter", 'NTUP_*':"filter", "BS_MRG":"match", 'DESD*': "filter", 'AOD':"match", 'DAOD*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
938 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"}
939 self._eventCountConf['ESD'] = {'ESD_MRG': "match", 'AOD':"match", 'DESD*':"filter", 'DAOD_*':"filter", 'NTUP_*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
940 self._eventCountConf['AOD'] = {'AOD_MRG' : "match", 'TAG':"match", "NTUP_*":"filter", "DAOD_*":"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
941 self._eventCountConf['AOD_MRG'] = {'TAG':"match"}
942 self._eventCountConf['DAOD_*'] = {'DAOD_*_MRG' : "match"}
943 self._eventCountConf['TAG'] = {'TAG_MRG': "match"}
944 self._eventCountConf['HIST'] = {'HIST_MRG': "match"}
945 self._eventCountConf['NTUP_COMMON'] = {'DNTUP*': "filter"}
946 self._eventCountConf['NTUP_*'] = {'NTUP_*_MRG': "match"}
947 # Next one comprises special data type names for smart merging of AthenaMP worker outputs
948 self._eventCountConf['POOL_MRG_INPUT'] = {'POOL_MRG_OUTPUT': "match"}
949
950
951 if eventCountConf:
952 if eventCountConfOverwrite is True:
953 self._eventCountConf = eventCountConf
954 else:
955 self._eventCountConf.update(eventCountConf)
956
957 msg.debug('Event count check configuration is: {0}'.format(self._eventCountConf))
958 if hasattr(self._executor, 'name'):
959 msg.debug('Event count check ready for executor {0}'.format(self._executor.name))
960
961 if self._executor is not None:
962 self.configureCheck(override=False)
963

Member Function Documentation

◆ configureCheck()

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 972 of file trfValidation.py.

972 def configureCheck(self, override=False):
973 if override:
974 msg.info('Overriding check configuration with: {0}'.format(override))
975 self._inEventDict = override['inEventDict']
976 self._outEventDict = override['outEventDict']
977 self._skipEvents = override['skipEvents']
978 self._maxEvents = override['maxEvents']
979 self._evAccEff = override['evAccEff']
980 else:
981 # Input data from executor
982 self._inEventDict = {}
983 for dataTypeName in self._executor.input:
984 try:
985 self._inEventDict[dataTypeName] = self._executor.conf.dataDictionary[dataTypeName].nentries
986 msg.debug('Input data type {0} has {1} events'.format(dataTypeName, self._inEventDict[dataTypeName]))
987 except KeyError:
988 msg.warning('Found no dataDictionary entry for input data type {0}'.format(dataTypeName))
989
990 # Output data from executor
991 self._outEventDict = {}
992 for dataTypeName in self._executor.output:
993 try:
994 self._outEventDict[dataTypeName] = self._executor.conf.dataDictionary[dataTypeName].nentries
995 msg.debug('Output data type {0} has {1} events'.format(dataTypeName, self._outEventDict[dataTypeName]))
996 except KeyError:
997 msg.warning('Found no dataDictionary entry for output data type {0}'.format(dataTypeName))
998
999 # Find if we have a skipEvents applied
1000 if "skipEvents" in self._executor.conf.argdict:
1001 self._skipEvents = self._executor.conf.argdict['skipEvents'].returnMyValue(exe=self._executor)
1002 else:
1003 self._skipEvents = None
1004
1005 # Find if we have a maxEvents applied
1006 if "maxEvents" in self._executor.conf.argdict:
1007 self._maxEvents = self._executor.conf.argdict['maxEvents'].returnMyValue(exe=self._executor)
1008 if self._maxEvents == -1:
1009 self._maxEvents = None
1010 else:
1011 self._maxEvents = None
1012
1013 # Executor substeps handling
1014 if self._executor.conf.totalExecutorSteps > 1 and self._executor.conf.executorStep < self._executor.conf.totalExecutorSteps - 1:
1015 executorEventCounts, executorEventSkips = getExecutorStepEventCounts(self._executor)
1016 self._maxEvents = executorEventCounts[self._executor.conf.executorStep]
1017 self._skipEvents = executorEventSkips[self._executor.conf.executorStep]
1018
1019 # Global eventAcceptanceEfficiency set?
1020 if "eventAcceptanceEfficiency" in self._executor.conf.argdict:
1021 self._evAccEff = self._executor.conf.argdict['eventAcceptanceEfficiency'].returnMyValue(exe=self._executor)
1022 if (self._evAccEff is None):
1023 self._evAccEff = 0.99
1024 else:
1025 self._evAccEff = 0.99
1026
1027 msg.debug("Event check conf: {0} {1}, {2}, {3}, {4}".format(self._inEventDict, self._outEventDict, self._skipEvents,
1028 self._maxEvents, self._evAccEff))
1029
1030

◆ decide()

python.trfValidation.eventMatch.decide ( self)

Perform an event count check.

Definition at line 1032 of file trfValidation.py.

1032 def decide(self):
1033 # We have all that we need to proceed: input and output data, skip and max events plus any efficiency factor
1034 # So loop over the input and output data and make our checks
1035 for inData, neventsInData in self._inEventDict.items():
1036 if not isinstance(neventsInData, int):
1037 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))
1038 continue
1039 if inData in self._eventCountConf:
1040 inDataKey = inData
1041 else:
1042 # OK, try a glob match in this case (YMMV)
1043 matchedInData = False
1044 for inDataKey in self._eventCountConf:
1045 if fnmatch.fnmatch(inData, inDataKey):
1046 msg.info("Matched input data type {inData} to {inDataKey} by globbing".format(inData=inData, inDataKey=inDataKey))
1047 matchedInData = True
1048 break
1049 if not matchedInData:
1050 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)))
1051 continue
1052
1053 # Now calculate the expected number of processed events for this input
1054 expectedEvents = neventsInData
1055 if self._skipEvents is not None and self._skipEvents > 0:
1056 expectedEvents -= self._skipEvents
1057 if expectedEvents < 0:
1058 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))
1059 expectedEvents = 0
1060 if self._maxEvents is not None:
1061 if expectedEvents < self._maxEvents:
1062 if self._skipEvents is not None:
1063 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))
1064 else:
1065 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))
1066 else:
1067 expectedEvents = self._maxEvents
1068 msg.debug('Expected number of processed events for {0} is {1}'.format(inData, expectedEvents))
1069
1070 # Loop over output data - first find event count configuration
1071 for outData, neventsOutData in self._outEventDict.items():
1072 if not isinstance(neventsOutData, int):
1073 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))
1074 continue
1075 if outData in self._eventCountConf[inDataKey]:
1076 checkConf = self._eventCountConf[inDataKey][outData]
1077 outDataKey = outData
1078 else:
1079 # Look for glob matches
1080 checkConf = None
1081 for outDataKey, outDataConf in self._eventCountConf[inDataKey].items():
1082 if fnmatch.fnmatch(outData, outDataKey):
1083 msg.info('Matched output data type {outData} to {outDatakey} by globbing'.format(outData=outData, outDatakey=outDataKey))
1084 outDataKey = outData
1085 checkConf = outDataConf
1086 break
1087 if not checkConf:
1088 msg.warning('No defined event count match for {inData} -> {outData}, so no check possible in this case.'.format(inData=inData, outData=outData))
1089 continue
1090 msg.debug('Event count check for {inData} to {outData} is {checkConf}'.format(inData=inData, outData=outData, checkConf=checkConf))
1091
1092 # Do the check for thsi input/output combination
1093 if checkConf == 'match':
1094 # We need an exact match
1095 if neventsOutData == expectedEvents:
1096 msg.info("Event count check for {inData} to {outData} passed: all processed events found ({neventsOutData} output events)".format(inData=inData, outData=outData, neventsOutData=neventsOutData))
1097 else:
1098 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1099 'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData, expectedEvents=expectedEvents))
1100 elif checkConf == 'filter':
1101 if neventsOutData <= expectedEvents and neventsOutData >= 0:
1102 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))
1103 else:
1104 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1105 '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))
1106 elif checkConf == 'minEff':
1107 if neventsOutData >= int(expectedEvents * self._evAccEff) and neventsOutData <= expectedEvents:
1108 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))
1109 else:
1110 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1111 'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected from {minEvents} to {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData,
1112 minEvents=int(expectedEvents * self._evAccEff), expectedEvents=expectedEvents))
1113 elif isinstance(checkConf, (float, int)):
1114 checkConf = float(checkConf)
1115 if checkConf < 0.0 or checkConf > 1.0:
1116 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1117 '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))
1118 if neventsOutData >= int(expectedEvents * checkConf) and neventsOutData <= expectedEvents:
1119 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))
1120 else:
1121 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1122 'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected from {minEvents} to {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData,
1123 minEvents=int(expectedEvents * checkConf), expectedEvents=expectedEvents))
1124 else:
1125 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1126 'Unrecognised event count configuration for {inData} to {outData}: "{conf}" is not known'.format(inData=inData, outData=outData, conf=checkConf))
1127 self._eventCount = expectedEvents
1128 return True

◆ eventCount()

python.trfValidation.eventMatch.eventCount ( self)

Definition at line 965 of file trfValidation.py.

965 def eventCount(self):
966 return self._eventCount
967

Member Data Documentation

◆ _evAccEff

python.trfValidation.eventMatch._evAccEff = override['evAccEff']
protected

Definition at line 979 of file trfValidation.py.

◆ _eventCount

python.trfValidation.eventMatch._eventCount = None
protected

Definition at line 919 of file trfValidation.py.

◆ _eventCountConf

python.trfValidation.eventMatch._eventCountConf = {}
protected

Definition at line 933 of file trfValidation.py.

◆ _executor

python.trfValidation.eventMatch._executor = executor
protected

Definition at line 918 of file trfValidation.py.

◆ _inEventDict

python.trfValidation.eventMatch._inEventDict = override['inEventDict']
protected

Definition at line 975 of file trfValidation.py.

◆ _maxEvents

python.trfValidation.eventMatch._maxEvents = override['maxEvents']
protected

Definition at line 978 of file trfValidation.py.

◆ _outEventDict

python.trfValidation.eventMatch._outEventDict = override['outEventDict']
protected

Definition at line 976 of file trfValidation.py.

◆ _skipEvents

python.trfValidation.eventMatch._skipEvents = override['skipEvents']
protected

Definition at line 977 of file trfValidation.py.


The documentation for this class was generated from the following file: