140 def python(self, fast = False, fileReport = defaultFileReport):
141 myDict = {'name': self._trf.name,
142 'reportVersion': self._reportVersion,
143 'cmdLine': ' '.join(shQuoteStrings(sys.argv)),
144 'exitAcronym': trfExit.codeToName(self._trf.exitCode),
145 'exitCode': self._trf.exitCode,
146 'created': isodate(),
147 'resource': {'executor': {}, 'transform': {}},
148 'files': {}
149 }
150 if len(self._trf.exitMsg) > self._maxMsgLen:
151 myDict['exitMsg'] = self._trf.exitMsg[:self._maxMsgLen-len(self._truncationMsg)] + self._truncationMsg
152 myDict['exitMsgExtra'] = self._trf.exitMsg[self._maxMsgLen-len(self._truncationMsg):]
153 else:
154 myDict['exitMsg'] = self._trf.exitMsg
155 myDict['exitMsgExtra'] = ""
156
157
158 for fileType in ('input', 'output', 'temporary'):
159 if fileReport[fileType]:
160 myDict['files'][fileType] = []
161
162 for dataType, dataArg in self._trf._dataDictionary.items():
163 if isinstance(dataArg, list):
164 continue
165 if dataArg.auxiliaryFile:
166 continue
167 if fileReport[dataArg.io]:
168 entry = {"type": dataType}
169 entry.update(trfFileReport(dataArg).
python(fast = fast, type = fileReport[dataArg.io]))
170
171 if 'subFiles' in entry and len(entry['subFiles']) == 0 and isinstance(dataArg, trfArgClasses.argBSFile) :
172 msg.info('No subFiles for entry {0}, suppressing from report.'.format(entry['argName']))
173 else:
174 myDict['files'][dataArg.io].append(entry)
175
176
177 myDict['executor'] = []
178 if hasattr(self._trf, '_executorPath'):
179 for executionStep in self._trf._executorPath:
180 exe = self._trf._executorDictionary[executionStep['name']]
181 myDict[
'executor'].append(trfExecutorReport(exe).
python(fast = fast))
182
183
184 myDict['resource']['executor'][exe.name] = exeResourceReport(exe, self)
185 for mergeStep in exe.myMerger:
186 myDict['resource']['executor'][mergeStep.name] = exeResourceReport(mergeStep, self)
187 if self._dbDataTotal > 0 or self._dbTimeTotal > 0:
188 myDict['resource']['dbDataTotal'] = self._dbDataTotal
189 myDict['resource']['dbTimeTotal'] = self.roundoff(self._dbTimeTotal)
190
191 reportTime = os.times()
192
193
194 myCpuTime = reportTime[0] + reportTime[1]
195 childCpuTime = reportTime[2] + reportTime[3]
196 wallTime = reportTime[4] - self._trf.transformStart[4]
197 cpuTime = myCpuTime
198 cpuTimeTotal = 0
199 cpuTimePerWorker = myCpuTime
200 maxWorkers = 1
201 msg.debug('Raw cpu resource consumption: transform {0}, children {1}'.format(myCpuTime, childCpuTime))
202
203 for exeName, exeReport in myDict['resource']['executor'].items():
204 if 'mpworkers' in exeReport:
205 if exeReport['mpworkers'] > maxWorkers : maxWorkers = exeReport['mpworkers']
206 try:
207 msg.debug('Subtracting {0}s time for executor {1}'.format(exeReport['cpuTime'], exeName))
208 childCpuTime -= exeReport['cpuTime']
209 except TypeError:
210 pass
211 try:
212 cpuTime += exeReport['cpuTime']
213 cpuTimeTotal += exeReport['total']['cpuTime']
214 if 'cpuTimePerWorker' in exeReport:
215 msg.debug('Adding {0}s to cpuTimePerWorker'.format(exeReport['cpuTimePerWorker']))
216 cpuTimePerWorker += exeReport['cpuTimePerWorker']
217 else:
218 msg.debug('Adding nonMP cpuTime {0}s to cpuTimePerWorker'.format(exeReport['cpuTime']))
219 cpuTimePerWorker += exeReport['cpuTime']
220 except TypeError:
221 pass
222
223 msg.debug('maxWorkers: {0}, cpuTimeTotal: {1}, cpuTimePerWorker: {2}'.format(maxWorkers, cpuTime, cpuTimePerWorker))
224 reportGenerationCpuTime = reportGenerationWallTime = None
225 if self._trf.outFileValidationStop and reportTime:
226 reportGenerationCpuTime = calcCpuTime(self._trf.outFileValidationStop, reportTime)
227 reportGenerationWallTime = calcWallTime(self._trf.outFileValidationStop, reportTime)
228
229 myDict['resource']['transform'] = {'cpuTime': self.roundoff(myCpuTime),
230 'cpuTimeTotal': self.roundoff(cpuTimeTotal),
231 'externalCpuTime': self.roundoff(childCpuTime),
232 'wallTime': self.roundoff(wallTime),
233 'transformSetup': {'cpuTime': self.roundoff(self._trf.transformSetupCpuTime),
234 'wallTime': self.roundoff(self._trf.transformSetupWallTime)},
235 'inFileValidation': {'cpuTime': self.roundoff(self._trf.inFileValidationCpuTime),
236 'wallTime': self.roundoff(self._trf.inFileValidationWallTime)},
237 'outFileValidation': {'cpuTime': self.roundoff(self._trf.outFileValidationCpuTime),
238 'wallTime': self.roundoff(self._trf.outFileValidationWallTime)},
239 'reportGeneration': {'cpuTime': self.roundoff(reportGenerationCpuTime),
240 'wallTime': self.roundoff(reportGenerationWallTime)}, }
241 if self._trf.processedEvents:
242 myDict['resource']['transform']['processedEvents'] = self._trf.processedEvents
243 myDict['resource']['transform']['trfPredata'] = self._trf.trfPredata
244
245 if wallTime > 0:
246 myDict['resource']['transform']['cpuEfficiency'] = round(cpuTime/maxWorkers/wallTime, 4)
247 myDict['resource']['transform']['cpuPWEfficiency'] = round(cpuTimePerWorker/wallTime, 4)
248 myDict[
'resource'][
'machine'] = machineReport().
python(fast = fast)
249
250 return myDict
251