Comments (9)
Could you check to ensure that you have a SAMPLE field in your header (e.g. #CHROM POS ID...FORMAT SAMPLE
)?
from truvari.
Hello,
Sorry for taking so long to answer, summer break and other projects ;)
You were right, my vcf file was lacking a sample name. But if I'm not mistaken, FORMAT and SAMPLE ID aren't in the vcf specification, they are supplementary fields for genotyped gvcf ? Does it mean Truvari works only for gvcf ? I'm trying to use it on a truth vcf and a vcf outputed by Sniffles, with default parameters, which means, it's not genotyped. Can it work anyway ?
Unfortunately, after fixing my sample_id problem, I got another error
truvari -b NA19240.GRCh38.variant_call.vcf.gz -c ERR3219853_minimap2_ont.vcf.gz -f ../hg38.fasta -o test
2019-09-03 16:28:25,577 [INFO] Params:
{
"sizemax": 50000,
"reference": "../hg38.fasta",
"noprog": false,
"multimatch": false,
"pctsize": 0.7,
"cSample": null,
"includebed": null,
"no_ref": false,
"passonly": false,
"pctsim": 0.7,
"pctovl": 0.0,
"comp": "ERR3219853_minimap2_ont.vcf.gz",
"refdist": 500,
"base": "NA19240.GRCh38.variant_call.vcf.gz",
"giabreport": false,
"sizefilt": 30,
"typeignore": false,
"gtcomp": false,
"debug": false,
"output": "test",
"bSample": null,
"sizemin": 50
}
2019-09-03 16:28:25,593 [INFO] Creating call interval tree for overlap search
Traceback (most recent call last):
File "/home/tintest/miniconda3/bin/truvari", line 1047, in <module>
run(sys.argv[1:])
File "/home/tintest/miniconda3/bin/truvari", line 734, in run
span_lookup, num_entries_b, cmp_entries = make_interval_tree(vcf_comp, args.sizefilt, args.sizemax, args.passonly)
File "/home/tintest/miniconda3/bin/truvari", line 83, in make_interval_tree
sz = get_vcf_entry_size(entry)
File "/home/tintest/miniconda3/bin/truvari", line 269, in get_vcf_entry_size
size = abs(entry.INFO["SVLEN"][0])
TypeError: bad operand type for abs(): 'str'
Such as indicated in #24, I removed every variant with no SVLEN (they were all CNV), but no improvement.
Can you help me ?
Regards.
from truvari.
While it's correct that FORMAT/SAMPLE aren't required for VCFs, Truvari assumes that at least a single sample is present in the VCF. You can simply 'fake' the presence of a sample by adding a FORMAT/SAMPLE line of "GT\t." to the end of every variant line.
As for your TypeError, the header of the comparison vcf probably doesn't have SVLEN defined as an Integer (e.g. ##INFO=<ID=SVLEN,Number=1,Type=Integer,Description="Difference in length between REF and ALT alleles">
) but instead a String.
from truvari.
Thank you !
I managed to get Truvari running by modifying the header and adding a fake format and genotyping to every variant line.
However, I am experiencing unusual behavior with your tool.
2019-09-04 18:15:13,337 [INFO] Running /home/tintest/miniconda3/bin/truvari -b NA19240.GRCh38.variant_call.vcf.gz -c NA19240.GRCh38.variant_call.vcf.gz -f ../hg38.fasta -o test5 -s 0 --sizemax 100000000000000000000000000000000000000000
2019-09-04 18:15:13,338 [INFO] Params:
{
"sizemax": 100000000000000000000000000000000000000000,
"reference": "../hg38.fasta",
"noprog": false,
"multimatch": false,
"pctsize": 0.7,
"cSample": null,
"includebed": null,
"no_ref": false,
"passonly": false,
"pctsim": 0.7,
"pctovl": 0.0,
"comp": "NA19240.GRCh38.variant_call.vcf.gz",
"refdist": 500,
"base": "NA19240.GRCh38.variant_call.vcf.gz",
"giabreport": false,
"sizefilt": 30,
"typeignore": false,
"gtcomp": false,
"debug": false,
"output": "test5",
"bSample": null,
"sizemin": 0
}
2019-09-04 18:15:13,355 [INFO] Creating call interval tree for overlap search
2019-09-04 18:15:21,877 [INFO] 38091 call variants in total
2019-09-04 18:15:21,878 [INFO] 38091 call variants within size range (30, 100000000000000000000000000000000000000000)
2019-09-04 18:15:26,405 [INFO] 38091 base variants
2019-09-04 18:15:26,441 [INFO] Matching base to calls
[Elapsed Time: 0:00:44 38091/38091] |##################################################################################################################################################################################################################################################################################################################################################| (Time: 0:00:44)
2019-09-04 18:16:10,469 [INFO] Results peek: 35873 TP-base 2194 FN 94.24% Recall
2019-09-04 18:16:10,469 [INFO] Parsing FPs from calls
[Elapsed Time: 0:00:05 38091/38091] |##################################################################################################################################################################################################################################################################################################################################################| (Time: 0:00:05)
{
"TP-base": 35873,
"TP-call": 35897,
"FP": 0,
"FN": 2194,
"precision": 1.0,
"recall": 0.9423647778916121,
"f1": 0.9703272923992426,
"base cnt": 38091,
"call cnt": 35873,
"base size filtered": 0,
"call size filtered": 0,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 35897,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 35873,
"TP-base_FP-gt": 0,
"gt_precision": 1.0,
"gt_recall": 0.9423647778916121,
"gt_f1": 0.9703272923992426
}
2019-09-04 18:16:15,771 [INFO] Stats: {
"TP-base": 35873,
"TP-call": 35897,
"FP": 0,
"FN": 2194,
"precision": 1.0,
"recall": 0.9423647778916121,
"f1": 0.9703272923992426,
"base cnt": 38091,
"call cnt": 35873,
"base size filtered": 0,
"call size filtered": 0,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 35897,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 35873,
"TP-base_FP-gt": 0,
"gt_precision": 1.0,
"gt_recall": 0.9423647778916121,
"gt_f1": 0.9703272923992426
}
2019-09-04 18:16:15,772 [INFO] Finished
Why when I am running my truth VCF against itself, it does not report recall equal to 1.0. Is it expected ? Also, even if I set the minimum SV calling size to 0, it does not process variants smaller than 30bp, but it seems they are taken into account for recall and precision calculation. By removing SV <30bp from my truth set, I achieved to get precision equal to 1.0, but I could'nt get more than 0.94 in recall.
Also, comparing my sample VCF to a truth set work only in a single "combinaison"
2019-09-04 18:20:24,633 [INFO] Running /home/tintest/miniconda3/bin/truvari -b NA19240.GRCh38.variant_call.vcf.gz -c ERR3219853_minimap2_ont.vcf.gz -f ../hg38.fasta -o test6 -s 0 --sizemax 100000000000000000000000000000000000000000
2019-09-04 18:20:24,634 [INFO] Params:
{
"sizemax": 100000000000000000000000000000000000000000,
"reference": "../hg38.fasta",
"noprog": false,
"multimatch": false,
"pctsize": 0.7,
"cSample": null,
"includebed": null,
"no_ref": false,
"passonly": false,
"pctsim": 0.7,
"pctovl": 0.0,
"comp": "ERR3219853_minimap2_ont.vcf.gz",
"refdist": 500,
"base": "NA19240.GRCh38.variant_call.vcf.gz",
"giabreport": false,
"sizefilt": 30,
"typeignore": false,
"gtcomp": false,
"debug": false,
"output": "test6",
"bSample": null,
"sizemin": 0
}
2019-09-04 18:20:24,742 [INFO] Creating call interval tree for overlap search
2019-09-04 18:20:29,379 [INFO] 18011 call variants in total
2019-09-04 18:20:29,379 [INFO] 17725 call variants within size range (30, 100000000000000000000000000000000000000000)
2019-09-04 18:20:35,749 [INFO] 38091 base variants
2019-09-04 18:20:35,795 [INFO] Matching base to calls
[Elapsed Time: 0:03:30 38091/38091] |##################################################################################################################################################################################################################################################################################################################################################| (Time: 0:03:30)
2019-09-04 18:24:05,963 [WARNING] No TP or FP calls in base!
2019-09-04 18:24:05,963 [INFO] Parsing FPs from calls
[Elapsed Time: 0:00:04 18011/18011] |##################################################################################################################################################################################################################################################################################################################################################| (Time: 0:00:04)
{
"TP-base": 0,
"TP-call": 0,
"FP": 18011,
"FN": 38091,
"precision": 0,
"recall": 0,
"f1": "NaN",
"base cnt": 38091,
"call cnt": 18011,
"base size filtered": 0,
"call size filtered": 0,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 0,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 0,
"TP-base_FP-gt": 0,
"gt_precision": 0,
"gt_recall": 0,
"gt_f1": "NaN"
}
2019-09-04 18:24:10,872 [INFO] Stats: {
"TP-base": 0,
"TP-call": 0,
"FP": 18011,
"FN": 38091,
"precision": 0,
"recall": 0,
"f1": "NaN",
"base cnt": 38091,
"call cnt": 18011,
"base size filtered": 0,
"call size filtered": 0,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 0,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 0,
"TP-base_FP-gt": 0,
"gt_precision": 0,
"gt_recall": 0,
"gt_f1": "NaN"
}
2019-09-04 18:24:10,873 [INFO] Finished
2019-09-04 18:24:43,769 [INFO] Running /home/tintest/miniconda3/bin/truvari -c NA19240.GRCh38.variant_call.vcf.gz -b ERR3219853_minimap2_ont.vcf.gz -f ../hg38.fasta -o test7 -s 0 --sizemax 100000000000000000000000000000000000000000
2019-09-04 18:24:43,770 [INFO] Params:
{
"sizemax": 100000000000000000000000000000000000000000,
"reference": "../hg38.fasta",
"noprog": false,
"multimatch": false,
"pctsize": 0.7,
"cSample": null,
"includebed": null,
"no_ref": false,
"passonly": false,
"pctsim": 0.7,
"pctovl": 0.0,
"comp": "NA19240.GRCh38.variant_call.vcf.gz",
"refdist": 500,
"base": "ERR3219853_minimap2_ont.vcf.gz",
"giabreport": false,
"sizefilt": 30,
"typeignore": false,
"gtcomp": false,
"debug": false,
"output": "test7",
"bSample": null,
"sizemin": 0
}
2019-09-04 18:24:43,788 [INFO] Creating call interval tree for overlap search
2019-09-04 18:24:49,809 [INFO] 38091 call variants in total
2019-09-04 18:24:49,809 [INFO] 38091 call variants within size range (30, 100000000000000000000000000000000000000000)
2019-09-04 18:24:52,336 [INFO] 18011 base variants
2019-09-04 18:24:52,370 [INFO] Matching base to calls
[Elapsed Time: 0:09:33 18011/18011] |##################################################################################################################################################################################################################################################################################################################################################| (Time: 0:09:33)
2019-09-04 18:34:26,025 [INFO] Results peek: 1981 TP-base 16030 FN 11.00% Recall
2019-09-04 18:34:26,025 [INFO] Parsing FPs from calls
[Elapsed Time: 0:01:00 38091/38091] |##################################################################################################################################################################################################################################################################################################################################################| (Time: 0:01:00)
{
"TP-base": 1981,
"TP-call": 1981,
"FP": 36013,
"FN": 16030,
"precision": 0.05213981154919198,
"recall": 0.10998834045860863,
"f1": 0.0707436835996786,
"base cnt": 18011,
"call cnt": 37994,
"base size filtered": 0,
"call size filtered": 0,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 1981,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 1981,
"TP-base_FP-gt": 0,
"gt_precision": 0.05213981154919198,
"gt_recall": 0.10998834045860863,
"gt_f1": 0.0707436835996786
}
2019-09-04 18:35:28,774 [INFO] Stats: {
"TP-base": 1981,
"TP-call": 1981,
"FP": 36013,
"FN": 16030,
"precision": 0.05213981154919198,
"recall": 0.10998834045860863,
"f1": 0.0707436835996786,
"base cnt": 18011,
"call cnt": 37994,
"base size filtered": 0,
"call size filtered": 0,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 1981,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 1981,
"TP-base_FP-gt": 0,
"gt_precision": 0.05213981154919198,
"gt_recall": 0.10998834045860863,
"gt_f1": 0.0707436835996786
}
2019-09-04 18:35:28,775 [INFO] Finished
I would have rather believed that base is the truth VCF, but it only works the other way.
Is this also an expected behavior ?
Thank you, regards.
from truvari.
For the size things you're seeing, please reference the main docs.
As for the different behavior when changing base/comp - could you check to make sure the tabix indexes for the two vcfs is present and correct.
from truvari.
I regenerated indexes with tabix, but nothing changed when I switched base and comp. It still works one way which is strange.
I reran my truth VCF against itself and I got a better recall, thanks to --sizefilt, but still not 1. I got every time a bunch of false negatives and I don't know why. I did the same experiment with my sample, and I only got 2 FN.
2019-09-05 16:58:15,971 [INFO] Running /home/tintest/miniconda3/bin/truvari -S 0 -s 30 --sizemax 100000000000000000 -c ERR3219853_minimap2_ont.vcf.gz -b ERR3219853_minimap2_ont.vcf.gz -f ../hg38.fasta -o test
2019-09-05 16:58:15,971 [INFO] Params:
{
"base": "ERR3219853_minimap2_ont.vcf.gz",
"comp": "ERR3219853_minimap2_ont.vcf.gz",
"output": "test",
"reference": "../hg38.fasta",
"giabreport": false,
"debug": false,
"noprog": false,
"refdist": 500,
"pctsim": 0.7,
"pctsize": 0.7,
"pctovl": 0.0,
"typeignore": false,
"gtcomp": false,
"bSample": null,
"cSample": null,
"sizemin": 30,
"sizefilt": 0,
"sizemax": 100000000000000000,
"passonly": false,
"no_ref": false,
"includebed": null,
"multimatch": false
}
2019-09-05 16:58:15,977 [INFO] Creating call interval tree for overlap search
2019-09-05 16:58:17,920 [INFO] 18011 call variants in total
2019-09-05 16:58:17,921 [INFO] 18011 call variants within size range (0, 100000000000000000)
2019-09-05 16:58:19,484 [INFO] 18011 base variants
2019-09-05 16:58:19,490 [INFO] Matching base to calls
[Elapsed Time: 0:01:41 18011/18011] |########################################################################################################################| (Time: 0:01:41)
2019-09-05 17:00:01,387 [INFO] Results peek: 17723 TP-base 2 FN 99.99% Recall
2019-09-05 17:00:01,387 [INFO] Parsing FPs from calls
[Elapsed Time: 0:00:01 18011/18011] |########################################################################################################################| (Time: 0:00:01)
{
"TP-base": 17723,
"TP-call": 17723,
"FP": 0,
"FN": 2,
"precision": 1.0,
"recall": 0.9998871650211566,
"f1": 0.9999435793274657,
"base cnt": 17725,
"call cnt": 17723,
"base size filtered": 286,
"call size filtered": 286,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 17723,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 17723,
"TP-base_FP-gt": 0,
"gt_precision": 1.0,
"gt_recall": 0.9998871650211566,
"gt_f1": 0.9999435793274657
}
2019-09-05 17:00:03,084 [INFO] Stats: {
"TP-base": 17723,
"TP-call": 17723,
"FP": 0,
"FN": 2,
"precision": 1.0,
"recall": 0.9998871650211566,
"f1": 0.9999435793274657,
"base cnt": 17725,
"call cnt": 17723,
"base size filtered": 286,
"call size filtered": 286,
"base gt filtered": 0,
"call gt filtered": 0,
"TP-call_TP-gt": 17723,
"TP-call_FP-gt": 0,
"TP-base_TP-gt": 17723,
"TP-base_FP-gt": 0,
"gt_precision": 1.0,
"gt_recall": 0.9998871650211566,
"gt_f1": 0.9999435793274657
}
2019-09-05 17:00:03,085 [INFO] Finished
Here are the 2 variants reported as FN :
1 143241950 935 N <DEL> . PASS CHR2=1;END=143242115;RE=331;IMPRECISE;SVLEN=165;SVMETHOD=Snifflesv1.0.11;SVTYPE=DEL;STD_quant_start=18.946016;STD_quant_stop=18.036663;Kurtosis_quant_start=3.152146;Kurtosis_quant_stop=1.392118;SUPTYPE=AL;STRANDS=+-;NumNeighbors=2;NumThresholdNeighbors=0;MatchId=979 GT:DR:DV ./.:.:331
22 18421873 16638 N <INV> . PASS CHR2=22;END=18896991;RE=21;PRECISE;SVLEN=475118;SVMETHOD=Snifflesv1.0.11;SVTYPE=INV;STD_quant_start=0.0;STD_quant_stop=0.316228;Kurtosis_quant_start=1.892036;Kurtosis_quant_stop=5.868685;SUPTYPE=SR;STRANDS=++;NumNeighbors=1;NumThresholdNeighbors=0;MatchId=16924 GT:DR:DV ./.:.:21
Have you any idea why ?
from truvari.
Weird. Could you send me the vcfs in question for debugging? Namely ERR3219853_minimap2_ont.vcf.gz and NA19240.GRCh38.variant_call.vcf.gz
from truvari.
Here they are :
https://filesender.renater.fr/?s=download&token=10db0378-46d6-c461-adf4-2459fed55e62&lang=en
Thank you.
from truvari.
For brevity - NA19240.GRCh38.variant_call.vcf.gz == 'N' and ERR3219853_minimap2_ont.vcf.gz == 'E'
- Comparing NtoE output against EtoN gives the same results with parameters:
{
"base": "ERR3219853_minimap2_ont.vcf.gz",
"comp": "NA19240.GRCh38.variant_call.vcf.gz",
"output": "EtoN",
"reference": "/reference/grch38_noalt_decoy/source.fasta",
"giabreport": false,
"debug": false,
"noprog": false,
"refdist": 500,
"pctsim": 0.7,
"pctsize": 0.7,
"pctovl": 0.0,
"typeignore": false,
"gtcomp": false,
"bSample": null,
"cSample": null,
"sizemin": 30,
"sizefilt": 0,
"sizemax": 100000000000000000,
"passonly": false,
"no_ref": false,
"includebed": null,
"multimatch": false
}
Even with switching the Base/Comp parameters, I saw:
"TP-base": 0,
"TP-call": 0,
"FP": 38091,
"FN": 17725,
With FP/FN being swapped, of course.
I tried again to replicate the NtoE != EtoN with your previous parameters:
truvari -c NA19240.GRCh38.variant_call.vcf.gz -b ERR3219853_minimap2_ont.vcf.gz -f ../hg38.fasta -o test7 -s 0 --sizemax 100000000000000000000000000000000000000000
truvari -b NA19240.GRCh38.variant_call.vcf.gz -c ERR3219853_minimap2_ont.vcf.gz -f ../hg38.fasta -o test6 -s 0 --sizemax 100000000000000000000000000000000000000000
The only thing that changed was the FP/FN counts.
"TP-base": 0,
"TP-call": 0,
"FP": 38346,
"FN": 18011,
Therefore I'm unable to replicate this problem. The last possibility I can think of is our versions of truvari may be different? I'm using the lastet v1.2.
- The calls in N.vcf are not sequence resolved. Your numbers are altered because the sequence
'<DEL>'
was being compared with real alt-sequences, thus creating lower sequence similarity below the default threshold of 0.7. I specified--pctsim 0
and was able to see in EtoN
"TP-base": 9619,
"TP-call": 9619,
"FP": 28070,
"FN": 8106,
"precision": 0.25522035607206345,
"recall": 0.5426798307475318,
Could you reanalyze your files again with these two commands?
truvari -S 0 -s 30 --sizemax 100000000000000000 -b ERR3219853_minimap2_ont.vcf.gz -c NA19240.GRCh38.variant_call.vcf.gz -f ../hg38.fasta -o EtoN_pctsim0 --pctsim 0
truvari -S 0 -s 30 --sizemax 100000000000000000 -c ERR3219853_minimap2_ont.vcf.gz -b NA19240.GRCh38.variant_call.vcf.gz -f ../hg38.fasta -o NtoE_pctsim0 --pctsim 0
(reference updated to paths provided from your logs)
Additionally, it appears you could possibly replace the ALTs with the INFO/SEQ if you wanted to check for sequence simiarlity.
- When running EtoE, the two 'FNs' arose because the events are 100% redundant. To keep track of matches, we keep a hash of keys representing vcf entries. Analyzing your E.vcf shows 2 copies of the chr1 and chr22 events that would collide. I'll think about a possible work around and if it is necessary for truvari to handle this edge case or the documentation should advise a pre-processing de-dupping of vcfs.
bcftools query -f "%CHROM %POS %INFO/END %REF %ALT\n" ERR3219853_minimap2_ont.vcf.gz | sort | uniq -c | sort -nr | head
2 22 18421873 18896991 N <INV>
2 1 143241950 143242115 N <DEL>
1 Y 56888109 56888408 N TTTTTTTTTTGAGACGGAGTCTCGCTCTGTCGGCCAGGCTGAGTGCAGTGGCGGGATCTCGCTCACTGCAAGCTCCGCCTCCCGGGTTCACGCCATTCTCCTGCCTCAGCTTCCCAAGTAGCTGGGACTACAGGCACCCGCCACTACGCCTGGCTAATTTTTTTGTATTTTTAGTAGAGACGGGGTTTCACCGCTTTAGCCGGGATGGTCTCGATCTCCTGACCTCGTGATCCGCCTGCCTCGGCCTCCCAAAGTGCTGGGATTGCGGCGTGACACGCGCCTGCCTGATGGTAGTC
...
from truvari.
Related Issues (20)
- Duplication to Insertion doubt HOT 4
- Failure in pip installation HOT 2
- Question: Does truvari have a upper limit on the file size? How to speed up? HOT 2
- BED Region off-by-one error HOT 4
- Zero matches between base and comp HOT 4
- AttributeError: 'CollapsedCalls' object has no attribute 'consolidate' | version 4.2.1 HOT 4
- Calculate SNV HOT 7
- complex genotype problem HOT 3
- GT integrate HOT 1
- No TP or FP calls for CNV HOT 1
- merging different SV type? HOT 3
- No FP or TP calls HOT 2
- Unable to run MAFFT HOT 9
- md5sum FIPS issue HOT 1
- Support vector for intra-sample merge HOT 6
- some questions about the results in fp.vcf.gz
- some questions about the results in fp.vcf.gz HOT 1
- Getting same numbers of TP-base and TP-comp HOT 4
- Suggested minor documentation changes
- Truvari, STRs and Expansion Hunter - Query HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from truvari.