Coder Social home page Coder Social logo

adamtaranto / teloclip Goto Github PK

View Code? Open in Web Editor NEW
33.0 5.0 3.0 839 KB

A tool for the recovery of unassembled telomeres from soft-clipped read alignments.

License: Other

Python 97.74% Dockerfile 2.26%
bioinformatics genome-assembly telomere telomere-length telomeres telomeric

teloclip's Introduction



Teloclip

A tool for the recovery of unassembled telomeres from soft-clipped read alignments.

Table of contents

About Teloclip

In most eukaryotic species, chromosomes terminate in repetitive telomeric sequences. A complete genome assembly should ideally comprise chromosome-level contigs that possess telomeric repeats at each end. However, genome assemblers frequently fail to recover these repetitive features, instead producing contigs that terminate immediately prior to their location.

Teloclip is designed to recover long-reads that can be used to extend draft contigs and resolve missing telomeres (short-read alignments may also be processed with teloclip). It does this by searching alignments of raw long-read data (i.e. Pacbio or ONT reads mapped with Minimap2) for 'clipped' alignments that occur at the ends of draft contigs. A 'clipped' alignment is produced where the end of a read is not part of its best alignment. This can occur when a read extends past the end of an assembled contig.

Information about segments of a read that were aligned or clipped are stored in SAM formatted alignments as a CIGAR string. Teloclip parses these strings to determine if a read has been clipped at one or both ends of a contig.

Optionally, teloclip can screen overhanging reads for telomere-associated motifs (i.e. 'TTAGGG' / 'CCCTAA') and report only those containing a match.

Teloclip is based on concepts from Torsten Seemann's excellent tool samclip. Samclip can be used to remove clipped alignments from a samfile prior to variant calling.

Options and Usage

Installation

Teloclip requires Python >= 3.8.

There are 4 options available for installing Teloclip locally:

  1. Install from PyPi.
    This or Bioconda will get you the latest stable release.
pip install teloclip
  1. Install from Bioconda.
conda install -c bioconda teloclip
  1. Pip install directly from this git repository.
    This is the best way to ensure you have the latest development version.
pip install git+https://github.com/Adamtaranto/teloclip.git
  1. Clone from this repository and install as a local Python package.
    Do this if you want to edit the code.
git clone https://github.com/Adamtaranto/teloclip.git && cd teloclip && pip install -e .

Verify installation

# Print version number and exit.
teloclip --version
# > teloclip 0.0.4

# Get usage information
teloclip --help

Run with Gitpod

Alternatively, launch a Gitpod Workspace with teloclip, samtools, and minimap2 pre-installed.

Example Usage

Basic use case: teloclip_example

First index the reference assembly

# Create index of reference fasta
samtools faidx ref.fa

Reading alignments from SAM file

# Read alignment input from sam file and write overhang-reads to stout
teloclip --ref ref.fa.fai in.sam

# Read alignment input from stdin and write stdout to file
teloclip --ref ref.fa.fai < in.sam > out.sam

Reading and writing BAM alignments

BAM files are binary sam files, they contain all the same information but take up much less storage space. You can use bam files with teloclip like this:

# Read alignments from bam file, pipe sam lines to teloclip, sort overhang-read alignments and wite to bam file
samtools view -h in.bam | teloclip --ref ref.fa.fai | samtools sort > out.bam

Streaming SAM records from aligner

# Map PacBio long-reads to ref assembly,
# return alignments clipped at contig ends, 
# write to sorted bam.
minimap2 -ax map-pb ref.fa pacbio_reads.fq.gz | teloclip --ref ref.fa.fai | samtools sort > out.bam 

# Map reads to reference, 
# Exclude non-primary alignments. 
# Return alignments clipped at contig ends,
# write to sorted bam.
minimap2 -ax map-pb ref.fa pacbio_reads.fq.gz | samtools view -h -F 0x100 | teloclip --ref ref.fa.fai | samtools sort > out.bam 

Report clipped alignments containing target motifs

