diff --git a/tools/rgenetics/rgWebLogo3.py b/tools/rgenetics/rgWebLogo3.py new file mode 100644 index 00000000000..0dbf91fc78a --- /dev/null +++ b/tools/rgenetics/rgWebLogo3.py @@ -0,0 +1,130 @@ +""" +# rgWebLogo3.py +# wrapper to check that all fasta files are same length + +""" +import optparse, os, sys, subprocess, tempfile + +class WL3: + """ + simple wrapper class to check fasta sequence lengths are all identical + """ + FASTASTARTSYM = '>' + badseq = '## error - sequences in file %s are not all the same length - cannot proceed. Please read the tool documentation carefully' + + def __init__(self,opts=None): + assert opts<>None,'WL3 class needs opts passed in - got None' + self.opts = opts + self.fastaf = file(self.opts.input,'r') + self.clparams = {} + + def runCL(self): + """ construct and run a command line + """ + cll = ['weblogo',] + cll += [' '.join(it) for it in list(self.clparams.items())] + cl = ' '.join(cll) + assert cl > '', 'runCL needs a command line as clparms' + fd,templog = tempfile.mkstemp(suffix='rgtempRun.txt') + tlf = open(templog,'w') + process = subprocess.Popen(cl, shell=True, stderr=tlf, stdout=tlf) + rval = process.wait() + tlf.close() + tlogs = ''.join(open(templog,'r').readlines()) + if len(tlogs) > 1: + s = '## executing %s returned status %d and log (stdout/stderr) records: \n%s\n' % (cl,rval,tlogs) + else: + s = '## executing %s returned status %d. Nothing appeared on stderr/stdout\n' % (cl,rval) + os.unlink(templog) # always + return s + + + def iter_fasta(self): + """ + generator for fasta sequences from a file + """ + aseq = [] + seqname = None + for i,row in enumerate(self.fastaf): + if row.startswith(self.FASTASTARTSYM): + if seqname <> None: # already in a sequence + s = ''.join(aseq) + l = len(s) + yield (seqname,l) + seqname = row[1:].strip() + aseq = [] + else: + if i > 0: + print >> sys.stderr,'Invalid fasta file %s - does not start with %s' % (ffile,self.FASTASTARTSYM) + sys.exit(1) + else: + seqname = row[1:].strip() + else: + aseq.append(row.strip()) + if seqname <> None: # last one + l = len(''.join(aseq)) + yield (seqname,l) + + + def fcheck(self): + """ are all fasta sequence same length? + might be mongo big + """ + flen = None + lasti = None + f = self.iter_fasta() + for i,(seqname,seqlen) in enumerate(f): + lasti = i + if i == 0: + flen = seqlen + else: + if seqlen <> flen: + print >> sys.stderr,self.badseq % self.opts.input + sys.exit(1) + return '# weblogo input %s has %d sequences all of length %d' % (self.opts.input,lasti,flen) + + + def run(self): + check = self.fcheck() + self.clparams['-f'] = self.opts.input + self.clparams['-o'] = self.opts.output + self.clparams['-t'] = '"%s"' % self.opts.logoname # must be wrapped as a string + self.clparams['-F'] = self.opts.outformat + if self.opts.size <> None: + self.clparams['-s'] = self.opts.size + if self.opts.lower <> None: + self.clparams['-l'] = self.opts.lower + if self.opts.upper <> None: + self.clparams['-u'] = self.opts.upper + if self.opts.colours <> None: + self.clparams['-c'] = self.opts.colours + s = self.runCL() + return check,s + + +if __name__ == '__main__': + ''' + called as + + rgWebLogo3.py --outformat $outformat -s $size -i $input -o $output -t "$logoname" -c "$colours" +#if $range.mode == 'part' +-l "$range.seqstart" -u "$range.seqend" +#end if + + + ''' + op = optparse.OptionParser() + op.add_option('-i', '--input', default=None) + op.add_option('-F', '--outformat', default='png') + op.add_option('-s', '--size', default=None) + op.add_option('-o', '--output', default='rgWebLogo3') + op.add_option('-t', '--logoname', default='rgWebLogo3') + op.add_option('-c', '--colours', default=None) + op.add_option('-l', '--lower', default=None) + op.add_option('-u', '--upper', default=None) + opts, args = op.parse_args() + assert opts.input <> None,'weblogo3 needs a -i parameter with a fasta input file - cannot open' + assert os.path.isfile(opts.input),'weblogo3 needs a valid fasta input file - cannot open %s' % opts.input + w = WL3(opts) + checks,s = w.run() + print >> sys.stdout, checks # for info diff --git a/tools/rgenetics/rgWebLogo3.xml b/tools/rgenetics/rgWebLogo3.xml index dc90a5ce553..5bf02615484 100644 --- a/tools/rgenetics/rgWebLogo3.xml +++ b/tools/rgenetics/rgWebLogo3.xml @@ -1,7 +1,7 @@ - + generator for fasta (eg Clustal alignments) - - weblogo -F $outformat -s $size -f $input -o $output -t "$logoname" -c "$colours" + + rgWebLogo3.py -F $outformat -s $size -i $input -o $output -t "$logoname" -c "$colours" #if $range.mode == 'part' -l "$range.seqstart" -u "$range.seqend" #end if