Add option to copy source files for a submission.
[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         mapper.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_parser():
111     parser = OptionParser()
112
113     model = OptionGroup(parser, 'model')
114     model.add_option('--name', help="Set submission name")
115     model.add_option('--db-path', default=None,
116                      help="set rdf database path")
117     model.add_option('--model', default=None,
118       help="Load model database")
119     model.add_option('--load-rdf', default=None,
120       help="load rdf statements into model")
121     model.add_option('--sparql', default=None, help="execute sparql query")
122     model.add_option('--print-rdf', action="store_true", default=False,
123       help="print ending model state")
124     parser.add_option_group(model)
125     # commands
126     commands = OptionGroup(parser, 'commands')
127     commands.add_option('--make-link-tree-from',
128                       help="create directories & link data files",
129                       default=None)
130     commands.add_option('--copy-tree-from',
131                       help="create directories & copy data files",
132                       default=None)
133     commands.add_option('--fastq', default=False, action="store_true",
134                         help="generate scripts for making fastq files")
135     commands.add_option('--scan-submission', default=False, action="store_true",
136                       help="Import metadata for submission into our model")
137     commands.add_option('--make-hub', help='make the hub file', default=False,
138                       action="store_true")
139
140     parser.add_option_group(commands)
141
142     parser.add_option('--force', default=False, action="store_true",
143                       help="Force regenerating fastqs")
144     parser.add_option('--daf', default=None, help='specify daf name')
145     parser.add_option('--library-url', default=None,
146                       help="specify an alternate source for library information")
147     # debugging
148     parser.add_option('--verbose', default=False, action="store_true",
149                       help='verbose logging')
150     parser.add_option('--debug', default=False, action="store_true",
151                       help='debug logging')
152
153     api.add_auth_options(parser)
154
155     return parser
156
157 if __name__ == "__main__":
158     main()