# Report alignments which are clipped at a contig end
# AND contain >=1 copy of the telomeric repeat "TTAGGG" (or its reverse complement "CCCTAA") in the clipped region.
samtools view -h in.bam | teloclip --ref ref.fa.fai --motifs TTAGGG | samtools sort > out.bam 

# Report alignments which are clipped at a contig end
# AND contain >=1 copy of the telomeric repeat "TTAGGG" (or its reverse complement "CCCTAA") ANYWHERE in the read.
samtools view -h in.bam | teloclip --ref ref.fa.fai --motifs TTAGGG --matchAny | samtools sort > out.bam

# To change the minimum number of consecutive repeats required for a match, simply extend the search motif.
# In this example 3 TTAGGG are required for a positive match.
samtools view -h in.bam | teloclip --ref ref.fa.fai --motifs TTAGGGTTAGGGTTAGGG | samtools sort > out.bam 

Matching noisy target motifs

Raw long-reads can contain errors in the length of homopolymer tracks. If the --fuzzy option is set, motifs will be converted to regex patterns that allow the number of repeated bases to vary by +/- 1.
i.e. "TTAGGG" -> "T{1,3}AG{2,4}". This pattern will match TTAGG TTAGGGG TAGG TTTAGGG etc.

To reduce off target matching you can increase to minimum required number of motif matches with "--min_repeats".

# Compress homopolymers in query motifs and clipped regions to compensate for errors in raw PacBio or ONP data.
# i.e. The motif 'TTAGGGTTAGGG' becomes 'TAGTAG' and will match 'TTTTTAAAGGTTTAAGGG'.
samtools view -h in.bam | teloclip --ref ref.fa.fai --noPoly --motifs TTAGGGTTAGGG | samtools sort > out.bam

Extract clipped reads

teloclip-extract will write overhanging reads to separate fasta files for each reference contig end. The clipped region of each read is masked as lowercase in output fasta files.

Collections of reads that overhang a contig end can be assembled with miniasm into a single segment before being used to extend the contig. The final telemere-extended assembly should be polished (i.e. with Racon or Pilon) to correct errors in the raw long-read extensions.

# Find clipped alignments containing motif 'TTAGGG' and write reads to separate fasta files for each reference contig end.
samtools view -h in.bam | teloclip --ref ref.fa.fai --motifs TTAGGG | teloclip-extract --refIdx ref.fa.fai --extractReads --extractDir SplitOverhangs

Optional Quality Control

Additional filters

Users may wish to exclude reads below a minimum length or read quality score to reduce the risk of incorrect alignments.

In some cases it may be also be useful to prioritise primary alignments. This can be done by pre-filtering alignments with samtools view. You can decode sam flags here.

# Exclude secondary alignments.
samtools view -h -F 0x100 in.sam | teloclip --ref ref.fa.fai > noSA.sam 

Pre-corrected Data

Some assembly tools, such as Canu, preform pre-correction of long-reads through iterative overlapping and correction prior to assembly. Corrected reads are trimmed based on coverage to remove low-confidence ends.

This trimming step can result in loss of distal telomeric sequences and so these reads should NOT be used with Teloclip.

However, long-reads that have been error-corrected using Illumina data with tools such as LoRDEC or HALC should be fine.

Generally speaking, raw long-reads will be fine for extending your contigs. Any errors in the extended region can be corrected with a round of polishing with short-read data using Pilon.

Extending contigs

Before using terminal alignments identified by Teloclip to extend contigs you should inspect the alignments in a genome browser that displays information about clipped reads, such as IGV.

Check for conflicting soft-clipped sequences. These indicate non-specific read alignments. You may need to tighten your alignment criteria or manually remove low-confidence alignments.

After manually extending contigs the revised assembly should be re-polished using available long and short read data to correct indels present in the raw long-reads.

Finally, validate the updated assembly by re-mapping long-read data and checking for alignments that extend into revised contig ends.

Alternative use cases

Illumina data

Teloclip will also work fine with aligned short read data, which has a far lower error rate than single-molecule long-read data.

