convert some print statements to logger messages
[htsworkflow.git] / scripts / htsw-srf
1 #!/usr/bin/python
2 from __future__ import print_function, unicode_literals
3
4 import logging
5 import optparse
6 import os
7 import sys
8
9 from htsworkflow.pipelines import runfolder
10 from htsworkflow.pipelines.srf import make_srf_commands, make_qseq_commands, \
11                                       run_commands, pathname_to_run_name
12 from htsworkflow.pipelines.srf import ILLUMINA2SRF10, ILLUMINA2SRF11, SOLEXA2SRF
13
14 LOGGER = logging.getLogger(__name__)
15
16 def make_parser():
17   usage = '%prog: [options] runfolder -l 1,2,3 [runfolder -l 5,6 ...]'
18
19   parser = optparse.OptionParser(usage)
20   parser.add_option('--dry-run', action='store_true',
21                     help='print what would be done',
22                     default=False)
23
24   parser.add_option('-d', '--dest-dir', dest='dest_dir',
25                     help='location to write srf files to',
26                     default='.')
27   parser.add_option('-s', '--site',
28                     help='site name',
29                     default='Individual')
30   parser.add_option('-l', '--lanes', dest='lanes', action="append",
31          default=[],
32          help='comma seperated list of lanes to add to srf'
33   )
34   parser.add_option('-j', '--jobs', default=1, type='int',
35                     help='how many jobs to run simultaneously')
36   parser.add_option('-r', '--runfolder-version', default=ILLUMINA2SRF11, type='int',
37                     help='Which class of srf file should we attempt to create\n'
38                          '0 = Solexa pipeline 0.2.6 - 0.3\n'
39                          '1 = illumina pipeline 1.0\n'
40                          '2 = illumina pipeline 1.1rc1 and later \n')
41                      
42   parser.add_option('-v', '--verbose', dest='verbose',
43                     default=False, action='store_true',
44                     help='report more about internals (INFO)')
45   parser.add_option('--debug', dest='debug',
46                     default=False, action='store_true',
47                     help='report even more about internals (DEBUG)')
48  
49   return parser
50
51 def parse_lane_arg(lane_arg):
52     """
53     Convert comma sperated list of lane ids to a list of integers
54     """
55     lanes = []
56     for lane in lane_arg.split(','):
57         try:
58             lane = int(lane)
59             if lane < 1 or lane > 8:
60                 parser.error('Lanes must be in range [1..8]')
61             lanes.append(lane)
62         except ValueError:
63             parser.error('Lane selections must be integers')
64     return lanes
65
66 def main(cmdline=None):
67     parser = make_parser()
68     opts, args = parser.parse_args(cmdline)
69    
70     if opts.debug: 
71         logging.basicConfig(level=logging.DEBUG)
72     elif opts.verbose:
73         logging.basicConfig(level=logging.INFO)
74     else:
75         logging.basicConfig(level=logging.WARNING)
76
77     if len(args) == 0:
78         parser.error('need runfolder arguments')
79
80     # parse lane arguemnts
81     lanes_list = []
82     if len(opts.lanes) == 0:
83         lanes_list = [[1,2,3,4,5,6,7,8]] * len(args)
84     elif len(opts.lanes) == len(args):
85         for lane_arg in opts.lanes:
86             lanes_list.append(parse_lane_arg(lane_arg))
87     else:
88         parser.error(
89           "Number of lane arguments must match number of runfolders"
90         )
91
92     make_commands = make_qseq_commands
93     # build list of commands
94     cmds = {}
95     for runfolder_path, lanes in zip(args, lanes_list):
96         # normalize paths, either relative to home dirs or current dir
97         runfolder_path = os.path.abspath(runfolder_path)
98         run_name = pathname_to_run_name(runfolder_path)
99         # so any bustard directories?
100         runs = runfolder.get_runs(runfolder_path)
101         # give up if there are anything other than 1 run
102         if len(runs) > 1:
103           LOGGER.error('Too many run directories in %s', runfolder_path)
104           return 1
105         elif len(runs) == 1:
106           bustard_dir = runs[0].bustard.pathname
107           cmds[bustard_dir] = make_commands(run_name,
108                                             bustard_dir,
109                                             lanes,
110                                             opts.site,
111                                             opts.dest_dir,
112                                             opts.runfolder_version)
113         else:
114           LOGGER.error("Couldn't find a bustard directory in %s",
115                        runfolder_path)
116           return 1
117
118     if not opts.dry_run:
119       for cwd, cmd_list in cmds.items():
120         run_commands(cwd, cmd_list, opts.jobs)
121     else:
122       for cwd, cmd_list in cmds.items():
123         print(cwd)
124         print(cmd_list)
125         print('jobs: ', opts.jobs)
126
127     return 0
128
129 if __name__ == "__main__":
130     sys.exit(main(sys.argv[1:]))