AlcapDAQ  1
getHist.cpp
Go to the documentation of this file.
1 
30 /*
31  * Obtains a histogram from the current source, whether that is a ROOT
32  * file on disk or an online server.
33  */
34 
35 #include "TSocket.h"
36 #include "TMessage.h"
37 #include "TFile.h"
38 #include "TFolder.h"
39 #include "TH1I.h"
40 
41 #include "getHist.h"
42 
43 static TSocket *r_socket = NULL;
44 static TFile *r_file = NULL;
45 
46 #if 0
47 // top folder in root file
48 static TFolder *r_folder = NULL;
49 #endif
50 
51 // Folder which contains all received objects. We will clean
52 // periodically to avoid memory leakage
53 static TFolder *folder = NULL;
54 
55 
56 // socket timeout, ms
57 static const int timeout = 5000; // 5s
58 
59 // status. Non-zero is error occured.
60 static int gl_status = 0;
61 
62 // function declaration
63 TObject *getObjectFromSocket(const char *name);
64 TObject *getObjectFromFile(const char *name);
65 
66 
75 TFile *openRootFile(const char *filename)
76 {
77  closeSource();
78 
79  r_file = new TFile(filename);
80  if ( r_file->IsZombie() )
81  {
82  printf("***ERROR! Cannot open ROOT file [%s]\n",filename);
83  delete r_file;
84  r_file = NULL;
85 #if 0
86  r_folder = NULL;
87 #endif
89  }
90 #if 0
91  else
92  {
93  // *** get top folder ***
94  r_file->GetObject("histos",r_folder);
95  if ( !r_folder )
96  {
97  printf("**ERROR! Cannot load folder 'histos' from file [%filename]\n",filename);
98  delete r_file;
99  r_file = NULL;
100  r_folder = NULL;
102  }
103  else
104  {
105  r_folder->SetOwner( kTRUE );
106  }
107  }
108 #endif
109 
110  printf("Connected to source file :[%s]\n",filename);
111 
112  return r_file;
113 }
114 
124 TSocket *openSocket(const char *hostname, const int port_nr)
125 {
126  Int_t status;
127 
128  closeSource();
129 
130  r_socket = new TSocket(hostname, port_nr);
131 
132  if ( ! r_socket->IsValid() )
133  {
134  delete r_socket;
135  r_socket = NULL;
137  return r_socket;
138  }
139 
140  char str[64];
141  sprintf(str,"ERROR");
142  status = r_socket->Select(TSocket::kRead,timeout);
143  if ( status == 1 )
144  {
145  r_socket->Recv(str, sizeof(str));
146  if ( strncmp(str, "RMSERV", 6) != 0 )
147  {
148  // *** incorrect responce from the server ***
149  printf("***ERROR! Unexpected response from the server [%s] on port %i: [%s]",hostname,port_nr,str);
150  r_socket->Close();
151  delete r_socket;
152  r_socket = NULL;
154  return r_socket;
155  }
156  }
157  else
158  {
159  // *** no response from the server ***
160  printf("***ERROR! No response from the server [%s] on port %i\n",hostname, port_nr);
161  r_socket->Close();
162  delete r_socket;
163  r_socket = NULL;
165  return r_socket;
166  }
167 
168  printf("Successfully connected to server on host [%s] port %i\n",hostname,port_nr);
169  gl_status = 0;
170 
171  return r_socket;
172 }
173 
179 {
180  if (r_socket != NULL)
181  {
182  r_socket->Close();
183  delete r_socket;
184  r_socket = NULL;
185  }
186 
187  if (r_file != NULL)
188  {
189 #if 0
190  r_folder->Clear();
191  delete r_folder;
192  r_folder = NULL;
193 #endif
194  r_file->Close("R");
195  delete r_file;
196  r_file = NULL;
197  }
198 
200 }
201 
202 TObject *getObject(const char *name)
203 {
204  if (r_socket != NULL)
205  {
206  return getObjectFromSocket( name );
207  }
208  else if (r_file != NULL)
209  {
210  return getObjectFromFile( name );
211  }
212 
214  if ( gl_status == 0 )
215  {
216  printf("No connection\n");
218  }
219  return NULL;
220 }
221 
222 /*
223  void *getPointer(const char *name)
224  {
225 
226  TMessage *m;
227  char str[256];
228 
229  sprintf(str, "GetPointer %s", Name);
230  histSocket->Send(str);
231  histSocket->Recv(m);
232 
233  unsigned long p;
234  m->ReadULong( p );
235 
236  delete m;
237 
238  return (void*)p;
239 
240  }
241  */
242 
243 TObject *getObjectFromSocket(const char *name)
244 {
245  TMessage *m;
246  char str[256];
247  TObject *obj;
248 
249  if ( strlen(name) > 230 )
250  {
251  printf("***ERROR! Best object name\n");
252  return NULL;
253  }
254 
255  if ( ! folder )
256  {
257  folder = new TFolder("heap","heap");
258  folder->SetOwner( kTRUE );
259  }
260 
261  sprintf(str, "GET %s", name);
262 
263  // make sure that the socket is alive
264  Int_t status = r_socket->Select(TSocket::kWrite,timeout);
265  if ( status != 1 )
266  {
267  printf("***ERROR! Broken connection to socket\n");
268  closeSource();
270  return NULL;
271  }
272  r_socket->Send(str);
273 
274  // receive reply from server
275  //printf("Trying socket...\n");
276  status = r_socket->Select(TSocket::kRead,timeout);
277  if ( status != 1 )
278  {
279  printf("***ERROR! Broken connection to socket\n");
280  closeSource();
282  return NULL;
283  }
284  //printf("Alive!\n");
285  Int_t n = r_socket->Recv(m);
286 
287  if ( n <= 0 )
288  {
289  printf("***ERROR! Broken pipe\n");
290  closeSource();
292  return NULL;
293  }
294 
295  obj = (TObject*)m->ReadObject(m->GetClass());
296 
297  if (obj == 0)
298  {
299  printf("Unable to get object [%s] from socket\n", name);
300  }
301  else
302  {
303  folder->Add( obj );
304  }
305 
306  delete m;
307 
308  return obj;
309 }
310 
311 TObject *getObjectFromFile(const char *name)
312 {
313 
314 #if 0
315  if ( ! r_file || ! r_folder )
316 #endif
317  if ( ! r_file )
318  {
319  printf("***ERROR! File is not open\n");
320  if ( gl_status == 0 )
321  {
323  }
324  return NULL;
325  }
326 
327 
328  /*
329  if ( ! folder )
330  {
331  folder = new TFolder("heap","heap");
332  folder->SetOwner( kTRUE );
333  }
334  */
335  /*
336  TFolder *f;
337  r_file->GetObject("histos",f);
338  if ( !f )
339  {
340  printf("***ERROR! Cannot load folder histos from the ROOT file\n");
341  return NULL;
342  }
343  */
344 
345 #if 0
346  TObject *obj = r_folder->FindObject(name);
347 #else
348  TObject *obj = r_file->Get(name);
349 #endif
350 
351  /*
352  if ( obj )
353  {
354  folder->Add( obj );
355  }
356  */
357 
358  return obj;
359 }
360 
366 {
367  if (folder) folder->Clear();
368 }
369 
378 {
379  switch ( gl_status )
380  {
381  case 0:
382  // no error
383  break;
384  case RDISP_ERR_NO_CON:
385  printf("No connection to remote server\n");
386  break;
388  printf("Bad response from the server\n");
389  break;
391  printf("No response from the server\n");
392  break;
393  case RDISP_ERR_NO_SOURCE:
394  printf("No sources opened\n");
395  break;
397  printf("Broken pipe\n");
398  break;
399  case RDISP_ERR_NO_FILE:
400  printf("Cannot open ROOT file\n");
401  break;
402  case RDISP_ERR_NO_FOLDER:
403  printf("Cannot load root folder from the ROOT file\n");
404  break;
405  default:
406  printf("Unknown error\n");
407  break;
408  }
409 
410  return gl_status;
411 }
412 
413 
419 {
420  gl_status = 0;
421 }
422 
426 ULong_t get_run_number()
427 {
428 
429  ULong_t run_nr = 0;
430 
431  if (r_socket != NULL)
432  {
433  TMessage *m;
434  char str[256];
435 
436  sprintf(str, "GetRunNumber");
437  Int_t status = r_socket->Select(TSocket::kWrite,timeout);
438  if ( status != 1 )
439  {
440  printf("***ERROR! Broken connection to socket\n");
441  closeSource();
443  return 0;
444  }
445  r_socket->Send(str);
446 
447  status = r_socket->Select(TSocket::kRead,timeout);
448  if ( status != 1 )
449  {
450  printf("***ERROR! Broken connection to socket\n");
451  closeSource();
453  return 0;
454  }
455  Int_t n = r_socket->Recv(m);
456 
457  if ( n <= 0 )
458  {
459  printf("***ERROR! Broken pipe\n");
460  closeSource();
462  return 0;
463  }
464  m->ReadULong( run_nr );
465 
466  delete m;
467 
468  }
469  else if ( r_file != NULL)
470  {
471  TH1I *h1 = (TH1I*)getObjectFromFile( "run_number/h1_run_number" );
472  if ( h1 )
473  {
474  run_nr = h1->GetBinContent(1);
475  }
476  }
477 
478  return run_nr;
479 
480 
481 }