def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) if not opts.counts_fname: parser.error("An otu table file must be specified") if not opts.map_fname: parser.error("A Map file must be specified") prefs,data,background_color,label_color, ball_scale, arrow_colors= \ sample_color_prefs_and_map_data_from_options(opts) dir_path = opts.dir_path if dir_path==None or dir_path=='': dir_path = get_random_directory_name() create_dir(dir_path) create_dir(os.path.join(dir_path,"otu_network")) create_dir(os.path.join(dir_path,"otu_network/props")) create_dir(os.path.join(dir_path,"otu_network/stats")) map_lines = open(opts.map_fname,'U').readlines() otu_sample_lines = open(opts.counts_fname, 'U').readlines() create_network_and_stats(dir_path,map_lines,otu_sample_lines,prefs,data,background_color,label_color)
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) prefs,data,background_color,label_color, ball_scale, arrow_colors= \ sample_color_prefs_and_map_data_from_options(opts) dir_path = opts.output_dir create_dir(dir_path) create_dir(os.path.join(dir_path,"otu_network")) create_dir(os.path.join(dir_path,"otu_network/props")) create_dir(os.path.join(dir_path,"otu_network/stats")) map_lines = open(opts.map_fname,'U').readlines() create_network_and_stats(dir_path,map_lines,opts.input_fp,prefs,data,background_color,label_color)
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) prefs, data, background_color, label_color, ball_scale, arrow_colors = \ sample_color_prefs_and_map_data_from_options(opts) dir_path = opts.output_dir create_dir(dir_path) create_dir(os.path.join(dir_path, "otu_network")) create_dir(os.path.join(dir_path, "otu_network/props")) create_dir(os.path.join(dir_path, "otu_network/stats")) map_lines = open(opts.map_fname, 'U').readlines() create_network_and_stats(dir_path, map_lines, opts.input_fp, prefs, data, background_color, label_color)
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) input_dir = opts.input_dir imagetype = opts.imagetype resolution = opts.resolution output_dir = opts.output_dir ymax = opts.ymax std_type = opts.std_type suppress_webpage = opts.suppress_html_output output_type = opts.output_type generate_per_sample_plots = opts.generate_per_sample_plots generate_average_tables = opts.generate_average_tables # Get the command-line options. prefs, data, background_color, label_color, ball_scale, arrow_colors = \ sample_color_prefs_and_map_data_from_options(opts) rares = {} if isdir(input_dir): rarenames = listdir(input_dir) rarenames = [r for r in rarenames if not r.startswith('.')] for r in rarenames: try: rarefl = open(path.join(input_dir, r), 'U').readlines() rares[r] = parse_rarefaction(rarefl) except(IOError): option_parser.error('Problem with rarefaction file. %s' % exc_info()[1]) exit(0) else: try: input_file = input_dir.split(',') for i in range(len(input_file)): input_path = split(input_file[i])[-1] rarefl = open(input_file[i], 'U').readlines() rares[input_path] = parse_rarefaction(rarefl) except(IOError): option_parser.error('Problem with rarefaction file. %s' % exc_info()[1]) exit(0) if imagetype not in ['png', 'svg', 'pdf']: option_parser.error('Supplied extension not supported.') exit(0) try: resolution = int(resolution) except(ValueError): option_parser.error('Inavlid resolution.') exit(0) # output directory check if isinstance(output_dir, str) and output_dir != '.': if exists(output_dir): output_dir = output_dir else: try: create_dir(output_dir, False) output_dir = output_dir except(ValueError): option_parser.error('Could not create output directory.') exit(0) else: output_dir = get_random_directory_name() # Generate the plots and html text html_output = make_averages(prefs, data, background_color, label_color, rares, output_dir, resolution, imagetype, ymax, suppress_webpage, std_type, output_type, generate_per_sample_plots=generate_per_sample_plots, generate_average_tables=generate_average_tables) if html_output: # Write the html file. outfile = open(path.join(output_dir, 'rarefaction_plots.html'), 'w') outfile.write(html_output) outfile.close()
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) prefs, data, background_color, label_color, ball_scale, arrow_colors = \ sample_color_prefs_and_map_data_from_options(opts) if len(opts.coord_fnames.split(',')) < 2 and opts.edges_file is None: option_parser.error('Please provide at least two ' +\ 'coordinate files or a custom edges file') #Open and get coord data (for multiple coords files) coord_files = process_coord_filenames(opts.coord_fnames) coord_files_valid = validate_coord_files(coord_files) if not coord_files_valid: option_parser.error('Every line of every coord file must ' +\ 'have the same number of columns.') num_coord_files = len(coord_files) data['edges'], data['coord'] = \ get_multiple_coords(coord_files, opts.edges_file, opts.serial) # if the edges file wasn't supplied, we appended _i to each file's samples # therefore we now add duplicated samples with _0, _1,... to mapping file if opts.edges_file is None: newmap = [data['map'][0]] for i in xrange(len(coord_files)): for sample in data['map'][1:]: newsample = ['%s_%d' %(sample[0],i)] newsample.extend(sample[1:]) newmap.append(newsample) data['map'] = newmap # remove any samples not present in mapping file remove_unmapped_samples(data['map'],data['coord'],data['edges']) if(len(data['coord'][1]) == 0): raise ValueError, '\n\nError: None of the sample IDs in the coordinates files were present in the mapping file.\n' # process custom axes, if present. custom_axes = None if opts.custom_axes: custom_axes = process_custom_axes(opts.custom_axes) get_custom_coords(custom_axes, data['map'], data['coord']) remove_nans(data['coord']) scale_custom_coords(custom_axes,data['coord']) # Generate random output file name and create directories if opts.output_dir: create_dir(opts.output_dir) dir_path = opts.output_dir else: dir_path='./' qiime_dir=get_qiime_project_dir() jar_path=os.path.join(qiime_dir,'qiime/support_files/jar/') data_dir_path = get_random_directory_name(output_dir=dir_path, return_absolute_path=False) try: os.mkdir(data_dir_path) except OSError: pass jar_dir_path = os.path.join(dir_path,'jar') try: os.mkdir(jar_dir_path) except OSError: pass shutil.copyfile(os.path.join(jar_path,'king.jar'), os.path.join(jar_dir_path,'king.jar')) filepath=coord_files[0] filename=filepath.strip().split('/')[-1] try: action = generate_3d_plots except NameError: action = None #Place this outside try/except so we don't mask NameError in action if action: generate_3d_plots(prefs, data, custom_axes, background_color, label_color, dir_path, data_dir_path, filename, ball_scale=ball_scale, arrow_colors=arrow_colors, user_supplied_edges=not(opts.edges_file is None))
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) # Some code for error checking of input args: # Check if distance_matrix_file is valid: try: d_header, d_mat = parse_distmat(open(opts.distance_matrix_file, "U")) except: option_parser.error( "This does not look like a valid distance matrix file. Please supply a valid distance matrix file using the -d option." ) if not is_symmetric_and_hollow(d_mat): option_parser.error("The distance matrix must be symmetric and " "hollow.") # Check if map_fname is valid: try: mapping, m_header, m_comments = parse_mapping_file(open(opts.map_fname, "U")) except QiimeParseError: option_parser.error( "This does not look like a valid metadata mapping file. Please supply a valid mapping file using the -m option." ) # make sure background_color is valid if opts.background_color not in ["black", "white"]: option_parser.error( "'%s' is not a valid background color. Please pass in either 'black' or 'white' using the -k option." % (opts.background_color) ) # make sure prefs file is valid if it exists if opts.prefs_path is not None: try: prefs_file = open(opts.prefs_path, "U").read() except IOError: option_parser.error( "Provided prefs file, '%s', does not exist. Please pass in a valid prefs file with the -p option." % (opts.prefs_path) ) if opts.prefs_path is not None: prefs = parse_prefs_file(prefs_file) else: prefs = None color_prefs, color_data, background_color, label_color, ball_scale, arrow_colors = sample_color_prefs_and_map_data_from_options( opts ) # list of labelname, groups, colors, data_colors, data_color_order groups_and_colors = list(iter_color_groups(mapping=color_data["map"], prefs=color_prefs)) # dict mapping labelname to list of: [groups, colors, data_colors, # data_color_order] field_to_colors = {} for color_info in groups_and_colors: field_to_colors[color_info[0]] = color_info[1:] qiime_dir = get_qiime_project_dir() + "/qiime/support_files/" fields = opts.fields if fields is not None: fields = map(strip, fields.split(",")) fields = [i.strip('"').strip("'") for i in fields] elif prefs is not None: fields = prefs.get("FIELDS", None) else: fields = get_interesting_mapping_fields(mapping, m_header) # Check that all provided fields are valid: if fields is not None: for f in fields: if f not in m_header: option_parser.error( "The field, %s, is not in the provided mapping file. Please supply correct fields (using the -f option or providing a 'FIELDS' list in the prefs file) corresponding to fields in mapping file." % (f) ) within_distances, between_distances, dmat = group_distances( mapping_file=opts.map_fname, dmatrix_file=opts.distance_matrix_file, fields=fields, dir_prefix=get_random_directory_name(output_dir=opts.dir_path, prefix="distances"), ) if not opts.suppress_html_output: # histograms output path histograms_path = path.join(opts.dir_path, "histograms") try: mkdir(histograms_path) except OSError: # raised if dir exists pass # draw all histograms distances_dict, label_to_histogram_filename = draw_all_histograms( single_field=within_distances, paired_field=between_distances, dmat=dmat, histogram_dir=histograms_path, field_to_color_prefs=field_to_colors, background_color=background_color, ) # Get relative path to histogram files. label_to_histogram_filename_relative = _make_relative_paths(label_to_histogram_filename, opts.dir_path) dm_fname = path.split(opts.distance_matrix_file)[-1] basename = path.splitext(dm_fname)[0] outfile_name = basename + "_distance_histograms.html" make_main_html( distances_dict=distances_dict, label_to_histogram_filename=label_to_histogram_filename_relative, root_outdir=opts.dir_path, outfile_name=outfile_name, title="Distance Histograms", ) # Handle saving web resources locally. # javascript file javascript_path = path.join(opts.dir_path, "js") try: mkdir(javascript_path) except OSError: # raised if dir exists pass js_out = open(javascript_path + "/histograms.js", "w") js_out.write(open(qiime_dir + "js/histograms.js").read()) js_out.close() monte_carlo_iters = opts.monte_carlo_iters if monte_carlo_iters > 0: # Do Monte Carlo for all fields monte_carlo_group_distances( mapping_file=opts.map_fname, dmatrix_file=opts.distance_matrix_file, prefs=prefs, dir_prefix=opts.dir_path, fields=fields, default_iters=monte_carlo_iters, ) # Do Monte Carlo for within and between fields monte_carlo_group_distances_within_between( single_field=within_distances, paired_field=between_distances, dmat=dmat, dir_prefix=opts.dir_path, num_iters=monte_carlo_iters, )
def main(): print "\nWarning: make_3d_plots.py is being deprecated in favor of make_emperor.py, and will no longer be available in QIIME 1.8.0-dev.\n" option_parser, opts, args = parse_command_line_parameters(**script_info) prefs, data, background_color, label_color, ball_scale, arrow_colors= \ sample_color_prefs_and_map_data_from_options(opts) plot_scaled= 'scaled' in opts.scaling_method plot_unscaled= 'unscaled' in opts.scaling_method if opts.output_format == 'invue': # validating the number of points for interpolation if (opts.interpolation_points<0): option_parser.error('The --interpolation_points should be ' +\ 'greater or equal to 0.') # make sure that coord file has internally consistent # of columns coord_files_valid = validate_coord_files(opts.coord_fname) if not coord_files_valid: option_parser.error('Every line of every coord file must ' +\ 'have the same number of columns.') #Open and get coord data data['coord'] = get_coord(opts.coord_fname, opts.ellipsoid_method) # remove any samples not present in mapping file remove_unmapped_samples(data['map'],data['coord']) # if no samples overlapped between mapping file and otu table, exit if len(data['coord'][0]) == 0: print "\nError: OTU table and mapping file had no samples in common\n" exit(1) if opts.output_dir: create_dir(opts.output_dir,False) dir_path=opts.output_dir else: dir_path='./' filepath=opts.coord_fname if os.path.isdir(filepath): coord_files = [fname for fname in os.listdir(filepath) if not \ fname.startswith('.')] filename = os.path.split(coord_files[0])[-1] else: filename = os.path.split(filepath)[-1] generate_3d_plots_invue(prefs, data, dir_path, filename, \ opts.interpolation_points, opts.polyhedron_points, \ opts.polyhedron_offset) #finish script return # Potential conflicts if not opts.custom_axes is None and os.path.isdir(opts.coord_fname): # can't do averaged pcoa plots _and_ custom axes in the same plot option_parser.error("Please supply either custom axes or multiple coordinate \ files, but not both.") # check that smoothness is an integer between 0 and 3 try: ellipsoid_smoothness = int(opts.ellipsoid_smoothness) except: option_parser.error("Please supply an integer ellipsoid smoothness \ value.") if ellipsoid_smoothness < 0 or ellipsoid_smoothness > 3: option_parser.error("Please supply an ellipsoid smoothness value \ between 0 and 3.") # check that opacity is a float between 0 and 1 try: ellipsoid_alpha = float(opts.ellipsoid_opacity) except: option_parser.error("Please supply a number for ellipsoid opacity.") if ellipsoid_alpha < 0 or ellipsoid_alpha > 1: option_parser.error("Please supply an ellipsoid opacity value \ between 0 and 1.") # check that ellipsoid method is valid ellipsoid_methods = ['IQR','sdev'] if not opts.ellipsoid_method in ellipsoid_methods: option_parser.error("Please supply a valid ellipsoid method. \ Valid methods are: " + ', '.join(ellipsoid_methods) + ".") # gather ellipsoid drawing preferences ellipsoid_prefs = {} ellipsoid_prefs["smoothness"] = ellipsoid_smoothness ellipsoid_prefs["alpha"] = ellipsoid_alpha # make sure that coord file has internally consistent # of columns coord_files_valid = validate_coord_files(opts.coord_fname) if not coord_files_valid: option_parser.error('Every line of every coord file must ' +\ 'have the same number of columns.') #Open and get coord data data['coord'] = get_coord(opts.coord_fname, opts.ellipsoid_method) # remove any samples not present in mapping file remove_unmapped_samples(data['map'],data['coord']) # if no samples overlapped between mapping file and otu table, exit if len(data['coord'][0]) == 0: print "\nError: OTU table and mapping file had no samples in common\n" exit(1) # process custom axes, if present. custom_axes = None if opts.custom_axes: custom_axes = process_custom_axes(opts.custom_axes) get_custom_coords(custom_axes, data['map'], data['coord']) remove_nans(data['coord']) scale_custom_coords(custom_axes,data['coord']) # process vectors if requested if opts.add_vectors: add_vectors={} add_vectors['vectors'] = opts.add_vectors.split(',') add_vectors['weight_by_vector'] = opts.weight_by_vector if len(add_vectors)>3: raise ValueError, 'You must add maximum 3 columns but %s' % opts.add_vectors # Validating Vectors values if opts.vectors_algorithm: axes_number = len(data['coord'][1][1]) if opts.vectors_axes<0 or opts.vectors_axes>axes_number: raise ValueError, 'vectors_algorithm should be between 0 and the max number' +\ 'of samples/pcoa-axes: %d' % len(data['coord'][1][1]) if opts.vectors_axes == 0: opts.vectors_axes = axes_number add_vectors['vectors_axes'] = opts.vectors_axes valid_chars = '_.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' for c in opts.vectors_path: if c not in valid_chars: raise ValueError, 'vectors_path (%s) has invalid chars' % opts.vectors_path add_vectors['vectors_output'] = {} add_vectors['vectors_algorithm']=opts.vectors_algorithm add_vectors['eigvals'] = data['coord'][3] add_vectors['window_size'] = None # checks specific for the modified first difference algorithm if add_vectors['vectors_algorithm'] == 'wdiff': try: add_vectors['window_size'] = int(opts.window_size) except TypeError: raise TypeError, 'Specify --window_size as an integer' # sanity check as the value can only be greater or equal to one if add_vectors['window_size'] < 1: raise ValueError, 'The value of window_size is invalid, '+\ 'the value must be greater than zero, not %d' % add_vectors['window_size'] else: add_vectors['vectors_algorithm'] = None add_vectors['vectors_path'] = opts.vectors_path else: add_vectors = None if opts.taxa_fname != None: # get taxonomy counts # get list of sample_ids that haven't been removed sample_ids = data['coord'][0] # get taxa summaries for all sample_ids lineages, taxa_counts = get_taxa(opts.taxa_fname, sample_ids) data['taxa'] = {} data['taxa']['lineages'] = lineages data['taxa']['counts'] = taxa_counts # get average relative abundance of taxa data['taxa']['prevalence'] = get_taxa_prevalence(data['taxa']['counts']) # get coordinates of taxa (weighted mean of sample scores) data['taxa']['coord'] = get_taxa_coords(data['taxa']['counts'], data['coord'][1]) # trim results, do NOT change order # check: https://github.com/qiime/qiime/issues/677 remove_rare_taxa(data['taxa'],nkeep=opts.n_taxa_keep) # write taxa coords if requested if not opts.biplot_output_file is None: output = make_biplot_scores_output(data['taxa']) fout = open(opts.biplot_output_file,'w') fout.write('\n'.join(output)) fout.close() if opts.output_dir: create_dir(opts.output_dir,False) dir_path=opts.output_dir else: dir_path='./' qiime_dir=get_qiime_project_dir() jar_path=os.path.join(qiime_dir,'qiime/support_files/jar/') data_dir_path = get_random_directory_name(output_dir=dir_path, return_absolute_path=False) try: os.mkdir(data_dir_path) except OSError: pass data_file_path=data_dir_path jar_dir_path = os.path.join(dir_path,'jar') try: os.mkdir(jar_dir_path) except OSError: pass shutil.copyfile(os.path.join(jar_path,'king.jar'), os.path.join(jar_dir_path,'king.jar')) filepath=opts.coord_fname if os.path.isdir(filepath): coord_files = [fname for fname in os.listdir(filepath) if not \ fname.startswith('.')] filename = os.path.split(coord_files[0])[-1] else: filename = os.path.split(filepath)[-1] try: action = generate_3d_plots except NameError: action = None #Place this outside try/except so we don't mask NameError in action if action: action(prefs,data,custom_axes,background_color,label_color,dir_path, \ data_file_path,filename,ellipsoid_prefs=ellipsoid_prefs, \ add_vectors=add_vectors, plot_scaled=plot_scaled, \ plot_unscaled=plot_unscaled)
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) data = {} prefs,data,background_color,label_color,ball_scale, arrow_colors= \ sample_color_prefs_and_map_data_from_options(opts) data['ellipsoid_method'] = opts.ellipsoid_method if 0.00 <= opts.ellipsoid_opacity <= 1.00: data['alpha'] = opts.ellipsoid_opacity else: raise ValueError, 'The opacity must be a value between 0 and 1!' #Open and get coord data if os.path.isdir(opts.coord_fname) and opts.master_pcoa: data['coord'], data['support_pcoas'] = load_pcoa_files( opts.coord_fname) data['coord'] = get_coord(opts.master_pcoa) elif os.path.isdir(opts.coord_fname): data['coord'], data['support_pcoas'] = load_pcoa_files( opts.coord_fname) else: data['coord'] = get_coord(opts.coord_fname) filepath = opts.coord_fname basename, extension = os.path.splitext(filepath) filename = '%s_2D_PCoA_plots' % (basename) qiime_dir = get_qiime_project_dir() js_path = os.path.join(qiime_dir, 'qiime', 'support_files', 'js') if opts.output_dir: if os.path.exists(opts.output_dir): dir_path = opts.output_dir else: try: os.mkdir(opts.output_dir) dir_path = opts.output_dir except OSError: pass else: dir_path = './' html_dir_path = dir_path data_dir_path = get_random_directory_name(output_dir=dir_path) try: os.mkdir(data_dir_path) except OSError: pass js_dir_path = os.path.join(html_dir_path, 'js') try: os.mkdir(js_dir_path) except OSError: pass shutil.copyfile(os.path.join(js_path,'overlib.js'), \ os.path.join(js_dir_path,'overlib.js')) try: action = generate_2d_plots except NameError: action = None #Place this outside try/except so we don't mask NameError in action if action: action(prefs, data, html_dir_path, data_dir_path, filename, background_color, label_color, opts.scree)
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) prefs, data, background_color, label_color, ball_scale, arrow_colors = \ sample_color_prefs_and_map_data_from_options(opts) if len(opts.coord_fnames) < 2 and opts.edges_file is None: option_parser.error('Please provide at least two ' +\ 'coordinate files or a custom edges file') #Open and get coord data (for multiple coords files) coord_files = opts.coord_fnames coord_files_valid = validate_coord_files(coord_files) if not coord_files_valid: option_parser.error('Every line of every coord file must ' +\ 'have the same number of columns.') num_coord_files = len(coord_files) data['edges'], data['coord'] = \ get_multiple_coords(coord_files, opts.edges_file, opts.serial) # if the edges file wasn't supplied, we appended _i to each file's samples # therefore we now add duplicated samples with _0, _1,... to mapping file if opts.edges_file is None: newmap = [data['map'][0]] for i in xrange(len(coord_files)): for sample in data['map'][1:]: newsample = ['%s_%d' %(sample[0],i)] newsample.extend(sample[1:]) newmap.append(newsample) data['map'] = newmap # remove any samples not present in mapping file remove_unmapped_samples(data['map'],data['coord'],data['edges']) if(len(data['coord'][1]) == 0): raise ValueError, '\n\nError: None of the sample IDs in the coordinates files were present in the mapping file.\n' # process custom axes, if present. custom_axes = None if opts.custom_axes: custom_axes = process_custom_axes(opts.custom_axes) get_custom_coords(custom_axes, data['map'], data['coord']) remove_nans(data['coord']) scale_custom_coords(custom_axes,data['coord']) # Generate random output file name and create directories if opts.output_dir: create_dir(opts.output_dir) dir_path = opts.output_dir else: dir_path='./' qiime_dir=get_qiime_project_dir() jar_path=os.path.join(qiime_dir,'qiime/support_files/jar/') data_dir_path = get_random_directory_name(output_dir=dir_path, return_absolute_path=False) try: os.mkdir(data_dir_path) except OSError: pass jar_dir_path = os.path.join(dir_path,'jar') try: os.mkdir(jar_dir_path) except OSError: pass shutil.copyfile(os.path.join(jar_path,'king.jar'), os.path.join(jar_dir_path,'king.jar')) filepath=coord_files[0] filename=filepath.strip().split('/')[-1] try: action = generate_3d_plots except NameError: action = None #Place this outside try/except so we don't mask NameError in action if action: generate_3d_plots(prefs, data, custom_axes, background_color, label_color, dir_path, data_dir_path, filename, ball_scale=ball_scale, arrow_colors=arrow_colors, user_supplied_edges=not(opts.edges_file is None))
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) matplotlib_version = re.split("[^\d]", matplotlib.__version__) matplotlib_version_info = tuple([int(i) for i in matplotlib_version if \ i.isdigit()]) if matplotlib_version_info != (1,1,0): print "This code was only tested with Matplotlib-1.1.0" data = {} prefs,data,background_color,label_color,ball_scale, arrow_colors= \ sample_color_prefs_and_map_data_from_options(opts) data['ellipsoid_method']=opts.ellipsoid_method if 0.00 <= opts.ellipsoid_opacity <= 1.00: data['alpha']=opts.ellipsoid_opacity else: raise ValueError, 'The opacity must be a value between 0 and 1!' #Open and get coord data if os.path.isdir(opts.coord_fname) and opts.master_pcoa: data['coord'],data['support_pcoas'] = load_pcoa_files(opts.coord_fname) data['coord']=get_coord(opts.master_pcoa) elif os.path.isdir(opts.coord_fname): data['coord'],data['support_pcoas'] = load_pcoa_files(opts.coord_fname) else: data['coord'] = get_coord(opts.coord_fname) filepath=opts.coord_fname basename,extension=os.path.splitext(filepath) filename='%s_2D_PCoA_plots' % (basename) qiime_dir=get_qiime_project_dir() js_path=os.path.join(qiime_dir,'qiime','support_files','js') if opts.output_dir: if os.path.exists(opts.output_dir): dir_path=opts.output_dir else: try: os.mkdir(opts.output_dir) dir_path=opts.output_dir except OSError: pass else: dir_path='./' html_dir_path=dir_path data_dir_path = get_random_directory_name(output_dir=dir_path) try: os.mkdir(data_dir_path) except OSError: pass js_dir_path = os.path.join(html_dir_path,'js') try: os.mkdir(js_dir_path) except OSError: pass shutil.copyfile(os.path.join(js_path,'overlib.js'), \ os.path.join(js_dir_path,'overlib.js')) try: action = generate_2d_plots except NameError: action = None #Place this outside try/except so we don't mask NameError in action if action: action(prefs,data,html_dir_path,data_dir_path,filename,background_color, label_color,opts.scree)
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) #Some code for error checking of input args: #Check if distance_matrix_file is valid: try: d_header, d_mat = parse_distmat(open(opts.distance_matrix_file, 'U')) except: option_parser.error( "This does not look like a valid distance matrix file. Please supply a valid distance matrix file using the -d option." ) if not is_symmetric_and_hollow(d_mat): option_parser.error("The distance matrix must be symmetric and " "hollow.") #Check if map_fname is valid: try: mapping, m_header, m_comments = \ parse_mapping_file(open(opts.map_fname,'U')) except QiimeParseError: option_parser.error( "This does not look like a valid metadata mapping file. Please supply a valid mapping file using the -m option." ) #make sure background_color is valid if opts.background_color not in ['black', 'white']: option_parser.error( "'%s' is not a valid background color. Please pass in either 'black' or 'white' using the -k option." % (opts.background_color)) #make sure prefs file is valid if it exists if opts.prefs_path is not None: try: prefs_file = open(opts.prefs_path, 'U').read() except IOError: option_parser.error( "Provided prefs file, '%s', does not exist. Please pass in a valid prefs file with the -p option." % (opts.prefs_path)) if opts.prefs_path is not None: prefs = parse_prefs_file(prefs_file) else: prefs = None color_prefs, color_data, background_color, label_color, ball_scale,\ arrow_colors=sample_color_prefs_and_map_data_from_options(opts) #list of labelname, groups, colors, data_colors, data_color_order groups_and_colors=list(iter_color_groups(mapping=color_data['map'],\ prefs=color_prefs)) #dict mapping labelname to list of: [groups, colors, data_colors, # data_color_order] field_to_colors = {} for color_info in groups_and_colors: field_to_colors[color_info[0]] = color_info[1:] qiime_dir = get_qiime_project_dir() + '/qiime/support_files/' fields = opts.fields if fields is not None: fields = map(strip, fields.split(',')) fields = [i.strip('"').strip("'") for i in fields] elif prefs is not None: fields = prefs.get('FIELDS', None) else: fields = get_interesting_mapping_fields(mapping, m_header) #Check that all provided fields are valid: if fields is not None: for f in fields: if f not in m_header: option_parser.error( "The field, %s, is not in the provided mapping file. Please supply correct fields (using the -f option or providing a 'FIELDS' list in the prefs file) corresponding to fields in mapping file." % (f)) within_distances, between_distances, dmat = \ group_distances(mapping_file=opts.map_fname,\ dmatrix_file=opts.distance_matrix_file,\ fields=fields,\ dir_prefix=get_random_directory_name(output_dir=opts.dir_path,\ prefix='distances')) if not opts.suppress_html_output: #histograms output path histograms_path = path.join(opts.dir_path, 'histograms') try: mkdir(histograms_path) except OSError: #raised if dir exists pass #draw all histograms distances_dict, label_to_histogram_filename = \ draw_all_histograms(single_field=within_distances, \ paired_field=between_distances, \ dmat=dmat,\ histogram_dir=histograms_path,\ field_to_color_prefs=field_to_colors,\ background_color=background_color) #Get relative path to histogram files. label_to_histogram_filename_relative = \ _make_relative_paths(label_to_histogram_filename, opts.dir_path) dm_fname = path.split(opts.distance_matrix_file)[-1] basename = path.splitext(dm_fname)[0] outfile_name = basename + '_distance_histograms.html' make_main_html(distances_dict=distances_dict,\ label_to_histogram_filename=label_to_histogram_filename_relative,\ root_outdir=opts.dir_path, \ outfile_name = outfile_name, \ title='Distance Histograms') #Handle saving web resources locally. #javascript file javascript_path = path.join(opts.dir_path, 'js') try: mkdir(javascript_path) except OSError: #raised if dir exists pass js_out = open(javascript_path + '/histograms.js', 'w') js_out.write(open(qiime_dir + 'js/histograms.js').read()) js_out.close() monte_carlo_iters = opts.monte_carlo_iters if monte_carlo_iters > 0: #Do Monte Carlo for all fields monte_carlo_group_distances(mapping_file=opts.map_fname,\ dmatrix_file=opts.distance_matrix_file,\ prefs=prefs, \ dir_prefix = opts.dir_path,\ fields=fields,\ default_iters=monte_carlo_iters) #Do Monte Carlo for within and between fields monte_carlo_group_distances_within_between(\ single_field=within_distances,\ paired_field=between_distances, dmat=dmat, \ dir_prefix = opts.dir_path,\ num_iters=monte_carlo_iters)
def main(): print "\nWarning: compare_3d_plots.py is being deprecated in favor of make_emperor.py, and will no longer be available in QIIME 1.8.0-dev.\n" option_parser, opts, args = parse_command_line_parameters(**script_info) prefs, data, background_color, label_color, ball_scale, arrow_colors = sample_color_prefs_and_map_data_from_options( opts ) if len(opts.coord_fnames) < 2 and opts.edges_file is None: option_parser.error("Please provide at least two " + "coordinate files or a custom edges file") # Open and get coord data (for multiple coords files) coord_files = opts.coord_fnames coord_files_valid = validate_coord_files(coord_files) if not coord_files_valid: option_parser.error("Every line of every coord file must " + "have the same number of columns.") num_coord_files = len(coord_files) data["edges"], data["coord"] = get_multiple_coords(coord_files, opts.edges_file, opts.serial) # if the edges file wasn't supplied, we appended _i to each file's samples # therefore we now add duplicated samples with _0, _1,... to mapping file if opts.edges_file is None: newmap = [data["map"][0]] for i in xrange(len(coord_files)): for sample in data["map"][1:]: newsample = ["%s_%d" % (sample[0], i)] newsample.extend(sample[1:]) newmap.append(newsample) data["map"] = newmap # remove any samples not present in mapping file remove_unmapped_samples(data["map"], data["coord"], data["edges"]) if len(data["coord"][1]) == 0: raise ValueError, "\n\nError: None of the sample IDs in the coordinates files were present in the mapping file.\n" # process custom axes, if present. custom_axes = None if opts.custom_axes: custom_axes = process_custom_axes(opts.custom_axes) get_custom_coords(custom_axes, data["map"], data["coord"]) remove_nans(data["coord"]) scale_custom_coords(custom_axes, data["coord"]) # Generate random output file name and create directories if opts.output_dir: create_dir(opts.output_dir) dir_path = opts.output_dir else: dir_path = "./" qiime_dir = get_qiime_project_dir() jar_path = os.path.join(qiime_dir, "qiime/support_files/jar/") data_dir_path = get_random_directory_name(output_dir=dir_path, return_absolute_path=False) try: os.mkdir(data_dir_path) except OSError: pass jar_dir_path = os.path.join(dir_path, "jar") try: os.mkdir(jar_dir_path) except OSError: pass shutil.copyfile(os.path.join(jar_path, "king.jar"), os.path.join(jar_dir_path, "king.jar")) filepath = coord_files[0] filename = filepath.strip().split("/")[-1] try: action = generate_3d_plots except NameError: action = None # Place this outside try/except so we don't mask NameError in action if action: generate_3d_plots( prefs, data, custom_axes, background_color, label_color, dir_path, data_dir_path, filename, ball_scale=ball_scale, arrow_colors=arrow_colors, user_supplied_edges=not (opts.edges_file is None), )
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) data = {} prefs, data, background_color, label_color, ball_scale, arrow_colors = sample_color_prefs_and_map_data_from_options( opts ) data["ellipsoid_method"] = opts.ellipsoid_method if 0.00 <= opts.ellipsoid_opacity <= 1.00: data["alpha"] = opts.ellipsoid_opacity else: raise ValueError("The opacity must be a value between 0 and 1!") # Open and get coord data if os.path.isdir(opts.coord_fname) and opts.master_pcoa: data["coord"], data["support_pcoas"] = load_pcoa_files(opts.coord_fname) data["coord"] = get_coord(opts.master_pcoa) elif os.path.isdir(opts.coord_fname): data["coord"], data["support_pcoas"] = load_pcoa_files(opts.coord_fname) else: data["coord"] = get_coord(opts.coord_fname) filepath = opts.coord_fname basename, extension = os.path.splitext(filepath) filename = "%s_2D_PCoA_plots" % (basename) # obtaining where the files live so they can be copied qiime_dir = get_qiime_project_dir() js_path = os.path.join(qiime_dir, "qiime", "support_files", "js") if opts.output_dir: if os.path.exists(opts.output_dir): dir_path = opts.output_dir else: try: os.mkdir(opts.output_dir) dir_path = opts.output_dir except OSError: pass else: dir_path = "./" html_dir_path = dir_path data_dir_path = mkdtemp(dir=dir_path) try: os.mkdir(data_dir_path) except OSError: pass js_dir_path = os.path.join(html_dir_path, "js") try: os.mkdir(js_dir_path) except OSError: pass shutil.copyfile(os.path.join(js_path, "overlib.js"), os.path.join(js_dir_path, "overlib.js")) try: action = generate_2d_plots except NameError: action = None # Place this outside try/except so we don't mask NameError in action if action: action( prefs, data, html_dir_path, data_dir_path, filename, background_color, label_color, opts.scree, opts.pct_variation_below_one, )
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) prefs, data, background_color, label_color, ball_scale, arrow_colors = sample_color_prefs_and_map_data_from_options( opts ) scaling_methods = opts.scaling_method.split(",") plot_scaled = False plot_unscaled = False for i in scaling_methods: if i.lower() == "scaled": plot_scaled = True elif i.lower() == "unscaled": plot_unscaled = True if not (plot_scaled or plot_unscaled): raise ValueError, "You must choose a valid scaling method (scaled or unscaled)" if opts.output_format == "invue": # validating the number of points for interpolation if opts.interpolation_points < 0: option_parser.error("The --interpolation_points should be " + "greater or equal to 0.") # make sure that coord file has internally consistent # of columns coord_files_valid = validate_coord_files(opts.coord_fname) if not coord_files_valid: option_parser.error("Every line of every coord file must " + "have the same number of columns.") # Open and get coord data data["coord"] = get_coord(opts.coord_fname, opts.ellipsoid_method) # remove any samples not present in mapping file remove_unmapped_samples(data["map"], data["coord"]) # if no samples overlapped between mapping file and otu table, exit if len(data["coord"][0]) == 0: print "\nError: OTU table and mapping file had no samples in common\n" exit(1) if opts.output_dir: create_dir(opts.output_dir, False) dir_path = opts.output_dir else: dir_path = "./" filepath = opts.coord_fname if os.path.isdir(filepath): coord_files = [fname for fname in os.listdir(filepath) if not fname.startswith(".")] filename = os.path.split(coord_files[0])[-1] else: filename = os.path.split(filepath)[-1] generate_3d_plots_invue( prefs, data, dir_path, filename, opts.interpolation_points, opts.polyhedron_points, opts.polyhedron_offset ) # finish script return # Potential conflicts if not opts.custom_axes is None and os.path.isdir(opts.coord_fname): # can't do averaged pcoa plots _and_ custom axes in the same plot option_parser.error( "Please supply either custom axes or multiple coordinate \ files, but not both." ) # check that smoothness is an integer between 0 and 3 try: ellipsoid_smoothness = int(opts.ellipsoid_smoothness) except: option_parser.error( "Please supply an integer ellipsoid smoothness \ value." ) if ellipsoid_smoothness < 0 or ellipsoid_smoothness > 3: option_parser.error( "Please supply an ellipsoid smoothness value \ between 0 and 3." ) # check that opacity is a float between 0 and 1 try: ellipsoid_alpha = float(opts.ellipsoid_opacity) except: option_parser.error("Please supply a number for ellipsoid opacity.") if ellipsoid_alpha < 0 or ellipsoid_alpha > 1: option_parser.error( "Please supply an ellipsoid opacity value \ between 0 and 1." ) # check that ellipsoid method is valid ellipsoid_methods = ["IQR", "sdev"] if not opts.ellipsoid_method in ellipsoid_methods: option_parser.error( "Please supply a valid ellipsoid method. \ Valid methods are: " + ", ".join(ellipsoid_methods) + "." ) # gather ellipsoid drawing preferences ellipsoid_prefs = {} ellipsoid_prefs["smoothness"] = ellipsoid_smoothness ellipsoid_prefs["alpha"] = ellipsoid_alpha # make sure that coord file has internally consistent # of columns coord_files_valid = validate_coord_files(opts.coord_fname) if not coord_files_valid: option_parser.error("Every line of every coord file must " + "have the same number of columns.") # Open and get coord data data["coord"] = get_coord(opts.coord_fname, opts.ellipsoid_method) # remove any samples not present in mapping file remove_unmapped_samples(data["map"], data["coord"]) # if no samples overlapped between mapping file and otu table, exit if len(data["coord"][0]) == 0: print "\nError: OTU table and mapping file had no samples in common\n" exit(1) # process custom axes, if present. custom_axes = None if opts.custom_axes: custom_axes = process_custom_axes(opts.custom_axes) get_custom_coords(custom_axes, data["map"], data["coord"]) remove_nans(data["coord"]) scale_custom_coords(custom_axes, data["coord"]) # process vectors if requested if opts.add_vectors: add_vectors = {} add_vectors["vectors"] = opts.add_vectors.split(",") add_vectors["weight_by_vector"] = opts.weight_by_vector if len(add_vectors) > 3: raise ValueError, "You must add maximum 3 columns but %s" % opts.add_vectors # Validating Vectors values if opts.vectors_algorithm: axes_number = len(data["coord"][1][1]) if opts.vectors_axes < 0 or opts.vectors_axes > axes_number: raise ValueError, "vectors_algorithm should be between 0 and the max number" + "of samples/pcoa-axes: %d" % len( data["coord"][1][1] ) if opts.vectors_axes == 0: opts.vectors_axes = axes_number add_vectors["vectors_axes"] = opts.vectors_axes valid_chars = "_.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" for c in opts.vectors_path: if c not in valid_chars: raise ValueError, "vectors_path (%s) has invalid chars" % opts.vectors_path add_vectors["vectors_output"] = {} add_vectors["vectors_algorithm"] = opts.vectors_algorithm add_vectors["eigvals"] = data["coord"][3] add_vectors["window_size"] = None # checks specific for the modified first difference algorithm if add_vectors["vectors_algorithm"] == "wdiff": try: add_vectors["window_size"] = int(opts.window_size) except TypeError: raise TypeError, "Specify --window_size as an integer" # sanity check as the value can only be greater or equal to one if add_vectors["window_size"] < 1: raise ValueError, "The value of window_size is invalid, " + "the value must be greater than zero, not %d" % add_vectors[ "window_size" ] else: add_vectors["vectors_algorithm"] = None add_vectors["vectors_path"] = opts.vectors_path else: add_vectors = None if opts.taxa_fname != None: # get taxonomy counts # get list of sample_ids that haven't been removed sample_ids = data["coord"][0] # get taxa summaries for all sample_ids lineages, taxa_counts = get_taxa(opts.taxa_fname, sample_ids) data["taxa"] = {} data["taxa"]["lineages"] = lineages data["taxa"]["counts"] = taxa_counts # get average relative abundance of taxa data["taxa"]["prevalence"] = get_taxa_prevalence(data["taxa"]["counts"]) remove_rare_taxa(data["taxa"], nkeep=opts.n_taxa_keep) # get coordinates of taxa (weighted mean of sample scores) data["taxa"]["coord"] = get_taxa_coords(data["taxa"]["counts"], data["coord"][1]) data["taxa"]["coord"] # write taxa coords if requested if not opts.biplot_output_file is None: output = make_biplot_scores_output(data["taxa"]) fout = open(opts.biplot_output_file, "w") fout.write("\n".join(output)) fout.close() if opts.output_dir: create_dir(opts.output_dir, False) dir_path = opts.output_dir else: dir_path = "./" qiime_dir = get_qiime_project_dir() jar_path = os.path.join(qiime_dir, "qiime/support_files/jar/") data_dir_path = get_random_directory_name(output_dir=dir_path, return_absolute_path=False) try: os.mkdir(data_dir_path) except OSError: pass data_file_path = data_dir_path jar_dir_path = os.path.join(dir_path, "jar") try: os.mkdir(jar_dir_path) except OSError: pass shutil.copyfile(os.path.join(jar_path, "king.jar"), os.path.join(jar_dir_path, "king.jar")) filepath = opts.coord_fname if os.path.isdir(filepath): coord_files = [fname for fname in os.listdir(filepath) if not fname.startswith(".")] filename = os.path.split(coord_files[0])[-1] else: filename = os.path.split(filepath)[-1] try: action = generate_3d_plots except NameError: action = None # Place this outside try/except so we don't mask NameError in action if action: action( prefs, data, custom_axes, background_color, label_color, dir_path, data_file_path, filename, ellipsoid_prefs=ellipsoid_prefs, add_vectors=add_vectors, plot_scaled=plot_scaled, plot_unscaled=plot_unscaled, )
def main(): option_parser, options, args = parse_command_line_parameters(**script_info) ops = {} input_dir = options.input_dir rares = {} if isdir(input_dir): rarenames = listdir(input_dir) rarenames = [r for r in rarenames if not r.startswith(".")] for r in rarenames: try: rarefl = open(path.join(input_dir, r), "U").readlines() rares[r] = parse_rarefaction(rarefl) except (IOError): option_parser.error("Problem with rarefaction file. %s" % exc_info()[1]) exit(0) else: try: input_file = input_dir.split(",") for i in range(len(input_file)): input_path = split(input_file[i])[-1] rarefl = open(input_file[i], "U").readlines() rares[input_path] = parse_rarefaction(rarefl) except (IOError): option_parser.error("Problem with rarefaction file. %s" % exc_info()[1]) exit(0) if options.imagetype not in ["png", "svg", "pdf"]: option_parser.error("Supplied extension not supported.") exit(0) else: imagetype = options.imagetype try: resolution = int(options.resolution) except (ValueError): option_parser.error("Inavlid resolution.") exit(0) # Get the command-line options. prefs, data, background_color, label_color, ball_scale, arrow_colors = sample_color_prefs_and_map_data_from_options( options ) # output directory check if isinstance(options.output_dir, str) and options.output_dir != ".": if exists(options.output_dir): output_dir = options.output_dir else: try: create_dir(options.output_dir, False) output_dir = options.output_dir except (ValueError): option_parser.error("Could not create output directory.") exit(0) else: output_dir = get_random_directory_name() # Generate the plots and html text ymax = options.ymax suppress_webpage = options.suppress_html_output html_output = make_averages( prefs, data, background_color, label_color, rares, output_dir, resolution, imagetype, ymax, suppress_webpage ) if html_output: # Write the html file. outfile = open(path.join(output_dir, "rarefaction_plots.html"), "w") outfile.write(html_output) outfile.close()
def main(): option_parser, opts, args = parse_command_line_parameters(**script_info) prefs, data, background_color, label_color, ball_scale, arrow_colors= \ sample_color_prefs_and_map_data_from_options(opts) if opts.output_format == 'invue': # validating the number of points for interpolation if (opts.interpolation_points<0): option_parser.error('The --interpolation_points should be ' +\ 'greater or equal to 0.') # make sure that coord file has internally consistent # of columns coord_files_valid = validate_coord_files(opts.coord_fname) if not coord_files_valid: option_parser.error('Every line of every coord file must ' +\ 'have the same number of columns.') coord_files_valid = validate_coord_files(opts.coord_fname) if not coord_files_valid: option_parser.error('Every line of every coord file must ' +\ 'have the same number of columns.') #Open and get coord data data['coord'] = get_coord(opts.coord_fname, opts.ellipsoid_method) # remove any samples not present in mapping file remove_unmapped_samples(data['map'],data['coord']) # if no samples overlapped between mapping file and otu table, exit if len(data['coord'][0]) == 0: print "\nError: OTU table and mapping file had no samples in common\n" exit(1) if opts.output_dir: create_dir(opts.output_dir,False) dir_path=opts.output_dir else: dir_path='./' filepath=opts.coord_fname if os.path.isdir(filepath): coord_files = [fname for fname in os.listdir(filepath) if not \ fname.startswith('.')] filename = os.path.split(coord_files[0])[-1] else: filename = os.path.split(filepath)[-1] generate_3d_plots_invue(prefs, data, dir_path, filename, \ opts.interpolation_points, opts.polyhedron_points, \ opts.polyhedron_offset) #finish script return # Potential conflicts if not opts.custom_axes is None and os.path.isdir(opts.coord_fname): # can't do averaged pcoa plots _and_ custom axes in the same plot option_parser.error("Please supply either custom axes or multiple coordinate \ files, but not both.") # check that smoothness is an integer between 0 and 3 try: ellipsoid_smoothness = int(opts.ellipsoid_smoothness) except: option_parser.error("Please supply an integer ellipsoid smoothness \ value.") if ellipsoid_smoothness < 0 or ellipsoid_smoothness > 3: option_parser.error("Please supply an ellipsoid smoothness value \ between 0 and 3.") # check that opacity is a float between 0 and 1 try: ellipsoid_alpha = float(opts.ellipsoid_opacity) except: option_parser.error("Please supply a number for ellipsoid opacity.") if ellipsoid_alpha < 0 or ellipsoid_alpha > 1: option_parser.error("Please supply an ellipsoid opacity value \ between 0 and 1.") # check that ellipsoid method is valid ellipsoid_methods = ['IQR','sdev'] if not opts.ellipsoid_method in ellipsoid_methods: option_parser.error("Please supply a valid ellipsoid method. \ Valid methods are: " + ', '.join(ellipsoid_methods) + ".") # gather ellipsoid drawing preferences ellipsoid_prefs = {} ellipsoid_prefs["smoothness"] = ellipsoid_smoothness ellipsoid_prefs["alpha"] = ellipsoid_alpha # make sure that coord file has internally consistent # of columns coord_files_valid = validate_coord_files(opts.coord_fname) if not coord_files_valid: option_parser.error('Every line of every coord file must ' +\ 'have the same number of columns.') #Open and get coord data data['coord'] = get_coord(opts.coord_fname, opts.ellipsoid_method) # remove any samples not present in mapping file remove_unmapped_samples(data['map'],data['coord']) # if no samples overlapped between mapping file and otu table, exit if len(data['coord'][0]) == 0: print "\nError: OTU table and mapping file had no samples in common\n" exit(1) if opts.taxa_fname != None: # get taxonomy counts # get list of sample_ids that haven't been removed sample_ids = data['coord'][0] # get taxa summaries for all sample_ids lineages, taxa_counts = get_taxa(opts.taxa_fname, sample_ids) data['taxa'] = {} data['taxa']['lineages'] = lineages data['taxa']['counts'] = taxa_counts # get average relative abundance of taxa data['taxa']['prevalence'] = get_taxa_prevalence(data['taxa']['counts']) remove_rare_taxa(data['taxa'],nkeep=opts.n_taxa_keep) # get coordinates of taxa (weighted mean of sample scores) data['taxa']['coord'] = get_taxa_coords(data['taxa']['counts'], data['coord'][1]) data['taxa']['coord'] # write taxa coords if requested if not opts.biplot_output_file is None: output = make_biplot_scores_output(data['taxa']) fout = open(opts.biplot_output_file,'w') fout.write('\n'.join(output)) fout.close() # process custom axes, if present. custom_axes = None if opts.custom_axes: custom_axes = process_custom_axes(opts.custom_axes) get_custom_coords(custom_axes, data['map'], data['coord']) remove_nans(data['coord']) scale_custom_coords(custom_axes,data['coord']) if opts.output_dir: create_dir(opts.output_dir,False) dir_path=opts.output_dir else: dir_path='./' qiime_dir=get_qiime_project_dir() jar_path=os.path.join(qiime_dir,'qiime/support_files/jar/') data_dir_path = get_random_directory_name(output_dir=dir_path, return_absolute_path=False) try: os.mkdir(data_dir_path) except OSError: pass data_file_path=data_dir_path jar_dir_path = os.path.join(dir_path,'jar') try: os.mkdir(jar_dir_path) except OSError: pass shutil.copyfile(os.path.join(jar_path,'king.jar'), os.path.join(jar_dir_path,'king.jar')) filepath=opts.coord_fname if os.path.isdir(filepath): coord_files = [fname for fname in os.listdir(filepath) if not \ fname.startswith('.')] filename = os.path.split(coord_files[0])[-1] else: filename = os.path.split(filepath)[-1] try: action = generate_3d_plots except NameError: action = None #Place this outside try/except so we don't mask NameError in action if action: action(prefs,data,custom_axes,background_color,label_color,dir_path, \ data_file_path,filename,ellipsoid_prefs=ellipsoid_prefs)