Git Product home page Git Product logo

hicpeaks's Introduction

HiCPeaks

https://static.pepy.tech/personalized-badge/hicpeaks?period=total&units=international_system&left_color=black&right_color=orange&left_text=Downloads

hicpeaks provides a Python implementation for BH-FDR and HiCCUPS [1].

Installation

hicpeaks is developed and tested on UNIX-like operating systems, and the following packages or softwares are required:

Python requirements:

  1. Python 2.7/3.5+
  2. Multiprocess
  3. Numpy
  4. Scipy
  5. Matplotlib
  6. Pandas
  7. Statsmodels
  8. Scikit-Learn
  9. H5py
  10. Cooler

Other requirements:

  • ucsc-fetchchromsizes

conda, an excellent package manager, can be used to install all requirements above.

Install Requirements Through Conda

All above requirements can be installed through the conda package manager.

Note

If you have the Anaconda Distribution installed, you already have it.

Choose an appropriate Miniconda installer for your system, then in your terminal window type the following and follow the prompts on the installer screens:

$ bash Miniconda3-latest-Linux-x86_64.sh

After that, update the environment variables to finish the Conda installation:

$ source ~/.bashrc

Next, you need to set up channels to make all packages listed above accessible (note that the order is important to guarantee the correct priority):

$ conda config --add channels defaults
$ conda config --add channels bioconda
$ conda config --add channels conda-forge

Then type and execute the commands below to satisfy the requirements:

$ conda create -n HiCPeaks numpy scipy matplotlib pandas statsmodels scikit-learn h5py multiprocess cooler ucsc-fetchchromsizes
$ conda activate HiCPeaks

Install hicpeaks

Finally, hicpeaks can be installed from PyPI using pip:

$ pip install -U hicpeaks

Overview

hicpeaks comes with 6 scripts: toCooler, pyBHFDR, pyHICCUPS, combine-resolutions, peak-plot, and apa-analysis.

  • toCooler

    Store TXT/NPZ bin-level Hi-C data into the cooler container.

    1. I have included a sample data with the hicpeaks source code to illustrate how you should prepare your data in TXT format. It's quite easy, just remember 3 points: 1. the file name should follow this pattern "chrom1_chrom2.txt" (remove prefix from your chromosome labels, i.e. "chr1" should be "1", and "chrX" should be "X"); 2. each file should only contain 3 columns, corresponding to "bin1" of "chrom1", "bin2" of "chrom2", and "contact frequency" (don't perform any normalization processes); 3. all files at the same resolution should be placed in the same folder.
    2. NPZ format is another bin-level Hi-C data container which can extremely speed up data loading. hicpeaks supports NPZ files generated by old versions of runHiC (<0.8.0) and TADLib (<0.4.0).
  • pyBHFDR

    A CPU-based python implementation for the BH-FDR algorithm. Rao et al (2014) stated in their supplementary material that this algorithm is robust enough to obtain all main results of their paper. Compared with HiCCUPS, BH-FDR doesn't use λ-chunk in multiple hypothesis tests, and only considers the Donut background region when calculating the expected values.

  • pyHICCUPS

    A CPU-based python implementation for the HiCCUPS algorithm. Besides the donut region, HiCCUPS also considers the lower-left, the vertical, and the horizontal backgrounds when calculating the expected values. And λ-chunk is used to overcome several multiple hypothesis testing challenges for Hi-C data. Finally, while BH-FDR can only detect chromatin interactions near the diagonal (<2Mb), HiCCUPS is able to detect super long-range interactions. Here, pyHICCUPS keeps all main concepts of the original algorithm except for these points:

    1. pyHICCUPS excludes vertical and horizontal backgrounds from its calculation.
    2. There are two critical parameters related to the loop definition in HiCCUPS: the peak width p and the donut width w. In original implementation, they are set exclusively for each certain resolution, specifically, p=1 and w=3 at 25Kb, p=2 and w=5 at 10Kb, and p=4 and w=7 at 5Kb. To improve the sensitivity, pyHICCUPS can calculate and output the union peak calls from all parameter combinations (1,3), (2,5), (4,7) in a single run.
    3. Due to computational complexity, the search space still need to be limited, for example, within 5Mb/10Mb.
  • combine-resolutions

    Combine peak calls from different resolutions in a way similar to original HiCCUPS. Briefly, it excludes redundant lower resolution peaks while filters out low-confidence high resolution peaks.

  • peak-plot

    Visualize peaks (or chromatin loops) on a local contact matrix.

  • apa-analysis

    Perform Aggregate Peak Analysis (APA).

