Source code for lib5c.tools.smooth
from lib5c.tools.parents import level_parser, simple_in_out_parser, \
filter_parser, parallelization_parser, primerfile_parser
[docs]def add_smooth_tool(parser):
smooth_parser = parser.add_parser(
'smooth',
help='smooth counts',
prog='lib5c smooth',
parents=[primerfile_parser, level_parser, simple_in_out_parser,
filter_parser, parallelization_parser]
)
smooth_parser.set_defaults(func=smooth_tool)
[docs]def smooth_tool(parser, args):
from lib5c.parsers.primers import load_primermap
from lib5c.parsers.counts import load_counts
from lib5c.writers.counts import write_counts
from lib5c.util.primers import guess_bin_step
from lib5c.tools.helpers import resolve_level, resolve_parallel, \
resolve_primerfile
from lib5c.algorithms.filtering.filter_functions import make_filter_function
from lib5c.algorithms.filtering.fragment_fragment_filtering import \
fragment_fragment_filter
from lib5c.algorithms.filtering.bin_bin_filtering import bin_bin_filter
from lib5c.algorithms.filtering.unsmoothable_columns import \
wipe_prebinned_unsmoothable_columns
# resolve parallel, primerfile, and level and load primermap
resolve_parallel(parser, args, subcommand='smooth')
primerfile = resolve_primerfile(args.infile, args.primerfile)
primermap = load_primermap(primerfile)
resolved_level = resolve_level(primermap, args.level)
# resolve sigma and norm_order
resolved_sigma = args.sigma if args.sigma is not None else args.window_width
resolved_norm_order = args.norm_order is not None if args.norm_order else 1
# resolve bin step
if resolved_level == 'bin':
resolved_bin_step = guess_bin_step(primermap[list(primermap.keys())[0]])
else:
resolved_bin_step = 4000
# construct filter function
filter_function = make_filter_function(
function=args.function,
threshold=args.threshold,
norm_order=resolved_norm_order,
bin_width=resolved_bin_step,
sigma=resolved_sigma,
inverse=args.inverse,
gaussian=args.gaussian
)
# load counts
counts = load_counts(args.infile, primermap)
# smooth counts
if resolved_level == 'fragment':
filtered_counts = fragment_fragment_filter(
counts, filter_function, primermap, args.window_width / 2,
midpoint=args.midpoint)
else:
filtered_counts = bin_bin_filter(
counts, filter_function, primermap, args.window_width / 2)
# honor -W/--wipe_unsmoothable_columns
if args.wipe_unsmoothable_columns and resolved_level == 'bin':
filtered_counts = wipe_prebinned_unsmoothable_columns(
filtered_counts, counts, primermap, args.window_width)
# write counts
write_counts(filtered_counts, args.outfile, primermap)