From d0e52db581cf38e4d73c735ea96995319dabb533 Mon Sep 17 00:00:00 2001 From: YaqiangCao Date: Mon, 18 Sep 2023 13:27:52 -0400 Subject: [PATCH] tracPre2.py updates --- build/scripts-3.10/4CPre.py | 417 +++ build/scripts-3.10/anoPeaks.py | 186 + build/scripts-3.10/compareComp.py | 407 +++ build/scripts-3.10/compareDom.py | 514 +++ build/scripts-3.10/getBedpeFBed.py | 110 + build/scripts-3.10/getDI.py | 143 + build/scripts-3.10/getFRiF.py | 207 ++ build/scripts-3.10/getIS.py | 170 + build/scripts-3.10/getIntDensity.py | 152 + build/scripts-3.10/getLocalIDS.py | 153 + build/scripts-3.10/getPETsAno.py | 194 + build/scripts-3.10/getSS.py | 155 + build/scripts-3.10/getSigDist.py | 223 ++ build/scripts-3.10/getSigEnrich.py | 236 ++ build/scripts-3.10/hicpro2bedpe.py | 105 + build/scripts-3.10/juicerLong2bedpe.py | 75 + build/scripts-3.10/mergeDomains.py | 162 + build/scripts-3.10/plotDiffHeatmap.py | 259 ++ build/scripts-3.10/tow.py | 645 ++++ build/scripts-3.10/tracPre.py | 314 ++ build/scripts-3.10/tracPre2.py | 515 +++ cLoops2.egg-info/PKG-INFO | 3253 ++++++++--------- cLoops2.egg-info/entry_points.txt | 1 - cLoops2/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 166 bytes cLoops2/__pycache__/agg.cpython-310.pyc | Bin 0 -> 31558 bytes cLoops2/__pycache__/ano.cpython-310.pyc | Bin 0 -> 12127 bytes .../__pycache__/blockDBSCAN.cpython-310.pyc | Bin 0 -> 6500 bytes cLoops2/__pycache__/cLoops2.cpython-310.pyc | Bin 0 -> 91451 bytes .../__pycache__/callCisLoops.cpython-310.pyc | Bin 0 -> 16572 bytes .../__pycache__/callDiffLoops.cpython-310.pyc | Bin 0 -> 19926 bytes .../__pycache__/callDomains.cpython-310.pyc | Bin 0 -> 7026 bytes cLoops2/__pycache__/callPeaks.cpython-310.pyc | Bin 0 -> 16012 bytes .../callTransLoops.cpython-310.pyc | Bin 0 -> 7685 bytes cLoops2/__pycache__/cmat.cpython-310.pyc | Bin 0 -> 6563 bytes cLoops2/__pycache__/ds.cpython-310.pyc | Bin 0 -> 7557 bytes cLoops2/__pycache__/dump.cpython-310.pyc | Bin 0 -> 16779 bytes cLoops2/__pycache__/est.cpython-310.pyc | Bin 0 -> 14473 bytes cLoops2/__pycache__/estDis.cpython-310.pyc | Bin 0 -> 7292 bytes cLoops2/__pycache__/estSim.cpython-310.pyc | Bin 0 -> 7338 bytes cLoops2/__pycache__/filter.cpython-310.pyc | Bin 0 -> 9035 bytes .../__pycache__/findTargets.cpython-310.pyc | Bin 0 -> 4438 bytes cLoops2/__pycache__/geo.cpython-310.pyc | Bin 0 -> 2694 bytes cLoops2/__pycache__/io.cpython-310.pyc | Bin 0 -> 24719 bytes cLoops2/__pycache__/montage.cpython-310.pyc | Bin 0 -> 11983 bytes cLoops2/__pycache__/plot.cpython-310.pyc | Bin 0 -> 31022 bytes cLoops2/__pycache__/qc.cpython-310.pyc | Bin 0 -> 3421 bytes cLoops2/__pycache__/quant.cpython-310.pyc | Bin 0 -> 9585 bytes cLoops2/__pycache__/settings.cpython-310.pyc | Bin 0 -> 1643 bytes cLoops2/__pycache__/utils.cpython-310.pyc | Bin 0 -> 3032 bytes dist/cLoops2-0.0.5-py3.10.egg | Bin 0 -> 386428 bytes scripts/tracPre2.py | 3 +- 51 files changed, 6969 insertions(+), 1630 deletions(-) create mode 100755 build/scripts-3.10/4CPre.py create mode 100755 build/scripts-3.10/anoPeaks.py create mode 100755 build/scripts-3.10/compareComp.py create mode 100755 build/scripts-3.10/compareDom.py create mode 100755 build/scripts-3.10/getBedpeFBed.py create mode 100755 build/scripts-3.10/getDI.py create mode 100755 build/scripts-3.10/getFRiF.py create mode 100755 build/scripts-3.10/getIS.py create mode 100755 build/scripts-3.10/getIntDensity.py create mode 100755 build/scripts-3.10/getLocalIDS.py create mode 100755 build/scripts-3.10/getPETsAno.py create mode 100755 build/scripts-3.10/getSS.py create mode 100755 build/scripts-3.10/getSigDist.py create mode 100755 build/scripts-3.10/getSigEnrich.py create mode 100755 build/scripts-3.10/hicpro2bedpe.py create mode 100755 build/scripts-3.10/juicerLong2bedpe.py create mode 100755 build/scripts-3.10/mergeDomains.py create mode 100755 build/scripts-3.10/plotDiffHeatmap.py create mode 100755 build/scripts-3.10/tow.py create mode 100755 build/scripts-3.10/tracPre.py create mode 100755 build/scripts-3.10/tracPre2.py create mode 100644 cLoops2/__pycache__/__init__.cpython-310.pyc create mode 100644 cLoops2/__pycache__/agg.cpython-310.pyc create mode 100644 cLoops2/__pycache__/ano.cpython-310.pyc create mode 100644 cLoops2/__pycache__/blockDBSCAN.cpython-310.pyc create mode 100644 cLoops2/__pycache__/cLoops2.cpython-310.pyc create mode 100644 cLoops2/__pycache__/callCisLoops.cpython-310.pyc create mode 100644 cLoops2/__pycache__/callDiffLoops.cpython-310.pyc create mode 100644 cLoops2/__pycache__/callDomains.cpython-310.pyc create mode 100644 cLoops2/__pycache__/callPeaks.cpython-310.pyc create mode 100644 cLoops2/__pycache__/callTransLoops.cpython-310.pyc create mode 100644 cLoops2/__pycache__/cmat.cpython-310.pyc create mode 100644 cLoops2/__pycache__/ds.cpython-310.pyc create mode 100644 cLoops2/__pycache__/dump.cpython-310.pyc create mode 100644 cLoops2/__pycache__/est.cpython-310.pyc create mode 100644 cLoops2/__pycache__/estDis.cpython-310.pyc create mode 100644 cLoops2/__pycache__/estSim.cpython-310.pyc create mode 100644 cLoops2/__pycache__/filter.cpython-310.pyc create mode 100644 cLoops2/__pycache__/findTargets.cpython-310.pyc create mode 100644 cLoops2/__pycache__/geo.cpython-310.pyc create mode 100644 cLoops2/__pycache__/io.cpython-310.pyc create mode 100644 cLoops2/__pycache__/montage.cpython-310.pyc create mode 100644 cLoops2/__pycache__/plot.cpython-310.pyc create mode 100644 cLoops2/__pycache__/qc.cpython-310.pyc create mode 100644 cLoops2/__pycache__/quant.cpython-310.pyc create mode 100644 cLoops2/__pycache__/settings.cpython-310.pyc create mode 100644 cLoops2/__pycache__/utils.cpython-310.pyc create mode 100644 dist/cLoops2-0.0.5-py3.10.egg diff --git a/build/scripts-3.10/4CPre.py b/build/scripts-3.10/4CPre.py new file mode 100755 index 00000000..426eca46 --- /dev/null +++ b/build/scripts-3.10/4CPre.py @@ -0,0 +1,417 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8-- +""" +4CPre.py +Pre-processing code for 4C-seq data, implemented with cLoops2, from fastq to fragments and viewpoint bedgraph files. +2022-03-11: finished and well tested. +""" + +__author__ = "CAO Yaqiang" +__email__ = "caoyaqiang0410@gmail.com" + +#systematic library +import os +import time +import gzip +import random +import argparse +import subprocess +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import HTSeq +import numpy as np +import pandas as pd +from joblib import Parallel, delayed +from Bio.Seq import Seq +from Bio.SeqIO.QualityIO import FastqGeneralIterator + +#cLoops2 +from cLoops2.utils import getLogger, callSys, isTool + +#global settings +#logger +date = time.strftime(' %Y-%m-%d', time.localtime(time.time())) +logger = getLogger(fn=os.getcwd() + "/" + date.strip() + "_" + + os.path.basename(__file__) + ".log") + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Preprocess the raw reads of FASTQ files of 4C-seq to reference + geneome with bowtie2 and obtain the unqiue PETs with quality control + results. + + Example: + 4CPre.py -fq test -o test -ref ../bowtie2/hg38 -p 5 -mapq 10 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument("-fq", + dest="fq", + required=True, + type=str, + help="The raw .fastq.gz files.") + parser.add_argument( + "-o", + dest="output", + required=False, + type=str, + default="4C", + help= + "Output directory, default is 4C, if directory not exists, create one." + ) + parser.add_argument( + "-ref", + dest="ref", + required=True, + type=str, + help= + "Bowtie2 reference index prefix, such as ./ref/hg38, generated from\n"\ + "bowtie2-build hg38.fa hg38." + ) + parser.add_argument( + "-bait", + dest="bait", + required=True, + type=str, + help= + "Bait sequence designed for the view point." + ) + parser.add_argument( + "-ligationSite", + dest="ligationSite", + required=True, + type=str, + help= + "Ligation site for bait and target sequence. For example, if MboI used, set as GATC." + ) + parser.add_argument( + "-genomeFrag", + dest="genomeFrag", + required=True, + type=str, + help= + "Genome fragment in bed format. Output of digest_genome.py from HiC-Pro." + ) + + parser.add_argument( + "-p", + dest="cpu", + required=False, + type=int, + default=5, + help="How many cpus used by Bowtie2, default is 5." + ) + parser.add_argument( + "-mapq", + dest="mapq", + required=False, + default=10, + type=int, + help="MAPQ cutoffs for filtering mapped reads, default is 10." + ) + parser.add_argument( + "-cis", + dest="cis", + required=False, + default=False, + action="store_true", + help= + "Whether to only keep intra-chromosomal reads with the bait. The\n"\ + "default is to keep all. " + ) + parser.add_argument( + "-log", + dest="log", + required=False, + default=False, + action="store_true", + help= + "Whether to log2 transform the bedGraph signal. Set this to do log2." + ) + op = parser.parse_args() + return op + + +def getBaitPos(bait, ref): + """ + Get the genomic position for the bait sequence. + """ + n = str(random.random())+".fa" + with open(n,"w") as fo: + fo.write(">bait\n"+bait+"\n") + doBowtie = "bowtie2 --quiet --no-head --no-sq -f --end-to-end -x {ref} -U {fa}".format(ref=ref, fa=n) + status, output = subprocess.getstatusoutput(doBowtie) + os.system("rm %s"%n) + output = output.split("\n")[0].split("\t") + if output[1] == "16": + strand = "-" + else: + strand = "+" + chrom = output[2] + pos = output[3] + return chrom, pos, strand + + +def match(sa, sb, miss=2): + s = 0 + for i in range(len(sa)): + if sa[i] != sb[i]: + s += 1 + if s > miss: + return False + else: + return True + + +def parseSeq(fin, fo, bait, enz, miss=2, rlen=10): + tot = 0 + q = 0 + with gzip.open(fo, "wt") as fout: + with gzip.open(fin, "rt") as f: + for r in FastqGeneralIterator(f): + r = list(r) + tot += 1 + #if tot % 100000 == 0: + # print("%s reads processed for %s" % (tot, fo)) + s = r[1][:len(bait)] + m = match(bait, s, miss) + if m == False: + continue + flag = False + for i in range(len(bait), len(r[1])): + if r[1][i:i + len(enz)] == enz: + pos = i + len(enz) + 1 + if len(r[1]) - pos > rlen: + flag = True + break + if flag == False: + continue + r[1] = r[1][pos:] + r[2] = r[2][pos:] + q += 1 + fout.write("@%s\n%s\n+\n%s\n" % (r[0], r[1], r[2])) + return tot, q + + +def sam2bam(sam, bam): + """ + SAM to BAM file + """ + samview = "samtools view -S %s -b -o %s" % (sam, bam) + samsort = "samtools sort -@ 2 {bam} -T {pre} -o {bam}".format( + bam=bam, pre=bam.replace(".bam", "")) + samindex = "samtools index {bam} {bai}".format(bam=bam, + bai=bam.replace( + ".bam", ".bai")) + rmsam = "rm %s" % (sam) + cmds = [samview, samsort, samindex, rmsam] + callSys(cmds, logger) + + +def doMap(fq, ref,sam,bam, cpus=5): + #doBowtie = "bowtie2 --no-mixed --no-discordant -p {cpus} -q --local --very-sensitive -x {ref} {fq} -S {sam}".format( + doBowtie = "bowtie2 -p {cpus} -q --end-to-end --very-sensitive -x {ref} {fq} -S {sam}".format( + cpus=cpus, ref=ref, fq=fq, sam=sam) + logger.info(doBowtie) + status, output = subprocess.getstatusoutput(doBowtie) + #trim with "Warning" + output = output.split("\n") + output = [t for t in output if not t.startswith("Warning")] + mapRatio = float(output[-1].split("%")[0]) + sam2bam(sam, bam) + return mapRatio + + +def bam2Bed(bam, bed, mapq=10): + """ + Converting BAM file to BED file. + bam: bam file path + bed: bed file path + mapq: mapq cutoff to remove bad qulity reads. + """ + fd = os.path.splitext(bed)[0] + d = os.path.dirname(bed) + if not os.path.exists(d): + os.mkdir(d) + nb = bam.split("/")[-1] + tmpbam = fd + ".2.bam" + #important for paired end reads, do it all for all kinds of files. + samsort = "samtools sort -n -@ 2 {bam} -T {pre} -o {tmpbam}".format( + bam=bam, tmpbam=nb, pre=nb.replace(".bam", "")) + rmunmaped = "samtools view -b -q {} -F 4 {} >> {}".format(mapq, nb, tmpbam) + callSys([samsort, rmunmaped], logger) + bam2bed = "bamToBed -i {bam} > {bed}".format(bam=tmpbam, bed=bed) + logger.info(bam2bed) + status, output = subprocess.getstatusoutput(bam2bed) + rmbam = "rm {} {}".format(tmpbam, nb) + callSys([rmbam, "gzip %s" % bed], logger) + + +def getUniqueBed(f, fout, chrom, cis=False): + redus = set() + tot = 0 + c = 0 + with gzip.open(fout, "wt") as fo: + for line in gzip.open(f, "rt"): + tot += 1 + line = line.split("\n")[0].split("\t") + if cis and chrom is not None: + if line[0] != chrom: + continue + s = int(line[1]) + e = int(line[2]) + r = (line[0], s, e) + if r in redus: + continue + else: + if line[0] == chrom: + c += 1 + redus.add(r) + fo.write("\t".join(line) + "\n") + return tot, len(redus), c + + +def bed2hicFrag(bed, hicFrag, fo, chrom=None, cis=False): + frags = HTSeq.GenomicArrayOfSets("auto", stranded=False) + for line in open(hicFrag): + line = line.split("\n")[0].split("\t") + if cis and chrom is not None and line[0] != chrom: + continue + iv = HTSeq.GenomicInterval(line[0], int(line[1]), int(line[2])) + name = (line[0], line[1], line[2], line[3]) + frags[iv] += name + c = 0 + with gzip.open(fo, "wt") as fout: + for line in gzip.open(bed, "rt"): + line = line.split("\n")[0].split("\t") + if cis and chrom is not None and line[0] != chrom: + continue + strand = line[5] + if strand == "+": + p = HTSeq.GenomicPosition(line[0], int(line[1])) + else: + p = HTSeq.GenomicPosition(line[0], int(line[2])) + t = list(frags[p]) + if len(t) == 0: + continue + c += 1 + line = t[0] + fout.write("\t".join(line) + "\n") + return c + + +def bed2bdg(f, fout, log=False): + model = HTSeq.GenomicArray("auto", stranded=False) + t = 0 + for line in gzip.open(f, "rt"): + line = line.split("\n")[0].split("\t") + chrom = line[0] + s = int(line[1]) + e = int(line[2]) + iv = HTSeq.GenomicInterval(chrom, s, e) + model[iv] += 1 + t += 1 + with open(fout, "w") as fo: + for iv, value in model.steps(): + if value > 0: + value = value / 1.0 / t * 10**6 #RPM + if log: + value = np.log2(value + 1) + line = [iv.chrom, iv.start, iv.end, value] + line = list(map(str, line)) + fo.write("\t".join(line) + "\n") + + +def main(): + """ + Batch converting from bam to bedpe. + """ + #prepare everything + op = help() + for t in ["bowtie2", "samtools", "bamToBed"]: + if not isTool(t): + logger.error("%s not exits! Please install through conda." % t) + return + if not os.path.exists(op.fq): + logger.error("Input %s not exists! Return." % op.fq) + return + if len(glob(op.ref + "*.bt2")) == 0: + logger.error("Bowtie2 reference not exists for prefix of %s! Return." % + op.ref) + return + if not os.path.exists(op.output): + os.makedirs(op.output, exist_ok=True) + else: + fs = glob(os.path.join(op.output, "*")) + if len(fs) > 0: + logger.info( + "Target output directory %s is not empty, may over-write some files." + % op.output) + return + + + logger.info("%s: Start the analysis of sample."%(op.output)) + bait = op.bait.upper() + enz = op.ligationSite.upper() + + #step 1, get the bait genomic coordinate + logger.info("%s_Step1: Get bait sequence genomic location."%op.output) + vpChrom, vpPos, vpStrand = getBaitPos(bait, op.ref) + + #step 2, pre-process fastq files to only keep the reads there are bait and remove the bait sequence + logger.info("%s_Step2: Trim bait sequence and only keep the target reads."%op.output) + fastq = op.output+"/"+op.output+".fastq.gz" + tot,hasBait= parseSeq(op.fq,fastq,bait, enz) + + #step 3, mapping the target reads to the genome + logger.info("%s_Step3: Map the target reads to the reference genome."%op.output) + sam = op.output+"/"+op.output+".sam" + bam = op.output+"/"+op.output+".bam" + mapRatio = doMap(fastq,op.ref,sam,bam,cpus=op.cpu) + + #step 4, get the high quality unqiue reads + logger.info("%s_Step4: Get the high quality unique reads."%op.output) + bed = op.output+"/"+op.output+".bed" + bam2Bed(bam,bed,mapq=op.mapq) + uniqueBed = op.output+"/"+op.output+"_unique.bed.gz" + totMapped, uniqueMapped, uniqueCis = getUniqueBed(bed + ".gz", uniqueBed,vpChrom,cis=op.cis) + + #step 5, map the reads to fragments + logger.info("%s_Step5: Map the reads to genomic fragments digested."%op.output) + frag = op.output+"/"+op.output+"_frag.bed.gz" + cFrags = bed2hicFrag(uniqueBed,op.genomeFrag,frag,chrom=vpChrom,cis=op.cis) + + #step 6, generate view point bedgraph + logger.info("%s_Step6: Generate visualization bedGraph file."%op.output) + bdg = op.output+"/"+op.output+"_frag.bdg" + bed2bdg(frag, bdg, log=op.log) + + #step 7, generate the qc report + rs = { + "0_totalRawReads":tot, + "1_rawReadsHasBait": hasBait, + "2_baitRatio": hasBait/tot, + "3_trimedReadsMappingRatio": mapRatio, + "4_highQualityMappedReads(MAPQ>=10)":totMapped, + "5_highQualityUniqueReads":uniqueMapped, + "6_redundancy": 1- uniqueMapped/totMapped, + "7_highQualityUniqueCisReads":uniqueCis, + "8_cisRatio": uniqueCis/uniqueMapped, + "9_validFragments": cFrags, + "10_validRatio": cFrags/uniqueMapped, + } + rs = pd.Series(rs) + rs.to_csv(op.output+"/"+op.output+"_report.txt",sep="\t",header=None) + + logger.info("%s:The analysis finished."%(op.output)) + + +if __name__ == '__main__': + main() diff --git a/build/scripts-3.10/anoPeaks.py b/build/scripts-3.10/anoPeaks.py new file mode 100755 index 00000000..e15881b3 --- /dev/null +++ b/build/scripts-3.10/anoPeaks.py @@ -0,0 +1,186 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +anoPeaks.py +cLoops2 anoPeaks.py annotate peaks genomic locations as promoters or enhancers. +""" + +__date__ = "2023-08-10" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os +import argparse +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from scipy.spatial import KDTree + +#cLoops2 +from cLoops2.ano import readGenes, findOverlapOrNearest +from cLoops2.ds import Peak + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Annotate peaks as promoters or enhancers according to gene annotations. + + Example: + anoPeaks.py -f H3K27ac_peaks.bed -gtf hg38.gtf -o H3K27ac_peaks + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-f", + dest="peakf", + required=True, + type=str, + help= + "Input .bed file as peaks. Peak id will be renamed as chrom|start|end") + parser.add_argument("-gtf", + dest="gtf", + default="", + required=False, + type=str, + help="GTF file annotation for genes.") + parser.add_argument( + "-tid", + dest="tid", + default=False, + required=False, + action="store_true", + help= + "Whether to use transcript id instead of gene id for annotation. Default\n"\ + "is not." + ) + parser.add_argument( + "-pdis", + dest="pdis", + default=2000, + required=False, + type=int, + help= + "Distance limitation for anchor to nearest gene/transcript TSS to define\n"\ + "as promoter. Default is 2000 bp." + ) + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + op = parser.parse_args() + return op + + +def parseBed2Peaks(fbed): + """ + """ + peaks = {} + for line in open(fbed): + line = line.split("\n")[0].split("\t") + if len(line) < 3: + continue + chrom = line[0] + if chrom not in peaks: + peaks[chrom] = [] + peak = Peak() + peak.id = "|".join(line[:3]) + peak.chrom = chrom + peak.start = int(line[1]) + peak.end = int(line[2]) + peak.length = peak.end - peak.start + peaks[chrom].append(peak) + return peaks + + +def anoPeaks( + peakf, + fout, + gtf, + tid=False, + pdis=2000, +): + """ + Annotate peaks. + @param peakf: str, name of peaks file, .bed file + @param fout: str, output prefix + @param gtf: str, GTF file name + @param tid: bool, if set true, use transcript id for alternative TSS + @param pdis: <=distance nearest TSS to define as promoter + """ + if not os.path.isfile(peakf): + print("Input %s not exists, return." % peakf) + return + elif not os.path.isfile(gtf): + print("Input %s not exists, return." % gtf) + return + else: + #gene annotions, {chrom:{tss:g}}, tss is int + genes = readGenes(gtf, tid=tid) + peaks = parseBed2Peaks(peakf) + #store results + rs = {} + #find nearest TSS + print("annotating peaks" ) + for chrom in tqdm(peaks.keys()): + if chrom not in genes: + continue + gs = genes[chrom] + ts = np.array([[tss] for tss in gs.keys()]) + cov = {} + for tss, g in gs.items(): + cov[tss] = g + tree = KDTree(ts) + for peak in peaks[chrom]: + xgs, xds = findOverlapOrNearest(gs, ts, tree, peak.start, + peak.end) + if len(xgs) > 1: + xt = "Promoter" + xd = 0 + else: + xd = xds[0] + if abs(xd) <= pdis: + xt = "Promoter" + else: + xt = "Enhancer" + rs[peak.id] = { + "1_chrom": + peak.chrom, + "2_start": + peak.start, + "3_end": + peak.end, + "4_type": + xt, + "5_nearestDistanceToTSS": + xd, + "6_nearestTargetTSS": + ",".join([ + xg.chrom + ":" + str(xg.start) + "-" + str(xg.end) + + "|" + xg.strand + "|" + xg.name for xg in xgs + ]), + } + rs = pd.DataFrame(rs).T + rs.to_csv(fout + "_anoPeaks.txt", sep="\t", index_label="peakId") + + +def main(): + op = help() + anoPeaks( + op.peakf, + op.output, + op.gtf, + tid=op.tid, + pdis=op.pdis, + ) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/compareComp.py b/build/scripts-3.10/compareComp.py new file mode 100755 index 00000000..51b9eecd --- /dev/null +++ b/build/scripts-3.10/compareComp.py @@ -0,0 +1,407 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +compareComp.py +cLoops2 compareComp.py compare compartment PC1 values based on Mahalanobis distance and annotate the changed bins. + +""" + +__date__ = "2023-03-09" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#sys library +import argparse +from argparse import RawTextHelpFormatter + +#3rd library +import pylab +import HTSeq +import pandas as pd +import numpy as np + +#cLoops2 +from cLoops2.stat import twoPassesMDTest +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Pair-wisely compare compartments PC1 based on two-passes Mahalanobis distance. + + Example: + compareComp.py -a young_pc1.bdg -b old_pc1.bdg -o youngVsOld -na Young -b Old -pcut 0.01 -gtf mm10.gtf + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-a", + dest="fa", + required=True, + type=str, + help= + "Input bedGraph file for the first sample containing the PC1 scores from comparment analysis. Should be aligned for A/B considering gene density or CpG islands contents. Better to be a control such as young or wild-type sample." + ) + parser.add_argument( + "-b", + dest="fb", + required=True, + type=str, + help= + "Input bedGraph file for the second sample containing the PC1 scores from comparment analysis." + ) + parser.add_argument( + "-na", + dest="na", + type=str, + required=True, + help= + "Name of first sample, will be shown in the output figure. Only use alphabet and numbers." + ) + parser.add_argument( + "-nb", + dest="nb", + type=str, + required=True, + help="Name of second sample, will be shown in the output figure.") + parser.add_argument( + "-gtf", + dest="gtf", + default="", + required=True, + type=str, + help= + "GTF file annotation for genes. Significant flip/switch overlapped genes will be reported based on the gene annotation file." + ) + parser.add_argument( + "-pcut", + dest="pcut", + type=float, + default=0.01, + help= + "Chi-Square p-value cutoff for detecting siginficant different compartment, default is 0.01." + ) + + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + op = parser.parse_args() + return op + + +def stichBins2Comp(rs): + """ + Stich bins to compartment + """ + comps = [] + i = 0 + while i < len(rs): + j = i + 1 + p = i + while j < len(rs): + if rs[j][-1] * rs[i][-1] > 0: + p = j + j += 1 + else: + break + if rs[i][-1] > 0: + flag = "compartmentA" + else: + flag = "compartmentB" + s = rs[i][1] + e = rs[p][2] + vs = [rs[t][-1] for t in range(i, j)] + v = np.mean(vs) + comps.append([ + rs[i][0], s, e, + rs[i][0] + ":" + str(s) + "-" + str(e) + "|" + flag, + str(v) + ]) + i = j + return comps + + +def getCompartment(bdgf, fout): + """ + Get compartment according to PC1 values. + """ + ds = {} + for line in open(bdgf): + line = line.split("\n")[0].split("\t") + if line[0] not in ds: + ds[line[0]] = [] + line[-1] = float(line[-1]) + ds[line[0]].append(line) + #stich domains + cs = list(ds.keys()) + cs.sort() + with open(fout, "w") as fo: + for c in cs: + rs = stichBins2Comp(ds[c]) + for r in rs: + fo.write("\t".join(r) + "\n") + + +def readBdg(f): + """ + Read bedGraph file for PC1. + """ + ds = {} #pandas series + for line in open(f): + line = line.split("\n")[0].split("\t") + k = line[0] + ":" + line[1] + "-" + line[2] + v = float(line[-1]) + ds[k] = v + ds = pd.Series(ds) + return ds + + +def getFlips(sa, sb, ps, inds): + """ + Get compartment flips according to PC1 and p-values. + + @param sa: pd.Series, PC1 values for sample A + @param sb: pd.Series, PC1 values for sample B + @param ps: pd.Series, p-values + @param inds: pd.Series.idnex, p-value select index + + @return a2b: pd.Series.idnex, A to B flips + @return b2a: pd.Series.idnex, B to A flips + @return a2a: pd.Series.idnex, A to A changes + @return b2b: pd.Series.index, B to B changes + """ + #AtoB flips + ta = sa[sa > 0].index + tb = sb[sb < 0].index + a2b = ta.intersection(tb).intersection(inds) + a2b = ps[a2b].sort_values(inplace=False, ascending=True).index + + #BtoA flips + ta = sa[sa < 0].index + tb = sb[sb > 0].index + b2a = ta.intersection(tb).intersection(inds) + b2a = ps[b2a].sort_values(inplace=False, ascending=True).index + + #AtoA + ta = sa[sa > 0].index + tb = sb[sb > 0].index + a2a = ta.intersection(tb).intersection(inds) + a2a = ps[a2a].sort_values(inplace=False, ascending=True).index + + #BtoB + ta = sa[sa < 0].index + tb = sb[sb < 0].index + b2b = ta.intersection(tb).intersection(inds) + b2b = ps[b2b].sort_values(inplace=False, ascending=True).index + return a2b, b2a, a2a, b2b + + +def plotChanges(data, na, nb, a2b, b2a, a2a, b2b, pcut, output): + """ + Plot the compartment changes. + """ + + #plot the raw dots + fig, ax = pylab.subplots(figsize=(3.2, 2.2)) + ax.scatter(data[na], + data[nb], + s=0.5, + color="gray", + alpha=0.6, + label="total %s bins" % data.shape[0]) + + #plot the changes + ax.scatter(data[na][a2b], + data[nb][a2b], + s=1, + color=colors[0], + alpha=0.8, + label="A->B %s bins" % len(a2b)) + ax.scatter(data[na][b2a], + data[nb][b2a], + s=1, + color=colors[2], + alpha=0.8, + label="B->A %s bins" % len(b2a)) + ax.scatter(data[na][a2a], + data[nb][a2a], + s=1, + color=colors[3], + alpha=0.8, + label="A->A %s bins" % len(a2a)) + ax.scatter(data[na][b2b], + data[nb][b2b], + s=1, + color=colors[4], + alpha=0.8, + label="B->B %s bins" % len(b2b)) + + leg = ax.legend( + bbox_to_anchor=(1.05, 1.0), + loc='upper left', + labelcolor=["gray", colors[0], colors[2], colors[3], colors[4]]) + for h in leg.legendHandles: + h._sizes = [10] + ax.axvline(0, color="gray", linestyle="--") + ax.axhline(0, color="gray", linestyle="--") + ax.set_xlabel(f"{na} PC1") + ax.set_ylabel(f"{nb} PC1") + ax.set_title(f"Mahalanobis distance P-value < {pcut}") + pylab.savefig(f"{output}_bins_flips.pdf") + + +def parseGtfFeature(t): + ds = {} + t = t.replace('"', '') + for n in t.split('; '): + s = n.split() + ds[s[0]] = s[1] + return ds + + +def readCompGenes(compf, gtf): + """ + Read compartment and gene sets regions as HTSeq.GenomicArrayOfSets. + """ + #read compartments + comps = HTSeq.GenomicArrayOfSets("auto", stranded=False) + for line in open(compf): + line = line.split("\n")[0].split("\t") + iv = HTSeq.GenomicInterval(line[0], int(line[1]), int(line[2])) + comps[iv] += line[3] + #read gtf + genes = HTSeq.GenomicArrayOfSets("auto", stranded=False) + gs = {} + for line in open(gtf): + if line.startswith("#"): + continue + line = line.split("\n")[0].split("\t") + if line[2] != 'exon': + continue + ds = parseGtfFeature(line[8]) + key = "|".join([ds["gene_id"], ds["gene_name"]]) + nline = [ + line[0], line[3], line[4], + "|".join([ds["gene_id"], ds["gene_name"]]), ".", line[6] + ] + if key not in gs: + gs[key] = [line[0], int(line[3]), int(line[4])] + else: + if int(line[3]) < gs[key][1]: + gs[key][1] = int(line[3]) + if int(line[4]) > gs[key][2]: + gs[key][2] = int(line[4]) + for g, v in gs.items(): + iv = HTSeq.GenomicInterval(v[0], v[1], v[2]) + genes[iv] += g + return comps, genes + + +def anoBins(data, na, nb, s, comps, genes, fout): + """ + Annotate changed bins. + """ + ds = {} + ags = set() + for t in s: + chrom = t.split(":")[0] + start = t.split(":")[1].split("-")[0] + end = t.split(":")[1].split("-")[1] + iv = HTSeq.GenomicInterval(chrom, int(start), int(end)) + comp = list(list(comps[iv].steps())[0][1])[0] + gs = set() + for i, g in genes[iv].steps(): + gs.update(g) + gs = list(gs) + if len(gs) > 0: + gs = [g.split("|")[-1] for g in gs] + ags.update(gs) + gs = ",".join(gs) + ds[t] = { + "chrom": chrom, + "start": start, + "end": end, + f"{na} PC1": data.loc[t, na], + f"{nb} PC1": data.loc[t, nb], + "P-value": data.loc[t, "Chi-Square test P-value"], + "compartmentId": comp, + "overlappedGenes": gs, + } + ds = pd.DataFrame(ds).T + ds.to_csv(fout + ".txt", index_label="binId", sep="\t") + ags = list(ags) + with open(fout + "_genes.list", "w") as fo: + fo.write("\n".join(ags)) + + +def compareComp(fa, fb, na, nb, gtf, output, pcut=0.01): + """ + Pair-wise comparsion of compartments. + """ + print("Step 1: Stiching bins as compartments.") + #step 1 get the compartment + acompf = output + "_" + na + "_compartments.bed" + bcompf = output + "_" + nb + "_compartments.bed" + getCompartment(fa, acompf) + getCompartment(fb, bcompf) + + print("Step 2: Performing two-passes mahalanobis distances caculation.") + #step 2 prepare the bins level data + sa = readBdg(fa) + sb = readBdg(fb) + t = sa.index.intersection(sb.index) + sa = sa[t] + sb = sb[t] + data = pd.DataFrame({na: sa, nb: sb}) + + #step 3 two passes MD test for bins + dis, ps = twoPassesMDTest(data, pcut) + inds = ps[ps < pcut].index + + #step 4 get flips or same compartment chanegs + a2b, b2a, a2a, b2b = getFlips(sa, sb, ps, inds) + + print("Step 3: Plotting switch bins.") + #step 5 show the changes + plotChanges(data, na, nb, a2b, b2a, a2a, b2b, pcut, output) + + print("Step 4: Outputing results.") + #step 6 output the p-values as bdg + ps[ps < 1e-300] = 1e-300 + with open(f"{output}_-logP.bdg", "w") as fout: + for i in ps.index: + chrom = i.split(":")[0] + start = i.split(":")[1].split("-")[0] + end = i.split(":")[1].split("-")[1] + line = [chrom, start, end, str(-np.log10(ps[i]))] + fout.write("\t".join(line) + "\n") + + #step 7 output the distance and p-values + data["Mahalanobis distance"] = dis + data["Chi-Square test P-value"] = ps + data.to_csv(f"{output}_MD_p-values.txt", sep="\t", index_label="binId") + + #step 8 annotate the changed bins and associated genes and output as bed files + ds = { + "AtoB": a2b, + "BtoA": b2a, + "AtoA": a2a, + "BtoB": b2b, + } + comps, genes = readCompGenes(acompf, gtf) + for k, v in ds.items(): + anoBins(data, na, nb, v, comps, genes, f"{output}_{k}_bins") + + +def main(): + op = help() + compareComp(op.fa, op.fb, op.na, op.nb, op.gtf, op.output, op.pcut) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/compareDom.py b/build/scripts-3.10/compareDom.py new file mode 100755 index 00000000..1ef829b5 --- /dev/null +++ b/build/scripts-3.10/compareDom.py @@ -0,0 +1,514 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" + +compareDom.py +cLoops2 compareDom.py quantify and compare Hi-C domains between two conditions. +2023-04-10: modified test without MA conversion +""" + +__date__ = "2023-03-14" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#sys library +import os +import json +import argparse +from glob import glob +from argparse import RawTextHelpFormatter + +#3rd library +import pylab +import HTSeq +import pandas as pd +import numpy as np +from tqdm import tqdm +from joblib import Parallel, delayed + +#cLoops2 +from cLoops2.est import estSfMANorm +from cLoops2.ds import XY +from cLoops2.io import parseIxy +from cLoops2.stat import twoPassesMDTest +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Pair-wise quantification and comparsion of domains based on two-passes Mahalanobis distance. + + Example: + compareDom.py -f dom.bed -a young -b old -o youngVsOld -na Young -b Old -pcut 0.01 -gtf mm10.gtf + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument("-f", + dest="domf", + required=True, + type=str, + help="Domain file in .bed format.") + parser.add_argument( + "-a", + dest="da", + required=True, + type=str, + help="The data directory generated by cLoops2 pre for the first sample." + ) + parser.add_argument( + "-b", + dest="db", + required=True, + type=str, + help= + "The data directory generated by cLoops2 pre for the second sample.") + parser.add_argument( + "-na", + dest="na", + type=str, + required=True, + help= + "Name of first sample, will be shown in the output figure. Only use alphabet and numbers." + ) + parser.add_argument( + "-nb", + dest="nb", + type=str, + required=True, + help="Name of second sample, will be shown in the output figure.") + parser.add_argument( + "-gtf", + dest="gtf", + default="", + required=True, + type=str, + help= + "GTF file annotation for genes. Significant flip/switch overlapped genes will be reported based on the gene annotation file." + ) + parser.add_argument( + "-pcut", + dest="pcut", + type=float, + default=0.01, + help= + "Chi-Square p-value cutoff for detecting siginficant different compartment, default is 0.01." + ) + + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-p", + dest="cpu", + required=False, + type=int, + default=4, + help="How many cpus used for quantification, default is 4.") + parser.add_argument( + "-xlim", + dest="xlim", + required=False, + type=str, + default=None, + help= + "X-axis limitations for the scatter plot, default is autodetermined, set as '1,-1'." + ) + parser.add_argument( + "-ylim", + dest="ylim", + required=False, + type=str, + default=None, + help= + "Y-axis limitations for the scatter plot, default is autodetermined, set as '1,-1'." + ) + parser.add_argument("-vmin", + dest="vmin", + required=False, + type=str, + default=None, + help="Minimal scale for the aggregation heatmap.") + parser.add_argument("-vmax", + dest="vmax", + required=False, + type=str, + default=None, + help="Maxmal scale for the aggregation heatmap.") + + op = parser.parse_args() + return op + + +def parseDom(f): + doms = {} + for line in open(f): + if line[0] == "#": + continue + line = line.split("\n")[0].split("\t") + if len(line) < 3: + continue + if line[0] not in doms: + doms[line[0]] = [] + doms[line[0]].append(line) + return doms + + +def _quant(rs, fixy, tot): + ds = {} + key, mat = parseIxy(fixy) + xy = XY(mat[:, 0], mat[:, 1]) + for r in rs: + key = r[0] + ":" + r[1] + "-" + r[2] + t = xy.queryPeak(int(r[1]), int(r[2])) + b = xy.queryPeakBoth(int(r[1]), int(r[2])) + ds[key] = { + "total": + len(t), + "internalCounts": + len(b), + "externalCounts": + len(t.difference(b)), + "ES(internal/external)": + float(len(b)) / float(len(t.difference(b))), + "internalRPKM": + float(len(b)) / (int(r[2]) - int(r[1])) / tot * 10**9, + "externalRPKM": + float(len(t.difference(b))) / (int(r[2]) - int(r[1])) / tot * + 10**9, + } + return ds + + +def quant(d, doms, cpu): + fs = glob(d + "/*.ixy") + metaf = d + "/petMeta.json" + meta = json.loads(open(metaf).read()) + tot = meta["Unique PETs"] + nfs = {} + for f in fs: + c = f.split("/")[-1].split("-")[0] + nfs[c] = f + #get the data + cs = list(doms.keys()) + ds = Parallel(n_jobs=cpu, backend="multiprocessing")(delayed(_quant)( + doms[c], + nfs[c], + tot, + ) for c in tqdm(cs)) + nds = {} + for d in ds: + for k, v in d.items(): + nds[k] = v + ds = pd.DataFrame(nds).T + return tot, ds + + +def summary(domsa, domsb, na, nb): + data = {} + for c in domsa.columns: + data[na + "_" + c] = domsa[c] + data[nb + "_" + c] = domsb[c] + data = pd.DataFrame(data) + return data + + +def plotChanges(data, na, nb, ra, rb, pcut, output, xlim=None, ylim=None): + """ + Plot the domain changes with MA-plot. + """ + sa = data[f"{na}_ES"] + sb = data[f"{nb}_ES"] + + #plot the raw dots + fig, ax = pylab.subplots(figsize=(3.2, 2.2)) + ax.scatter(sa, + sb, + s=0.5, + color="gray", + alpha=0.6, + label="total %s domains" % data.shape[0]) + #plot the changes + ax.scatter(sa[ra], + sb[ra], + s=2, + color=colors[0], + alpha=0.8, + label="%s domains" % len(ra)) + ax.scatter(sa[rb], + sb[rb], + s=2, + color=colors[1], + alpha=0.8, + label="%s domains" % len(rb)) + leg = ax.legend(bbox_to_anchor=(1.05, 1.0), + loc='upper left', + labelcolor=["gray", colors[0], colors[1]]) + for h in leg.legendHandles: + h._sizes = [10] + ax.set_xlabel(f"{na} domain ES") + ax.set_ylabel(f"{nb} domain ES") + ax.set_title(f"ES comparsion\nMahalanobis distance P-value < {pcut}") + s = np.min([np.min(sa), np.min(sb)]) + e = np.max([np.max(sa), np.max(sb)]) + ax.plot([s, e], [s, e], color="gray", linestyle="--") + if xlim is not None: + xlim = list(map(float, xlim.split(","))) + xlim.sort() + ax.set_xlim(xlim) + if ylim is not None: + ylim = list(map(float, ylim.split(","))) + ylim.sort() + ax.set_ylim(ylim) + pylab.savefig(f"{output}_domainChanges.pdf") + + +def writeBed(rs, fo): + with open(fo, "w") as fout: + for t in rs: + chrom = t.split(":")[0] + start = t.split(":")[1].split("-")[0] + end = t.split(":")[1].split("-")[1] + line = [chrom, start, end, t] + fout.write("\t".join(line) + "\n") + + +def plotDiffAggDomains(fa, fb, tota, totb, na, nb, fout, vmin=None, vmax=None): + mata = np.load(fa, mmap_mode="r") + mata = mata["arr_0"] + matb = np.load(fb, mmap_mode="r") + matb = matb["arr_0"] + ta = tota / 10**6 + tb = totb / 10**6 + mata = np.log2((mata + 1) / ta) + matb = np.log2((matb + 1) / tb) + mat = [] + for i in range(mata.shape[0]): + atmat = mata[i] + btmat = matb[i] + nmat = btmat - atmat + mat.append(nmat) + mat = np.array(mat) + mat = np.mean(mat, axis=0) + label = f"normalized log2({nb}/{na})" + #if vmin == None: + # vmin = 0 + fig, ax = pylab.subplots(figsize=(4, 4)) + cmap = sns.color_palette("RdBu_r", 11).as_hex() + cmap[int(len(cmap) / 2)] = "#FFFFFF" + cmap = ListedColormap(cmap) + sns.heatmap(mat, + xticklabels=False, + yticklabels=False, + square=True, + linewidths=0.0, + vmin=vmin, + vmax=vmax, + cmap=cmap, + cbar_kws={ + 'label': label, + "shrink": 0.5 + }) + #draw the box + ax.axvline(x=ax.get_xlim()[0], color="k", linewidth=2) + ax.axvline(x=ax.get_xlim()[1], color="k", linewidth=2) + ax.axhline(y=ax.get_ylim()[0], color="k", linewidth=2) + ax.axhline(y=ax.get_ylim()[1], color="k", linewidth=2) + ax.set_title("log2(%s-%s) %s domains" % (nb, na, mata.shape[0])) + pylab.savefig("%s_diffAggDomains.pdf" % fout) + + +def parseGtfFeature(t): + ds = {} + t = t.replace('"', '') + for n in t.split('; '): + s = n.split() + ds[s[0]] = s[1] + return ds + + +def readGenes(gtf): + """ + Read gene sets regions as HTSeq.GenomicArrayOfSets. + """ + #read gtf + genes = HTSeq.GenomicArrayOfSets("auto", stranded=False) + gs = {} + for line in open(gtf): + if line.startswith("#"): + continue + line = line.split("\n")[0].split("\t") + if line[2] != 'exon': + continue + ds = parseGtfFeature(line[8]) + key = "|".join([ds["gene_id"], ds["gene_name"]]) + nline = [ + line[0], line[3], line[4], + "|".join([ds["gene_id"], ds["gene_name"]]), ".", line[6] + ] + if key not in gs: + gs[key] = [line[0], int(line[3]), int(line[4])] + else: + if int(line[3]) < gs[key][1]: + gs[key][1] = int(line[3]) + if int(line[4]) > gs[key][2]: + gs[key][2] = int(line[4]) + for g, v in gs.items(): + iv = HTSeq.GenomicInterval(v[0], v[1], v[2]) + genes[iv] += g + return genes + + +def anoBins(data, na, nb, s, genes, fout): + """ + Annotate changed bins. + """ + ds = {} + ags = set() + for t in s: + chrom = t.split(":")[0] + start = t.split(":")[1].split("-")[0] + end = t.split(":")[1].split("-")[1] + iv = HTSeq.GenomicInterval(chrom, int(start), int(end)) + gs = set() + for i, g in genes[iv].steps(): + gs.update(g) + gs = list(gs) + if len(gs) > 0: + gs = [g.split("|")[-1] for g in gs] + ags.update(gs) + gs = ",".join(gs) + ds[t] = { + "chrom": chrom, + "start": start, + "end": end, + "overlappedGenes": gs, + } + for c in data.columns: + ds[t][c] = data.loc[t, c] + ds = pd.DataFrame(ds).T + ds.to_csv(fout + ".txt", index_label="domId", sep="\t") + ags = list(ags) + with open(fout + "_genes.list", "w") as fo: + fo.write("\n".join(ags)) + + +def compareDom( + domf, + da, + db, + na, + nb, + gtf, + output, + pcut=0.01, + cpu=4, + xlim=None, + ylim=None, + vmin=None, + vmax=None, +): + """ + Pair-wise comparsion of domains. + + @param domf: str, domains in bed format, file path + @param da: str, cLoops2 pre generated data directory for the first sample + @param db: str, cLoops2 pre generated data directory for the second sample + @param na: str, name of the first sample + @param nb: str, name of the second sample + @param gtf: str, file path of the gtf annotaiton file + @param output: str, output prefix + @param pcut: float, p-value cutoff for the two-passes MD test + @param cpu: int, number of CPUs for running the job. + """ + + print("Step 1: Quantifying domains.") + #step 1 quantify the domains + doms = parseDom(domf) + tota, domsa = quant(da, doms, cpu) + totb, domsb = quant(db, doms, cpu) + data = summary(domsa, domsb, na, nb) + data.to_csv(f"{output}_domainQuant.txt", sep="\t", index_label="domId") + #data = pd.read_csv(f"{output}_domainQuant.txt", index_col=0, sep="\t") + + #step 2 pair-wise comparsion + print("Step 2: Performing two-passes mahalanobis distances caculation.") + #use the ES with MA plot to run the two-passes MD test + sa = data[f"{na}_ES(internal/external)"] + sb = data[f"{nb}_ES(internal/external)"] + + a = (sa + sb) / 2 + m = np.log2(sb / sa) + """ + #MANorm2 + sf = estSfMANorm(sa, sb) + sbn = pd.Series( [sf[0]*t + sf[1] for t in sb],index=sb.index ) + a = (sa+sbn )/2 + m = np.log2(sbn/sa) + """ + + #esdata = pd.DataFrame({"A": a, "M": m}) + esdata = pd.DataFrame({f"{na}_ES": sa, f"{nb}_ES": sb}) + dis, ps = twoPassesMDTest(esdata, pcut) + ps[ps < 1e-300] = 1e-300 + inds = ps[ps < pcut].index + esdata["Mahalanobis distance"] = dis + esdata["Chi-Square test P-value"] = ps + esdata.to_csv(f"{output}_ES_MD_p-values.txt", + sep="\t", + index_label="domId") + ra = sa[sa > sb].index.intersection(inds) + ra = m[ra].sort_values(inplace=False, ascending=True).index + rb = sb[sb > sa].index.intersection(inds) + rb = m[rb].sort_values(inplace=False, ascending=False).index + + #data["ES_M"] = esdata["M"] + #data["ES_A"] = esdata["A"] + data["Mahalanobis distance"] = esdata["Mahalanobis distance"] + data["Chi-Square test P-value"] = esdata["Chi-Square test P-value"] + data = pd.read_csv(f"{output}_domainQuant.txt", index_col=0, sep="\t") + + #step 3 show the changes + plotChanges(esdata, na, nb, ra, rb, pcut, output, xlim, ylim) + + #step 4 output the bed files + writeBed(ra, f"{output}_{na}_specific.bed") + writeBed(rb, f"{output}_{nb}_specific.bed") + + print("Step 3: Performing aggregation analysis.") + #step 5 plot the aggregation plots + c1 = f"cLoops2 agg -d {da} -domains {output}_{na}_specific.bed -o {output}_{na}_specific_{na} -p {cpu} -domain_ext 0.25" + c2 = f"cLoops2 agg -d {db} -domains {output}_{na}_specific.bed -o {output}_{na}_specific_{nb} -p {cpu} -domain_ext 0.25" + c3 = f"cLoops2 agg -d {da} -domains {output}_{nb}_specific.bed -o {output}_{nb}_specific_{na} -p {cpu} -domain_ext 0.25" + c4 = f"cLoops2 agg -d {db} -domains {output}_{nb}_specific.bed -o {output}_{nb}_specific_{nb} -p {cpu} -domain_ext 0.25" + for c in [c1, c2, c3, c4]: + print(c) + os.system(c) + plotDiffAggDomains(f"{output}_{na}_specific_{na}_aggDomains.npz", + f"{output}_{na}_specific_{nb}_aggDomains.npz", tota, + totb, na, nb, f"{output}_{na}_specific", vmin, vmax) + plotDiffAggDomains(f"{output}_{nb}_specific_{na}_aggDomains.npz", + f"{output}_{nb}_specific_{nb}_aggDomains.npz", tota, + totb, na, nb, f"{output}_{nb}_specific", vmin, vmax) + + #step 6 annotate the domains + print("Step 4: Annotating specific domains.") + genes = readGenes(gtf) + anoBins(data, na, nb, ra, genes, f"{output}_{na}_specificDomains") + anoBins(data, na, nb, rb, genes, f"{output}_{nb}_specificDomains") + + print("Finished") + + +def main(): + op = help() + compareDom(op.domf, op.da, op.db, op.na, op.nb, op.gtf, op.output, op.pcut, + op.cpu, op.xlim, op.ylim, op.vmin, op.vmax) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getBedpeFBed.py b/build/scripts-3.10/getBedpeFBed.py new file mode 100755 index 00000000..65627aef --- /dev/null +++ b/build/scripts-3.10/getBedpeFBed.py @@ -0,0 +1,110 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8-- +""" +getBedpeFBed.py +Transfering single-end BED file to paired-end BEDPE file as input of cLoops2 . +""" +#systematic library +import os, time, gzip, argparse, sys +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library + +#cLoops2 +from cLoops2.ds import PET +from cLoops2.utils import cFlush + + +def help(): + description = """ + Transfering single-end BED file to paired-end BEDPE file as input of + cLoops2 for furthur analysis. + The 6th column of the BED file of strand information is used to extend + the fragments. + If no strand information available, default treat it as + strand + Example: + getBedpeFBed.py -f a.bed.gz -o a + """ + + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + '-f', + dest="fin", + required=True, + type=str, + help= + "Input bed files, or .bed.gz files. " + ) + parser.add_argument('-o', + dest="out", + required=True, + type=str, + help="Output file prefix.") + parser.add_argument( + '-ext', + dest="ext", + required=False, + default=150, + type=int, + help= + "The expect fragment length of the bed file to extend from 5' to 3', default is 150." + ) + + op = parser.parse_args() + return op + + +def bed2bedpe(fin, fout, ext=150): + """ + Extend the BED file to BEDPE file according to expected fragment size. + """ + if fin.endswith(".gz"): + fino = gzip.open(fin, "rt") + else: + fino = open(fin) + if fout.endswith(".gz"): + fo = gzip.open(fout, "wt") + else: + fo = open(fout, "w") + for i, line in enumerate(fino): + if i % 10000 == 0: + cFlush("%s read from %s" % (i,fin)) + line = line.split("\n")[0].split('\t') + if len(line) < 6: #no strand information + nline = [ + line[0], line[1], line[2], line[0], + int(line[1]) + ext, + int(line[2]) + ext, ".", "44", "+", "-" + ] + elif line[5] == "+": + nline = [ + line[0], line[1], line[2], line[0], + int(line[1]) + ext, + int(line[2]) + ext, ".", "44", "+", "-" + ] + else: + nline = [ + line[0], + max(0, int(line[1])), + max(0, + int(line[2]) - ext), line[0], line[1], line[2], ".", "44", + "+", "-" + ] + nline = "\t".join(list(map(str, nline))) + "\n" + fo.write(nline) + fino.close() + fo.close() + + +def main(): + op = help() + bed2bedpe(op.fin, op.out+".bedpe.gz", ext=op.ext) + + +if __name__ == "__main__": + start_time = datetime.now() + main() + usedtime = datetime.now() - start_time + sys.stderr.write("Process finished. Used CPU time: %s Bye!\n" % usedtime) diff --git a/build/scripts-3.10/getDI.py b/build/scripts-3.10/getDI.py new file mode 100755 index 00000000..883c3f82 --- /dev/null +++ b/build/scripts-3.10/getDI.py @@ -0,0 +1,143 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getDI.py +Calculating the Directionality Index according to the paper of Topological Domains in Mammalian Genomes Identified by Analysis of Chromatin Interactions +DI = (B-A) / (|B-A|) * ( (A-E)**2 + (B-E)**2 ) / E +E = (A+B)/2 +""" +__date__ = "2019-09-11" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os, argparse +from glob import glob +from collections import Counter +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm + +#cLoops2 +from cLoops2.ds import XY +from cLoops2.io import parseIxy +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Caculate the Directionality Index for a specific region. + The output .bdg is the bedGraph result for the regions with Directionality Index. + DI is defined as accroding to the formula in following paper: + Topological Domains in Mammalian Genomes Identified by Analysis of Chromatin Interactions + Example: + getDI.py -f GM12878_Trac/chr21-chr21.ixy -o GM12878_Trac_chr21 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-f", + dest="fixy", + required=True, + type=str, + help= + "Input .ixy file generated by cLoops2 to caculate insulation score.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-start", + dest="start", + required=False, + default=-1, + type=int, + help= + "Start genomic coordinate for the target region, default is the minmial corrdinate found in the file." + ) + parser.add_argument( + "-end", + dest="end", + required=False, + default=-1, + type=int, + help= + "End genomic coordinate for the target region, default is the maxmial corrdinate found in the file." + ) + parser.add_argument( + "-bs", + dest="binSize", + required=False, + default=5000, + type=int, + help="Bin size (bp) to generate the contact matrix, default is 5000 bp." + ) + parser.add_argument( + "-s", + dest="step", + required=False, + default=100000, + type=int, + help= + "The upstream and downstream extension to caculate insulaiton score, default is 100000 bp." + ) + op = parser.parse_args() + return op + + +def calcDI(f, fout, start=-1, end=-1, bs=10000, step=100000): + """ + Calculation of insulation score, output as .bedGraph file. + """ + print("loading %s" % f) + key, mat = parseIxy(f, cut=0) + xy = XY(mat[:, 0], mat[:, 1]) + if key[0] != key[1]: + print( + "DI can be only caculated for intra-chromosomal interactions. Return." + ) + return + if start == -1: + start = np.min(xy.xs) + step + if end == -1: + end = np.max(xy.ys) - step + bins = int((end - start) / bs) + print("caculating from %s to %s of %s bins" % (start, end, bins)) + ds = [] + ss = [] + with open(fout + ".bdg", "w") as fo: + for i in tqdm(range(bins)): + x = start + i * bs + a = len(xy.queryPeakBoth(x - step, x)) + b = len(xy.queryPeakBoth(x, x + step)) + e = (a + b) / 2 + if e == 0: + continue + if a == b: + di = 0 + else: + di = (b - a) / np.abs(b - a) * ((a - e)**2 + (b - e)**2) / e + line = [key[0], x, x + bs, di] + fo.write("\t".join(list(map(str, line))) + "\n") + + +def main(): + op = help() + calcDI(op.fixy, + op.output, + start=op.start, + end=op.end, + bs=op.binSize, + step=op.step) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getFRiF.py b/build/scripts-3.10/getFRiF.py new file mode 100755 index 00000000..bba3c8b6 --- /dev/null +++ b/build/scripts-3.10/getFRiF.py @@ -0,0 +1,207 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getFRiF.py +Get the fraction of PETs in target features. +""" +__date__ = "2020-01-09" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os, argparse, json +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from joblib import Parallel, delayed + +#cLoops +from cLoops2.ds import XY, Loop +from cLoops2.io import parseIxy, parseTxt2Loops +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Get the fractrion of reads in target features such as domains + and peaks annotated with .bed file or domains/stripes/loops with + .txt file such as the _loop.txt file. + + getFRiF.py -d GM12878_Trac -b tad.bed + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument("-d", + dest="predir", + required=True, + type=str, + help="Directory for cLoops2 pre generated.") + parser.add_argument( + "-b", + dest="bed", + required=False, + default="", + type=str, + help="The .bed annotated the features such peaks/domains.") + parser.add_argument("-l", + dest="floop", + required=False, + type=str, + default="", + help="The _loop.txt .file generated by cLoops2.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-single", + dest="single", + required=False, + default=False, + action="store_true", + help= + "Whether to treat paired-end as single when check the location in -bed features, default is False, which means the two ends has to be in the same target regions, then it counts one. Set this when -bed features are peaks." + ) + + parser.add_argument( + "-cut", + dest="cut", + type=int, + default=0, + help= + "Distance cutoff for PETs to filter, default is 0. Can be set as the estimated self-ligation distance cutoff." + ) + parser.add_argument('-p', + dest="cpu", + required=False, + default=1, + type=int, + help="Number of CPUs to run the job, default is 1.") + op = parser.parse_args() + return op + + +def get1DFRiF(key, fixy, peaks, cut=0, single=False): + """ + Get reads ratio within 1D peaks/domains. + """ + key2, mat = parseIxy(fixy, cut=cut) + if mat.shape[0] == 0: + print( + "No PETs found in %s maybe due to distance cutoff for PET > %s." % + (fixy, cut)) + xy = XY(mat[:, 0], mat[:, 1]) + if single: + print("Getting the single end tags target %s 1d features from %s." % + (len(peaks), key)) + else: + print("Getting the paired end tags target %s 1d features from %s." % + (len(peaks), key)) + ns = 0 + for peak in tqdm(peaks): + if single: + ns += len(xy.queryPeak(peak[1], peak[2])) + else: + ns += len(xy.queryPeakBoth(peak[1], peaks[2])) + if single: + print("%s: total %s single end tags, %s (%.3f) in target." % + (key, mat.shape[0] * 2, ns, float(ns) / mat.shape[0] / 2)) + else: + print("%s: total %s paired end tags, %s (%.3f) in target." % + (key, mat.shape[0], ns, float(ns) / mat.shape[0])) + return ns + + +def get2DFRiF(key, fixy, loops, cut=0): + """ + Get reads ratio within 2D loops/domains. + """ + key2, mat = parseIxy(fixy, cut=cut) + if mat.shape[0] == 0: + print( + "No PETs found in %s maybe due to distance cutoff for PET > %s." % + (fixy, cut)) + xy = XY(mat[:, 0], mat[:, 1]) + ns = 0 + for loop in tqdm(loops): + ns += len( + xy.queryLoop(loop.x_start, loop.x_end, loop.y_start, + loop.y_end)[-1]) + print("%s: total %s paired end tags, %s (%.3f) in target." % + (key, mat.shape[0], ns, float(ns) / mat.shape[0])) + return ns + + +def main(): + op = help() + if op.bed == "" and op.floop == "": + print("No 1D or 2D features assigned as input, return.") + return + metaf = op.predir + "/petMeta.json" + meta = json.loads(open(metaf).read()) + keys = list(meta["data"]["cis"].keys()) + keys.extend(list(meta["data"]["trans"].keys())) + if op.bed != "" and os.path.exists(op.bed): + peaks = {} + for line in open(op.bed): + line = line.split("\n")[0].split("\t") + if len(line) < 3: + continue + key = line[0] + "-" + line[0] + if key not in peaks: + peaks[key] = [] + line[1] = int(line[1]) + line[2] = int(line[2]) + peaks[key].append(line) + ds = Parallel(n_jobs=op.cpu,backend="multiprocessing")(delayed(get1DFRiF)( + key, + meta["data"]["cis"][key]["ixy"], + peaks[key], + cut=op.cut, + single=op.single, + ) for key in keys if key in peaks) + #ds = [d[0] for d in ds] + s = np.sum(ds) + t = meta["Unique PETs"] + if op.single: + t = t * 2 + ds = { + "total": t, + "inTraget": s, + "ratio": float(s) / t, + "single": op.single + } + ds = pd.Series(ds) + ds.to_csv(op.output + "_1d_FRiF.txt", sep="\t") + + if op.floop != "" and os.path.exists(op.floop): + loops = parseTxt2Loops(op.floop) + ds = Parallel(n_jobs=op.cpu,backend="multiprocessing")(delayed(get2DFRiF)( + key, + meta["data"]["cis"][key]["ixy"], + loops[key], + cut=op.cut, + ) for key in keys if key in loops) + #ds = [d[0] for d in ds] + s = np.sum(ds) + t = meta["Unique PETs"] + ds = { + "total": t, + "inTraget": s, + "ratio": float(s) / t, + } + ds = pd.Series(ds) + ds.to_csv(op.output + "_2d_FRiF.txt", sep="\t") + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getIS.py b/build/scripts-3.10/getIS.py new file mode 100755 index 00000000..6e638d74 --- /dev/null +++ b/build/scripts-3.10/getIS.py @@ -0,0 +1,170 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getIS.py +cLoops2 calcIS.py caculation the insulation score according to https://www.nature.com/articles/nature20158 +X(x,s) = number of contacts between any pair of elements in the interval (x − s, x + s ) + +#X(x,s) = - log2{(X(x,s) − X(x + s/2,s/2) − X(x − s/2, s/2))/X(x,s)/0.5} +modified as X(x,s) = (X(x,s) − X(x + s/2,s/2) − X(x − s/2, s/2))/(X(x+s/2,s/2)+X(x-s/2,s/2) +directly compare the spanning and independent reads + +""" +__date__ = "2019-09-11" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os, argparse +from glob import glob +from collections import Counter +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm + +#cLoops2 +from cLoops2.ds import XY +from cLoops2.io import parseIxy +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Caculate the insulation score for a specific region. + The output .bdg is the bedGraph result for the regions with insulation score. + IS is defined as accroding to the formula in following paper: + Capturing pairwise and multi-way chromosomal conformations using chromosomal walks + + Example: + getIS.py -f GM12878_Trac/chr21-chr21.ixy -o GM12878_Trac_chr21 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-f", + dest="fixy", + required=True, + type=str, + help= + "Input .ixy file generated by cLoops2 to caculate insulation score.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-start", + dest="start", + required=False, + default=-1, + type=int, + help= + "Start genomic coordinate for the target region, default is the minmial corrdinate found in the file." + ) + parser.add_argument( + "-end", + dest="end", + required=False, + default=-1, + type=int, + help= + "End genomic coordinate for the target region, default is the maxmial corrdinate found in the file." + ) + parser.add_argument( + "-bs", + dest="binSize", + required=False, + default=5000, + type=int, + help="Bin size (bp) to generate the contact matrix, default is 5000 bp." + ) + parser.add_argument( + "-s", + dest="step", + required=False, + default=100000, + type=int, + help= + "The upstream and downstream extension to caculate insulaiton score, default is 100000 bp." + ) + parser.add_argument( + "-cut", + dest="cut", + type=int, + default=0, + help="PETs with distance > cut will be kept, default is 0.") + parser.add_argument( + "-mcut", + dest="mcut", + type=int, + default=-1, + help="PETs with distance < mcut will be kept, default is -1 no limit.") + op = parser.parse_args() + return op + + +def calcIS(f, fout, start=-1, end=-1, bs=10000, step=100000,cut=0,mcut=-1): + """ + Calculation of insulation score, output as .bedGraph file. + """ + print("loading %s" % f) + key, mat = parseIxy(f, cut=cut,mcut=mcut) + xy = XY(mat[:, 0], mat[:, 1]) + if key[0] != key[1]: + print( + "IS can be only caculated for intra-chromosomal interactions. Return." + ) + return + if start == -1: + start = np.min(xy.xs) + step + if end == -1: + end = np.max(xy.ys) - step + bins = int((end - start) / bs) + print("caculating from %s to %s of %s bins" % (start, end, bins)) + ss = [] + ds = [] + for i in tqdm(range(bins)): + x = start + i * bs + xc = len(xy.queryPeakBoth(x - step, x + step)) + if xc == 0: + continue + xcright = len(xy.queryPeakBoth(x, x + step)) + xcleft = len(xy.queryPeakBoth(x - step, x)) + if xcright + xcleft == 0: + continue + xcbridge = xc - xcright - xcleft + s = xcbridge / (xcright + xcleft) + line = [key[0], x, x + bs, s] + ds.append( line ) + ss.append( s ) + ss = np.array(ss) + ss = (ss - np.mean(ss))/np.std(ss) + for i in range(len(ds)): + ds[i][-1] = ss[i] + with open(fout + ".bdg", "w") as fo: + for line in ds: + fo.write("\t".join(list(map(str, line))) + "\n") + + +def main(): + op = help() + calcIS(op.fixy, + op.output, + start=op.start, + end=op.end, + bs=op.binSize, + step=op.step, + cut=op.cut, + mcut=op.mcut, + ) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getIntDensity.py b/build/scripts-3.10/getIntDensity.py new file mode 100755 index 00000000..a8d039c1 --- /dev/null +++ b/build/scripts-3.10/getIntDensity.py @@ -0,0 +1,152 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getIntDensity.py +Get the interaction density for a region. +""" + +__date__ = "2019-10-08" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os +import sys +import json +import argparse +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from joblib import Parallel, delayed +from scipy.stats import hypergeom, binom, poisson + +#cLoops2 +from cLoops2.ds import XY +from cLoops2.io import parseTxt2Loops, ixy2pet +from cLoops2.callCisLoops import getPerRegions, estAnchorSig +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script of getAggLoopsPlot.py. + """ + description = """ + Get the interaction density for regions. + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument("-d", + dest="predir", + required=True, + type=str, + help="Directory for cLoops2 pre generated.") + parser.add_argument( + "-b", + dest="fbed", + required=True, + type=str, + help= + "The .bed file which contains regions to get the interaction density.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-pcut", + dest="pcut", + type=int, + default=0, + help= + "Distance cutoff for PETs to filter, default is 0. Can be set as the estimated self-ligation distance cutoff." + ) + parser.add_argument('-p', + dest="cpu", + required=False, + default=1, + type=int, + help="Number of CPUs to run the job, default is 1.") + op = parser.parse_args() + return op + + +def quantifyRegions(key, rs, fixy, pcut=0, pseudo=1): + """ + @param key: str, such as chr21-chr21 + @param loops: list of Loop object + @param fixy: cLoops2 pre generated .ixy file + """ + print("%s\t quantify interaction density of %s regions in %s." % + (datetime.now(), len(rs), key)) + xy = ixy2pet(fixy, cut=pcut) + N = xy.number + ds = {} + for r in tqdm(rs): + local = xy.queryPeakBoth(int(r[1]), int(r[2])) + a = xy.queryPeak(int(r[1]), int(r[2])) + distal = a.difference(local) + ds["|".join(r)] = { + "chrom": + r[0], + "start": + r[1], + "end": + r[2], + "name": + r[3], + "allPETs": + len(local) * 2 + len(distal), + "localPETs": + len(local) * 2, + "distalPETs": + len(distal), + "allRPKM": (len(local) * 2 + len(distal)) / + (int(r[2]) - int(r[1])) / N / 2 * 10**9, + "localRPKM": + len(local) * 2 / (int(r[2]) - int(r[1])) / N / 2 * 10**9, + "distalRPKM": + len(distal) * 2 / (int(r[2]) - int(r[1])) / N / 2 * 10**9, + } + return ds + + +def parseBed(f): + regions = {} + for line in open(f): + line = line.split("\n")[0].split("\t") + key = line[0] + "-" + line[0] + if key not in regions: + regions[key] = [] + regions[key].append(line) + return regions + + +def main(): + op = help() + regions = parseBed(op.fbed) + metaf = op.predir + "/petMeta.json" + meta = json.loads(open(metaf).read()) + keys = list(meta["data"]["cis"].keys()) + keys = list(set(keys).intersection(set(regions.keys()))) + ds = Parallel(n_jobs=op.cpu,backend="multiprocessing")(delayed(quantifyRegions)( + key, + regions[key], + meta["data"]["cis"][key]["ixy"], + pcut=op.pcut, + ) for key in keys) + data = {} + for d in ds: + for k, v in d.items(): + data[k] = v + data = pd.DataFrame(data).T + data.to_csv(op.output + "_quant.txt", sep="\t", index_label="rid") + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getLocalIDS.py b/build/scripts-3.10/getLocalIDS.py new file mode 100755 index 00000000..a7e767df --- /dev/null +++ b/build/scripts-3.10/getLocalIDS.py @@ -0,0 +1,153 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getLocalIDS.py +Caculate the interaction density score with small window size as 1kb. + + +""" +__date__ = "2019-09-12" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os +import argparse +from glob import glob +from collections import Counter +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm + +#cLoops2 +from cLoops2.ds import XY +from cLoops2.io import parseIxy +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script of calcLocalIDS.py + """ + description = """ + Caculate the interaction density score for a specific regions. + The output .bdg is the bedGraph result for the regions with insulation score. + Example: + getLocalIDS.py -f GM12878_Trac/chr21-chr21.ixy -o GM12878_Trac_chr21 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-f", + dest="fixy", + required=True, + type=str, + help= + "Input .ixy file generated by cLoops2 to caculate insulation score.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-start", + dest="start", + required=False, + default=-1, + type=int, + help= + "Start genomic coordinate for the target region, default is the minmial corrdinate found in the file." + ) + parser.add_argument( + "-end", + dest="end", + required=False, + default=-1, + type=int, + help= + "End genomic coordinate for the target region, default is the maxmial corrdinate found in the file." + ) + parser.add_argument( + "-bs", + dest="binSize", + required=False, + default=1000, + type=int, + help="Bin size (bp) to generate the contact matrix, default is 1000 bp." + ) + parser.add_argument( + "-ext", + dest="ext", + required=False, + default=10, + type=int, + help= + "The extension fold of the target region to show the interactions around. Default is 10." + ) + parser.add_argument( + "-cut", + dest="cut", + required=False, + default=0, + type=int, + help= + "Filtering PETs with distance < cut. Default is 0 without filtering.") + + op = parser.parse_args() + return op + + +def calcIDS(f, fout, start=-1, end=-1, bs=1000, ext=10, cut=0): + """ + Caculate the interaction density score for a region. + """ + print("loading %s" % f) + key, mat = parseIxy(f, cut=cut) + xy = XY(mat[:, 0], mat[:, 1]) + if key[0] != key[1]: + print( + "IS can be only caculated for intra-chromosomal interactions. Return." + ) + return + if start == -1: + start = np.min(xy.xs) + bs * ext / 2 + if end == -1: + end = np.max(xy.ys) - bs * ext / 2 + bins = int((end - start) / bs) + + print("caculating from %s to %s of %s bins" % (start, end, bins)) + with open(fout + "_ids.bdg", "w") as fo: + for i in tqdm(range(bins)): + x = start + i * bs + y = start + (i + 1) * bs + r = 0 + for j in range(int(-ext / 2), int(ext / 2 + 1)): + if j == 0: + continue + s = x + j * bs + e = y + j * bs + ra, rb, rab = xy.queryLoop(x, y, s, e) + #print(x,y,s,e,rab) + r += len(rab) + r = r / xy.number * 10**6 + line = [key[0], x, y, r] + fo.write("\t".join(list(map(str, line))) + "\n") + + +def main(): + op = help() + calcIDS(op.fixy, + op.output, + start=op.start, + end=op.end, + bs=op.binSize, + ext=op.ext, + cut=op.cut) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getPETsAno.py b/build/scripts-3.10/getPETsAno.py new file mode 100755 index 00000000..ba5a63b8 --- /dev/null +++ b/build/scripts-3.10/getPETsAno.py @@ -0,0 +1,194 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getPETsAno.py +Get the annotation of PETs for enhancer/promoter and plot the stats. +""" + +__date__ = "2019-10-11" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os +import sys +import json +import argparse +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from joblib import Parallel, delayed + +#cLoops2 +from cLoops2.ds import XY +from cLoops2.io import parseIxy +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Get the annotations of PETs located for enhancer-promoter, enhancer-enhancer, + promoter-promoter inteaction ratios. + Example: + getPETsAno.py -d GM12878_Trac -e enhancer.bed -p promoter.bed -cut 10000 -o GM12878_Trac_PETs_ano + """ + parser = argparse.ArgumentParser(description=description) + #formatter_class=RawTextHelpFormatter) + parser.add_argument("-d", + dest="predir", + required=True, + type=str, + help="Directory for cLoops2 pre generated.") + parser.add_argument("-enhancer", + dest="fe", + required=True, + type=str, + help="The enhancer annotation bed file.") + parser.add_argument("-promoter", + dest="fp", + required=True, + type=str, + help="The enhancer annotation bed file.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument("-p", + dest="cpu", + required=False, + type=int, + default=1, + help="Number of CPU to run the job. Default is 1.") + parser.add_argument( + "-pcut", + dest="pcut", + type=int, + default=0, + help= + "Distance cutoff for PETs to filter, default is 0. Can be set as the estimated self-ligation distance cutoff. " + ) + op = parser.parse_args() + return op + + +def buildFeature(f): + """ + For the features in bed file, map to genomic location easy for access. + For the genomic region, if has feature, it will be shown as True. + """ + print("%s\tBuilding coverage features of %s." % (datetime.now(), f)) + cov = {} + for line in open(f): + line = line.split("\n")[0].split("\t") + if len(line) < 3: + continue + chrom = line[0] + start = int(line[1]) + end = int(line[2]) + if chrom not in cov: + cov[chrom] = set() + #if len( cov[chrom] ) < end: + # cov[chrom].extend( [False] * (end-len(cov[chrom])+1)) + #for i in range( start,end): + # cov[chrom][i] = True + cov[chrom].update(range(start, end)) + return cov + + +def findFeature(cov, chrom, start, end): + """ + Judge if the target region overlap with features. + """ + if chrom not in cov: + return False + for t in range(start, end): + if t in cov[chrom]: + return True + return False + + +def annotatePETs(key, fixy, ecov, pcov, cut=0, ext=50): + """ + Annotate the PETs to enhancer, promoter or Other. + """ + print("%s\tAnnotating PETs for %s with cut > %s." % + (datetime.now(), key, cut)) + ep = 0 #enhancer promoter + ee = 0 #enhancer enhancer + pp = 0 #promoter promoter + en = 0 #enhancer none + pn = 0 #promoter none + nn = 0 #none none + key2, mat = parseIxy(fixy, cut=cut) + if key2[0] not in ecov and key2[0] not in pcov and key2[ + 1] not in ecov and key2[1] not in pcov: + return None + for x, y in tqdm(mat): + fae = findFeature(ecov, key2[0], x - ext, x + ext) + fap = findFeature(pcov, key2[0], x - ext, x + ext) + fbe = findFeature(ecov, key2[1], y - ext, y + ext) + fbp = findFeature(pcov, key2[1], y - ext, y + ext) + if fae == True and fbp == True: + ep += 1 + elif fap == True and fbe == True: + ep += 1 + elif fae == True and fbe == True: + ee += 1 + elif fap == True and fbp == True: + pp += 1 + elif fae == True and fbe == False and fbp == False: + en += 1 + elif fbe == True and fae == False and fap == False: + en += 1 + elif fap == True and fbe == False and fbp == False: + pn += 1 + elif fbp == True and fae == False and fap == False: + pn += 1 + else: + nn += 1 + ss = { + "Enhancer-Promoter": ep, + "Enhancer-Enhancer": ee, + "Promoter-Promoter": pp, + "Enhancer-Other": en, + "Promoter-Other": pn, + "Other-Other": nn, + } + return ss + + +def main(): + op = help() + metaf = op.predir + "/petMeta.json" + meta = json.loads(open(metaf).read()) + ecov = buildFeature(op.fe) + pcov = buildFeature(op.fp) + keys = list(meta["data"]["cis"].keys()) + ds = Parallel(n_jobs=1,backend="multiprocessing")(delayed(annotatePETs)( + #ds = Parallel(n_jobs=op.cpu,backend="multiprocessing")(delayed(annotatePETs)( + key, meta["data"]["cis"][key]["ixy"], ecov, pcov, cut=op.pcut) + for key in keys) + ss = {} + for d in ds: + if d is None: + continue + for k, v in d.items(): + if k not in ss: + ss[k] = v + else: + ss[k] += v + ss = pd.Series(ss) + ss.to_csv("%s_PETs_anos.txt" % op.output, sep="\t") + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getSS.py b/build/scripts-3.10/getSS.py new file mode 100755 index 00000000..e44ba9c9 --- /dev/null +++ b/build/scripts-3.10/getSS.py @@ -0,0 +1,155 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getSS.py +cLoops2 getSS.py caculation the segregation score for domain-centric analysis. + +""" +__date__ = "2022-10-17" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os, argparse +from glob import glob +from collections import Counter +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from joblib import Parallel, delayed + +#cLoops2 +from cLoops2.ds import XY,Domain +from cLoops2.io import parseIxy, doms2txt, doms2bed +from cLoops2.cmat import getObsMat, xy2dict, dict2mat +from cLoops2.settings import * + + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Caculate the segregation score for a specific region. + The output .bdg is the bedGraph result for the regions with segregation score. + + Example: + getSS.py -f GM12878_Trac/chr21-chr21.ixy -o GM12878_Trac_chr21 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-f", + dest="fixy", + required=True, + type=str, + help= + "Input .ixy file generated by cLoops2 to caculate segregation score.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-bs", + dest="binSize", + required=False, + default=1000, + type=int, + help="Bin size (bp) to generate the contact matrix, default is 1000 bp." + ) + parser.add_argument( + "-ws", + dest="winSize", + required=False, + default=50000, + type=int, + help= + "The half of the sliding window size used to caculate local correlation, default is 50000 (50kb)." + ) + parser.add_argument( + "-cut", + dest="cut", + type=int, + default=0, + help="PETs with distance > cut will be kept, default is 0.") + parser.add_argument( + "-mcut", + dest="mcut", + type=int, + default=-1, + help="PETs with distance < mcut will be kept, default is -1 no limit.") + op = parser.parse_args() + return op + + + +def calcSS(f, fout, bs=20000, winSize=500000, cut=0,mcut=-1): + """ + Calculation of segregation score, output as .bedGraph file. + @param bs: bin size + @param winSize: sliding matrix width half size + @param cut: distance cutoff for PETs + """ + key, mat = parseIxy(f, cut=cut,mcut=mcut) + matstart = np.min(mat) + matend = np.max(mat) + start = matstart + winSize + end = matend - winSize + bins = int((end - start) / bs) + #convert to sparse contact matrix + mat = xy2dict(mat, s=matstart, e=matend, r=bs) + mat = dict2mat(mat) + print( + "caculating from %s to %s of %s bins for segregation score with bin size of %s and window size of %s" + % (start, end, bins, bs,winSize)) + rs = [] + ss = [] + for i in tqdm(range(bins)): + x = start + i * bs + s = x - winSize + e = x + winSize + #releative position in contact matrix + s = int( (s - matstart)/bs ) + e = int( (e - matstart)/bs ) +1 + nmat = mat[s:e,s:e].toarray() + #previous + #nmat = getObsMat(mat, s, e, bs) + nmat = np.log2(nmat + 1) + nmat = np.corrcoef(nmat) + nmat = np.nan_to_num(nmat) + nmat = nmat[int(nmat.shape[0] / 2) + 1:, :int(nmat.shape[1] / 2)] + nmat[nmat < 0] = 0 + s = nmat.mean() + ss.append(s) + r = [key[0], x, x + bs] + rs.append(r) + ss = np.array(ss) + ss = (ss - np.mean(ss))/np.std(ss) + for i, r in enumerate(rs): + r.append(ss[i]) + with open(fout +"_SS.bdg", "w") as fo: + for r in rs: + fo.write("\t".join(list(map(str, r))) + "\n") + + + + +def main(): + op = help() + calcSS(op.fixy, + op.output, + bs=op.binSize, + winSize=op.winSize, + cut=op.cut, + mcut=op.mcut, + ) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getSigDist.py b/build/scripts-3.10/getSigDist.py new file mode 100755 index 00000000..9334e3ba --- /dev/null +++ b/build/scripts-3.10/getSigDist.py @@ -0,0 +1,223 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getSigDist.py +check interaction signal distribution. +""" +__date__ = "2020-01-08" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os +import argparse +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from joblib import Parallel, delayed + +#cLoops +from cLoops2.io import parseIxy +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface. + """ + description = """ + Get the observed/expected interaction signal distribution in contact matrix. + Example: + getSigDist.py -d GM12878_Trac -o GM12878_Trac -cut 0 -p 10 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument("-d", + dest="dir", + required=True, + type=str, + help="Directory for cLoops2 pre generated.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-c", + dest="chroms", + required=False, + default="", + type=str, + help= + "Whether to process limited chroms, specify it as chr1,chr2,chr3, default is not. Use this to save time for quite big data." + ) + parser.add_argument( + "-bs", + dest="binSize", + required=False, + default=1000, + type=int, + help= + "Bin size (bp) to generate the contact matrix for estimation, default is 1000 bp." + ) + parser.add_argument( + "-cut", + dest="cut", + type=int, + default=0, + help="Distance cutoff for PETs to filter, default is 0.") + parser.add_argument('-p', + dest="cpu", + required=False, + default=1, + type=int, + help="Number of CPUs to run the job, default is 1.") + parser.add_argument( + '-r', + dest="repeats", + required=False, + default=0, + type=int, + help= + "The reapet times to shuffle PETs to get the mean expected background,default is 0, set larger than 1 to get the expected result." + ) + parser.add_argument('-plot', + dest="plot", + required=False, + action="store_true", + help="Set to plot the result.") + parser.add_argument( + '-log', + dest="log", + required=False, + action="store_true", + help= + "Whether log transform the PETs in bins for plotting, set to transform." + ) + op = parser.parse_args() + return op + + +def getObsPETs(mat, binSize=1000): + """ + Get the number of PETs in bins. + @param mat: [[x,y]] + @param binSize:int, contact matrix bin size + """ + minC = np.min(mat) + a = (mat[:, 0] - minC) / binSize + b = (mat[:, 1] - minC) / binSize + a = a.astype(int) + b = b.astype(int) + ss = {} + for i in range(len(a)): + x = a[i] + y = b[i] + if x not in ss: + ss[x] = {} + if y not in ss[x]: + ss[x][y] = 0 + ss[x][y] += 1 + sso = [] + for x in ss.keys(): + for y in ss[x].keys(): + sso.append(ss[x][y]) + return sso + + +def preObs(f, cut=0, binSize=1000): + chrom, mat = parseIxy(f, cut=cut) + return getObsPETs(mat, binSize=binSize) + + +def preExp(f, cut=0, binSize=1000): + chrom, mat = parseIxy(f, cut=cut) + #shuffle data + a = mat[:, 0] + b = mat[:, 1] + np.random.shuffle(a) + np.random.shuffle(b) + mat[:, 0] = a + mat[:, 1] = b + return getObsPETs(mat, binSize=binSize) + + +def plotObsExpSigDist(so, fout, binSize=1000, cut=0, se=None, log=False): + """ + Plot the signal enrichment. + """ + if log: + so = np.log10(so) + if se is not None: + se = np.log10(se) + fig, ax = pylab.subplots() + sns.kdeplot(so, color=colors[0], label="observed", ax=ax) + if se is not None: + sns.kdeplot(se, color=colors[1], label="expected", ax=ax) + if log: + xlabel = "log10(PETs) in bins" + else: + xlabel = "PETs in bins" + ax.set_xlabel(xlabel) + ax.set_ylabel("density") + ax.legend(loc="upper left") + ax.set_title("%s resolution contact matrix with PETs distance > %s" % + (binSize, cut)) + pylab.savefig("%s.pdf" % (fout + "_sigDist")) + + +def main(): + op = help() + if op.chroms == "": + chroms = [] + else: + chroms = set(op.chroms.split(",")) + fs = glob("%s/*.ixy" % op.dir) + nfs = [] + for f in fs: + n = f.split("/")[-1].split(".ixy")[0].split("-") + if len(chroms) == 0: + nfs.append(f) + if len(chroms) > 0 and n[0] in chroms and n[1] in chroms: + nfs.append(f) + fs = nfs + + print("%s \t Getting the observed signal distribution for %s." % + (datetime.now(), op.dir)) + ds = Parallel(n_jobs=op.cpu,backend="multiprocessing")( + delayed(preObs)(f, cut=op.cut, binSize=op.binSize) for f in tqdm(fs)) + ds = np.concatenate(ds) + with open(op.output + "_obs_sigDis.txt", "w") as fo: + fo.write(",".join(list(map(str, ds))) + "\n") + if op.repeats > 0: + print("%s \t Getting the expected signal distribution for %s." % + (datetime.now(), op.dir)) + for i in tqdm(range(op.repeats)): + eds = Parallel(n_jobs=op.cpu,backend="multiprocessing")( + delayed(preExp)(f, cut=op.cut, binSize=op.binSize) for f in fs) + eds = list(np.concatenate(eds)) + if i == 0: + nnp = eds + else: + nnp.extend(eds) + with open(op.output + "_exp_sigDis.txt", "w") as fo: + fo.write(",".join(list(map(str, nnp))) + "\n") + else: + nnp = None + + if op.plot: + plotObsExpSigDist(ds, + op.output, + binSize=op.binSize, + cut=op.cut, + se=nnp, + log=op.log) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/getSigEnrich.py b/build/scripts-3.10/getSigEnrich.py new file mode 100755 index 00000000..57d2d007 --- /dev/null +++ b/build/scripts-3.10/getSigEnrich.py @@ -0,0 +1,236 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +getSigEnrich.py +Get the enrichment of interaction signals, just like the fingerprint plot for the ChIP-seq. +""" +__date__ = "2019-08-26" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os +import sys +import argparse +from glob import glob +from collections import Counter +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from joblib import Parallel, delayed + +#cLoops2 +from cLoops2.io import parseIxy +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface for the script of estSigEnrich.py. + """ + description = """ + Get the observed and expected enrichment trend plot based on contact matrix. + Example: + getSigEnrich.py -d GM12878_Trac -o GM12878_Trac -cut 0 -p 10 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument("-d", + dest="dir", + required=True, + type=str, + help="Directory for cLoops2 pre generated.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-c", + dest="chroms", + required=False, + default="", + type=str, + help= + "Whether to process limited chroms, specify it as chr1,chr2,chr3, default is not. Use this to save time for quite big data." + ) + parser.add_argument( + "-bs", + dest="binSize", + required=False, + default=5000, + type=int, + help= + "Bin size (bp) to generate the contact matrix for estimation, default is 5000 bp." + ) + parser.add_argument( + "-cut", + dest="cut", + type=int, + default=0, + help="Distance cutoff for PETs to filter, default is 0.") + parser.add_argument('-p', + dest="cpu", + required=False, + default=1, + type=int, + help="Number of CPUs to run the job, default is 1.") + parser.add_argument( + '-r', + dest="repeats", + required=False, + default=10, + type=int, + help= + "The reapet times to shuffle PETs to get the mean expected background,default is 10." + ) + parser.add_argument('-plot', + dest="plot", + required=False, + action="store_true", + help="Set to plot the result.") + op = parser.parse_args() + return op + + +def getObsPETs(mat, binSize=5000): + """ + Get the number of PETs in bins. + @param mat: [[x,y]] + @param binSize:int, contact matrix bin size + """ + minC = np.min(mat) + a = (mat[:, 0] - minC) / binSize + b = (mat[:, 1] - minC) / binSize + a = a.astype(int) + b = b.astype(int) + ss = {} + for i in range(len(a)): + x = a[i] + y = b[i] + if x not in ss: + ss[x] = {} + if y not in ss[x]: + ss[x][y] = 0 + ss[x][y] += 1 + sso = [] + for x in ss.keys(): + for y in ss[x].keys(): + sso.append(ss[x][y]) + return sso + + +def getSortBins(ds, bins=100): + """ + Furthur bin the signal in contact matrix into bins, only care of the cumutative trend. + """ + #default is ascending sort + ds = np.sort(ds) + #bin the contacts into 100 bins for comparing signal enrichment between samples + nn = [] + step = int(len(ds) / bins) + for i in range(0, len(ds), step): + if i + step > len(ds): + break + nn.append(ds[i:i + step].sum()) + nn = np.array(nn) + nn = np.cumsum(nn) / float(nn.sum()) + return nn + + +def preObs(f, cut=0, binSize=5000): + chrom, mat = parseIxy(f, cut=cut) + return getObsPETs(mat, binSize=binSize) + + +def preExp(f, cut=0, binSize=5000): + chrom, mat = parseIxy(f, cut=cut) + #shuffle data + a = mat[:, 0] + b = mat[:, 1] + np.random.shuffle(a) + np.random.shuffle(b) + mat[:, 0] = a + mat[:, 1] = b + return getObsPETs(mat, binSize=binSize) + + +def plotObsExpSigEnrichment(f): + """ + Plot the signal enrichment. + """ + mat = pd.read_csv(f, sep="\t", index_col=0) + fig, ax = pylab.subplots() + ax.plot(mat.index, + mat["observed"] * 100, + color=colors[0], + label="observed") + ax.plot(mat.index, + mat["expected"] * 100, + color=colors[1], + label="expected") + ax.set_xlabel("Percentage of Bins") + ax.set_ylabel("Percetange of PETs") + ax.legend(loc="upper left") + #ax2 = ax.twinx() + #ax2.plot( mat.index, mat["Obs/Exp"],color=colors[2],label="Obs/Exp") + #ax2.set_ylabel("Obs/Exp") + #for t in ax2.get_yticklabels(): + # t.set_color(colors[2]) + pylab.savefig("%s.pdf" % (f.replace(".txt", ""))) + + +def main(): + op = help() + if op.chroms == "": + chroms = [] + else: + chroms = set(op.chroms.split(",")) + fs = glob("%s/*.ixy" % op.dir) + nfs = [] + for f in fs: + n = f.split("/")[-1].split(".ixy")[0].split("-") + if n[0] != n[1]: + continue + if len(chroms) == 0: + nfs.append(f) + if len(chroms) > 0 and n[0] in chroms and n[1] in chroms: + nfs.append(f) + fs = nfs + + print("%s \t Getting the observed enrichment trend for %s." % + (datetime.now(), op.dir)) + ds = Parallel(n_jobs=op.cpu,backend="multiprocessing")( + delayed(preObs)(f, cut=op.cut, binSize=op.binSize) for f in tqdm(fs)) + ds = np.concatenate(ds) + nn = getSortBins(ds) + del ds + + print("%s \t Getting the expected enrichment trend for %s." % + (datetime.now(), op.dir)) + for i in tqdm(range(op.repeats)): + ds = Parallel(n_jobs=op.cpu,backend="multiprocessing")( + delayed(preExp)(f, cut=op.cut, binSize=op.binSize) for f in fs) + ds = np.concatenate(ds) + nni = getSortBins(ds) + del ds + if i == 0: + nnp = nni + else: + nnp += nni + nnp = nnp / op.repeats + + ds = pd.DataFrame({"observed": nn, "expected": nni}) + #ds["Obs/Exp"] = ds["observed"]/ds["expected"] + ds.to_csv("%s_sigEnrich.txt" % op.output, sep="\t", index_label="bins") + + if op.plot: + plotObsExpSigEnrichment(op.output + "_sigEnrich.txt") + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/hicpro2bedpe.py b/build/scripts-3.10/hicpro2bedpe.py new file mode 100755 index 00000000..f3014ce8 --- /dev/null +++ b/build/scripts-3.10/hicpro2bedpe.py @@ -0,0 +1,105 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8-- +""" +hicpro2bedpe.py +Convert HiC-Pro output validate pairs to cLoops input bedpe file. +""" +#sys +import os +import re +import sys +import gzip +import argparse +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd + +#cLoops2 +from cLoops2.utils import cFlush + + +def help(): + description = """ + Convert HiC-Pro allValidParis to BEDPE file as input of cLoops2. + Example: + hicpro2bedpe.py -f test.allValidPairs -o test + """ + + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + '-f', + dest="fin", + required=True, + type=str, + help="HiC-Pro allValidPairs file, can be .allValidParis.gz. ") + parser.add_argument('-o', + dest="out", + required=True, + type=str, + help="Output file prefix.") + parser.add_argument('-ext', + dest="ext", + required=False, + type=int, + default=50, + help="Extension from center of read, default is 50. ") + op = parser.parse_args() + return op + + +def pairs2bedpe(f_hicpro, f_out,ext=50): + """ + Converting HiC-Pro output allValidPairs to bedpe file. + """ + with gzip.open(f_out, 'wt') as f_bedpe: + if f_hicpro.endswith('.gz'): + #f_pair = gzip.open(f_hicpro) #python2 + f_pair = gzip.open(f_hicpro, 'rt') #python3 + else: + f_pair = open(f_hicpro) + for i, line in enumerate(f_pair): + if i % 100000 == 0: + cFlush("%s PETs processed from %s" % (i, f_hicpro)) + line = line.strip().split('\t') + #if the position is middle of reads + #petA = [line[1], int(line[2])-ext, int(line[2])+ext] + #petB = [line[4], int(line[5])-ext, int(line[5])+ext] + #if the position is 5 end of reads + if line[3] == "+": + petA = [line[1], int(line[2]), int(line[2])+ext] + else: + petA = [line[1], int(line[2])-ext, int(line[2])] + if line[6] == "+": + petB = [line[4], int(line[5]), int(line[5])+ext] + else: + petB = [line[4], int(line[5])-ext, int(line[5])] + + newline = [ + petA[0], petA[1], petA[2], petB[0], petB[1], petB[2], line[0], + '.', line[3], line[6] + ] + f_bedpe.write("\t".join(map(str, newline)) + "\n") + f_pair.close() + + +def main(): + op = help() + if not os.path.isfile(op.fin): + sys.stderr.write("Error: input file %s not exists.\n" % op.fin) + return + bedpe_file = re.sub(r'_allValidPairs(.gz)?$', '', op.out) + bedpe_file = bedpe_file + '.bedpe.gz' + if os.path.isfile(op.out): + sys.stderr.write("Error: output file %s exists.\n" % bedpe_file) + return + pairs2bedpe(op.fin, bedpe_file,ext=op.ext) + + +if __name__ == '__main__': + start_time = datetime.now() + main() + usedtime = datetime.now() - start_time + sys.stderr.write("Process finished. Used CPU time: %s Bye!\n" % usedtime) diff --git a/build/scripts-3.10/juicerLong2bedpe.py b/build/scripts-3.10/juicerLong2bedpe.py new file mode 100755 index 00000000..6c148325 --- /dev/null +++ b/build/scripts-3.10/juicerLong2bedpe.py @@ -0,0 +1,75 @@ +#!/usr/bin/env pyhthon +#--coding:utf-8-- +""" +""" + +import argparse, gzip, os, sys +from datetime import datetime +from argparse import RawTextHelpFormatter + + + +def help(): + description = """ + Convert Juicer long format file to to BEDPE file as input of cLoops2. + Example: + juicerLong2bedpe.py -f test.allValidPairs -o test + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument('-f', + dest="fin", + type=str, + help="Input file name, required.") + parser.add_argument('-o', + dest="fout", + required=True, + type=str, + help="Output file name, required.") + op = parser.parse_args() + return op + + + +def long2bedpe(fin, fout, ext=50): + with open(fout, "w") as fo: + for line in open(fin): + if line.startswith("#"): + continue + line = line.split("\n")[0].split() + nline = [ + line[1], + max(0, + int(line[2]) - ext), + int(line[2]) + ext, #pet 1 + line[5], + max(0, + int(line[6]) - ext), + int(line[6]) + ext, #pet 2 + ".", + ".", + "+", + "+" #other infor + ] + if line[0] != "0": + nline[-2] = "-" + if line[4] != "0": + nline[-1] = "-" + fo.write("\t".join(list(map(str, nline))) + "\n") + + + +def main(): + op = help() + if not os.path.isfile(op.fin): + sys.stderr.write("Error: input file %s not exists!\n" % op.fin) + if os.path.isfile(op.fout): + sys.stderr.write("Error: output file %s exists! \n" % op.fout) + long2bedpe(op.fin, op.fout) + + +if __name__ == '__main__': + start_time = datetime.now() + main() + usedtime = datetime.now() - start_time + sys.stderr.write("Process finished. Used CPU time: %s Bye!\n" % usedtime) diff --git a/build/scripts-3.10/mergeDomains.py b/build/scripts-3.10/mergeDomains.py new file mode 100755 index 00000000..135fd9b6 --- /dev/null +++ b/build/scripts-3.10/mergeDomains.py @@ -0,0 +1,162 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +Merge domains from multiple results of different resolutions. +""" + +#sys +import os +import sys +import argparse +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library + +#cLoops2 +from cLoops2.ds import Domain +from cLoops2.io import doms2bed + + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Merge domains from multiple resolutions. + + Example: + mergeDomains.py -fs 5k_tad.bed,10k_tad.bed,25k_tad.bed -o all -r 0.9 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-fs", + dest="fins", + required=True, + type=str, + help= + "The domains in BED format from differnet resolutions to be merged.\n"\ + "BED files should be input with decreased resolutions, for example\n"\ + "5k.bed,10k.bed,25k.bed. Multiple files seperated by comma." + ) + parser.add_argument( + '-r', + dest="lrcut", + required=False, + type=float, + default=0.9, + help="Ratio of overlapped domains to be merged. Default is 0.9." + ) + parser.add_argument( + '-o', + dest="fout", + required=True, + type=str, + help="Output file name, required." + ) + op = parser.parse_args() + return op + + + +def compDoms(doma,domb,lrcut=0.9): + """ + Compare if is quite close same domains. + If quite close, whether use doma to replace domb. + """ + if doma.chrom != domb.chrom: + return False + #overlapped domains + if domb.start <= doma.start <= domb.end or domb.start <= doma.end <= domb.end or doma.start <= domb.start <= doma.end or doma.start <= domb.end <= doma.end: + start = max(doma.start,domb.start) + end = min(doma.end,domb.end) + length = max(doma.length,domb.length) + if (end-start)/length > lrcut: + return True + return False + + +def combineDoms(doms, doms2, lrcut=0.9): + """ + Combine domains. + """ + #doms binsize is bigger than doms2 + for key in doms2.keys(): + if key not in doms: + doms[key] = doms2[key] + else: + #add no overlapped + for doma in doms2[key]: + flag = False + for i, domb in enumerate(doms[key]): + flag2 = compDoms(doma,domb,lrcut) + #if highly overlapped and similar, use the higher resolution/smaller domain to replace biggger one + if flag2: + flag = True + doms[key][i] = doma #replace + break + else: + continue + #no overlapped or almost the same + if flag == False: + doms[key].append(doma) + return doms + + +def readDoms(f): + doms = {} + for line in open(f): + line = line.split("\n")[0].split("\t") + if len(line) == 3: + did = "|".join(line) + if len(line) >=4: + if line[4].strip() == "": + did = "|".join(line) + else: + did = line[4] + chrom = line[0] + start = int(line[1]) + end = int(line[2]) + dom = Domain() + dom.id = did + dom.chrom = chrom + dom.start = start + dom.end = end + dom.length = end - start + if chrom not in doms: + doms[chrom] = [] + doms[chrom].append( dom ) + return doms + + + +def main(): + op = help() + + fs = op.fins.split(",") + for f in fs: + if not os.path.isfile(f): + print("%s not exists, return!"%f) + + doms = readDoms( fs[0] ) + for f in fs[1:]: + doms = combineDoms( doms, readDoms(f), lrcut=op.lrcut) + + with open(op.fout+"_mergedDomains.bed","w") as fo: + for c,v in doms.items(): + for dom in v: + line = list( map(str, [dom.chrom, dom.start, dom.end, dom.id]) ) + fo.write( "\t".join(line) + "\n") + with open(op.fout+"_mergedDomains_juicebox.bedpe","w") as fo: + head = "chr1\tx1\tx2\tchr2\ty1\ty2\tname\n" + fo.write(head) + for c,v in doms.items(): + for dom in v: + line = list( map(str, [dom.chrom, dom.start, dom.end,dom.chrom,dom.start,dom.end, dom.id]) ) + fo.write( "\t".join(line) + "\n") + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/plotDiffHeatmap.py b/build/scripts-3.10/plotDiffHeatmap.py new file mode 100755 index 00000000..263ace2b --- /dev/null +++ b/build/scripts-3.10/plotDiffHeatmap.py @@ -0,0 +1,259 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8 -- +""" +""" +__date__ = "2021-02-10" +__modified__ = "" +__email__ = "caoyaqiang0410@gmail.com" + +#general library +import os +import sys +import json +import argparse +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import numpy as np +import pandas as pd +from tqdm import tqdm +from scipy import sparse +from joblib import Parallel, delayed +from matplotlib.ticker import AutoLocator + +#cLoops2 +from cLoops2.io import parseIxy +from cLoops2.cmat import getObsMat, getExpMat +from cLoops2.settings import * + + +def help(): + """ + Create the command line interface. + """ + description = """ + Plot the difference of matrix heatmaps for the 3D genome data for two sets. + Example: + plotDiffHeatmap.py -fa Trac1/chr21-chr21.ixy -fb Trac2/chr21-chr21.ixy -o Trac1vs2 -cut 1000 -bs 2000 -log + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-fa", + dest="faixy", + required=True, + type=str, + help="Input .ixy file generated by cLoops2 for first file.") + parser.add_argument( + "-fb", + dest="fbixy", + required=True, + type=str, + help="Input .ixy file generated by cLoops2 for second file.") + parser.add_argument("-o", + dest="output", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-bs", + dest="binSize", + required=False, + default=5000, + type=int, + help= + "Bin size/matrix resolution (bp) to generate the contact matrix for estimation, default is 5000 bp." + ) + parser.add_argument( + "-start", + dest="start", + required=False, + type=int, + default=0, + help="Start genomic coordinate for the target region,default is 0.") + parser.add_argument( + "-end", + dest="end", + required=False, + type=int, + default=-1, + help= + "End genomic coordinate for the target region,default will be inferred from the data." + ) + parser.add_argument("-log", + dest="log", + required=False, + action="store_true", + default=False, + help="Whether to log transform the matrix.") + parser.add_argument( + "-cut", + dest="cut", + type=int, + default=0, + help="PETs with distance > cut will be kept, default is 0.") + parser.add_argument( + "-mcut", + dest="mcut", + type=int, + default=-1, + help="PETs with distance < mcut will be kept, default is -1 no limit.") + parser.add_argument( + "-na", + dest="na", + type=str, + default="", + help="Sample A name, default is inferred from data directory name.") + parser.add_argument( + "-nb", + dest="nb", + type=str, + default="", + help="Sample B name, default is inferred from data directory name.") + parser.add_argument( + "-vmin", + dest="vmin", + type=float, + default=None, + help="The minimum value shown in the heatmap and colorbar.") + parser.add_argument( + "-vmax", + dest="vmax", + type=float, + default=None, + help="The maxmum value shown in the heatmap and colorbar.") + + op = parser.parse_args() + return op + + +def getData(f, cut=0, mcut=-1,start=0, end=-1): + """ + """ + chrom, xy = parseIxy(f, cut=cut, mcut=mcut) + if start == 0: + start = np.min(xy) + if end == -1: + end = np.max(xy) + ps = np.where((xy[:, 0] >= start) & (xy[:, 1] <= end))[0] + xy = xy[ps, ] + n = os.path.split(f)[-2] + p = os.path.abspath(f) + p = os.path.dirname(p) + metaf = os.path.join(p, "petMeta.json") + meta = json.loads(open(metaf).read()) + tot = meta["Unique PETs"] + return n, chrom, xy, tot + + +def plotDiffMatHeatmap( + fa, + fb, + fo, + start=0, + end=-1, + r=5000, + cut=0, + mcut=-1, + na="", + nb="", + log=False, + vmin=None, + vmax=None, +): + """ + Plot the contact matrix heatmaps for compare. + """ + labela, chroma, xya, tota = getData(fa, cut, mcut,start,end) + labelb, chromb, xyb, totb = getData(fb, cut, mcut,start,end) + if chroma != chromb: + print("ERROR! %s and %s are not the same target chromosome, return." % + (fa, fb)) + return + if start == 0: + start = min(np.min(xya), np.min(xyb)) + if end == -1: + end = max(np.max(xya), np.max(xyb)) + if na == "": + na = labela + if nb == "": + nb = labelb + mata = getObsMat(xya, start, end, r) + matb = getObsMat(xyb, start, end, r) + sf = tota / totb + mata = mata / sf + if log: + mat = np.log2((mata + 1) / (matb + 1)) + label = "log2( %s/%s )" % (na, nb) + else: + mat = mata - matb + label = "%s-%s" % (na, nb) + + hights = 4 + hr = [6, 0.1] + fig = pylab.figure(figsize=(4, hights)) + gs = mpl.gridspec.GridSpec(len(hr), + 1, + height_ratios=hr, + top=0.95, + bottom=0.05, + left=0.1, + right=0.9, + wspace=0.05) + pylab.suptitle("%s-%s, %s:%s-%s" % (na, nb, chroma[0], start, end), + fontsize=8) + cmap = sns.color_palette("RdBu_r", 11).as_hex() + cmap[int(len(cmap) / 2)] = "#FFFFFF" + cmap = ListedColormap(cmap) + ax = fig.add_subplot(gs[-2]) + cax = fig.add_subplot(gs[-1]) + sns.set(font_scale=0.5) + ax = sns.heatmap(mat, + xticklabels=False, + yticklabels=False, + linewidths=0.0, + square=True, + cmap=cmap, + ax=ax, + center=0, + vmin=vmin, + vmax=vmax, + cbar_ax=cax, + cbar_kws={ + 'label': label, + 'orientation': 'horizontal', + "shrink": 0.5, + "fraction": 0.2, + "anchor": (0.0, 1.0) + }) + cax.tick_params(labelsize=4) + #draw the box + ax.axvline(x=ax.get_xlim()[0], color="k", linewidth=2) + ax.axvline(x=ax.get_xlim()[1], color="k", linewidth=2) + ax.axhline(y=ax.get_ylim()[0], color="k", linewidth=2) + ax.axhline(y=ax.get_ylim()[1], color="k", linewidth=2) + pylab.savefig(fo + "_compareMatrix.pdf") + + +def main(): + op = help() + plotDiffMatHeatmap( + op.faixy, + op.fbixy, + op.output, + start=op.start, + end=op.end, + r=op.binSize, + cut=op.cut, + log=op.log, + na=op.na, + nb=op.nb, + vmin=op.vmin, + vmax=op.vmax, + ) + + +if __name__ == "__main__": + main() diff --git a/build/scripts-3.10/tow.py b/build/scripts-3.10/tow.py new file mode 100755 index 00000000..906d3eda --- /dev/null +++ b/build/scripts-3.10/tow.py @@ -0,0 +1,645 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8-- +""" +tow.py +cLoops2 tow algorithm for normalizing ChIP-seq data to reference sample at bp level. +tmp settings: only remove background noise + +Notes +1. log the data, much better, for unfixed size region +2. for bp mean level RPM ,log not needed +3. should also consider different signal to noise ratio, for peak region +4: two level of normalization: a. normalize to ChIP itself background; b. normalize with scaling +5: trin GMM model for signals around peaks can have weights of signal and noise, however, the weights are not stable due to the regions selected around peaks, so it is not good choose (signal - wnoise*noise)/wsignal as correction, can be tested + +Main function: +1. find background regions +2. qc for signal/noise ratio and noise level +3. correct the signal based on noise in one sample +4. correct the signal based on noise ratio for treatment sample to reference sample +5. correct the signal regions for treatment sample +""" + +#sys library +import time +import sys +import os +import argparse +from glob import glob +from copy import deepcopy +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import pyBigWig +import numpy as np +import pandas as pd +from tqdm import tqdm +from joblib import Parallel, delayed +from sklearn.mixture import GaussianMixture as GMM + +#cLoops2 +from cLoops2.cmat import getBinMean +from cLoops2.utils import getLogger +from cLoops2.settings import * + +#global settings +#logger +date = time.strftime(' %Y-%m-%d', time.localtime(time.time())) +logger = getLogger(fn=os.getcwd() + "/" + date.strip() + "_" + + os.path.basename(__file__) + ".log") + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Normalize target sample ChIP-seq data signal to reference sample at bp + level with assumptions of: 1) background noise signal level should be + similar and normalized to 0; 2) there are some regions (shared peaks) + which share similar level of signal intensities. + + Input bigWigs file should be normalized as RPM (reads per million) first. + + The normalization may not suitable for the TF ChIP-seq WT vs KO sample. + + Example: + tow.py -br ref.bed -bt tgt.bed -wr ref.bw -wt tgt.bw -o test + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-br", + dest="refBed", + required=True, + type=str, + help= + "The peaks for reference sample in BED format..\n"\ + ) + parser.add_argument( + "-bt", + dest="tgtBed", + required=True, + type=str, + help= + "The peaks for target sample.\n"\ + ) + parser.add_argument("-wr", + dest="refBw", + required=True, + type=str, + help="The bigWig file for reference sample.") + parser.add_argument("-wt", + dest="tgtBw", + required=True, + type=str, + help="The bigWig file for target sample.") + parser.add_argument("-o", + dest="fnOut", + required=True, + type=str, + help="Output prefix.") + parser.add_argument( + "-ext", + dest="ext", + required=False, + type=int, + default=10000, + help= + "Extension size from peak center to build Gaussian Mixture Model for\n"\ + "classification of background and signal region. Default is 10000bp.\n"\ + "For board peaks such as H3K27me3, should increase the parameter to\n"\ + "include enough nearby regions, such as 50000." + ) + parser.add_argument("-labelr", + dest="refLabel", + required=False, + type=str, + default="ref", + help="The label for reference sample. Default is ref.") + parser.add_argument("-labelt", + dest="tgtLabel", + required=False, + type=str, + default="tgt", + help="The label for target sample. Default is tgt.") + op = parser.parse_args() + return op + + +def readBed(f): + rs = [] + for line in open(f): + line = line.split("\n")[0].split("\t") + if len(line) < 3: + continue + try: + line[1] = int(line[1]) + line[2] = int(line[2]) + except: + continue + rs.append(line[:3]) + return rs + + +def buildCov(rs): + """ + Genomic region coverage + """ + lims = {} + cov = {} + for r in rs: + #coverages + if r[0] not in cov: + cov[r[0]] = set() + cov[r[0]].update(range(r[1], r[2] + 1)) + #range limitations + if r[0] not in lims: + lims[r[0]] = [r[1], r[2]] + if r[1] < lims[r[0]][0]: + lims[r[0]][0] = r[1] + if r[2] > lims[r[0]][1]: + lims[r[0]][1] = r[2] + return cov, lims + + +def getRegion(cov, margin=1): + """ + Get regions from coverage + """ + rs = [] + for c, s in cov.items(): + s = list(s) + s.sort() + i = 0 + while i < len(s) - 1: + for j in range(i + 1, len(s)): + if s[j] - s[j - 1] > margin: + break + else: + continue + start = s[i] + end = s[j - 1] + i = j #update search start + rs.append([c, start, end]) + return rs + + +def checkBgOverlaps(c, s, e, cov, lims): + if s < lims[c][0] or e > lims[c][1]: + return True + for i in range(s, e + 1): + if i in cov[c]: + return True + return False + + +def getFgBgs(refPeaks, tgtPeaks, ext=10): + """ + Get the background regions. + #coverage, require no overlaps for background regions + """ + refCov, refLims = buildCov(refPeaks) + tgtCov, tgtLims = buildCov(tgtPeaks) + coCov, allCov, lims = {}, {}, {} + for c in refCov.keys(): + minv = min(refLims[c][0], tgtLims[c][0]) + maxv = max(refLims[c][1], tgtLims[c][1]) + lims[c] = [minv, maxv] + a = deepcopy(refCov[c]) + a.update(deepcopy(tgtCov[c])) + allCov[c] = a + s = refCov[c].intersection(tgtCov[c]) + coCov[c] = s + fgs = getRegion(coCov) #shared peaks regions + alls = getRegion(allCov) #all peak regions + bgs = [] + for r in alls: + d = r[2] - r[1] + c = r[0] + s = r[1] - ext * d + e = r[2] - ext * d + if checkBgOverlaps(c, s, e, allCov, lims): + continue + bgs.append([c, s, e]) + s = r[1] + ext * d + e = r[2] + ext * d + if checkBgOverlaps(c, s, e, allCov, lims): + continue + bgs.append([c, s, e]) + return fgs, bgs + + +def getBwSig(rs, f, bins=100): + """ + Get region signal from bigWig file. + """ + bw = pyBigWig.open(f) + s = [] + for r in rs: + try: + ns = bw.values(r[0], r[1], r[2]) + except: + continue + ns = np.nan_to_num(ns) + if len(ns) < bins: + continue + ns = getBinMean(ns, bins) + s.append(ns) + return np.array(s) + + +def getQc(fgs, + bgs, + refBw, + tgtBw, + fnOut, + refLabel="ref", + tgtLabel="tgt", + bins=100): + """ + Quality control: + 1. noise compare + 2. signal to noise ratio compare + """ + fgRef = getBwSig(fgs, refBw, bins=bins) + fgRef = fgRef.mean(axis=0) + fgTgt = getBwSig(fgs, tgtBw, bins=bins) + fgTgt = fgTgt.mean(axis=0) + bgRef = getBwSig(bgs, refBw, bins=bins) + bgRef = bgRef.mean(axis=0) + bgTgt = getBwSig(bgs, tgtBw, bins=bins) + bgTgt = bgTgt.mean(axis=0) + bgfc = bgRef.mean() / bgTgt.mean() + fgfc = fgRef.mean() / fgTgt.mean() + fig, axs = pylab.subplots(1, 3, figsize=(6, 2), sharex=True) + axs = axs.reshape(-1) + x = np.arange(bins) + ax = axs[0] + ax.plot(x, bgRef, label=refLabel) + ax.plot(x, bgTgt, label=tgtLabel) + ax.set_xlabel("bins") + ax.set_ylabel("ChIP-seq mean signals, RPM") + ax.set_title("background region\nsf(%s->%s):%.3f" % + (tgtLabel, refLabel, bgfc)) + ax.legend() + #signal level + ax = axs[1] + ax.plot(x, fgRef, label=refLabel) + ax.plot(x, fgTgt, label=tgtLabel) + ax.set_ylabel("ChIP-seq mean signals, RPM") + ax.set_xlabel("bins") + ax.set_title("peak region\nsf(%s->%s):%.3f" % (tgtLabel, refLabel, fgfc)) + ax.legend() + #signal to noise ratio + refSN = fgRef / bgRef + tgtSN = fgTgt / bgTgt + ax = axs[2] + ax.plot(x, refSN, label=refLabel) + ax.plot(x, tgtSN, label=tgtLabel) + ax.set_xlabel("bins") + ax.set_ylabel("Signal to noise ratio") + ax.legend() + ax.set_title("Signal to noise") + pylab.tight_layout() + pylab.savefig(fnOut + "_1_qc.pdf") + return fgRef, fgTgt, bgRef, bgTgt + + +def estFit(bgs, + refBw, + tgtBw, + bgRef, + bgTgt, + sf, + fnOut, + refLabel="ref", + tgtLabel="tgt", + bins=2): + """ + Estimate linear fiting between samples. + """ + refS = getBwSig(bgs, refBw, bins=bins) + refS = pd.Series(refS.reshape(-1)) + tgtS = getBwSig(bgs, tgtBw, bins=bins) + tgtS = pd.Series(tgtS.reshape(-1)) + + fig, axs = pylab.subplots(1, 2, figsize=(5, 2)) + axs = axs.reshape(-1) + + #signal conversion + refS = refS - bgRef.mean() + tgtS = (tgtS - bgTgt.mean()) * sf + s = refS[refS > 0].index + s = tgtS[s] + s = s[s > 0].index + refS = refS[s] + tgtS = tgtS[s] + #log transformation + refS = np.log2(refS) + tgtS = np.log2(tgtS) + ax = axs[0] + sns.kdeplot(refS, label=refLabel, ax=ax, fill=True) + sns.kdeplot(tgtS, label=tgtLabel, ax=ax, fill=True) + ax.legend() + ax.set_xlabel("log2(RPM)") + ax.set_title("signal distribution") + + #distribution match + ax = axs[1] + #tgtSc = (tgtS - tgtS.mean())/tgtS.std()*refS.std() + refS.mean() + alpha = refS.std() / tgtS.std() + beta = refS.mean() - alpha * tgtS.mean() + tgtSc = tgtS * alpha + beta + + m = refS - tgtSc + a = (refS + tgtSc) / 2 + ax.scatter(a, m, s=0.1) + if beta > 0: + ax.set_title( + "after correction M~A PCC:%.3f\nlog2(%s)=%.3flog2(%s)+%.3f" % + (m.corr(a), refLabel, alpha, tgtLabel, beta)) + else: + ax.set_title( + "after correction M~A PCC:%.3f\nlog2(%s)=%.3flog2(%s)%.3f" % + (m.corr(a), refLabel, alpha, tgtLabel, beta)) + ax.set_xlabel("A, (log2(%s)+log2(%s))/2)" % (refLabel, tgtLabel)) + ax.set_ylabel("M, log2(%s)-log2(%s)" % (refLabel, tgtLabel)) + + pylab.tight_layout() + pylab.savefig(fnOut + "_2_fgSignalConversion.pdf") + return [alpha, beta] + + +def corrSig(ss, noise=None, sf=None, sf2=None, trim=False): + """ + ss: signal matrix + noise: value, random noise + sn: signal noise ratio + sf: scaling fitting, if none, do not scaling + """ + ns = [] + ss = pd.DataFrame(ss) + for t in ss.itertuples(): + t = np.array(t[1:]) + if noise is not None: + t = t - noise + if trim: + t[t < 0] = 0 + if sf is not None: + t = t * sf + if sf2 is not None: + t = 2**(np.log2(t) * sf2[0] + sf2[1]) + ns.append(t) + return pd.DataFrame(ns) + + +def checkCorrSig(rs, + bgs, + refBw, + tgtBw, + bgRef, + bgTgt, + sf, + sf2, + fnOut, + refLabel="ref", + tgtLabel="tgt", + bins=100): + """ + Correct signal. + """ + fgRef = corrSig(getBwSig(rs, refBw, bins=bins), bgRef, + trim=True).mean(axis=0) + bgRef = corrSig(getBwSig(bgs, refBw, bins=bins), bgRef, + trim=False).mean(axis=0) + + fgTgt = corrSig(getBwSig(rs, tgtBw, bins=bins), bgTgt, sf, sf2, + trim=True).mean(axis=0) + bgTgt = corrSig(getBwSig(bgs, tgtBw, bins=bins), bgTgt, sf, + trim=False).mean(axis=0) + + fig, axs = pylab.subplots(1, 2, figsize=(6, 3), sharex=True) + axs = axs.reshape(-1) + #noise level + x = np.arange(bins) + ax = axs[0] + ax.plot(x, bgRef, label=refLabel) + ax.plot(x, bgTgt, label=tgtLabel) + ax.set_ylim([-0.001, 0.001]) + ax.set_xlabel("bins") + ax.set_ylabel("ChIP-seq mean signals, RPM") + ax.set_title("background region") + ax.legend() + #signal level + ax = axs[1] + ax.plot(x, fgRef, label=refLabel) + ax.plot(x, fgTgt, label=tgtLabel) + ax.set_ylabel("ChIP-seq mean signals, RPM") + ax.set_xlabel("bins") + ax.set_title("peak region") + ax.legend() + pylab.tight_layout() + pylab.savefig(fnOut + "_3_CorrectSignalQc.pdf") + + +def getGmm(fg, bg, bw, ax, title, ext=5000, bins=5): + """ + Train one GMM. Data should log2 first + """ + rs = [] + for r in fg: + center = int((r[1] + r[2]) / 2) + nr = [r[0], center - ext, center + ext] + rs.append(nr) + #foreground signal + fgS = getBwSig(fg, bw, bins=bins) + fgS = fgS.reshape(-1) + fgS = np.log2(fgS[fgS > 0]) + #background signal + bgS = getBwSig(bg, bw, bins=bins) + bgS = bgS.reshape(-1) + bgS = np.log2(bgS[bgS > 0]) + #peak nearby region + mixS = getBwSig(rs, bw, bins=bins) + mixS = mixS.reshape(-1) + mixS = np.log2(mixS[mixS > 0]) + #plot + sns.kdeplot(bgS, label="background", fill=False, ax=ax) + sns.kdeplot(fgS, label="peaks", fill=False, ax=ax) + sns.kdeplot(mixS, label="peak and nearby", fill=False, ax=ax) + #train gmm + gmm = GMM(n_components=2, + covariance_type="full", + random_state=123, + means_init=[[np.mean(fgS)], + [np.mean(bgS)]]).fit([[v] for v in mixS]) + ms = gmm.means_.reshape(-1) + ws = gmm.weights_ + ax.legend() + ax.set_xlabel("log2(RPM)") + ax.set_title(title + "\n" + "means:%.3f, %.3f\nweights:%.3f, %.3f" % + (ms[0], ms[1], ws[0], ws[1])) + #correct gmm predict targets, 0 as noise , 1 as signal + if ms[0] > ms[1]: + cs = {0: 1, 1: 0} + else: + cs = {0: 0, 1: 1} + return gmm, cs + + +def trainGmm(refPeaks, + tgtPeaks, + bgs, + refBw, + tgtBw, + fnOut, + refLabel="ref", + tgtLabel="tgt", + bins=5): + """ + Train GMM to classify background regions or signal regions + """ + fig, axs = pylab.subplots(1, 2, figsize=(6, 3), sharex=True, sharey=True) + axs = axs.reshape(-1) + + refGmm, refCs = getGmm(refPeaks, bgs, refBw, axs[0], refLabel) + tgtGmm, tgtCs = getGmm(tgtPeaks, bgs, tgtBw, axs[1], tgtLabel) + + pylab.tight_layout() + pylab.savefig(fnOut + "_4_GMM.pdf") + return refGmm, refCs, tgtGmm, tgtCs + + +def normRefBw(bw, gmm, gmmCs, noise, fnOut): + """ + Normalize reference bigWig files. Only remove background noise. + """ + bwi = pyBigWig.open(bw) + with open(fnOut + ".bdg", "w") as fo: + for chrom, size in bwi.chroms().items(): + #get the singal for whole chromosome + ss = bwi.intervals(chrom) + for s in ss: + v = s[-1] + if v == 0: + continue + #gmm was trained with log2 data + t = gmmCs[gmm.predict([[np.log2(v)]])[0]] + if t == 0: + continue + v = v - noise + if v < 0: + continue + line = [chrom, s[0], s[1], "%.5f" % v] + fo.write("\t".join(list(map(str, line))) + "\n") + bwi.close() + + +def normTgtBw(bw, gmm, gmmCs, noise, sf, sf2, fnOut): + """ + Normalize target sample bigWig file. + """ + bwi = pyBigWig.open(bw) + with open(fnOut + ".bdg", "w") as fo: + for chrom, size in bwi.chroms().items(): + #add header + ss = bwi.intervals(chrom) + for s in ss: + v = s[-1] + if v == 0: + continue + #gmm was trained with log2 data + t = gmmCs[gmm.predict([[np.log2(v)]])[0]] + if t == 0: + continue + v = v - noise + if v < 0: + continue + #first scaling factor, obtained with not log2 data + v = v * sf + if t == 1: #signal, further normalization + v = 2**(np.log2(v) * sf2[0] + sf2[1]) + line = [chrom, s[0], s[1], "%.5f" % v] + fo.write("\t".join(list(map(str, line))) + "\n") + bwi.close() + + +def main(): + op = help() + + #step 0 parameters check + report = "python tow.py -br {refBed} -bt {tgtBed} -wr {refBw} -wt {tgtBw} -o {fnOut} -ext {ext} -labelr {refLabel} -labelt {tgtLabel}".format( + refBed=op.refBed, + tgtBed=op.tgtBed, + refBw=op.refBw, + tgtBw=op.tgtBw, + fnOut=op.fnOut, + ext=op.ext, + refLabel=op.refLabel, + tgtLabel=op.tgtLabel) + logger.info(report) + + #step 1 read bed + refPeaks = readBed(op.refBed) + tgtPeaks = readBed(op.tgtBed) + + #step 2 generate background regions + fgs, bgs = getFgBgs(refPeaks, tgtPeaks) + logger.info( + "[%s] Step0: ref sample peaks: %s; tgt sample peaks: %s; shared: %s; background regions: %s" + % (op.fnOut, len(refPeaks), len(tgtPeaks), len(fgs), len(bgs))) + + #step 3 qc for signal to noise ratio and noise level + logger.info( + "[%s] Step1: Initial QC for background noise level and signal-to-noise ratio." + % (op.fnOut)) + fgRef, fgTgt, bgRef, bgTgt = getQc(fgs, + bgs, + op.refBw, + op.tgtBw, + op.fnOut, + refLabel=op.refLabel, + tgtLabel=op.tgtLabel) + #scaling factor for background region + sf = bgRef.mean() / bgTgt.mean() + + #step 4 estimate sample-wise fitting + #scaling factor for singla region + logger.info("[%s] Step2: Estimating scaling factor for signal regions." % + (op.fnOut)) + sf2 = estFit(fgs, op.refBw, op.tgtBw, bgRef, bgTgt, sf, op.fnOut, + op.refLabel, op.tgtLabel) + + #step 5 check correction signal + logger.info("[%s] Step3: Checking corrected signal." % (op.fnOut)) + checkCorrSig(fgs, bgs, op.refBw, op.tgtBw, bgRef, bgTgt, sf, sf2, op.fnOut, + op.refLabel, op.tgtLabel) + + #step 6 train GMM with fg and bg data for classifiy fg and bg regions + logger.info( + "[%s] Step4: Building Gaussian Mixture Model for classfication of background and signal regions" + % (op.fnOut)) + refGmm, refCs, tgtGmm, tgtCs = trainGmm(refPeaks,tgtPeaks, bgs, op.refBw, op.tgtBw, + op.fnOut, op.refLabel, op.tgtLabel) + + #step 7 performe normalization to bigWig files + noiseRef = bgRef.mean() + noiseTgt = bgTgt.mean() + logger.info( + "[%s] Step5: Normaling reference sample with background noise." % + (op.fnOut)) + normRefBw(op.refBw, refGmm, refCs, noiseRef, op.fnOut + "_" + op.refLabel) + logger.info("[%s] Step6: Normaling target sample." % (op.fnOut)) + normTgtBw(op.tgtBw, tgtGmm, tgtCs, noiseTgt, sf, sf2, + op.fnOut + "_" + op.tgtLabel) + + logger.info("[%s] analysis finished." % (op.fnOut)) + + +if __name__ == "__main__": + start_time = datetime.now() + main() + usedtime = datetime.now() - start_time + sys.stderr.write("Process finished. Used CPU time: %s Bye!\n" % usedtime) diff --git a/build/scripts-3.10/tracPre.py b/build/scripts-3.10/tracPre.py new file mode 100755 index 00000000..54b40bb7 --- /dev/null +++ b/build/scripts-3.10/tracPre.py @@ -0,0 +1,314 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8-- +""" +tracPre.py +Pre-processing code for Trac-looping data, implemented with cLoops2, from fastq to bedpe files and qc report. +2020-02-27: finished and well tested. +""" + +__author__ = "CAO Yaqiang" +__email__ = "caoyaqiang0410@gmail.com" + +#systematic library +import os +import time +import gzip +import argparse +import subprocess +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import pandas as pd +from joblib import Parallel, delayed + +#cLoops2 +from cLoops2.utils import getLogger, callSys, isTool + +#global settings +#logger +date = time.strftime(' %Y-%m-%d', time.localtime(time.time())) +logger = getLogger(fn=os.getcwd() + "/" + date.strip() + "_" + + os.path.basename(__file__) + ".log") + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Preprocess the raw reads of FASTQ files of Trac-looping to reference + geneome with bowtie2 and obtain the unqiue PETs with quality control + results. + Fastqs files should be named with suffix pattern as + _R1.fastq.gz, _R2.fastq.gz. + + Example: + tracPre.py -fqd ../1.fq -o ./ -ref ../bowtie2/hg38 -n 10 -p 5 -mapq 10 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-fqd", + dest="fqd", + required=True, + type=str, + help="The directory for raw .fastq.gz files, for example ../1.fastq/ " + ) + parser.add_argument( + "-o", + dest="output", + required=False, + type=str, + default="./", + help= + "Output directory, default is ./, if directory not exists, create one." + ) + parser.add_argument( + "-ref", + dest="ref", + required=True, + type=str, + help= + "Bowtie2 reference index prefix, such as ./ref/hg38, generated from\n"\ + "bowtie2-build hg38.fa hg38." + ) + parser.add_argument( + "-n", + dest="number", + required=False, + type=int, + default=1, + help="How many Bowtie2 to run at the same time, default is 1. ") + parser.add_argument( + "-p", + dest="cpu", + required=False, + type=int, + default=5, + help="How many cpus used by each Bowtie2 or following processing,\n"\ + "default is 5. " + ) + parser.add_argument( + "-mapq", + dest="mapq", + required=False, + default=10, + type=int, + help="MAPQ cutoffs for filtering PETs, default is 10." + ) + op = parser.parse_args() + return op + + +def preFqs(fastqRoot): + """ + If the fastq files are well prepared, suitable. + """ + fastqs = glob(fastqRoot + "/*.fastq.gz") + data = {} + for fq in fastqs: + s = os.path.split(fq)[1] + s = s.replace(".fastq.gz", "") + if s.endswith("_R1"): + sample = s.replace("_R1", "") + if sample not in data: + data[sample] = [0, 0] + data[sample][0] = fq + if s.endswith("_R2"): + sample = s.replace("_R2", "") + if sample not in data: + data[sample] = [0, 0] + data[sample][1] = fq + for key, fqs in data.items(): + if len(fqs) != 2: + logger.error( + "for %s there is not paired fastq files, only %s found" % + (key, ",".join(fqs))) + del data[key] + return data + + +def tracMapping(sample, fqs, ref, outdir, cpus=25): + """ + Mapping settings for Trac-looping data. + """ + logger.info("Start mapping %s.\n" % sample) + od = os.path.join(outdir, sample) + if not os.path.exists(od): + os.makedirs(od, exist_ok=True) + sam = od + "/" + sample + ".sam" + bam = od + "/" + sample + ".bam" + if os.path.isfile(sam): + logger.error("%s:%s exists, return." % (sample, sam)) + return None + if os.path.isfile(bam): + logger.error("%s:%s exists, return." % (sample, bam)) + return None + doBowtie = "bowtie2 -p {cpus} -q --local --very-sensitive -x {ref} -1 {fq1} -2 {fq2} -S {sam}".format( + cpus=cpus, ref=ref, fq1=fqs[0], fq2=fqs[1], sam=sam) + logger.info(doBowtie) + stat, output = subprocess.getstatusoutput(doBowtie) + #trim with "Warning" + output = output.split("\n") + output = [t for t in output if not t.startswith("Warning")] + output = "\n".join(output) + logger.info("FLAG_A:" + sample + "\n" + output + "\nFLAG_A\n") + return sam + + +def getUniqueBedpe(f, fout): + """ + Get unique bedpe + """ + if os.path.isfile(fout): + return + print("Getting unique PETs from %s to %s" % (f, fout)) + redus = set() + #with gzip.open(fout, "wt") as fo: + with open(fout, "w") as fo: + #for i, line in enumerate(gzip.open(f, "rt")): + for i, line in enumerate(open(f)): + line = line.split("\n")[0].split("\t") + if len(line) < 6: + continue + #remove redudant PETs + r = hash(tuple(line[:6])) + if r in redus: + continue + else: + redus.add(r) + #shroten the name + #line[6] = str(i) + fo.write("\t".join(line) + "\n") + + +def sam2bamBedpe(sam, mapq=10): + """ + SAM to BAM and bedpe file + """ + n = os.path.splitext(sam)[0] + bam = n + ".bam" + bedpeAll = n + "_all.bedpe" + bedpeUni = n + "_unique.bedpe" + #sam to bam, filtering mapq + samview = "samtools view -b -F 4 -@ 2 -q {mapq} -o {bam} {sam}".format( + mapq=mapq, bam=bam, sam=sam) + #sort by read name + samsort = "samtools sort -n -@ 2 {bam} -T {pre} -o {bam}".format( + bam=bam, pre=bam.replace(".bam", "")) + rmsam = "rm %s" % (sam) + cmds = [samview, samsort, rmsam] + callSys(cmds, logger) + bam2bedpe = "bamToBed -bedpe -i {bam} > {bedpe}".format(bam=bam, + bedpe=bedpeAll) + logger.info(bam2bedpe) + stat, output = subprocess.getstatusoutput(bam2bedpe) + getUniqueBedpe(bedpeAll, bedpeUni) + cmd = "gzip %s %s" % (bedpeAll, bedpeUni) + callSys([cmd], logger) + return bedpeAll + ".gz" + + +def sParseBowtie(lines): + """ + Parse Bowtie2 log file, to obtain mapping stastics. + """ + d, s = None, None + lines = lines.split("\n") + s = lines[0] + totalReads = int(lines[1].split(";")[0].split()[0]) + d1 = lines[4].strip().split() + conUniqueMappedReads = int(d1[0]) + d2 = lines[8].strip().split() + unconUniqueMappedReads = int(d2[0]) + #mapRatio = float(lines[15].split("%")[0]) + mapRatio = float(lines[-2].split("%")[0]) + d = { + "TotalRawReads": totalReads, + #"ConcordantlyUniqueMapReads": conUniqueMappedReads, + #"DisconcordantlyUniqueMapReads": unconUniqueMappedReads, + "MappingRatio(%s)": mapRatio + #"MultipleMapReads": multipleMappedReads, + #"MultipleMapRatio": multipleMappedRatio, + } + return d, s + + +def parseBowtielog(logs=None): + if logs == None: + logs = glob("*.log") + data = {} + for log in logs: + lines = open(log).read().split("FLAG_A\n") + lines = [line for line in lines if "FLAG_A" in line] + for line in lines: + t = line.split("FLAG_A:")[1] + d, s = sParseBowtie(t) + data[s] = d + data = pd.DataFrame(data).T + return data + + +def main(): + """ + Batch converting from bam to bedpe. + """ + op = help() + for t in ["bowtie2", "samtools", "bamToBed"]: + if not isTool(t): + logger.error("%s not exits! Please install through conda." % t) + return + if not os.path.exists(op.fqd): + logger.error("Input %s not exists! Return." % op.fqd) + return + if len(glob(op.ref + "*.bt2")) == 0: + logger.error("Bowtie2 reference not exists for prefix of %s! Return." % + op.ref) + return + if not os.path.exists(op.output): + os.makedirs(op.output, exist_ok=True) + else: + fs = glob(os.path.join(op.output, "*")) + if len(fs) > 0: + logger.info( + "Target output directory %s is not empty, may over-write some files." + % op.output) + + #mapping + data = preFqs(op.fqd) + if len(data) == 0: + logger.error( + "No matched _R1.fastq.gz and _R2.fastq.gz in %s. Return." % + (op.fqd)) + return + ref = op.ref + sams = Parallel(n_jobs=op.number,backend="multiprocessing")( + delayed(tracMapping)(sample, fqs, ref, op.output, cpus=op.cpu) + for sample, fqs in data.items()) + sams = [sam for sam in sams if sam is not None] + + #sam to bam and bedpe + cpus = op.number * op.cpu + ncpus = int(min(len(sams), cpus / 2)) + bedpes = Parallel(n_jobs=ncpus,backend="multiprocessing")(delayed(sam2bamBedpe)(sam) for sam in sams) + + #cLoops2 qc + cmd = "cLoops2 qc -f %s -o bedpeQc -p %s" % (",".join(bedpes), + min(len(bedpes), cpus)) + callSys([cmd], logger) + + #combine report + mata = parseBowtielog() + matb = pd.read_csv("bedpeQc_bedpeQc.txt", index_col=0, sep="\t") + matb.index = [i.split("_all")[0] for i in matb.index] + for c in matb.columns: + mata[c] = matb[c] + mata.to_csv("tracPre_summary.txt", sep="\t") + cmd = "rm bedpeQc_bedpeQc.txt" + os.system(cmd) + + +if __name__ == '__main__': + main() diff --git a/build/scripts-3.10/tracPre2.py b/build/scripts-3.10/tracPre2.py new file mode 100755 index 00000000..49346b06 --- /dev/null +++ b/build/scripts-3.10/tracPre2.py @@ -0,0 +1,515 @@ +#!/home/caoy7/anaconda3/envs/astroBoy/bin/python +#--coding:utf-8-- +""" +tracPre.py +Pre-processing code for Hi-Trac data, implemented with cLoops2, from fastq to bedpe files and qc report. +2020-02-27: finished and well tested. +2020-06-30: add linker filter, new stat, and changing mapping to end-to-end +2023-09-11: summary report output prefix added +""" + +__author__ = "CAO Yaqiang" +__email__ = "caoyaqiang0410@gmail.com" + +#systematic library +import os +import time +import gzip +import argparse +import subprocess +from glob import glob +from datetime import datetime +from argparse import RawTextHelpFormatter + +#3rd library +import pandas as pd +from joblib import Parallel, delayed +from Bio.Seq import Seq +from Bio.SeqIO.QualityIO import FastqGeneralIterator + +#cLoops2 +from cLoops2.utils import getLogger, callSys, isTool + +#global settings +#logger +logger = None + + +def help(): + """ + Create the command line interface for the script. + """ + description = """ + Preprocess the raw reads of FASTQ files of Hi-TrAC to reference + genome with bowtie2 and obtain the unqiue PETs with quality control + results. + Fastqs files should be named with suffix pattern as + _R1.fastq.gz, _R2.fastq.gz. + + Example: + tracPre2.py -fqd ../1.fq -o ./ -ref ../bowtie2/hg38 -n 10 -p 5 -mapq 10 + """ + parser = argparse.ArgumentParser(description=description, + formatter_class=RawTextHelpFormatter) + parser.add_argument( + "-fqd", + dest="fqd", + required=True, + type=str, + help="The directory for raw .fastq.gz files, for example ../1.fastq/ ") + parser.add_argument( + "-o", + dest="output", + required=False, + type=str, + default="./", + help= + "Output directory, default is ./, if directory not exists, create one." + ) + parser.add_argument( + "-ref", + dest="ref", + required=True, + type=str, + help= + "Bowtie2 reference index prefix, such as ./ref/hg38, generated from\n"\ + "bowtie2-build hg38.fa hg38." + ) + parser.add_argument( + "-n", + dest="number", + required=False, + type=int, + default=1, + help="How many Bowtie2 to run at the same time, default is 1. ") + parser.add_argument( + "-p", + dest="cpu", + required=False, + type=int, + default=5, + help="How many cpus used by each Bowtie2 or following processing,\n"\ + "default is 5. " + ) + parser.add_argument("-mapq", + dest="mapq", + required=False, + default=10, + type=int, + help="MAPQ cutoffs for filtering PETs, default is 10.") + op = parser.parse_args() + return op + + +def preFqs(fastqRoot): + """ + If the fastq files are well prepared, suitable. + """ + fastqs = glob(fastqRoot + "/*.fastq.gz") + data = {} + for fq in fastqs: + s = os.path.split(fq)[1] + s = s.replace(".fastq.gz", "") + if s.endswith("_R1"): + sample = s.replace("_R1", "") + if sample not in data: + data[sample] = [0, 0] + data[sample][0] = fq + if s.endswith("_R2"): + sample = s.replace("_R2", "") + if sample not in data: + data[sample] = [0, 0] + data[sample][1] = fq + for key, fqs in data.items(): + if len(fqs) != 2: + logger.error( + "for %s there is not paired fastq files, only %s found" % + (key, ",".join(fqs))) + del data[key] + return data + + +def getRCSeq(seq): + """ + Get the reverse complementary sequence + """ + tab = str.maketrans("ACTG","TGAC") + return seq.translate( tab )[::-1] + + +def findLinker(seq, linker): + """ + Match the linker in the read sequence. + """ + linkerrc = getRCSeq(linker) + pos = -1 + for i in range(len(seq) - 9): + seed = seq[i:i + 9] + if linker.startswith(seed): + pos = i + break + if linkerrc.startswith(seed): + pos = i + break + return pos + + +def checkStarts(seq): + """ + Check the starts + """ + flag = False + ss = ["CATG", "AATT", "NATG", "NATT"] + for s in ss: + if seq.startswith(s): + flag = True + break + return flag + + +def cutLinker(fq1, fq2, pre, rlen=10, linker="CTGTCTCTTATACACATCT"): + """ + Cut linkers and filter too short reads + """ + sample = pre.split("/")[-1] + nf1 = pre + "_R1.fastq.gz" + nf2 = pre + "_R2.fastq.gz" + if os.path.isfile(nf1) and os.path.isfile(nf2): + print("%s has been generated, return" % pre) + return None + fouts = { + "fo_r1": gzip.open(nf1, "wt"), + "fo_r2": gzip.open(nf2, "wt"), + } + #processing pairing fastqs + with gzip.open(fq1, "rt") as f1, gzip.open(fq2, "rt") as f2: + i = 0 + j = 0 + for r1, r2 in zip(FastqGeneralIterator(f1), FastqGeneralIterator(f2)): + r1, r2 = list(r1), list(r2) + i += 1 + if i % 100000 == 0: + print("%s reads processed for %s" % (i, pre)) + #check the starts + """ + if not (checkStarts(r1[1]) and checkStarts(r2[1])): + continue + if r1[1][0] == "N": + r1[1] = r1[1][1:] + r1[2] = r1[2][1:] + if r2[1][0] == "N": + r2[1] = r2[1][1:] + r2[2] = r2[2][1:] + """ + #check the linker + r1pos = findLinker(r1[1], linker) + r2pos = findLinker(r2[1], linker) + #trim reads + if r1pos != -1: + r1[1] = r1[1][:r1pos] + r1[2] = r1[2][:r1pos] + if r2pos != -1: + r2[1] = r2[1][:r2pos] + r2[2] = r2[2][:r2pos] + rid = "_".join(list(map(str, [i, r1pos, r2pos]))) + r1[0] = rid + r2[0] = rid + if len(r1[1]) >= rlen and len(r2[1]) >= rlen: + j += 1 + fouts["fo_r1"].write("@%s\n%s\n+\n%s\n" % + (r1[0], r1[1], r1[2])) + fouts["fo_r2"].write("@%s\n%s\n+\n%s\n" % + (r2[0], r2[1], r2[2])) + return sample, i, j, nf1, nf2 + + +def tracMapping(sample, fqs, ref, outdir, cpus=25): + """ + Mapping settings for Trac-looping data. + """ + logger.info("Start mapping %s.\n" % sample) + od = os.path.join(outdir, sample) + if not os.path.exists(od): + os.makedirs(od, exist_ok=True) + sam = od + "/" + sample + ".sam" + bam = od + "/" + sample + ".bam" + if os.path.isfile(sam): + logger.error("%s:%s exists, return." % (sample, sam)) + return None + if os.path.isfile(bam): + logger.error("%s:%s exists, return." % (sample, bam)) + return None + doBowtie = "bowtie2 -p {cpus} -q --end-to-end --very-sensitive -x {ref} -1 {fq1} -2 {fq2} -S {sam}".format( + cpus=cpus, ref=ref, fq1=fqs[0], fq2=fqs[1], sam=sam) + logger.info(doBowtie) + stat, output = subprocess.getstatusoutput(doBowtie) + #trim with "Warning" + output = output.split("\n") + output = [t for t in output if not t.startswith("Warning")] + output = "\n".join(output) + logger.info("FLAG_A:" + sample + "\n" + output + "\nFLAG_A\n") + lines = output.split("\n") + totalReads = int(lines[1].split(";")[0].split()[0]) + mapRatio = float(lines[-1].split("%")[0]) + return sample, sam + + +def getUniqueBedpe(f, fout): + """ + Get unique bedpe. Read id indicate the linker location. + """ + if os.path.isfile(fout): + return + print("Getting unique PETs from %s to %s" % (f, fout)) + redus = set() + with open(fout, "w") as fo: + for i, line in enumerate(open(f)): + line = line.split("\n")[0].split("\t") + if len(line) < 6: + continue + rid = list(map(int, line[6].split("_"))) + #for cis short reads, requiring the linkers + if line[0] == line[3]: + dis = abs((int(line[1]) + int(line[2])) / 2 - + (int(line[4]) + int(line[5])) / 2) + if dis < 1000 and rid[1] + rid[2] == -2: + continue + #for trans reads, requiring the linkers + if line[0] != line[3]: + if rid[1] + rid[2] == -2: + continue + #remove redudant PETs + r = hash(tuple(line[:6])) + if r in redus: + continue + else: + redus.add(r) + fo.write("\t".join(line) + "\n") + + +def sam2bamBedpe(sample, sam, mapq=10): + """ + SAM to BAM and bedpe file + """ + n = os.path.splitext(sam)[0] + bam = n + ".bam" + bedpeAll = n + "_all.bedpe" + bedpeUni = n + "_unique.bedpe" + #sam to bam, filtering mapq + samview = "samtools view -b -F 4 -@ 2 -q {mapq} -o {bam} {sam}".format( + mapq=mapq, bam=bam, sam=sam) + #sort by read name + samsort = "samtools sort -n -@ 2 {bam} -T {pre} -o {bam}".format( + bam=bam, pre=bam.replace(".bam", "")) + rmsam = "rm %s" % (sam) + cmds = [samview, samsort, rmsam] + callSys(cmds, logger) + bam2bedpe = "bamToBed -bedpe -i {bam} > {bedpe}".format(bam=bam, + bedpe=bedpeAll) + logger.info(bam2bedpe) + stat, output = subprocess.getstatusoutput(bam2bedpe) + getUniqueBedpe(bedpeAll, bedpeUni) + cmd = "gzip %s %s" % (bedpeAll, bedpeUni) + callSys([cmd], logger) + return sample, bedpeAll + ".gz", bedpeUni + ".gz" + + +def sParseBowtie(lines): + """ + Parse Bowtie2 log file, to obtain mapping stastics. + """ + d, s = None, None + lines = lines.split("\n") + s = lines[0] + totalReads = int(lines[1].split(";")[0].split()[0]) + d1 = lines[4].strip().split() + conUniqueMappedReads = int(d1[0]) + d2 = lines[8].strip().split() + unconUniqueMappedReads = int(d2[0]) + #mapRatio = float(lines[15].split("%")[0]) + mapRatio = float(lines[-2].split("%")[0]) + d = { + "TotalRawReads": totalReads, + #"ConcordantlyUniqueMapReads": conUniqueMappedReads, + #"DisconcordantlyUniqueMapReads": unconUniqueMappedReads, + "MappingRatio(%s)": mapRatio + #"MultipleMapReads": multipleMappedReads, + #"MultipleMapRatio": multipleMappedRatio, + } + return d, s + + +def parseBowtielog(logs): + data = {} + for log in logs: + lines = open(log).read().split("FLAG_A\n") + lines = [line for line in lines if "FLAG_A" in line] + for line in lines: + t = line.split("FLAG_A:")[1] + d, s = sParseBowtie(t) + data[s] = d + data = pd.DataFrame(data).T + return data + + +def main(): + """ + Batch converting from bam to bedpe. + """ + #prepare everything + op = help() + date = time.strftime(' %Y-%m-%d', time.localtime(time.time())) + logger = getLogger(fn=op.output + "/" + date.strip() + "_" + os.path.basename(__file__) + ".log") + for t in ["bowtie2", "samtools", "bamToBed"]: + if not isTool(t): + logger.error("%s not exits! Please install through conda." % t) + return + if not os.path.exists(op.fqd): + logger.error("Input %s not exists! Return." % op.fqd) + return + if len(glob(op.ref + "*.bt2")) == 0: + logger.error("Bowtie2 reference not exists for prefix of %s! Return." % + op.ref) + return + if not os.path.exists(op.output): + os.makedirs(op.output, exist_ok=True) + else: + fs = glob(os.path.join(op.output, "*")) + if len(fs) > 0: + logger.info( + "Target output directory %s is not empty, may over-write some files." + % op.output) + data = preFqs(op.fqd) + if len(data) == 0: + logger.error( + "No matched _R1.fastq.gz and _R2.fastq.gz in %s. Return." % + (op.fqd)) + return + #prepare output dir + dirs = {} + for sample in data.keys(): + od = os.path.join(op.output, sample) + dirs[sample] = od + if not os.path.exists(od): + os.makedirs(od, exist_ok=True) + + #step 1, filter linkers + logger.info("Step1: Trim linkers and remove short sequences.") + ds = Parallel(n_jobs=op.number)( + delayed(cutLinker)(fqs[0], fqs[1], os.path.join(dirs[sample], sample)) + for sample, fqs in data.items()) + data = {} + for d in ds: + if d is not None: + data[d[0]] = { + "totalRaw": d[1], + "filterLinkers": d[2], + "f1": d[3], + "f2": d[4], + } + + #step2, mapping + logger.info("Step2: Map processed reads to genome.") + ref = op.ref + ds = Parallel(n_jobs=op.number, backend="multiprocessing")( + delayed(tracMapping)( + sample, [vs["f1"], vs["f2"]], ref, op.output, cpus=op.cpu) + for sample, vs in data.items()) + for d in ds: + if d is not None: + data[d[0]]["sam"] = d[1] + + #step3, convert to bam and bedpe files + #sam to bam and bedpe + logger.info("Step3: File type conversion. ") + cpus = op.number * op.cpu + ncpus = int(min(len(data), cpus / 2)) + ds = Parallel(n_jobs=ncpus, backend="multiprocessing")( + delayed(sam2bamBedpe)(sample, vs["sam"], op.mapq) + for sample, vs in data.items()) + + allBedpes = [] + uniBedpes = [] + for d in ds: + if d is not None: + data[d[0]]["allBedpe"] = d[1] + data[d[0]]["uniNonbgBedpe"] = d[2] + allBedpes.append(d[1]) + uniBedpes.append(d[2]) + data = pd.DataFrame(data).T + + #step 4, all PETs cLoops2 qc + logger.info("Step4: All mapped PETs QC. ") + cmd = "cLoops2 qc -f %s -o %s/allBedpeQc -p %s" % (",".join(allBedpes),op.output, + min(len(allBedpes), cpus)) + callSys([cmd], logger) + + #step 5, unqiue PETs cLoops2 qc + logger.info("Step5: Unique non-background PETs QC. ") + cmd = "cLoops2 qc -f %s -o %s/uniNonBgBedpeQc -p %s" % ( + ",".join(uniBedpes), op.output, min(len(uniBedpes), cpus)) + callSys([cmd], logger) + + #step 6, combine report + logger.info("Step5: Generate report. ") + logs = glob(op.output+"/*%s*.log"%os.path.basename(__file__)) + mata = parseBowtielog(logs) + + matb = pd.read_csv("%s/allBedpeQc_bedpeQc.txt"%op.output, index_col=0, sep="\t") + matb.index = [i.split("_all")[0] for i in matb.index] + matc = pd.read_csv("%s/uniNonBgBedpeQc_bedpeQc.txt"%op.output, index_col=0, sep="\t") + matc.index = [i.split("_unique")[0] for i in matc.index] + + for c in matb.columns: + mata[c] = matb[c] + mata.to_csv("%s/tracPre_summary.txt"%op.output, sep="\t") + + mat = {} + mat["total raw sequences"] = data["totalRaw"] + mat["after linker removing sequences"] = data["filterLinkers"] + mat["mapping ratio"] = mata["MappingRatio(%s)"] / 100 + + mat["total mapped PETs (mapq>=%s)" % op.mapq] = matb["TotalPETs"] + mat["total mapped PETs redundancy"] = matb["Redundancy"] + mat["total mapped PETs intra-chromosomal ratio"] = matb["cisRatio"] + mat["total mapped PETs close ratio (distance<=1kb)"] = matb["closeRatio"] + mat["total mapped PETs middle ratio (1kb=%s)" % op.mapq, + "total mapped PETs redundancy", + "total mapped PETs intra-chromosomal ratio", + "total mapped PETs close ratio (distance<=1kb)", + "total mapped PETs middle ratio (1kb - -