QuickStart

This tutorial will guide you through the basic usage of all scripts distributed with hicpeaks.

toCooler

If you have already created a cooler file for your Hi-C data, skip to the next section pyBHFDR and pyHICCUPS, go on otherwise.

First, you should store your TXT/NPZ bin-level Hi-C data into a cooler file by using toCooler. Let's begin with our sample data below. Suppose you are in the hicpeaks source code root folder: change your current working directory to the sub-folder example:

$ cd example
$ ls -lh *

-rw-r--r-- 1 xtwang  18 May  4 18:00 datasets
-rw-r--r-- 1 xtwang 293 May  4 18:00 hg38.chromsizes

25K:
total 12M
-rw-r--r-- 1 xtwang 12M May  4 18:00 21_21.txt

There is a sub-directory called 25K and a metadata file called datasets. The 25K folder contains chromatin interactions of chromosome 21 of the K562 cell line at the 25K resolution, and the datasets describes the data that need to be transformed:

$ cd 25K
$ head -5 21_21.txt

201 703     1
201 1347    1
201 1351    1
201 1524    1
201 1691    1

$ cd ..
$ cat datasets

res:25000
  ./25K

You should construct your TXT files (no head, no tail) with 3 columns, which indicate "bin1 of the 1st chromosome", "bin2 of the 2nd chromosome", and "contact frequency" respectively. See Overview above.

To transform this data to the cooler format, just run the command below:

$ toCooler -O K562-MboI-parts.cool -d datasets --assembly hg38 --nproc 1

toCooler routinely fetch sizes of each chromosome from UCSC with the provided genome assembly name (here hg38). However, if your reference genome is not holded in UCSC, you can also build a file like "hg38.chromsizes" in current working directory, and pass the file path to the argument "--chromsizes-file".

Type toCooler with no arguments on your terminal to print detailed help information for each parameter.

For this dataset, toCooler will create a cooler file named "K562-MboI-parts.cool", and your data will be stored under the URI "K562-MboI-parts.cool::25000".

This tutorial only illustrates a very simple case, in fact the metadata file may contain list of resolutions (if you have data at different resolutions for the same cell line) and corresponding folder paths (both relative and absolute path are accepted, and if your data are in the NPZ format, this path should point to the NPZ file):

res:10000
  /absoultepath/10K

res:25000
  ../relativepath/25K

res:40000
  /npzfile/anyprefix.npz

Then toCooler will generate a single cooler file storing all the specified data under different cooler URI. Suppose your cool file is named "specified_cooler_path", the above data will be stored at "specified_cooler_path::10000", "specified_cooler_path::25000", and "specified_cooler_path::40000", respectively.

pyBHFDR and pyHICCUPS

After you have obtained a cool file, you can call peaks or chromatin loops using pyBHFDR or pyHICCUPS:

$ pyBHFDR -O K562-MboI-BHFDR-loops.txt -p K562-MboI-parts.cool::25000 -C 21 --pw 1 --ww 3

Or:

$ pyHICCUPS -O K562-MboI-HICCUPS-loops.txt -p K562-MboI-parts.cool::25000 --pw 1 2 4 --ww 3 5 7 --only-anchors

Type pyBHFDR or pyHICCUPS on your terminal to print detailed help information for each parameter.

Before step to the next section, let's list the contents under current working directory again:

$ ls -lh

