Giter VIP home page Giter VIP logo

suepcoffea_dask's Introduction

SUEP Coffea

Actions Status Code style: black

This code runs the SUEP analysis using the coffea framework. We use fastjet with awkward array inputs for jet clustering.

Three separate analyses and their documentation are here:

Offline:

CADI: https://cms.cern.ch/iCMS/analysisadmin/cadilines?line=EXO-23-002&tp=an&id=2650&ancode=EXO-23-002

Note: https://gitlab.cern.ch/tdr/notes/AN-22-133

PAS: https://gitlab.cern.ch/tdr/notes/EXO-23-002

Paper: https://gitlab.cern.ch/tdr/papers/EXO-23-002

Scouting:

CADI: https://cms.cern.ch/iCMS/analysisadmin/cadilines?line=EXO-23-001&tp=an&id=2649&ancode=EXO-23-001

Note: https://gitlab.cern.ch/tdr/notes/AN-21-119

PAS: NA

Paper: https://gitlab.cern.ch/tdr/papers/EXO-23-001

ZH:

CADI: https://cms.cern.ch/iCMS/analysisadmin/cadilines?line=EXO-23-003&tp=an&id=2651&ancode=EXO-23-003

Note: NA

PAS: NA

Paper: https://gitlab.cern.ch/tdr/papers/EXO-23-003

Environment

Singularity

The NTuple maker and the histmaker run by default using the coffea singularity provided through /cvmfs. You can use this locally by,

singularity shell -B ${PWD}:/work /cvmfs/unpacked.cern.ch/registry.hub.docker.com/coffeateam/coffea-dask:latest

If there are files in other folders that are necessary (the folder with your NTuples for example) you can bind additional folders with the following, which will allow one to access the files in the /mnt directory:

export SINGULARITY_BIND="/mnt"

or by adding --bind /path1,/path2/,... to the singularity shell command.

Python environment

A minimal python environment is provided in environment.yml. Install this with

conda env create -f environment.yml
conda activate suep

This environment should be enough for all the important parts of the workflow: the NTuple maker, the histmaker, and the plotting.

Overview

The workflow is as follows:

  1. workflows/: Produce NTuples from NanoAOD files using the NTuple maker for your analysis. This is done using coffea producers treating events as awkward arrays, and clustering using FastJet. The NTuples are stored in hdf5 files in tabular format in pandas dataframes. This is usually ran through HTCondor or Dask. See the README in workflows/ for more information for how to run this for each analysis.
  2. histmaker/: Make histograms from the NTuples using the histmaker. The histograms are stored in root files hist histograms. You can run this locally or through Slurm. See the README in histmaker/ for more information for how to run this.
  3. plotting/: Plot the histograms using the plotting notebooks. See the README in plotting/ for more information.

suepcoffea_dask's People

Contributors

lucalavezzo avatar chadfreer avatar pre-commit-ci[bot] avatar chrispap95 avatar jennyggg avatar demuller avatar pmlugato avatar andrzejnovak avatar farrah-simpson avatar jreic avatar ming-yan avatar bthornbe avatar pietervansteenweghen avatar mullerd avatar smoortga avatar

Stargazers

Ankush Kanuganti avatar  avatar  avatar

Watchers

Christoph Paus avatar  avatar  avatar  avatar

suepcoffea_dask's Issues

Infrastructure to avoid double counting events in data

For instance, if an event fires both SingleElectron and SingleMuon, we don't want to double count it. Probably matters most in an e+mu control region, since our single lepton search regions should be orthogonal by construction.

Easiest thing will be to assign events to (say) SingleMuon if it fires both triggers, and discard it from the other. It's a small detail.

Improve plotting: make_plots.py

  • make_plots.py works and is pretty automatic, but it's not robust at all, as it depends on the column names of the DataFrame and of the hsistograms to be named precisely in certain ways
  • it's also very hard for anyone to understand what's going on, making it hard to make sure that it's working properly
  • needs major conceptual simplification

