annotate SMART/DiffExpAnal/tophat_parallel_unSQL.py @ 18:94ab73e8a190

Uploaded
author m-zytnicki
date Mon, 29 Apr 2013 03:20:15 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
2 #!/usr/bin/env python
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
3
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
4 import optparse, os, shutil, subprocess, sys, tempfile, fileinput, tarfile, glob
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
5 from commons.core.launcher.Launcher import Launcher
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
6 from commons.core.sql.TableJobAdaptatorFactory import TableJobAdaptatorFactory
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
7 from commons.core.utils.FileUtils import FileUtils
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
8
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
9 def stop_err( msg ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
10 sys.stderr.write( "%s\n" % msg )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
11 sys.exit()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
12
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
13 def toTar(tarFileName, accepted_hits_outputNames):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
14 tfile = tarfile.open(tarFileName + ".tmp.tar", "w")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
15 currentPath = os.getcwd()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
16 os.chdir(dir)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
17 for file in accepted_hits_outputNames:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
18 relativeFileName = os.path.basename(file)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
19 tfile.add(relativeFileName)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
20 os.system("mv %s %s" % (tarFileName + ".tmp.tar", tarFileName))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
21 tfile.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
22 os.chdir(currentPath)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
23
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
24 def splitFastQ(fileName, nbOfSeqPerBatch):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
25 nbOfLinesPerFile = nbOfSeqPerBatch * 4
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
26 lOutput = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
27 filePrefix, fileExt = os.path.splitext(os.path.basename(fileName))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
28 resDir = os.path.dirname(fileName)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
29 with open(fileName) as inF:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
30 fileNb = 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
31 line = inF.readline()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
32 if not line or nbOfLinesPerFile == 0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
33 outFileName = "%s/%s-%s%s" %(resDir, filePrefix, fileNb, fileExt)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
34 lOutput.append(outFileName)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
35 f = open(outFileName, "wb")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
36 shutil.copyfileobj(open(fileName, "rb"), f)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
37 f.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
38 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
39 while line:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
40 outFileName = "%s/%s-%s%s" %(resDir, filePrefix, fileNb, fileExt)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
41 lOutput.append(outFileName)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
42 with open(outFileName, "w") as outF:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
43 lineNb = 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
44 while lineNb <= nbOfLinesPerFile and line:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
45 outF.write(line)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
46 line = inF.readline()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
47 lineNb += 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
48 fileNb += 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
49 return lOutput
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
50
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
51 def joinBAM(dCutOut2Out):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
52 for key in dCutOut2Out.keys():
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
53 fh = open(key, "w")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
54 fh.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
55 nbFile = 0
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
56 cmd = "samtools merge -f %s" % key
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
57 for fileName in dCutOut2Out[key]:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
58 nbFile = nbFile + 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
59 if nbFile < 225:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
60 cmd += " %s" % fileName
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
61 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
62 nbFile = 0
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
63 cmd += ";mv %s tmpBAM;" % (key)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
64 cmd += "samtools merge -f %s tmpBAM %s" % (key, fileName)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
65 proc = subprocess.Popen( args=cmd , shell=True)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
66 returncode = proc.wait()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
67
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
68
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
69 def _map(iLauncher, cmd, cmdStart, cmdFinish ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
70 lCmds = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
71 lCmds.extend(cmd)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
72 lCmdStart = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
73 lCmdStart.extend(cmdStart)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
74 lCmdFinish = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
75 lCmdFinish.extend(cmdFinish)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
76 return(iLauncher.prepareCommands_withoutIndentation(lCmds, lCmdStart, lCmdFinish))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
77
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
78 def _createTopHatCommand(iLauncher, options, index_paths, inputFileNames, inputRevFilesNames, space):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
79 lArgs = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
80 lArgs.append('-p %s %s' % ( options.num_threads, space ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
81 if options.single_paired == 'paired':
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
82 lArgs.append('-r %s ' % options.mate_inner_dist)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
83 if options.settings == 'preSet':
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
84 lArgs.append(index_paths)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
85 lArgs.append(inputFileNames)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
86 if options.input2:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
87 lArgs.append(inputRevFilesNames)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
88 return iLauncher.getSystemCommand("tophat", lArgs)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
89 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
90 if int( options.min_anchor_length ) >= 3:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
91 lArgs.append('-a %s ' % options.min_anchor_length)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
92 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
93 raise Exception, 'Minimum anchor length must be 3 or greater'
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
94 lArgs.append('-m %s ' % options.splice_mismatches)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
95 lArgs.append('-i %s ' % options.min_intron_length)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
96 lArgs.append('-I %s ' % options.max_intron_length)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
97 if float( options.junction_filter ) != 0.0:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
98 lArgs.append('-F %s ' % options.junction_filter)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
99 lArgs.append('-g %s ' % options.max_multihits)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
100 # Custom junctions options.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
101 if options.gene_model_annotations:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
102 lArgs.append('-G %s ' % options.gene_model_annotations)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
103 if options.raw_juncs:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
104 lArgs.append('-j %s ' % options.raw_juncs)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
105 if options.no_novel_juncs:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
106 lArgs.append('--no-novel-juncs ')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
107 if options.library_type:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
108 lArgs.append('--library-type %s ' % options.library_type)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
109 if options.no_novel_indels:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
110 lArgs.append('--no-novel-indels ')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
111 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
112 if options.max_insertion_length:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
113 lArgs.append('--max-insertion-length %i ' % int( options.max_insertion_length ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
114 if options.max_deletion_length:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
115 lArgs.append('--max-deletion-length %i ' % int( options.max_deletion_length ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
116 # Max options do not work for Tophat v1.2.0, despite documentation to the contrary. (Fixed in version 1.3.1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
117 # need to warn user of this fact
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
118 #sys.stdout.write( "Max insertion length and max deletion length options don't work in Tophat v1.2.0\n" )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
119
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
120 # Search type options.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
121 if options.coverage_search:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
122 lArgs.append('--coverage-search --min-coverage-intron %s --max-coverage-intron %s ' % ( options.min_coverage_intron, options.max_coverage_intron ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
123 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
124 lArgs.append('--no-coverage-search ')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
125 if options.closure_search:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
126 lArgs.append('--closure-search --min-closure-exon %s --min-closure-intron %s --max-closure-intron %s ' % ( options.min_closure_exon, options.min_closure_intron, options.max_closure_intron ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
127 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
128 lArgs.append('--no-closure-search ')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
129 if options.microexon_search:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
130 lArgs.append('--microexon-search ')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
131 if options.single_paired == 'paired':
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
132 lArgs.append('--mate-std-dev %s ' % options.mate_std_dev)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
133 if options.initial_read_mismatches:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
134 lArgs.append('--initial-read-mismatches %d ' % int( options.initial_read_mismatches ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
135 if options.seg_mismatches:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
136 lArgs.append('--segment-mismatches %d ' % int( options.seg_mismatches ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
137 if options.seg_length:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
138 lArgs.append('--segment-length %d ' % int( options.seg_length ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
139 if options.min_segment_intron:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
140 lArgs.append('--min-segment-intron %d ' % int( options.min_segment_intron ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
141 if options.max_segment_intron:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
142 lArgs.append('--max-segment-intron %d ' % int( options.max_segment_intron ))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
143 lArgs.append(index_paths)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
144 lArgs.append(inputFileNames)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
145 if options.input2:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
146 lArgs.append(inputRevFilesNames)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
147 return iLauncher.getSystemCommand("tophat", lArgs)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
148
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
149
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
150
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
151 def __main__():
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
152 #Parse Command Line
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
153 parser = optparse.OptionParser()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
154 parser.add_option('-o', '--outputTxtFile', dest='outputTxtFile', help='for Differential expression analysis pipeline, new output option gives a txt output containing the list of mapping results.')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
155 parser.add_option('-t', '--tar', dest='outputTar', default=None, help='output all accepted hits results in a tar file.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
156 parser.add_option( '-p', '--num-threads', dest='num_threads', help='Use this many threads to align reads. The default is 1.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
157 parser.add_option( '-C', '--color-space', dest='color_space', action='store_true', help='This indicates color-space data' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
158 parser.add_option( '-J', '--junctions-output', dest='junctions_output_file', default='junctions_output.bed', help='Junctions output file; formate is BED.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
159 parser.add_option( '-H', '--hits-output', dest='accepted_hits_output_file', default='hits_output.bam', help='Accepted hits output file; formate is BAM.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
160 parser.add_option( '', '--own-file', dest='own_file', help='' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
161 parser.add_option( '-D', '--indexes-path', dest='index_path', help='Indexes directory; location of .ebwt and .fa files.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
162 parser.add_option( '-r', '--mate-inner-dist', dest='mate_inner_dist', help='This is the expected (mean) inner distance between mate pairs. \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
163 For, example, for paired end runs with fragments selected at 300bp, \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
164 where each end is 50bp, you should set -r to be 200. There is no default, \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
165 and this parameter is required for paired end runs.')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
166 parser.add_option( '', '--mate-std-dev', dest='mate_std_dev', help='Standard deviation of distribution on inner distances between male pairs.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
167 parser.add_option( '-a', '--min-anchor-length', dest='min_anchor_length',
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
168 help='The "anchor length". TopHat will report junctions spanned by reads with at least this many bases on each side of the junction.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
169 parser.add_option( '-m', '--splice-mismatches', dest='splice_mismatches', help='The maximum number of mismatches that can appear in the anchor region of a spliced alignment.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
170 parser.add_option( '-i', '--min-intron-length', dest='min_intron_length',
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
171 help='The minimum intron length. TopHat will ignore donor/acceptor pairs closer than this many bases apart.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
172 parser.add_option( '-I', '--max-intron-length', dest='max_intron_length',
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
173 help='The maximum intron length. When searching for junctions ab initio, TopHat will ignore donor/acceptor pairs farther than this many bases apart, except when such a pair is supported by a split segment alignment of a long read.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
174 parser.add_option( '-F', '--junction_filter', dest='junction_filter', help='Filter out junctions supported by too few alignments (number of reads divided by average depth of coverage)' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
175 parser.add_option( '-g', '--max_multihits', dest='max_multihits', help='Maximum number of alignments to be allowed' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
176 parser.add_option( '', '--initial-read-mismatches', dest='initial_read_mismatches', help='Number of mismatches allowed in the initial read mapping' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
177 parser.add_option( '', '--seg-mismatches', dest='seg_mismatches', help='Number of mismatches allowed in each segment alignment for reads mapped independently' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
178 parser.add_option( '', '--seg-length', dest='seg_length', help='Minimum length of read segments' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
179 parser.add_option( '', '--library-type', dest='library_type', help='TopHat will treat the reads as strand specific. Every read alignment will have an XS attribute tag. Consider supplying library type options below to select the correct RNA-seq protocol.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
180 parser.add_option( '', '--allow-indels', action="store_true", help='Allow indel search. Indel search is disabled by default.(Not used since version 1.3.0)' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
181 parser.add_option( '', '--max-insertion-length', dest='max_insertion_length', help='The maximum insertion length. The default is 3.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
182 parser.add_option( '', '--max-deletion-length', dest='max_deletion_length', help='The maximum deletion length. The default is 3.' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
183
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
184 # Options for supplying own junctions
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
185 parser.add_option( '-G', '--GTF', dest='gene_model_annotations', help='Supply TopHat with a list of gene model annotations. \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
186 TopHat will use the exon records in this file to build \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
187 a set of known splice junctions for each gene, and will \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
188 attempt to align reads to these junctions even if they \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
189 would not normally be covered by the initial mapping.')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
190 parser.add_option( '-j', '--raw-juncs', dest='raw_juncs', help='Supply TopHat with a list of raw junctions. Junctions are \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
191 specified one per line, in a tab-delimited format. Records \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
192 look like: <chrom> <left> <right> <+/-> left and right are \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
193 zero-based coordinates, and specify the last character of the \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
194 left sequenced to be spliced to the first character of the right \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
195 sequence, inclusive.')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
196 parser.add_option( '', '--no-novel-juncs', action="store_true", dest='no_novel_juncs', help="Only look for junctions indicated in the \
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
197 supplied GFF file. (ignored without -G)")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
198 parser.add_option( '', '--no-novel-indels', action="store_true", dest='no_novel_indels', help="Skip indel search. Indel search is enabled by default.")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
199 # Types of search.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
200 parser.add_option( '', '--microexon-search', action="store_true", dest='microexon_search', help='With this option, the pipeline will attempt to find alignments incident to microexons. Works only for reads 50bp or longer.')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
201 parser.add_option( '', '--closure-search', action="store_true", dest='closure_search', help='Enables the mate pair closure-based search for junctions. Closure-based search should only be used when the expected inner distance between mates is small (<= 50bp)')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
202 parser.add_option( '', '--no-closure-search', action="store_false", dest='closure_search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
203 parser.add_option( '', '--coverage-search', action="store_true", dest='coverage_search', help='Enables the coverage based search for junctions. Use when coverage search is disabled by default (such as for reads 75bp or longer), for maximum sensitivity.')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
204 parser.add_option( '', '--no-coverage-search', action="store_false", dest='coverage_search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
205 parser.add_option( '', '--min-segment-intron', dest='min_segment_intron', help='Minimum intron length that may be found during split-segment search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
206 parser.add_option( '', '--max-segment-intron', dest='max_segment_intron', help='Maximum intron length that may be found during split-segment search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
207 parser.add_option( '', '--min-closure-exon', dest='min_closure_exon', help='Minimum length for exonic hops in potential splice graph' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
208 parser.add_option( '', '--min-closure-intron', dest='min_closure_intron', help='Minimum intron length that may be found during closure search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
209 parser.add_option( '', '--max-closure-intron', dest='max_closure_intron', help='Maximum intron length that may be found during closure search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
210 parser.add_option( '', '--min-coverage-intron', dest='min_coverage_intron', help='Minimum intron length that may be found during coverage search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
211 parser.add_option( '', '--max-coverage-intron', dest='max_coverage_intron', help='Maximum intron length that may be found during coverage search' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
212
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
213 # Wrapper options.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
214 parser.add_option( '-1', '--input1', dest='input1', help='A list of the (forward or single-end) reads files of Sanger FASTQ format, txt format' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
215 parser.add_option( '-2', '--input2', dest='input2', help='The list of reverse reads file in Sanger FASTQ format' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
216 parser.add_option( '', '--single-paired', dest='single_paired', help='' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
217 parser.add_option( '', '--settings', dest='settings', help='' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
218
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
219 (options, args) = parser.parse_args()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
220
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
221 # output version # of tool
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
222 try:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
223 tmp_files = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
224 tmp = tempfile.NamedTemporaryFile().name
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
225 tmp_files.append(tmp)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
226 tmp_stdout = open( tmp, 'wb' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
227 proc = subprocess.Popen( args='tophat -v', shell=True, stdout=tmp_stdout )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
228 tmp_stdout.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
229 returncode = proc.wait()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
230 stdout = open( tmp_stdout.name, 'rb' ).readline().strip()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
231 if stdout:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
232 sys.stdout.write( '%s\n' % stdout )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
233 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
234 raise Exception
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
235 except:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
236 sys.stdout.write( 'Could not determine Tophat version\n' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
237
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
238 # Color or base space
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
239 space = ''
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
240 if options.color_space:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
241 space = '-C'
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
242
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
243
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
244 #reads = options.input1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
245 file = open(options.input1,"r")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
246 lines = file.readlines()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
247 inputFileNames = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
248 accepted_hits_outputNames = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
249 outputName = options.outputTxtFile
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
250 resDirName = os.path.dirname(outputName) + '/'
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
251 out = open(outputName, "w")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
252 for line in lines:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
253 tab = line.split()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
254 inputFileNames.append(tab[1])
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
255 aHitOutName = resDirName + tab[0] + '_' + options.accepted_hits_output_file
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
256 accepted_hits_outputNames.append(aHitOutName)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
257 out.write(tab[0] + '\t' + aHitOutName + '\n')
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
258 file.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
259 out.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
260
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
261 if options.input2:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
262 revFile = open(options.input2,"r")
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
263 lines = revFile.readlines()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
264 inputRevFileNames = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
265 for line in lines:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
266 revTab = line.split()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
267 inputRevFileNames.append(revTab[1])
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
268 revFile.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
269
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
270
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
271 # Creat bowtie index if necessary.
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
272 tmp_index_dirs = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
273 index_paths = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
274 tmp_index_dir = tempfile.mkdtemp(dir="%s" % os.getcwd())
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
275 tmp_index_dirs.append(tmp_index_dir)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
276 if options.own_file:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
277 index_path = os.path.join( tmp_index_dir, '.'.join( os.path.split( options.own_file )[1].split( '.' )[:-1] ) )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
278 index_paths.append(index_path)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
279 try:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
280 os.link( options.own_file, index_path + '.fa' )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
281 except:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
282 # Tophat prefers (but doesn't require) fasta file to be in same directory, with .fa extension
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
283 pass
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
284 lCmdsTuples =[]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
285 acronym = "tophat_index"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
286 jobdb = TableJobAdaptatorFactory.createJobInstance()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
287 iLauncher = Launcher(jobdb, os.getcwd(), "", "", os.getcwd(), os.getcwd(), "jobs", "", acronym, acronym, False, True)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
288 cmd_index = iLauncher.getSystemCommand("bowtie-build", [space, "-f %s" % options.own_file, index_path])
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
289 cmd2Launch = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
290 cmdStart = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
291 cmdFinish = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
292 cmd2Launch.append(cmd_index)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
293 lCmdsTuples.append(_map(iLauncher, cmd2Launch, cmdStart, cmdFinish))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
294 iLauncher.runLauncherForMultipleJobs(acronym, lCmdsTuples, True)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
295 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
296 for file in inputFileNames:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
297 tmp_index_dir = tempfile.mkdtemp()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
298 index_path = tmp_index_dir + '/' + os.path.basename(file).split('.')[0]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
299 index_paths.append(index_path)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
300 tmp_index_dirs.append(tmp_index_dir)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
301
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
302
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
303
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
304 acronym = "tophat"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
305 jobdb = TableJobAdaptatorFactory.createJobInstance()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
306 iLauncher = Launcher(jobdb, os.getcwd(), "", "", os.getcwd(), os.getcwd(), "jobs", "", acronym, acronym, False, True)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
307 lCmdsTuples = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
308 dCutOut2Out = {}
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
309 lAllFile2remove = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
310 # for inputFileName in inputFileNames:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
311 for i in range(len(inputFileNames)):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
312 lCutOutput = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
313 lCutInputFile = splitFastQ(inputFileNames[i], 20000)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
314 lAllFile2remove.extend(lCutInputFile)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
315 if options.input2:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
316 lCutPairInputFile = splitFastQ(inputRevFileNames[i], 20000)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
317 lAllFile2remove.extend(lCutPairInputFile)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
318 for j in range(len(lCutInputFile)):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
319 cutOutput = "%s_out" % lCutInputFile[j]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
320 lCutOutput.append(cutOutput)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
321 lAllFile2remove.extend(lCutOutput)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
322 cmd2Launch = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
323 if options.input2:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
324 inputRevFile = lCutPairInputFile[j]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
325 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
326 inputRevFile = ""
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
327 if options.own_file:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
328 cmd2Launch.append(_createTopHatCommand(iLauncher, options, index_paths[0], lCutInputFile[j], inputRevFile, space))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
329 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
330 cmd2Launch.append(_createTopHatCommand(iLauncher, options, index_paths[i], lCutInputFile[j], inputRevFile, space))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
331 cmdStart = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
332 cmdFinish = ["shutil.copyfile( os.path.join( 'tophat_out', 'accepted_hits.bam' ), '%s')" % cutOutput]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
333 lCmdsTuples.append(_map(iLauncher, cmd2Launch, cmdStart, cmdFinish))
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
334 dCutOut2Out[accepted_hits_outputNames[i]] = lCutOutput
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
335 iLauncher.runLauncherForMultipleJobs(acronym, lCmdsTuples, True)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
336
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
337 joinBAM(dCutOut2Out)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
338 FileUtils.removeFilesFromListIfExist(lAllFile2remove)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
339
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
340 if options.outputTar != None:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
341 toTar(options.outputTar, accepted_hits_outputNames)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
342
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
343
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
344 # Clean up temp dirs
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
345 for tmp_index_dir in tmp_index_dirs:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
346 if os.path.exists( tmp_index_dir ):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
347 shutil.rmtree( tmp_index_dir )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
348
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
349 for tmp in tmp_files:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
350 os.remove(tmp)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
351
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
352
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
353 if __name__=="__main__": __main__()