230 likes | 366 Views
THttpServer for ROOT. Bertrand Bellenot , CERN Sergey Linev , GSI Darmstadt 28.02.2014. JSRootIO. Written on JavaScript, works in all major browsers IE, Firefox, Opera, Safari, Android, … Allows to draw many kinds of ROOT objects TH1, TH2, TH3, TProfile , TGraph , THStack , TCanvas
E N D
THttpServer for ROOT Bertrand Bellenot, CERN Sergey Linev, GSI Darmstadt 28.02.2014
JSRootIO • Written on JavaScript, works in all major browsers • IE, Firefox, Opera, Safari, Android, … • Allows to draw many kinds of ROOT objects • TH1, TH2, TH3, TProfile, TGraph, THStack, TCanvas • Demonstrator: • http://web-docs.gsi.de/~linev/JSRootIO/index_local.htm • Interactive graphics directly in the browser: • changing of draw style, zooming, bins info • update of statistic in stat box • different context menu commands • Main aim – display objects from ROOT files • PRO - no need for special code on the web server • CONTRA – not possible to update data dynamically B.Bellenot, S.Linev, THttpServer for ROOT
JSRootIO for online? • JSRootIO is file-based • difficult to use for online tasks • not really scales for big systems • Much more benefits if will run online • one would see live results from running experiment from any place of the world • One need special web application, which can provide online data to JSRootIO B.Bellenot, S.Linev, THttpServer for ROOT
Web server for ROOT • THttpServer class provides web server for arbitrary ROOT application • In any place of ROOT macro: root [0] .x $ROOTSYS/tutorials/hsimple.C root [1] new THttpServer(); • No any changes in ROOT framework are required • No any changes in user code are required B.Bellenot, S.Linev, THttpServer for ROOT
hsimple.C in web browser B.Bellenot, S.Linev, THttpServer for ROOT
Main classes • TRootSniffer - `sniffer`for objects hierarchies in TFolder, TFile/TDirectory, TTree, TCollection • THttpEngine – abstract class for implementing http protocol • TMongoose – embeddable web server, based on • https://github.com/valenok/mongoose • TFastCgi – FastCGI protocol implementation • supported by all major web servers like Apache, MS IIS,lighttpd, ... • THttpServer – central class • receive http requests from engine(s) • http requests processed by sniffer • takes care about threads safety B.Bellenot, S.Linev, THttpServer for ROOT
THttpServer • Any object can be registered in TFolder structure: • root [5] h1 = new TH1I(“h1”, “title”, 5, 0, 5); • root [6] serv->Register(“folder”, h1); • Following http requests are processed: • http://host:654/ROOT/h.xml • xml file with objects hierarchy, used to build tree structures in browser • http://host:654/ROOT/h1/get.bin • binary zipped data, produced by object streaming • http://host:654/ROOT/StreamerInfo/get.bin • binary zipped data of current streamer infos • http://host:654/ROOT/h1/get.png?w=100&h=100 • png image, produced from TCanvas • http://host:654/ROOT/ • returns generic (or user-defined) html page, shown before B.Bellenot, S.Linev, THttpServer for ROOT
FastCGIsupport • Protocol for interfacing interactive programs with web servers • Supported by all major web servers • Apache, lighttpd, MS IIS, Cherokee, Hiawatha, LiteSpeed, Kerio, Nginx, Resin, Roxen, Zeus ... • One benefits from common infrastructure • user access, security, encryption, balancing, ... • Can run in parallel to HTTP server ROOT http FastCGI Apache http B.Bellenot, S.Linev, THttpServer for ROOT
Project state • Developed since mid 2013 • Works with ROOT 5.14 and 6.00 • Tested on Linux and Windows • No external dependencies • mongoose is just two source files • mongoose is GPL2, can be replaced by civetweb with MIT license • FastCGI is optional, provided by all Linux distributions • For the moment available on: https://subversion.gsi.de/dabc/http/ B.Bellenot, S.Linev, THttpServer for ROOT
Current applications • Integrated into DABC • DABC is DAQ framework, used in different experiments • now also provides generic web interface for online software • DAQ – DABC, MBS (GSI standard DAQ) • slow control – FESA (CERN/GSI accelerator control), EPICS, DIM • online analysis – Go4, ROOT • Integrated with Go4 • Go4 is analysis framework with QtRoot online monitoring interface • now also web interface without changing user-code • Evaluated by different groups in GSI: • HADES, SuperFRS, R3B • Could be used in AMORE framework of ALICE B.Bellenot, S.Linev, THttpServer for ROOT
Possible developments • Replace mongoose by ROOT TThread/TSocket classes • many parts of original mongoose code can be reused, ~1 month of work • Implement caching on the server • preventing application from overload, ~1 week of work • Implement more http requests • http://host:654/ROOT/h1/get.xml • convert object into xml with TBufferXML, ~1 hour of work • http://host:654/ROOT/h1/get.json • stream object into JSON representation directly • no need for ROOT I/O in JavaScript • one need TBufferJSON class, ~2 weeks of work • http://host:654/ROOT/h1/fTitle/get.txt • access to object members in simple text form • mostly implemented, ~3 days of work • http://host:654/ROOT/Cmd/Reset/exe.cmd?par1=10 • provide command interface via http protocol • any user-defined commands with extra parameters • user authentication with standard http methods B.Bellenot, S.Linev, THttpServer for ROOT
More than web interface • One can use http protocol to communicate with any running ROOT application • From any script: wgethttp://host:654/ROOT/obj/fPar/get.txt wgethttp://host:654/ROOT/obj/fPar/set.txt?value=1 • For many cases no need for extra sockets and special protocols B.Bellenot, S.Linev, THttpServer for ROOT
Backup slides B.Bellenot, S.Linev, THttpServer for ROOT
Use case – HADES DABC TRB HYDRA2 Eventbuilder EvBld stream TRB hldfiles TRB Eventbuilder TRB hld TRB Eventbuilder hld TRB go4 gui TRB Eventbuilder hld TRB TRB TRB web browser B.Bellenot, S.Linev, THttpServer for ROOT
Use case – HADES • DABC as DAQ system • collects data from TRBs • store HLD files • deliver data to online analysis • Stream event source to connect DAQ • HYDRA2 analysis gets data directly via socket instead of temporary hld files • THttpServer for analysis monitoring • no any change in HYDRA2 itself • Monitor DAQ and analysis via same interface B.Bellenot, S.Linev, THttpServer for ROOT
Use case – HADES • Online analysis • Many processes in parallel • doing same events or different events • Histograms collector (to be done) Histograms collector HYDRA2 HYDRA2 DABC HYDRA2 Eventbuilder HYDRA2 EvBld stream HYDRA2 hldfiles B.Bellenot, S.Linev, THttpServer for ROOT
Go4ExampleSimple in web browser B.Bellenot, S.Linev, THttpServer for ROOT
Use case – DAQ and slow-control middleware ROOT online analysis go4 online analysis DABC beam profiles FESA http DAQ status and log information slow-control variables MBS MBS DABC EPICS B.Bellenot, S.Linev, THttpServer for ROOT
Use case – several DABC nodes MBS DABC http socket MBS DABC Master FastCGI FESA http go4 onlineanalysis DABC socket http Preferable EPICS FastCGI Apache MBS DABC http ROOTanalysis socket http Optional FastCGI ROOTanalysis B.Bellenot, S.Linev, THttpServer for ROOT
Alternatives to web browser web browser DABC SOAP, JSON DABC API http socket go4 gui withnative ROOT graphics console-based tools B.Bellenot, S.Linev, THttpServer for ROOT
How it works – hierarchy request wget http://lxg0538:8090/FESA/h.xml <?xml version="1.0"?> <dabc version="2" xmlns:dabc="http://dabc.gsi.de/xhtml" path="/FESA/"> <FESA> <Monitor dabc:producer="dabc://lxg0538:1237/fesa_monitor"> <GetMeasVoltage dabc:history="100"/> <GetMeasCurrent dabc:history="100"/> <GetMeasWeight dabc:history="100"/> </Monitor> <Test dabc:producer="dabc://lxg0538:1237/fesa"> <BeamProfile dabc:hash="74647" dabc:kind="FESA.2D"/> <BeamRate dabc:kind="rate"/> <BeamRate2 dabc:history="100" dabc:kind="rate"/> <TestRate dabc:history="100" dabc:kind="rate"/> <StreamerInfo dabc:hash="32" dabc:kind="ROOT.TList"/> <BeamRoot dabc:hash="7464700" dabc:kind="ROOT.TH2I" dabc:master="StreamerInfo"/> <ImageRoot dabc:kind="image.png"/> </Test> </FESA> </dabc> B.Bellenot, S.Linev, THttpServer for ROOT
How it works – item request wget http://lxg0538:8090/FESA/Test/TestRate/get.xml server item request <Reply xmlns:dabc="http://dabc.gsi.de/xhtml" itemname="/FESA/Test/TestRate" dabc:version="75177"> <get dabc:history="100" dabc:kind="rate" time="2013-09-20T12:12:43.874Z" value="96.00"/> </Reply> B.Bellenot, S.Linev, THttpServer for ROOT
How it works – history request wget http://lxg0538:8090/FESA/Test/TestRate/get.xml?history=20 <Reply xmlns:dabc="http://dabc.gsi.de/xhtml" itemname="/FESA/Test/TestRate" dabc:version="75713"> <get dabc:history="100" dabc:kind="rate" time="2013-09-20T12:21:39.935Z" value="32.00"> <history gap="true"> <h time="2013-09-20T12:21:19.933Z" value="112.00"/> <h time="2013-09-20T12:21:20.933Z" value="112.01"/> <h time="2013-09-20T12:21:21.933Z" value="112.02"/> <h time="2013-09-20T12:21:22.933Z" value="112.03"/> <h time="2013-09-20T12:21:23.933Z" value="116.00"/> <h time="2013-09-20T12:21:24.933Z" value="116.01"/> <h time="2013-09-20T12:21:25.933Z" value="116.02"/> <h time="2013-09-20T12:21:26.933Z" value="116.03"/> <h time="2013-09-20T12:21:27.934Z" value="20.00"/> <h time="2013-09-20T12:21:28.934Z" value="20.01"/> <h time="2013-09-20T12:21:29.934Z" value="20.02"/> <h time="2013-09-20T12:21:30.934Z" value="20.03"/> <h time="2013-09-20T12:21:31.934Z" value="24.00"/> <h time="2013-09-20T12:21:32.934Z" value="24.01"/> <h time="2013-09-20T12:21:33.934Z" value="24.02"/> <h time="2013-09-20T12:21:34.934Z" value="24.03"/> <h time="2013-09-20T12:21:35.935Z" value="28.00"/> <h time="2013-09-20T12:21:36.935Z" value="28.01"/> <h time="2013-09-20T12:21:37.935Z" value="28.02"/> <h time="2013-09-20T12:21:38.935Z" value="28.03"/> </history> </get> </Reply> B.Bellenot, S.Linev, THttpServer for ROOT