Initial attempt to start generating trackHubs and manifest files.
[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_link_tree_from is not None:
81         results.make_tree_from(opts.make_tree_from, link=True)
82
83     if opts.copy_tree_from is not None:
84         results.make_tree_from(opts.make_tree_from, link=False)
85
86     if opts.fastq:
87         logger.info("Building fastq extraction scripts")
88         flowcells = os.path.join(opts.sequence, 'flowcells')
89         extractor = CondorFastqExtract(opts.host, flowcells,
90                                        model=opts.model,
91                                        force=opts.force)
92         extractor.create_scripts(results)
93
94     if opts.scan_submission:
95         if opts.name is None:
96             parser.error("Please define a submission name")
97         mapper.scan_submission_dirs(results)
98
99     if opts.make_hub:
100         make_hub(results)
101
102     if opts.sparql:
103         sparql_query(model, opts.sparql)
104
105     if opts.print_rdf:
106         writer = get_serializer()
107         print writer.serialize_model_to_string(model)
108
109
110 def make_hub(results):
111     trackdb = mapper.make_hub(results)
112     manifest = mapper.make_manifest(results)
113
114     trackstream = sys.stdout
115     #with open('trackDb.txt', 'w') as trackstream:
116     trackstream.write(trackdb)
117
118     #with open('manifest.txt', 'w') as mainifeststream:
119     manifeststream = sys.stdout
120     mainifeststream.write(mainifest)
121         
122 def make_parser():
123     parser = OptionParser()
124
125     model = OptionGroup(parser, 'model')
126     model.add_option('--name', help="Set submission name")
127     model.add_option('--db-path', default=None,
128                      help="set rdf database path")
129     model.add_option('--model', default=None,
130       help="Load model database")
131     model.add_option('--load-rdf', default=None,
132       help="load rdf statements into model")
133     model.add_option('--sparql', default=None, help="execute sparql query")
134     model.add_option('--print-rdf', action="store_true", default=False,
135       help="print ending model state")
136     parser.add_option_group(model)
137     # commands
138     commands = OptionGroup(parser, 'commands')
139     commands.add_option('--make-link-tree-from',
140                       help="create directories & link data files",
141                       default=None)
142     commands.add_option('--copy-tree-from',
143                       help="create directories & copy data files",
144                       default=None)
145     commands.add_option('--fastq', default=False, action="store_true",
146                         help="generate scripts for making fastq files")
147     commands.add_option('--scan-submission', default=False, action="store_true",
148                       help="Import metadata for submission into our model")
149     commands.add_option('--make-hub', help='make the hub file', default=False,
150                       action="store_true")
151
152     parser.add_option_group(commands)
153
154     parser.add_option('--force', default=False, action="store_true",
155                       help="Force regenerating fastqs")
156     parser.add_option('--daf', default=None, help='specify daf name')
157     parser.add_option('--library-url', default=None,
158                       help="specify an alternate source for library information")
159     # debugging
160     parser.add_option('--verbose', default=False, action="store_true",
161                       help='verbose logging')
162     parser.add_option('--debug', default=False, action="store_true",
163                       help='debug logging')
164
165     api.add_auth_options(parser)
166
167     return parser
168
169 if __name__ == "__main__":
170     main()