Lepton Veto

Add lepton veto to be orthogonal with the ZH analysis

Improve make_plots.py

  • The configurations should come from a yaml file and be taken as an input, hardcoding as we do now is not sustainable.
  • Consider adding a --channel [WH, ggF] (had to add one to get it to run for WH but maybe we can do it all from the configuration yaml?)
  • Come up with a better solution for the output histograms. Maybe move to a separate file?
  • Add function to calculate a new column of the dataframe using as inputs other columns. e.g. to calculate delta gen mass and reco mass

Study algorithms for picking SUEP candidate in WH search

Baseline plan: use the highest pT SUEP object, which aligns with what ZH did. But we can / should study it at some point, e.g. pick SUEP candidate that has most tracks, or is most spherical, or ...

Not a crucial study yet, but one to keep in mind in the future.

Closure test with metric

Create notebook to make closure plots including a metric to quantify improvement for the extended ABCD method.

Finishing samples

We are missing a few samples in A01:
2016:
CD_HT200to300_TuneCP5_PSWeights_13TeV-madgraphMLM-pythia8/RunIISummer20UL16MiniAODAPVv2-106X_mcRun2_asymptotic_preVFP_v11-v1/MINIAODSIM
2018:
/QCD_HT700to1000_TuneCP5_PSWeights_13TeV-madgraph-pythia8/RunIISummer20UL18MiniAODv2-106X_upgrade2018_realistic_v16_L1v1-v1/MINIAODSIM

These need to be processed with kraken first and added to the filelist. Additionally the flat samples need to be added to kraken A01.

Improve plotting/plot_utils.py loader() function

Needs to be cleaned up a bit, originally designed to work for ggF offline. In particular, at the moment I can think of:

  • delete the removing of low ht bins code, this is a really old leftover
  • come up with a better way to define groups of samples that should be combined, e.g. the QCD_HT bins are nicely loaded separately AND combined into one QCD_HT, but I think we can improve how we do this, at the moment it's loose string matching
  • come up with a better way to assign 'nicknames' to samples. I don't want to type out "WJetsToLNu_HT-800To1200_TuneCP5_13TeV-madgraphMLM-pythia8+RunIISummer20UL18MiniAODv2-106X_upgrade2018_realistic_v16_L1v1-v1+MINIAODSIM" every time, so at the moment we were assigning short nicknames e.g. "WJetsToLNu", but this can also be improved / maybe a new standalone function

HEM Veto Bug

Currently being applied based on year (2018), but needs to be based on run number.
To be fixed before we re make ntuples

Fix plot_ratio uncertainty

Use Pieter's implementation of the uncertainty based on Poisson intervals in the plot_ratio's present in plot_utils.py.

Photon triggers to use for gamma+X studies

https://twiki.cern.ch/twiki/bin/viewauth/CMS/HLTPathsRunIIList

In 2016 we don't have many low threshold options, but I'll copy some options here
HLT_Photon90_v (0.26 fb^-1 collected)
HLT_Photon90_R9Id90_HE10_IsoM_v (5.26 fb^-1 collected)
HLT_Photon120_R9Id90_HE10_IsoM_v (14.75 fb^-1 collected)
HLT_Photon165_HE10_v (36.47 fb^-1 collected)
HLT_Photon175_v (36.47 fb^-1 collected)

In 2017 some options
HLT_Photon90_v (0.11 fb^-1)
HLT_Photon90_R9Id90_HE10_IsoM_v (2.63 fb^-1)
HLT_Photon120_R9Id90_HE10_IsoM_v (7.8 fb^-1)
HLT_Photon120_v (0.48 fb^-1)
HLT_Photon165_R9Id90_HE10_IsoM_v (28.34 fb^-1)

In 2018:
HLT_Photon110EB_TightID_TightIso_v (54.67 fb^-1 !!)

