Code Monkey home page Code Monkey logo

gargammel's Introduction

gargammel: simulations of ancient DNA datasets

install with bioconda

gargammel is a set of programs aimed at simulating ancient DNA fragments. For ancient hominin samples our program can also simulate various levels of present-day human contamination and microbial contamination.

The website for gargammel can be found here: https://grenaud.github.io/gargammel/

Questions/bug report/feature requests :

If you have Github account, consider creating an issue, you will help others who might have the same problem.

contact: Gabriel Renaud   
email:	 gabriel [dot] reno [ at sign ] gmail.com

I accept pull request for novel features.

Downloading:

Do a :

git clone --recursive  --depth 1 https://github.com/grenaud/gargammel.git

or via (bio)conda

conda install -c bioconda gargammel

Installing with conda will only provide the main gargammel program, for the additional scripts in the repository, please run git clone as above, and create the conda environment described below.

Requirements:

  • git
  • C++ compiler supporting C++11
  • cmake, you can install on Ubuntu by typing: sudo apt install cmake
  • zlib
  • lib gsl, you can install on Ubuntu by typing: sudo apt-get install libgsl0-dev

If you plan on using ms2chromosomes.py to simulate chromosomes based on ms, you also need:

Both should be installed in your path.

Alternatively, you can use the supplied conda environment.yml file to download and set up all dependencies described in this README for you.

conda env create -f environment.yml

Installation:

If you are using the conda enviroment, you can skip this step and just load the environment with conda activate gargammel. All subsequent steps you can replace gargammel.pl with just gargammel.

In the main directory, simply type

make

This should install bamtools (C++ library to read/write BAM files) and ART (Illumina read simulator).

Overview:

The main driver script, gargammel.pl calls the following programs in order to simulate the in vivo process by which ancient DNA fragments are retrieved:

  • fragSim: simulation of ancient DNA fragments being retrieved at random from the genome
  • deamSim: simulation of damage to the fragments selected by fragSim
  • adptSim: adding of adapters to create raw Illumina reads (without errors and quality scores)

Finally, the simulated raw Illumina reads are sent to ART to add sequencing errors and corresponding quality scores.

Input description:

The basic input is a directory with 3 subfolders named:

  • endo/
  • cont/
  • bact/

Which represent the endogenous ancient human, the present-day human contaminant and the microbial contamination respectively. Each file inside represents a genome (not simply a chromosome or scaffold). The endogenous ancient human can only contain more than 2 genomes since it is a diploid individual. For the microbial contamination, please add a representative set of microbes for your sample (see the section about the examples of microbial databases).

Example of usage:

This is an example of usage to simulate a slightly contaminated (8%) dataset. First, we will simulate chromosomes using ms and seq-gen:

mkdir data

Next, we will create 1000 simulations of 2 lineages that are allowed to coalesce after 0.2 units of coalescence. The first one will represent our endogenous ancient human while the other, the present-day human contaminant. It will also generate an additional chromosome from the same population as the contaminant to be used as reference for alignment. We generate sequences for those using the following script:

cd data/
python ../ms2chromosomes.py  -s 0.2 -f . -n 1000 
rm -rfv simul_* seedms #cleanup

This will create the following files:

cont/cont.0.fa
cont/cont.1.fa
endo/endo.1.fa
endo/endo.2.fa
endo/segsites
ref.fa

The segsites files correspond to heterozygous sites between both endogenous genomes.

Then we will create the aDNA fragments:

cd ..
./gargammel.pl -c 3  --comp 0,0.08,0.92 -f src/sizefreq.size.gz  -matfile src/matrices/single-  -o data/simulation data/

This will simulate a dataset with 8% human contamination. The rate of misincorporation due to deamination that will be used will follow a single-strand deamination using the empirical rates measured from the Loschbour individual from:

Lazaridis, Iosif, et al. "Ancient human genomes suggest three ancestral populations for present-day Europeans." Nature 513.7518 (2014): 409-413.

The size distribution of the aDNA fragments is a subset of:

Fu, Qiaomei, et al. "Genome sequence of a 45,000-year-old modern human from western Siberia." Nature 514.7523 (2014): 445-449. 

The read size will be 2x75bp and the Illumina platform being simulated is the HiSeq 2500. The final reads will be found:

data/out_s1.fq.gz
data/out_s2.fq.gz

