Source code for lib5c.tools.enrichment

from lib5c.tools.parents import primerfile_parser
from functools import reduce


[docs]def add_enrichment_tool(parser): enrichment_parser = parser.add_parser( 'enrichment', prog='lib5c plot enrichment', help='plot enrichments', parents=[primerfile_parser] ) enrichment_parser.add_argument( 'infile', type=str, help='''A countsfile whose values are looptypes as strings.''') enrichment_parser.add_argument( 'outfile', type=str, help='''The file to write the plot to. %%s in the filename may be replaced if called with '-a all' or '-l all', see below.''') enrichment_parser.add_argument( '-d', '--annotations_dir', type=str, default='./annotations', help='''Directory containing annotation bedfiles. Default is './annotations'.''') enrichment_parser.add_argument( '-a', '--annotation', type=str, help='''Pass an annotation to hold it fixed and vary the looptype on the x axis and the annotation being looped to on the y axis of the heatmap. Pass 'all' to draw one plot for every annotation; %%s in the outfile will be replaced with the annotation.''') enrichment_parser.add_argument( '-l', '--looptype', type=str, help='''Pass a looptype to hold it fixed and vary the annotations on both axes of the heatmap. Pass 'all' to draw one plot for every looptype; %%s in the outfile will be replaced with the looptype.''') enrichment_parser.add_argument( '-ao', '--annotation_order', type=str, help='''Set the subset and order of annotations to plot.''') enrichment_parser.add_argument( '-lo', '--looptype_order', type=str, help='''Set the subset and order of looptypes to plot.''') enrichment_parser.add_argument( '-m', '--margin', type=int, default=1, help='''The 'margin for error' for annotation intersections, in bin units. Default is 1.''') enrichment_parser.add_argument( '-v', '--vmax', type=float, default=2.0, help='''The value to use for the vmax of the colorscale. The vmin will be set to the opposite of this value. Default is 2.0.''') enrichment_parser.set_defaults(func=enrichment_tool)
[docs]def enrichment_tool(parser, args): import numpy as np from lib5c.tools.helpers import resolve_primerfile from lib5c.parsers.primers import load_primermap from lib5c.parsers.counts import load_counts from lib5c.util.annotationmap import make_annotationmaps from lib5c.plotters.enrichment import plot_looptype_vs_annotation_heatmap, \ plot_annotation_vs_annotation_heatmap # resolve primerfile and parallel primerfile = resolve_primerfile(args.infile, args.primerfile) # load counts print('loading counts') primermap = load_primermap(primerfile) looping_classes = load_counts(args.infile, primermap) # load annotations print('loading annotations') annotationmaps = make_annotationmaps(primermap, directory=args.annotations_dir) # resolve looptype_order and annotation_order looptype_order = list(map( str.strip, args.looptype_order.strip('()').split(',')))\ if args.looptype_order is not None else None annotation_order = list(map( str.strip, args.annotation_order.strip('()').split(',')))\ if args.annotation_order is not None else None # plot enrichments print('plotting enrichments') if args.annotation is not None: if args.annotation == 'all': constant_annotations = list(annotationmaps.keys()) outfiles = [args.outfile % c for c in constant_annotations] else: constant_annotations = [args.annotation] outfiles = [args.outfile] for c, o in zip(constant_annotations, outfiles): plot_looptype_vs_annotation_heatmap( annotationmaps, looping_classes, constant_annotation=c, loop_type_order=looptype_order, annotation_order=annotation_order, margin=args.margin, vmin=-args.vmax, vmax=args.vmax, outfile=o ) elif args.looptype is not None: if args.looptype == 'all': looptypes = list(reduce( set.union, [np.unique(looping_classes[region]) for region in looping_classes], set()) - {''}) outfiles = [args.outfile % l for l in looptypes] else: looptypes = [args.looptype] outfiles = [args.outfile] for l, o in zip(looptypes, outfiles): plot_annotation_vs_annotation_heatmap( annotationmaps, looping_classes, loop_type=l, axis_order=annotation_order, margin=args.margin, vmin=-args.vmax, vmax=args.vmax, outfile=o )