There are others too, but I would lean towards this Photon110 in 2018 and consider trying the HLT_Photon90_R9Id90_HE10_IsoM_v in 2016+2017 (EXO-19-009 used this for their 2017-only search). For the latter, we can cross-check with their AN in case of any extra photon ID cuts needed to be fully efficient.

Convert analysis methods into functions

In workfows/SUEP_coffea.py, it would be nice to convert each method (ML, Cluster, ISR Removal) into its own function.
The inputs are always: the dataframe to fill, the tracks in the event.
The outputs would be: new dataframe columns filled corresponding to the method (only rows of events which pass the selections of each method)

Contamination Study

Need code to analyze the Signal contamination in the control regions given the limit on a given models xsec.

For this we should develop a simple notebook that can take a given sample/xsec.

systematic plotting notebooks

make simple plotting notebooks, one per systematic, and put them in the plotting/CMS_corrections. There are already some bits of this in the plotting/plot.ipynb that can be used.

Towards turning flake8 on

PR #121 introduced a simple CI. However, I had to turn flake8 off because it was producing a lot of errors with some of them requiring more involved fixes. I will post here the list of issues that I get on master branch as of now. We can begin working towards fixing them and finally turning flake8 on.

➜  SUEPCoffea_dask git:(master) ✗ pre-commit run --all-files 
check for added large files..............................................Passed
check for case conflicts.................................................Passed
check for merge conflicts................................................Passed
check for broken symlinks............................(no files to check)Skipped
check yaml...............................................................Passed
debug statements (python)................................................Passed
fix end of files.........................................................Passed
mixed line ending........................................................Passed
python tests naming..................................(no files to check)Skipped
fix requirements.txt.................................(no files to check)Skipped
trim trailing whitespace.................................................Passed
black....................................................................Passed
pycln....................................................................Passed
flake8...................................................................Failed
- hook id: flake8
- exit code: 1