Here are further examples of usage:

  • Low coverage 0.5X coverage with fragments of length 40:

gargammel.pl -c 0.5 --comp 0,0,1 -l 40 -o data/simulation data/

  • Generating exactly 1M fragments of length with a log-normal distribution of location 4.106487474 and scale 0.358874723:

gargammel.pl -n 1000000 --comp 0,0,1 --loc 4.106487474 --scale 0.358874723 -o data/simulation data/

  • High coverage (20X) with high amount of present-day contamination (40%) with fragments of length 45:

gargammel.pl -c 20 --comp 0,0.4,0.6 -l 45 -o data/simulation data/

  • Evaluating the impact of mapping 1M fragments with length 40 without double-stranded deamination:

gargammel.pl -n 1000000 --comp 0,0,1 -l 40 -o data/simulation data/

  • Evaluating the impact of mapping 1M fragments with length 40 with double-stranded deamination:

gargammel.pl -n 1000000 --comp 0,0,1 -l 40 -damage 0.03,0.4,0.01,0.3 -o data/simulation data/

  • Generate a single-end run of 96 cycles on a HiSeq 2500 Illumina run with 1M fragments of 40bp:

gargammel.pl -n 1000000 --comp 0,0,1 -l 40 -rl 96 -se -ss HS25 -o data/simulation data/

  • Generate a paired-end run of 96 cycles on a HiSeq 2500 Illumina run with 1M fragments of 40bp:

gargammel.pl -n 1000000 --comp 0,0,1 -l 40 -rl 96 -ss HS25 -o data/simulation data/

Specifying damage/deamination:

