/// \file /// \ingroup tutorial_http /// This program demonstrates simple application control via THttpServer /// Two histogram are filled within endless loop. /// Via published commands one can enable/disable histograms filling /// There are also command to clear histograms content /// /// After macro started, open in browser with url /// ~~~ /// http://localhost:8080 /// ~~~ /// /// Histograms will be automatically displayed and /// monitoring with interval 2000 ms started /// /// \macro_code /// /// \author Sergey Linev #include "TH1.h" #include "TH2.h" #include "TRandom3.h" #include "TSystem.h" #include "THttpServer.h" Bool_t bFillHist = kTRUE; void httpcontrol() { // create histograms TH1D *hpx = new TH1D("hpx","This is the px distribution",100,-4,4); hpx->SetFillColor(48); hpx->SetDirectory(0); TH2D *hpxpy = new TH2D("hpxpy","py vs px",40,-4,4,40,-4,4); hpxpy->SetDirectory(0); // start http server THttpServer* serv = new THttpServer("http:8080"); // One could specify location of newer version of JSROOT // serv->SetJSROOT("https://root.cern.ch/js/latest/"); // serv->SetJSROOT("http://jsroot.gsi.de/latest/"); // register histograms serv->Register("/", hpx); serv->Register("/", hpxpy); // enable monitoring and // specify items to draw when page is opened serv->SetItemField("/","_monitoring","5000"); serv->SetItemField("/","_layout","grid2x2"); serv->SetItemField("/","_drawitem","[hpxpy,hpx,Debug]"); serv->SetItemField("/","_drawopt","col"); // register simple start/stop commands serv->RegisterCommand("/Start", "bFillHist=kTRUE;", "button;rootsys/icons/ed_execute.png"); serv->RegisterCommand("/Stop", "bFillHist=kFALSE;", "button;rootsys/icons/ed_interrupt.png"); // one could hide commands and let them appear only as buttons serv->Hide("/Start"); serv->Hide("/Stop"); // register commands, invoking object methods serv->RegisterCommand("/ResetHPX","/hpx/->Reset()", "button;rootsys/icons/ed_delete.png"); serv->RegisterCommand("/ResetHPXPY","/hpxpy/->Reset()", "button;rootsys/icons/bld_delete.png"); // create debug text element, use MathJax - works only on Firefox serv->CreateItem("/Debug","debug output"); serv->SetItemField("/Debug", "_kind", "Text"); serv->SetItemField("/Debug", "value","\\(\\displaystyle{x+1\\over y-1}\\)"); serv->SetItemField("/Debug", "mathjax", "true"); // Fill histograms randomly TRandom3 random; Float_t px, py; const Long_t kUPDATE = 1000; Long_t cnt = 0; while (kTRUE) { if (bFillHist) { random.Rannor(px,py); hpx->Fill(px); hpxpy->Fill(px,py); cnt++; } else { gSystem->Sleep(10); // sleep minimal time } if ((cnt % kUPDATE==0) || !bFillHist) { // IMPORTANT: one should regularly call ProcessEvents // to let http server process requests serv->SetItemField("/Debug", "value", Form("\\(\\displaystyle{x+1\\over y-1}\\) Loop:%ld", cnt/kUPDATE)); if (gSystem->ProcessEvents()) break; } } }