annotate galaxy-tools/biobank/utils/split_by_study.py @ 3:43be74e62bfe draft

Uploaded
author ric
date Thu, 22 Sep 2016 08:57:04 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
43be74e62bfe Uploaded
ric
parents:
diff changeset
1 """
43be74e62bfe Uploaded
ric
parents:
diff changeset
2 Split a file like::
43be74e62bfe Uploaded
ric
parents:
diff changeset
3
43be74e62bfe Uploaded
ric
parents:
diff changeset
4 individual gender father mother
43be74e62bfe Uploaded
ric
parents:
diff changeset
5 ASTUDY:2141 MALE ASTUDY:12 ASTUDY:12341
43be74e62bfe Uploaded
ric
parents:
diff changeset
6 ASTUDY:415 MALE ASTUDY:3562 ASTUDY:13612
43be74e62bfe Uploaded
ric
parents:
diff changeset
7 BSTUDY:12515 FEMALE BSTUDY:3512 BSTUDY:124
43be74e62bfe Uploaded
ric
parents:
diff changeset
8
43be74e62bfe Uploaded
ric
parents:
diff changeset
9 into multiple files based on the STUDY value of the label stored in the "individual" column.
43be74e62bfe Uploaded
ric
parents:
diff changeset
10 Each label in the "individual" column must have a STUDY:ENROLLMENT_CODE format, otherwise the line
43be74e62bfe Uploaded
ric
parents:
diff changeset
11 will be skipped.
43be74e62bfe Uploaded
ric
parents:
diff changeset
12 """
43be74e62bfe Uploaded
ric
parents:
diff changeset
13
43be74e62bfe Uploaded
ric
parents:
diff changeset
14 import sys, argparse, csv, os
43be74e62bfe Uploaded
ric
parents:
diff changeset
15 from bl.vl.utils import LOG_LEVELS, get_logger
43be74e62bfe Uploaded
ric
parents:
diff changeset
16
43be74e62bfe Uploaded
ric
parents:
diff changeset
17
43be74e62bfe Uploaded
ric
parents:
diff changeset
18 def get_parser():
43be74e62bfe Uploaded
ric
parents:
diff changeset
19 parser = argparse.ArgumentParser('Split a file containing pedigree informations in multiple files using the study as split criteria')
43be74e62bfe Uploaded
ric
parents:
diff changeset
20 parser.add_argument('--logfile', type=str, help='log file (default=stderr)')
43be74e62bfe Uploaded
ric
parents:
diff changeset
21 parser.add_argument('--loglevel', type=str, choices=LOG_LEVELS,
43be74e62bfe Uploaded
ric
parents:
diff changeset
22 help='logging level', default='INFO')
43be74e62bfe Uploaded
ric
parents:
diff changeset
23 parser.add_argument('--in-file', type=str, required=True,
43be74e62bfe Uploaded
ric
parents:
diff changeset
24 help='input TSV file')
43be74e62bfe Uploaded
ric
parents:
diff changeset
25 parser.add_argument('--record-id', type=int,
43be74e62bfe Uploaded
ric
parents:
diff changeset
26 help='Output ID record given by Galaxy')
43be74e62bfe Uploaded
ric
parents:
diff changeset
27 parser.add_argument('--out-path', type=str, help='Output directory',
43be74e62bfe Uploaded
ric
parents:
diff changeset
28 default='.')
43be74e62bfe Uploaded
ric
parents:
diff changeset
29 return parser
43be74e62bfe Uploaded
ric
parents:
diff changeset
30
43be74e62bfe Uploaded
ric
parents:
diff changeset
31
43be74e62bfe Uploaded
ric
parents:
diff changeset
32 def split_element(element, logger):
43be74e62bfe Uploaded
ric
parents:
diff changeset
33 try:
43be74e62bfe Uploaded
ric
parents:
diff changeset
34 study, code = element.split(':')
43be74e62bfe Uploaded
ric
parents:
diff changeset
35 return study, code
43be74e62bfe Uploaded
ric
parents:
diff changeset
36 except ValueError:
43be74e62bfe Uploaded
ric
parents:
diff changeset
37 logger.error('Label %s is not a label with format STUDY:ENROLLMENT_CODE', element)
43be74e62bfe Uploaded
ric
parents:
diff changeset
38 return None, None
43be74e62bfe Uploaded
ric
parents:
diff changeset
39
43be74e62bfe Uploaded
ric
parents:
diff changeset
40
43be74e62bfe Uploaded
ric
parents:
diff changeset
41 def map_by_study(records, logger):
43be74e62bfe Uploaded
ric
parents:
diff changeset
42 records_map = {}
43be74e62bfe Uploaded
ric
parents:
diff changeset
43 for rec in records:
43be74e62bfe Uploaded
ric
parents:
diff changeset
44 study, code = split_element(rec['individual'], logger)
43be74e62bfe Uploaded
ric
parents:
diff changeset
45 if not study and not code:
43be74e62bfe Uploaded
ric
parents:
diff changeset
46 logger.debug('Skipping record %r', rec)
43be74e62bfe Uploaded
ric
parents:
diff changeset
47 continue
43be74e62bfe Uploaded
ric
parents:
diff changeset
48 records_map.setdefault(study, []).append(rec)
43be74e62bfe Uploaded
ric
parents:
diff changeset
49 logger.info('Records splitted between %d studies', len(records_map.keys()))
43be74e62bfe Uploaded
ric
parents:
diff changeset
50 return records_map
43be74e62bfe Uploaded
ric
parents:
diff changeset
51
43be74e62bfe Uploaded
ric
parents:
diff changeset
52
43be74e62bfe Uploaded
ric
parents:
diff changeset
53 def dump_records(study_label, records, header, output_path, logger, galaxy_record_id=None):
43be74e62bfe Uploaded
ric
parents:
diff changeset
54
43be74e62bfe Uploaded
ric
parents:
diff changeset
55 def get_file_name(study, out_path, galaxy_id=None):
43be74e62bfe Uploaded
ric
parents:
diff changeset
56 if not galaxy_id:
43be74e62bfe Uploaded
ric
parents:
diff changeset
57 file_name = '%s_individuals.tsv' % study
43be74e62bfe Uploaded
ric
parents:
diff changeset
58 else:
43be74e62bfe Uploaded
ric
parents:
diff changeset
59 file_name = 'primary_%d_%s_visible_tabular' % (galaxy_id, study.replace('_', '-'))
43be74e62bfe Uploaded
ric
parents:
diff changeset
60 return os.path.join(out_path, file_name)
43be74e62bfe Uploaded
ric
parents:
diff changeset
61
43be74e62bfe Uploaded
ric
parents:
diff changeset
62 fname = get_file_name(study_label, output_path, galaxy_record_id)
43be74e62bfe Uploaded
ric
parents:
diff changeset
63 with open(fname, 'w') as ofile:
43be74e62bfe Uploaded
ric
parents:
diff changeset
64 logger.info('Dumping %d records to file %s', len(records), fname)
43be74e62bfe Uploaded
ric
parents:
diff changeset
65 writer = csv.DictWriter(ofile, header, delimiter='\t')
43be74e62bfe Uploaded
ric
parents:
diff changeset
66 writer.writeheader()
43be74e62bfe Uploaded
ric
parents:
diff changeset
67 writer.writerows(records)
43be74e62bfe Uploaded
ric
parents:
diff changeset
68
43be74e62bfe Uploaded
ric
parents:
diff changeset
69
43be74e62bfe Uploaded
ric
parents:
diff changeset
70 def main(argv):
43be74e62bfe Uploaded
ric
parents:
diff changeset
71 parser = get_parser()
43be74e62bfe Uploaded
ric
parents:
diff changeset
72 args = parser.parse_args(argv)
43be74e62bfe Uploaded
ric
parents:
diff changeset
73
43be74e62bfe Uploaded
ric
parents:
diff changeset
74 logger = get_logger('split_by_study', level=args.loglevel, filename=args.logfile)
43be74e62bfe Uploaded
ric
parents:
diff changeset
75
43be74e62bfe Uploaded
ric
parents:
diff changeset
76 logger.info('Start processing file %s', args.in_file)
43be74e62bfe Uploaded
ric
parents:
diff changeset
77 with open(args.in_file) as in_file:
43be74e62bfe Uploaded
ric
parents:
diff changeset
78 reader = csv.DictReader(in_file, delimiter='\t')
43be74e62bfe Uploaded
ric
parents:
diff changeset
79 records = [row for row in reader]
43be74e62bfe Uploaded
ric
parents:
diff changeset
80
43be74e62bfe Uploaded
ric
parents:
diff changeset
81 records_map = map_by_study(records, logger)
43be74e62bfe Uploaded
ric
parents:
diff changeset
82 # Force the header of the output files in order to prevent problems when running the workflow later
43be74e62bfe Uploaded
ric
parents:
diff changeset
83 header = ['individual', 'gender', 'father', 'mother']
43be74e62bfe Uploaded
ric
parents:
diff changeset
84 for study, records in records_map.iteritems():
43be74e62bfe Uploaded
ric
parents:
diff changeset
85 dump_records(study, records, header, args.out_path, logger, args.record_id)
43be74e62bfe Uploaded
ric
parents:
diff changeset
86 logger.info('Job completed')
43be74e62bfe Uploaded
ric
parents:
diff changeset
87
43be74e62bfe Uploaded
ric
parents:
diff changeset
88
43be74e62bfe Uploaded
ric
parents:
diff changeset
89 if __name__ == '__main__':
43be74e62bfe Uploaded
ric
parents:
diff changeset
90 main(sys.argv[1:])