total 852K
drwxr-xr-x 4 xtwang  128 May  4 18:21 25K/
-rw-r--r-- 1 xtwang  17K May  4 18:23 K562-MboI-BHFDR-loops.txt
-rw-r--r-- 1 xtwang  15K May  4 18:23 K562-MboI-HICCUPS-loops.txt
-rw-r--r-- 1 xtwang 723K May  4 18:22 K562-MboI-parts.cool
-rw-r--r-- 1 xtwang   18 May  4 18:21 datasets
-rw-r--r-- 1 xtwang  293 May  4 18:21 hg38.chromsizes
-rw-r--r-- 1 xtwang 2.2K May  4 18:23 pyBHFDR.log
-rw-r--r-- 1 xtwang 8.5K May  4 18:23 pyHICCUPS.log
-rw-r--r-- 1 xtwang  17K May  4 18:22 tocooler.log

The detected loops are reported in a customized bedpe format. The first 10 columns are identical to the official definition, and the additional fields are:

  1. Fold enrichment score calculated from the donut background.
  2. The p value calculated from the donut background.
  3. The q value calculated from the donut background.
  4. Fold enrichment score calculated from the lower-left background.
  5. The p value calculated from the lower-left background.
  6. The q value calculated from the lower-left background.

Peak Visualization

Now, you can visualize the detected peaks/loops using peak-plot:

$ peak-plot -O test-HICCUPS.png -p K562-MboI-parts.cool::25000 -I K562-MboI-HICCUPS-loops.txt \
  -C 21 -S 25000000 -E 29500000 --clr-weight-name weight --vmin 0 --vmax 0.008

The output figure should look like this:

./figures/test-HICCUPS-new.png

Aggregate Peak Analysis

To inspect the overall loop patterns of the detected peaks, you can use the apa-analysis script:

$ apa-analysis -O apa.png -p K562-MboI-parts.cool::25000 -I K562-MboI-HICCUPS-loops.txt --clr-weight-name weight --vmax 2

The output plot should look like this:

./figures/apa-new.png

Combine different resolutions

The inputs to combine-resolutions are loop annotation files (bedpe) at different resolutions. If an interaction is detected as a peak in both resolutions, this script records the precise coordinates in finer resolutions and discards the coarser resolution one. And a long-range (determined by the --min-dis parameter) peak call at high resolutions (any resolutions lower than the --good-res cutoff, note that lower values correspond to higher resolutions) will be treated as a false positive if it could not be identified at lower resolutions (any resolutions equal to or greater than the --good-res cutoff). Here's a pseudo command with 3 loop files at 5Kb, 10Kb, and 20Kb respectively:

$ combine-resolutions -O K562-MboI-pyHICCUPS-combined.bedpe -p K562-MboI-pyHICCUPS-5K.txt K562-MboI-pyHICCUPS-10K.txt K562-MboI-pyHICCUPS-20K.txt -R 5000 10000 20000 -G 20000 -M 100000

Performance

The table below shows a performance test for the toCooler, pyBHFDR , and pyHICCUPS scripts:

  • Processor: 2.6 GHz Intel Core i7, Memory: 16 GB 2400 MHz DDR4
  • Software version: hicpeaks 0.3.0
  • At the 40Kb resolution, --pw and --ww are set to 1 and 3, respectively; at the 10Kb resolution, they are set to 2 and 5, respectively.
  • The original Hi-C data is stored in TXT
  • Number of proccesses assigned: 1
  • Valid contacts: total number of non-zero pixels in intra-chromosomal matrices
  • Running time format: hr: min: sec
Datasets Valid contacts toCooler pyBHFDR pyHICCUPS
  Memory Usage Running time Memory Usage Running time Memory Usage Running time
T47D (40K) 25,216,875 <600M 0:07:55 <600M 0:01:34 <600M 0:04:17
K562 (40K) 49,088,465 <1.2G 0:21:37 <1.0G 0:01:49 <1.0G 0:03:21
K562 (10K) 139,884,876 <3.0G 1:00:07 <2.0G 0:24:53 <4.0G 1:57:33

Note

Both pyBHFDR and pyHICCUPS support parallel computation (--nproc). If your computer has sufficient memory, the calculation should end within 30 minutes even for high-resolution matrices.

Release Notes