However, there are obvious limits to the distance that a contig may be extended with shorter reads.

Teloclip does not use information from paired-reads.

Merging existing assemblies

You may have assemblies for your genome generated with different assemblers/configurations or data types (i.e. Illumina, PacBio, ONT) which vary in their success in assembling individual telomeres.

These alternative assemblies can be treated as pseudo-long-reads and aligned to a reference using Minimap2.

Teloclip can identify aligned contigs that can be used to extend those in the reference set.

Be cautious of short contigs that may align to may repetative sub-telomeric regions and result non-specific extension of contigs.

Also beware of low-complexity telomeric regions on different chromosomes aligning to each other and resulting in end-to-end fusions.

# Align alternative assembly contigs to reference and report overhang alignments. Ignore secondary alignments.
minimap2 -ax asm5 ref.fa asm.fa | samtools view -h -F 0x100 | teloclip --ref ref.fa.fai | samtools sort > asm2ref.bam 

Circularising Mitochondrial / Bacterial genomes

Using default settings, teloclip will report alignments with clipped regions extending past linear contig ends.

Reads can be extracted from these alignments using circlator's bam2reads and re-aligned to an assembly graph in Bandage to help identify uncircularised contigs.

Options

Teloclip Options

Run teloclip --help to view the programs' most commonly used options:

Usage: teloclip [-h] [--version] --refIdx REFIDX [--minClip MINCLIP] [--maxBreak MAXBREAK]
                [--motifs MOTIFS] [--noRev NOREV] [--noPoly NOPOLY] [--matchAny MATCHANY]
                [samfile]

Required:
 --refIdx REFIDX       Path to fai index for reference fasta. Index fasta using `samtools faidx FASTA`

Positional arguments:
  samfile               Input SAM can be added as the first positional argument after flagged options. 
                          If not set teloclip will read from stdin.

Optional:
  --minClip            Require clip to extend past ref contig end by at least N bases.
                         Default: 1
  --maxBreak           Tolerate max N unaligned bases at contig ends. 
                         Default: 50
  --motifs             If set keep only reads containing given motif/s from a comma delimited list 
                         of strings. By default also search for reverse complement of motifs. 
                         i.e. TTAGGG,TTAAGGG will also match CCCTAA,CCCTTAA
                         Default: None
  --noRev              If set do NOT search for reverse complement of specified motifs. 
                         Default: Find motifs on both strands.
  --noPoly             If set collapse homopolymer tracks within motifs before searching overhangs.
                        i.e. "TTAGGGTTAGGGTTAGGGTTAGGGTTAGGG" -> "TAGTAGTAGTAGTAG".
                        Useful for PacBio or ONP long reads homopolymer length errors. Defaut: Off.            
  --matchAny           If set motif match may occur in unclipped region of alignment.
                         Defaut: False
  --version            Show program's version number and exit.

Teloclip-extract Options

Run teloclip-extract --help to view the programs' most commonly used options:

Usage: teloclip-extract [-h] --refIdx REFIDX [--prefix PREFIX]
                        [--extractReads] [--extractDir EXTRACTDIR]
                        [--minClip MINCLIP] [--maxBreak MAXBREAK] [--version]
                        [samfile]

positional arguments:
  samfile               If not set, will read sam from stdin.

optional arguments:
  -h, --help            Show this help message and exit
  --refIdx              Path to fai index for reference fasta. Index fasta
                        using `samtools faidx FASTA`
  --prefix              Use this prefix for output files. Default: None.
  --extractReads        If set, write overhang reads to fasta by contig.
  --extractDir
                        Write extracted reads to this directory. Default: cwd.
  --minClip             Require clip to extend past ref contig end by at least
                        N bases.
  --maxBreak            Tolerate max N unaligned bases at contig ends.
  --version             Show program's version number and exit

Citing Teloclip

If you use Teloclip in your work please cite this git repo directly and note the release version you used.

Publications using Teloclip

