4ee206131728d1eaba9bc3661366c09e4eee8504
[htsworkflow.git] / encode_submission / trackhub.py
1 """Create a track hub 
2 """
3
4 #!/usr/bin/env python
5 from ConfigParser import SafeConfigParser
6 import fnmatch
7 from glob import glob
8 import json
9 import logging
10 import netrc
11 from optparse import OptionParser, OptionGroup
12 import os
13 from pprint import pprint, pformat
14 import shlex
15 from StringIO import StringIO
16 import stat
17 import sys
18 import time
19 import types
20 import urllib
21 import urllib2
22 import urlparse
23 from zipfile import ZipFile
24
25 import RDF
26
27 if not 'DJANGO_SETTINGS_MODULE' in os.environ:
28     os.environ['DJANGO_SETTINGS_MODULE'] = 'htsworkflow.settings'
29
30
31 from htsworkflow.util import api
32 from htsworkflow.util.rdfhelp import \
33      dafTermOntology, \
34      fromTypedNode, \
35      get_model, \
36      get_serializer, \
37      load_into_model, \
38      sparql_query, \
39      submissionOntology
40 from htsworkflow.submission.daf import get_submission_uri
41 from htsworkflow.submission.results import ResultMap
42 from htsworkflow.submission.trackhub import TrackHubSubmission
43 from htsworkflow.submission.condorfastq import CondorFastqExtract
44
45 logger = logging.getLogger(__name__)
46
47 def main(cmdline=None):
48     parser = make_parser()
49     opts, args = parser.parse_args(cmdline)
50     submission_uri = None
51
52     if opts.debug:
53         logging.basicConfig(level = logging.DEBUG )
54     elif opts.verbose:
55         logging.basicConfig(level = logging.INFO )
56     else:
57         logging.basicConfig(level = logging.WARNING )
58
59     apidata = api.make_auth_from_opts(opts, parser)
60
61     model = get_model(opts.model, opts.db_path)
62     mapper = None
63     if opts.name:
64         mapper = TrackHubSubmission(opts.name,  model, host=opts.host)
65         submission_uri = get_submission_uri(opts.name)
66
67
68     if opts.load_rdf is not None:
69         if submission_uri is None:
70             parser.error("Please specify the submission name")
71         load_into_model(model, 'turtle', opts.load_rdf, submission_uri)
72
73     results = ResultMap()
74     for a in args:
75         if os.path.exists(a):
76             results.add_results_from_file(a)
77         else:
78             logger.warn("File %s doesn't exist.", a)
79
80     if opts.make_tree_from is not None:
81         results.make_tree_from(opts.make_tree_from)
82
83     if opts.fastq:
84         logger.info("Building fastq extraction scripts")
85         flowcells = os.path.join(opts.sequence, 'flowcells')
86         extractor = CondorFastqExtract(opts.host, flowcells,
87                                        model=opts.model,
88                                        force=opts.force)
89         extractor.create_scripts(results)
90
91     if opts.scan_submission:
92         if opts.name is None:
93             parser.error("Please define a submission name")
94         mapper.scan_submission_dirs(results)
95
96     if opts.make_hub:
97         mapper.make_hub(results)
98
99     if opts.sparql:
100         sparql_query(model, opts.sparql)
101
102     if opts.print_rdf:
103         writer = get_serializer()
104         print writer.serialize_model_to_string(model)
105
106
107 def make_parser():
108     parser = OptionParser()
109
110     model = OptionGroup(parser, 'model')
111     model.add_option('--name', help="Set submission name")
112     model.add_option('--db-path', default=None,
113                      help="set rdf database path")
114     model.add_option('--model', default=None,
115       help="Load model database")
116     model.add_option('--load-rdf', default=None,
117       help="load rdf statements into model")
118     model.add_option('--sparql', default=None, help="execute sparql query")
119     model.add_option('--print-rdf', action="store_true", default=False,
120       help="print ending model state")
121     parser.add_option_group(model)
122     # commands
123     commands = OptionGroup(parser, 'commands')
124     commands.add_option('--make-tree-from',
125                       help="create directories & link data files",
126                       default=None)
127     commands.add_option('--fastq', default=False, action="store_true",
128                         help="generate scripts for making fastq files")
129     commands.add_option('--scan-submission', default=False, action="store_true",
130                       help="Import metadata for submission into our model")
131     commands.add_option('--make-hub', help='make the hub file', default=False,
132                       action="store_true")
133
134     parser.add_option_group(commands)
135
136     parser.add_option('--force', default=False, action="store_true",
137                       help="Force regenerating fastqs")
138     parser.add_option('--daf', default=None, help='specify daf name')
139     parser.add_option('--library-url', default=None,
140                       help="specify an alternate source for library information")
141     # debugging
142     parser.add_option('--verbose', default=False, action="store_true",
143                       help='verbose logging')
144     parser.add_option('--debug', default=False, action="store_true",
145                       help='debug logging')
146
147     api.add_auth_options(parser)
148
149     return parser
150
151 if __name__ == "__main__":
152     main()