|
0
|
1 """
|
|
|
2 From a list of platewells retrieves the enrollments code of the connected individual
|
|
|
3 """
|
|
|
4 import argparse
|
|
|
5 import csv
|
|
|
6 import sys
|
|
|
7
|
|
|
8 from bl.vl.kb import KnowledgeBase as KB
|
|
|
9 import bl.vl.utils.ome_utils as vlu
|
|
|
10 from bl.vl.utils import LOG_LEVELS, get_logger
|
|
|
11
|
|
|
12 def make_parser():
|
|
|
13 parser = argparse.ArgumentParser(description='From platewells 2 enrollments code')
|
|
|
14 parser.add_argument('--logfile', type=str, help='log file (default=stderr)')
|
|
|
15 parser.add_argument('--loglevel', type=str, choices = LOG_LEVELS,
|
|
|
16 help='logging level', default='INFO')
|
|
|
17 parser.add_argument('-H', '--host', type=str, help='omero hostname')
|
|
|
18 parser.add_argument('-U', '--user', type=str, help='omero user')
|
|
|
19 parser.add_argument('-P', '--passwd', type=str, help='omero password')
|
|
|
20 parser.add_argument('-S', '--study', type=str, required=True,
|
|
|
21 help='a study used to retrieve individuals')
|
|
|
22 parser.add_argument('--ifile', type=str, required=True,
|
|
|
23 help='list of platewells used to fetch data')
|
|
|
24 parser.add_argument('--ofile', type=str, help='output file path',
|
|
|
25 required=True)
|
|
|
26 return parser
|
|
|
27
|
|
|
28
|
|
|
29 def main(argv):
|
|
|
30 parser = make_parser()
|
|
|
31 args = parser.parse_args(argv)
|
|
|
32
|
|
|
33 logger = get_logger('pws2enrolls', level=args.loglevel,
|
|
|
34 filename=args.logfile)
|
|
|
35 try:
|
|
|
36 host = args.host or vlu.ome_host()
|
|
|
37 user = args.user or vlu.ome_user()
|
|
|
38 passwd = args.passwd or vlu.ome_passwd()
|
|
|
39 except ValueError, ve:
|
|
|
40 logger.critical(ve)
|
|
|
41 sys.exit(ve)
|
|
|
42
|
|
|
43 kb = KB(driver='omero')(host, user, passwd)
|
|
|
44 study = kb.get_study(args.study)
|
|
|
45 enrolled_map = {e.individual.id:e for e in kb.get_enrolled(study)}
|
|
|
46 logger.info('Loaded {} enrolled individuals for study {}'.format(len(enrolled_map), study.label))
|
|
|
47 plates = kb.get_objects(kb.TiterPlate)
|
|
|
48 logger.info('Loaded {} plates'.format(len(plates)))
|
|
|
49 pws_map = {':'.join([w.container.barcode, w.label]):w for w in kb.get_objects(kb.PlateWell)
|
|
|
50 if w.container.barcode}
|
|
|
51 logger.info('Loaded {} platewells'.format(len(pws_map)))
|
|
|
52 #records = []
|
|
|
53 of=open(args.ofile, 'w')
|
|
|
54 writer=csv.DictWriter(of, ['platewell', 'status', 'enrollment'],
|
|
|
55 delimiter='\t', quotechar='"', restval='None')
|
|
|
56 writer.writeheader()
|
|
|
57 with open(args.ifile, 'r') as f:
|
|
|
58 reader=csv.DictReader(f, delimiter='\t')
|
|
|
59 logger.info('Searching individuals connected to the platewells')
|
|
|
60 for r in reader:
|
|
|
61 ind=kb.dt.get_connected(pws_map[r['platewell']], kb.Individual,
|
|
|
62 kb.dt.DIRECTION_INCOMING)
|
|
|
63 try:
|
|
|
64 record = {'platewell': r['platewell'],
|
|
|
65 'status': pws_map[r['platewell']].status.enum_label(),
|
|
|
66 'enrollment': ':'.join([study.label,enrolled_map[ind[0].id].studyCode])}
|
|
|
67 except KeyError as e:
|
|
|
68 logger.warning('not enrolled {}'.format(r['platewell']))
|
|
|
69 record = {'platewell': r['platewell'],
|
|
|
70 'status': pws_map[r['platewell']].status.enum_label(),
|
|
|
71 'enrollment': ':'.join([study.label,'not_enrolled'])}
|
|
|
72 writer.writerow(record)
|
|
|
73 of.close()
|
|
|
74
|
|
|
75
|
|
|
76 if __name__ == "__main__":
|
|
|
77 main(sys.argv[1:])
|