Version 0.3.5 (08/28/2022)

  • Added parameters to peak-plot and apa-analysis so that the output figures can be more finely tuned

Version 0.3.4 (05/04/2019)

  • Improved the efficiency of the local clustering algorithm
  • Changed the output loop format to bedpe

Version 0.3.3 (03/08/2019)

  • Made toCooler support the float data type
  • Removed ticklabels in APA plot

Version 0.3.2 (03/03/2019)

  • Supported combination of different resolutions
  • Improved the local clustering algorithm
  • Added the APA analysis module
  • Dealed with the compatiblility with cooler 0.8

Version 0.3.0 (09/03/2018)

  • Removed the horizontal and vertical backgrounds
  • Supported multiple combinations of the pw and ww parameters
  • Migrated to Python 3
  • Optimized the calculation efficiency
  • Fixed bugs when external .cool files are provided.

Version 0.2.0-r1 (08/26/2018)

  • Speeded up the program by dynamically limiting the donut widths

Version 0.2.0 (08/25/2018)

  • Added the vertical and horizontal backgrounds
  • Added additional filtering procedures based on the dbscan clusters and more stringent q value cutoffs
  • Fixed bugs of toCooler in storing the inter-chromosomal data

Version 0.1.1 (08/24/2018)

  • Lower memory usage and more efficient calculation

Version 0.1.0 (08/22/2018)

  • The first release.
  • Added toCooler and peak-plot.
  • Added support for multiple processing.

Pre-Release (05/04/2015)

  • Implemented core algorithms of BH-FDR and HICCUPS

Reference

[1]Rao SS, Huntley MH, Durand NC et al. A 3D Map of the Human Genome at Kilobase Resolution Reveals Principles of Chromatin Looping. Cell, 2014, 159(7):1665-80.

hicpeaks's People

Contributors

xiaotaowang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

hicpeaks's Issues

Calling peaks genome-wide

HI,
is there a way to call peaks genome-wide instead of the chromosome by chromosome? I guess I could make multiple chrxx_chrxx.txt files, and then concatenate all the calls, but i was hoping there was a more streamlined way of doing this.

pyHICCUPS error?

Dear,
when I use example provided for call loops, command below:
python ../scripts/pyHICCUPS -O K562-MboI-HICCUPS-loops.txt -p K562-MboI-parts.cool::40000 --pw 1 --ww 3
An error occured:

root INFO @ 09/03/18 13:59:59: Loading Hi-C data ...
root INFO @ 09/03/18 13:59:59: Calling Peaks ...
root INFO @ 09/03/18 13:59:59: Chromosome 21 ...
Traceback (most recent call last):
File "../scripts/pyHICCUPS", line 522, in
run()
File "../scripts/pyHICCUPS", line 181, in run
results = map_(worker, Params)
File "../scripts/pyHICCUPS", line 130, in worker
Diags = [H.diagonal(i) for i in np.arange(num)]
TypeError: diagonal() takes exactly 1 argument (2 given)

Could you help me?

Inter-chromosome peaks/loops

Hi XiaoTao,

Looks like your pyHICCUPS implementation does not support inter-chromosomal loops. Is there a quick fix to the code to output inter-chromosomal loops or you already implemented it?

Thanks!

Output coordinates question

Hi, thank you very much for this tool, I have tried to use it and was pleasantly surprised - very easy to use and fast!

I however have a small question about the output coordinates of pyHICCUPS. What do they correspond to? What is the difference between loc_1 and centroid_x? Sometimes they are the same, and sometimes they are not... And how is radius determined?

Thank you,
Ilya

toCooler

HI
Thank you for your work.
When I use the toCooler to change the matrix obtain from HiC-Pro into cool format, an error occured:

Traceback (most recent call last):
File "/opt/conda/bin/toCooler", line 131, in
run()
File "/opt/conda/bin/toCooler", line 112, in run
from hicpeaks.utilities import Genome, balance
File "/opt/conda/lib/python2.7/site-packages/hicpeaks/utilities.py", line 13, in
from cooler.io import create, parse_cooler_uri, CoolerMerger
ImportError: cannot import name parse_cooler_uri