workflows/ML_coffea.py:19:1: E402 module level import not at top of file
workflows/ML_coffea.py:20:1: E402 module level import not at top of file
workflows/ML_coffea.py:21:1: E402 module level import not at top of file
workflows/ML_coffea.py:62:9: F841 local variable 'dataset' is assigned to but never used
workflows/ML_coffea.py:132:9: F841 local variable 'columns' is assigned to but never used
workflows/ML_coffea.py:175:9: F841 local variable 'ISR_cand_CL' is assigned to but never used
plotting/multithread.py:85:52: E741 ambiguous variable name 'l'
plotting/CMS_corrections/track_killing.py:19:5: F841 local variable 'sys' is assigned to but never used
workflows/ZH_utils.py:4:46: B006 Do not use mutable data structures for argument defaults.  They are created during function definition time. All calls to the function reuse this one instance of that data structure, persisting changes between them.
workflows/ZH_utils.py:5:5: E265 block comment should start with '# '
workflows/ZH_utils.py:29:5: E266 too many leading '#' for block comment
workflows/ZH_utils.py:30:5: E266 too many leading '#' for block comment
workflows/ZH_utils.py:31:5: E266 too many leading '#' for block comment
workflows/ZH_utils.py:48:5: E266 too many leading '#' for block comment
workflows/ZH_utils.py:53:5: E266 too many leading '#' for block comment
workflows/ZH_utils.py:88:9: E266 too many leading '#' for block comment
additional_tools/lxplus_run.py:65:1: C901 'main' is too complex (15)
workflows/ML_utils.py:9:1: E402 module level import not at top of file
workflows/ML_utils.py:10:1: E402 module level import not at top of file
workflows/ML_utils.py:11:1: E402 module level import not at top of file
workflows/ML_utils.py:12:1: E402 module level import not at top of file
workflows/ML_utils.py:14:1: E402 module level import not at top of file
workflows/ML_utils.py:42:31: F821 undefined name 'inf_cands'
workflows/ML_utils.py:43:42: F821 undefined name 'inf_cands'
workflows/ML_utils.py:44:39: F821 undefined name 'inf_cands'
workflows/ML_utils.py:45:21: F821 undefined name 'inf_cands'
workflows/ML_utils.py:333:25: F821 undefined name 'self'
condor_SUEP_cutflow.py:49:23: F821 undefined name 'processor'
workflows/SUEP_coffea.py:17:1: E402 module level import not at top of file
workflows/SUEP_coffea.py:20:1: E402 module level import not at top of file
workflows/SUEP_coffea.py:21:1: E402 module level import not at top of file
workflows/SUEP_coffea.py:24:1: E402 module level import not at top of file
workflows/SUEP_coffea.py:25:1: E402 module level import not at top of file
workflows/SUEP_coffea.py:26:1: E402 module level import not at top of file
workflows/SUEP_coffea.py:27:1: E402 module level import not at top of file
workflows/SUEP_coffea.py:223:13: F841 local variable 'jets_jec_JESDown' is assigned to but never used
workflows/SUEP_coffea.py:418:9: F841 local variable 'dataset' is assigned to but never used
resubmit.py:86:1: C901 'Loop 86' is too complex (15)
workflows/SUEP_coffea_cutflow.py:18:1: E402 module level import not at top of file
workflows/SUEP_coffea_cutflow.py:21:1: E402 module level import not at top of file
workflows/SUEP_coffea_cutflow.py:22:1: E402 module level import not at top of file
workflows/SUEP_coffea_cutflow.py:204:16: F821 undefined name 'sphericity'
plotting/make_plots.py:12:1: F401 'pandas as pd' imported but unused
plotting/make_plots.py:161:17: E265 block comment should start with '# '
plotting/make_plots.py:169:1: C901 'create_output_file' is too complex (15)
plotting/make_plots.py:169:1: E302 expected 2 blank lines, found 1
plotting/make_plots.py:276:28: E741 ambiguous variable name 'l'
plotting/make_plots.py:623:1: E266 too many leading '#' for block comment
plotting/make_plots.py:624:1: C901 'Loop 624' is too complex (21)
plotting/make_plots.py:694:9: F402 import 'sys' from line 8 shadowed by loop variable
plotting/make_plots.py:733:22: F821 undefined name 'apply_scaling_weights'
plotting/make_plots.py:782:1: E266 too many leading '#' for block comment
condor_ML.py:48:23: F821 undefined name 'processor'
dask/runner.py:17:5: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
dask/runner.py:29:5: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
dask/runner.py:161:1: C901 'If 161' is too complex (36)
dask/runner.py:243:9: F901 'raise NotImplemented' should be 'raise NotImplementedError'
dask/runner.py:257:29: E741 ambiguous variable name 'l'
dask/runner.py:263:13: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
dask/runner.py:264:17: B904 Within an `except` clause, raise exceptions with `raise ... from err` or `raise ... from None` to distinguish them from errors in exception handling.  See https://docs.python.org/3/tutorial/errors.html#exception-chaining for details.
dask/runner.py:423:21: E265 block comment should start with '# '
dask/runner.py:477:21: E265 block comment should start with '# '
plotting/CMS_corrections/GNN_syst.py:5:1: F401 'hist' imported but unused
plotting/CMS_corrections/GNN_syst.py:8:1: E402 module level import not at top of file
workflows/CMS_corrections/track_killing_utils.py:21:5: F841 local variable 'block0_indices' is assigned to but never used
kraken_run.py:81:1: C901 'main' is too complex (17)
workflows/CMS_corrections/jetmet_utils.py:8:1: C901 'apply_jecs' is too complex (24)
workflows/CMS_corrections/jetmet_utils.py:77:17: E265 block comment should start with '# '
workflows/CMS_corrections/jetmet_utils.py:78:17: E265 block comment should start with '# '
workflows/CMS_corrections/jetmet_utils.py:79:17: E265 block comment should start with '# '
workflows/CMS_corrections/jetmet_utils.py:105:17: E265 block comment should start with '# '
workflows/CMS_corrections/jetmet_utils.py:106:17: E265 block comment should start with '# '
workflows/CMS_corrections/jetmet_utils.py:107:17: E265 block comment should start with '# '
condor_SUEP_WS.py:48:23: F821 undefined name 'processor'
workflows/pandas_utils.py:49:13: F841 local variable 'store_fin' is assigned to but never used
workflows/pandas_utils.py:72:13: B904 Within an `except` clause, raise exceptions with `raise ... from err` or `raise ... from None` to distinguish them from errors in exception handling.  See https://docs.python.org/3/tutorial/errors.html#exception-chaining for details.
workflows/SUEP_utils.py:4:1: F401 'pandas as pd' imported but unused
workflows/SUEP_utils.py:105:9: F841 local variable 'deltaR' is assigned to but never used
workflows/SUEP_utils.py:172:9: F841 local variable 'deltaR' is assigned to but never used
condor_Scouting.py:42:1: F821 undefined name 'processor'
condor_Scouting.py:51:23: F821 undefined name 'processor'
plotting/plot_utils.py:13:1: F401 'pandas as pd' imported but unused
plotting/plot_utils.py:14:1: F401 'sympy' imported but unused
plotting/plot_utils.py:53:1: C901 'loader' is too complex (24)
plotting/plot_utils.py:53:1: E302 expected 2 blank lines, found 1
plotting/plot_utils.py:141:47: B006 Do not use mutable data structures for argument defaults.  They are created during function definition time. All calls to the function reuse this one instance of that data structure, persisting changes between them.
plotting/plot_utils.py:277:12: F841 local variable 'elist' is assigned to but never used
plotting/plot_utils.py:278:9: E741 ambiguous variable name 'l'
plotting/plot_utils.py:298:57: F821 undefined name 'matplotlib'
plotting/plot_utils.py:303:5: F821 undefined name 'fig'
plotting/plot_utils.py:353:22: F821 undefined name 'x1'
plotting/plot_utils.py:358:22: F821 undefined name 'x1'
plotting/plot_utils.py:396:22: F821 undefined name 'h1'
plotting/plot_utils.py:428:9: F841 local variable 'xmax1' is assigned to but never used
plotting/plot_utils.py:531:13: B007 Loop control variable 'x' not used within the loop body. If this is intended, start the name with an underscore.
monitor.py:16:13: F841 local variable 'data' is assigned to but never used
monitor.py:18:5: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
monitor.py:22:1: C901 'main' is too complex (23)
monitor.py:97:75: E712 comparison to True should be 'if cond is not True:' or 'if not cond:'
plotting/merge_plots.py:9:1: F403 'from plot_utils import *' used; unable to detect undefined names
plotting/merge_plots.py:44:1: E302 expected 2 blank lines, found 1
plotting/merge_plots.py:55:5: F841 local variable 'returncode' is assigned to but never used
plotting/merge_plots.py:97:5: B007 Loop control variable 'ifile' not used within the loop body. If this is intended, start the name with an underscore.
plotting/merge_plots.py:111:20: F405 'h5load' may be undefined, or defined from star imports: plot_utils
plotting/merge_plots.py:117:5: E266 too many leading '#' for block comment
plotting/merge_plots.py:133:5: E266 too many leading '#' for block comment
workflows/root_rewrite.py:28:5: F841 local variable 'f_new' is assigned to but never used
plotting/fill_utils.py:6:1: F401 'boost_histogram as bh' imported but unused
plotting/fill_utils.py:7:1: F401 'hist' imported but unused
plotting/fill_utils.py:24:5: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
plotting/fill_utils.py:38:13: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
plotting/fill_utils.py:48:13: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
plotting/fill_utils.py:96:9: F821 undefined name 'sys'
plotting/fill_utils.py:117:21: F821 undefined name 'abcd'
plotting/fill_utils.py:118:21: F821 undefined name 'abcd'
plotting/fill_utils.py:134:20: F821 undefined name 'weights'
plotting/fill_utils.py:135:22: F821 undefined name 'weights'
plotting/fill_utils.py:183:1: C901 'auto_fill' is too complex (16)
plotting/fill_utils.py:270:25: F821 undefined name 'sys'
plotting/fill_utils.py:306:20: B007 Loop control variable 'config_out' not used within the loop body. If this is intended, start the name with an underscore.
plotting/fill_utils.py:328:24: B007 Loop control variable 'config_out' not used within the loop body. If this is intended, start the name with an underscore.
plotting/fill_utils.py:346:9: F821 undefined name 'sys'
plotting/fill_utils.py:347:13: F821 undefined name 'label_out'
workflows/merger.py:29:5: B001 Do not use bare `except:`, it also catches unexpected events like memory errors, interrupts, system exit, and so on.  Prefer `except Exception:`.  If you're sure what you're doing, be explicit and write `except BaseException:`.
workflows/merger.py:42:9: B007 Loop control variable 'ifile' not used within the loop body. If this is intended, start the name with an underscore.
workflows/merger.py:46:9: E266 too many leading '#' for block comment
workflows/merger.py:51:9: E266 too many leading '#' for block comment
workflows/merger.py:61:9: E266 too many leading '#' for block comment
workflows/merger.py:93:9: B007 Loop control variable 'ifile' not used within the loop body. If this is intended, start the name with an underscore.

