Belle II Software  release-05-01-25
DqmMasterCallback.cc
1 #include <daq/dqm/DqmMasterCallback.h>
2 #include <framework/pcore/EvtMessage.h>
3 #include <framework/pcore/MsgHandler.h>
4 
5 #include <TText.h>
6 #include <TH1.h>
7 #include <TKey.h>
8 
9 #include <unistd.h>
10 
11 #include <sys/wait.h>
12 
13 using namespace Belle2;
14 using namespace std;
15 
16 static DqmMasterCallback* s_dqmmaster = NULL;
17 
18 static int m_running = 0;
19 
20 //-----------------------------------------------------------------
21 // Rbuf-Read Thread Interface
22 //-----------------------------------------------------------------
23 void* RunDqmMasterLogger(void*)
24 {
25 }
26 
27 DqmMasterCallback::DqmMasterCallback(ConfigFile& config)
28 {
29  m_hltdir = config.get("dqmmaster.hltdir");
30  m_erecodir = config.get("dqmmaster.erecodir");
31  m_running = 0;
32  printf("DqmMasterCallback : hltdir = %s, erecodir = %s\n", m_hltdir.c_str(), m_erecodir.c_str());
33 
34  // Open MemFile
35  m_hltdqm = new DqmMemFile("dqmhisto_hlt");
36  m_erecodqm = new DqmMemFile("dqmhisto_reco1");
37 
38  // Open sockets to hservers
39  m_sock_hlt = new EvtSocketSend("localhost", 9991);
40  m_sock_reco = new EvtSocketSend("localhost", 9992);
41 }
42 
43 DqmMasterCallback::~DqmMasterCallback()
44 {
45 
46 }
47 
48 void DqmMasterCallback::load(const DBObject& /* obj */, const std::string& runtype)
49 {
50  m_runtype = runtype;
51 }
52 
53 void DqmMasterCallback::start(int expno, int runno)
54 {
55  m_expno = expno;
56  m_runno = runno;
57 
58  MsgHandler hdl(0);
59  int numobjs = 0;
60 
61  TText rc_clear(0, 0, "DQMRC:CLEAR");
62  hdl.add(&rc_clear, "DQMRC:CLEAR");
63  numobjs++;
64  TText subdir(0, 0, "DQMInfo");
65  hdl.add(&subdir, "SUBDIR:DQMInfo") ;
66  numobjs++;
67  TH1F h_expno("expno", to_string(m_expno).c_str(), 1, 0, 1);
68  hdl.add(&h_expno, "expno");
69  numobjs++;
70  TH1F h_runno("runno", to_string(m_runno).c_str(), 1, 0, 1);
71  hdl.add(&h_runno, "runno");
72  numobjs++;
73  TH1F h_rtype("rtype", m_runtype.c_str(), 1, 0, 1);
74  hdl.add(&h_rtype, "rtype");
75  numobjs++;
76  TText command(0, 0, "COMMAND:EXIT");
77  hdl.add(&command, "SUBDIR:EXIT");
78  numobjs++;
79  TText rc_merge(0, 0, "DQMRC:MERGE");
80  hdl.add(&rc_merge, "DQMRC:MERGE");
81  numobjs++;
82 
83  EvtMessage* msg = hdl.encode_msg(MSG_EVENT);
84  (msg->header())->reserved[0] = 0;
85  (msg->header())->reserved[1] = numobjs;
86 
87  m_sock_hlt->send(msg);
88  m_sock_reco->send(msg);
89  delete(msg);
90 
91  printf("expno = %d, runno = %d\n", m_expno, m_runno);
92  m_running = 1;
93 }
94 
95 void DqmMasterCallback::stop()
96 {
97 
98  if (m_running == 0) return;
99 
100  m_running = 0;
101 
102  char outfile[1024];
103  // m_expno = getExpNumber();
104  // m_runno = getRunNumber();
105 
106  // Connect TMemFile
107  TMemFile* hlttmem = m_hltdqm->LoadMemFile();
108  TMemFile* erecotmem = m_erecodqm->LoadMemFile();
109 
110  // Dump HLT DQM
111  int proc1 = fork();
112  if (proc1 == 0) {
113  // TMemFile* tmem = m_hltdqm->LoadMemFile();
114  sprintf(outfile, "%s/hltdqm_e%4.4dr%6.6d.root", m_hltdir.c_str(), m_expno, m_runno);
115  TFile* dqmtfile = new TFile(outfile, "RECREATE");
116  printf("HLT dqm file = %s\n", outfile);
117 
118  // Copy all histograms in TFile
119  TIter next(hlttmem->GetListOfKeys());
120  TKey* key = NULL;
121  while ((key = (TKey*)next())) {
122  TH1* hist = (TH1*)key->ReadObj();
123  printf("HistTitle %s : entries = %f\n", hist->GetName(), hist->GetEntries());
124  TH1* cpyhst = (TH1*)hist->Clone();
125  }
126 
127  // Close TFile
128  dqmtfile->Write();
129  dqmtfile->Close();
130  delete dqmtfile;
131  // delete hlttmem;
132  exit(0);
133  } else if (proc1 < 0) {
134  perror("DQMMASTER : fork HLTDQM writing");
135  }
136 
137  // Dump ERECO DQM
138  int proc2 = fork();
139  if (proc2 == 0) {
140  // TMemFile* tmem = m_erecodqm->LoadMemFile();
141  sprintf(outfile, "%s/erecodqm_e%4.4dr%6.6d.root", m_erecodir.c_str(), m_expno, m_runno);
142  // sprintf(outfile, "hltdqm_e%4.4dr%6.6d.root", m_expno, m_runno);
143  TFile* erdqmtfile = new TFile(outfile, "RECREATE");
144  printf("ERECO dqm file = %s\n", outfile);
145 
146  // Copy all histograms in TFile
147  TIter ernext(erecotmem->GetListOfKeys());
148  TKey* erkey = NULL;
149  while ((erkey = (TKey*)ernext())) {
150  TH1* hist = (TH1*)erkey->ReadObj();
151  printf("HistTitle %s : entries = %f\n", hist->GetName(), hist->GetEntries());
152  TH1* cpyhst = (TH1*)hist->Clone();
153  }
154 
155  // Close TFile
156  erdqmtfile->Write();
157  erdqmtfile->Close();
158  delete erdqmtfile;
159  // delete erecotmem;
160  exit(0);
161  } else if (proc2 < 0) {
162  perror("DQMMASTER : fork ERECODQM writing");
163  }
164 
165  // Wait completion
166  int status1, status2;
167  waitpid(proc1, &status1, 0);
168  waitpid(proc2, &status2, 0);
169 
170  // delete hlttmem;
171  // delete erecotmem;
172 }
173 
174 void DqmMasterCallback::abort()
175 {
176  stop();
177 }
178 
179 
180 
181 
182 
Belle2::EvtSocketSend
Definition: EvtSocket.h:26
Belle2::DqmMasterCallback
Definition: DqmMasterCallback.h:17
Belle2::EvtMessage
Class to manage streamed object.
Definition: EvtMessage.h:60
Belle2::DBObject
Definition: DBObject.h:14
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::EvtMessage::header
EvtHeader * header()
Get pointer to EvtHeader.
Definition: EvtMessage.cc:162
Belle2::DqmMemFile
Definition: DqmMemFile.h:28
Belle2::ConfigFile
Definition: ConfigFile.h:15
Belle2::MsgHandler
A class to encode/decode an EvtMessage.
Definition: MsgHandler.h:104