2 from __future__ import print_function, unicode_literals
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
14 LOGGER = logging.getLogger(__name__)
17 usage = '%prog: [options] runfolder -l 1,2,3 [runfolder -l 5,6 ...]'
19 parser = optparse.OptionParser(usage)
20 parser.add_option('--dry-run', action='store_true',
21 help='print what would be done',
24 parser.add_option('-d', '--dest-dir', dest='dest_dir',
25 help='location to write srf files to',
27 parser.add_option('-s', '--site',
30 parser.add_option('-l', '--lanes', dest='lanes', action="append",
32 help='comma seperated list of lanes to add to srf'
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')
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)')
51 def parse_lane_arg(lane_arg):
53 Convert comma sperated list of lane ids to a list of integers
56 for lane in lane_arg.split(','):
59 if lane < 1 or lane > 8:
60 parser.error('Lanes must be in range [1..8]')
63 parser.error('Lane selections must be integers')
66 def main(cmdline=None):
67 parser = make_parser()
68 opts, args = parser.parse_args(cmdline)
71 logging.basicConfig(level=logging.DEBUG)
73 logging.basicConfig(level=logging.INFO)
75 logging.basicConfig(level=logging.WARNING)
78 parser.error('need runfolder arguments')
80 # parse lane arguemnts
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))
89 "Number of lane arguments must match number of runfolders"
92 make_commands = make_qseq_commands
93 # build list of commands
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
103 LOGGER.error('Too many run directories in %s', runfolder_path)
106 bustard_dir = runs[0].bustard.pathname
107 cmds[bustard_dir] = make_commands(run_name,
112 opts.runfolder_version)
114 LOGGER.error("Couldn't find a bustard directory in %s",
119 for cwd, cmd_list in cmds.items():
120 run_commands(cwd, cmd_list, opts.jobs)
122 for cwd, cmd_list in cmds.items():
125 print('jobs: ', opts.jobs)
129 if __name__ == "__main__":
130 sys.exit(main(sys.argv[1:]))