- - - ------- - ------- - ## Introduction - cLoops2 is an extension of our previous work, [cLoops](https://github.com/YaqiangCao/cLoops). From loop-calling based on assumption-free clustering to a full suite of analysis tools for 3D genomic interaction data, cLoops2 has been adapted specifically for data such as Hi-TrAC/Trac-looping, for which interactions are enriched over the genome through experimental steps. cLoops2 still supports Hi-C -like data, of which the interaction signals are evenly distributed at enzyme cutting sites. The changes from cLoops to cLoops2 are designed to address challenges around aiming for higher resolutions with the next-generation of genome architecture mapping technologies. - - cLoops2 is designed with respect reference to [bedtools](https://bedtools.readthedocs.io/en/latest/) and [Samtools](http://www.htslib.org/) for command-line style programming. If you have experience with them, you will find cLoops2 easy and efficient to use and combine commands, integrate as steps in your processing pipeline. - - Please refer to our [Hi-TrAC method manuscript]() or [cLoops2 manuscript](https://www.biorxiv.org/content/10.1101/2021.07.20.453068v1) for what cLoops2 can do and show. - - If you use cLoops2 in your research (the idea, the algorithm, the analysis scripts or the supplemental data), please give us a star on the GitHub repo page and cite our paper as follows: - - Preprint bioRxiv: [Yaqiang Cao et al. "cLoops2: a full-stack comprehensive analytical tool for chromatin interactions"](https://www.biorxiv.org/content/10.1101/2021.07.20.453068v1) - - - ------- - ------- - ## Install - #### 1. Easy way through pip for stable version - Python3 is requried. - ``` - pip install cLoops2 - ``` - - ------- - #### 2. Install from source with test data for latest version - cLoops2 is written purely in Python3 (cLoops was written in Python2). If you are familiar with [conda](https://docs.conda.io/en/latest/), cLoops2 can be installed easily with the following Linux shell commands (also tested well in win10 ubuntu subsystem, MacOS). - ``` - # for most updated code, or download the release version - git clone --depth=1 https://github.com/YaqiangCao/cLoops2 - cd cLoops2 - conda env create --name cLoops2 --file cLoops2_env.yaml - conda activate cLoops2 - python3 setup.py install - ``` - - Necessary Python3 third-party packages are listed below, all of which can be installed through conda. If you like to install cLoops2 through the old school way ***python setup.py install***, please install the 3rd dependencies first. - ``` - tqdm - numpy - scipy - pandas - sklearn - seaborn - pyBigWig - matplotlib - joblib - networkx - ``` - - After installation, whenever you want to run cLoops2, just activate the environment with conda: **conda activate cLoops2**. - Happy peak/loop-calling and have fun exploring all the other kinds of analyses. - - - ------ - ------ - ## cLoops2 Main Functions - Run ***cLoops2*** or ***cLoops2 -h*** can show the main functions of cLoops2 with short descriptions and examples. - ``` - An enhanced, accurate and flexible peak/domain/loop-calling and analysis tool - for 3D genomic interaction data. - - Use cLoops2 sub-command -h to see detail options and examples for sub-commands. - Available sub-commands are: - qc: quality control of BEDPE files before analysis. - pre: preprocess input BEDPE files into cLoops2 data. - update: update cLoops2 data files locations. - combine: combine multiple cLooops2 data directories. - dump: convert cLoops2 data files to others (BEDPE, HIC, washU, bedGraph and - contact matrix) - estEps: estimate eps using Gaussian mixture models or k-distance plot. - estRes: estimate reasonable contact matrix resolution based on signal - enrichment. - estDis: estimate significant interactions distance range. - estSat: estimate sequencing saturation based on contact matrix. - estSim: estimate similarities among samples based on contact matrix. - filterPETs: filter PETs based on peaks, loops, singleton mode or knn mode. - samplePETs: sample PETs according to specific target size. - callPeaks: call peaks for ChIP-seq, ATAC-seq, ChIC-seq and CUT&Tag or the - 3D genomic data such as Trac-looping, Hi-TrAC, HiChIP and more. - callLoops: call loops for 3D genomic data. - callDiffLoops: call differentially enriched loops for two datasets. - callDomains: call domains for 3D genomic data. - plot: plot the interaction matrix, genes, view point plot, 1D tracks, - peaks, loops and domains for a specific region. - montage: analysis of specific regions, producing Westworld Season 3 -like - Rehoboam plot. - agg: aggregated feature analysis and plots, features can be peaks, view - points, loops and domains. - quant: quantify peaks, loops and domains. - anaLoops: anotate loops for target genes. - findTargets: find target genes of genomic regions through networks from - anaLoops. - - Examples: - cLoops2 qc -f trac_rep1.bedpe.gz,trac_rep2.bedpe,trac_rep3.bedpe.gz \ - -o trac_stat -p 3 - cLoops2 pre -f ../test_GM12878_chr21_trac.bedpe -o trac - cLoops2 update -d ./trac - cLoops2 combine -ds ./trac1,./trac2,./trac3 -o trac_combined -keep 1 - cLoops2 dump -d ./trac -o trac -hic - cLoops2 estEps -d trac -o trac_estEps_gmm -p 10 -method gmm - cLoops2 estRes -d trac -o trac_estRes -p 10 -bs 25000,5000,1000,200 - cLoops2 estDis -d trac -o trac -plot -bs 1000 - cLoops2 estSim -ds Trac1,Trac2 -o trac_sim -p 10 -bs 2000 -m pcc -plot - cLoops2 filterPETs -d trac -peaks trac_peaks.bed -o trac_peaksFiltered -p 10 - cLoops2 samplePETs -d trac -o trac_sampled -t 5000000 -p 10 - cLoops2 callPeaks -d H3K4me3_ChIC -bgd IgG_ChIC -o H3K4me3_cLoops2 -eps 150 \ - -minPts 10 - cLoops2 callLoops -d Trac -eps 200,500,1000 -minPts 3 -filter -o Trac -w -j \ - -cut 2000 - cLoops2 callLoops -d HiC -eps 1000,5000,10000 -minPts 10,20,50,100 -w -j \ - -trans -o HiC_trans - cLoops2 callDiffLoops -tloop target_loop.txt -cloop control_loop.txt \ - -td ./target -cd ./control -o target_diff - cLoops2 callDomains -d trac -o trac -bs 10000 -ws 200000 - cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 500 -start 34840000 \ - -end 34895000 -triu -1D -loop test_loops.txt -log \ - -gtf hg38.gtf -bws ctcf.bw -beds enhancer.bed - cLoops2 montage -f test/chr21-chr21.ixy -o test -bed test.bed - cLoops2 agg -d trac -loops trac.loop -peaks trac_peaks.bed \ - -domains hic_domains.bed -bws CTCF.bw,ATAC.bw -p 20 -o trac - cLoops2 quant -d trac -peaks trac_peaks.bed -loops trac.loop \ - -domains trac_domain.txt -p 20 -o trac - cLoops2 anaLoops -loops test_loop.txt -gtf gene.gtf -net -o test - cLoops2 findTargets -net test_ep_net.sif -tg test_targets.txt \ - -bed GWAS.bed -o test - More usages and examples are shown when run with cLoops2 sub-command -h. - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - - Bug reports are welcome and can be put as issue at github repo or sent to - caoyaqiang0410@gmail.com or yaqiang.cao@nih.gov. Thank you. - ``` - - ------ - ### 1. Quality control for BEDPE files - Run **cLoops2 qc -h** to see details. - ``` - Get the basic quality control statistical information from interaction BEDPE - files. - - Example: - cLoops2 qc -f trac_rep1.bedpe.gz,trac_rep2.bedpe,trac_rep3.bedpe.gz -p 3 \ - -o trac_stat - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -f FNIN Input BEDPE file(s), .bedpe and .bedpe.gz are both suitable. Multiple - samples can be assigned as -f A.bedpe.gz,B.bedpe.gz,C.bedpe.gz. - ``` - - ------ - ### 2. Pre-process BEDPE into cLoops2 data - Run **cLoops2 pre -h** to see details. - ``` - Preprocess mapped PETs into cLoops2 data files. - - Support input file formats: - BEDPE: https://bedtools.readthedocs.io/en/latest/content/general-usage.html - PAIRS: https://pairtools.readthedocs.io/en/latest/formats.html#pairs - - The output directory contains one .json file for the basic statistics of PETs - information and .ixy files which are coordinates for every PET. The coordinate - files will be used to call peaks, loops or any other analyses implemented in - cLoops2. For data backup/sharing purposes, the directory can be saved as - .tar.gz file through tar. If changed and moved location, run - ***cLoops2 update -d*** to update. - - Examples: - 1. keep high quality PETs of chromosome chr21 - cLoops2 pre -f trac_rep1.bepee.gz,trac_rep2.bedpe.gz -o trac -c chr21 - - 2. keep all cis PETs that have distance > 1kb - cLoops2 pre -f trac_rep1.bedpe.gz,trac_rep2.bedpe.gz -o trac -mapq 0 - - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -f FNIN Input BEDPE or PAIR file(s), .bedpe and .bedpe.gz are both suitable. - Replicates or multiple samples can be assigned as -f A.bedpe.gz, - B.bedpe.gz,C.bedpe.gz to get merged PETs. - -c CHROMS Argument to process limited set of chromosomes, specify it as chr1, - chr2,chr3. Use this option to filter reads from such as - chr22_KI270876v1. The default setting is to use the entire set of - chromosomes from the data. - -trans Whether to parse trans- (inter-chromosomal) PETs. The default is to - ignore trans-PETs. Set this flag to pre-process all PETs. - -mapq MAPQ MAPQ cutoff to filter raw PETs, default is >=10. This option is not - valid when input is .pairs file. - -format {bedpe,pairs} - cLoops2 currently supports BEDPE and PAIRs file format. Default is bedpe. - ``` - - ------ - ### 3. Update cLoops2 data directory - Run **cLoops2 update -h** to see details. - ``` - Update cLoops2 data files generated by **cLoops2 pre**. - - In the **cLoops2 pre** output directory, there is a .json file annotated with - the .ixy **absolute paths** and other information. So if the directory is - moved, or some .ixy files are removed or changed, this command is needed to - update the paths, otherwise the other analysis modules will not work. - - Example: - cLoops2 update -d ./Trac - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - ``` - - ------ - ### 4. Convert cLoops2 data to others - Run **cLoops2 dump -h** to see details. - ``` - Convert cLoops2 data files to other types. Currently supports BED file,BEDPE - file, HIC file, washU long-range track, bedGraph file and matrix txt file. - - Converting cLoops2 data to .hic file needs "juicer_tools pre" in the command - line enviroment. - Converting cLoops2 data to legacy washU browser long-range track needs bgzip - and tabix. Format reference: http://wiki.wubrowse.org/Long-range. - Converting cLoops2 data to UCSC bigInteract track needs bedToBigBed. Format - reference: https://genome.ucsc.edu/goldenPath/help/interact.html. - Converting cLoops2 data to bedGraph track will normalize value as RPM - (reads per million). Run with -bdg_pe flag for 1D data such as ChIC-seq, - ChIP-seq and ATAC-seq. - Converting cLoops2 data to matrix txt file will need specific resolution. - The output txt file can be loaded in TreeView for visualization or further - analysis. - - Examples: - 1. convert cLoops2 data to single-end .bed file fo usage of BEDtools or - MACS2 for peak-calling with close PETs - cLoops2 dump -d trac -o trac -bed -mcut 1000 - - 2. convert cLoops2 data to .bedpe file for usage of BEDtools, only keep - PETs distance >1kb and < 1Mb - cLoops2 dump -d trac -o trac -bedpe -bedpe_ext -cut 1000 -mcut 1000000 - - 3. convert cLoops2 data to .hic file to load in juicebox - cLoops2 dump -d trac -o trac -hic -hic_org hg38 \ - -hic_res 200000,20000,5000 - - 4. convert cLoops2 data to washU long-range track file, only keep PETs - distance > 1kb - cLoops2 dump -d trac -o trac -washU -washU_ext 50 -cut 1000 - - 5. convert cLoops2 data to UCSC bigInteract track file - cLoops2 dump -d trac -o trac -ucsc -ucsc_cs ./hg38.chrom.sizes - - 6. convert interacting cLoops2 data to bedGraph file with all PETs - cLoops2 dump -d trac -o trac -bdg -bdg_ext 100 - - 7. convert 1D cLoops2 data (such as ChIC-seq/ChIP-seq/ATAC-seq) to bedGraph - file - cLoops2 dump -d trac -o trac -bdg -pe - - 8. convert 3D cLoops2 data (such as Trac-looping) to bedGraph file for peaks - cLoops2 dump -d trac -o trac -bdg -mcut 1000 - - 9. convert one region in chr21 to contact matrix correlation matrix txt file - cLoops2 dump -d test -mat -o test -mat_res 10000 \ - -mat_chrom chr21-chr21 -mat_start 36000000 \ - -mat_end 40000000 -log -corr - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -bed Convert data to single-end BED file. - -bed_ext BED_EXT Extension from the center of the read to both ends for BED file. - Default is 50. - -bedpe Convert data to BEDPE file. - -bedpe_ext BEDPE_EXT Extension from the center of the PET to both ends for BEDPE file. - Default is 50. - -hic Convert data to .hic file. - -hic_org HIC_ORG Organism required to generate .hic file,default is hg38. If the - organism is not available, assign a chrom.size file. - -hic_res HIC_RES Resolutions used to generate .hic file. Default is 1000,5000,25000, - 50000,100000,200000. - -washU Convert data to legacy washU browser long-range track. - -washU_ext WASHU_EXT Extension from the center of the PET to both ends for washU track. - Default is 50. - -ucsc Convert data to UCSC bigInteract file track. - -ucsc_ext UCSC_EXT Extension from the center of the PET to both ends for ucsc - track. Default is 50. - -ucsc_cs UCSC_CS A chrom.sizes file. Can be obtained through fetchChromSizese. - Required for -ucsc option. - -bdg Convert data to 1D bedGraph track file. - -bdg_ext BDG_EXT Extension from the center of the PET to both ends for - bedGraph track. Default is 50. - -bdg_pe When converting to bedGraph, argument determines whether to treat PETs - as ChIP-seq, ChIC-seq or ATAC-seq paired-end libraries. Default is not. - PETs are treated as single-end library for interacting data. - -mat Convert data to matrix txt file with required resolution. - -mat_res MAT_RES Bin size/matrix resolution (bp) to generate the contact matrix. - Default is 5000 bp. - -mat_chrom CHROM The chrom-chrom set will be processed. Specify it as chr1-chr1. - -mat_start START Start genomic coordinate for the target region. Default will be the - smallest coordinate from specified chrom-chrom set. - -mat_end END End genomic coordinate for the target region. Default will be the - largest coordinate from specified chrom-chrom set. - -log Whether to log transform the matrix. Default is not. - -m {obs,obs/exp} The type of matrix, observed matrix or observed/expected matrix, - expected matrix will be generated by shuffling PETs. Default is - observed. - -corr Whether to get the correlation matrix. Default is not. - -norm Whether to normalize the matrix with z-score. Default is not. - - ``` - - - ------ - ### 5. Estimate eps - Run **cLoops2 estEps -h** to see details. - ``` - Estimate key parameter eps. - - Two methods are implemented: 1) unsupervised Gaussian mixture model (gmm), and - 2) k-distance plot (k-dis,-k needed). Gmm is based on the assumption that PETs - can be classified into self-ligation (peaks) and inter-ligation (loops). K-dis - is based on the k-nearest neighbors distance distribution to find the "knee", - which is where the distance (eps) between neighbors has a sharp increase along - the k-distance curve. K-dis is the traditional approach literatures, but it is - much more time consuming than gmm, and maybe only fit to small cases. If both - methods do not give nice plots, please turn to the empirical parameters you - like, such as 100,200 for ChIP-seq -like data, 5000,1000 for Hi-C and etc. - - Examples: - 1. estimate eps with Gaussian mixture model - cLoops2 estEps -d trac -o trac_estEps_gmm -p 10 -method gmm - - 2. estimate eps with k-nearest neighbors distance distribution - cLoops2 estEps -d trac -o trac_estEps_kdis -p 10 -method k-dis -k 5 - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -fixy FIXY Assign the .ixy file to estimate eps inside of the whole directory - generated by cLoops2 pre. For very large data, especially Hi-C, this - option is recommended for chr1 (or the smaller one) to save time. - -k KNN The k-nearest neighbors used to draw the k-distance plot. Default is 0 - (not running), set this when -method k-dis. Suggested 5 for - ChIA-PET/Trac-looping data, 20 or 30 for Hi-C like data. - -method {gmm,k-dis} Two methods can be chosen to estimate eps. Default is Gmm. See above - for difference of the methods. - - ``` - - ------ - ### 6. Estimate reasonable contact matrix resolution - Run **cLoops2 estRes -h** to see details. - ``` - Estimate reasonable genome-wide contact matrix resolution based on signal - enrichment. - - PETs will be assigned to contact matrix bins according to input resolution. A - bin is marked as [nx,ny], and a PET is assigned to a bin by nx = int((x-s)/bs), - ny = int((y-s)/bs), where s is the minimal coordinate for all PETs and bs is - the bin size. Self-interaction bins (nx=ny) will be ignored. The bins only - containing singleton PETs are assumed as noise. - - The output is a PDF plot, for each resolution, a line is separated into two - parts: 1) dash line indicated linear increased trend of singleton PETs/bins; 2) - solid thicker line indicated non-linear increased trend of higher potential - signal PETs/bins. The higher the ratio of signal PETs/bins, the easier it it to - find loops in that resolution. The closer to the random line, the higher the - possibility to observe evenly distributed signals. - - We expect the highest resolution with >=50% PETs are not singletons. - - Example: - cLoops2 estRes -d trac -o trac -bs 10000,5000,1000 -p 20 - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -bs BINSIZE Candidate contact matrix resolution (bin size) to estimate signal - enrichment. A series of comma-separated values or a single value can - be used as input. For example,-bs 1000,5000,10000. Default is 5000. - - ``` - - ------ - ### 7. Estimate significant interaction distance range - Run **cLoops2 estDis -h** to see details. - ``` - Estimate the significant interaction distance limitation by getting the observed - and expected random background of the genomic distance vs interaction frequency. - - Example: - cLoops2 estDis -d trac -o trac -bs 5000 -p 20 -plot - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs +Keywords: peak-calling loop-calling Hi-Trac interaction visualization +Classifier: Environment :: Console +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: POSIX +Classifier: Topic :: Scientific/Engineering :: Bio-Informatics +Requires-Python: >=3 +Description-Content-Type: text/markdown +License-File: LICENSE + +## cLoops2: full stack analysis tool for chromatin interactions +