van Westerhoven, A., Mehrabi, R., Talebi, R., Steentjes, M., Corcolon, B., Chong, P., Kema, G. and Seidl, M.F., 2023. A chromosome-level genome assembly of Zasmidium syzygii isolated from banana leaves. bioRxiv, pp.2023-08.

Yang, H.P., Wenzel, M., Hauser, D.A., Nelson, J.M., Xu, X., Eliáš, M. and Li, F.W., 2021. Monodopsis and Vischeria genomes shed new light on the biology of eustigmatophyte algae. Genome biology and evolution, 13(11), p.evab233.

Issues

Submit feedback to the Issue Tracker

License

Software provided under MIT license.

Teloclip hex-sticker was designed by @Super_Coleider.

teloclip's People

Contributors

adamtaranto 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

Watchers

 avatar  avatar  avatar  avatar  avatar

teloclip's Issues

Confusing about input and output file

Dear Adam,

It is amazing to find such a great tool for telomere anchoring! But I would like to say some expression you mentioned in the tutorial is blurred, especially the input and output file (like in.sam, out.sam and out.bam...). If you can clarify them, I would appreciate it. By the way, do you have any recommendations about citing your work, just github link or you have published it?

Thanks

Missing isMotifInClip()

main app tries to import isMotifInClip() which has been removed. Add replacement func.

In the meantime v0.0.4 from PyPi still works fine.

Verify: Correct read slice coords for negative strand alignments

May need to have isClipMotif() function check if the current alignment is on the negative strand before extracting sequence for motif search.

Assumptions:

  • Align coords are reported in fwd orientation from leftmost ref position.
  • CIGAR coords are reported for ref fwd orientation (left to right on ref)
  • Read string is not altered from raw read (may be reversed relative to CIGAR coords)

If above are true, then 3' overhang seq for 1000M500S should be retrieved as:

  • If forward alignment: Seq[-500:]
  • If reverse alignment: Seq[0:500]

and for a 5' alignment 500S1000M:

  • If forward alignment: Seq[0:500]
  • If reverse alignment: Seq[-500:]

Note: If printing overhang sequence to a summary file we should RC the extracted OH for neg strand alignments.

Add metadata to extracted overhang reads

teloclip-extract will write reads with terminal clipped-overhangs to fasta files. To aide in sanity checks we should include some metadata to the fasta header.

Proposed fields:

  • Anchor len: how much of the read is aligned to the ref sequence
  • Overhang len: how long is the overhang
  • Ref name: which sequence is it aligned to
  • Motifs : Motifs of regex patterns used in filtering (comma delim list)
  • Motif counts: Total count of motif matches in overhang (list matching order of motifs)

Other behaviour changes:

  • Sort fasta by overhang length
  • Include reference segment in output fasta (from earliest alignment start coord)
  • Log total read counts for each end of each reference sequence.
  • Print histogram of overhang depths
  • Log warning if unbalanced overhangs (i.e. most ends have 5 and one has 500 reads)

Restrict motif search to clipped region

Motif search currently requires at least one instance of any user-specified motif in a read that is clipped at a contig end. This match can occur anywhere in the read, and may not necessarily be in the distal clipped region.

Add option to restrict motif search to the clipped end (or ends for long reads that span entire contigs).

Automate testing

  • Add test cases for core functions.
  • Add github action to run test on PRs

Calculate alignment end position from CIGAR

Current alignment length is taken as "M" length adjacent to a clipped end "S".

Most long read alignments have more complex alignments with many indels. This leads to underestimation of alignment length and causes teloclip to miss most 3' overhangs.

Task: Explicitly sum all indel and alignment blocks from CIGAR string when reporting alignment length.

Automatically extend contigs

Hi,
I am wondering is there any way (not the manual checking) to extend the contigs according to the telomere overhangs identified?

Thx

Feature: Fuzzy motif search

Motif runs in clipped regions of raw ONT reads may contain homopolymer errors where the number of sequential repeated bases is incorrect. Currently teloclip has an option --noPoly which compresses homopolymer runs in both the motif and the read befor looking for matches. However, this is likely to reduce specificity and increase false positive matches.

