c94eb50deaedd8fbeb664ba88a52d4ff49fb7c1d
[htsworkflow.git] / encode_submission / encode3.py
1 #!/usr/bin/env python
2 """Create a track hub
3 """
4 from __future__ import print_function, unicode_literals
5
6 import argparse
7 import logging
8 import os
9
10 from htsworkflow.util import api
11 from htsworkflow.util.rdfhelp import \
12     get_model, \
13     get_serializer, \
14     load_into_model, \
15     sparql_query
16 from htsworkflow.submission.daf import get_submission_uri
17 from htsworkflow.submission.submission import list_submissions
18 from htsworkflow.submission.results import ResultMap
19 from htsworkflow.submission.condorfastq import CondorFastqExtract
20 from htsworkflow.submission.aws_submission import AWSSubmission
21 logger = logging.getLogger(__name__)
22
23 INDENTED = "  " + os.linesep
24
25 import django
26 if not 'DJANGO_SETTINGS_MODULE' in os.environ:
27     os.environ['DJANGO_SETTINGS_MODULE'] = 'htsworkflow.settings.local'
28
29 def main(cmdline=None):
30     parser = make_parser()
31     args = parser.parse_args(cmdline)
32     submission_uri = None
33
34     from django.conf import settings
35
36     if args.debug:
37         settings.LOGGING['loggers']['htsworkflow']['level'] = 'DEBUG'
38     elif args.verbose:
39         settings.LOGGING['loggers']['htsworkflow']['level'] = 'INFO'
40
41     django.setup()
42
43     model = get_model(args.model, args.db_path)
44     submission_names = list(list_submissions(model))
45     name = args.name
46     if len(submission_names) == 0 and args.name is None:
47         parser.error("Please name this submission")
48     elif args.name and submission_names and args.name not in submission_names:
49         parser.error("{} is not in this model. Choose from: {}{}".format(
50             args.name,
51             os.linesep,
52             INDENTED.join(submission_names)))
53     elif args.name is None and len(submission_names) > 1:
54         parser.error("Please choose submission name from: {}{}".format(
55             os.linesep,
56             INDENTED.join(submission_names)))
57     elif len(submission_names) == 1:
58         name = submission_names[0]
59
60     if name:
61         submission_uri = get_submission_uri(name)
62         logger.info('Submission URI: %s', submission_uri)
63
64     mapper = AWSSubmission(name, model, encode_host=args.encoded, lims_host=args.host)
65
66     if args.load_rdf is not None:
67         if submission_uri is None:
68             parser.error("Please specify the submission name")
69         load_into_model(model, 'turtle', args.load_rdf, submission_uri)
70
71     results = ResultMap()
72     for a in args.libraries:
73         if os.path.exists(a):
74             results.add_results_from_file(a)
75         else:
76             logger.warn("File %s doesn't exist.", a)
77
78     if args.make_link_tree_from is not None:
79         results.make_tree_from(args.make_link_tree_from, link=True)
80
81     if args.copy_tree_from is not None:
82         results.make_tree_from(args.copy_tree_from, link=False)
83
84     if args.fastq:
85         logger.info("Building fastq extraction scripts")
86         flowcells = os.path.join(args.sequence, 'flowcells')
87         extractor = CondorFastqExtract(args.host, flowcells,
88                                        model=args.model,
89                                        compression=args.compression,
90                                        force=args.force)
91         extractor.create_scripts(results)
92
93     if args.scan_submission:
94         if name is None:
95             parser.error("Please define a submission name")
96         mapper.scan_submission_dirs(results)
97
98     if args.upload:
99         mapper.upload(results, args.dry_run)
100
101     if args.check_upload:
102         mapper.check_upload(results)
103
104     if args.sparql:
105         sparql_query(model, args.sparql)
106
107     if args.print_rdf:
108         writer = get_serializer()
109         print(writer.serialize_model_to_string(model))
110
111
112 def make_parser():
113     parser = argparse.ArgumentParser()
114
115     model = parser.add_argument_group('model')
116     model.add_argument('--name', help="Set submission name")
117     model.add_argument('--db-path', default=None,
118                      help="set rdf database path")
119     model.add_argument('--model', default=None,
120                      help="Load model database")
121     model.add_argument('--load-rdf', default=None,
122                      help="load rdf statements into model")
123     model.add_argument('--sparql', default=None, help="execute sparql query")
124     model.add_argument('--print-rdf', action="store_true", default=False,
125                      help="print ending model state")
126
127     # commands
128     commands = parser.add_argument_group('commands')
129     commands.add_argument('--make-link-tree-from',
130                         help="create directories & link data files",
131                         default=None)
132     commands.add_argument('--copy-tree-from',
133                         help="create directories & copy data files",
134                         default=None)
135     commands.add_argument('--fastq', default=False, action="store_true",
136                         help="generate scripts for making fastq files")
137     commands.add_argument('--scan-submission', default=False, action="store_true",
138                         help="cache md5 sums")
139     commands.add_argument('--upload', default=False, action="store_true",
140                         help="Upload files")
141     commands.add_argument('--check-upload', default=False, action='store_true',
142                           help='check to see files are actually uploaded')
143
144     parser.add_argument('--force', default=False, action="store_true",
145                       help="Force regenerating fastqs")
146     parser.add_argument('--compression', default=None,
147                       choices=['gzip'],
148                       help='select compression type for fastq files')
149     parser.add_argument('--library-url', default=None,
150                       help="specify an alternate source for library information")
151     parser.add_argument('--encoded', default='www.encodeproject.org',
152                       help='base url for talking to encode server')
153     parser.add_argument('--dry-run', default=False, action='store_true',
154                       help='avoid making changes to encoded')
155     
156     # debugging
157     parser.add_argument('--verbose', default=False, action="store_true",
158                       help='verbose logging')
159     parser.add_argument('--debug', default=False, action="store_true",
160                       help='debug logging')
161
162     api.add_auth_options(parser)
163      
164     parser.add_argument('libraries', nargs='+',
165                         help='mapping of library id to directory to be processed')
166
167     return parser
168
169 if __name__ == "__main__":
170     main()