--- /dev/null
+#!/usr/bin/python
+
+import logging
+import optparse
+import os
+import sys
+
+from htsworkflow.pipelines import runfolder
+from htsworkflow.pipelines.srf import make_srf_commands, make_qseq_commands, \
+ run_commands, pathname_to_run_name
+from htsworkflow.pipelines.srf import ILLUMINA2SRF10, ILLUMINA2SRF11, SOLEXA2SRF
+
+def make_parser():
+ usage = '%prog: [options] runfolder -l 1,2,3 [runfolder -l 5,6 ...]'
+
+ parser = optparse.OptionParser(usage)
+ parser.add_option('--dry-run', action='store_true',
+ help='print what would be done',
+ default=False)
+
+ parser.add_option('-d', '--dest-dir', dest='dest_dir',
+ help='location to write srf files to',
+ default='.')
+ parser.add_option('-s', '--site',
+ help='site name',
+ default='Individual')
+ parser.add_option('-l', '--lanes', dest='lanes', action="append",
+ default=[],
+ help='comma seperated list of lanes to add to srf'
+ )
+ parser.add_option('-j', '--jobs', default=1, type='int',
+ help='how many jobs to run simultaneously')
+ parser.add_option('-r', '--runfolder-version', default=ILLUMINA2SRF11, type='int',
+ help='Which class of srf file should we attempt to create\n'
+ '0 = Solexa pipeline 0.2.6 - 0.3\n'
+ '1 = illumina pipeline 1.0\n'
+ '2 = illumina pipeline 1.1rc1 and later \n')
+
+ parser.add_option('-v', '--verbose', dest='verbose',
+ default=False, action='store_true',
+ help='report more about internals (INFO)')
+ parser.add_option('--debug', dest='debug',
+ default=False, action='store_true',
+ help='report even more about internals (DEBUG)')
+
+ return parser
+
+def parse_lane_arg(lane_arg):
+ """
+ Convert comma sperated list of lane ids to a list of integers
+ """
+ lanes = []
+ for lane in lane_arg.split(','):
+ try:
+ lane = int(lane)
+ if lane < 1 or lane > 8:
+ parser.error('Lanes must be in range [1..8]')
+ lanes.append(lane)
+ except ValueError:
+ parser.error('Lane selections must be integers')
+ return lanes
+
+def main(cmdline=None):
+ parser = make_parser()
+ opts, args = parser.parse_args(cmdline)
+
+ if opts.debug:
+ logging.basicConfig(level=logging.DEBUG)
+ elif opts.verbose:
+ logging.basicConfig(level=logging.INFO)
+ else:
+ logging.basicConfig(level=logging.WARNING)
+
+ if len(args) == 0:
+ parser.error('need runfolder arguments')
+
+ # parse lane arguemnts
+ lanes_list = []
+ if len(opts.lanes) == 0:
+ lanes_list = [[1,2,3,4,5,6,7,8]] * len(args)
+ elif len(opts.lanes) == len(args):
+ for lane_arg in opts.lanes:
+ lanes_list.append(parse_lane_arg(lane_arg))
+ else:
+ parser.error(
+ "Number of lane arguments must match number of runfolders"
+ )
+
+ make_commands = make_qseq_commands
+ # build list of commands
+ cmds = {}
+ for runfolder_path, lanes in zip(args, lanes_list):
+ # normalize paths, either relative to home dirs or current dir
+ runfolder_path = os.path.abspath(runfolder_path)
+ run_name = pathname_to_run_name(runfolder_path)
+ # so any bustard directories?
+ runs = runfolder.get_runs(runfolder_path)
+ # give up if there are anything other than 1 run
+ if len(runs) > 1:
+ print 'ERROR: Too many run directories in %s' %(runfolder_path,)
+ return 1
+ elif len(runs) == 1:
+ bustard_dir = runs[0].bustard.pathname
+ cmds[bustard_dir] = make_commands(run_name,
+ bustard_dir,
+ lanes,
+ opts.site,
+ opts.dest_dir,
+ opts.runfolder_version)
+ else:
+ print "ERROR: Couldn't find a bustard directory in", runfolder_path
+ return 1
+
+ if not opts.dry_run:
+ for cwd, cmd_list in cmds.items():
+ run_commands(cwd, cmd_list, opts.jobs)
+ else:
+ for cwd, cmd_list in cmds.items():
+ print cwd
+ print cmd_list
+ print 'jobs: ', opts.jobs
+
+ return 0
+
+if __name__ == "__main__":
+ sys.exit(main(sys.argv[1:]))