Proposal: Replace homopolymer compression with a regex based fuzzy search method.

Steps:

  • Convert input motif to regex where all runs of > 1 base allow for a +/- 1 range.
  • Search given sequence with pattern
  • Return count of non-overlapping matches
  • Add noisy reporting of motif counts per readname in L/R end of contigname
  • Add Warning for depreciated --noPoly to be removed in future major release.

Should default behaviour be exact match or fuzzy search?

Could you explain in detail how to extend reads?

Dear autor:
I am assembling a plant genome, and now it is assembled to the level without gap. It have 21 chromosomes, but so far only 39 have been counted, and there are 3 motifs (AAACCCT) without telomeres.
Seeing the tools you developed, I think it will save a lot of manual work. I have tried step by step,
1. First index the reference assembly
samtools faidx hifiasm.fasta
2. Reading alignments from SAM file
minimap2 -ax map-hifi -t 120 hifiasm.fasta ../hifi/all.hifi.fasta | samtools view -@ 40 -h -F 0x100 >in.sam
3. Report clipped alignments containing target motifs
teloclip --ref hifiasm.fasta.fai --motifs AAACCCT in.sam| samtools sort -@ 60 > out.motifs.bam
4. Extract clipped reads
teloclip --ref hifiasm.fasta.fai --motifs AAACCCT in.sam | teloclip-extract --refIdx hifiasm.fasta.fai --extractReads --extractDir SplitOverhangs

but I am not familiar with the use of miniasm. the result is empty !

minimap2 -t 60 -x ava-pb B01_L.fasta no-gap.id_B01.fasta > telo-read.paf 
miniasm -f no-gap.id_B01.fasta telo-read.paf > telo-min.gfa 
awk '/^S/{print ">"$2"\n"$3}' telo-min.gfa | seqkit seq > telo-min.fasta 

Could you give me some suggestions? Thank you very much.

NNNNN reads

Hi Adam,
love the tool, but came across something strange.

I ran the tool like this:

minimap2 -ax map-ont P9424_final.fasta ../P9424.correctedReads.fasta.gz | teloclip --ref P9424_final.fasta.fai  | samtools sort > P9424_teloclip.bam

When I look at the bam files I get a lot of these NNNNNNN reads as in the below image mapping to contig ends.
But when I go and look that read name up in the actual fasta reads file, they are proper reads without any Ns.
Any idea where that might come from?

Cheers

image

Package Distribution

  • Add github action to package and push to pypi on new release
  • Update Bioconda version

Improve readability

Continuing from issue #13. Update codebase to improve readability.

Tasks include:

Add typehints
Update logging
Add Docstrings
Split long functions into sub-functions

Feature: Align and Extend

Existing modules:

  • Base Teloclip extracts any reads that are soft-clipped at contig ends (optionally checking for telomeric motifs)
  • Teloclip-extract: bins reads from teloclip into output files per contig end (left / right for each contig)

New module:

  • Teloclip-extend: Extend a contig with the soft-clipped overhang of a single aligned read or contig.

Tasks:

  • Write function that takes a single aligned read and extends a contig with the overhanging (soft-clipped) segment of the alignment.
  • Handle cases where alignment is clipped at both ends of contig
  • Update argparser to use submodule keywords [filter, extract, extend]

Summary report option

Add support for plain text reporting of alignments of interest.

  • Option to give a summary output file name
  • For each alignment: Read ID, bitflag, contig ID, contig start, contig end, contig OH location (left/right), OH seq
  • Add padding to internal (contig side) boundary of soft-clip if the alignment does not end exactly at contig end
  • Add option to flip left-end extension (i.e report left OH as RC) to help with spotting approximate alignments by eye.
  • Write two lines for alignments that overhang both ends of a small contig.

Aim: Summary file that can be awk'd to list all OHs at one end of a given contig for visual inspection.

Interactive Contig extension

