Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
httpserver.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_http
3 /// This program creates :
4 /// - a one dimensional histogram
5 /// - a two dimensional histogram
6 /// - a profile histogram
7 /// - a memory-resident ntuple
8 ///
9 /// These objects are filled with some random numbers and saved on a in-memory file.
10 /// All objects can be seen in web browser is open url:
11 /// ~~~
12 /// http://localhost:8080
13 /// ~~~
14 ///
15 /// \macro_code
16 ///
17 /// \author Sergey Linev
18 
19 #include <TFile.h>
20 #include <TMemFile.h>
21 #include <TNtuple.h>
22 #include <TH2.h>
23 #include <TProfile.h>
24 #include <TCanvas.h>
25 #include <TFrame.h>
26 #include <TROOT.h>
27 #include <TSystem.h>
28 #include <TRandom3.h>
29 #include <TBenchmark.h>
30 #include <TInterpreter.h>
31 #include <THttpServer.h>
32 
33 void httpserver(const char* jobname = "job1", Long64_t maxcnt = 0)
34 {
35  TString filename = Form("%s.root", jobname);
36  TFile *hfile = new TMemFile(filename,"RECREATE","Demo ROOT file with histograms");
37 
38  // Create some histograms, a profile histogram and an ntuple
39  TH1F *hpx = new TH1F("hpx","This is the px distribution",100,-4,4);
40  hpx->SetFillColor(48);
41  TH2F *hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4);
42  TProfile *hprof = new TProfile("hprof","Profile of pz versus px",100,-4,4,0,20);
43  TNtuple *ntuple = new TNtuple("ntuple","Demo ntuple","px:py:pz:random:i");
44  hfile->Write();
45 
46 
47  // http server with port 8080, use jobname as top-folder name
48  THttpServer* serv = new THttpServer(Form("http:8080?top=%s", jobname));
49 
50  // fastcgi server with port 9000, use jobname as top-folder name
51  // THttpServer* serv = new THttpServer(Form("fastcgi:9000?top=%s_fastcgi", jobname));
52 
53  // dabc agent, connects to DABC master_host:1237, works only when DABC configured
54  // THttpServer* serv = new THttpServer(Form("dabc:master_host:1237?top=%s_dabc", jobname));
55 
56  // when read-only mode disabled one could execute object methods like TTree::Draw()
57  serv->SetReadOnly(kFALSE);
58 
59  // One could specify location of newer version of JSROOT
60  // serv->SetJSROOT("https://root.cern.ch/js/latest/");
61  // serv->SetJSROOT("http://jsroot.gsi.de/latest/");
62 
63  gBenchmark->Start(jobname);
64 
65  // Create a new canvas.
66  TCanvas *c1 = new TCanvas("c1","Dynamic Filling Example",200,10,700,500);
67  c1->SetFillColor(42);
68  c1->GetFrame()->SetFillColor(21);
69  c1->GetFrame()->SetBorderSize(6);
70  c1->GetFrame()->SetBorderMode(-1);
71 
72 
73  // Fill histograms randomly
74  TRandom3 random;
75  Float_t px, py, pz;
76  const Int_t kUPDATE = 1000;
77  Long64_t i = 0;
78 
79  while (true) {
80  random.Rannor(px,py);
81  pz = px*px + py*py;
82  Float_t rnd = random.Rndm(1);
83  hpx->Fill(px);
84  hpxpy->Fill(px,py);
85  hprof->Fill(px,pz);
86  // fill only first 25000 events in NTuple
87  if (i<25000) ntuple->Fill(px,py,pz,rnd,i);
88  if (i && (i%kUPDATE) == 0) {
89  if (i == kUPDATE) hpx->Draw();
90  c1->Modified();
91  c1->Update();
92  if (i == kUPDATE) hfile->Write();
93 
94  if (gSystem->ProcessEvents()) break;
95  }
96  i++;
97  if ((maxcnt>0) && (i>=maxcnt)) break;
98  }
99 
100  gBenchmark->Show(jobname);
101 }