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 Types

typedef HLT::TypeInformation::for_each_type_c< typenameEDMLIST::map, my_functor, my_result<>, my_arg< HLT::TypeInformation::get_cont, CONTAINER > >::type result

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

Member Typedef Documentation

◆ result

Definition at line 90 of file EDM_MasterSearch.h.

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 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", "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()

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()

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()

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 = override['evAccEff']
protected

Definition at line 1014 of file trfValidation.py.

◆ _eventCount

python.trfValidation.eventMatch._eventCount = None
protected

Definition at line 954 of file trfValidation.py.

◆ _eventCountConf

python.trfValidation.eventMatch._eventCountConf = {}
protected

Definition at line 968 of file trfValidation.py.

◆ _executor

python.trfValidation.eventMatch._executor = executor
protected

Definition at line 953 of file trfValidation.py.

◆ _inEventDict

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

Definition at line 1010 of file trfValidation.py.

◆ _maxEvents

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

Definition at line 1013 of file trfValidation.py.

◆ _outEventDict

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

Definition at line 1011 of file trfValidation.py.

◆ _skipEvents

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

Definition at line 1012 of file trfValidation.py.


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