Add module for interactive extension of contigs.

  • Take teloclip filtered reads as input
  • For each contig end display overhangs
  • Prompt user to accept an extension, or
  • Error correct + assemble reads and realign to ref contig

Note: Need to write wrappers for racon, minimap2, and miniasm.

No 'rU' option in Python 3.12

hi,
I just found this tool and I was trying to fill telomere to our assembly.
I just installed this tool by conda as you wrote
conda install -c bioconda teloclip
then I tried use the test data like:
[$]> lh
total 180K
-rw-r--r-- 1 pliu ebio 17K Nov 1 13:28 test.bam
-rw-r--r-- 1 pliu ebio 336 Nov 1 13:28 test.bam.bai
-rw-r--r-- 1 pliu ebio 5.4K Nov 1 13:28 test.fna
-rw-r--r-- 1 pliu ebio 95 Nov 1 13:28 test.fna.fai
-rw-r--r-- 1 pliu ebio 141K Nov 1 13:28 test.sam
[$]
> samtools view -h test.bam | teloclip --ref test.fna.fai | samtools sort > out.bam
Traceback (most recent call last):
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/bin/teloclip", line 10, in
sys.exit(main())
^^^^^^
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/lib/python3.11/site-packages/teloclip/run_self.py", line 44, in main
ContigDict = teloclip.read_fai(args.refIdx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/lib/python3.11/site-packages/teloclip/init.py", line 247, in read_fai
with open(path, "rU") as f:
^^^^^^^^^^^^^^^^
ValueError: invalid mode: 'rU'
samtools sort: failed to read header from "-";
then I tried run another command:
[$]~> samtools view -h test.bam | teloclip --ref test.fna.fai --motifs TTAGGG | teloclip-extract --refIdx test.fna.fai --extractReads --extractDir SplitOverhangs
Importing reference contig info from: test.fna.fai
Traceback (most recent call last):
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/bin/teloclip", line 10, in
Traceback (most recent call last):
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/bin/teloclip-extract", line 10, in
sys.exit(main())
^^^^^^
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/lib/python3.11/site-packages/teloclip/run_self.py", line 44, in main
sys.exit(main())
^^^^^^
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/lib/python3.11/site-packages/teloclip/run_extract.py", line 283, in main
ContigDict = teloclip.read_fai(args.refIdx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/lib/python3.11/site-packages/teloclip/init.py", line 247, in read_fai
with open(path, "rU") as f:
^^^^^^^^^^^^^^^^
ValueError: invalid mode: 'rU'
contigInfo = teloclip.read_fai(args.refIdx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/ebio/abt5_projects/3D_genome_of_brown_algae/envs/hic/lib/python3.11/site-packages/teloclip/init.py", line 247, in read_fai
with open(path, "rU") as f:
^^^^^^^^^^^^^^^^
ValueError: invalid mode: 'rU'
do you have any idea about this issue?
Best, PF

Refresh codebase

A general refresh of the package is needed.

Phase 1 - Code cleanup and packaging

  • Restructure package
  • Migrate packaging to pyproject toml
  • Add codespace + gitpod config files

Phase 2 - Readability

  • Add typehints
  • Update logging
  • Add Docstrings

error "invalid mode: 'rU' " in teloclip (v. bioconda)

When installing and running teloclip through conda (Python v 3.11.5), I received the following error:

Traceback (most recent call last):
File "/home/sk893857/miniconda3/bin/teloclip", line 10, in
sys.exit(main())
^^^^^^
File "/home/sk893857/miniconda3/lib/python3.11/site-packages/teloclip/run_self.py", line 44, in main
ContigDict = teloclip.read_fai(args.refIdx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/sk893857/miniconda3/lib/python3.11/site-packages/teloclip/init.py", line 247, in read_fai
with open(path, "rU") as f:
^^^^^^^^^^^^^^^^
ValueError: invalid mode: 'rU'


note: This appears to be an invalid file read mode in Python 3. I solved this by manually replacing all instances of 'rU' with 'r' in both scripts. Maybe the conda version of teloclip needs a fix?

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.