If you use gargammel.pl or deamSim, you can speficiy deamination/damage using either:

  1. Use Briggs model parametes (see Briggs, Adrian W., et al. "Patterns of damage in genomic DNA sequences from a Neandertal." Proceedings of the National Academy of Sciences 104.37 (2007): 14616-14621.)

  2. Use a misincorporation matrix computed by mapDamage (https://ginolhac.github.io/mapDamage). This matrix is in the results directory created by mapDamage and is called "misincorporation.txt". There are 2 examples of such files:

    examplesMapDamage/results_LaBrana/misincorporation.txt examplesMapDamage/results_Ust_Ishim/misincorporation.txt

The first is from a double-stranded library and the second a single-stranded one. To use either, you can use the wrapper script or deamSim as such:

-mapdamage examplesMapDamage/results_LaBrana/misincorporation.txt double
-mapdamage examplesMapDamage/results_Ust_Ishim/misincorporation.txt single

We suggest that you run mapDamage on the empirical data that you are trying to emulate and use the resulting misincorporation.txt file.

  1. Specify a matrix of deamination rates, we use the following format, the first line is the header:

     A->C	A->G	A->T	C->A	C->G	C->T	G->A	G->C	G->T	T->A	T->C	T->G
     pos	rate_{A->C}	rate_{A->G}	rate_{A->T}	rate_{C->A}	rate_{C->G}	rate_{C->T}	rate_{G->A}	rate_{G->C}	rate_{G->T}	rate_{T->A}	rate_{T->C}	rate_{T->G}
    

The pos. is the position 0,1... after the fragment beginning/end. The rate is specified using the following: estimate [estimate_low estimate_high]. For example, 0.3 [0.2 0.4] means that the rate of deamination is 0.3 or 30%.

example of a format:

A->C	A->G	A->T	C->A	C->G	C->T	G->A	G->C	G->T	T->A	T->C	T->G
0	1.853e-3 [1.726e-3..1.989e-3]	4.064e-3 [3.875e-3..4.263e-3]	3.269e-3 [3.099e-3..3.448e-3]	6.661e-3 [6.254e-3..7.094e-3] 3.057e-3 [2.785e-3..3.355e-3] 8.004e-2 [7.865e-2..8.145e-2] 1.236e-2 [    1.183e-2..1.292e-2] 4.131e-3 [3.828e-3..4.459e-3] 6.703e-3 [6.314e-3..7.116e-3] 3.845e-3 [3.624e-3..4.079e-3] 4.581e-3 [4.339e-3..4.836e-3] 2.169e-3 [2.005e-3..2.347e-3]
1	1.986e-3 [1.849e-3..2.134e-3]	4.273e-3 [4.070e-3..4.487e-3]	3.030e-3 [2.859e-3..3.211e-3]	5.357e-3 [5.001e-3..5.738e-3] 3.188e-3 [2.916e-3..3.485e-3] 1.427e-2 [1.369e-2..1.488e-2] 9.514e-3 [    9.075e-3..9.974e-3]	3.316e-3 [3.061e-3..3.593e-3] 5.061e-3 [4.743e-3..5.400e-3] 3.421e-3 [3.216e-3..3.639e-3] 4.865e-3 [4.620e-3..5.124e-3]	2.201e-3 [2.038e-3..2.377e-3]

This follows the output of https://bitbucket.org/ustenzel/damage-patterns.git

  1. You can use one of the precalculated rates of deamination in src/matrices/. There is a damage from single-strand and a double-strand libraries from the following study:

    Lazaridis, Iosif, et al. "Ancient human genomes suggest three ancestral populations for present-day Europeans." Nature 513.7518 (2014): 409-413.

See the methylation question for adding different rates of deamination for methylated/unmethylated cytosine.

Can I specify different rates of misincorporation due to deamination for the endogenous/bacterial/human contaminant sources?

Yes, please refer to the options of the wrapper script gargammel.pl

Is it possible to specify different rates of deamination for methylated and unmethylated bases?

Yes. In the endogenous genome, specify methylated cytosine as 'c' (lowercase c) and unmethylated cytosine as 'C' (uppercase C). You can specify multiple cells using the following directory structure:

input/
input/endo
input/endo/C0
input/endo/C0/chr20_0_split1.fa
input/endo/C0/chr20_0_split1.fa.fai
input/endo/C0/chr20_0_split2.fa
input/endo/C0/chr20_0_split2.fa.fai
input/endo/C1
input/endo/C1/chr20_1_split1.fa
input/endo/C1/chr20_1_split1.fa.fai
input/endo/C1/chr20_1_split2.fa
input/endo/C1/chr20_1_split2.fa.fai
input/endo/C2
input/endo/C2/chr20_2_split1.fa
input/endo/C2/chr20_2_split1.fa.fai
input/endo/C2/chr20_2_split2.fa
input/endo/C2/chr20_2_split2.fa.fai

Where C0 reprensents the first cell, C1 the second and so forth. A lower case C 'c' is a methylated C and an uppercase 'C' is a an unmethylated C. To create these files from a reference and a methylation map, please see the script src/addMethyl.pl which needs to be modified (hardcoded paths).

Methylated and unmethylated cytosines on the - strand can be specified using 'g' and 'G'. Once this is done, you can specify the option: --methyl for gargammel.pl. When using --methyl, you can then specify different matrix files for rates of deamination for nonmethylated and methylated cytosines:

-matfilenonmeth    [matrix file prefix] Read the matrix file of substitutions for non-methylated Cs
-matfilemeth       [matrix file prefix] Read the matrix file of substitutions for methylated Cs

How can I get an ancient DNA composition profile for gargammel?

By composition we mean the base frequency at the breaks. You could generate it manually, the format is as follows:

# comment
Chr	End	Std	Pos	A	C	G	T	Total
[chr]	['5p' or '3p']	['+' or '-']	[pos wrt the 5p/3p end]	[count A]	[count C]	[count G]	[count T]	[sum of counts]

For instance:

# table produced by mapDamage version 2.0.5-1-ge06bd84
# using mapped file Ust_Ishim.hg19_1000g.bam and human_g1k_v37.fasta as reference file
# Chr: reference from sam/bam header, End: from which termini of DNA sequences, Std: strand of reads
Chr	End	Std	Pos	A	C	G	T	Total
21	3p	+	-4	177086	83624	114115	150943	525768
21	3p	+	-3	191241	80099	104155	150269	525764
21	3p	+	-2	197747	63995	127660	136360	525762
21	3p	+	-1	180637	49770	79519	215833	525759
21	3p	+	1	188505	79678	204246	53417	525846
21	3p	+	2	156848	74009	128222	166767	525846
21	3p	+	3	188608	75382	113613	148243	525846
21	3p	+	4	173245	84205	117226	151170	525846

The lines above specify the base count close +/- 4 bases to the 3p end for fragments mapping to the + strand. An example of this type of file is found here: src/dnacomp.txt

Such a file can be generated using mapDamage2.0:

Jonsson, Hakon, et al. "mapDamage2.0: fast approximate Bayesian estimates of ancient DNA damage parameters." Bioinformatics (2013): btt193.

It is normally called "dnacomp.txt" in the output directory, you can filter a single chromosome (in this case 21) using this command:

grep "^21\|^#\|^Chr"  /path to mapDamage output/results_[sample name]/dnacomp.txt >  dnacomp.txt

How can I specify the size distribution?

Ancient DNA molecules tend to be fragmented and can be very short but tend to have a specific shape. Both for the wrapper script (gargammel.pl) and the fragment simulation program (fragSim), there are are 4 ways to specify the :

  1. Specify a fixed length using -l

  1. Open a file containing the size distribution using -s, one empirical fragment length per line eg:

82
95
66
144
87
68
74
48
77
43

  1. Open a file containing the size frequencies using -f in the format "size[TAB]freq" eg:

40	0.017096
41	0.01832
42	0.0201954
43	0.018399
44	0.0195637
45	0.0198993
46	0.0196822
47	0.0209456
48	0.0203929
49	0.0199783
50	0.0204323

  1. Specify the size distribution using parameters from a log-normal distribution, using options --loc and --scale.

How can I get parameters for the size distribution?

If you wish to specify the aDNA fragment size distribution as a log-normal, you can use the following script to infer the location and scale parameters:

#!/usr/bin/env Rscript-3.2.0
library(fitdistrplus)
library(MASS)
	
args=(commandArgs(TRUE))

data <- read.table(args[1]);
	
df<-fitdistr(data$V1, "lognormal")

print(df);

You can change the header to suit the version of R that you have.

Bacterial databases:

For the input/bact/ directory which represent the microbial contamination, gargammel needs a set of fasta files that represent the different microbes. Each file corresponds to exactly one microbial species. Each fasta file must contain the genome of the microbial species, multiple scaffolds and plasmids are allowed. Each fasta file must also be faidx indexed. This directory must also contain a file called "list". This file contains the list of every fasta files in that directory along with their relative abundance in the desired bacterial contamination. For example:

bacteria1.fa	0.5
bacteria2.fa	0.3
bacteria3.fa	0.2

The abundance will be printed on the console when the program is launched. Some users have reported discrepancies between the original bacterial abundance and the printed one. Make sure that they are equal and that the bacterial abundance file uses UNIX carriage returns (use dos2unix or mac2unix to transform from DOS/MAC to Unix format).

Examples of bacterial databases:

If you wish to download an example of a suitable bacterial database, you can simply type:

 make bacterialex

this will create a directory called bactDBexample/ which contains clovis/ and k14/, the profiled microbial communities from Rasmussen et al. "The genome of a Late Pleistocene human from a Clovis burial site in western Montana." Nature 506.7487 (2014): 225-229. and Seguin-Orlando et al. "Genomic structure in Europeans dating back at least 36,200 years." Science 346.6213 (2014): 1113-1118, respectively.

You can copy the files from the fasta/ directory into the input's bact/ directory as such

cp -v bacterialex/clovis/fasta/* [path to input]/bact/

Creating bacterial databases from a metaBIT:

metaBIT [https://bitbucket.org/Glouvel/metabit] is a metagenomic profiler from high-throughput sequencing shotgun data. To download the fasta files based on a profile obtained using metaBIT's output, simply supply the "all_taxa.tsv" file, which details the different species and their abundances, make sure you are connected to the internet and use the retrieveFromMetabit script in as such:

mkdir exampleBacteriaDB
cd exampleBacteriaDB
[copy the all_taxa.tsv in the current directory]
src/microbial_fetcher/retrieveFromMetabit all_taxa.tsv

If you wish, you can enter your email for the ftp from NCBI (to avoid getting banned from the FTP):

src/microbial_fetcher/retrieveFromMetabit all_taxa.tsv [email protected]

This will download the necessary files from NCBI to create a database suitable for gargammel to simulate microbial species in the exampleBacteriaDB/fasta and run samtools faidx on each file. You need standard UNIX utilities such as awk/sed/python/curl/wget/gzip to be installed as well as samtools. Please move the fasta/ directory produced (exampleBacteriaDB/fasta in the example above) to the input/bact/. The file named "exampleBacteriaDB/fastafasta/list" is the list of bacterial species along with their abundance. Another file, "exampleBacteriaDB/Microbial_ID.log" details the strain/ID and ftp link used. retrieveFromMetabit uses GNU parallel (see O. Tange (2011): GNU Parallel - The Command-Line Power Tool, ;login: The USENIX Magazine, February 2011:42-47.), please make sure that it is installed.

If you want to use a uniform probability instead of a weighted list, go to "input/bact" and type (if fasta files end with .fa):

total=`ls -1  input/bact/*fa |wc -l ` && ls -1 input/bact/*fa  | awk -v total="$total" ' {print $1"\t"(1/total)}' > input/bact/list

metaBIT ref: Louvel et al. "metaBIT, an integrative and automated metagenomic pipeline for analyzing microbial profiles from high-throughput sequencing shotgun data." Molecular ecology resources (2016).

Tutorial using empirical sequences for simulations:

To provide an example of using empirical VCF files to create sequences for the simulation, there is a folder exampleSeq/ with a Makefile. This makefile provides a simple example of creating 2 chromosomes (2 endogenous sequences + 2 contaminant sequences for a diploid genome) from VCF files. This makefile needs the following commands to be installed in the path:

  • bedtools
  • bgzip
  • tabix
  • samtools
  • bcftools, must support "consensus" command

Make sure that you are connected to the internet and type:

cd  exampleSeq/ 
make

This will download the VCF files from the Altai Neanderthal (endogenous) and a present-day human of European descent (contaminant) create 4 files:

inputfolder/endo/endo.2.fa
inputfolder/endo/endo.1.fa
inputfolder/cont/cont.1.fa
inputfolder/cont/cont.2.fa

along with their respective fasta index. If you wish to add bacterial sequences to the mix, please see the section above about "Examples of bacterial databases" and you can copy some files to cont/ directory: cp -v ../bactDBexample/k14/fasta/* inputfolder/bact/

To create a sample with say 10% present-day human contamination with fragment length of 40bp, run:

./gargammel.pl -c 0.5 --comp 0,0.1,0.9 -l 40 -o exampleSeq/simulationc10 exampleSeq/inputfolder/

If you have some microbial sequences, to create a sample with say 70% bacterial content, 5% present-day human contamination and 25% endogenous, run:

./gargammel.pl -c 0.5 --comp 0.7,0.05,0.25 -l 40 -o exampleSeq/simulationb70c5 exampleSeq/inputfolder/

FAQ and issues

  • I am getting:

    ./art_illumina: error while loading shared libraries: libgsl.so.0: cannot open shared object file: No such file or directory

Make sure you have libgsl installed and create a symbolic link:

 sudo ln -s  /usr/lib/x86_64-linux-gnu/libgsl.so.23.0.0   /usr/lib/libgsl.so.0 
  • Can I know where on the genome of origin the fragment was sampled?

    Yes! fragSim, which generates the original fragments uses the following format: [CHROMOSOME NAME]:[STRAND]:[START]:[END]:[LENGTH] The overall wrapper (gargammel.pl) will add e1_ to endogenous fragments from the first reference and e2_ to endogenous fragments from the second reference. It will add c_X to the fragments from present-day human contaminants where X is the # of the genome and b_X to the fragments from bacterial contaminants where X is the # of the genome.

  • Can gargammel simulate indels?

    Yes and no. gargammel does not currently insert indels as a result of sequencing errors. However, if you add indels in your input genome, it will handle them without any problems.

gargammel's People

Contributors

chgibb avatar grenaud avatar jazpy avatar jch-13 avatar jfy133 avatar khanghoj avatar mikkelschubert 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

Watchers

 avatar  avatar  avatar

gargammel's Issues

ARM-64 / OS-64 issues

Hey Gabriel,

Thanks for your support as always (considering other issues here). I had a same problem from this grenaud/deML#12

I tried a workaround using the osx-64 conda side, unfortunately without success.

conda config --env --set subdir osx-64

Then, I tried to experiment Docker and it worked perfectly inside the dev container:

uname -a
Linux 435bf23243e8 6.5.11-linuxkit #1 SMP PREEMPT Wed Dec  6 17:08:31 UTC 2023 aarch64 GNU/Linux

The src/deamSim smoothly worked in this stake. I hope you consider some advice in the readme to use linux-based Docker for the unwary mac voyagers.

Happy new year! And keep forward, your work is awesome!

Cheers from Brazil,
All


setup:

uname -a
Darwin AllyssonM2pro.local 23.2.0 Darwin Kernel Version 23.2.0: Wed Nov 15 21:55:06 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6020 arm64

Error:

make
cd bamtools/ && mkdir -p build/  && cd build/ && if cmake ..; then echo ""; else if cmake3 ..; then echo ""; else echo "cmake failed, please install cmake v3"; fi  fi  && make
Found system JsonCpp, not using bundled version
-- Configuring done (0.1s)
-- Generating done (0.1s)
-- Build files have been written to: gargammel/bamtools

[ 66%] Built target BamTools
[ 74%] Built target BamTools-utils
[100%] Built target bamtools_cmd
cp bamtools/build/src/api/bamtools_api_export.h bamtools/src/api && cd ../.. 
make -C libgab
Makefile:72: warning: overriding commands for target `-'
Makefile:68: warning: ignoring old commands for target `-'
bamtools found
Makefile:72: warning: overriding commands for target `-'
Makefile:68: warning: ignoring old commands for target `-'
c++ -Wall  -lm -O3 -I. -Igzstream/ -Igargammel/bamtools/src/ -I/gargammel/bamtools/src/  -c ReconsReferenceBAM.cpp -o ReconsReferenceBAM.o
clang: warning: -lm: 'linker' input unused [-Wunused-command-line-argument]
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:281:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy_move_common.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/iterator_operations.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/iter_swap.h:14:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__utility/swap.h:16:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__type_traits/is_nothrow_move_constructible.h:15:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__type_traits/is_nothrow_constructible.h:17:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:41:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:281:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy_move_common.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/iterator_operations.h:13:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/ranges_iterator_concept.h:13:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/concepts.h:31:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/iter_move.h:15:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/iterator_traits.h:429:13: error: reference to unresolved using declaration
    typedef ptrdiff_t difference_type;
            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:60:1: note: using declaration annotated with 'using_if_exists' here
using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:281:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy_move_common.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/iterator_operations.h:13:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/ranges_iterator_concept.h:13:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/concepts.h:34:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/pointer_traits.h:67:29: error: reference to unresolved using declaration
    typedef _LIBCPP_NODEBUG ptrdiff_t type;
                            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:60:1: note: using declaration annotated with 'using_if_exists' here
using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:281:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy_move_common.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/iterator_operations.h:13:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/ranges_iterator_concept.h:13:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/concepts.h:34:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/pointer_traits.h:141:13: error: reference to unresolved using declaration
    typedef ptrdiff_t difference_type;
            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:60:1: note: using declaration annotated with 'using_if_exists' here
using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:281:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy_move_common.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/iterator_operations.h:15:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/advance.h:27:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/limits:117:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:281:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/copy_move_common.h:12:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/iterator_operations.h:15:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/advance.h:27:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/limits:827:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/type_traits:539:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:290:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__bit_reference:20:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/construct_at.h:23:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/new:97:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/exception:92:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:290:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__bit_reference:20:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/construct_at.h:23:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/new:98:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:300:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/reverse_iterator.h:23:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__iterator/iterator.h:22:56: error: reference to unresolved using declaration
template<class _Category, class _Tp, class _Distance = ptrdiff_t,
                                                       ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:60:1: note: using declaration annotated with 'using_if_exists' here
using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:307:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory_resource/polymorphic_allocator.h:19:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/stdexcept:48:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/iosfwd:101:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:307:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory_resource/polymorphic_allocator.h:20:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/tuple:254:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:307:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory_resource/polymorphic_allocator.h:20:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/tuple:259:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/compare:145:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__compare/compare_partial_order_fallback.h:13:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__compare/partial_order.h:14:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__compare/weak_order.h:14:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__compare/strong_order.h:20:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cmath:315:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:307:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory_resource/polymorphic_allocator.h:20:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/tuple:259:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/compare:157:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:307:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory_resource/polymorphic_allocator.h:20:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/tuple:1860:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/utility:260:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:308:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__split_buffer:21:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/allocator.h:96:13: error: reference to unresolved using declaration
    typedef ptrdiff_t   difference_type;
            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:60:1: note: using declaration annotated with 'using_if_exists' here
using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:308:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__split_buffer:21:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/allocator.h:185:13: error: reference to unresolved using declaration
    typedef ptrdiff_t   difference_type;
            ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:60:1: note: using declaration annotated with 'using_if_exists' here
using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:322:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:3359:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/algorithm:1711:
gzstream/version:1:1: error: expected unqualified-id
1.5 (08 Jan 2003)
^
In file included from ReconsReferenceBAM.cpp:8:
In file included from ./ReconsReferenceBAM.h:11:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/vector:3359:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/algorithm:1747:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__algorithm/inplace_merge.h:27:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__memory/temporary_buffer.h:27:12: error: reference to unresolved using declaration
pair<_Tp*, ptrdiff_t>
           ^
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/cstddef:60:1: note: using declaration annotated with 'using_if_exists' here
using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[2]: *** [ReconsReferenceBAM.o] Error 1
make[1]: *** [gargammel/bamtools/src/-/gargammel/bamtools/src] Error 2
make: *** [libgab/libgab.a] Error 2

fixed seed and add an annotation in the simulated read header

Hi Gabriel,

Currently gargammel simulates datasets by randomly extracting reads from a genome. Would it be possible to (1) add an option to take fixed seed as input, so that for a genome we can generate different simulated datasets with different damage degrees (both for fragSim or deamSim), while for each of these generated datasets we have every read coming from exactly the same position on the reference genome? In other word, we can simulate different damage degrees on the same reads; and (2) add an annotation in the simulated read header to indicate that a (or mutiple) C>G or A>T damage was added?

Sequencing system options

Hi! I've been using gargammel for a while and I think I encountered some issue with the available options for the sequencing system to be used to simulate the reads. When I look at the help of gargammel through ./gargammel.pl -h, I get the following as to the -ss option:

-ss [system] Illumina platfrom to use, the parentheses indicate the max. read length
use the shorthand in the left column:
(single-end, paired-end)
GA2 - GenomeAnalyzer II ( 50bp, 75bp)
HS20 - HiSeq 2000 ( 100bp, N/A)
HS25 - HiSeq 2500 ( 125bp, 150bp) (Default)
HSXt - HiSeqX TruSeq ( 150bp, N/A)
MSv1 - MiSeq v1 ( 250bp, N/A)
MSv3 - MiSeq v3 ( 250bp, N/A)

According to this, only GA2 and HS25 can be used with paired-end reads.
However, and correct me if I am wrong, when I check ART, which is the program used for creating the reads, I saw that the six of them can be used with paired-end reads. I also noticed that those length values between parentheses just correspond to lengths for which error profiles have been created.

Could you tell if I am missing something or this is actually some mistake here?
Many thanks!!

deamSim terminated successfuly but 0 sequences were written

Hi,

I am trying to use the deamSim sub-program to simulate some DNA post-mortem damage by giving a BAM file as the input. The command I used is

./deamSim -mapdamage ../examplesMapDamage/results_Ust_Ishim/misincorporation.txt single -b [path to my BAM file]

However, the program terminates immediately with the following message:
Program ./deamSim terminated succesfully, wrote 0 sequences

This is apparently not a successful termination. I am wondering what have gone wrong. My BAM file is a modern BAM file downloaded SGDP. Hope you can help me figure this out! Thanks in advance.

Make Python scripts compatible with Python 3

Following up on the discussin about the Conda recipe at #7, I found that these commands are sufficient to make the ms2chromosomes.py script be compatible with Python 3:

sed -i.bak 's|\t|        |g' ms2chromosomes.py
2to3 -w -n ms2chromosomes.py

Since Python 2 has reached end of life, it would be nice if this were done here directly, so we don’t have to add the above to the recipe build script.

The msprime_chromosomes.py appears to already run on Python 3, so no changes were needed.

weird Makefile

Hi,

I would like to install your software on our cluster - not using conda.

Apart from the fact that the Makefile wants to download from dropbox (which definetively should be part of a separate script, if at all), it tinkers with bamtools. Should this library not just be a dependency, rather than build within a 3rd party Makefile (which gargammel is)?

Cheers,
Chris

Modern to ancient?

Hi,

I'm trying to convert a modern genome to ancient; is it possible with Gargammel or does it only simulate an ancient genome from scratch?

The reason I need this is that I want to have known structural variants of the genome, thus I create a simulated genome with a modern simulator such as Varsim (therefore it generates a VCF that comprises the known SV variants) than I want to convert this genome to ancient so that I will have the SVs of the ancient genome. Is this possible with gargammel?

Thanks,
Arda

'ms2chromosomes.py' can't find 'ms' program

Hi,

I install gargammel using conda as you suggested (conda env create -f environment.yml) but after I activated the environment 'ms2chromosomes.py' can't find 'ms' program :

$ python ../ms2chromosomes.py  -s 0.2 -f . -n 1000
Detecting program: ms
Cannot find program: ms please make sure it is installed

But if I run 'type ms', it gives the right result :

$ type ms
ms is /home/xxxxx/anaconda3/envs/gargammel/bin/ms

What's the problem?

Can I use human reference genome in the 'endo' folder?

Hi,

In the tutorial, you use 'ms' to stimulate human fragments. Can I directly use the human reference genome or other modern human data in the 'endo' folder? If I don't care about the difference between ancient and present-day humans.

-damage command not found

Firstly, thank you for writing this awesome software!

I've found a small bug in gargammel.pl: calling -damage results in an "Unknown option" error. However, calling -briggs does the job.

Cheers,
Raphael

gzip in gargammel.pl causing filesystem issues

Hi,

gargammel.pl contains a few | gzip commands. This can be problematic (and has been on our cluster: it caused very low overall throughput):

  • filesystems do not cope well with repeated small requests. This might not be noted on a "small" filesystem and a "small" computer (e.g. a "big" server), but on huge parallel file system (e.g. of a cluster) this can be a performance killer (for gargammel-users and other users). The impact might only be noted, when many such processes run concurrently.
  • in addition to this it is to be noted that compression usually is slow and piping to gzip within the same cgroup will limit the scalability of the parent.

Generally, it is a good idea to compress final results, but not intermediate files (or to do so independently of an actual calculation).

Would you consider to change the wrapper script accordingly?

Best regards,
Chris

Make proper release and add LICENSE file for conda

Hi Gabriel,

At the request of a collegue, I've trying making a conda recipe for Gargammel for bioconda.

I've been able to get it to compile (albiet without the ms2chromosome.py functionality) - and will ask my collegue to test it a bit more fully.

However, following the bioconda guidelines, they request that the tarball comes from a 'stable' URL with a version, and also that the tarball includes a LICENSE file (https://bioconda.github.io/contributor/guidelines.html#stable-url).

I was wondering if you would be willing to add the corresponding License file to the repository (as I see in your paper you release it under GPL - although not sure which version) , and make a proper release of gargammel here on github? Then I could submit the recipe to bioconda (if you're interested in that, of course).

Cheers,

high coverage fail

Hi

I am trying to simulate aDNA data at high coverage. I assume the "-c" parameter sets the overall depth of coverage. Is this correct, or does it set the endogenous coverage? I do this:

./gargammel.pl -c 30 --comp 0.7,0.05,0.25 -l 110 -rl 100 -SS HS25 -o data/70-5-25-40x data/

after quite a long time gargammel fails:

....
Produced 2,147,400,000
ERROR: Cannot add thousandSeparator to non-integer 2147500000
system cmd /mnt/compgen/homes/calkan/projects/ancient/gargammel/src/adptSim -f AGATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATTCGATCTCGTATGCCGTCTTCTGCTTG -s AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTGGTCGCCGTATCATTT -l 100 -artp data/70-5-25-40x_a.fa data/70-5-25-40x_d.fa.gz failed: 256 at ./gargammel.pl line 79.

Adapters sequences seem not present

Hi,

I am using gargammel to simulate paired-end ancient metagenomic data. I am able to create both pair1.fastq and pair2.fastq, however, when I run AdapterRemoval to remove the adapters from the simulated reads (fastq files), the program does not detect any adapter sequence. Is this normal?
The command I used is:
./gargammel.pl --comp 0.19,0.8,0.01 -n 5000000 -l 70 -rl 40 -damage 0.036,0.36,0.009,0.8 -ss HS20 -o simulation_data/ input_folder/

Also, it seems that by default gargammel.pl simulate amplicon data. Is there an option to simulate paired-end sequencing data without the need to run a second time ART_Illumina?

Thanks in advance.

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.