GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4HServProxy.cxx
Go to the documentation of this file.
1 // $Id$
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TGo4HServProxy.h"
15 
16 #include "TH1.h"
17 #include "TH2.h"
18 
19 #include "TGo4Slot.h"
20 
21 extern "C" {
22  #include "s_his_head.h"
23  #include "f_his_hist.h"
24 }
25 
26 class TGo4HServIter : public TGo4LevelIter {
27  public:
29 
30  TGo4HServIter(const TGo4Slot *slot) : TGo4LevelIter(), fSlot(slot) {}
31 
32  virtual ~TGo4HServIter() {}
33 
34  Bool_t next() override
35  { return fSlot && (++fIndex < fSlot->NumChilds()); }
36 
37  Bool_t isfolder() override { return curSlot()->HasSlotsSubLevels(); }
38 
39  TGo4LevelIter *subiterator() override { return new TGo4HServIter(curSlot()); }
40 
41  const char *name() override { return curSlot()->GetName(); }
42 
43  const char *info() override { return curSlot()->GetTitle(); }
44 
45  Int_t getflag(const char *flagname) override
46  {
47  if (strcmp(flagname,"IsRemote") == 0) return 1;
48  return -1;
49  }
50 
51  Int_t GetKind() override { return isfolder() ? TGo4Access::kndFolder : TGo4Access::kndObject; }
52 
53  const char *GetClassName() override { return curSlot()->GetPar("::HistoClass"); }
54 
55  protected:
56  TGo4Slot *curSlot() const { return fSlot->GetChild(fIndex); }
57 
58  const TGo4Slot *fSlot{nullptr};
59  Int_t fIndex{-1};
60 };
61 
62 // ******************************************************************
63 
65  public:
67  const char *name,
68  const char *fullname,
69  const char *classname) :
70  TGo4Access(),
71  fHServ(hserv),
72  fObjName(name),
73  fObjFullName(fullname),
74  fObjClassName(classname)
75  {
76  }
77 
79 
80  Bool_t CanGetObject() const override { return fHServ!=nullptr; }
81 
82  Bool_t GetObject(TObject *&obj, Bool_t &owner) const override
83  {
84  if (!fHServ) return kFALSE;
85  obj = fHServ->GetHistogram(fObjName.Data());
86  if (obj) owner = kTRUE;
87  return obj!=nullptr;
88  }
89 
90  const char *GetObjectName() const override { return fObjName.Data(); }
91 
92  const char *GetObjectClassName() const override { return fObjClassName.Data(); }
93 
94  private:
95  TGo4HServProxy *fHServ{nullptr};
96  TString fObjName;
97  TString fObjFullName;
98  TString fObjClassName;
99 };
100 
101 
102 
103 // ********************************************************************
104 
106  TGo4ServerProxy(),
107  fServerName(),
108  fPortNumber(0),
109  fBaseName(),
110  fUserPass(),
111  fFilter(),
112  fxStructure(nullptr)
113 {
114 }
115 
117 {
118  delete fxStructure;
119 }
120 
121 void TGo4HServProxy::SetHServConfig(const char *servername,
122  Int_t portnumber,
123  const char *basename,
124  const char *userpass,
125  const char *filter)
126 {
127  fServerName = servername;
128  fPortNumber = portnumber;
129  fBaseName = basename;
130  fUserPass = userpass;
131  fFilter = filter;
132 }
133 
135 {
136 }
137 
139 {
140 }
141 
142 
144 {
145  return fxStructure != nullptr;
146 }
147 
149 {
150  return fxStructure ? new TGo4HServIter(fxStructure) : nullptr;
151 }
152 
153 std::unique_ptr<TGo4Access> TGo4HServProxy::ProvideAccess(const char *name)
154 {
155  TGo4Slot *itemslot = fxStructure ? fxStructure->GetSlot(name) : nullptr;
156  if (!itemslot) return nullptr;
157  return std::make_unique<TGo4HServObjectAccess>(this, itemslot->GetName(), name, itemslot->GetPar("::HistoClass"));
158 }
159 
160 void TGo4HServProxy::WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs)
161 {
162 }
163 
164 void TGo4HServProxy::ReadData(TGo4Slot *slot, TDirectory *dir)
165 {
166 }
167 
169 {
171 }
172 
174 {
175  return fxStructure ? ClassName() : nullptr;
176 }
177 
178 void TGo4HServProxy::Update(TGo4Slot *slot, Bool_t strong)
179 {
180 }
181 
183 {
184  if (fxStructure) {
185  delete fxStructure;
186  fxStructure = nullptr;
187  }
188 
189  INTS4* pl_all_h = nullptr;
190  INTS4 l_histos = 0;
191  INTS4 result = f_his_getdir((CHARS *) fServerName.Data(),
192  fPortNumber,
193  (CHARS *) fBaseName.Data(),
194  (CHARS *) fUserPass.Data(),
195  (CHARS *) fFilter.Data(),
196  &pl_all_h,
197  &l_histos);
198 
199  if(result != 0) return kFALSE;
200 
201  fxStructure = new TGo4Slot(nullptr, "HClient","Structure holding slot");
202 
203  s_his_head* ps_his_head = (s_his_head*) pl_all_h;
204  for (int i_j = 0; i_j < l_histos; i_j++) {
205  TString HisType = "TH";
206  if (ps_his_head->l_bins_2 > 1) {
207  if(strstr(ps_his_head->c_dtype,"r"))
208  HisType += "2F";
209  else
210  HisType += "2I";
211  } else {
212  if(strstr(ps_his_head->c_dtype,"r"))
213  HisType += "1F";
214  else
215  HisType += "1I";
216  }
217  TGo4Slot *child = fxStructure->GetSlot(ps_his_head->c_name, kTRUE);
218  if (child) {
219  child->SetPar("::HistoClass", HisType.Data());
220  child->SetPar("::Date", ps_his_head->c_data_time_cre);
221  }
222 
223  ps_his_head++;
224  }
225 
226  free(pl_all_h);
227 
228  return kTRUE;
229 }
230 
231 TH1 *TGo4HServProxy::GetHistogram(const char *remotehistoname)
232 {
233  s_his_head* ps_his_head = nullptr;
234  INTS4* pl_all = nullptr;
235  INTS4 l_size = 0;
236 
237  INTS4 result = f_his_gethis((CHARS *) fServerName.Data(),
238  fPortNumber,
239  (CHARS *) fBaseName.Data(),
240  (CHARS *) fUserPass.Data(),
241  (CHARS *) remotehistoname,
242  &ps_his_head,
243  &pl_all,
244  &l_size);
245  if(result != 0) return nullptr; // error this connection
246 
247  if(l_size == 0) return nullptr; // no data in histogram at all
248 
249  int i1 = ps_his_head->l_bins_1;
250  int i2 = ps_his_head->l_bins_2;
251 
252  REAL4* pr_all = strstr(ps_his_head->c_dtype,"r") ? (REAL4 *) pl_all : nullptr;
253  INTS4* pl_start = pl_all;
254 
255  TH1 *h1 = nullptr;
256  Double_t entries = 0;
257 
258  if(i2==1) { // 1-Dimensional histogram
259  if (pr_all) {
260  h1 = new TH1F(ps_his_head->c_name, ps_his_head->c_name,
261  i1, ps_his_head->r_limits_low, ps_his_head->r_limits_up);
262  for (int k = 0; k < i1; k++) {
263  REAL4 val = *(pr_all++);
264  h1->SetBinContent(k, val);
265  entries+=val;
266  }
267  } else {
268  h1 = new TH1I(ps_his_head->c_name, ps_his_head->c_name,
269  i1, ps_his_head->r_limits_low, ps_his_head->r_limits_up);
270  for (int k = 0; k < i1; k++) {
271  INTS4 val = *(pl_all++);
272  h1->SetBinContent(k, val);
273  entries+=val;
274  }
275  }
276 
277  h1->GetYaxis()->SetTitle(ps_his_head->c_lettering_res);
278 
279  } else { // 2-dimensional histogram
280  if (pr_all) {
281  h1 = new TH2F(ps_his_head->c_name,ps_his_head->c_name,
282  i1, ps_his_head->r_limits_low, ps_his_head->r_limits_up,
283  i2, ps_his_head->r_limits_low_2, ps_his_head->r_limits_up_2);
284  for (int k = 0; k < i2; k++)
285  for (int k1 = 0; k1 < i1; k1++) {
286  REAL4 val = *(pr_all++);
287  h1->SetBinContent(k1,k,val);
288  entries+=val;
289  }
290  } else {
291  h1 = new TH2I(ps_his_head->c_name,ps_his_head->c_name,
292  i1, ps_his_head->r_limits_low, ps_his_head->r_limits_up,
293  i2, ps_his_head->r_limits_low_2, ps_his_head->r_limits_up_2);
294  for (int k = 0; k < i2; k++)
295  for (int k1 = 0; k1 < i1; k1++) {
296  INTS4 val = *(pl_all++);
297  h1->SetBinContent(k1,k,val);
298  entries+=val;
299  }
300  }
301 
302  h1->GetYaxis()->SetTitle(ps_his_head->c_lettering_2);
303  }
304 
305  free(pl_start);
306  free(ps_his_head);
307 
308  h1->SetDirectory(nullptr);
309  h1->SetEntries(entries);
310  h1->Sumw2();
311 
312  h1->GetXaxis()->SetTitle(ps_his_head->c_lettering_1);
313  h1->GetXaxis()->CenterTitle();
314  h1->GetYaxis()->CenterTitle();
315 
316  return h1;
317 }
virtual ~TGo4HServIter()
Bool_t CanGetObject() const override
TGo4Slot * GetChild(Int_t n) const
Definition: TGo4Slot.h:77
Int_t NumChilds() const
Definition: TGo4Slot.h:76
REAL4 r_limits_up
Definition: s_his_head.h:28
Bool_t next() override
void Update(TGo4Slot *slot, Bool_t strong) override
Bool_t RefreshNamesList() override
const char * GetClassName() override
float REAL4
Definition: typedefs.h:30
const char * GetContainedClassName() const override
const char * GetObjectClassName() const override
void ReadData(TGo4Slot *slot, TDirectory *dir) override
Bool_t isfolder() override
Bool_t HasSublevels() const override
TGo4HServObjectAccess(TGo4HServProxy *hserv, const char *name, const char *fullname, const char *classname)
const TGo4Slot * fSlot
CHARS c_lettering_res[64]
Definition: s_his_head.h:45
INTS4 l_bins_2
Definition: s_his_head.h:23
Int_t GetObjectKind() const override
REAL4 r_limits_low
Definition: s_his_head.h:27
TGo4HServIter(const TGo4Slot *slot)
REAL4 r_limits_up_2
Definition: s_his_head.h:36
int INTS4
Definition: typedefs.h:28
std::unique_ptr< TGo4Access > ProvideAccess(const char *name) override
CHARS c_data_time_cre[28]
Definition: s_his_head.h:43
TGo4Slot * curSlot() const
INTS4 f_his_getdir(CHARS *pc_server, INTS4 l_port, CHARS *pc_base, CHARS *pc_access, CHARS *pc_histo, INTS4 **p_buffer, INTS4 *pl_histos)
Definition: f_his_hist.c:189
CHARS c_name[64]
Definition: s_his_head.h:41
TGo4Slot * GetSlot(const char *name, Bool_t force=kFALSE)
Definition: TGo4Slot.cxx:451
Bool_t GetObject(TObject *&obj, Bool_t &owner) const override
TGo4LevelIter * MakeIter() override
void Initialize(TGo4Slot *slot) override
TH1 * GetHistogram(const char *remotehistoname)
REAL4 r_limits_low_2
Definition: s_his_head.h:35
CHARS c_lettering_1[64]
Definition: s_his_head.h:46
Int_t GetKind() override
virtual ~TGo4HServProxy()
void SetHServConfig(const char *servername, Int_t portnumber, const char *basename, const char *userpass, const char *filter)
const char * GetPar(const char *name) const
Definition: TGo4Slot.cxx:598
INTS4 l_bins_1
Definition: s_his_head.h:22
const char * GetObjectName() const override
TString fServerName
INTS4 f_his_gethis(CHARS *pc_server, INTS4 l_port, CHARS *pc_base, CHARS *pc_access, CHARS *pc_histo, s_his_head **p_head, INTS4 **p_buffer, INTS4 *pl_size)
Definition: f_his_hist.c:311
Bool_t HasSlotsSubLevels() const
Definition: TGo4Slot.cxx:377
TGo4Slot * fxStructure
Int_t getflag(const char *flagname) override
CHARS c_lettering_2[64]
Definition: s_his_head.h:47
const char * info() override
CHARS c_dtype[4]
Definition: s_his_head.h:42
char CHARS
Definition: typedefs.h:21
TGo4LevelIter * subiterator() override
void SetPar(const char *name, const char *value)
Definition: TGo4Slot.cxx:586
const char * name() override
virtual ~TGo4HServObjectAccess()
void Finalize(TGo4Slot *slot) override
void WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs) override