Mercurial > repos > rmarenco > hubarchivecreator
comparison util/subtools.py @ 16:3233451a3bd6 draft
planemo upload for repository https://github.com/goeckslab/hub-archive-creator commit fc73ec22a0db3ab09c4ac13dc58f0b54ae37845c
| author | rmarenco |
|---|---|
| date | Sun, 25 Sep 2016 11:25:38 -0400 |
| parents | 25809f699cb3 |
| children | 884ee2a71680 |
comparison
equal
deleted
inserted
replaced
| 15:2a45cd656e8e | 16:3233451a3bd6 |
|---|---|
| 26 """ | 26 """ |
| 27 This class handle exceptions and call the tool. | 27 This class handle exceptions and call the tool. |
| 28 It maps the signature of subprocess.check_call: | 28 It maps the signature of subprocess.check_call: |
| 29 See https://docs.python.org/2/library/subprocess.html#subprocess.check_call | 29 See https://docs.python.org/2/library/subprocess.html#subprocess.check_call |
| 30 """ | 30 """ |
| 31 stdin = kwargs.get('stdin') | 31 stdout = kwargs.get('stdout', subprocess.PIPE) |
| 32 stdout = kwargs.get('stdout') | 32 stderr = kwargs.get('stderr', subprocess.PIPE) |
| 33 stderr = kwargs.get('stderr') | 33 shell = kwargs.get('shell', False) |
| 34 shell = kwargs.get('shell') | |
| 35 | 34 |
| 36 cmd = array_call[0] | 35 cmd = array_call[0] |
| 37 | 36 |
| 38 output = None | 37 output = None |
| 39 error = None | 38 error = None |
| 43 | 42 |
| 44 logging.debug("---------") | 43 logging.debug("---------") |
| 45 | 44 |
| 46 # TODO: Use universal_newlines option from Popen? | 45 # TODO: Use universal_newlines option from Popen? |
| 47 try: | 46 try: |
| 48 p = subprocess.Popen(array_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=shell) | 47 p = subprocess.Popen(array_call, stdout=stdout, stderr=stderr, shell=shell) |
| 48 | |
| 49 # TODO: Change this because of possible memory issues => https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate | |
| 50 | |
| 49 output, error = p.communicate() | 51 output, error = p.communicate() |
| 50 | 52 |
| 51 logging.debug("\t{0}".format(output)) | 53 if stdout == subprocess.PIPE: |
| 54 logging.debug("\t{0}".format(output)) | |
| 55 else: | |
| 56 logging.debug("\tOutput in file {0}".format(stdout.name)) | |
| 52 # If we detect an error from the subprocess, then we raise an exception | 57 # If we detect an error from the subprocess, then we raise an exception |
| 53 # TODO: Manage if we raise an exception for everything, or use CRITICAL etc... but not stop process | 58 # TODO: Manage if we raise an exception for everything, or use CRITICAL etc... but not stop process |
| 54 # TODO: The responsability of returning a sys.exit() should not be there, but up in the app. | 59 # TODO: The responsability of returning a sys.exit() should not be there, but up in the app. |
| 55 if p.returncode: | 60 if p.returncode: |
| 56 raise PopenError(cmd, error, p.returncode) | 61 if stderr == subprocess.PIPE: |
| 62 raise PopenError(cmd, error, p.returncode) | |
| 63 else: | |
| 64 # TODO: To Handle properly with a design behind, if we received a option as a file for the error | |
| 65 raise Exception("Error when calling {0}. Error as been logged in your file {1}. Error code: {2}"\ | |
| 66 .format(cmd, stderr.name, p.returncode)) | |
| 57 | 67 |
| 58 except OSError as e: | 68 except OSError as e: |
| 59 message = "The subprocess {0} has encountered an OSError: {1}".format(cmd, e.strerror) | 69 message = "The subprocess {0} has encountered an OSError: {1}".format(cmd, e.strerror) |
| 60 if e.filename: | 70 if e.filename: |
| 61 message = '\n'.join((message, ", against this file: {0}".format(e.filename))) | 71 message = '\n'.join((message, ", against this file: {0}".format(e.filename))) |
| 73 logging.exception(message) | 83 logging.exception(message) |
| 74 | 84 |
| 75 sys.exit(-1) | 85 sys.exit(-1) |
| 76 return p | 86 return p |
| 77 | 87 |
| 78 | |
| 79 def twoBitInfo(two_bit_file_name, two_bit_info_file): | 88 def twoBitInfo(two_bit_file_name, two_bit_info_file): |
| 80 """ | 89 """ |
| 81 Call twoBitInfo and write the result into twoBit_info_file | 90 Call twoBitInfo and write the result into twoBit_info_file |
| 82 :param two_bit_file_name: | 91 :param two_bit_file_name: |
| 83 :param two_bit_info_file: | 92 :param two_bit_info_file: |
| 85 """ | 94 """ |
| 86 array_call = ['twoBitInfo', two_bit_file_name, two_bit_info_file] | 95 array_call = ['twoBitInfo', two_bit_file_name, two_bit_info_file] |
| 87 p = _handleExceptionAndCheckCall(array_call) | 96 p = _handleExceptionAndCheckCall(array_call) |
| 88 return p | 97 return p |
| 89 | 98 |
| 90 | |
| 91 def faToTwoBit(fasta_file_name, twoBitFile): | 99 def faToTwoBit(fasta_file_name, twoBitFile): |
| 92 """ | 100 """ |
| 93 This function call faToTwoBit UCSC tool, and return the twoBitFile | 101 This function call faToTwoBit UCSC tool, and return the twoBitFile |
| 94 :param fasta_file_name: | 102 :param fasta_file_name: |
| 95 :param mySpecieFolder: | 103 :param mySpecieFolder: |
| 99 array_call = ['faToTwoBit', fasta_file_name, twoBitFile] | 107 array_call = ['faToTwoBit', fasta_file_name, twoBitFile] |
| 100 _handleExceptionAndCheckCall(array_call) | 108 _handleExceptionAndCheckCall(array_call) |
| 101 | 109 |
| 102 return twoBitFile | 110 return twoBitFile |
| 103 | 111 |
| 104 | |
| 105 def gtfToGenePred(input_gtf_file_name, gene_pred_file_name): | 112 def gtfToGenePred(input_gtf_file_name, gene_pred_file_name): |
| 106 """ | 113 """ |
| 107 Call gtfToGenePred and write the result into gene_pred_file_name | 114 Call gtfToGenePred and write the result into gene_pred_file_name |
| 108 :param input_gtf_file_name: | 115 :param input_gtf_file_name: |
| 109 :param gene_pred_file_name: | 116 :param gene_pred_file_name: |
| 110 :return: | 117 :return: |
| 111 """ | 118 """ |
| 112 array_call = ['gtfToGenePred', input_gtf_file_name, gene_pred_file_name] | 119 array_call = ['gtfToGenePred', input_gtf_file_name, gene_pred_file_name] |
| 113 p = _handleExceptionAndCheckCall(array_call) | 120 p = _handleExceptionAndCheckCall(array_call) |
| 114 return p | 121 return p |
| 115 | |
| 116 | 122 |
| 117 def gff3ToGenePred(input_gff3_file_name, gene_pred_file_name): | 123 def gff3ToGenePred(input_gff3_file_name, gene_pred_file_name): |
| 118 """ | 124 """ |
| 119 Call gff3ToGenePred and write the result into gene_pred_file_name | 125 Call gff3ToGenePred and write the result into gene_pred_file_name |
| 120 :param input_gff3_file_name: | 126 :param input_gff3_file_name: |
| 147 """ | 153 """ |
| 148 array_call = ['genePredToBed', gene_pred_file_name, unsorted_bed_file_name] | 154 array_call = ['genePredToBed', gene_pred_file_name, unsorted_bed_file_name] |
| 149 p = _handleExceptionAndCheckCall(array_call) | 155 p = _handleExceptionAndCheckCall(array_call) |
| 150 return p | 156 return p |
| 151 | 157 |
| 152 | |
| 153 def sort(unsorted_bed_file_name, sorted_bed_file_name): | 158 def sort(unsorted_bed_file_name, sorted_bed_file_name): |
| 154 """ | 159 """ |
| 155 Call sort with -k1,1 -k2,2n on unsorted_bed_file_name and write the result into sorted_bed_file_name | 160 Call sort with -k1,1 -k2,2n on unsorted_bed_file_name and write the result into sorted_bed_file_name |
| 156 :param unsorted_bed_file_name: | 161 :param unsorted_bed_file_name: |
| 157 :param sorted_bed_file_name: | 162 :param sorted_bed_file_name: |
| 159 """ | 164 """ |
| 160 array_call = ['sort', '-k', '1,1', '-k', '2,2n', unsorted_bed_file_name, '-o', sorted_bed_file_name] | 165 array_call = ['sort', '-k', '1,1', '-k', '2,2n', unsorted_bed_file_name, '-o', sorted_bed_file_name] |
| 161 p = _handleExceptionAndCheckCall(array_call) | 166 p = _handleExceptionAndCheckCall(array_call) |
| 162 return p | 167 return p |
| 163 | 168 |
| 164 | |
| 165 def sortChromSizes(two_bit_info_file_name, chrom_sizes_file_name): | 169 def sortChromSizes(two_bit_info_file_name, chrom_sizes_file_name): |
| 166 """ | 170 """ |
| 167 Call sort with -k2rn on two_bit_info_file_name and write the result into chrom_sizes_file_name | 171 Call sort with -k2rn on two_bit_info_file_name and write the result into chrom_sizes_file_name |
| 168 :param two_bit_info_file_name: | 172 :param two_bit_info_file_name: |
| 169 :param chrom_sizes_file_name: | 173 :param chrom_sizes_file_name: |
| 170 :return: | 174 :return: |
| 171 """ | 175 """ |
| 172 array_call = ['sort', '-k2rn', two_bit_info_file_name, '-o', chrom_sizes_file_name] | 176 array_call = ['sort', '-k2rn', two_bit_info_file_name, '-o', chrom_sizes_file_name] |
| 173 p = _handleExceptionAndCheckCall(array_call) | 177 p = _handleExceptionAndCheckCall(array_call) |
| 174 return p | 178 return p |
| 175 | |
| 176 | 179 |
| 177 def bedToBigBed(sorted_bed_file_name, chrom_sizes_file_name, big_bed_file_name, | 180 def bedToBigBed(sorted_bed_file_name, chrom_sizes_file_name, big_bed_file_name, |
| 178 typeOption=None, autoSql=None, tab=False): | 181 typeOption=None, autoSql=None, tab=False): |
| 179 """ | 182 """ |
| 180 Call bedToBigBed on sorted_bed_file_name, using chrom_sizes_file_name and write the result into big_bed_file_name | 183 Call bedToBigBed on sorted_bed_file_name, using chrom_sizes_file_name and write the result into big_bed_file_name |
| 204 array_call.append('-tab') | 207 array_call.append('-tab') |
| 205 | 208 |
| 206 p = _handleExceptionAndCheckCall(array_call) | 209 p = _handleExceptionAndCheckCall(array_call) |
| 207 return p | 210 return p |
| 208 | 211 |
| 209 | |
| 210 def sortBam(input_bam_file_name, output_sorted_bam_name): | 212 def sortBam(input_bam_file_name, output_sorted_bam_name): |
| 211 """ | 213 """ |
| 212 Call samtools on input_bam_file_name and output the result in output_sorted_bam_name | 214 Call samtools on input_bam_file_name and output the result in output_sorted_bam_name |
| 213 :param input_bam_file_name: | 215 :param input_bam_file_name: |
| 214 :param output_sorted_bam_name: | 216 :param output_sorted_bam_name: |
| 216 """ | 218 """ |
| 217 array_call = ['samtools', 'sort', input_bam_file_name, '-o', output_sorted_bam_name] | 219 array_call = ['samtools', 'sort', input_bam_file_name, '-o', output_sorted_bam_name] |
| 218 p = _handleExceptionAndCheckCall(array_call) | 220 p = _handleExceptionAndCheckCall(array_call) |
| 219 return p | 221 return p |
| 220 | 222 |
| 221 | |
| 222 def createBamIndex(input_sorted_bam_file_name, output_name_index_name): | 223 def createBamIndex(input_sorted_bam_file_name, output_name_index_name): |
| 223 """ | 224 """ |
| 224 Call `samtools index` on imput_sorted_bam_file_name and output the result in output_name_index_name | 225 Call `samtools index` on imput_sorted_bam_file_name and output the result in output_name_index_name |
| 225 :param input_sorted_bam_file_name: | 226 :param input_sorted_bam_file_name: |
| 226 :param output_name_index_name: | 227 :param output_name_index_name: |
| 227 :return: | 228 :return: |
| 228 """ | 229 """ |
| 229 array_call = ['samtools', 'index', input_sorted_bam_file_name, output_name_index_name] | 230 array_call = ['samtools', 'index', input_sorted_bam_file_name, output_name_index_name] |
| 230 p = _handleExceptionAndCheckCall(array_call) | 231 p = _handleExceptionAndCheckCall(array_call) |
| 231 return p | 232 return p |
| 233 | |
| 234 def pslToBigPsl(input_psl_file_name, output_bed12_file_name): | |
| 235 """ | |
| 236 Call `pslToBigPsl` on input_psl_file_name and output the result in output_bed12_file_name | |
| 237 :param input_psl_file_name: Name of the psl input file | |
| 238 :param output_bed12_file_name: Name of the output file where to store the result of the cmd | |
| 239 :return: | |
| 240 """ | |
| 241 # The command to send | |
| 242 array_call = ['pslToBigPsl', input_psl_file_name, output_bed12_file_name] | |
| 243 | |
| 244 p = _handleExceptionAndCheckCall(array_call) | |
| 245 return p |
