Mercurial > repos > galaxyp > maxquant
diff mqwrapper.py @ 1:8bac3cc5c5de draft
planemo upload for repository https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/maxquant commit ab4e4f1817080cbe8a031a82cb180610ff140847
author | galaxyp |
---|---|
date | Sat, 20 Jul 2019 05:01:05 -0400 |
parents | |
children | 666f3453a99d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mqwrapper.py Sat Jul 20 05:01:05 2019 -0400 @@ -0,0 +1,148 @@ +""" +Run MaxQuant on a modified mqpar.xml. +Use maxquant conda package. +TODO: add support for parameter groups + +Authors: Damian Glaetzer <d.glaetzer@mailbox.org> + +based on the maxquant galaxy tool by John Chilton: +https://github.com/galaxyproteomics/tools-galaxyp/tree/master/tools/maxquant +""" + +import argparse +import os +import shutil +import subprocess + +import mqparam + +# build parser +parser = argparse.ArgumentParser() + +# input, special outputs and others +other_args = ('raw_files', 'mzxml_files', 'fasta_files', + 'description_parse_rule', 'identifier_parse_rule', + 'exp_design', 'output_all', + 'mqpar_out', 'infile_names', 'mzTab', + 'version', 'substitution_rx') + +# txt result files +txt_output = ('evidence', 'msms', 'parameters', + 'peptides', 'proteinGroups', 'allPeptides', + 'libraryMatch', 'matchedFeatures', + 'modificationSpecificPeptides', 'ms3Scans', + 'msmsScans', 'mzRange', 'peptideSection', + 'summary') + +# arguments for mqparam +## global +global_flags = ('calc_peak_properties', + 'write_mztab', + 'ibaq', + 'ibaq_log_fit', + 'separate_lfq', + 'lfq_stabilize_large_ratios', + 'lfq_require_msms', + 'advanced_site_intensities', + 'match_between_runs') + +global_simple_args = ('min_unique_pep', + 'num_threads', + 'min_peptide_len', + 'max_peptide_mass') + +## parameter group specific +param_group_flags = ('lfq_skip_norm',) + +param_group_simple_args = ('missed_cleavages', + 'lfq_mode', + 'lfq_min_edges_per_node', + 'lfq_avg_edges_per_node', + 'lfq_min_ratio_count') + +param_group_silac_args = ('light_mods', 'medium_mods', 'heavy_mods') + +list_args = ('fixed_mods', 'var_mods', 'proteases') + +arguments = ['--' + el for el in (txt_output + + global_simple_args + + param_group_simple_args + + list_args + + param_group_silac_args + + other_args)] + +flags = ['--' + el for el in global_flags + param_group_flags] + +for arg in arguments: + parser.add_argument(arg) +for flag in flags: + parser.add_argument(flag, action="store_true") + +args = vars(parser.parse_args()) + +# link infile datasets to names with correct extension +# for maxquant to accept them +files = (args['raw_files'] if args['raw_files'] + else args['mzxml_files']).split(',') +ftype = ".thermo.raw" if args['raw_files'] else ".mzXML" +filenames = args['infile_names'].split(',') +fnames_with_ext = [(a if a.endswith(ftype) + else os.path.splitext(a)[0] + ftype) + for a in filenames] + +for f, l in zip(files, fnames_with_ext): + os.link(f, l) + +# build mqpar.xml +mqpar_in = os.path.join(os.getcwd(), 'mqpar.xml') +subprocess.run(('maxquant', '-c', mqpar_in)) +mqpar_out = args['mqpar_out'] if args['mqpar_out'] != 'None' else mqpar_in + + +exp_design = args['exp_design'] if args['exp_design'] != 'None' else None +m = mqparam.MQParam(mqpar_out, mqpar_in, exp_design, + substitution_rx=args['substitution_rx']) +if m.version != args['version']: + raise Exception('mqpar version is ' + m.version + + '. Tool uses version {}.'.format(args['version'])) + +# modify parameters, interactive mode if no mqpar_in was specified +m.add_infiles([os.path.join(os.getcwd(), name) for name in fnames_with_ext], True) +m.add_fasta_files(args['fasta_files'].split(','), + identifier=args['identifier_parse_rule'], + description=args['description_parse_rule']) + +for e in (global_simple_args + + param_group_simple_args + + global_flags + + param_group_flags): + if args[e]: + m.set_simple_param(e, args[e]) + +for e in list_args: + if args[e]: + m.set_list_params(e, args[e].split(',')) + +if args['light_mods'] or args['medium_mods'] or args['heavy_mods']: + m.set_silac(args['light_mods'].split(',') if args['light_mods'] else None, + args['medium_mods'].split(',') if args['medium_mods'] else None, + args['heavy_mods'].split(',') if args['heavy_mods'] else None) + +m.write() + +# build and run MaxQuant command +cmd = ['maxquant', mqpar_out] + +subprocess.run(cmd, check=True, cwd='./') + +# copy results to galaxy database +for el in txt_output: + destination = args[el] + source = os.path.join(os.getcwd(), "combined", "txt", "{}.txt".format(el)) + if destination != 'None' and os.path.isfile(source): + shutil.copy(source, destination) + +if args['mzTab'] != 'None': + source = os.path.join(os.getcwd(), "combined", "txt", "mzTab.mzTab") + if os.path.isfile(source): + shutil.copy(source, args['mzTab'])