so I edited the utilities.py as

from cooler.util import binnify, parse_cooler_uri
from cooler.io import create
from cooler.reduce import CoolerMerger

and it passed. Please check and confirm.

APA score

Hi Xiaotiao,

Another wonderful tool! Thank you so much.

Could HiCPeaks return a score value when do APA analysis with apa-analysis?

Thank you,
Pinpin

toCooler error because of input txt file

Hello Xiaotao,
I am a postdoctor from HZAU and now is learning data analysis for Hi-C. Recently I am using the HiCPeaks software to transform the raw matrix generated by HiC-pro to cool file. Some problems can't be solved.
According to your guidelines, I tried to substract interaction information for chr01 from the raw matrix HPC9_150000.matrix. According to file HPC9_150000_abs.bed , the chr01 is binned to 754 windows. So I generated a file with the code
awk '$1<=754&&$2<=754{print}' HPC9_150000.matrix >1_1.txt

head -5 HPC9_150000.matrix
1 1 1599
1 2 577
1 3 117
1 4 103
1 5 68

head -5 HPC9_150000_abs.bed
Chr01 0 150000 1
Chr01 150000 300000 2
Chr01 300000 450000 3
Chr01 450000 600000 4
Chr01 600000 750000 5

Then I run toCooler with code
toCooler -O HPC9_1.cool -d datasets --nproc 1 --chromsizes-file Ga_1.chromsizes &
It generates error "IndexError: index 754 is out of bounds for axis 0 with size 754"

File "/public/home/software/opt/bio/software/HiCPeaks/0.3.4/lib/python3.6/site-packages/hicpeaks-0.3.4-py3.6.egg/EGG-INFO/scripts/toCooler", line 128, in run
    balance(cooler_uri, nproc=args.nproc)
  File "/public/home/software/opt/bio/software/HiCPeaks/0.3.4/lib/python3.6/site-packages/hicpeaks-0.3.4-py3.6.egg/hicpeaks/utilities.py", line 417, in balance
    map=map_)
  File "/public/home/software/opt/bio/software/HiCPeaks/0.3.4/lib/python3.6/site-packages/cooler/balance.py", line 332, in balance_cooler
    .reduce(add, np.zeros(n_bins))
  File "/public/home/software/opt/bio/software/HiCPeaks/0.3.4/lib/python3.6/site-packages/cooler/tools.py", line 244, in reduce
    return reduce(binop, iter(self.run()), init)
  File "/public/home/software/opt/bio/software/HiCPeaks/0.3.4/lib/python3.6/site-packages/cooler/tools.py", line 54, in apply_pipeline
    data = func(chunk, data)
  File "/public/home/software/opt/bio/software/HiCPeaks/0.3.4/lib/python3.6/site-packages/cooler/balance.py", line 46, in _zero_trans
    mask = chrom_ids[pixels['bin1_id']] != chrom_ids[pixels['bin2_id']]
  File "/public/home/software/opt/bio/software/HiCPeaks/0.3.4/lib/python3.6/site-packages/pandas/core/arrays/categorical.py", line 2149, in __getitem__values=self._codes[key], dtype=self.dtype, fastpath=True
IndexError: index 754 is out of bounds for axis 0 with size 754

I noticed that the number of first two columes in input 1_1.txt file should be smaller than binned chr windows 754, instead of equal or larger than 754.

I tried to analyze the chr02, I used the code
awk '$1>=755&&$1<=1415&&$2>=755&&$2<=1415{print}' HPC9_150000.matrix >2_2.txt
I replaced 1_1.txt with 2_2.txt under directory ./150K/, then it generated similar errors "IndexError: index 755 is out of bounds for axis 0 with size 661" 661 is the binned number of chr02.
How to prepare the input file correctlly?

By the way, should I prepare the chr_chr.txt files for all the chromosomes one by one ?
Should I put all these chr_chr.txt files under the same ./150K/ directory ?

I hope you can reply. Thank you so much !!!
You can reply through email [email protected] if you think it is more convenient.

