9 #include "daq/dqm/DqmMemFile.h"
10 #include <framework/pcore/MsgHandler.h>
20 DqmMemFile::DqmMemFile(
string name,
string mode,
int size)
24 if (mode !=
"write" && mode !=
"WRITE")
32 m_buf = (
char*)
new int[size];
35 m_shm =
new SharedMem((
char*)name.c_str(), size);
39 m_memfile =
new TMemFile(name.c_str(), m_buf, size *
sizeof(
int),
"RECREATE");
41 m_memfile->CopyTo((
char*)(m_shm->ptr()), m_memfile->GetSize());
43 printf(
"DqmMemFile : TMemFile is opened in WRITE mode.\n");
45 printf(
"DqmMemFile : TMemFile is opend in READ mode.\n");
48 DqmMemFile::DqmMemFile(
int shm_id,
int sem_id,
string mode,
int size)
52 if (mode !=
"write" && mode !=
"WRITE")
56 m_name =
"dqm_mem_file";
60 m_buf = (
char*)
new int[size];
63 m_shm =
new SharedMem(shm_id, sem_id, size);
67 m_memfile =
new TMemFile(m_name.c_str(), m_buf, size *
sizeof(
int),
"RECREATE");
68 printf(
"DqmMemFile : TMemFile is opened in WRITE mode.\n");
70 printf(
"DqmMemFile : TMemFile is opend in READ mode.\n");
74 DqmMemFile::~DqmMemFile()
76 if (m_memfile != NULL)
83 TMemFile* DqmMemFile::GetMemFile()
89 int DqmMemFile::UpdateSharedMem()
91 if (m_mode == 0)
return -1;
92 m_memfile->Write(0, TObject::kOverwrite);
94 m_memfile->CopyTo((
char*)(m_shm->ptr()), m_memfile->GetSize());
99 int DqmMemFile::ClearSharedMem()
101 if (m_mode == 0)
return -1;
103 if (m_memfile != NULL)
delete m_memfile;
104 m_memfile =
new TMemFile(m_name.c_str(), m_buf, m_size *
sizeof(
int),
"RECREATE");
107 m_memfile->CopyTo((
char*)(m_shm->ptr()), m_memfile->GetSize());
113 TMemFile* DqmMemFile::LoadMemFile()
115 if (m_mode == 1)
return NULL;
117 if (m_memfile != NULL) {
122 memcpy(m_buf, m_shm->ptr(), m_size *
sizeof(
int));
125 m_memfile =
new TMemFile(m_name.c_str(), m_buf, MEMFILESIZE);
132 TMemFile* memfile = LoadMemFile();
133 if (memfile == NULL)
return NULL;
143 StreamHistograms(gDirectory, &hdl, numobjs);
146 (msg->
header())->reserved[0] = 0;
147 (msg->
header())->reserved[1] = numobjs;
151 int DqmMemFile::StreamHistograms(TDirectory* curdir,
MsgHandler* msg,
int& numobjs)
153 TList* keylist = curdir->GetListOfKeys();
156 TIter nextkey(keylist);
160 while ((key = (TKey*)nextkey())) {
162 TObject* obj = curdir->FindObjectAny(key->GetName());
163 if (obj->IsA()->InheritsFrom(
"TH1")) {
164 TH1* h1 = (TH1*) obj;
166 msg->
add(h1, h1->GetName());
169 }
else if (obj->IsA()->InheritsFrom(TDirectory::Class())) {
171 TDirectory* tdir = (TDirectory*) obj;
173 TText subdir(0, 0, tdir->GetName());
174 msg->
add(&subdir,
"SUBDIR:" +
string(obj->GetName())) ;
178 StreamHistograms(tdir, msg, numobjs);
179 TText command(0, 0,
"COMMAND:EXIT");
180 msg->
add(&command,
"SUBDIR:EXIT");
Class to manage streamed object.
EvtHeader * header()
Get pointer to EvtHeader.
A class to encode/decode an EvtMessage.
virtual void add(const TObject *, const std::string &name)
Add an object to be streamed.
Abstract base class for different kinds of events.