lhcb / first-analysis-steps Goto Github PK
View Code? Open in Web Editor NEWLHCb data analysis lessons
Home Page: https://lhcb.github.io/first-analysis-steps/
LHCb data analysis lessons
Home Page: https://lhcb.github.io/first-analysis-steps/
What feedback do we want? How do we find out what people liked and hated?
Having some stats on how many applied (demand), how many came, how many found it useful, etc would be good.
We need to think about how to ask the questions that will get us the answers we want. We can't ask more than three or four questions, people can't be bothered with long questionnaires.
Moral/ethical/legal issues with installing some kind of analytics on the lesson webpage to track gather info (also after the workshop)?
ganga is the interface to the grid, convert the minimal DV job from #7 to run on the grid, configure storing output on EOS, access the output file and TBrowser it to make mass plot
Add a challenge to the screen lesson about finding out from the documentation how to scroll back in a screen
Some people have problems with the certificates.
Provide some links to instructions?
Instead I propose:
if [ $TERM != "dumb" ]; then
cur_DATE=$(date)
cur_HOST=$(hostname)
echo $cur_DATE" "$cur_HOST >> .lastlxplus
fi
Thu Jun 4 09:51:12 CEST 2015 lxplus0082.cern.ch
Add a callout to the topic on screen
explaining the use of pagsh.krb
to keep kerberos tokens going in your screen session
Move the complicated stuff from #11 here. Then go even deeper?
How to look at the code of a LoKi functor, how to find more LoKi functors, how to figure out what they are doing, why do we need these "adaptor" functions, how to edit the code of a functor and use it.
Use the dirac commandline tool to download a file from the grid. We get the LFN for that file from the section on book-keeping
How to get access to LoKi functors to add new variables to the nTuple without writing c++
Here some simple and complex uses of LoKi functors:
jpsi_preamble = ["DZ = VFASPF(VZ) - BPV(VZ)",
"TZ2 = DZ*3096.916 / PZ/299792458000.0",#in seconds
"C = 299792458000.0",
"EPZ = (PCOV2(3,3))**0.5",
"ZERRV = (VFASPF(VCOV2(2,2)))**0.5",
"ZERRPRIMARY = BPV(VCOV2(2,2))**0.5",
"ZERR2 = ZERRPRIMARY*ZERRPRIMARY + ZERRV*ZERRV",
]
jpsi_vars = {"ETA": "ETA",
"Y": "Y",
"PHI": "PHI",
"VPCHI2": "VFASPF(VPCHI2)",
"DELTAZ": "DZ",
# DZ * M / PZ / c with c in units of mm/s
"TZ": "TZ2*(10**12)", #ps
"TZERROR": "( (TZ2*TZ2*EPZ*EPZ)/(PZ*PZ) + (10**24*3096.916*3096.916*ZERR2)/(C*C*PZ*PZ) ) **0.5",
#DZ*3096.916 / PZ/299792458000.0*(10**12)", #ps
"minpt": "MINTREE('mu+' == ABSID, PT)",
"minclonedist": "MINTREE(ISBASIC & HASTRACK, CLONEDIST)",
"maxtrchi2dof": "MAXTREE(ISBASIC & HASTRACK, TRCHI2DOF)",
}
tuple.addBranches({"JPsi": "^(%s)"%(decay_descriptor),
"muplus": mark(3, decay_descriptor),#"J/psi(1S) -> mu- ^mu+",
"muminus": mark(2, decay_descriptor),#"J/psi(1S) -> ^mu- mu+",
})
loki_JPsi = tuple.JPsi.addTupleTool("LoKi::Hybrid::TupleTool/LoKi_JPsi")
loki_JPsi.Variables = jpsi_vars
loki_JPsi.Preambulo = jpsi_preamble
While this usually works, the lines
if not evt["/Event/DAQ/RawEvent"]:
print "Reached end of input files"
break
in 05-interactive-dst.md
actually don't work in this file because /Event/DAQ/RawEvent
doesn't exist. I don't know why, I have been using for years.
Given a local DST, run a minimal DV job over it to make a minimal DecayTreeTuple.
This will have to explain how to get stripping21 decisions (for the one chosen stripping line: http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/stripping/config/stripping21/charmcompleteevent/strippingd2hhcompleteeventpromptdst2d2rsline.html) and use those as the file we download from the grid most certainly will have some "random" stripping
A new topic exclusively on decay descriptors.
How to make this comprehendible?
Some random snippets I have:
print_decay = appMgr.toolsvc().create('PrintDecayTreeTool', interface="IPrintDecayTreeTool")
# New style decay descriptors, also known as LoKi decays
loki_decay_finder = appMgr.toolsvc().create('LoKi::Decay', interface="Decays::IDecay")
# Old style decay descriptors
old_decay_finder = appMgr.toolsvc().create("DecayFinder", interface="IDecayFinder")
# works
#decay_desc = "[[B0]cc -> (^D- => {^K- ^K+ ^pi-, ^K- ^pi+ ^pi-,^pi+ ^pi- ^pi-, ^K- ^K- ^pi+}) ^K-]cc"
# doesn't work
decay_desc = "[[B0]cc -> (^D- => {^K- ^K+ ^pi-, ^K- ^pi+ ^pi-,^pi+ ^pi- ^pi-}) ^K-]cc"
old_decay_finder.setDecay(decay_desc)
#WS_candidates = evt['/Event/Bhadron/Phys/B02DKWSD2HHHBeauty2CharmLine/Particles']
#B = WS_candidates[0]
#print_decay.printTree(B)
# Can we find the decay?
#old_decay_finder.hasDecay(WS_candidates)
# Beware, you can not repeatedly call this. It somehow keeps track
# of how often it has been called/recursion stuff :-s
#head = Particle()
#old_decay_finder.findDecay(WS_candidates, head)
# head will contain the head of the decay tree
#print head
Run top (or anything the actually does something over a period of time) inside screen.
detach
log out
log back into lxplus
reattach
How to help people as follow up to how to ask questions
5min summary of the buzzwords one needs to know to make a little sense of what happens in DV.
(as in not "Gaudi is an object orientated framework with tools, algorithms, public tools, ...")
Use an interactive python session to explore around the TES of a DST.
Show what is in these stripping locations/decisions, basically some tools to "debug" when things aren't working.
Some random bits of python that could be interesting/staring point for this. Quite Boole/Brunel centric though.
# Configuration done, run time!
appMgr = GP.AppMgr()
evt = appMgr.evtsvc()
det = appMgr.detsvc()
ft_det = det['/dd/Structure/LHCb/AfterMagnetRegion/T/FT']
for n in xrange(100):
appMgr.run(1)
digits = evt['/Event/MC/FT/Digits'].containedObjects()
for digit in digits:
digit_adcs.Fill(digit.adcCount())
This is from a dst-explore.py
I have which contains various useful things, potentially broken in newer versions of DV
# SetupProject DaVinci v35r1
import sys
import GaudiPython as GP
from GaudiConf import IOHelper
from Configurables import LHCbApp, ApplicationMgr, DataOnDemandSvc
from Configurables import SimConf, DigiConf, DecodeRawEvent
from Configurables import CondDB, DstConf, PhysConf
from Configurables import LoKiSvc
MCParticle = GP.gbl.LHCb.MCParticle
Particle = GP.gbl.LHCb.Particle
Track = GP.gbl.LHCb.Track
MCHit = GP.gbl.LHCb.MCHit
def nodes(evt, node=None):
nodenames = []
if node is None:
root = evt.retrieveObject('')
node = root.registry()
if node.object():
nodenames.append(node.identifier())
for l in evt.leaves(node):
# skip a location that takes forever to load
# XXX How to detect these automatically??
if "Swum" in l.identifier():
continue
temp = evt[l.identifier()]
nodenames += nodes(evt, l)
else:
nodenames.append(node.identifier())
return nodenames
def advance(decision='B02DKWSD2HHHBeauty2CharmLine'):
"""Advance until stripping decision is true, returns
number of events by which we advanced"""
n = 0
while True:
appMgr.run(1)
n += 1
dec=evt['/Event/Strip/Phys/DecReports']
if dec.hasDecisionName("Stripping%sDecision"%decision):
break
return n
# Configure all the unpacking, algorithms, tags and input files
appConf = ApplicationMgr()
appConf.ExtSvc+= ['ToolSvc', 'DataOnDemandSvc', LoKiSvc()]
from Configurables import DaVinci
dv = DaVinci()
dv.DataType = "2012"
lhcbApp = LHCbApp()
lhcbApp.Simulation = False
CondDB().Upgrade = False
# don't really need tags for looking around
#LHCbApp().DDDBtag = t['DDDB']
#LHCbApp().CondDBtag = t['CondDB']
inputFiles = [sys.argv[-1]]
IOHelper('ROOT').inputFiles(inputFiles)
# Configuration done, run time!
appMgr = GP.AppMgr()
evt = appMgr.evtsvc()
print_decay = appMgr.toolsvc().create('PrintDecayTreeTool', interface="IPrintDecayTreeTool")
# New style decay descriptors, also known as LoKi decays
loki_decay_finder = appMgr.toolsvc().create('LoKi::Decay', interface="Decays::IDecay")
# Old style decay descriptors
old_decay_finder = appMgr.toolsvc().create("DecayFinder", interface="IDecayFinder")
# works
#decay_desc = "[[B0]cc -> (^D- => {^K- ^K+ ^pi-, ^K- ^pi+ ^pi-,^pi+ ^pi- ^pi-, ^K- ^K- ^pi+}) ^K-]cc"
# doesn't work
decay_desc = "[[B0]cc -> (^D- => {^K- ^K+ ^pi-, ^K- ^pi+ ^pi-,^pi+ ^pi- ^pi-}) ^K-]cc"
old_decay_finder.setDecay(decay_desc)
# process first event
appMgr.run(1)
# Get a small print out of what is there in the event
evt.dump()
# print out "all" TES locations
# prints out packed locations, so you need to know
# what the unpacked location is called to actually access it
print "-"*80
for node in nodes(evt):
print node
# print out the stripping lines which fired for this event
print "-"*80
print evt['/Event/Strip/Phys/DecReports']
# Figure out why your decay descriptor does not work
# type the following into the python terminal
#advance()
#WS_candidates = evt['/Event/Bhadron/Phys/B02DKWSD2HHHBeauty2CharmLine/Particles']
#B = WS_candidates[0]
#print_decay.printTree(B)
# Can we find the decay?
#old_decay_finder.hasDecay(WS_candidates)
# Beware, you can not repeatedly call this. It somehow keeps track
# of how often it has been called/recursion stuff :-s
#head = Particle()
#old_decay_finder.findDecay(WS_candidates, head)
# head will contain the head of the decay tree
#print head
In https://github.com/lhcb/first-analysis-steps/blob/614ada768e1b1dade38f119979eaa6dcb51777df/03-bookkeeping.md you use the web interface to access the bookkeeping. This does not work from outside CERN (unless you do some ssl magic). I would suggest to use lhcb_bkk on lxplus to avoid confusion.
We should move this repo to somewhere that makes it clear that this is a group effort and that everyone is welcome to contribute. Hopefully this way we can encourage others to help create a few more of these collections of lessons on advanced topics like ML or RooFit or Brunel. (There is a lot of demand for that.)
There is a LHCb orga on github, it seems inactive and I have not been able to work out who controls it. We should try again and/or ask gh to put us in touch?
Part of this we should create an open egroup called [email protected]
to which anyone can subscribe and list that as the contact point.
This actually holds for all the theory parts: We need more illustrations to quickly convey the main concepts.
j.application.optsfile
can take a list, allowing for modular options files.
>>> j.application.optsfile = ['davinci_mc_2010.py', 'ntuples.py']
Currently listed as a single file.
How do I calculate the stripping efficiency using signal MC? -> TupleToolStripping
I will make a basic example of the DecayTreeFitter.
Bonus topics might include:
This is quite a fundamental topic, needed for other things as well.
I can make a short lesson on branches.
Should we combine this with explanations on the LoKi::CHILD functor?
In https://github.com/lhcb/first-analysis-steps/blob/master/code/06-building-decays/build_decays.py#L14
the right property of CombineParticles is not the Decay
but DecayDescriptor
.
Have we tested this code snippet?
We need to add reminders so people update when they commit:
doc/release.notes
fileWe should find some way to make our documentation "executable". Unsure yet how to do that as it will require ganga.
Should we have a lesson on CombineParticles/FilterDesktop, etc?
Introduce that we use the decay D* -> D(-> K pi) pi
Show how you go about finding a good stripping line for this, show how to look at the code for it, show how to look at what was actually used/configured in stripping21
Use Travis or something similar to automatically compile the markdown to html and then push to gh-pages
. Use master
again for upstream development.
5min introduction to what EOS is, why you want to use it (put job output there because your AFS is too small), eosmount
,
We should have a lesson for making a basic TupleTool. Provide a nicely formatted, sane template that adds some simple variables.
Could leave using the tool in a DecayTreeTuple
instance as a challenge.
Good ideas how to lint our examples? This would solve the problem of having to argue with people about how to format things and keep things tidy.
Add a tupletool to the minimal DV job from #9, re-run it, TBrowser to show new branches, how to find the code of the TupleTools, what tupletools exist?
The instructions in https://github.com/lhcb/first-analysis-steps/blob/master/11-davinci-grid.md using SetupProject work. I tried to switch to lb-run. This does not work.
Ganga.Utility : ERROR Cannot construct environ:
(and more errors)
You have have already seen GitBook used at CERN:
It's probably a better tool for this document, as you can also allow the reader to change the font and background colours for better readability, but you can also create a built-in glossary to refer to.
The configdocs file I pointed to also has instructions for installing GitBook at CERN: https://configdocs.web.cern.ch/configdocs/gbook/README.html
We should make a decision and make sure we are consistent everywhere.
If we advertise lb-run
we need to show off the lb-run Project v1r2 $SHELL
trick. (Bonus points for making it modify the prompt to show what project you are in automagically ...)
We need to clean up the course to get ready for our performance.
The order needs to be fixed in some places. Numbering needs to be fixed. We should check the logical progression of the course. Some topics that are not finished for this time have to be removed.
Show the cern resource portal
Log:
[rquaglia@~/StarterKit/Steps$|=>lhcb-proxy-init
Generating proxy...
Enter Certificate password:
Could not add VOMS extensions to the proxy
Failed adding VOMS attribute: Failed to set VOMS attributes. Command: voms-proxy-init -cert "/tmp/x509up_u69481" -key "/tmp/x509up_u69481" -out "/tmp/rquaglia/tmp9dHr7i" -voms "lhcb:/lhcb/Role=user" -valid "23:54" -vomses "/afs/cern.ch/lhcb/software/releases/DIRAC/DIRAC_v6r12p33/etc/grid-security/vomses"; StdOut: Your identity: /DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=rquaglia/CN=758657/CN=Renato Quagliani/CN=proxy
Creating temporary proxy Done
Contacting voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting voms.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=voms.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting lcg-voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting lcg-voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting lcg-voms.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=lcg-voms.cern.ch] "lhcb" Failed
; StdErr: .................................................................
Error: Error during SSL handshake:error:80066405:lib(128):verify_callback:outdated CRL found, revoking all certs till you get new CRL:sslutils.c:2115
outdated CRL found, revoking all certs till you get new CRL
Function: verify_callback
error:80066411:lib(128):verify_callback:certificate failed verify::sslutils.c:2318
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
certificate failed verify:
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
Function: verify_callback
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1172
certificate verify failed
Function: SSL3_GET_SERVER_CERTIFICATE
..............................................
Error: Error during SSL handshake:error:80066405:lib(128):verify_callback:outdated CRL found, revoking all certs till you get new CRL:sslutils.c:2115
outdated CRL found, revoking all certs till you get new CRL
Function: verify_callback
error:80066411:lib(128):verify_callback:certificate failed verify::sslutils.c:2318
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
certificate failed verify:
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
Function: verify_callback
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1172
certificate verify failed
Function: SSL3_GET_SERVER_CERTIFICATE
...............................
Error: Error during SSL handshake:error:80066405:lib(128):verify_callback:outdated CRL found, revoking all certs till you get new CRL:sslutils.c:2115
outdated CRL found, revoking all certs till you get new CRL
Function: verify_callback
error:80066411:lib(128):verify_callback:certificate failed verify::sslutils.c:2318
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
certificate failed verify:
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
Function: verify_callback
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1172
certificate verify failed
Function: SSL3_GET_SERVER_CERTIFICATE
.......................................................
Error: Error during SSL handshake:error:80066405:lib(128):verify_callback:outdated CRL found, revoking all certs till you get new CRL:sslutils.c:2115
outdated CRL found, revoking all certs till you get new CRL
Function: verify_callback
error:80066411:lib(128):verify_callback:certificate failed verify::sslutils.c:2318
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
certificate failed verify:
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
Function: verify_callback
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1172
certificate verify failed
Function: SSL3_GET_SERVER_CERTIFICATE
.................................................
None of the contacted servers for lhcb were capable
of returning a valid AC for the user.
Are you sure you are properly registered in the VO?
Could not add VOMS extensions to the proxy
Failed adding VOMS attribute: Failed to set VOMS attributes. Command: voms-proxy-init -cert "/tmp/x509up_u69481" -key "/tmp/x509up_u69481" -out "/tmp/rquaglia/tmp9dHr7i" -voms "lhcb:/lhcb/Role=user" -valid "23:54" -vomses "/afs/cern.ch/lhcb/software/releases/DIRAC/DIRAC_v6r12p33/etc/grid-security/vomses"; StdOut: Your identity: /DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=rquaglia/CN=758657/CN=Renato Quagliani/CN=proxy
Creating temporary proxy Done
Contacting voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting voms.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=voms.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting lcg-voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting lcg-voms2.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch] "lhcb" Failed
Trying next server for lhcb.
Creating temporary proxy Done
Contacting lcg-voms.cern.ch:15003 [/DC=ch/DC=cern/OU=computers/CN=lcg-voms.cern.ch] "lhcb" Failed
; StdErr: .................................................................
Error: Error during SSL handshake:error:80066405:lib(128):verify_callback:outdated CRL found, revoking all certs till you get new CRL:sslutils.c:2115
outdated CRL found, revoking all certs till you get new CRL
Function: verify_callback
error:80066411:lib(128):verify_callback:certificate failed verify::sslutils.c:2318
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
certificate failed verify:
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
Function: verify_callback
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1172
certificate verify failed
Function: SSL3_GET_SERVER_CERTIFICATE
..............................................
Error: Error during SSL handshake:error:80066405:lib(128):verify_callback:outdated CRL found, revoking all certs till you get new CRL:sslutils.c:2115
outdated CRL found, revoking all certs till you get new CRL
Function: verify_callback
error:80066411:lib(128):verify_callback:certificate failed verify::sslutils.c:2318
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
certificate failed verify:
error =CRL has expired
subject=/DC=ch/DC=cern/OU=computers/CN=lcg-voms2.cern.ch
issuer =/DC=ch/DC=cern/CN=CERN Grid Certification Authority
Function: verify_callback
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:s3_clnt.c:1172
certificate verify failed
Function: SSL3_GET_SERVER_CERTIFICATE
Documentation is incomplete.
The link to the prerequisite page in index.md does not work
If you import MM
and such first then the find_tracks
example does not work. The dereferencing happens for you magically when LoKi is active.
Modifying or writing a decfile from scratch is something that many PhD students might have to do early on. Do we want to create a lesson for this?
Developing LHCb software requires interacting with SVN. We should map the git commit that the students will know to SVN commands. I think the list is
svn commit -m
← git commit -am
svn revert
← git checkout --
svn status
← git status
svn add/remove
← git add/rm
Any more?
Dear all,
thanks for the amazing tutorial. You are probably very well aware of this, but there is content missing in
https://lhcb.github.io/first-analysis-steps/03-bookkeeping.html
The text doesn't cover all of the things listed in "learning objectives".
Cheers,
Konstantin
The lessons I am working on are rather advanced. Wouldn't it make sense for each lesson to add a small box at the top that points to lessons that are considered as prerequisites for the current one.
Do the SC templates have something like this?
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.