from Ganga.GPIDev.Base import GangaObject from Ganga.GPIDev.Adapters.IPostProcessor import PostProcessException, IPostProcessor from Ganga.GPIDev.Base.Proxy import GPIProxyObject from Ganga.GPIDev.Schema import ComponentItem, FileItem, Schema, SimpleItem, Version from Ganga.Utility.Config import makeConfig, ConfigError, getConfig from Ganga.Utility.Plugin import allPlugins from Ganga.Utility.logging import getLogger, log_user_exception import commands import copy import os import string import re class TbFileChecker(IPostProcessor): _schema = IPostProcessor._schema.inherit_copy() _schema.datadict["alignment"] = SimpleItem(False) _schema.datadict["resubmit"] = SimpleItem(False) #resubmit items with no output in the errorsummary _category = 'postprocessor' _name = 'TbFileChecker' _exportmethods = ['check','ErrorSummary'] def check(self,job): job_objects = [] if len( job.subjobs ) != 0: for j in job.subjobs: job_objects.append(j) else: job_objects.append( job ) result = True for j in job_objects: job_success = False filepath = "%s/stdout" %(j.outputdir) #print "Checking %d subjobs " %( len(job_objects ) ) if j.status != "completed": continue if self.alignment: if not os.path.isfile( j.outputdir + "Alignment_out.dat" ): job_success = False j.force_status('failed') continue if not os.path.isfile( filepath ): continue f = reversed( open(filepath,'r').readlines() ) for line in f: if re.search("ApplicationMgr INFO Application Manager Finalized successfully",line): job_success = True break if job_success: j.force_status('completed') else : j.force_status('failed') result = result*job_success return result def ErrorSummary(self,job): job_objects = [] minuit_exceptions = ["MATRIX","DERIVATIVE","VALUE"] millepede_exceptions = ["Initial","Negative","diagonal"] for j in job.subjobs: if j.status == 'failed': job_objects.append(j) for j in job_objects: filepath = "%s/stdout" %(j.outputdir) error = "Unknown" if os.path.isfile( filepath ): for line in open(filepath,'r').readlines(): if re.search("ERROR",line): found = False for e in minuit_exceptions: if re.search(e,line): found = True break if found : continue error = line[:-1] break if re.search("error",line): found = False for e in millepede_exceptions: if re.search(e,line): found = True break if found : continue error = line[:-1] break if re.search("Error",line): found = False for e in millepede_exceptions: if re.search(e,line): found = True break if found : continue error = line[:-1] break else: error = "No output files" if self.resubmit: j.resubmit() print "%s (%d.%3d) : %s" %( j.name, job.id, j.id, error )