degrootlab / pmx Goto Github PK
View Code? Open in Web Editor NEWThis project forked from dseeliger/pmx
Toolkit for free-energy calculation setup/analysis and biomolecular structure handling
License: GNU Lesser General Public License v3.0
This project forked from dseeliger/pmx
Toolkit for free-energy calculation setup/analysis and biomolecular structure handling
License: GNU Lesser General Public License v3.0
Hi,
I've been using PMX for a while now and a thought has just popped in to my head: I'm repartitioning hydrogen mass with a scale factor of 3, but noticed in my top files that the dummy atoms added will not be scaled. I.e. I will have hydrogens that are non-dummy with a mass of 3, but the dummy hydrogen atoms will have a mass of 1. Does it matter if the dummy atoms that are being transitioned into /away from are not the same mass as the non-dummy atoms?
I feel like this shouldn't be an issue but I wanted to check just incase,
Thanks.
Hello,
I have a question regarding the calculation of transitions between ligands with different total charges.
As per the tutorial, I've followed the steps to prepare equilibrium simulation files for each end-point using ligandhybrid. However, I've encountered an issue where the net charge is not 0 during the production run, and I anticipate charge changes during the transition path as well.
Could you please provide guidance on how to set up the system appropriately to address this?
Thank you in advance for your assistance.
Hi all,
I've been looking at speeding up my FEP calculations. While I've been looking at increased end state sampling using a variety of enhanced sampling methods, an easy win looks like using hydrogen mass repartitioning (HMR) and increasing the timestep from 2fs to 4fs.
Has anyone had experience doing this using the non-eq RFBE approach? I have run some test simulations, and while 3/4 worked, one simulation broke during the first eq_nvt stage (following a successful minimisation) due to LINCS warnings and the following fatal error:
Fatal error:
There are 52 perturbed non-bonded pair interactions beyond the pair-list
cutoff of 1.26 nm, which is not supported. This can happen because the system
is unstable, or because intra-molecular interactions are excluded. The latter
case is usually triggered by the use of couple-intramol=no. The issue can be
either due to a too small box, which can cause a molecule and its periodic
image to end up in the pairlist. In this case increase the box size. Or it can
happen because interactions at distances longer than rlist are excluded, in
which case you can try to increase nstlist or rlist to avoid this.
This system attempts to convert a methyl R group into a propyl R group, and hence there are quite a few hydrogens in the hybrid topology (pictured in orange)
Any suggestions as to what may have caused this system to break? Any thoughts about using HMR with non-eq FEP?
My plan is to try and stabilise the system with non-HMR EM / EQ prior to increasing timestep / repartitioning hydrogens and running a longer simulation.
Thanks,
Noah
Dear PMX developers,
I am trying to setup FEP calculations for a protein-peptide system where the peptide has some non-natural amino acids which I have parameterized using Antechamber with gaff2. My workflow is as follows.
My question is that if I generate gromacs systems for both WT and mutant using the above protocol, can I use pmx to generate hybrid topologies and run FEP simulations?
Hello,
I am trying to prepare a DSSB system with pmx doublebox
, but I get an error with a Zn atom. I have tried saving the pdb in several ways but still get this error:
Traceback (most recent call last):
File "/home/almeida/.local/bin/pmx", line 8, in <module>
sys.exit(entry_point())
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/scripts/cli.py", line 97, in entry_point
PmxCli()
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/scripts/cli.py", line 44, in __init__
getattr(self, args.command)()
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/scripts/cli.py", line 68, in doublebox
make_double_box.entry_point()
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/scripts/make_double_box.py", line 72, in entry_point
main(args)
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/scripts/make_double_box.py", line 65, in main
mout = double_box(m1=m1, m2=m2, r=args.r, d=args.d,
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/model.py", line 1165, in double_box
com1, rad1 = _get_com_radius(m1)
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/model.py", line 1087, in _get_com_radius
amass = _get_mass(a)
File "/home/almeida/.local/lib/python3.8/site-packages/pmx/model.py", line 1036, in _get_mass
return(library._atommass[aname[0]])
KeyError: 'Z'
Any help will be appreciated.
Best
When using pmx from the develop branch with python3 I get the following error:
TypeError: a bytes-like object is required, not 'str'
The error occurs in the following line:
Line 65 in 1063622
The fix seems quite easy, just open the file with mode "rb" and pass bytes to pickle.load, and that seems to work both in python2 and 3. I can open a PR for you to review if you want.
at the moment generate_hybrid_residue.py has an option to create a protein library by running over all possible amino acid pairs, using pmx Models stored in the data folder. We could allow the same for DNA/RNA...
Hi,
I'm attempting to run non-eq FEP and using some PMX tools to help generate the topologies to do so. Using ligandHybrid fails when I include a certain single ligand (ejm46) in the pair, while working fine with all other ligand pairs.
The command I'm using is:
'pmx ligandHybrid -i1 ejm42.pdb -i2 ejm46.pdb -itp1 ejm42.top -itp2 ejm46.top -pairs pairs_a.dat -oA merged.pdb -oitp merged.itp -offitp ffmerged.itp'
The resulting error is as follows:
b'ligandHybridTop__log_> Reading ligand 1 from: "/home/noah/Documents/md/toolkit/output/ejm42_ejm46/input/ejm42.pdb"'
b'ligandHybridTop__log_> Reading ligand 2 from: "/home/noah/Documents/md/toolkit/output/ejm42_ejm46/input/ejm46.pdb"'
b'ligandHybridTop__log_> Reading topology 1 from: "/home/noah/Documents/md/toolkit/output/ejm42_ejm46/input/ejm42.top"'
b'ligandHybridTop__log_> Reading topology 2 from: "/home/noah/Documents/md/toolkit/output/ejm42_ejm46/input/ejm46.top"'
b'Traceback (most recent call last):'
b' File "/home/noah/anaconda3/envs/biosimspace/bin/pmx", line 33, in '
b" sys.exit(load_entry_point('pmx==0+untagged.879.gb0b5684', 'console_scripts', 'pmx')())"
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/scripts/cli.py", line 97, in entry_point'
b' PmxCli()'
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/scripts/cli.py", line 44, in init'
b' getattr(self, args.command)()'
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/scripts/cli.py", line 64, in ligandHybrid'
b' ligandHybrid.entry_point()'
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/scripts/ligandHybrid.py", line 189, in entry_point'
b' main(args)'
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/scripts/ligandHybrid.py", line 246, in main'
b' itp2 = TopolBase(args.itp2)'
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/forcefield.py", line 140, in init'
b' self.read()'
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/forcefield.py", line 177, in read'
b' self.read_molecules(lines)'
b' File "/home/noah/anaconda3/envs/biosimspace/lib/python3.9/site-packages/pmx-0+untagged.879.gb0b5684-py3.9-linux-x86_64.egg/pmx/forcefield.py", line 249, in read_molecules'
b' self.molecules.append([entr[0], int(entr[1])])'
b'IndexError: list index out of range'
Input files are here. Is there any reason this might be happening? Have checked the top files and the pdb files but can't see any issues. Again, since this works for other pairs including ejm42, but always fails if ejm46 is included in a pair, it's safe to say this issue is specific to ejm46 input data.
I am using the develop branch.
I have a system of three protein chains, thus by default, topol.top
refers to three .itp
files for each chain. pmx reads them correcly, but tries to write the .itp
files nested, due to line 154 of src/pmx/scriptsgenerate_hybrid_topology.py
:
out_fn = '{0}/pmx_{1}'.format(basepath,itp_fn)
This obviously throws an error.
Line 147 goes like this:
basepath = outfile.rsplit('/',1)[0]
for now, my workaround was to change that to
basepath = os.path.dirname(os.path.abspath(outfile))
so at least all files are written, but due to the str representation of the topol object and link 154, it writes files such: pmx_topol_Protein_chain_A.itp
. I can rename them and work on.
However, I am not entirely sure I understood the intended behaviour. Perhaps I could only work on the itp
which has the mutation, but in general, there can be more than one. Either way, I suggest a fix and a revision to that piece of code, even if more comprehensive exception handling is not affordable at the moment.
The following modules are not py3 compatible yet:
options
_xdrio
I'll fix this at some point...
Hi, thanks for your amazing work. I try to pmx to create hybrid topology and protein files. I used charmm36mut force field to generate mutate protein ( works well). after that, I used pdb2gmx to create hybrid topology files with charmm36mut force field, but it shows:
Fatal error:
Atom type ON2 (residue TPO) not found in atomtype database
It works well when i input the same force field and protein file on the website server, and it also works if i change the force field into charmm22 on the terminal command.
I think the charmm36 force field has something wrong, but I have no idea how to fix this problem as i am a new student here. could you please help me fix it? thanks!
Hi,
I've been following the pmx tutorial found here. In this tutorial, the hybrid molecule with both A and B end states is created at the start of the protocol, and subjected to energy minimisation, equilibration and then transition stages.
I was wondering whether it is possible to create the hybrid molecule post-equilibration, and pre-transition. I.e., Run the EM and EQ protocol with a single molecule A, extract the frames, and then at every frame you combine molecule A with molecule B to create the hybrid molecule using PMX ligandHybrid. I guess you would have to do some sort of alignment procedure to ensure that B is aligned with the positions of A in the frame. You would also have to do some fiddling with the coordinate files to extract the original molecule and re-insert the hybrid molecule.
Do you have any ideas whether this would work, and do you have any advice for achieving this?
Thanks.
Hi,
I've been using the pmx module for a while now to create single-topology merged molecules.
While I have a good understanding of most of the output, I havevn't found documentation explaining how the wplots should be interpreted.
I have two plots here, showing a transition from ligand A -> ligand B, in complex with protein.
Am I right in thinking that the overlap of the two histograms indicates good convergence? And more overlap reflects more overlap of the forward and reverse snapshots? With EQ FEP I believe you expect the forward and reverse energy values to converge towards the end of the time-series. Is this the same with non-EQ FEP? Or would good convergence / overlap of the forward/reverse work values be more present over the whole graph?
Thanks.
b' File "/home/---/miniconda3/envs/AZtutorial/lib/python3.7/site-packages/pmx/ligand_alchemy.py", line 774, in _isTriple'
b' if(getBondLength(mol,a.GetIdx(),neighb.GetIdx())<1.25 ): # need to check bond length (in Angstroms)'
Maybe it shouldn't be getBondLength, but self._getBondLength
In the function readPDBString, there is an instance, self.x that reads the coordinates of the pdb files.
Currently self.x=[float(line[30:38]), float(line[39:46]), float(line[47:54])]
But it should be self.x=[float(line[30:38]), float(line[39:46]), float(line[46:54])]
In the develop
python3-adapted branch, I am a bit puzzled with the logics behind this line
To give an example, if I try to modify *-C into *-CC, hydrogens of methyl group are never mapped to hydrogens of the first carbon of ethyl group. Thus, efficiently in the resulting hydrid topology carbon will be bonded to 5 hydroges (three real ones and two dummy ones). This actually blocks using the hmr with GROMACS. But it also looks a bit strange to me in general.
@vgapsys Could you maybe share the idea behind this line? I tested internally and with commenting out this condition I am getting reasonable mappings which I can use with hmr. The following code maps hydrogens to minimize rmsd, which makes sense to me and allows runs with hmr.
I'm trying to mutate FAQ to AAA.
The gro file for FAQ is
MDANALYSIS FRAME 0: Created by PDBWriter
50
1PHE N 1 5.894 7.535 8.466
1PHE H1 2 5.925 7.620 8.511
1PHE H2 3 5.869 7.549 8.369
1PHE H3 4 5.806 7.502 8.504
1PHE CA 5 5.998 7.433 8.483
1PHE HA 6 5.950 7.338 8.458
1PHE CB 7 6.127 7.451 8.403
1PHE HB1 8 6.195 7.368 8.423
1PHE HB2 9 6.161 7.552 8.429
1PHE CG 10 6.122 7.460 8.252
1PHE CD1 11 6.017 7.409 8.180
1PHE HD1 12 5.930 7.365 8.227
1PHE CE1 13 6.003 7.449 8.049
1PHE HE1 14 5.919 7.410 7.993
1PHE CZ 15 6.099 7.525 7.982
1PHE HZ 16 6.089 7.555 7.879
1PHE CE2 17 6.210 7.566 8.057
1PHE HE2 18 6.281 7.628 8.005
1PHE CD2 19 6.219 7.539 8.193
1PHE HD2 20 6.306 7.574 8.247
1PHE C 21 6.026 7.423 8.635
1PHE O 22 6.073 7.525 8.691
2ALA N 23 6.020 7.305 8.698
2ALA H 24 6.001 7.221 8.645
2ALA CA 25 6.063 7.285 8.837
2ALA HA 26 6.026 7.358 8.908
2ALA CB 27 6.004 7.153 8.880
2ALA HB1 28 6.049 7.064 8.837
2ALA HB2 29 6.020 7.152 8.988
2ALA HB3 30 5.896 7.151 8.868
2ALA C 31 6.214 7.293 8.855
2ALA O 32 6.261 7.334 8.961
3GLN N 33 6.292 7.255 8.754
3GLN H 34 6.241 7.201 8.685
3GLN CA 35 6.431 7.272 8.745
3GLN HA 36 6.467 7.353 8.808
3GLN CB 37 6.503 7.147 8.800
3GLN HB1 38 6.588 7.112 8.742
3GLN HB2 39 6.445 7.055 8.796
3GLN CG 40 6.541 7.165 8.949
3GLN HG1 41 6.585 7.075 8.990
3GLN HG2 42 6.449 7.174 9.007
3GLN CD 43 6.635 7.275 8.992
3GLN OE1 44 6.755 7.281 8.952
3GLN NE2 45 6.591 7.359 9.080
3GLN HE21 46 6.492 7.353 9.097
3GLN HE22 47 6.641 7.435 9.123
3GLN C 48 6.485 7.312 8.604
3GLN OC1 49 6.541 7.420 8.586
3GLN OC2 50 6.477 7.228 8.512
12.28070 12.28070 13.81770
However, I got
pmx mutate -f FAQ_ligand.gro -o FAQ_ligand.mutant.gro
Choose a force field:
[i] name description
[1] amber14sbmut MUT_Amber_ff14sb (ported by Man Hoang Viet, North Carolina State University)
[2] amber99sb-star-ildn-bsc1-mut [Protein, DNA] Amber99sb-star-ildn-bsc1 for DNA (Best & Hummer 2009, Lindorff-Larsen et al. 2010)
[3] amber99sb-star-ildn-dna-mut [Protein, DNA] Amber99sb-star-ildn (Best & Hummer 2009, Lindorff-Larsen et al. 2010)
[4] amber99sb-star-ildn-mut [Protein] Amber99sb-star-ildn (Best & Hummer 2009, Lindorff-Larsen et al. 2010)
[5] charmm22star-mut CHARMM22* all-atom force field
[6] charmm36m-mut [Protein, DNA] Charmm36m all-atom force field (November 2016)
Enter the index [i] of the chosen forcefield: 1
Select residue to mutate:
1-PHE- 2-ALA- 3-GLN-
Enter residue number: 1
Select new amino acid for 1-PHE:
Three- or one-letter code (or four-letter for ff specific residues): ALA
Will apply mutation F->A on residue PHE-1
log_> Residue to mutate: 1 | PHE |
log_> Mutation to apply: F->A
log_> Hybrid residue name: F2A
Traceback (most recent call last):
File "/Users/XXX/opt/miniconda3/envs/pmx/bin/pmx", line 10, in
sys.exit(entry_point())
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/scripts/cli.py", line 86, in entry_point
PmxCli()
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/scripts/cli.py", line 41, in init
getattr(self, args.command)()
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/scripts/cli.py", line 45, in mutate
mutate.entry_point()
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/scripts/mutate.py", line 578, in entry_point
main(args)
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/scripts/mutate.py", line 564, in main
verbose=True)
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/alchemy.py", line 82, in mutate
mtp_file=mtp_file, refB=refB, verbose=verbose)
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/alchemy.py", line 116, in apply_aa_mutation
bb_super(residue, hybrid_res)
File "/Users/XXX/opt/miniconda3/envs/pmx/lib/python3.7/site-packages/pmx/geometry.py", line 135, in bb_super
assert len(atoms1) == len(atoms2), "%s -> %s" % ('-'.join(map(lambda a: a.name, atoms1)), '-'.join(map(lambda a: a.name, atoms2)))
AssertionError: N-CA-C-O-HA -> N-CA-C-H-O-HA
Hi, i wonder if there is a way to use some special ions, like TB3P (Terbium), DY3P(Dysprosium)?
Thanks
Hi,
I'm looking at setting up non-equilibrium FEP calculations and have settled on PMX as a toolkit and parameter file repository to do this. In the PL benchmarking directory I saw in the readme the following line:
These files are meant to be used with a custom gmx4.6 version with an alternative soft-core formulation:
pmx.mpibpc.mpg.de/gromacs462_newsc.tar
and on the pmx website
Using the default Gromacs soft-core may cause artifacts during the non-equilibrium transitions. We have implemented an alternative soft-core version into Gromacs 4.6.2 version (unfortunately GPU support here is not yet supported with the free energy calculations): gromacs462_newsc.tar The default soft-core parameters in this Gromacs version are hardcoded following the original publication: DOI: 10.1021/ct300220p
So I have a few questions surrounding this modified potential:
Many thanks,
Noah
https://github.com/deGrootLab/pmx/blob/develop/LICENSE and https://degrootlab.github.io/pmx/ says LGPL 3.0, but setup.py (and thus https://pypi.org/project/pmx/ and https://pypi.org/project/biobb-pmx/ and ) say GPL 3.0. Which is the license of (this fork of) PMX?
I assume it is meant to be LGPL 3.0 (as in dseeliger/pmx), unless the Python package is adding a GPL dependency? Would you fix the mix-up?
It is still unclear if the "or any later" condition applies - so in formal SPDX identifiers either:
..should be added to the README - as the file license headers do not declare LGPL.
python setup.py install
/usr/local/pmx/versioneer.py:421: SyntaxWarning: invalid escape sequence '\s'
LONG_VERSION_PY['git'] = '''
Traceback (most recent call last):
File "/usr/local/pmx/setup.py", line 43, in
version=versioneer.get_version(),
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/pmx/versioneer.py", line 1480, in get_version
return get_versions()["version"]
^^^^^^^^^^^^^^
File "/usr/local/pmx/versioneer.py", line 1412, in get_versions
cfg = get_config_from_root(root)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/pmx/versioneer.py", line 342, in get_config_from_root
parser = configparser.SafeConfigParser()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'configparser' has no attribute 'SafeConfigParser'. Did you mean: 'RawConfigParser'?
Is it possible to set the number of threads/cores used when running PMX via command line? It appears as if it automatically uses maximum number of CPU cores, this is certainly the case for atomMapping, unclear if it applies to other functions though. I haven't been able to see any CLI flags that allow control of this.
Thanks,
Noah
Hi, I generated a hybrid topology of two ligands, the [ dihedrals ] section of the hybrid topology looks like this:
[ dihedrals ]
; ai aj ak al funct c0 c1 c2 c3 c4 c5
1 10 9 3 1 180 15.3215155 2 180 0 2 ; C1x C10x C9x C3x (AAAA->DDDD)
1 10 9 3 1 180 0 2 180 15.3215155 2 ; C1x C10x C9x C3x (AAAA->DDDD)
1 10 9 8 1 180 15.3215155 2 180 0 2 ; C1x C10x C9x C8x (AAAA->DDDD)
1 10 9 8 1 180 0 2 180 15.3215155 2 ; C1x C10x C9x C8x (AAAA->DDDD)
1 11 2 3 1 180 24.7411728 2 180 0 2 ; C1x N1x C2x C3x (AAAA->DDDD)
1 11 2 3 1 180 0 2 180 24.7411728 2 ; C1x N1x C2x C3x (AAAA->DDDD)
1 11 2 23 1 180 15.6141438 2 180 0 2 ; C1x N1x C2x H2x (AAAA->DDDD)
1 11 2 23 1 180 0 2 180 15.6141438 2 ; C1x N1x C2x H2x (AAAA->DDDD)
2 3 4 12 1 180 4.8669776 2 180 0 2 ; C2x C3x C4x C11x (AAAA->DDAA)
2 3 4 12 1 180 0 2 180 0.48669776 2 ; C2x C3x C4x C11x (AAAA->DDAA)
....
The dihedrals for almost all the pairs are defined twice. So, I have 2 questions about this [ dihedrals ] output:
Add a script to test the correctness of the mutant ff libraries. No need for this to be a module too, as it will be run ad-hoc. This relates to #5
Hi,
I have cloned the repo and switched to the develop branch in order to use Python3. However, I get multiple indentation errors in atoms_to_morph.py (I haven't check the other files yet). It seems there is a mix of tabs and spaces in the file and that is raising errors. I tried to replace "\t" with 8 spaces (it seems to be the case here) but even that failed on lines like 329, for instance, in which you have an odd number of spaces.
I am not sure that is a known issue but I just wanted to let you known.
Thanks!
Dear deGrootLab, I would like to humbly ask if possible for the original code for pymacs library as it is integral to run the tconcoord gui plugin.
These ff libraries come from merging master (dna ff) and proline branches (protein ff), and then merging dna and protein forcefields so that they are in a single folder. It is likely the resulting libraries might be broken in some way or another. I have been using bits and pieces (either only protein, dna, or rna) of the amber forcefields for testing of refactored code, which seemed fine, but at some point for any real usage we should re-build the libraries from scratch, maybe after having implemented some automated energy tests/checks.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.