def run(self): while True: try: self.waiting() self.launch() self.update_runstats() except exceptions.RerunnableError as e: logger.warn("[%s] A job needs to be rerun: %s" % (self.name, e)) self.update_runstats(1) except exceptions.FatalError as e: logger.error("[%s] A fatal error occurred: %s" % (self.name, e)) os.kill(self.ppid, signal.SIGINT) except (KeyboardInterrupt, SystemExit): logger.debug("Process interrupted") except Exception as e: ex_type, ex, tb = sys.exc_info() logger.error("\n".join(traceback.format_exception(ex_type, ex, tb))) logger.error("An unhandled exception occurred") os.kill(self.ppid, signal.SIGINT)
def warn(self, msg): if logger.level() == logging.DEBUG: name = self.name else: name = self.__class__.__name__ logger.warn("%-12s| %s" % (name, msg))
def RunNewbler(self): #Code for running newbler """ Expects params keys: PE1 and PE2 and/or SE target_dir -urt """ #Check for necessary params: if not (('assembly_PE1' in self.params and 'assembly_PE2' in self.params) or 'assembly_SE' in self.params): raise exceptions.FatalError('Missing self.params in RunNewbler.') #Check for necessary files: if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params and not(os.path.exists(self.params['assembly_PE1']) or not(os.path.exists(self.params['assembly_PE2']))): raise exceptions.FatalError('Missing PE files in RunNewbler.') if 'assembly_SE' in self.params and not(os.path.exists(self.params['assembly_SE'])): raise exceptions.FatalError('Missing SE file in RunNewbler.') sample = self.params['sample'] target = self.params['target'] killed = False failed = False #determine whether to pipe output to a file or /dev/null if self.params['verbose']: out = open(os.path.join(self.params['target_dir'], "assembly.log"), 'w') else: out = open(os.devnull, 'w') #Build args for newAssembly: args = ['newAssembly', '-force'] if self.params['last_assembly'] and self.params['cdna']: #only run with cdna switch on the final assembly args += ['-cdna'] args += [os.path.join(self.params['target_dir'], 'assembly')] logger.debug("Calling newAssembly for sample: %s target %s" % (sample, target)) logger.info(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) #Build args for addRun: if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params: args = ['addRun', os.path.join(self.params['target_dir'], 'assembly')] args += [self.params['assembly_PE1']] logger.debug("Calling addRun for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) args = ['addRun', os.path.join(self.params['target_dir'], 'assembly')] args += [self.params['assembly_PE2']] logger.debug("Calling addRun for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) if 'assembly_SE' in self.params: args = ['addRun', os.path.join(self.params['target_dir'], 'assembly')] args += [self.params['assembly_SE']] logger.debug("Calling addRun for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) #Build args for runProject args = ['runProject'] args += ['-cpu', '1'] if self.params['last_assembly'] and self.params['cdna']: args += ['-noace'] else: args += ['-nobig'] if self.params['urt'] and not self.params['last_assembly']: #only run with the -urt switch when it isn't the final assembly args += ['-urt'] if self.params['rip']: args += ['-rip'] args += [os.path.join(self.params['target_dir'], 'assembly')] try: start = time.time() logger.debug("Calling runProject for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.Popen(args, stdout=out, stderr=out) pid = ret.pid while ret.poll() is None: if time.time() - start > self.params['assemblytimeout']: self.kill_process_children(pid) logger.warn("Sample: %s target: %s iteration: %s Killing assembly after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) killed = True break time.sleep(.5) except Exception as exc: txt = "Sample: %s, Target: %s: Unhandeled error running Newbler assembly" % (self.params['sample'], self.params['target']) txt += '\n\t' + str(exc) + "".join(traceback.format_exception) logger.warn(txt) failed = True pass finally: out.close() #Sometimes newbler doesn't seem to exit completely: self.kill_process_children(pid) #if ret != 0: #raise exceptions.RerunnableError("Newbler assembly failed.") if not killed and ret.poll() != 0: #raise exceptions.RerunnableError("Newbler assembly failed.") failed = True if failed: logger.info("Sample: %s target: %s iteration: %s Assembly failed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_failed\t" + str(time.time() - start)) outf.close() if killed: logger.info("Sample: %s target: %s iteration: %s Assembly killed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_killed\t" + str(time.time() - start)) outf.close() else: #Run finished without error logger.info("Sample: %s target: %s iteration: %s Assembly finished in %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_complete\t" + str(time.time() - start)) outf.close()
def RunSpades(self): """ Several arguments can be passed to spades.py: -1 [PE1], -2 [PE2], -s [SE], and -o [target_dir] """ #Check that required params are available if not (('assembly_PE1' in self.params and 'assembly_PE2' in self.params) or ('assembly_SE' in self.params)): raise exceptions.FatalError('Missing self.params in RunSpades.') #Check that the files actually exist if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params and not(os.path.exists(self.params['assembly_PE1']) or not(os.path.exists(self.params['assembly_PE2']))): raise exceptions.FatalError('Missing PE files in RunSpades.') if 'assembly_SE' in self.params and not(os.path.exists(self.params['assembly_SE'])): raise exceptions.FatalError('Missing SE file in RunSpades.') sample = self.params['sample'] target = self.params['target'] #Build args for assembler call args = ['spades.py', '-t', '1'] if self.params['only-assembler'] and not self.params['last_assembly']: args.append("--only-assembler") if self.params['format'] == 'fasta': args.append('--only-assembler') # spades errors on read correction if the input isn't fastq if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params: args += ['-1', self.params['assembly_PE1'], '-2', self.params['assembly_PE2']] if 'assembly_SE' in self.params: args += ['-s', self.params['assembly_SE']] args += ['-o', os.path.join(self.params['target_dir'], 'assembly')] if self.params['verbose']: out = open(os.path.join(self.params['target_dir'], "assembly.log"), 'w') else: out = open(os.devnull, 'w') logger.debug("Sample: %s target: %s Running spades assembler." % (sample, target)) logger.info(" ".join(args)) killed = False failed = False start = time.time() try: #ret = subprocess.call(args, stderr=out, stdout=out) ret = subprocess.Popen(args, stdout=out, stderr=out) pid = ret.pid while ret.poll() is None: if time.time() - start > self.params['assemblytimeout']: ret.kill() killed = True logger.warn("Sample: %s target: %s Assembly killed after %s seconds." % (sample, target, time.time() - start)) break time.sleep(.5) except Exception as exc: txt = ("Sample: %s, Target: %s: Unhandeled error running Spades assembly" % (sample, target)) txt += '\n\t' + str(exc) logger.warn(txt) failed = True pass finally: out.close() #Ensure that assembler exits cleanly: self.kill_process_children(pid) if not killed and ret.poll() != 0: failed = True if failed: logger.info("Sample: %s target: %s iteration: %s Assembly failed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_failed") outf.close() elif killed: logger.info("Sample: %s target: %s iteration: %s Assembly killed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_killed") outf.close() else: #Run finished without error logger.info("Sample: %s target: %s iteration: %s Assembly finished in %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_complete") outf.close()
def RunNewbler(self): #Code for running newbler """ Expects params keys: PE1 and PE2 and/or SE target_dir -urt """ #Check for necessary params: if not ( ('assembly_PE1' in self.params and 'assembly_PE2' in self.params) or 'assembly_SE' in self.params): raise exceptions.FatalError('Missing self.params in RunNewbler.') #Check for necessary files: if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params and not ( os.path.exists(self.params['assembly_PE1']) or not (os.path.exists(self.params['assembly_PE2']))): raise exceptions.FatalError('Missing PE files in RunNewbler.') if 'assembly_SE' in self.params and not (os.path.exists( self.params['assembly_SE'])): raise exceptions.FatalError('Missing SE file in RunNewbler.') sample = self.params['sample'] target = self.params['target'] killed = False failed = False #determine whether to pipe output to a file or /dev/null if self.params['verbose']: out = open(os.path.join(self.params['target_dir'], "assembly.log"), 'w') else: out = open(os.devnull, 'w') #Build args for newAssembly: args = ['newAssembly', '-force'] if self.params['last_assembly'] and self.params['cdna']: #only run with cdna switch on the final assembly args += ['-cdna'] args += [os.path.join(self.params['target_dir'], 'assembly')] logger.debug("Calling newAssembly for sample: %s target %s" % (sample, target)) logger.info(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) #Build args for addRun: if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params: args = [ 'addRun', os.path.join(self.params['target_dir'], 'assembly') ] args += [self.params['assembly_PE1']] logger.debug("Calling addRun for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) args = [ 'addRun', os.path.join(self.params['target_dir'], 'assembly') ] args += [self.params['assembly_PE2']] logger.debug("Calling addRun for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) if 'assembly_SE' in self.params: args = [ 'addRun', os.path.join(self.params['target_dir'], 'assembly') ] args += [self.params['assembly_SE']] logger.debug("Calling addRun for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.call(args, stdout=out, stderr=out) #Build args for runProject args = ['runProject'] args += ['-cpu', '1'] if self.params['last_assembly'] and self.params['cdna']: args += ['-noace'] else: args += ['-nobig'] if self.params['urt'] and not self.params['last_assembly']: #only run with the -urt switch when it isn't the final assembly args += ['-urt'] if self.params['rip']: args += ['-rip'] args += [os.path.join(self.params['target_dir'], 'assembly')] try: start = time.time() logger.debug("Calling runProject for sample: %s target %s" % (sample, target)) logger.debug(" ".join(args)) ret = subprocess.Popen(args, stdout=out, stderr=out) pid = ret.pid while ret.poll() is None: if time.time() - start > self.params['assemblytimeout']: self.kill_process_children(pid) logger.warn( "Sample: %s target: %s iteration: %s Killing assembly after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) killed = True break time.sleep(.5) except Exception as exc: txt = "Sample: %s, Target: %s: Unhandeled error running Newbler assembly" % ( self.params['sample'], self.params['target']) txt += '\n\t' + str(exc) + "".join(traceback.format_exception) logger.warn(txt) failed = True pass finally: out.close() #Sometimes newbler doesn't seem to exit completely: self.kill_process_children(pid) #if ret != 0: #raise exceptions.RerunnableError("Newbler assembly failed.") if not killed and ret.poll() != 0: #raise exceptions.RerunnableError("Newbler assembly failed.") failed = True if failed: logger.info( "Sample: %s target: %s iteration: %s Assembly failed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_failed\t" + str(time.time() - start)) outf.close() if killed: logger.info( "Sample: %s target: %s iteration: %s Assembly killed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_killed\t" + str(time.time() - start)) outf.close() else: #Run finished without error logger.info( "Sample: %s target: %s iteration: %s Assembly finished in %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_complete\t" + str(time.time() - start)) outf.close()
def RunSpades(self): """ Several arguments can be passed to spades.py: -1 [PE1], -2 [PE2], -s [SE], and -o [target_dir] """ #Check that required params are available if not (('assembly_PE1' in self.params and 'assembly_PE2' in self.params) or ('assembly_SE' in self.params)): raise exceptions.FatalError('Missing self.params in RunSpades.') #Check that the files actually exist if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params and not ( os.path.exists(self.params['assembly_PE1']) or not (os.path.exists(self.params['assembly_PE2']))): raise exceptions.FatalError('Missing PE files in RunSpades.') if 'assembly_SE' in self.params and not (os.path.exists( self.params['assembly_SE'])): raise exceptions.FatalError('Missing SE file in RunSpades.') sample = self.params['sample'] target = self.params['target'] #Build args for assembler call args = ['spades.py', '-t', '1'] if self.params['only-assembler'] and not self.params['last_assembly']: args.append("--only-assembler") if self.params['format'] == 'fasta': args.append( '--only-assembler' ) # spades errors on read correction if the input isn't fastq if 'assembly_PE1' in self.params and 'assembly_PE2' in self.params: args += [ '-1', self.params['assembly_PE1'], '-2', self.params['assembly_PE2'] ] if 'assembly_SE' in self.params: args += ['-s', self.params['assembly_SE']] args += ['-o', os.path.join(self.params['target_dir'], 'assembly')] if self.params['verbose']: out = open(os.path.join(self.params['target_dir'], "assembly.log"), 'w') else: out = open(os.devnull, 'w') logger.debug("Sample: %s target: %s Running spades assembler." % (sample, target)) logger.info(" ".join(args)) killed = False failed = False start = time.time() try: #ret = subprocess.call(args, stderr=out, stdout=out) ret = subprocess.Popen(args, stdout=out, stderr=out) pid = ret.pid while ret.poll() is None: if time.time() - start > self.params['assemblytimeout']: ret.kill() killed = True logger.warn( "Sample: %s target: %s Assembly killed after %s seconds." % (sample, target, time.time() - start)) break time.sleep(.5) except Exception as exc: txt = ( "Sample: %s, Target: %s: Unhandeled error running Spades assembly" % (sample, target)) txt += '\n\t' + str(exc) logger.warn(txt) failed = True pass finally: out.close() #Ensure that assembler exits cleanly: self.kill_process_children(pid) if not killed and ret.poll() != 0: failed = True if failed: logger.info( "Sample: %s target: %s iteration: %s Assembly failed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_failed") outf.close() elif killed: logger.info( "Sample: %s target: %s iteration: %s Assembly killed after %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_killed") outf.close() else: #Run finished without error logger.info( "Sample: %s target: %s iteration: %s Assembly finished in %s seconds" % (sample, target, self.params['iteration'], time.time() - start)) outf = open(os.path.join(self.params['target_dir'], "finished"), 'w') outf.write("assembly_complete") outf.close()