+ +

+ + +------- +------- +## Introduction +cLoops2 is an extension of our previous work, [cLoops](https://github.com/YaqiangCao/cLoops). From loop-calling based on assumption-free clustering to a full suite of analysis tools for 3D genomic interaction data, cLoops2 has been adapted specifically for data such as Hi-TrAC/Trac-looping, for which interactions are enriched over the genome through experimental steps. cLoops2 still supports Hi-C -like data, of which the interaction signals are evenly distributed at enzyme cutting sites. The changes from cLoops to cLoops2 are designed to address challenges around aiming for higher resolutions with the next-generation of genome architecture mapping technologies. + +cLoops2 is designed with respect reference to [bedtools](https://bedtools.readthedocs.io/en/latest/) and [Samtools](http://www.htslib.org/) for command-line style programming. If you have experience with them, you will find cLoops2 easy and efficient to use and combine commands, integrate as steps in your processing pipeline. + +Please refer to our [Hi-TrAC method manuscript]() or [cLoops2 manuscript](https://www.biorxiv.org/content/10.1101/2021.07.20.453068v1) for what cLoops2 can do and show. + +If you use cLoops2 in your research (the idea, the algorithm, the analysis scripts or the supplemental data), please give us a star on the GitHub repo page and cite our paper as follows: + +Preprint bioRxiv: [Yaqiang Cao et al. "cLoops2: a full-stack comprehensive analytical tool for chromatin interactions"](https://www.biorxiv.org/content/10.1101/2021.07.20.453068v1) + + +------- +------- +## Install +#### 1. Easy way through pip for stable version +Python3 is requried. +``` +pip install cLoops2 +``` + +------- +#### 2. Install from source with test data for latest version +cLoops2 is written purely in Python3 (cLoops was written in Python2). If you are familiar with [conda](https://docs.conda.io/en/latest/), cLoops2 can be installed easily with the following Linux shell commands (also tested well in win10 ubuntu subsystem, MacOS). +``` +# for most updated code, or download the release version +git clone --depth=1 https://github.com/YaqiangCao/cLoops2 +cd cLoops2 +conda env create --name cLoops2 --file cLoops2_env.yaml +conda activate cLoops2 +python3 setup.py install +``` + +Necessary Python3 third-party packages are listed below, all of which can be installed through conda. If you like to install cLoops2 through the old school way ***python setup.py install***, please install the 3rd dependencies first. +``` +tqdm +numpy +scipy +pandas +sklearn +seaborn +pyBigWig +matplotlib +joblib +networkx +``` + +After installation, whenever you want to run cLoops2, just activate the environment with conda: **conda activate cLoops2**. +Happy peak/loop-calling and have fun exploring all the other kinds of analyses. + + +------ +------ +## cLoops2 Main Functions +Run ***cLoops2*** or ***cLoops2 -h*** can show the main functions of cLoops2 with short descriptions and examples. +``` +An enhanced, accurate and flexible peak/domain/loop-calling and analysis tool +for 3D genomic interaction data. + +Use cLoops2 sub-command -h to see detail options and examples for sub-commands. +Available sub-commands are: + qc: quality control of BEDPE files before analysis. + pre: preprocess input BEDPE files into cLoops2 data. + update: update cLoops2 data files locations. + combine: combine multiple cLooops2 data directories. + dump: convert cLoops2 data files to others (BEDPE, HIC, washU, bedGraph and + contact matrix) + estEps: estimate eps using Gaussian mixture models or k-distance plot. + estRes: estimate reasonable contact matrix resolution based on signal + enrichment. + estDis: estimate significant interactions distance range. + estSat: estimate sequencing saturation based on contact matrix. + estSim: estimate similarities among samples based on contact matrix. + filterPETs: filter PETs based on peaks, loops, singleton mode or knn mode. + samplePETs: sample PETs according to specific target size. + callPeaks: call peaks for ChIP-seq, ATAC-seq, ChIC-seq and CUT&Tag or the + 3D genomic data such as Trac-looping, Hi-TrAC, HiChIP and more. + callLoops: call loops for 3D genomic data. + callDiffLoops: call differentially enriched loops for two datasets. + callDomains: call domains for 3D genomic data. + plot: plot the interaction matrix, genes, view point plot, 1D tracks, + peaks, loops and domains for a specific region. + montage: analysis of specific regions, producing Westworld Season 3 -like + Rehoboam plot. + agg: aggregated feature analysis and plots, features can be peaks, view + points, loops and domains. + quant: quantify peaks, loops and domains. + anaLoops: anotate loops for target genes. + findTargets: find target genes of genomic regions through networks from + anaLoops. + +Examples: + cLoops2 qc -f trac_rep1.bedpe.gz,trac_rep2.bedpe,trac_rep3.bedpe.gz \ + -o trac_stat -p 3 + cLoops2 pre -f ../test_GM12878_chr21_trac.bedpe -o trac + cLoops2 update -d ./trac + cLoops2 combine -ds ./trac1,./trac2,./trac3 -o trac_combined -keep 1 + cLoops2 dump -d ./trac -o trac -hic + cLoops2 estEps -d trac -o trac_estEps_gmm -p 10 -method gmm + cLoops2 estRes -d trac -o trac_estRes -p 10 -bs 25000,5000,1000,200 + cLoops2 estDis -d trac -o trac -plot -bs 1000 + cLoops2 estSim -ds Trac1,Trac2 -o trac_sim -p 10 -bs 2000 -m pcc -plot + cLoops2 filterPETs -d trac -peaks trac_peaks.bed -o trac_peaksFiltered -p 10 + cLoops2 samplePETs -d trac -o trac_sampled -t 5000000 -p 10 + cLoops2 callPeaks -d H3K4me3_ChIC -bgd IgG_ChIC -o H3K4me3_cLoops2 -eps 150 \ + -minPts 10 + cLoops2 callLoops -d Trac -eps 200,500,1000 -minPts 3 -filter -o Trac -w -j \ + -cut 2000 + cLoops2 callLoops -d HiC -eps 1000,5000,10000 -minPts 10,20,50,100 -w -j \ + -trans -o HiC_trans + cLoops2 callDiffLoops -tloop target_loop.txt -cloop control_loop.txt \ + -td ./target -cd ./control -o target_diff + cLoops2 callDomains -d trac -o trac -bs 10000 -ws 200000 + cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 500 -start 34840000 \ + -end 34895000 -triu -1D -loop test_loops.txt -log \ + -gtf hg38.gtf -bws ctcf.bw -beds enhancer.bed + cLoops2 montage -f test/chr21-chr21.ixy -o test -bed test.bed + cLoops2 agg -d trac -loops trac.loop -peaks trac_peaks.bed \ + -domains hic_domains.bed -bws CTCF.bw,ATAC.bw -p 20 -o trac + cLoops2 quant -d trac -peaks trac_peaks.bed -loops trac.loop \ + -domains trac_domain.txt -p 20 -o trac + cLoops2 anaLoops -loops test_loop.txt -gtf gene.gtf -net -o test + cLoops2 findTargets -net test_ep_net.sif -tg test_targets.txt \ + -bed GWAS.bed -o test + More usages and examples are shown when run with cLoops2 sub-command -h. + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + +Bug reports are welcome and can be put as issue at github repo or sent to +caoyaqiang0410@gmail.com or yaqiang.cao@nih.gov. Thank you. +``` + +------ +### 1. Quality control for BEDPE files +Run **cLoops2 qc -h** to see details. +``` +Get the basic quality control statistical information from interaction BEDPE +files. + +Example: + cLoops2 qc -f trac_rep1.bedpe.gz,trac_rep2.bedpe,trac_rep3.bedpe.gz -p 3 \ + -o trac_stat + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -f FNIN Input BEDPE file(s), .bedpe and .bedpe.gz are both suitable. Multiple + samples can be assigned as -f A.bedpe.gz,B.bedpe.gz,C.bedpe.gz. +``` + +------ +### 2. Pre-process BEDPE into cLoops2 data +Run **cLoops2 pre -h** to see details. +``` +Preprocess mapped PETs into cLoops2 data files. + +Support input file formats: +BEDPE: https://bedtools.readthedocs.io/en/latest/content/general-usage.html +PAIRS: https://pairtools.readthedocs.io/en/latest/formats.html#pairs + +The output directory contains one .json file for the basic statistics of PETs +information and .ixy files which are coordinates for every PET. The coordinate +files will be used to call peaks, loops or any other analyses implemented in +cLoops2. For data backup/sharing purposes, the directory can be saved as +.tar.gz file through tar. If changed and moved location, run +***cLoops2 update -d*** to update. + +Examples: + 1. keep high quality PETs of chromosome chr21 + cLoops2 pre -f trac_rep1.bepee.gz,trac_rep2.bedpe.gz -o trac -c chr21 + + 2. keep all cis PETs that have distance > 1kb + cLoops2 pre -f trac_rep1.bedpe.gz,trac_rep2.bedpe.gz -o trac -mapq 0 + + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -f FNIN Input BEDPE or PAIR file(s), .bedpe and .bedpe.gz are both suitable. + Replicates or multiple samples can be assigned as -f A.bedpe.gz, + B.bedpe.gz,C.bedpe.gz to get merged PETs. + -c CHROMS Argument to process limited set of chromosomes, specify it as chr1, + chr2,chr3. Use this option to filter reads from such as + chr22_KI270876v1. The default setting is to use the entire set of + chromosomes from the data. + -trans Whether to parse trans- (inter-chromosomal) PETs. The default is to + ignore trans-PETs. Set this flag to pre-process all PETs. + -mapq MAPQ MAPQ cutoff to filter raw PETs, default is >=10. This option is not + valid when input is .pairs file. + -format {bedpe,pairs} + cLoops2 currently supports BEDPE and PAIRs file format. Default is bedpe. +``` + +------ +### 3. Update cLoops2 data directory +Run **cLoops2 update -h** to see details. +``` +Update cLoops2 data files generated by **cLoops2 pre**. + +In the **cLoops2 pre** output directory, there is a .json file annotated with +the .ixy **absolute paths** and other information. So if the directory is +moved, or some .ixy files are removed or changed, this command is needed to +update the paths, otherwise the other analysis modules will not work. + +Example: + cLoops2 update -d ./Trac + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. +``` + +------ +### 4. Convert cLoops2 data to others +Run **cLoops2 dump -h** to see details. +``` +Convert cLoops2 data files to other types. Currently supports BED file,BEDPE +file, HIC file, washU long-range track, bedGraph file and matrix txt file. + +Converting cLoops2 data to .hic file needs "juicer_tools pre" in the command +line enviroment. +Converting cLoops2 data to legacy washU browser long-range track needs bgzip +and tabix. Format reference: http://wiki.wubrowse.org/Long-range. +Converting cLoops2 data to UCSC bigInteract track needs bedToBigBed. Format +reference: https://genome.ucsc.edu/goldenPath/help/interact.html. +Converting cLoops2 data to bedGraph track will normalize value as RPM +(reads per million). Run with -bdg_pe flag for 1D data such as ChIC-seq, +ChIP-seq and ATAC-seq. +Converting cLoops2 data to matrix txt file will need specific resolution. +The output txt file can be loaded in TreeView for visualization or further +analysis. + +Examples: + 1. convert cLoops2 data to single-end .bed file fo usage of BEDtools or + MACS2 for peak-calling with close PETs + cLoops2 dump -d trac -o trac -bed -mcut 1000 + + 2. convert cLoops2 data to .bedpe file for usage of BEDtools, only keep + PETs distance >1kb and < 1Mb + cLoops2 dump -d trac -o trac -bedpe -bedpe_ext -cut 1000 -mcut 1000000 + + 3. convert cLoops2 data to .hic file to load in juicebox + cLoops2 dump -d trac -o trac -hic -hic_org hg38 \ + -hic_res 200000,20000,5000 + + 4. convert cLoops2 data to washU long-range track file, only keep PETs + distance > 1kb + cLoops2 dump -d trac -o trac -washU -washU_ext 50 -cut 1000 + + 5. convert cLoops2 data to UCSC bigInteract track file + cLoops2 dump -d trac -o trac -ucsc -ucsc_cs ./hg38.chrom.sizes + + 6. convert interacting cLoops2 data to bedGraph file with all PETs + cLoops2 dump -d trac -o trac -bdg -bdg_ext 100 + + 7. convert 1D cLoops2 data (such as ChIC-seq/ChIP-seq/ATAC-seq) to bedGraph + file + cLoops2 dump -d trac -o trac -bdg -pe + + 8. convert 3D cLoops2 data (such as Trac-looping) to bedGraph file for peaks + cLoops2 dump -d trac -o trac -bdg -mcut 1000 + + 9. convert one region in chr21 to contact matrix correlation matrix txt file + cLoops2 dump -d test -mat -o test -mat_res 10000 \ + -mat_chrom chr21-chr21 -mat_start 36000000 \ + -mat_end 40000000 -log -corr + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -bed Convert data to single-end BED file. + -bed_ext BED_EXT Extension from the center of the read to both ends for BED file. + Default is 50. + -bedpe Convert data to BEDPE file. + -bedpe_ext BEDPE_EXT Extension from the center of the PET to both ends for BEDPE file. + Default is 50. + -hic Convert data to .hic file. + -hic_org HIC_ORG Organism required to generate .hic file,default is hg38. If the + organism is not available, assign a chrom.size file. + -hic_res HIC_RES Resolutions used to generate .hic file. Default is 1000,5000,25000, + 50000,100000,200000. + -washU Convert data to legacy washU browser long-range track. + -washU_ext WASHU_EXT Extension from the center of the PET to both ends for washU track. + Default is 50. + -ucsc Convert data to UCSC bigInteract file track. + -ucsc_ext UCSC_EXT Extension from the center of the PET to both ends for ucsc + track. Default is 50. + -ucsc_cs UCSC_CS A chrom.sizes file. Can be obtained through fetchChromSizese. + Required for -ucsc option. + -bdg Convert data to 1D bedGraph track file. + -bdg_ext BDG_EXT Extension from the center of the PET to both ends for + bedGraph track. Default is 50. + -bdg_pe When converting to bedGraph, argument determines whether to treat PETs + as ChIP-seq, ChIC-seq or ATAC-seq paired-end libraries. Default is not. + PETs are treated as single-end library for interacting data. + -mat Convert data to matrix txt file with required resolution. + -mat_res MAT_RES Bin size/matrix resolution (bp) to generate the contact matrix. + Default is 5000 bp. + -mat_chrom CHROM The chrom-chrom set will be processed. Specify it as chr1-chr1. + -mat_start START Start genomic coordinate for the target region. Default will be the + smallest coordinate from specified chrom-chrom set. + -mat_end END End genomic coordinate for the target region. Default will be the + largest coordinate from specified chrom-chrom set. + -log Whether to log transform the matrix. Default is not. + -m {obs,obs/exp} The type of matrix, observed matrix or observed/expected matrix, + expected matrix will be generated by shuffling PETs. Default is + observed. + -corr Whether to get the correlation matrix. Default is not. + -norm Whether to normalize the matrix with z-score. Default is not. + +``` + + +------ +### 5. Estimate eps +Run **cLoops2 estEps -h** to see details. +``` +Estimate key parameter eps. + +Two methods are implemented: 1) unsupervised Gaussian mixture model (gmm), and +2) k-distance plot (k-dis,-k needed). Gmm is based on the assumption that PETs +can be classified into self-ligation (peaks) and inter-ligation (loops). K-dis +is based on the k-nearest neighbors distance distribution to find the "knee", +which is where the distance (eps) between neighbors has a sharp increase along +the k-distance curve. K-dis is the traditional approach literatures, but it is +much more time consuming than gmm, and maybe only fit to small cases. If both +methods do not give nice plots, please turn to the empirical parameters you +like, such as 100,200 for ChIP-seq -like data, 5000,1000 for Hi-C and etc. + +Examples: + 1. estimate eps with Gaussian mixture model + cLoops2 estEps -d trac -o trac_estEps_gmm -p 10 -method gmm + + 2. estimate eps with k-nearest neighbors distance distribution + cLoops2 estEps -d trac -o trac_estEps_kdis -p 10 -method k-dis -k 5 + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs available. Too many CPU could cause out-of-memory problem if there are too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show version of cLoops2. - -c CHROMS Whether to process limited chroms, specify it as chr1,chr2,chr3, - default is not. Use this to save time for quite big data. - -bs BINSIZE Bin size / contact matrix resolution (bp) to generate the contact - matrix for estimation, default is 5000 bp. - -r REPEATS The reapet times to shuffle PETs to get the mean expected background, - default is 10. - -plot Set to plot the result. - ``` - - ------ - ### 8. Filter PETs - Run **cLoops2 filterPETs -h** to see details - ``` - Filter PETs according to peaks/domains/loops/singletons/KNNs. - - If any end of the PETs overlap with features such as peaks or loops, the PET - will be kept. Filtering can be done before or after peak/loop-calling. Input - can be peaks or loops, but should not be be mixed. The -singleton mode is based - on a specified contact matrix resolution, if there is only one PET in the bin, - the singleton PETs will be filtered. The -knn is based on noise removing step - of blockDBSCAN. - - Examples: - 1. keep PETs overlapping with peaks - cLoops2 filterPETs -d trac -peaks peaks.bed -o trac_filtered - - 2. keep PETs that do not overlap with any blacklist regions - cLoops2 filterPETs -d trac -peaks bg.bed -o trac_filtered -iv - - 3. keep PETs that overlap with loop anchors - cLoops2 filterPETs -d trac -loops test_loops.txt -o trac_filtered - - 4. keep PETs that both ends overlap with loop anchors - cLoops2 filterPETs -d trac -loops test_loops.txt -o trac_filtered -both - - 5. keep non-singleton PETs based on 1kb contact matrix - cLoops2 filterPETs -d trac -o trac_filtered -singleton -bs 1000 - - 6. filter PETs based on blockDBSCAN knn noise removing - cLoops2 filterPETs -d trac -o trac_filtered -knn -eps 1000 -minPts 5 - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -peaks FBED BED file of genomic features (such as promoters, enhancers, ChIP-seq, - ATAC-seq peaks,TADs) to filter PETs. - -loops FLOOP The loop.txt file generated by cLoops2, can be loops or domains, to - filter PETs. - -gap GAP If the distance between two genomic features is <=gap, the two regions - will be combined. Default is 1. Set to >=1. - -singleton Whether to use singleton mode to filter PETs. Contact matrix - resolution with -bs is required. Singleton PETs in contact matrix bins - will be filtered. - -bs BINSIZE The contact matrix bin size for -singleton mode filtering. Default is - 5000. - -knn Whether to use noise removing method in blockDBSCAN to filter PETs, - -eps and -minPts are required. - -eps EPS Same to callPeaks and callLoops, only used to filter PETs for -knn - mode. Default is 1000. Only one value is supported. - -minPts MINPTS Same to callPeaks and callLoops, only used to filter PETs for -knn - mode. Default is 5. Only one value is supported. - -iv Whether to only keep PETs not in the assigned regions, behaves like - grep -v. - -both Whether to only keep PETs that both ends overlap with loop anchors. - Default is not. - ``` - - ------ - ### 9. Sampling PETs - Run **cLoops2 samplePETs -h** to see details. - ``` - Sampling PETs to target total size. - - If there are multiple sample libraries and the total sequencing depths vary a - lot, and you want to compare the data fairly, it's better to sample them to - similar total PETs (either down-sampling or up-sampling), then call peaks/loops - with the same parameters. - - Example: - cLoops2 samplePETs -d trac -o trac_sampled -tot 5000000 -p 10 - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + -fixy FIXY Assign the .ixy file to estimate eps inside of the whole directory + generated by cLoops2 pre. For very large data, especially Hi-C, this + option is recommended for chr1 (or the smaller one) to save time. + -k KNN The k-nearest neighbors used to draw the k-distance plot. Default is 0 + (not running), set this when -method k-dis. Suggested 5 for + ChIA-PET/Trac-looping data, 20 or 30 for Hi-C like data. + -method {gmm,k-dis} Two methods can be chosen to estimate eps. Default is Gmm. See above + for difference of the methods. + +``` + +------ +### 6. Estimate reasonable contact matrix resolution +Run **cLoops2 estRes -h** to see details. +``` +Estimate reasonable genome-wide contact matrix resolution based on signal +enrichment. + +PETs will be assigned to contact matrix bins according to input resolution. A +bin is marked as [nx,ny], and a PET is assigned to a bin by nx = int((x-s)/bs), +ny = int((y-s)/bs), where s is the minimal coordinate for all PETs and bs is +the bin size. Self-interaction bins (nx=ny) will be ignored. The bins only +containing singleton PETs are assumed as noise. + +The output is a PDF plot, for each resolution, a line is separated into two +parts: 1) dash line indicated linear increased trend of singleton PETs/bins; 2) +solid thicker line indicated non-linear increased trend of higher potential +signal PETs/bins. The higher the ratio of signal PETs/bins, the easier it it to +find loops in that resolution. The closer to the random line, the higher the +possibility to observe evenly distributed signals. + +We expect the highest resolution with >=50% PETs are not singletons. + +Example: + cLoops2 estRes -d trac -o trac -bs 10000,5000,1000 -p 20 + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -bs BINSIZE Candidate contact matrix resolution (bin size) to estimate signal + enrichment. A series of comma-separated values or a single value can + be used as input. For example,-bs 1000,5000,10000. Default is 5000. + +``` + +------ +### 7. Estimate significant interaction distance range +Run **cLoops2 estDis -h** to see details. +``` +Estimate the significant interaction distance limitation by getting the observed +and expected random background of the genomic distance vs interaction frequency. + +Example: + cLoops2 estDis -d trac -o trac -bs 5000 -p 20 -plot + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -c CHROMS Whether to process limited chroms, specify it as chr1,chr2,chr3, + default is not. Use this to save time for quite big data. + -bs BINSIZE Bin size / contact matrix resolution (bp) to generate the contact + matrix for estimation, default is 5000 bp. + -r REPEATS The reapet times to shuffle PETs to get the mean expected background, + default is 10. + -plot Set to plot the result. +``` + +------ +### 8. Filter PETs +Run **cLoops2 filterPETs -h** to see details +``` +Filter PETs according to peaks/domains/loops/singletons/KNNs. + +If any end of the PETs overlap with features such as peaks or loops, the PET +will be kept. Filtering can be done before or after peak/loop-calling. Input +can be peaks or loops, but should not be be mixed. The -singleton mode is based +on a specified contact matrix resolution, if there is only one PET in the bin, +the singleton PETs will be filtered. The -knn is based on noise removing step +of blockDBSCAN. + +Examples: + 1. keep PETs overlapping with peaks + cLoops2 filterPETs -d trac -peaks peaks.bed -o trac_filtered + + 2. keep PETs that do not overlap with any blacklist regions + cLoops2 filterPETs -d trac -peaks bg.bed -o trac_filtered -iv + + 3. keep PETs that overlap with loop anchors + cLoops2 filterPETs -d trac -loops test_loops.txt -o trac_filtered + + 4. keep PETs that both ends overlap with loop anchors + cLoops2 filterPETs -d trac -loops test_loops.txt -o trac_filtered -both + + 5. keep non-singleton PETs based on 1kb contact matrix + cLoops2 filterPETs -d trac -o trac_filtered -singleton -bs 1000 + + 6. filter PETs based on blockDBSCAN knn noise removing + cLoops2 filterPETs -d trac -o trac_filtered -knn -eps 1000 -minPts 5 + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -peaks FBED BED file of genomic features (such as promoters, enhancers, ChIP-seq, + ATAC-seq peaks,TADs) to filter PETs. + -loops FLOOP The loop.txt file generated by cLoops2, can be loops or domains, to + filter PETs. + -gap GAP If the distance between two genomic features is <=gap, the two regions + will be combined. Default is 1. Set to >=1. + -singleton Whether to use singleton mode to filter PETs. Contact matrix + resolution with -bs is required. Singleton PETs in contact matrix bins + will be filtered. + -bs BINSIZE The contact matrix bin size for -singleton mode filtering. Default is + 5000. + -knn Whether to use noise removing method in blockDBSCAN to filter PETs, + -eps and -minPts are required. + -eps EPS Same to callPeaks and callLoops, only used to filter PETs for -knn + mode. Default is 1000. Only one value is supported. + -minPts MINPTS Same to callPeaks and callLoops, only used to filter PETs for -knn + mode. Default is 5. Only one value is supported. + -iv Whether to only keep PETs not in the assigned regions, behaves like + grep -v. + -both Whether to only keep PETs that both ends overlap with loop anchors. + Default is not. +``` + +------ +### 9. Sampling PETs +Run **cLoops2 samplePETs -h** to see details. +``` +Sampling PETs to target total size. + +If there are multiple sample libraries and the total sequencing depths vary a +lot, and you want to compare the data fairly, it's better to sample them to +similar total PETs (either down-sampling or up-sampling), then call peaks/loops +with the same parameters. + +Example: + cLoops2 samplePETs -d trac -o trac_sampled -tot 5000000 -p 10 + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -tot TOT Target total number of PETs. +``` + +------ +### 10. Call peaks for 1D or 3D data +Run **cLoops2 callPeaks -h** to see details. +``` +Call peaks based on clustering. + +Well tested work for ChIP-seq, ChIC-seq, ATAC-seq, CUT&RUN -like or the 3D +genomic data such as Hi-TrAC/Trac-looping, ChIA-PET and HiChIP. + +There are three steps in the algorithm: 1) cluster the PETs to find +self-ligation clusters, which are candidate peaks; 2) estimate the significance +of candidate peaks with local background; 3) if given control data, further +compare candidate peaks to control data. If running multiple clusterings with +separated parameters, the clusters will be combined and callPeaks will output +the most significant one based on overlaps. + +Key parameters are -eps and -minPts, both are key parameters in the clustering +algorithm blockDBSCAN. Eps indicates the distance that define two points (PETs) +being neighbors, while minPts indicatess the minial number of points required +for a cluster to form. For sharp-peak like data (ATAC-seq, TF ChIC-seq), set +-eps small such as 100 or 150. For broad-peak like data, such as H3K27me3 +ChIP-seq and ChIC-seq, set -eps large as 500 or 1000. + +Eps will affect more than minPts for sensitivity. + +Examples: + 1. call peaks for Trac-looping + cLoops2 callPeaks -d trac -eps 100 -minPts 10 -o trac -p 10 + + 2. call peaks for sharp-peak like ChIC-seq without control data + cLoops2 callPeaks -d ctcf_chic -o ctcf_chic -p 10 + + 3. call peaks for broad-peak like ChIC-seq with IgG as control + cLoops2 callPeaks -d H3K27me3 -bgd IgG -eps 500,1000 -minPts 10 \ + -o H3K27me3 + + 4. call peaks for sharp-peak ChIC-seq with linear fitting scaled control + data + cLoops2 callPeaks -d ctcf -bgd IgG -eps 150 -minPts 10 -o ctcf -p 10\ + -bgm lf + + 5. call peaks with sentitive mode to get comprehensive peaks for CUT&TAG + cLoops2 callPeaks -d H3K27ac -bgd IgG -sen -p 10 + + 6. filter PETs first and then call peaks for H3K27ac HiChIP, resulting much + much accurate peaks + cLoops2 filterPETs -d h3k27ac_hichip -o h3k27ac_hichip_filtered -knn \ + -eps 500 -minPts 5 + cLoops2 callPeaks -d h3k27ac_hichip_filtered -eps 200,500 -minPts 10 \ + -p 10 + + 7. call peaks for interaction data as single-end data + cLoops2 callPeaks -d h3k27ac -o h3k27ac -split -eps 200,500 -minPts 10 \ + -p 10 + + 8. call differential peaks between WT and KO condition + cLoops2 callPeaks -d MLL4_WT -bgd MLL4_KO -o MLL4_WTvsKO -p 10 + cLoops2 callPeaks -d MLL4_KO -bgd MLL4_WT -o MLL4_KOvsWT -p 10 + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs available. Too many CPU could cause out-of-memory problem if there are too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show version of cLoops2. - -tot TOT Target total number of PETs. - ``` - - ------ - ### 10. Call peaks for 1D or 3D data - Run **cLoops2 callPeaks -h** to see details. - ``` - Call peaks based on clustering. - - Well tested work for ChIP-seq, ChIC-seq, ATAC-seq, CUT&RUN -like or the 3D - genomic data such as Hi-TrAC/Trac-looping, ChIA-PET and HiChIP. - - There are three steps in the algorithm: 1) cluster the PETs to find - self-ligation clusters, which are candidate peaks; 2) estimate the significance - of candidate peaks with local background; 3) if given control data, further - compare candidate peaks to control data. If running multiple clusterings with - separated parameters, the clusters will be combined and callPeaks will output - the most significant one based on overlaps. - - Key parameters are -eps and -minPts, both are key parameters in the clustering - algorithm blockDBSCAN. Eps indicates the distance that define two points (PETs) - being neighbors, while minPts indicatess the minial number of points required - for a cluster to form. For sharp-peak like data (ATAC-seq, TF ChIC-seq), set - -eps small such as 100 or 150. For broad-peak like data, such as H3K27me3 - ChIP-seq and ChIC-seq, set -eps large as 500 or 1000. - - Eps will affect more than minPts for sensitivity. - - Examples: - 1. call peaks for Trac-looping - cLoops2 callPeaks -d trac -eps 100 -minPts 10 -o trac -p 10 - - 2. call peaks for sharp-peak like ChIC-seq without control data - cLoops2 callPeaks -d ctcf_chic -o ctcf_chic -p 10 - - 3. call peaks for broad-peak like ChIC-seq with IgG as control - cLoops2 callPeaks -d H3K27me3 -bgd IgG -eps 500,1000 -minPts 10 \ - -o H3K27me3 - - 4. call peaks for sharp-peak ChIC-seq with linear fitting scaled control - data - cLoops2 callPeaks -d ctcf -bgd IgG -eps 150 -minPts 10 -o ctcf -p 10\ - -bgm lf - - 5. call peaks with sentitive mode to get comprehensive peaks for CUT&TAG - cLoops2 callPeaks -d H3K27ac -bgd IgG -sen -p 10 - - 6. filter PETs first and then call peaks for H3K27ac HiChIP, resulting much - much accurate peaks - cLoops2 filterPETs -d h3k27ac_hichip -o h3k27ac_hichip_filtered -knn \ - -eps 500 -minPts 5 - cLoops2 callPeaks -d h3k27ac_hichip_filtered -eps 200,500 -minPts 10 \ - -p 10 - - 7. call peaks for interaction data as single-end data - cLoops2 callPeaks -d h3k27ac -o h3k27ac -split -eps 200,500 -minPts 10 \ - -p 10 - - 8. call differential peaks between WT and KO condition - cLoops2 callPeaks -d MLL4_WT -bgd MLL4_KO -o MLL4_WTvsKO -p 10 - cLoops2 callPeaks -d MLL4_KO -bgd MLL4_WT -o MLL4_KOvsWT -p 10 - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -eps EPS Distance that defines two points (PETs) being neighbors, eps in - blockDBSCAN as key parameter, multiple eps can be assigned such as - 100,200,300 to run multiple clusterings, the results will be combined. - For callPeaks, the default is 100,200. If the data show much more broad - feature such as H3K27me3 and H3K4me1, increase it to 500,1000 or larger. - If expecting both narrow and broad peaks in the data, set -eps 100,200, - 500,1000. - -minPts MINPTS Points required in a cluster, minPts in blockDBSCAN, key parameter, - multiple minPts can be assigned such as 3,5 to run multiple - clusterings, the results will be combined. For callPeaks, the default - is 5. If the data have many reads, increasing minPts such as 10,20. - -pcut PCUT Bonferroni corrected poisson p-value cutoff to determine significant - peaks. Default is 1e-2. - -bgd BGD Assign control data (IgG, Input) directory generated by cLoops2 pre to - carry out analysis. Default is no background. - -bgm {ratio,lf} How to scale the target data with control data. Available options are - 'ratio' and 'lf'. 'ratio' is based on library size and 'lf' means - linear fitting for control and target candidate peaks nearby regions. - Default is 'lf'. The scaling factor estimated by lf usually is a little - larger than ratio. In other words, the higher the scaling factor, the - less sensitive the results. - -pseudo PSEUDO Pseudo counts for local background or control data to estimate the - significance of peaks if no PETs/reads in the background. Default is - 1. Set it larger for noisy data, 0 is recommend for very clean data - such as well prepared CUT&Tag. - -sen Whether to use sensitive mode to call peaks. Default is not. If only a - few peaks were called, while a lot more can be observed - from visualization, try this option. Adjust -pcut or filter by - yourself to select significant ones. - -split Whether to split paired-end as single end data to call peaks. Sometimes - works well for Trac-looping and HiChIP. - -splitExt SPLITEXT When run with -split, the extension to upstraem and downstream, - default is 50. - ``` - - - ------ - ### 11. Call loops - Run **cLoops2 callLoops -h** to see details. - ``` - Call loops based on clustering. - - Well tested work for Hi-TrAC/TrAC-looping, HiCHiP, ChIA-PET and Hi-C. - - Similar to call peaks, there are three main steps in the algorithm: 1) cluster - the PETs to find inter-ligation clusters, which are candidate loops; 2) - estimate the significance of candidate loops with permutated local background. - 3) If -hic option not selected, the loop anchors will be checked for peak-like - features, only peak-like anchors are kept. If running multiple clusterings, - the clusters will be combined and callLoops will output the most significant - one based on overlaps. - - Similar to callPeaks, keys parameters are -eps and -minPts. For sharp-peak like - interaction data, set -eps small such as 500,1000. For broad-peak like data, - such as H3K27ac HiChIP, set -eps big as 1000,2000. For Hi-C and HiChIP data, - bigger -minPts is also needed, such as 20,50. - - Please note that the blockDBSCAN implementation in cLoops2 is much more - sensitive than cDBSCAN in cLoops, so the same parameters can generate quite - different results. With -hic option, cDBSCAN will be used. - - Examples: - 1. call loops for Hi-TrAC/Trac-looping - cLoops2 callLoops -d trac -o trac -eps 200,500,1000,2000 -minPts 5 -w -j - - 2. call loops for Hi-TrAC/Trac-looping with filtering short distance PETs - and using maximal estimated distance cutoff - cLoops2 callLoops -d trac -o trac -eps 200,500,1000,2000 -minPts 5 \ - -cut 1000 -max_cut -w -j - - 3. call loops for Hi-TrAC/Trac-looping and get the PETs with any end - overlapping loop anchors - cLoops2 callLoops -d trac -o trac -eps 200,500,1000,2000 -minPts 5 -w \ - -j -filterPETs - - 4. call loops for high-resolution Hi-C like data - cLoops2 callLoops -d hic -o hic -eps 2000,5000,10000 -minPts 20,50 -w -j - - 5. call inter-chromosomal loops (for most data, there will be no significant - inter-chromosomal loops) - cLoops2 callLoops -d HiC -eps 5000 -minPts 10,20,50,100,200 -w -j -trans\ - -o HiC_trans - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -eps EPS Distance that defines two points (PETs) being neighbors, eps in - blockDBSCAN as key parameter, multiple eps can be assigned such as - 200,500,1000,2000 to run multiple clusterings, the results will be - combined. No default value, please give the input. - -minPts MINPTS Points required in a cluster. minPts in blockDBSCAN is a key parameter. - Empirically 5 is good for TFs and histone modification ChIA-PET data - and Trac-looping. For data like HiChIP and Hi-C, set it larger, like - >=20. The input can be a series, and the final loops will have the - PETs>= max(minPts). - -plot Whether to plot estimated inter-ligation and self-ligation PETs - distance distribution. Default is not to generate a plot. - -i Whether to convert loops to UCSC Interact track to visualize in UCSC. - Default is not, set this flag to save. - -j Whether to convert loops to 2D feature annotations to visualize in - Juicebox. Default is not, set this flag to save. - -w Whether to save tracks of loops to visualize in legacy and new washU. - Default is not, set this flag to save two files. - -max_cut When running cLoops with multiple eps or minPts, multiple distance - cutoffs for self-ligation and inter-ligation PETs will be estimated - based on the overlaps of anchors. Default option is the minimal one - will be used to filter PETs for candidate loop significance test. - Set this flag to use maximal one, will speed up for significance test. - -hic Whether to use statistical cutoffs for Hi-C to output significant loops. - Default is not, set this option to enable. Additionally, with -hic - option, there is no check for anchors requiring they looking like peaks. - -filter Whether to filter raw PETs according to called loops. The filtered - PETs can show clear view of interactions or be used to call loops again. - -trans Whether to call trans- (inter-chromosomal) loops. Default is not, set - this flag to call. For most common cases, not recommended, only for - data there are obvious visible trans loops. - -emPair By default eps and minPts combinations will be used to run clustering. - With this option, for example eps=500,1000 and minPts=5,10, only (500,5) - and (1000,10) as parameters of clustering will be run. Input number of - eps and minPts should be same. - - ``` - - ------ - ### 12. Call differentially enriched intra-chromosomal loops - Run **cLoops2 callDiffLoops -h** to see details. - ``` - Call differentially enriched intra-chromosomal loops between two conditions. - - Similar to calling peaks with control data, calling differentially enriched - loops is based on scaled PETs and the Poisson test. There are three main steps - in the algorithm: 1) merge the overlapped loops, quantify them and their - permutated local background regions; 2) fit the linear transformation of - background target interaction density to control background data based on - MANorm2; therefore, if there are more than than two samples, others can be - scaled to the reference sample for quantitative comparison; 3) estimate the - fold change (M) cutoff and average (A) cutoff using the background data with - the control of FDR, assuming there should no differentially significant - interactions called from the background data; or using the assigned cutoffs; 4) - estimate the significance based on the Poisson test for transformed data, both - for the loop and loop anchors. For example, if transformed PETs for target is - 5, PETs for control is 3 while control nearby permutated background median is - 4, then for the Poisson test, lambda=4-1 is used to test the observed 5 to call - p-value. - - Example: - 1. classical usage - cLoops2 callDiffLoops -tloop target_loop.txt -cloop control_loop.txt \ - -td ./target -cd ./control -o target_diff - - 2. customize MA cutoffs - cLoops2 callDiffLoops -tloop target_loop.txt -cloop control_loop.txt \ - -td ./target -cd ./control -o target_diff -cutomize \ - -acut 5 -mcut 0.5 - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -tloop TLOOP The target loops in _loop.txt file called by cLoops2. - -cloop CLOOP The control loops in _loop.txt file called by cLoops2. - -td TPRED The data directory generated by cLoops2 for target data. - -cd CPRED The data directory generated by cLoops2 for control data. - -pcut PCUT Poisson p-value cutoff to determine significant differentially - enriched loops after Bonferroni correction , default is 1e-2. - -igp Ignore Poisson p-value cutoff and only using FDR to control MA plot - cutoffs. - -noPCorr Do not performe Bonferroni correction of Poisson p-values. Will get - more loops. Default is always performing. - -fdr FDR FDR cutoff for estimating fold change (M) and average value (A) after - normalization with background data. Default is 0.1. - -j Whether to convert loops to 2D feature annotations to visualize in - Juicebox. Default is not, set this flag to save. - -w Whether to save tracks of loops to visualize in legacy and new washU. - Default is not, set this flag to save two files. - -customize Whether to use cutomized cutoffs of MA plot. Defulat is not. If enable - -acut and -mcut is needed. - -cacut CACUT Average cutoff for MA plot of normalized PETs of loops. Assign when - -customize option used. - -cmcut CMCUT Fold change cutoff for MA plot of normalized PETs of loops. Assign when - -customize option used. - -vmin VMIN The minimum value shown in the heatmap and colorbar. - -vmax VMAX The maxmum value shown in the heatmap and colorbar. - -cmap {summer,red,div,cool} - The heatmap style. Default is summer. - - - ``` - - ------ - ### 13. Call domains - Run **cLoops2 callDomains -h** to see details. - ``` - Call domains for the 3D genomic data based on correlation matrix and local - segregation score. - - Well tested work for Hi-TrAC/Trac-looping data. - - Examples: - 1. call Hi-C like TADs - cLoops2 callDomains -d trac -o trac -bs 5000,10000 -ws 500000 -p 20 - - 2. call Hi-TrAC/Trac-looping specific small domains - cLoops2 callDomains -d trac -o trac -bs 1000 -ws 100000 -p 20 - - 3. call domains for Hi-C - cLoops2 callDomains -d hic -o hic -bs 10000 -ws 500000 -hic - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -bs BINSIZE Candidate contact matrix resolution (bin size) to call domains. A - series of values or a single value can be used as input. Default is - 10000. If given multiple values, callDomains will try to call nested - domains. Samll value may lead to samller domains. - -ws WINSIZE The half of the sliding window size used to caculate local correlation, - Default is 500000 (500kb). Larger value may lead to larger domains. - -hic Whether to use cutoffs for Hi-C to output significant domains. - Default is not. Set this option to enable, cutoffs will be more loose. - ``` - - ------ - ### 14. Plot the interaction as heatmap/scatter/arches, 1D signals, peaks, loops and domains - Run **cLoops2 plot -h** to see details. - ``` - Plot the interaction data as a heatmap (or arches/scatter) with additional of - virtual 4C view point, 1D tracks (bigWig files), 1D annotations (peaks, genes) - and 2D annotations (domains). If -f is not assigned, will just plot profiles - from bigWig file or bed files. - - Examples: - 1. plot the simple square heatmap for a specific region with 1kb resolution - with genes - cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 1000 -start 34840000 \ - -end 34895000 -log -gtf test.gtf - - 2. plot the upper triangle heatmap with domains such as TAD and CTCF bigWig - track - cLoops2 plot -f test/chr21-chr21.ixy -o test_domain -bs 10000 \ - -start 34600000 -end 35500000 -domains HiC_TAD.bed -log \ - -triu -bws GM12878_CTCF_chr21.bw - - 3. plot the heatmap as upper triangle with 1D signal track and filter the - PETs shorter than 1kb - cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 500 -start 34840000 \ - -end 34895000 -log -triu -1D -cut 1000 - - 4. plot the observation/expectation interaction heatmap with 1D signal - cLoops2 plot -f test/chr21-chr21.ixy -o test -m obs/exp -1D -triu \ - -bs 500 -start 34840000 -end 34895000 - - 5. plot the chromosome-wide correlation heatmap - cLoops2 plot -f test/chr21-chr21.ixy -o test -corr - - 6. plot upper triangle interaction heatmap together with genes, bigWig - files, peaks, loops, domains, control the heatmap scale - cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 500 -start 34840000 \ - -end 34895000 -triu -bws ATAC.bw,CTCF.bw -1D \ - -loop test_loops.txt -beds Enh.bed,Tss.bed \ - -domains tad.bed -m obs -log -vmin 0.2 -vmax 2 -gtf genes.gtf - - 7. plot small regions interacting PETs as arches - cLoops2 plot -f test/chr21-chr21.ixy -o test -start 46228500 \ - -end 46290000 -1D -loops gm_loops.txt -arch -aw 0.05 - - 8. plot small regions interacting PETs as scatter plot - cLoops2 plot -f test/chr21-chr21.ixy -o test -start 46228500 \ - -end 46290000 -1D -loops gm_loops.txt -scatter - - 9. plot Hi-C compartments and eigenvector - cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 100000 -log -corr -eig - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -f FIXY Input .ixy file generated by cLoops2 pre. If not assigned, no heatmaps - or arches will be shown and -chrom is needed to generate plots similar - to IGV or other browser. - -bs BINSIZE Bin size/matrix resolution (bp) to generate the contact matrix for - plotting, default is 5000 bp. - -chrom CHROM Chromosome for the target region if -f is not assigned. - -start START Start genomic coordinate for the target region. Default is 0. - -end END End genomic coordinate for the target region. Default is to infer - from the data. - -loops FLOOP The _loop.txt file generated by cLoops2, will be used to plot loops as - arches. - -loopCut LOOPCUT Only show loops with more than loopCut PETs. Default is 0. - -domains FDOMAIN The domains need to annotated in the heatmap such as TADs, should be - .bed file. - -beds BEDS BED tracks of genomic features to plot above the heatmap, such as - promoters and enhancers, track name will be inferred from file name, - for example enhancer.bed,promoter.bed. - -gtf GTF GTF track of genes to plot above the heatmap. - -bws BWS BigWig tracks to plot above the heatmap, track name will be inferred - from file name, for example a.bw,b.bw,c.bw. - -bwvs BWVS BigWig tracks y-axis limitations. Default is atuo-determined. Assign - as 'vmin,vmax;vmin,vmax;vmin,vmax'. For example, '0,1;;0,1' for three - bigWig tracks, as the second track kept atuo-determined. Due to - argparse limitation for parsing minus value, also can be assigned as - vmax,vmin. - -bwcs BWCS BigWig tracks colors. Default is atuo-determined. Assign as - 0,1,2 for three bigWig tracks. Values seperated by comma. - -log Whether to log transform the matrix. - -m {obs,obs/exp} The type of matrix to plot, observed matrix or observed/expected - matrix, expected matrix will be generated by shuffling PETs, default - is observed. - -corr Whether to plot the correlation matrix. Default is not. Correlation - heatmap will use dark mode color map, used together with obs method. - -norm Whether to normalize the matrix with z-score. - -triu Whether to rotate the heatmap only show upper triangle, default is - False. - -vmin VMIN The minimum value shown in the heatmap and colorbar. - -vmax VMAX The maxmum value shown in the heatmap and colorbar. - -1D Whether to plot the pileup 1D signal for the region. Default is not. - Please note, the 1D signal is aggregated from the visualization region. - If want to check the signal from each position of all genome/chromosome, - use cLoops2 dump -bdg to get the bigWig file. - -1Dv ONEDV 1D profile y-axis limitations. Default is auto-determined. Assign as - vmin,vmax, for example 0,1. - -virtual4C Whether to plot the virtual 4C view point 1D signal. Default is not. - If assigned, -view_start and -view_end are needed. - -view_start VIEWSTART - Start genomic coordinate for the view point start region, only valid - when -vitrutal4C is set, should >=start and <=end. - -view_end VIEWEND End genomic coordinate for the view point end region, only valid - when -vitrutal4C is set, should >=start and <=end. - -4Cv VIEWV Virtual 4C profile y-axis limitations. Default is auto-determined. - Assign as vmin,vmax, for example 0,1. - -arch Whether to plot interacting PETs as arches. Default is not. If - set, only original one PET one arch will be shown. Usefule to check - small region for raw data, especially when heatmap is not clear. - -aw AW Line width for each PET in arches plot. Default is 1. Try to - change it if too many or few PETs. - -ac AC Line color for each PET in arches plot. Default is 4. Try to - change it see how many colors are supported by cLoops2. - -aa AA Alpha to control arch color saturation. Default is 1. - -scatter Whether to plot interacting PETs as scatter dots. Default is not. - If set, only original one PET one dot will be shown. Usefule to check - raw data, especially when heatmap is not clear that -vmax is too small. - -ss SS Dot size for each PET in scatter plot. Default is 1. Try to - change it to optimize the plot. - -sc SC Dot color for each PET in scatter plot. Default is 0. Try to - change it see how many colors are supported by cLoops2. - -sa SA Alpha to control dot color saturation. Default is 1. - -eig Whether to plot the PC1 of correlation matirx to show compartments - Default is not. Only work well for big regions such as resolution - of 100k. - -eig_r Whether to flip the PC1 values of -eig. It should be dependend on - inactivate or activate histone markers, as actually the PCA values do - not have directions, especially comparing different samples. - -figWidth {4,8} Figure width. 4 is good to show the plot as half of a A4 figure - width and 8 is good to show more wider. Default is 4. - - - ``` - - ------ - ### 15. Montage analysis for regions of interactions - Run **cLoops2 montage -h** to see details. - ``` - Montage analysis of specific regions, producing Westworld Season 3 -like - Rehoboam plot. - - Examples: - 1. showing all PETs for a gene's promoter and enhancers - cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test - - 2. showing simplified PETs for a gene's promoter and enhancers - cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test -simple - - 3. adjust interacting link width - cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test -simple \ - -ppmw 10 - - 4. showing all PETs for a region, if in the bed file only contains one region - cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test -ext 0 - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -f FIXY Input .ixy file generated by cLoops2 pre. - -bed BED Input .bed file for target regions, 4th columns should be id/name for - the region. - -ext EXT Up-stream and down-stream extesion of target region length. Default is - 2. If the input bed already include up/down-stream regions, assign as 0. - -simple Whether to only draw the representative interactions between two target - regions as one arch, and not include the interactions in extended - regions. Default is not, all interactions will be shown as archs.. - -vp VIEWPOINT Only show interactions with specific regions from all other regions. - Name/id (4th column in .bed file) is need. Default is to show all - releated interactions. Multiple names/ids can be assigned by seperation - of comma. - -vmin VMIN The minial scale for 1D pileup data. Default will be inferred from the - data. - -vmax VMAX The maxmial scale for 1D pileup data. Default will be inferred from the - data. - -ppmw PPMW Link line width indicator, short for 1 PETs per Million PETs line - width, default is 10. Adjust this value when -simple is used. Decrease - it if links are too bold and increase it when links are too thin. - -aw AW Line width for each PET if -simple is not selected. Default is 1. - -no1D Whether to not plot 1D profiles. Default is plot. Set this for Hi-C - like data. - ``` - - ------ - ### 16. Aggregation analysis for peaks, loops and domains - Run **cLoops2 agg -h** to see details. - ``` - Do the aggregation analysis for peaks, loops, view points and domains. - - The output figures can be used directly, and the data to generate the plot are - also saved for further customized analysis. - - For the aggregated peaks analysis,input is a .bed file annotated with the - coordinates for the target regions/peaks/anchors. Output is a .pdf file - containing a mean density plot and heatmap and a .txt file for the data. The - data in the .txt file and plot were normalized to RPM (reads per million). - - For the aggregated view points analysis, input is a .bed file annotated with - coordinates for the target regions/peaks/anchors as view point. Output is a - .pdf file containing a mean density plot and heatmap and a .txt file for the - data. The data in the .txt file and plot were normalized to - log2( RPM (reads per million)+1). - - For the aggregated loops analysis, input is a _loops.txt file annotated with - the coordinates for target loops, similar to the format of BEDPE. Output is a - .pdf file for mean heatmap and .npz file generated through numpy.savez for all - loops and nearby regions matrix. The enrichment score (ES) in the plot is - calculated as: ES = mean( (PETs in loop)/(mean PETs of nearby regions) ). Other - files except _loops.txt can be used as input, as long as the file contains key - information in the first columns separated by tabs: - loopId chrA startA endA chrB startB endB distance - loop-1 chr21 1000 2000 chr21 8000 9000 7000 - - There is another option for loops analysis, termed as two anchors. Input file is - same to aggregated loops analysis. The whole region with assigned extesion - between two anchors will be aggregated and 1D profile can show two anchors. The - analysis could be usefule to study/comapre different classes of anchors and - combinations, for example, considering CTCT motif directions, all left anchors - CTCF motifs are in positive strand and in negative strand for all right anchors. - It could be interesting for some loops one anchor only bound by transcription - factor a and another anchor only bound by transcription b. - - For the aggregated domains analysis, input is a .bed file annotated with the - coordinates for the domains, such as TADs. Output are a .pdf file for the upper - triangular heatmap and .npz file generated through numpy.savez for all domains - and nearby region matrix. The enrichment score (ES) in the plot is calculated - as mean( (two ends both with in domain PETs number)/( only one end in domain - PETs number) ). - - Examples: - 1. show aggregated peaks heatmap and profile - cLoops2 agg -d test -peaks peaks.bed -o test -peak_ext 2500 \ - -peak_bins 200 -peak_norm -skipZeros - - 2. show aggregated view points and aggregated bigWig signal - cLoops2 agg -d test -o test -viewPoints test_peaks.bed -bws CTCF.bw - - 3. show aggregated loops heatmap, 1D profile and aggregated bigWig signal - cLoops2 agg -d test -o test -loops test_loops.txt -bws CTCF.bw -1D \ - -loop_norm - - 3. show aggregated loops heatmap, 1D profile and aggregated bigWig signal - in two anchors mode - cLoops2 agg -d test -o test -twoAnchors test_loops.txt -bws CTCF.bw -1D \ - -loop_norm - - 4. show aggregated domains heatmap, 1D profile and aggregated bigWig signal - cLoops2 agg -d test -o test -domains TAD.bed -bws CTCF.bw -1D - - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -peaks PEAKF The .bed file for peaks-centric aggregation analysis. - -peak_ext PEAK_EXT The nearby upstream and downstream regions (bp) from the peak center. - Default is 5000. - -peak_bins PEAK_BINS The bin size for the profile array of peaks. Default is 100. - -peak_norm Whether to normalize the data in the peaks profile plot and - heatmap with row-wise z-score. Default is not. - -viewPoints VIEWPOINTF - The .bed file for view points -centric aggregation analysis. - -viewPointUp VIEWPOINTUP - The upstream regions included for the aggreaged view points analysis. - Default is 100000 bp. - -viewPointDown VIEWPOINTDOWN - The downstream regions included for the aggreaged view points analysis. - Default is 100000 bp. - -viewPointBs VIEWPOINTBS - Contact matrix bin size for view points heatmap. Default is 1000 bp. - -viewPoint_norm Whether to normalize the sub-matrix for each loop as divide the mean - PETs for the matrix. Default is not. - -loops LOOPF The _loop.txt file generated by cLoops2 for loops-centric - aggregation analysis. The file first 8 columns are necessary. - -loop_ext LOOP_EXT The nearby regions included to plot in the heatmap and calculation of - enrichment for aggregation loop analysis, default is 10, should be - even number. - -loop_cut LOOP_CUT Distance cutoff for loops to filter. Default is 0. - -loop_norm Whether to normalize the sub-matrix for each loop as divide the mean - PETs for the matrix (except the loop region). Default is not. - -twoAnchors TWOANCHORSF - The similar _loop.txt file generated by cLoops2 for two anchors - aggregation analysis. The file first 8 columns are necessary. - -twoAnchor_ext TWOANCHOR_EXT - The nearby regions of fold included to plot in heatmap. - Default is 0.1. - -twoAnchor_vmin TWOANCHOR_VMIN - The minimum value shown in the domain heatmap and colorbar. - -twoAnchor_vmax TWOANCHOR_VMAX - The maxmum value shown in the domain heatmap and colorbar. - -domains DOMAINF The .bed file annotated the domains such as TADs for aggregated - domains-centric analysis. - -domain_ext DOMAIN_EXT - The nearby regions of fold included to plot in heatmap and - caculation of enrichment, default is 0.5. - -domain_vmin DOMAIN_VMIN - The minimum value shown in the domain heatmap and colorbar. - -domain_vmax DOMAIN_VMAX - The maxmum value shown in the domain heatmap and colorbar. - -1D Whether to plot the pileup 1D signal for aggregated loops, - aggregated view points or aggregated domains. Default is not. - -bws BWS BigWig tracks to plot above the aggregated loops heatmap (or under - the aggregated domains heatmap), track name will be inferred from file - name, for example a.bw,b.bw,c.bw. - -skipZeros Whether to remove all 0 records. Default is not. - - ``` - - ------ - ### 17. Quantification of peaks, loops and domains - Run **cLoops2 quant -h** to see details. - ``` - Quantify the peaks, loops and domains. The output file will be the same as - outputs of callPeaks, callLoops and callDomains. - - Examples: - 1. quantify peaks - cLoops2 quant -d test -peaks peaks.bed -o test - - 2. quantify loops - cLoops2 quant -d test -loops test_loops.txt -o test - - 3. quantify domains - cLoops2 quant -d test -domains test_domains.txt -o test - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -peaks PEAKF The .bed file for peaks-centric quantification. - -loops LOOPF The _loop.txt file generated by cLoops2 for loops-centric - quantification, as long as there are first 8 columns. - -domains DOMAINF The _domains.txt file generated by cLoops2 for domains-centric - quantification, as long as there are first 3 columns - -domain_bs DOMAINBINSIZE - Candidate contact matrix resolution (bin size) to quantify domains, - default is 10000. Only one integer is supported. - -domain_ws DOMAINWINSIZE - The half window size used to calculate local correlation to quantify - domains. Default is 500000 (500kb). - -domain_bdg Whether to save the segregation score ad bedGraph file, default. - is not. - ``` - - ------ - ### 18. Annotation of loops to genes - Run **cLoops2 anaLoops -h** to see details. - ``` - Annotating loops: - - find the closest TSS for each loop anchors - - merge the loop anchors and classify them as enhancers or promoters based on - distance to nearest TSS - - build the interaction networks for merged anchors - - find the all interacted enhancers/promoters for each promoter - - Basic mode 1: with -gtf, loops will be annotated as enhancer or promoter based - on distance to nearest gene. If a anchor overlapped with two/multiple promoters - (often seen for close head-to-head genes), all will be reported. If no TSS - overlaps, then nearest one will be assigned. - - Basic mode 2: with -gtf -net, overlapped anchors will be merged and annoated as - enhancer or promoter considering distance to genes. For each promoter, all - linked enhancer and promoter will be shown. If there are more than 3 direct or - indirect enhancers for a promoter, HITS algorithm will be used to identify one - hub for indirect enhancer and one hub for indirect enhancer. - - Examples: - 1. annotate loops for target gene, basic mode 1 - cLoops2 anaLoops -loops test_loops.txt -gtf genecode.gtf - - 2. annotate loops for target transcripts (alternative TSS), basic mode 1 - cLoops2 anaLoops -loops test_loops.txt -gtf genecode.gtf -tid - - 3. find a gene's all linked enhancer or promoter, basic mode 2 - cLoops2 anaLoops -loops test_loops.txt -gtf genecode.gtf -net - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + -eps EPS Distance that defines two points (PETs) being neighbors, eps in + blockDBSCAN as key parameter, multiple eps can be assigned such as + 100,200,300 to run multiple clusterings, the results will be combined. + For callPeaks, the default is 100,200. If the data show much more broad + feature such as H3K27me3 and H3K4me1, increase it to 500,1000 or larger. + If expecting both narrow and broad peaks in the data, set -eps 100,200, + 500,1000. + -minPts MINPTS Points required in a cluster, minPts in blockDBSCAN, key parameter, + multiple minPts can be assigned such as 3,5 to run multiple + clusterings, the results will be combined. For callPeaks, the default + is 5. If the data have many reads, increasing minPts such as 10,20. + -pcut PCUT Bonferroni corrected poisson p-value cutoff to determine significant + peaks. Default is 1e-2. + -bgd BGD Assign control data (IgG, Input) directory generated by cLoops2 pre to + carry out analysis. Default is no background. + -bgm {ratio,lf} How to scale the target data with control data. Available options are + 'ratio' and 'lf'. 'ratio' is based on library size and 'lf' means + linear fitting for control and target candidate peaks nearby regions. + Default is 'lf'. The scaling factor estimated by lf usually is a little + larger than ratio. In other words, the higher the scaling factor, the + less sensitive the results. + -pseudo PSEUDO Pseudo counts for local background or control data to estimate the + significance of peaks if no PETs/reads in the background. Default is + 1. Set it larger for noisy data, 0 is recommend for very clean data + such as well prepared CUT&Tag. + -sen Whether to use sensitive mode to call peaks. Default is not. If only a + few peaks were called, while a lot more can be observed + from visualization, try this option. Adjust -pcut or filter by + yourself to select significant ones. + -split Whether to split paired-end as single end data to call peaks. Sometimes + works well for Trac-looping and HiChIP. + -splitExt SPLITEXT When run with -split, the extension to upstraem and downstream, + default is 50. +``` + + +------ +### 11. Call loops +Run **cLoops2 callLoops -h** to see details. +``` +Call loops based on clustering. + +Well tested work for Hi-TrAC/TrAC-looping, HiCHiP, ChIA-PET and Hi-C. + +Similar to call peaks, there are three main steps in the algorithm: 1) cluster +the PETs to find inter-ligation clusters, which are candidate loops; 2) +estimate the significance of candidate loops with permutated local background. +3) If -hic option not selected, the loop anchors will be checked for peak-like +features, only peak-like anchors are kept. If running multiple clusterings, +the clusters will be combined and callLoops will output the most significant +one based on overlaps. + +Similar to callPeaks, keys parameters are -eps and -minPts. For sharp-peak like +interaction data, set -eps small such as 500,1000. For broad-peak like data, +such as H3K27ac HiChIP, set -eps big as 1000,2000. For Hi-C and HiChIP data, +bigger -minPts is also needed, such as 20,50. + +Please note that the blockDBSCAN implementation in cLoops2 is much more +sensitive than cDBSCAN in cLoops, so the same parameters can generate quite +different results. With -hic option, cDBSCAN will be used. + +Examples: + 1. call loops for Hi-TrAC/Trac-looping + cLoops2 callLoops -d trac -o trac -eps 200,500,1000,2000 -minPts 5 -w -j + + 2. call loops for Hi-TrAC/Trac-looping with filtering short distance PETs + and using maximal estimated distance cutoff + cLoops2 callLoops -d trac -o trac -eps 200,500,1000,2000 -minPts 5 \ + -cut 1000 -max_cut -w -j + + 3. call loops for Hi-TrAC/Trac-looping and get the PETs with any end + overlapping loop anchors + cLoops2 callLoops -d trac -o trac -eps 200,500,1000,2000 -minPts 5 -w \ + -j -filterPETs + + 4. call loops for high-resolution Hi-C like data + cLoops2 callLoops -d hic -o hic -eps 2000,5000,10000 -minPts 20,50 -w -j + + 5. call inter-chromosomal loops (for most data, there will be no significant + inter-chromosomal loops) + cLoops2 callLoops -d HiC -eps 5000 -minPts 10,20,50,100,200 -w -j -trans\ + -o HiC_trans + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -eps EPS Distance that defines two points (PETs) being neighbors, eps in + blockDBSCAN as key parameter, multiple eps can be assigned such as + 200,500,1000,2000 to run multiple clusterings, the results will be + combined. No default value, please give the input. + -minPts MINPTS Points required in a cluster. minPts in blockDBSCAN is a key parameter. + Empirically 5 is good for TFs and histone modification ChIA-PET data + and Trac-looping. For data like HiChIP and Hi-C, set it larger, like + >=20. The input can be a series, and the final loops will have the + PETs>= max(minPts). + -plot Whether to plot estimated inter-ligation and self-ligation PETs + distance distribution. Default is not to generate a plot. + -i Whether to convert loops to UCSC Interact track to visualize in UCSC. + Default is not, set this flag to save. + -j Whether to convert loops to 2D feature annotations to visualize in + Juicebox. Default is not, set this flag to save. + -w Whether to save tracks of loops to visualize in legacy and new washU. + Default is not, set this flag to save two files. + -max_cut When running cLoops with multiple eps or minPts, multiple distance + cutoffs for self-ligation and inter-ligation PETs will be estimated + based on the overlaps of anchors. Default option is the minimal one + will be used to filter PETs for candidate loop significance test. + Set this flag to use maximal one, will speed up for significance test. + -hic Whether to use statistical cutoffs for Hi-C to output significant loops. + Default is not, set this option to enable. Additionally, with -hic + option, there is no check for anchors requiring they looking like peaks. + -filter Whether to filter raw PETs according to called loops. The filtered + PETs can show clear view of interactions or be used to call loops again. + -trans Whether to call trans- (inter-chromosomal) loops. Default is not, set + this flag to call. For most common cases, not recommended, only for + data there are obvious visible trans loops. + -emPair By default eps and minPts combinations will be used to run clustering. + With this option, for example eps=500,1000 and minPts=5,10, only (500,5) + and (1000,10) as parameters of clustering will be run. Input number of + eps and minPts should be same. + +``` + +------ +### 12. Call differentially enriched intra-chromosomal loops +Run **cLoops2 callDiffLoops -h** to see details. +``` +Call differentially enriched intra-chromosomal loops between two conditions. + +Similar to calling peaks with control data, calling differentially enriched +loops is based on scaled PETs and the Poisson test. There are three main steps +in the algorithm: 1) merge the overlapped loops, quantify them and their +permutated local background regions; 2) fit the linear transformation of +background target interaction density to control background data based on +MANorm2; therefore, if there are more than than two samples, others can be +scaled to the reference sample for quantitative comparison; 3) estimate the +fold change (M) cutoff and average (A) cutoff using the background data with +the control of FDR, assuming there should no differentially significant +interactions called from the background data; or using the assigned cutoffs; 4) +estimate the significance based on the Poisson test for transformed data, both +for the loop and loop anchors. For example, if transformed PETs for target is +5, PETs for control is 3 while control nearby permutated background median is +4, then for the Poisson test, lambda=4-1 is used to test the observed 5 to call +p-value. + +Example: + 1. classical usage + cLoops2 callDiffLoops -tloop target_loop.txt -cloop control_loop.txt \ + -td ./target -cd ./control -o target_diff + + 2. customize MA cutoffs + cLoops2 callDiffLoops -tloop target_loop.txt -cloop control_loop.txt \ + -td ./target -cd ./control -o target_diff -cutomize \ + -acut 5 -mcut 0.5 + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs available. Too many CPU could cause out-of-memory problem if there are too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show version of cLoops2. - -loops FLOOP The _loop.txt file generated by cLoops2 callLoops or callDiffLoops. - -gtf GTF GTF file annotation for genes. - -tid Whether to use transcript id instead of gene id for annotation. Default + -tloop TLOOP The target loops in _loop.txt file called by cLoops2. + -cloop CLOOP The control loops in _loop.txt file called by cLoops2. + -td TPRED The data directory generated by cLoops2 for target data. + -cd CPRED The data directory generated by cLoops2 for control data. + -pcut PCUT Poisson p-value cutoff to determine significant differentially + enriched loops after Bonferroni correction , default is 1e-2. + -igp Ignore Poisson p-value cutoff and only using FDR to control MA plot + cutoffs. + -noPCorr Do not performe Bonferroni correction of Poisson p-values. Will get + more loops. Default is always performing. + -fdr FDR FDR cutoff for estimating fold change (M) and average value (A) after + normalization with background data. Default is 0.1. + -j Whether to convert loops to 2D feature annotations to visualize in + Juicebox. Default is not, set this flag to save. + -w Whether to save tracks of loops to visualize in legacy and new washU. + Default is not, set this flag to save two files. + -customize Whether to use cutomized cutoffs of MA plot. Defulat is not. If enable + -acut and -mcut is needed. + -cacut CACUT Average cutoff for MA plot of normalized PETs of loops. Assign when + -customize option used. + -cmcut CMCUT Fold change cutoff for MA plot of normalized PETs of loops. Assign when + -customize option used. + -vmin VMIN The minimum value shown in the heatmap and colorbar. + -vmax VMAX The maxmum value shown in the heatmap and colorbar. + -cmap {summer,red,div,cool} + The heatmap style. Default is summer. + + +``` + +------ +### 13. Call domains +Run **cLoops2 callDomains -h** to see details. +``` +Call domains for the 3D genomic data based on correlation matrix and local +segregation score. + +Well tested work for Hi-TrAC/Trac-looping data. + +Examples: + 1. call Hi-C like TADs + cLoops2 callDomains -d trac -o trac -bs 5000,10000 -ws 500000 -p 20 + + 2. call Hi-TrAC/Trac-looping specific small domains + cLoops2 callDomains -d trac -o trac -bs 1000 -ws 100000 -p 20 + + 3. call domains for Hi-C + cLoops2 callDomains -d hic -o hic -bs 10000 -ws 500000 -hic + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -bs BINSIZE Candidate contact matrix resolution (bin size) to call domains. A + series of values or a single value can be used as input. Default is + 10000. If given multiple values, callDomains will try to call nested + domains. Samll value may lead to samller domains. + -ws WINSIZE The half of the sliding window size used to caculate local correlation, + Default is 500000 (500kb). Larger value may lead to larger domains. + -hic Whether to use cutoffs for Hi-C to output significant domains. + Default is not. Set this option to enable, cutoffs will be more loose. +``` + +------ +### 14. Plot the interaction as heatmap/scatter/arches, 1D signals, peaks, loops and domains +Run **cLoops2 plot -h** to see details. +``` +Plot the interaction data as a heatmap (or arches/scatter) with additional of +virtual 4C view point, 1D tracks (bigWig files), 1D annotations (peaks, genes) +and 2D annotations (domains). If -f is not assigned, will just plot profiles +from bigWig file or bed files. + +Examples: + 1. plot the simple square heatmap for a specific region with 1kb resolution + with genes + cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 1000 -start 34840000 \ + -end 34895000 -log -gtf test.gtf + + 2. plot the upper triangle heatmap with domains such as TAD and CTCF bigWig + track + cLoops2 plot -f test/chr21-chr21.ixy -o test_domain -bs 10000 \ + -start 34600000 -end 35500000 -domains HiC_TAD.bed -log \ + -triu -bws GM12878_CTCF_chr21.bw + + 3. plot the heatmap as upper triangle with 1D signal track and filter the + PETs shorter than 1kb + cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 500 -start 34840000 \ + -end 34895000 -log -triu -1D -cut 1000 + + 4. plot the observation/expectation interaction heatmap with 1D signal + cLoops2 plot -f test/chr21-chr21.ixy -o test -m obs/exp -1D -triu \ + -bs 500 -start 34840000 -end 34895000 + + 5. plot the chromosome-wide correlation heatmap + cLoops2 plot -f test/chr21-chr21.ixy -o test -corr + + 6. plot upper triangle interaction heatmap together with genes, bigWig + files, peaks, loops, domains, control the heatmap scale + cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 500 -start 34840000 \ + -end 34895000 -triu -bws ATAC.bw,CTCF.bw -1D \ + -loop test_loops.txt -beds Enh.bed,Tss.bed \ + -domains tad.bed -m obs -log -vmin 0.2 -vmax 2 -gtf genes.gtf + + 7. plot small regions interacting PETs as arches + cLoops2 plot -f test/chr21-chr21.ixy -o test -start 46228500 \ + -end 46290000 -1D -loops gm_loops.txt -arch -aw 0.05 + + 8. plot small regions interacting PETs as scatter plot + cLoops2 plot -f test/chr21-chr21.ixy -o test -start 46228500 \ + -end 46290000 -1D -loops gm_loops.txt -scatter + + 9. plot Hi-C compartments and eigenvector + cLoops2 plot -f test/chr21-chr21.ixy -o test -bs 100000 -log -corr -eig + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -f FIXY Input .ixy file generated by cLoops2 pre. If not assigned, no heatmaps + or arches will be shown and -chrom is needed to generate plots similar + to IGV or other browser. + -bs BINSIZE Bin size/matrix resolution (bp) to generate the contact matrix for + plotting, default is 5000 bp. + -chrom CHROM Chromosome for the target region if -f is not assigned. + -start START Start genomic coordinate for the target region. Default is 0. + -end END End genomic coordinate for the target region. Default is to infer + from the data. + -loops FLOOP The _loop.txt file generated by cLoops2, will be used to plot loops as + arches. + -loopCut LOOPCUT Only show loops with more than loopCut PETs. Default is 0. + -domains FDOMAIN The domains need to annotated in the heatmap such as TADs, should be + .bed file. + -beds BEDS BED tracks of genomic features to plot above the heatmap, such as + promoters and enhancers, track name will be inferred from file name, + for example enhancer.bed,promoter.bed. + -gtf GTF GTF track of genes to plot above the heatmap. + -bws BWS BigWig tracks to plot above the heatmap, track name will be inferred + from file name, for example a.bw,b.bw,c.bw. + -bwvs BWVS BigWig tracks y-axis limitations. Default is atuo-determined. Assign + as 'vmin,vmax;vmin,vmax;vmin,vmax'. For example, '0,1;;0,1' for three + bigWig tracks, as the second track kept atuo-determined. Due to + argparse limitation for parsing minus value, also can be assigned as + vmax,vmin. + -bwcs BWCS BigWig tracks colors. Default is atuo-determined. Assign as + 0,1,2 for three bigWig tracks. Values seperated by comma. + -log Whether to log transform the matrix. + -m {obs,obs/exp} The type of matrix to plot, observed matrix or observed/expected + matrix, expected matrix will be generated by shuffling PETs, default + is observed. + -corr Whether to plot the correlation matrix. Default is not. Correlation + heatmap will use dark mode color map, used together with obs method. + -norm Whether to normalize the matrix with z-score. + -triu Whether to rotate the heatmap only show upper triangle, default is + False. + -vmin VMIN The minimum value shown in the heatmap and colorbar. + -vmax VMAX The maxmum value shown in the heatmap and colorbar. + -1D Whether to plot the pileup 1D signal for the region. Default is not. + Please note, the 1D signal is aggregated from the visualization region. + If want to check the signal from each position of all genome/chromosome, + use cLoops2 dump -bdg to get the bigWig file. + -1Dv ONEDV 1D profile y-axis limitations. Default is auto-determined. Assign as + vmin,vmax, for example 0,1. + -virtual4C Whether to plot the virtual 4C view point 1D signal. Default is not. + If assigned, -view_start and -view_end are needed. + -view_start VIEWSTART + Start genomic coordinate for the view point start region, only valid + when -vitrutal4C is set, should >=start and <=end. + -view_end VIEWEND End genomic coordinate for the view point end region, only valid + when -vitrutal4C is set, should >=start and <=end. + -4Cv VIEWV Virtual 4C profile y-axis limitations. Default is auto-determined. + Assign as vmin,vmax, for example 0,1. + -arch Whether to plot interacting PETs as arches. Default is not. If + set, only original one PET one arch will be shown. Usefule to check + small region for raw data, especially when heatmap is not clear. + -aw AW Line width for each PET in arches plot. Default is 1. Try to + change it if too many or few PETs. + -ac AC Line color for each PET in arches plot. Default is 4. Try to + change it see how many colors are supported by cLoops2. + -aa AA Alpha to control arch color saturation. Default is 1. + -scatter Whether to plot interacting PETs as scatter dots. Default is not. + If set, only original one PET one dot will be shown. Usefule to check + raw data, especially when heatmap is not clear that -vmax is too small. + -ss SS Dot size for each PET in scatter plot. Default is 1. Try to + change it to optimize the plot. + -sc SC Dot color for each PET in scatter plot. Default is 0. Try to + change it see how many colors are supported by cLoops2. + -sa SA Alpha to control dot color saturation. Default is 1. + -eig Whether to plot the PC1 of correlation matirx to show compartments + Default is not. Only work well for big regions such as resolution + of 100k. + -eig_r Whether to flip the PC1 values of -eig. It should be dependend on + inactivate or activate histone markers, as actually the PCA values do + not have directions, especially comparing different samples. + -figWidth {4,8} Figure width. 4 is good to show the plot as half of a A4 figure + width and 8 is good to show more wider. Default is 4. + + +``` + +------ +### 15. Montage analysis for regions of interactions +Run **cLoops2 montage -h** to see details. +``` +Montage analysis of specific regions, producing Westworld Season 3 -like +Rehoboam plot. + +Examples: + 1. showing all PETs for a gene's promoter and enhancers + cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test + + 2. showing simplified PETs for a gene's promoter and enhancers + cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test -simple + + 3. adjust interacting link width + cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test -simple \ + -ppmw 10 + + 4. showing all PETs for a region, if in the bed file only contains one region + cLoops2 montage -f test/chr21-chr21.ixy -bed test.bed -o test -ext 0 + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -f FIXY Input .ixy file generated by cLoops2 pre. + -bed BED Input .bed file for target regions, 4th columns should be id/name for + the region. + -ext EXT Up-stream and down-stream extesion of target region length. Default is + 2. If the input bed already include up/down-stream regions, assign as 0. + -simple Whether to only draw the representative interactions between two target + regions as one arch, and not include the interactions in extended + regions. Default is not, all interactions will be shown as archs.. + -vp VIEWPOINT Only show interactions with specific regions from all other regions. + Name/id (4th column in .bed file) is need. Default is to show all + releated interactions. Multiple names/ids can be assigned by seperation + of comma. + -vmin VMIN The minial scale for 1D pileup data. Default will be inferred from the + data. + -vmax VMAX The maxmial scale for 1D pileup data. Default will be inferred from the + data. + -ppmw PPMW Link line width indicator, short for 1 PETs per Million PETs line + width, default is 10. Adjust this value when -simple is used. Decrease + it if links are too bold and increase it when links are too thin. + -aw AW Line width for each PET if -simple is not selected. Default is 1. + -no1D Whether to not plot 1D profiles. Default is plot. Set this for Hi-C + like data. +``` + +------ +### 16. Aggregation analysis for peaks, loops and domains +Run **cLoops2 agg -h** to see details. +``` +Do the aggregation analysis for peaks, loops, view points and domains. + +The output figures can be used directly, and the data to generate the plot are +also saved for further customized analysis. + +For the aggregated peaks analysis,input is a .bed file annotated with the +coordinates for the target regions/peaks/anchors. Output is a .pdf file +containing a mean density plot and heatmap and a .txt file for the data. The +data in the .txt file and plot were normalized to RPM (reads per million). + +For the aggregated view points analysis, input is a .bed file annotated with +coordinates for the target regions/peaks/anchors as view point. Output is a +.pdf file containing a mean density plot and heatmap and a .txt file for the +data. The data in the .txt file and plot were normalized to +log2( RPM (reads per million)+1). + +For the aggregated loops analysis, input is a _loops.txt file annotated with +the coordinates for target loops, similar to the format of BEDPE. Output is a +.pdf file for mean heatmap and .npz file generated through numpy.savez for all +loops and nearby regions matrix. The enrichment score (ES) in the plot is +calculated as: ES = mean( (PETs in loop)/(mean PETs of nearby regions) ). Other +files except _loops.txt can be used as input, as long as the file contains key +information in the first columns separated by tabs: +loopId chrA startA endA chrB startB endB distance +loop-1 chr21 1000 2000 chr21 8000 9000 7000 + +There is another option for loops analysis, termed as two anchors. Input file is +same to aggregated loops analysis. The whole region with assigned extesion +between two anchors will be aggregated and 1D profile can show two anchors. The +analysis could be usefule to study/comapre different classes of anchors and +combinations, for example, considering CTCT motif directions, all left anchors +CTCF motifs are in positive strand and in negative strand for all right anchors. +It could be interesting for some loops one anchor only bound by transcription +factor a and another anchor only bound by transcription b. + +For the aggregated domains analysis, input is a .bed file annotated with the +coordinates for the domains, such as TADs. Output are a .pdf file for the upper +triangular heatmap and .npz file generated through numpy.savez for all domains +and nearby region matrix. The enrichment score (ES) in the plot is calculated +as mean( (two ends both with in domain PETs number)/( only one end in domain +PETs number) ). + +Examples: + 1. show aggregated peaks heatmap and profile + cLoops2 agg -d test -peaks peaks.bed -o test -peak_ext 2500 \ + -peak_bins 200 -peak_norm -skipZeros + + 2. show aggregated view points and aggregated bigWig signal + cLoops2 agg -d test -o test -viewPoints test_peaks.bed -bws CTCF.bw + + 3. show aggregated loops heatmap, 1D profile and aggregated bigWig signal + cLoops2 agg -d test -o test -loops test_loops.txt -bws CTCF.bw -1D \ + -loop_norm + + 3. show aggregated loops heatmap, 1D profile and aggregated bigWig signal + in two anchors mode + cLoops2 agg -d test -o test -twoAnchors test_loops.txt -bws CTCF.bw -1D \ + -loop_norm + + 4. show aggregated domains heatmap, 1D profile and aggregated bigWig signal + cLoops2 agg -d test -o test -domains TAD.bed -bws CTCF.bw -1D + + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -peaks PEAKF The .bed file for peaks-centric aggregation analysis. + -peak_ext PEAK_EXT The nearby upstream and downstream regions (bp) from the peak center. + Default is 5000. + -peak_bins PEAK_BINS The bin size for the profile array of peaks. Default is 100. + -peak_norm Whether to normalize the data in the peaks profile plot and + heatmap with row-wise z-score. Default is not. + -viewPoints VIEWPOINTF + The .bed file for view points -centric aggregation analysis. + -viewPointUp VIEWPOINTUP + The upstream regions included for the aggreaged view points analysis. + Default is 100000 bp. + -viewPointDown VIEWPOINTDOWN + The downstream regions included for the aggreaged view points analysis. + Default is 100000 bp. + -viewPointBs VIEWPOINTBS + Contact matrix bin size for view points heatmap. Default is 1000 bp. + -viewPoint_norm Whether to normalize the sub-matrix for each loop as divide the mean + PETs for the matrix. Default is not. + -loops LOOPF The _loop.txt file generated by cLoops2 for loops-centric + aggregation analysis. The file first 8 columns are necessary. + -loop_ext LOOP_EXT The nearby regions included to plot in the heatmap and calculation of + enrichment for aggregation loop analysis, default is 10, should be + even number. + -loop_cut LOOP_CUT Distance cutoff for loops to filter. Default is 0. + -loop_norm Whether to normalize the sub-matrix for each loop as divide the mean + PETs for the matrix (except the loop region). Default is not. + -twoAnchors TWOANCHORSF + The similar _loop.txt file generated by cLoops2 for two anchors + aggregation analysis. The file first 8 columns are necessary. + -twoAnchor_ext TWOANCHOR_EXT + The nearby regions of fold included to plot in heatmap. + Default is 0.1. + -twoAnchor_vmin TWOANCHOR_VMIN + The minimum value shown in the domain heatmap and colorbar. + -twoAnchor_vmax TWOANCHOR_VMAX + The maxmum value shown in the domain heatmap and colorbar. + -domains DOMAINF The .bed file annotated the domains such as TADs for aggregated + domains-centric analysis. + -domain_ext DOMAIN_EXT + The nearby regions of fold included to plot in heatmap and + caculation of enrichment, default is 0.5. + -domain_vmin DOMAIN_VMIN + The minimum value shown in the domain heatmap and colorbar. + -domain_vmax DOMAIN_VMAX + The maxmum value shown in the domain heatmap and colorbar. + -1D Whether to plot the pileup 1D signal for aggregated loops, + aggregated view points or aggregated domains. Default is not. + -bws BWS BigWig tracks to plot above the aggregated loops heatmap (or under + the aggregated domains heatmap), track name will be inferred from file + name, for example a.bw,b.bw,c.bw. + -skipZeros Whether to remove all 0 records. Default is not. + +``` + +------ +### 17. Quantification of peaks, loops and domains +Run **cLoops2 quant -h** to see details. +``` +Quantify the peaks, loops and domains. The output file will be the same as +outputs of callPeaks, callLoops and callDomains. + +Examples: + 1. quantify peaks + cLoops2 quant -d test -peaks peaks.bed -o test + + 2. quantify loops + cLoops2 quant -d test -loops test_loops.txt -o test + + 3. quantify domains + cLoops2 quant -d test -domains test_domains.txt -o test + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -peaks PEAKF The .bed file for peaks-centric quantification. + -loops LOOPF The _loop.txt file generated by cLoops2 for loops-centric + quantification, as long as there are first 8 columns. + -domains DOMAINF The _domains.txt file generated by cLoops2 for domains-centric + quantification, as long as there are first 3 columns + -domain_bs DOMAINBINSIZE + Candidate contact matrix resolution (bin size) to quantify domains, + default is 10000. Only one integer is supported. + -domain_ws DOMAINWINSIZE + The half window size used to calculate local correlation to quantify + domains. Default is 500000 (500kb). + -domain_bdg Whether to save the segregation score ad bedGraph file, default. is not. - -pdis PDIS Distance limitation for anchor to nearest gene/transcript TSS to define - as promoter. Default is 2000 bp. - -net Whether to use network method to find all enhancer/promoter links based - on loops. Default is not. In this mode, overlapped anchors will be - merged and annotated as enhancer/promoter, then for a gene, all linked - node will be output. - -gap GAP When -net is set, the distance for close anchors to merge. Default is 1. - - ``` - - ------ - ### 19. Find target genes of genomic regions with cLoops2 anaLoops output - Run **cLoops2 findTargets -h** to see details. - ``` - Find target genes of genomic regions (peaks, SNPs) through enhancer-promoter - networks. Output from cLoops2 anaLoops with suffix of _ep_net.sif and - _targets.txt are needed. - - Examples: - 1. find target genes of peaks/SNPs - cLoops2 findTargets -net test_ep_net.sif -tg test_targets.txt \ - -bed GWAS.bed -o test - - optional arguments: - -h, --help show this help message and exit - -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. - -o FNOUT Output data directory / file name prefix, default is cLoops2_output. - -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs - available. Too many CPU could cause out-of-memory problem if there are - too many PETs. - -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance - >=cut. Default is 0, no filtering. - -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. - -v Show cLoops2 verison number and exit. - --- Following are sub-commands specific options. This option just show - version of cLoops2. - -net FNET The _ep_net.sif file generated by cLoops2 anaLoops. - -tg FTG The _targets.txt file generated by cLoops2 anaLoops. - -bed FBED Find target genes for regions, such as anchors, SNPs or peaks. - - ``` - - ------ - ------ - ## Extended Analysis Application Scripts - The following analysis application scripts are available when cLoops2 is installed. The majority of them can be independently run. The -h option can show example usages and details of parameters. Some of them will be integrated into cLoops sub-programmes if well tested and frequently used. More will be added. - - ### File Format Conversion - - [hicpro2bedpe.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/hicpro2bedpe.py) : convert HiC-Pro output allValidPairs file to BEDPE file as input of cLoops2. - - [juicerLong2bedpe.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/juicerLong2bedpe.py): convert Juicer output long format interaction file to BEDPE file as input of cLoops2. - - [getBedpeFBed.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getBedpeFBed.py): convert single-end reads in BED format to paired-end reads in BEDPE format with expected fragment size as input of cLoops2 to call peaks. - - --- - ### Analysis without plot - - [getDI.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getDI.py): calculate the [Directionality Index](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3356448/) as , where **x** is the bin and **A** is the interaction reads within the region from specific upstream to bin **x**, and **B** is the downstream reads. - - - [getFRiF.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getFRiF.py): calculate the **F**raction of **R**eads **i**n **F**eatures (FRiF), the features could be domains and peaks annotated with .bed file or domains/stripes/loops with .txt file such as the \_loop.txt file. - - - [getIS.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getIS.py): calculate the [insulation score](https://www.nature.com/articles/nature20158) with a little modification for the data with output of a bedGraph file, the math formula used is , where ***x*** is the genomic location, which can be bins or exact base pair, ***I(x-s,x+s)*** is the interactions/PETs observed in the region from ***x-s*** to ***x+s***, and ***s*** should be set a little large, such as 100kb to observe a good fit for the insulation score and TAD boundaries. - - - [getLocalIDS.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getcLocalIDS.py): calculate the local interaction density score for the data with output a bedGraph file, the math formula used is , where ***x*** is the genomic location for the target bin, ***N*** is the total PETs in the target chromosomal, ***I(x,x_i)*** is the observed PETs linking the region bin ***x*** and the ith nearby bin of the same size. - - - [getPETsAno.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getPETsAno.py): get the PETs ratio of enhancer-promoter, enhancer-enhancer, promoter-promoter, enhancer-none, promoter-none, none-none interactions. - - - [tracPre.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/tracPre.py): pre-process the raw reads of FASTQ files of Trac-looping data to the reference genome and obtain the unique PETs with quality control results. - - - [tracPre2.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/tracPre2.py): pre-process the raw reads of FASTQ files of Hi-TrAC data to the reference genome and obtain the unique PETs with quality control results. - - ----- - ------ - ## Input, Intermediate, Output Files - - [.bedpe](#.bedpe) - - [.ixy](#.ixy) - - [_peaks.txt](#_peaks.txt) - - [_loops.txt](#_loops.txt) - - [_dloops.txt](#_dloops.txt) - - [_domains.txt](#_domains.txt) - - ---- - - ### Input .bedpe file - Mapped PETs in [BEDPE format](http://bedtools.readthedocs.io/en/latest/content/general-usage.html), compressed files with gzip are also accepted, following columns are necessary: chrom1 (1st),start1 (2),end1 (3),chrom2 (4),start2 (5),end2 (6),strand1 (9),strand2 (10). For the column of name or score, "." is accepted. Columns are separated by "\t". - For example as following: - ``` - chr1 9945 10095 chr1 248946216 248946366 . . + + - chr1 10034 10184 chr1 180987 181137 . . + - - chr1 10286 10436 chr1 181103 181253 . . + - - chr1 10286 10436 chr11 181103 181253 . . + - - chr11 10286 10436 chr1 181103 181253 . . + - - ... - ``` - - ------ - - ### Intermediate .ixy file - numpy.array of (x,y) saved to [joblib.dump](https://joblib.readthedocs.io/en/latest/generated/joblib.dump.html) for fast access of the interaction EPTs and contact matrix at any resolution, nearly all cLoops2 related analysis are based on this file type. - ``` - 10099025 10099048 - 39943889 39943890 - 18391007 18391853 - 35502951 35502951 - 10061555 10061557 - ... - ``` - - ------ - - ### Output \_peaks.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | peakId | id for a peak, for example peak\_chr1-chr1-1 - 1th | chrom | chromosomal for the peak - 2th | start | genomic coordinate of the start site - 3th | end | genomic coordinate of the end site - 4th | summit | genomic coordinate of peak summit - 5th | length | length of the peak - 6th | counts | observed reads number in the peak - 7th | RPKM | RPKM for the reads density in the peak - 8th | enrichmentScore | enrichment score for the peak, calculated by observed PETs number divided by the mean PETs number of nearby 10 fold and 20 fold regions - 9th | poissonPvalue | Poisson test p-value for the loop after Bonferroni correction - 10th | controlCounts| if control data such as input/IgG is assigned, the observed reads number in peak region for control data - 11th | controlRPKM | if control data assigned, RPKM for the reads density in the peak region for control data - 12th | controlScaledCount | if control data assigned, the scaled expected counts used for Poisson test/enrichment score against control data - 13th | enrichmentScoreVsControl | if control data assigned, enrichment score of target vs. control - 14th | poissonPvalueVsControl | if control data assigned, Poisson test p-value of target vs. control after Bonferroni correction - 15th | significant | 1 or 0, 1 means we think the peak is significant compared to local background and control (if assigned) - - ------ - - ### Output \_loops.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | loopId | id for a loop, for example loop\_chr1-chr1-1 - 1th | chromA | chromosomal for the loop first anchor - 2th | startA | genomic coordinate of the start site for the first anchor - 3th | endA | genomic coordinate of the end site for the first anchor - 4th | chromB | chromosomal for the loop second anchor - 5th | startB | genomic coordinate of the start site for the second anchor - 6th | endB | genomic coordinate of the end site for the second anchor - 7th | distance | distance (bp) between the centers of the anchors for the loop - 8th | centerA | genomic coordinate of the center site for the first anchor - 9th | centerB | genomic coordinate of the center site for the second anchor - 10th | readsA | observed PETs number for the first anchor - 11th | readsB | observed PETs number for the second anchor - 12th | cis | whether the loop is a intra-chromosomal loop (cis) - 13th | PETs | observed PETs number linking the two anchors - 14th | density | similarly to that of RPKM (reads per kilobase per million): - 15th | enrichmentScore | enrichment score for the loop, calculated by observed PETs number divided by the mean PETs number of nearby permutated regions - 16th | P2LL | peak to the lower left, calculated similar to that of Juicer - 17th | FDR | false discovery rate for the loop, calculated as the number of permutated regions that there are more observed PETs than the region - 18th | binomalPvalue | binomal test p-value for the loop, updated caculation, different from cLoops - 19th | hypergeometricPvalue | hypergeometric test p-value for the loop - 20th | poissonPvalue | Poisson test p-value for the loop - 21th | xPeakpoissonPvalue | Poisson test p-value for the left anchor potential peak p-value - 22th | yPeakpoissonPvalue | Poisson test p-value for the right anchor potential peak p-value - 23th | significant | 1 or 0, 1 means we think the loop is significant compared to permutated regions. In cLoops2, only significant loops are written to the file. - - ------ - - ### Output \_dloops.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | loopId | id for a loop, for example loop\_chr1-chr1-1 - 1th | chromA | chromosomal for the loop first anchor - 2th | startA | genomic coordinate of the start site for the first anchor - 3th | endA | genomic coordinate of the end site for the first anchor - 4th | chromB | chromosomal for the loop second anchor - 5th | startB | genomic coordinate of the start site for the second anchor - 6th | endB | genomic coordinate of the end site for the second anchor - 7th | distance | distance (bp) between the centers of the anchors for the loop - 8th | centerA | genomic coordinate of the center site for the first anchor - 9th | centerB | genomic coordinate of the center site for the second anchor - 10th | rawTargetAnchorAReads | observed PETs number for the first anchor in target sample - 11th | rawTargetAnchorBReads | observed PETs number for the second anchor in target sample - 12th | rawControlAnchorAReads | observed PETs number for the first anchor in control sample - 13th | rawControlAnchorBReads | observed PETs number for the second anchor in control sample - 14th | scaledTargetAnchorAReads | scaled PETs number for the first anchor in target sample - 15th | scaledTargetAnchorBReads | scaled PETs number for the second anchor in target sample - 16th | rawTargetCounts | raw PETs number for the loop in target sample - 17th | scaledTargetCounts | scaled PETs number for the loop in target sample, fitting to control sample - 18th | rawControlCounts | raw PETs number for the loop in control sample - 19th | rawTargetNearbyMedianCounts | raw median PETs number for the loop nearby permutation regions in target sample - 20th | scaledTargetNearbyMedianCounts | scaled median PETs number for the loop nearby permutation regions in target sample, fitting to control sample - 21th | rawControlNearbyMedianCounts | raw median PETs number for the loop nearby permutation regions in control sample - 22th | rawTargetES | target sample rawTargetCounts/rawTargetNearbyMedianCounts - 23th | rawControlES | control sample rawControlCounts/rawControlNearbyMedianCounts - 24th | targetDensity | raw interaction density in target sample, RPKM - 25th | controlDensity | raw interaction density in control sample, RPKM - 26th | rawFc | raw fold change of the interaction density, log2(target/control) - 27th | scaledFc | scaled fold change of PETs, log2( scaledTargetCounts/rawControlCounts ) - 28th | poissonPvalue | possion p-value for the significance test after Bonferroni correction - 29th | significant | 1 or 0, 1 means we think the loop is significant differentlly enriched - - ------ - - ### Output \_domains.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | domainId | id for a domain, for example domain\_0 - 1th | chrom | chromosomal for the loop first anchor - 2th | start | genomic coordinate of the start site for the domain - 3th | end | genomic coordinate of the end site for the domain - 4th | length | length of the domain - 5th | binSize | bin size used for the matrix to call the domain - 6th | winSize | window size used for the matrix to call the domain - 7th | segregationScore | mean segregation score for all bins within the domain - 8th | totalPETs | number of total PETs in the domain - 9th | withinDomainPETs | number of PETs only interacting within the domain - 10th | enrichmentScore | (withinDomainPETs) / (totalPETs-withinDomainPETs) - 11th | density | similarly to that of RPKM (reads per kilobase per million): - - ------ - - ### Output \_loopsGtfAno.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | loopId | loopId from input file - 1th | typeAnchorA | annotated type of anchor a (left anchor), enhancer or promoter - 2th | typeAnchorB | annotated type of anchor b (right anchor) - 3th | nearestDistanceToGeneAnchorA | distance of anchor a to nearest TSS - 4th | nearestDistanceToGeneAnchorB | distance of anchor b to nearest TSS - 5th | nearestTargetGeneAnchorA | anchor a nearest TSS gene, for example chr21:34836286-34884882\|+\|AP000331.1 (named by rules of chrom:start-end\|strand\|geneName). If a promoter overlaps two head-to-head genes, all genes will be reported by seperation of a comma. - 6th | nearestTargetGeneAnchorB | anchor b nearest TSS gene - - ------ - - ### Output \_mergedAnchors.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | anchorId | id for merged anchors. For example, chr21:14025126-14026192\|Promoter (named by the rule of: chrom:start-end\|type) - 1th | chrom | chromosome - 2th | start | start - 3th | end | end - 4th | type | annotated type for the anchor, enhancer or promoter - 5th | nearestDistanceToTSS | distance of anchor a to nearest TSS - 6th | nearestGene | nearest gene name. If a promoter overlaps two head-to-head genes, all genes will be reported by seperation of a comma. - 7th | nearestGeneLoc | neart gene information. For example, chr21:34787801-35049344\|-\|RUNX1 (named by the rule of: chrom:start-end\|strand\|name). If a promoter overlaps two head-to-head genes, all genes will be reported by seperation of a comma. - - ------ - - ### Output \_loop2anchors.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | loopId | loopId from input file - 1th | mergedAnchorA | original anchor a (left anchor) to new merged anchor id - 2th | mergedAnchorB | original anchor b (right anchor) to new merged anchor id - - ------ - - ### Output \_targets.txt file - column | name | explanation - ------ | ---- | ------------ - 0th | promoter | annotated anchors that overlapped or very close to gene's transcription start site. For example, chr21:35043062-35051895\|Promoter (named by the rule of: chrom:start-end\|Promoter). - 1th | PromoterTarget | promoter target genes. If a promoter is shared by multiple genes, all genes will be reported and seperated by comma. For example, chr21:34787801-35049344\|-\|RUNX1 (named by the rule of: chorm:start-end\|strand\|name. - 2th | directEnhancer | enhancers that directly looping with target promoter. Multiple enhancers will be reported and seperated by comma. For example, chr21:35075636-35077527\|Enhancer,chr21:35026356-35028520\|Enhancer,chr21:34801302-34805056\|Enhancer. - 3th | indirectEnhancer | enhancers that indirectly looping with target promoter, by enhancer-enhancer-promoter or enhancer-promoter-promoter. Multiple enhancers will be reported and seperated by comma. - 4th | directPromoter | other promoters directly looping with target promoter. - 5th | indirectPromoter | other promoters indirectly looping with target promoter, by promoter-enhancer-promoter or promoter-promoter-promoter. - 6th | directEnhancerHub | hub of direct enhancer. If there are more than 2 direct enhancers, using HITS algorithm to find the most linked one and report. - 7th | indirectEnhancerHub | hub of indirect enhancer. If there are more than 2 indirect enhancers, using HITS algorithm to find the most linked one and report. - - - -------- - -------- - ## cLoops2 citations - - -------- - -------- - ## cLoops2 updates - - - -Keywords: peak-calling loop-calling Hi-Trac interaction visualization -Platform: UNKNOWN -Classifier: Environment :: Console -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: POSIX -Classifier: Topic :: Scientific/Engineering :: Bio-Informatics -Requires-Python: >=3 -Description-Content-Type: text/markdown +``` + +------ +### 18. Annotation of loops to genes +Run **cLoops2 anaLoops -h** to see details. +``` +Annotating loops: +- find the closest TSS for each loop anchors +- merge the loop anchors and classify them as enhancers or promoters based on + distance to nearest TSS +- build the interaction networks for merged anchors +- find the all interacted enhancers/promoters for each promoter + +Basic mode 1: with -gtf, loops will be annotated as enhancer or promoter based +on distance to nearest gene. If a anchor overlapped with two/multiple promoters +(often seen for close head-to-head genes), all will be reported. If no TSS +overlaps, then nearest one will be assigned. + +Basic mode 2: with -gtf -net, overlapped anchors will be merged and annoated as +enhancer or promoter considering distance to genes. For each promoter, all +linked enhancer and promoter will be shown. If there are more than 3 direct or +indirect enhancers for a promoter, HITS algorithm will be used to identify one +hub for indirect enhancer and one hub for indirect enhancer. + +Examples: + 1. annotate loops for target gene, basic mode 1 + cLoops2 anaLoops -loops test_loops.txt -gtf genecode.gtf + + 2. annotate loops for target transcripts (alternative TSS), basic mode 1 + cLoops2 anaLoops -loops test_loops.txt -gtf genecode.gtf -tid + + 3. find a gene's all linked enhancer or promoter, basic mode 2 + cLoops2 anaLoops -loops test_loops.txt -gtf genecode.gtf -net + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -loops FLOOP The _loop.txt file generated by cLoops2 callLoops or callDiffLoops. + -gtf GTF GTF file annotation for genes. + -tid Whether to use transcript id instead of gene id for annotation. Default + is not. + -pdis PDIS Distance limitation for anchor to nearest gene/transcript TSS to define + as promoter. Default is 2000 bp. + -net Whether to use network method to find all enhancer/promoter links based + on loops. Default is not. In this mode, overlapped anchors will be + merged and annotated as enhancer/promoter, then for a gene, all linked + node will be output. + -gap GAP When -net is set, the distance for close anchors to merge. Default is 1. + +``` + +------ +### 19. Find target genes of genomic regions with cLoops2 anaLoops output +Run **cLoops2 findTargets -h** to see details. +``` +Find target genes of genomic regions (peaks, SNPs) through enhancer-promoter +networks. Output from cLoops2 anaLoops with suffix of _ep_net.sif and +_targets.txt are needed. + +Examples: + 1. find target genes of peaks/SNPs + cLoops2 findTargets -net test_ep_net.sif -tg test_targets.txt \ + -bed GWAS.bed -o test + +optional arguments: + -h, --help show this help message and exit + -d PREDIR Assign data directory generated by cLoops2 pre to carry out analysis. + -o FNOUT Output data directory / file name prefix, default is cLoops2_output. + -p CPU CPUs used to run the job, default is 1, set -1 to use all CPUs + available. Too many CPU could cause out-of-memory problem if there are + too many PETs. + -cut CUT Distance cutoff to filter cis PETs, only keep PETs with distance + >=cut. Default is 0, no filtering. + -mcut MCUT Keep the PETs with distance <=mcut. Default is -1, no filtering. + -v Show cLoops2 verison number and exit. + --- Following are sub-commands specific options. This option just show + version of cLoops2. + -net FNET The _ep_net.sif file generated by cLoops2 anaLoops. + -tg FTG The _targets.txt file generated by cLoops2 anaLoops. + -bed FBED Find target genes for regions, such as anchors, SNPs or peaks. + +``` + +------ +------ +## Extended Analysis Application Scripts +The following analysis application scripts are available when cLoops2 is installed. The majority of them can be independently run. The -h option can show example usages and details of parameters. Some of them will be integrated into cLoops sub-programmes if well tested and frequently used. More will be added. + +### File Format Conversion +- [hicpro2bedpe.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/hicpro2bedpe.py) : convert HiC-Pro output allValidPairs file to BEDPE file as input of cLoops2. +- [juicerLong2bedpe.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/juicerLong2bedpe.py): convert Juicer output long format interaction file to BEDPE file as input of cLoops2. +- [getBedpeFBed.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getBedpeFBed.py): convert single-end reads in BED format to paired-end reads in BEDPE format with expected fragment size as input of cLoops2 to call peaks. + +--- +### Analysis without plot +- [getDI.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getDI.py): calculate the [Directionality Index](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3356448/) as , where **x** is the bin and **A** is the interaction reads within the region from specific upstream to bin **x**, and **B** is the downstream reads. + +- [getFRiF.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getFRiF.py): calculate the **F**raction of **R**eads **i**n **F**eatures (FRiF), the features could be domains and peaks annotated with .bed file or domains/stripes/loops with .txt file such as the \_loop.txt file. + +- [getIS.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getIS.py): calculate the [insulation score](https://www.nature.com/articles/nature20158) with a little modification for the data with output of a bedGraph file, the math formula used is , where ***x*** is the genomic location, which can be bins or exact base pair, ***I(x-s,x+s)*** is the interactions/PETs observed in the region from ***x-s*** to ***x+s***, and ***s*** should be set a little large, such as 100kb to observe a good fit for the insulation score and TAD boundaries. + +- [getLocalIDS.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getcLocalIDS.py): calculate the local interaction density score for the data with output a bedGraph file, the math formula used is , where ***x*** is the genomic location for the target bin, ***N*** is the total PETs in the target chromosomal, ***I(x,x_i)*** is the observed PETs linking the region bin ***x*** and the ith nearby bin of the same size. + +- [getPETsAno.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/getPETsAno.py): get the PETs ratio of enhancer-promoter, enhancer-enhancer, promoter-promoter, enhancer-none, promoter-none, none-none interactions. + +- [tracPre.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/tracPre.py): pre-process the raw reads of FASTQ files of Trac-looping data to the reference genome and obtain the unique PETs with quality control results. + +- [tracPre2.py](https://github.com/YaqiangCao/cLoops2/blob/master/scripts/tracPre2.py): pre-process the raw reads of FASTQ files of Hi-TrAC data to the reference genome and obtain the unique PETs with quality control results. + +----- +------ +## Input, Intermediate, Output Files +- [.bedpe](#.bedpe) +- [.ixy](#.ixy) +- [_peaks.txt](#_peaks.txt) +- [_loops.txt](#_loops.txt) +- [_dloops.txt](#_dloops.txt) +- [_domains.txt](#_domains.txt) + +---- + +### Input .bedpe file +Mapped PETs in [BEDPE format](http://bedtools.readthedocs.io/en/latest/content/general-usage.html), compressed files with gzip are also accepted, following columns are necessary: chrom1 (1st),start1 (2),end1 (3),chrom2 (4),start2 (5),end2 (6),strand1 (9),strand2 (10). For the column of name or score, "." is accepted. Columns are separated by "\t". +For example as following: +``` +chr1 9945 10095 chr1 248946216 248946366 . . + + +chr1 10034 10184 chr1 180987 181137 . . + - +chr1 10286 10436 chr1 181103 181253 . . + - +chr1 10286 10436 chr11 181103 181253 . . + - +chr11 10286 10436 chr1 181103 181253 . . + - +... +``` + +------ + +### Intermediate .ixy file +numpy.array of (x,y) saved to [joblib.dump](https://joblib.readthedocs.io/en/latest/generated/joblib.dump.html) for fast access of the interaction EPTs and contact matrix at any resolution, nearly all cLoops2 related analysis are based on this file type. +``` +10099025 10099048 +39943889 39943890 +18391007 18391853 +35502951 35502951 +10061555 10061557 +... +``` + +------ + +### Output \_peaks.txt file +column | name | explanation +------ | ---- | ------------ +0th | peakId | id for a peak, for example peak\_chr1-chr1-1 +1th | chrom | chromosomal for the peak +2th | start | genomic coordinate of the start site +3th | end | genomic coordinate of the end site +4th | summit | genomic coordinate of peak summit +5th | length | length of the peak +6th | counts | observed reads number in the peak +7th | RPKM | RPKM for the reads density in the peak +8th | enrichmentScore | enrichment score for the peak, calculated by observed PETs number divided by the mean PETs number of nearby 10 fold and 20 fold regions +9th | poissonPvalue | Poisson test p-value for the loop after Bonferroni correction +10th | controlCounts| if control data such as input/IgG is assigned, the observed reads number in peak region for control data +11th | controlRPKM | if control data assigned, RPKM for the reads density in the peak region for control data +12th | controlScaledCount | if control data assigned, the scaled expected counts used for Poisson test/enrichment score against control data +13th | enrichmentScoreVsControl | if control data assigned, enrichment score of target vs. control +14th | poissonPvalueVsControl | if control data assigned, Poisson test p-value of target vs. control after Bonferroni correction +15th | significant | 1 or 0, 1 means we think the peak is significant compared to local background and control (if assigned) + +------ + +### Output \_loops.txt file +column | name | explanation +------ | ---- | ------------ +0th | loopId | id for a loop, for example loop\_chr1-chr1-1 +1th | chromA | chromosomal for the loop first anchor +2th | startA | genomic coordinate of the start site for the first anchor +3th | endA | genomic coordinate of the end site for the first anchor +4th | chromB | chromosomal for the loop second anchor +5th | startB | genomic coordinate of the start site for the second anchor +6th | endB | genomic coordinate of the end site for the second anchor +7th | distance | distance (bp) between the centers of the anchors for the loop +8th | centerA | genomic coordinate of the center site for the first anchor +9th | centerB | genomic coordinate of the center site for the second anchor +10th | readsA | observed PETs number for the first anchor +11th | readsB | observed PETs number for the second anchor +12th | cis | whether the loop is a intra-chromosomal loop (cis) +13th | PETs | observed PETs number linking the two anchors +14th | density | similarly to that of RPKM (reads per kilobase per million): +15th | enrichmentScore | enrichment score for the loop, calculated by observed PETs number divided by the mean PETs number of nearby permutated regions +16th | P2LL | peak to the lower left, calculated similar to that of Juicer +17th | FDR | false discovery rate for the loop, calculated as the number of permutated regions that there are more observed PETs than the region +18th | binomalPvalue | binomal test p-value for the loop, updated caculation, different from cLoops +19th | hypergeometricPvalue | hypergeometric test p-value for the loop +20th | poissonPvalue | Poisson test p-value for the loop +21th | xPeakpoissonPvalue | Poisson test p-value for the left anchor potential peak p-value +22th | yPeakpoissonPvalue | Poisson test p-value for the right anchor potential peak p-value +23th | significant | 1 or 0, 1 means we think the loop is significant compared to permutated regions. In cLoops2, only significant loops are written to the file. + +------ + +### Output \_dloops.txt file +column | name | explanation +------ | ---- | ------------ +0th | loopId | id for a loop, for example loop\_chr1-chr1-1 +1th | chromA | chromosomal for the loop first anchor +2th | startA | genomic coordinate of the start site for the first anchor +3th | endA | genomic coordinate of the end site for the first anchor +4th | chromB | chromosomal for the loop second anchor +5th | startB | genomic coordinate of the start site for the second anchor +6th | endB | genomic coordinate of the end site for the second anchor +7th | distance | distance (bp) between the centers of the anchors for the loop +8th | centerA | genomic coordinate of the center site for the first anchor +9th | centerB | genomic coordinate of the center site for the second anchor +10th | rawTargetAnchorAReads | observed PETs number for the first anchor in target sample +11th | rawTargetAnchorBReads | observed PETs number for the second anchor in target sample +12th | rawControlAnchorAReads | observed PETs number for the first anchor in control sample +13th | rawControlAnchorBReads | observed PETs number for the second anchor in control sample +14th | scaledTargetAnchorAReads | scaled PETs number for the first anchor in target sample +15th | scaledTargetAnchorBReads | scaled PETs number for the second anchor in target sample +16th | rawTargetCounts | raw PETs number for the loop in target sample +17th | scaledTargetCounts | scaled PETs number for the loop in target sample, fitting to control sample +18th | rawControlCounts | raw PETs number for the loop in control sample +19th | rawTargetNearbyMedianCounts | raw median PETs number for the loop nearby permutation regions in target sample +20th | scaledTargetNearbyMedianCounts | scaled median PETs number for the loop nearby permutation regions in target sample, fitting to control sample +21th | rawControlNearbyMedianCounts | raw median PETs number for the loop nearby permutation regions in control sample +22th | rawTargetES | target sample rawTargetCounts/rawTargetNearbyMedianCounts +23th | rawControlES | control sample rawControlCounts/rawControlNearbyMedianCounts +24th | targetDensity | raw interaction density in target sample, RPKM +25th | controlDensity | raw interaction density in control sample, RPKM +26th | rawFc | raw fold change of the interaction density, log2(target/control) +27th | scaledFc | scaled fold change of PETs, log2( scaledTargetCounts/rawControlCounts ) +28th | poissonPvalue | possion p-value for the significance test after Bonferroni correction +29th | significant | 1 or 0, 1 means we think the loop is significant differentlly enriched + +------ + +### Output \_domains.txt file +column | name | explanation +------ | ---- | ------------ +0th | domainId | id for a domain, for example domain\_0 +1th | chrom | chromosomal for the loop first anchor +2th | start | genomic coordinate of the start site for the domain +3th | end | genomic coordinate of the end site for the domain +4th | length | length of the domain +5th | binSize | bin size used for the matrix to call the domain +6th | winSize | window size used for the matrix to call the domain +7th | segregationScore | mean segregation score for all bins within the domain +8th | totalPETs | number of total PETs in the domain +9th | withinDomainPETs | number of PETs only interacting within the domain +10th | enrichmentScore | (withinDomainPETs) / (totalPETs-withinDomainPETs) +11th | density | similarly to that of RPKM (reads per kilobase per million): + +------ + +### Output \_loopsGtfAno.txt file +column | name | explanation +------ | ---- | ------------ +0th | loopId | loopId from input file +1th | typeAnchorA | annotated type of anchor a (left anchor), enhancer or promoter +2th | typeAnchorB | annotated type of anchor b (right anchor) +3th | nearestDistanceToGeneAnchorA | distance of anchor a to nearest TSS +4th | nearestDistanceToGeneAnchorB | distance of anchor b to nearest TSS +5th | nearestTargetGeneAnchorA | anchor a nearest TSS gene, for example chr21:34836286-34884882\|+\|AP000331.1 (named by rules of chrom:start-end\|strand\|geneName). If a promoter overlaps two head-to-head genes, all genes will be reported by seperation of a comma. +6th | nearestTargetGeneAnchorB | anchor b nearest TSS gene + +------ + +### Output \_mergedAnchors.txt file +column | name | explanation +------ | ---- | ------------ +0th | anchorId | id for merged anchors. For example, chr21:14025126-14026192\|Promoter (named by the rule of: chrom:start-end\|type) +1th | chrom | chromosome +2th | start | start +3th | end | end +4th | type | annotated type for the anchor, enhancer or promoter +5th | nearestDistanceToTSS | distance of anchor a to nearest TSS +6th | nearestGene | nearest gene name. If a promoter overlaps two head-to-head genes, all genes will be reported by seperation of a comma. +7th | nearestGeneLoc | neart gene information. For example, chr21:34787801-35049344\|-\|RUNX1 (named by the rule of: chrom:start-end\|strand\|name). If a promoter overlaps two head-to-head genes, all genes will be reported by seperation of a comma. + +------ + +### Output \_loop2anchors.txt file +column | name | explanation +------ | ---- | ------------ +0th | loopId | loopId from input file +1th | mergedAnchorA | original anchor a (left anchor) to new merged anchor id +2th | mergedAnchorB | original anchor b (right anchor) to new merged anchor id + +------ + +### Output \_targets.txt file +column | name | explanation +------ | ---- | ------------ +0th | promoter | annotated anchors that overlapped or very close to gene's transcription start site. For example, chr21:35043062-35051895\|Promoter (named by the rule of: chrom:start-end\|Promoter). +1th | PromoterTarget | promoter target genes. If a promoter is shared by multiple genes, all genes will be reported and seperated by comma. For example, chr21:34787801-35049344\|-\|RUNX1 (named by the rule of: chorm:start-end\|strand\|name. +2th | directEnhancer | enhancers that directly looping with target promoter. Multiple enhancers will be reported and seperated by comma. For example, chr21:35075636-35077527\|Enhancer,chr21:35026356-35028520\|Enhancer,chr21:34801302-34805056\|Enhancer. +3th | indirectEnhancer | enhancers that indirectly looping with target promoter, by enhancer-enhancer-promoter or enhancer-promoter-promoter. Multiple enhancers will be reported and seperated by comma. +4th | directPromoter | other promoters directly looping with target promoter. +5th | indirectPromoter | other promoters indirectly looping with target promoter, by promoter-enhancer-promoter or promoter-promoter-promoter. +6th | directEnhancerHub | hub of direct enhancer. If there are more than 2 direct enhancers, using HITS algorithm to find the most linked one and report. +7th | indirectEnhancerHub | hub of indirect enhancer. If there are more than 2 indirect enhancers, using HITS algorithm to find the most linked one and report. + + +-------- +-------- +## cLoops2 citations + +-------- +-------- +## cLoops2 updates + + diff --git a/cLoops2.egg-info/entry_points.txt b/cLoops2.egg-info/entry_points.txt index fe7565ed..f8d870b6 100644 --- a/cLoops2.egg-info/entry_points.txt +++ b/cLoops2.egg-info/entry_points.txt @@ -1,3 +1,2 @@ [console_scripts] cLoops2 = cLoops2.cLoops2:main - diff --git a/cLoops2/__pycache__/__init__.cpython-310.pyc b/cLoops2/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f28294bab97521cb183b4ddf0e915db1a664078 GIT binary patch literal 166 zcmd1j<>g`kf~RRk$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vLKO;XkRX;f~ zztS8^1{CFIr6!jY>$~bjWhCbNBqjx97Nq86=A{G=4}yv&mLc)fzk WTO2mI`6;D2sdgYMikW}}3j+Y6xF?tZ literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/agg.cpython-310.pyc b/cLoops2/__pycache__/agg.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bafacd6ccc776798fbf9bf50c234731cef100fae GIT binary patch literal 31558 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/ano.cpython-310.pyc b/cLoops2/__pycache__/ano.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd9233923bcc47aff6254049b9d7fea11e071561 GIT binary patch literal 12127 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/blockDBSCAN.cpython-310.pyc b/cLoops2/__pycache__/blockDBSCAN.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89d8906549a4a79c122bda9bcffe55b3fc35e2fa GIT binary patch literal 6500 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 Gz5flPug-n| literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/callDiffLoops.cpython-310.pyc b/cLoops2/__pycache__/callDiffLoops.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..21cf0327e9d3464ca32fb521bc94eec226535266 GIT binary patch literal 19926 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/callPeaks.cpython-310.pyc b/cLoops2/__pycache__/callPeaks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e51b24a345ae692c45eda581c17ba67a0e6d187e GIT binary patch literal 16012 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 T%#LM_W*;^W-mQnG=HL83CYX(^ literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/callTransLoops.cpython-310.pyc b/cLoops2/__pycache__/callTransLoops.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c320930a3e9a1cdc5d0255a8f3cbe4ae7b183f4 GIT binary patch literal 7685 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 VtpIM)FZbVO)fgx6nf^-u^}n5-&uahx literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/cmat.cpython-310.pyc b/cLoops2/__pycache__/cmat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f3e8855d6600fffe3e47530dfd3430cac877c58 GIT binary patch literal 6563 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 F;}3ON$$J0* literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/dump.cpython-310.pyc b/cLoops2/__pycache__/dump.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed2b3b0b8b20567319e179e2312144784285da69 GIT binary patch literal 16779 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/est.cpython-310.pyc b/cLoops2/__pycache__/est.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e171fa92a7e29671f20ce5155ba71c8cc8d57f50 GIT binary patch literal 14473 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/estDis.cpython-310.pyc b/cLoops2/__pycache__/estDis.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82f79f6db77273411642053f506436b2809a3dc1 GIT binary patch literal 7292 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/estSim.cpython-310.pyc b/cLoops2/__pycache__/estSim.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4545b2a33817d58dd87c8fb0e5fa5cc7fddbad07 GIT binary patch literal 7338 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/geo.cpython-310.pyc b/cLoops2/__pycache__/geo.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b1630b8d3dde455d32e02ab95d1ab070d95d87f GIT binary patch literal 2694 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 literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/montage.cpython-310.pyc b/cLoops2/__pycache__/montage.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8401e0146959071c7088adf80d080b75681fd0ea GIT binary patch literal 11983 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 KJnApD?)?uwPEKF| literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/quant.cpython-310.pyc b/cLoops2/__pycache__/quant.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ff9ee0e5536e2952bb923aad673274b1d7bc547 GIT binary patch literal 9585 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 Q(jTUeut(!M(fm*U4}!5okN^Mx literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/settings.cpython-310.pyc b/cLoops2/__pycache__/settings.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..893464c9de5fae71b72ca2b9ded97e1e8b143acf GIT binary patch literal 1643 zcmY+EO>7%Q6o7ZVUjN&%6SuLG0)Ya;NH}SW3WtbEsniP#Dzzvj#WiXx7xSw&HLM#omoGh z&uGB-{3rBcO4HWS_&-T77T^v}>6%70OQX7_)0h>5+n|OOr*Ud}re!j7H9-?=x~{2_ zq?KZ+)ih0Rk7TSYg|X8)nx5BaMrm2la!SjCR#4g)Xho%!KpR)u1ZYX6l|jRfc`MJd zs|C7ev;JOhtW&g#y2dp+`H^mwSoZWdteO_Zlw5&2zoTM}K;kB5Gtw3x=#a4F3f@M`y>?7N;Rfw&s*y^rWu&gS)%M{&D zbM(=3G3Z`lRr=UU+?uB5Nv-y{)H6}`=#iIZUUlAZoi3MJRB1Z?^2nNd`oP=*?>Mek zZ~C1few!C%!sT6GFlqE?YxpD#MLE#wEx#Lv%RN?$4dXD#F<8?Q3sIrv^1fhocm!_5 zPDK-ev&g`zhr;OwJx8!^D9zC2?J&x1`5Fy>X|u-6LX^hpbxgO+Bf@pOXlyhB1)d6+ za9dGfE3@T`jspeHwB3-^bXhp=1|g$IeGeVITB&C64_A;ogik3h5x!4xnSgWU1LSMM zS1%$r2%l68(0NkvE#ZIsj{HRU`L~d7&^e)4C;aX62t2>MzYzY{J>+M|5LpaFF<4Y=V2^9xBLl);QGoKA;x;(i@6fooZ56Er8ErrBBqb~qimp(^^gnw}vxkHBc zA!mrKhA*Ia0!11`&5(K^bx-QuD7pWbVi*I5OuS5=@7rRCGnJ{P?|Ww)(HX+OMXSZ6 z>EQ;nl1^YZaht@YAsCegbr)qK=yy6y$T%j|_Q|AeQ@?53GGp6LKWzH~^b`y_ApQ_ccosS;asTja z+wZVh{F6MhDNi`f*B#D++2(QI?*#|9pD>9K*QDNCmZ^DIxW31p!;cai0}+qKjku0i g%E*jvJ+tddft3SKWwNZN^rF5abFr9?SLW~k090WcXaE2J literal 0 HcmV?d00001 diff --git a/cLoops2/__pycache__/utils.cpython-310.pyc b/cLoops2/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7153a135cb0bca5bee05e61bd061b45a362dd628 GIT binary patch literal 3032 zcmaJ@-EQ2*73PpbE_b#1v7JZ;TC{_ri)c~(*g?<)f)UtIrNo6I36g@qixdRKncbz# zCD${vQN`>Q1!5ou+7x|+U7$C4mp;MV7QM&=^d`Az&l#?4tF1#~{>V9J=A84LZ>CsW zY&h`zvn!Kt798gvIC%Y`Fn9<>{TV9mbR14Pgu5M=dz@xo$FnW%P}}+)-?l*~ux+hV zvu)T3x!%8%tbQXj+ZO$CNu;vKwVsW}8mS<$m;mtLtOZXyRf;lVv zExycGpm&Sk;7M$sV zy-7SFC_jH(XtC@@f_ zzw=UyUHfG3c<<5K=?+VCy@5azv94AGticYLj%811E2PsR-(po9KUHzBiq&I^Q-Jp0$Y02WJ`1ZkWB0D}!ug3a@ilmV3bQWg*q^yy5l90} zU-z)Q^W~&6SY+`K{JF!voV0yI(H!I3?HYe5!9OMdD#Br@a+L-e<pRuig_G|39Qw*gw^s`cj9gRDp( zD?Z$sPqy-HPp-mz`8HN-SfP95TUc4uz7_rzj1@BH(k&WF#P0WGyQEuL(YrwwD2zDX zg`$Q~f$s<>P`i~EXJqD1i1sch6rTg>jvY?9|BX)^?M(w7%m_roo7QxAQHQ<<{RXc= zkB+_R!kEs`-|nr^7sp|-02 zFLzbz&h?^KVXxMVvd&shHd}+u7BAmzt;Z_Cc(fI3t>eDho4>|xCcY3^HU0p{1EDad z+N!*DEzMdV@3cPIX`LDp10;PbA`vU5#$m_Z0bmjBMKx7#P;g;tb0RBSH&=hPV?yY(e!A6!i)-Y@gv9F&Y5 z;Ft~IZO95dG{f_lG+}W355Qu$3IH_0m%z|?e!ejmtdeBF)eg(xkc5NcTEU#o zfr0UCfmrtK+{&*oyGoA=#`e!)xw3b1a#S5mppvx|(xS~DxT877EilA3IgJl-C}i8~ zP+VNz!~bN?b}vH%xCHY~uT&3yDd@%y~UO~Y*YCTY(=g^W&BH-0#bdu5ZqnJe$6v_8+MZ2s`TG}hqp+u~k5RRZ> zEES~7-tpsuqmS(M#4^7LAXSq~Zs;)9eG@|b=cExuNFbmW^Tzt!Zt1nGdKJI$0np1R g6CYwU6h;BE%cmstLI_^a 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 z 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%0A!=x7@{mCB2v#gWBa1O-s? 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 literal 0 HcmV?d00001 diff --git a/scripts/tracPre2.py b/scripts/tracPre2.py index 72740409..6fafe29a 100755 --- a/scripts/tracPre2.py +++ b/scripts/tracPre2.py @@ -357,10 +357,9 @@ def main(): Batch converting from bam to bedpe. """ #prepare everything + op = help() date = time.strftime(' %Y-%m-%d', time.localtime(time.time())) logger = getLogger(fn=op.output + "/" + date.strip() + "_" + os.path.basename(__file__) + ".log") - - op = help() for t in ["bowtie2", "samtools", "bamToBed"]: if not isTool(t): logger.error("%s not exits! Please install through conda." % t)