isort....................................................................Passed
pyupgrade................................................................Passed
codespell................................................................Passed
check blanket noqa.......................................................Passed
check blanket type ignore................................................Passed
use logger.warning(......................................................Passed
type annotations not comments............................................Passed
rst ``code`` is two backticks........................(no files to check)Skipped
rst directives end with two colons...................(no files to check)Skipped
rst ``inline code`` next to normal text..............(no files to check)Skipped
shellcheck...........................................(no files to check)Skipped
prettier.................................................................Passed

Variables to add to hdf5's output dataframe for WH

Mostly items that came up during the WH meeting on October 25th:

  • add information pertaining to jets (e.g. kinematics, btagging scores, quark/gluon info), for a variety of studies (including control regions)
  • add lepton ID, isolation, impact parameter for the purpose of optimizing our lepton selection
  • do we want to add pre-computed mT variables into the dataframes, or simple helper functions for post-computing them?
  • rename "TopPT" to "HighestPT" to avoid confusion with the top quark!
  • And for "TopPT" -> "HighestPT": update any plotting scripts to do the same (want to coordinate with any of the parallel branches where plotting improvements are in the works)

I'll volunteer to work on the lepton variables, but if anyone else wants to tackle any of these others, please let me know!

cutflows

Figure out what to do with this.

  1. keep it, and move it to some folder additional_tools/
  2. remove it, and the counts after each cutflow in our normal analyzer

Missing 2018 QCD files

When testing the kraken_run.py for scouting analysis, I find that the list of file names for QCD HT50-100 in 2018 MC is missing: /home/tier3/cmsprod/catalog/t2mit/nanosc/E07/QCD_HT50to100_TuneCP5_13TeV-madgraphMLM-pythia8+RunIISummer20UL18RECO-106X_upgrade2018_realistic_v11_L1v1-v2+AODSIM/RawFiles.00 is empty.

Gen Studies

Notebooks for 2 Gen Studies:

  1. Add in SUEP eta/phi and test dr between the Gen SUEP and the SUEP candidate

  2. Look at SUEP tracks and see purity/efficiency of the SUEP candidate

remove torch dependencies from scripts that don't need them

Since we pushed all the ML utils in ML_utils.py, the ML_coffea.py script, which converts the miniAOD to training samples and which uses the ML_utils.py, is forced to import torch and other dependencies that it doesn't need, and which are quite annoying to install.
Would be nice to remove this dependency for ML_coffea.py, as well as any other scripts that don't explicitly need it.

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.