Best wishes.
Pengcheng

pyBHFDR can't find weight column

pyBHFDR -O K562-MboI-BHFDR-loops.txt -p Ga.40000.a.cool::40000 -C 4 --pw 1 --ww 3

root INFO @ 10/08/23 15:58:09: Python Version: 3.6.15
root INFO @ 10/08/23 15:58:09:

ARGUMENT LIST:

Output file = K562-MboI-BHFDR-loops.txt

Cooler URI = Ga.40000.cool::40000

Chromosomes = ['4']

Peak window width = 1

Donut width = 3

Maximum donut width = 10

Significant Level = 0.05

Maximum Genomic distance = 2000000

Weight column name = weight

Number of Processes = 1

root INFO @ 10/08/23 15:58:10: Loading Hi-C data ...
root INFO @ 10/08/23 15:58:10: Calling Peaks ...
Traceback (most recent call last):
File "/data/Software/miniconda3/envs/TADlib/bin/pyBHFDR", line 185, in
run()
File "/data/Software/miniconda3/envs/TADlib/bin/pyBHFDR", line 169, in run
for key, pixel_table in results:
File "/data/Software/miniconda3/envs/TADlib/bin/pyBHFDR", line 116, in worker
cHeatMap = Lib.matrix(balance=args.clr_weight_name, sparse=True).fetch(key)
File "/data/Software/miniconda3/envs/TADlib/lib/python3.6/site-packages/cooler/core/_selectors.py", line 150, in fetch
return self._slice(self.field, i0, i1, j0, j1)
File "/data/Software/miniconda3/envs/TADlib/lib/python3.6/site-packages/cooler/api.py", line 384, in _slice
self._is_symm_upper,
File "/data/Software/miniconda3/envs/TADlib/lib/python3.6/site-packages/cooler/api.py", line 710, in matrix
+ "calculate balancing weights or set balance=False."
ValueError: No column 'bins/weight'found. Use cooler.balance_cooler to calculate balancing weights or set balance=False.

toCool

toCooler -O Ga.40000.a.cool -d datasets --chromsizes-file aa.leng --no-balance --nproc 1

root INFO @ 10/08/23 16:06:11: Python Version: 3.6.15
root INFO @ 10/08/23 16:06:11:

ARGUMENT LIST:

Output cooler path = Ga.40000.a.cool

Hi-C datasets = {40000: '/gpfs/Project/wangzw_Project/TDA_analysis/test/HiCPeaks/40K'}

Chromosomes = ['#', 'X']

Include trans-chromosomal data = False

Genome Assembly = None

Chromosome size file = aa.leng

Number of processes = 1

Log file name = tocooler.log

hicpeaks.utilities INFO @ 10/08/23 16:06:12: Read chromosome sizes from /gpfs/Project/wangzw_Project/TDA_analysis/test/HiCPeaks/aa.leng
hicpeaks.utilities INFO @ 10/08/23 16:06:12: Done
hicpeaks.utilities INFO @ 10/08/23 16:06:12: Extract and save data into cooler format for each resolution ...
hicpeaks.utilities INFO @ 10/08/23 16:06:12: Current resolution: 40000bp
hicpeaks.utilities INFO @ 10/08/23 16:06:12: Generate bin table ...

first, do toCooler convert txt file to cool file format .
then call peaks using pyBHFDR , has some error message . don't know how to solve it.
thanks

ValueError: Offset 1687 (index 1687) out of bounds

In pyHICCUPS, I get the following error:

ValueError: Offset 1687 (index 1687) out of bounds

It occurs in sparse.diags in the following code chunk (~line 135). Do you know what causes it? –
H = Lib.matrix(balance=False, sparse=True).fetch(key)
cHeatMap = Lib.matrix(balance=True, sparse=True).fetch(key)
# Customize Sparse Matrix ...
chromLen = H.shape[0]
num = args.maxapart // resolution + args.maxww + 1

        Diags = [H.diagonal(i) for i in np.arange(num)]
        M = sparse.diags(Diags, np.arange(num), format='csr')

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.