| 
0
 | 
     1 """
 | 
| 
 | 
     2 rgclustalw.py
 | 
| 
 | 
     3 wrapper for clustalw necessitated by bad choice of output path for .dnd file based on input file. Naughty.
 | 
| 
 | 
     4 Copyright ross lazarus march 2011
 | 
| 
 | 
     5 All rights reserved
 | 
| 
 | 
     6 Licensed under the LGPL
 | 
| 
 | 
     7 """
 | 
| 
 | 
     8 
 | 
| 
 | 
     9 import sys,optparse,os,subprocess,tempfile,shutil
 | 
| 
 | 
    10 
 | 
| 
 | 
    11 class Clustrunner:
 | 
| 
 | 
    12     """
 | 
| 
 | 
    13     """
 | 
| 
 | 
    14     def __init__(self,opts=None):
 | 
| 
 | 
    15         self.opts = opts
 | 
| 
 | 
    16         self.iname = 'infile_copy'
 | 
| 
 | 
    17         shutil.copy(self.opts.input,self.iname) 
 | 
| 
 | 
    18 
 | 
| 
 | 
    19     def run(self):
 | 
| 
 | 
    20         tlf = open(self.opts.outlog,'w')
 | 
| 
 | 
    21         cl = ['clustalw2 -INFILE=%s -OUTFILE=%s -OUTORDER=%s -TYPE=%s -OUTPUT=%s' % (self.iname,self.opts.output,self.opts.out_order,self.opts.dnarna,self.opts.outform)]
 | 
| 
 | 
    22         if self.opts.seq_range_end <> None and self.opts.seq_range_start <> None:
 | 
| 
 | 
    23             cl.append('-RANGE=%s,%s' % (self.opts.seq_range_start,self.opts.seq_range_end))
 | 
| 
 | 
    24         if self.opts.outform=='CLUSTAL' and self.opts.outseqnos <> None:
 | 
| 
 | 
    25             cl.append('-SEQNOS=ON')
 | 
| 
 | 
    26         process = subprocess.Popen(' '.join(cl), shell=True, stderr=tlf, stdout=tlf)
 | 
| 
 | 
    27         rval = process.wait()
 | 
| 
 | 
    28         dndf = '%s.dnd' % self.iname
 | 
| 
 | 
    29         if os.path.exists(dndf):
 | 
| 
 | 
    30             tlf.write('\nClustal created the following dnd file for your information:\n')
 | 
| 
 | 
    31             dnds = open('%s.dnd' % self.iname,'r').readlines()
 | 
| 
 | 
    32 	    for row in dnds:
 | 
| 
 | 
    33                 tlf.write(row)
 | 
| 
 | 
    34             tlf.write('\n')
 | 
| 
 | 
    35         tlf.close()
 | 
| 
 | 
    36         os.unlink(self.iname)
 | 
| 
 | 
    37     
 | 
| 
 | 
    38 
 | 
| 
 | 
    39 
 | 
| 
 | 
    40 if __name__ == "__main__":
 | 
| 
 | 
    41     op = optparse.OptionParser()
 | 
| 
 | 
    42     op.add_option('-i', '--input', default=None)
 | 
| 
 | 
    43     op.add_option('-o', '--output', default=None)
 | 
| 
 | 
    44     op.add_option('-t', '--outname', default="rgClustal")
 | 
| 
 | 
    45     op.add_option('-s', '--out_order', default='ALIGNMENT')
 | 
| 
 | 
    46     op.add_option('-f', '--outform', default='CLUSTAL')
 | 
| 
 | 
    47     op.add_option('-e', '--seq_range_end',default=None)
 | 
| 
 | 
    48     op.add_option('-b', '--seq_range_start',default=None)
 | 
| 
 | 
    49     op.add_option('-l','--outlog',default='rgClustalw.log')
 | 
| 
 | 
    50     op.add_option('-q', '--outseqnos',default=None)    
 | 
| 
 | 
    51     op.add_option('-d', '--dnarna',default='DNA')    
 | 
| 
 | 
    52     
 | 
| 
 | 
    53     opts, args = op.parse_args()
 | 
| 
 | 
    54     assert opts.input <> None
 | 
| 
 | 
    55     assert os.path.isfile(opts.input)
 | 
| 
 | 
    56     c = Clustrunner(opts)
 | 
| 
 | 
    57     c.run()
 | 
| 
 | 
    58     
 | 
| 
 | 
    59             
 | 
| 
 | 
    60 
 |