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

984 def __init__(self, executor, eventCountConf=None, eventCountConfOverwrite=False):
985 self._executor = executor
986 self._eventCount = None
987
988
999 simEventEff = 0.995
1000 self._eventCountConf = {}
1001 self._eventCountConf['EVNT'] = {'EVNT_MRG':"match", "HITS": simEventEff, "EVNT_TR": "filter", "DAOD_TRUTH*" : "match"}
1002 self._eventCountConf['EVNT_TR'] = {'HITS': simEventEff}
1003 self._eventCountConf['HITS'] = {'RDO':"match", 'HITS_RSM': simEventEff, "HITS_MRG":"match", 'HITS_FILT': simEventEff, "RDO_FILT": "filter", "DAOD_TRUTH*" : "match", "HIST_SIM" : "match"}
1004 self._eventCountConf['BS'] = {'ESD': "match", 'DRAW_*':"filter", 'NTUP_*':"filter", "BS_MRG":"match", 'DESD*': "filter", 'AOD':"match", 'DAOD*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
1005 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"}
1006 self._eventCountConf['ESD'] = {'ESD_MRG': "match", 'AOD':"match", 'DESD*':"filter", 'DAOD_*':"filter", 'NTUP_*':"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
1007 self._eventCountConf['AOD'] = {'AOD_MRG' : "match", 'TAG':"match", "NTUP_*":"filter", "DAOD_*":"filter", "DAOD_PHYS":"match", "DAOD_PHYSLITE":"match"}
1008 self._eventCountConf['AOD_MRG'] = {'TAG':"match"}
1009 self._eventCountConf['DAOD_*'] = {'DAOD_*_MRG' : "match"}
1010 self._eventCountConf['TAG'] = {'TAG_MRG': "match"}
1011 self._eventCountConf['HIST'] = {'HIST_MRG': "match"}
1012 self._eventCountConf['NTUP_COMMON'] = {'DNTUP*': "filter"}
1013 self._eventCountConf['NTUP_*'] = {'NTUP_*_MRG': "match"}
1014 # Next one comprises special data type names for smart merging of AthenaMP worker outputs
1015 self._eventCountConf['POOL_MRG_INPUT'] = {'POOL_MRG_OUTPUT': "match"}
1016
1017
1018 if eventCountConf:
1019 if eventCountConfOverwrite is True:
1020 self._eventCountConf = eventCountConf
1021 else:
1022 self._eventCountConf.update(eventCountConf)
1023
1024 msg.debug('Event count check configuration is: {0}'.format(self._eventCountConf))
1025 if hasattr(self._executor, 'name'):
1026 msg.debug('Event count check ready for executor {0}'.format(self._executor.name))
1027
1028 if self._executor is not None:
1029 self.configureCheck(override=False)
1030

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

1039 def configureCheck(self, override=False):
1040 if override:
1041 msg.info('Overriding check configuration with: {0}'.format(override))
1042 self._inEventDict = override['inEventDict']
1043 self._outEventDict = override['outEventDict']
1044 self._skipEvents = override['skipEvents']
1045 self._maxEvents = override['maxEvents']
1046 self._evAccEff = override['evAccEff']
1047 else:
1048 # Input data from executor
1049 self._inEventDict = {}
1050 for dataTypeName in self._executor.input:
1051 try:
1052 self._inEventDict[dataTypeName] = self._executor.conf.dataDictionary[dataTypeName].nentries
1053 msg.debug('Input data type {0} has {1} events'.format(dataTypeName, self._inEventDict[dataTypeName]))
1054 except KeyError:
1055 msg.warning('Found no dataDictionary entry for input data type {0}'.format(dataTypeName))
1056
1057 # Output data from executor
1058 self._outEventDict = {}
1059 for dataTypeName in self._executor.output:
1060 try:
1061 self._outEventDict[dataTypeName] = self._executor.conf.dataDictionary[dataTypeName].nentries
1062 msg.debug('Output data type {0} has {1} events'.format(dataTypeName, self._outEventDict[dataTypeName]))
1063 except KeyError:
1064 msg.warning('Found no dataDictionary entry for output data type {0}'.format(dataTypeName))
1065
1066 # Find if we have a skipEvents applied
1067 if "skipEvents" in self._executor.conf.argdict:
1068 self._skipEvents = self._executor.conf.argdict['skipEvents'].returnMyValue(exe=self._executor)
1069 else:
1070 self._skipEvents = None
1071
1072 # Find if we have a maxEvents applied
1073 if "maxEvents" in self._executor.conf.argdict:
1074 self._maxEvents = self._executor.conf.argdict['maxEvents'].returnMyValue(exe=self._executor)
1075 if self._maxEvents == -1:
1076 self._maxEvents = None
1077 else:
1078 self._maxEvents = None
1079
1080 # Executor substeps handling
1081 if self._executor.conf.totalExecutorSteps > 1 and self._executor.conf.executorStep < self._executor.conf.totalExecutorSteps - 1:
1082 executorEventCounts, executorEventSkips = getExecutorStepEventCounts(self._executor)
1083 self._maxEvents = executorEventCounts[self._executor.conf.executorStep]
1084 self._skipEvents = executorEventSkips[self._executor.conf.executorStep]
1085
1086 # Global eventAcceptanceEfficiency set?
1087 if "eventAcceptanceEfficiency" in self._executor.conf.argdict:
1088 self._evAccEff = self._executor.conf.argdict['eventAcceptanceEfficiency'].returnMyValue(exe=self._executor)
1089 if (self._evAccEff is None):
1090 self._evAccEff = 0.99
1091 else:
1092 self._evAccEff = 0.99
1093
1094 msg.debug("Event check conf: {0} {1}, {2}, {3}, {4}".format(self._inEventDict, self._outEventDict, self._skipEvents,
1095 self._maxEvents, self._evAccEff))
1096
1097

◆ decide()

python.trfValidation.eventMatch.decide ( self)

Perform an event count check.

Definition at line 1099 of file trfValidation.py.

1099 def decide(self):
1100 # We have all that we need to proceed: input and output data, skip and max events plus any efficiency factor
1101 # So loop over the input and output data and make our checks
1102 for inData, neventsInData in self._inEventDict.items():
1103 if not isinstance(neventsInData, int):
1104 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))
1105 continue
1106 if inData in self._eventCountConf:
1107 inDataKey = inData
1108 else:
1109 # OK, try a glob match in this case (YMMV)
1110 matchedInData = False
1111 for inDataKey in self._eventCountConf:
1112 if fnmatch.fnmatch(inData, inDataKey):
1113 msg.info("Matched input data type {inData} to {inDataKey} by globbing".format(inData=inData, inDataKey=inDataKey))
1114 matchedInData = True
1115 break
1116 if not matchedInData:
1117 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)))
1118 continue
1119
1120 # Now calculate the expected number of processed events for this input
1121 expectedEvents = neventsInData
1122 if self._skipEvents is not None and self._skipEvents > 0:
1123 expectedEvents -= self._skipEvents
1124 if expectedEvents < 0:
1125 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))
1126 expectedEvents = 0
1127 if self._maxEvents is not None:
1128 if expectedEvents < self._maxEvents:
1129 if self._skipEvents is not None:
1130 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))
1131 else:
1132 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))
1133 else:
1134 expectedEvents = self._maxEvents
1135 msg.debug('Expected number of processed events for {0} is {1}'.format(inData, expectedEvents))
1136
1137 # Loop over output data - first find event count configuration
1138 for outData, neventsOutData in self._outEventDict.items():
1139 if not isinstance(neventsOutData, int):
1140 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))
1141 continue
1142 if outData in self._eventCountConf[inDataKey]:
1143 checkConf = self._eventCountConf[inDataKey][outData]
1144 outDataKey = outData
1145 else:
1146 # Look for glob matches
1147 checkConf = None
1148 for outDataKey, outDataConf in self._eventCountConf[inDataKey].items():
1149 if fnmatch.fnmatch(outData, outDataKey):
1150 msg.info('Matched output data type {outData} to {outDatakey} by globbing'.format(outData=outData, outDatakey=outDataKey))
1151 outDataKey = outData
1152 checkConf = outDataConf
1153 break
1154 if not checkConf:
1155 msg.warning('No defined event count match for {inData} -> {outData}, so no check possible in this case.'.format(inData=inData, outData=outData))
1156 continue
1157 msg.debug('Event count check for {inData} to {outData} is {checkConf}'.format(inData=inData, outData=outData, checkConf=checkConf))
1158
1159 # Do the check for thsi input/output combination
1160 if checkConf == 'match':
1161 # We need an exact match
1162 if neventsOutData == expectedEvents:
1163 msg.info("Event count check for {inData} to {outData} passed: all processed events found ({neventsOutData} output events)".format(inData=inData, outData=outData, neventsOutData=neventsOutData))
1164 else:
1165 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1166 'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData, expectedEvents=expectedEvents))
1167 elif checkConf == 'filter':
1168 if neventsOutData <= expectedEvents and neventsOutData >= 0:
1169 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))
1170 else:
1171 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1172 '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))
1173 elif checkConf == 'minEff':
1174 if neventsOutData >= int(expectedEvents * self._evAccEff) and neventsOutData <= expectedEvents:
1175 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))
1176 else:
1177 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1178 'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected from {minEvents} to {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData,
1179 minEvents=int(expectedEvents * self._evAccEff), expectedEvents=expectedEvents))
1180 elif isinstance(checkConf, (float, int)):
1181 checkConf = float(checkConf)
1182 if checkConf < 0.0 or checkConf > 1.0:
1183 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1184 '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))
1185 if neventsOutData >= int(expectedEvents * checkConf) and neventsOutData <= expectedEvents:
1186 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))
1187 else:
1188 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1189 'Event count check for {inData} to {outData} failed: found {neventsOutData} events, expected from {minEvents} to {expectedEvents}'.format(inData=inData, outData=outData, neventsOutData=neventsOutData,
1190 minEvents=int(expectedEvents * checkConf), expectedEvents=expectedEvents))
1191 else:
1192 raise trfExceptions.TransformValidationException(trfExit.nameToCode('TRF_EXEC_VALIDATION_EVENTCOUNT'),
1193 'Unrecognised event count configuration for {inData} to {outData}: "{conf}" is not known'.format(inData=inData, outData=outData, conf=checkConf))
1194 self._eventCount = expectedEvents
1195 return True

◆ eventCount()

python.trfValidation.eventMatch.eventCount ( self)

Definition at line 1032 of file trfValidation.py.

1032 def eventCount(self):
1033 return self._eventCount
1034

Member Data Documentation

◆ _evAccEff

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

Definition at line 1046 of file trfValidation.py.

◆ _eventCount

python.trfValidation.eventMatch._eventCount = None
protected

Definition at line 986 of file trfValidation.py.

◆ _eventCountConf

python.trfValidation.eventMatch._eventCountConf = {}
protected

Definition at line 1000 of file trfValidation.py.

◆ _executor

python.trfValidation.eventMatch._executor = executor
protected

Definition at line 985 of file trfValidation.py.

◆ _inEventDict

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

Definition at line 1042 of file trfValidation.py.

◆ _maxEvents

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

Definition at line 1045 of file trfValidation.py.

◆ _outEventDict

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

Definition at line 1043 of file trfValidation.py.

◆ _skipEvents

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

Definition at line 1044 of file trfValidation.py.


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