import argparse
import inspect
import logging
import os
import sys
from .__main__ import setup_logging
[docs]
log = logging.getLogger()
os.environ["NUMEXPR_MAX_THREADS"] = "8"
[docs]
DESCRIPTION = """
hic-internal is used for automation, not intend to be used by end user.
Use hicluster instead.
"""
[docs]
def impute_chromosome_internal_subparser(subparser):
parser = subparser.add_parser('impute-chromosome',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="RWR imputation for one chromosome in one cell")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--chrom",
type=str,
required=True
)
parser_req.add_argument(
"--resolution",
type=int,
required=True
)
parser_req.add_argument(
"--output_path",
type=str,
required=True
)
parser.add_argument(
"--scool_url",
type=str,
default=None
)
parser.add_argument(
"--contact_path",
type=str,
default=None
)
parser.add_argument(
"--chrom_size_path",
type=str,
default=None
)
parser.add_argument(
'--logscale',
dest='logscale',
action='store_true'
)
parser.set_defaults(logscale=False)
parser.add_argument(
"--pad",
type=int,
default=1
)
parser.add_argument(
"--std",
type=int,
default=1
)
parser.add_argument(
"--rp",
type=float,
default=0.5
)
parser.add_argument(
"--tol",
type=float,
default=0.01
)
parser.add_argument(
"--window_size",
type=int,
default=500000000
)
parser.add_argument(
"--step_size",
type=int,
default=10000000
)
parser.add_argument(
"--output_dist",
type=int,
default=500000000
)
parser.add_argument(
"--min_cutoff",
type=float,
default=0
)
parser.add_argument(
"--chr1",
dest='chrom1',
type=int,
default=1
)
parser.add_argument(
"--chr2",
dest='chrom2',
type=int,
default=5
)
parser.add_argument(
"--pos1",
type=int,
default=2
)
parser.add_argument(
"--pos2",
type=int,
default=6
)
return
[docs]
def aggregate_chromosomes_internal_subparser(subparser):
parser = subparser.add_parser('aggregate-chromosomes',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="Aggregate chromosome HDFs for one cell")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--chrom_size_path",
type=str,
required=True
)
parser_req.add_argument(
"--resolution",
type=int,
required=True
)
parser_req.add_argument(
"--input_dir",
type=str,
required=True
)
parser_req.add_argument(
"--output_path",
type=str,
required=True
)
parser_req.add_argument(
"--chrom_wildcard",
type=str,
default='{chrom}.hdf'
)
parser.add_argument(
'--csr',
dest='csr',
action='store_true')
parser.set_defaults(csr=False)
[docs]
def calculate_loop_matrix_internal_subparser(subparser):
parser = subparser.add_parser('calculate-loop-matrix',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="Calculate Loop Matrix E and T for single chromosome of one cell")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--cell_url",
type=str,
required=True
)
parser_req.add_argument(
"--chrom",
type=str,
required=True
)
parser_req.add_argument(
"--resolution",
type=int,
required=True
)
parser_req.add_argument(
"--output_prefix",
type=str,
required=True
)
parser.add_argument(
"--dist",
type=int,
default=5050000
)
parser.add_argument(
"--cap",
type=int,
default=5
)
parser.add_argument(
"--pad",
type=int,
default=5
)
parser.add_argument(
"--gap",
type=int,
default=2
)
parser.add_argument(
"--min_cutoff",
type=float,
default=1e-6
)
parser.add_argument(
'--shuffle',
dest='shuffle',
action='store_true',
help='Shuffle E for background calculation'
)
parser.set_defaults(shuffle=False)
parser.add_argument(
'--log_e',
dest='log_e',
action='store_true',
help='Normalize E at log scale'
)
parser.set_defaults(log_e=False)
[docs]
def merge_cell_impute_matrix_internal_subparser(subparser):
parser = subparser.add_parser('merge-cell-impute-matrix',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="Merge Loop Matrix E and T from cells to group")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--cell_urls_path",
type=str,
required=True
)
parser_req.add_argument(
"--chrom",
type=str,
required=True
)
parser_req.add_argument(
"--output_prefix",
type=str,
required=True
)
parser.add_argument(
'--square',
dest='square',
action='store_true',
help='Compute Q2 if true'
)
parser.set_defaults(square=False)
[docs]
def merge_cell_loop_bkg_internal_subparser(subparser):
parser = subparser.add_parser('merge-loop-matrix',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="Merge Loop Matrix E and T from cells to group")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--output_dir",
type=str,
required=True
)
parser_req.add_argument(
"--output_prefix",
type=str,
required=True
)
parser_req.add_argument(
"--merge_type",
type=str,
required=True
)
[docs]
def merge_group_chunks_internal_subparser(subparser):
parser = subparser.add_parser('merge-group-chunks',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="Aggregate group chunks cool files to one scool file per group.")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--chrom_size_path",
type=str,
required=True
)
parser_req.add_argument(
"--resolution",
type=int,
required=True
)
parser_req.add_argument(
"--group",
type=str,
required=True
)
parser_req.add_argument(
"--output_dir",
type=str,
required=True
)
parser.add_argument(
"--matrix_types",
type=str,
nargs='+',
default=['E', 'E2', 'T', 'T2', 'Q', 'Q2'],
required=False
)
[docs]
def merge_raw_scool_internal_subparser(subparser):
parser = subparser.add_parser('merge-raw-scool',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="Merge single cell raw matrix by cluster stored in scool files.")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--chrom_size_path",
type=str,
required=True
)
parser_req.add_argument(
"--resolution",
type=int,
required=True
)
parser_req.add_argument(
"--cell_table_path",
type=str,
required=True
)
parser_req.add_argument(
"--output_dir",
type=str,
required=True
)
parser.add_argument(
"--cpu",
type=int,
default=1
)
parser.add_argument(
'--add_trans',
dest='add_trans',
action='store_true',
help='Whether add trans matrix also.'
)
parser.set_defaults(add_trans=False)
[docs]
def call_loop_internal_subparser(subparser):
parser = subparser.add_parser('call-loop',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
help="Call loop using group matrix stored in scool file.")
parser_req = parser.add_argument_group("Required inputs")
parser_req.add_argument(
"--group_prefix",
type=str,
required=True
)
parser_req.add_argument(
"--resolution",
type=int,
required=True
)
parser_req.add_argument(
"--output_prefix",
type=str,
required=True
)
parser_req.add_argument(
"--thres_bl",
type=float,
default=1.33
)
parser_req.add_argument(
"--thres_donut",
type=float,
default=1.33
)
parser_req.add_argument(
"--thres_h",
type=float,
default=1.2
)
parser_req.add_argument(
"--thres_v",
type=float,
default=1.2
)
parser_req.add_argument(
"--fdr_thres",
type=float,
default=0.1
)
parser_req.add_argument(
"--dist_thres",
type=float,
default=20000
)
parser_req.add_argument(
"--size_thres",
type=float,
default=1
)
[docs]
def internal_main():
parser = argparse.ArgumentParser(description=DESCRIPTION,
epilog=EPILOG,
formatter_class=argparse.RawDescriptionHelpFormatter)
subparsers = parser.add_subparsers(
title="functions",
dest="command",
metavar=""
)
# add subparsers
current_module = sys.modules[__name__]
# get all functions in parser
for name, register_subparser_func in inspect.getmembers(current_module, inspect.isfunction):
if 'internal_subparser' in name:
register_subparser_func(subparsers)
# initiate
args = None
if len(sys.argv) > 1:
args = parser.parse_args()
else:
# print out help
parser.parse_args(["-h"])
exit()
# set up logging
if not logging.root.handlers:
setup_logging(stdout=True,
quiet=False)
# execute command
args_vars = vars(args)
for k, v in args_vars.items():
logging.debug(k, v, type(v), sep='\t')
cur_command = args_vars.pop('command')
# Do real import here:
if cur_command == 'impute-chromosome':
from .impute.impute_chromosome import impute_chromosome as func
elif cur_command == 'aggregate-chromosomes':
from .cool.utilities import aggregate_chromosomes as func
elif cur_command == 'calculate-loop-matrix':
from .loop.loop_bkg import calculate_chrom_background_normalization as func
elif cur_command == 'merge-loop-matrix':
from .loop.merge_cell_to_group import merge_cells_for_single_chromosome as func
elif cur_command == 'merge-group-chunks':
from .loop.merge_cell_to_group import merge_group_chunks_to_group_cools as func
elif cur_command == 'merge-cell-impute-matrix':
from .impute.merge_cell_to_group import merge_cells_for_single_chromosome as func
elif cur_command == 'call-loop':
from .loop.loop_calling import call_loops as func
elif cur_command == 'merge-raw-scool':
from .loop.merge_raw_matrix import merge_raw_scool_by_cluster as func
else:
log.debug(f'{cur_command} not Known, check the main function if else part')
parser.parse_args(["-h"])
return
# run the command
func(**args_vars)
return