re: Using TMapFiles in compiled code

Hans Wenzel (wenzel@fnal.gov)
Fri, 10 Jul 1998 12:10:52 -0500


This is a multi-part message in MIME format.
--------------C8DB3D1D4E694732E77C0ABB
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Dear peter

I don't know if it helps you i am working under irix and linux. below
you find the modified version of the tutorial hprod.C which i modified
to hprod.cxx as a stand alone c++ program. i have attached the modified
makefile (irix and gcc ) .
hope this helps

cheers hans wenzel

/ This is file hprod.cxx
// Histogram producer script. This script creates a memory mapped
// file and stores three histogram objects in it (a TH1F, a TH2F and a
// TProfile). It then fills, in an infinite loop (so use ctrl-c to
// stop this script), the three histogram objects with random numbers.
// Every 10 fills the objects are updated in shared memory.
// Use the hcons.C script to map this file and display the histograms.
#include "TROOT.h"
#include "TH1.h"
#include "TH2.h"
#include "TProfile.h"
//#include "TNtuple.h"
#include "TBrowser.h"
#include "TRandom.h"
#include "TMapFile.h"
#include "TSystem.h"
int main()
{
// Create a new memory mapped file. The memory mapped file can be
// opened in an other process on the same machine and the objects
// stored in it can be accessed.
TROOT hprod("hprod","Test of simple histogram producer to shared
memory ");
TH1F *hpx;
TH2F *hpxpy;
TProfile *hprof;
TMapFile *mfile;
mfile = TMapFile::Create("hsimple.map","RECREATE", 100000,
"Demo memory mapped file with histograms");

// Create a 1d, a 2d and a profile histogram. These objects will
// be automatically added to the current directory, i.e. mfile.
hpx = new TH1F("hpx","This is the px distribution",100,-4,4);
hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4);
hprof = new TProfile("hprof","Profile of pz versus
px",100,-4,4,0,20);

// Set a fill color for the TH1F
hpx->SetFillColor(48);

// Print status of mapped file
mfile->Print();
// TBrowser b;
// Endless loop filling histograms with random numbers
Float_t px, py, pz;
int ii = 0;
while (1) {
gRandom->Rannor(px,py);
pz = px*px + py*py;
hpx->Fill(px);
hpxpy->Fill(px,py);
hprof->Fill(px,pz);
if (!(ii % 10)) {
gSystem->Sleep(100); // sleep for a while
mfile->Update(); // updates all objects in shared memory
if (!ii) mfile->ls(); // print contents of mapped file after
} // first update
ii++;
}

return 0;
}

--------------C8DB3D1D4E694732E77C0ABB
Content-Type: text/plain; charset=us-ascii; name="Makefile"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="Makefile"

ObjSuf = o
SrcSuf = cxx
ExeSuf =
DllSuf = so
EVENTLIB = $(EVENTO)
OutPutOpt = -o

ROOTLIBS = -L$(ROOTSYS)/lib -lNew -lBase -lCint -lClib -lCont -lFunc \
-lGraf -lGraf3d -lHist -lHtml -lMatrix -lMeta -lMinuit -lNet \
-lPostscript -lProof -lTree -lUnix -lZip
ROOTGLIBS = -lGpad -lGui -lGX11 -lX3d

# SGI with GCC
CXX = g++
CXXFLAGS = -fsigned-char -fPIC -I$(ROOTSYS)/include
LD = g++
LDFLAGS = -g -Wl,-u,__builtin_new -Wl,-u,__builtin_delete -Wl,-u,__nw__FUiPv
SOFLAGS = -Wl,-soname,libEvent.so -shared
LIBS = $(ROOTLIBS) -lg++ -lm -ldl
GLIBS = $(ROOTLIBS) $(ROOTGLIBS) -lXpm -lX11 -lg++ -lm -lPW -ldl

#------------------------------------------------------------------------------

CLIENT_YBSO = client_ybs.$(ObjSuf)
CLIENT_YBS = client_ybs.$(SrcSuf)
CLIENT_YBS = client_ybs$(ExeSuf)

EVENTO = Event.$(ObjSuf) \
EventCint.$(ObjSuf)

EVENTS = Event.$(SrcSuf) \
EventCint.$(SrcSuf)

MAINEVENTS = MainEvent.$(SrcSuf)

MAINEVENTO = MainEvent.$(ObjSuf)

EVENT = Event$(ExeSuf)
EVENTSO = libEvent.$(DllSuf)

HWORLDO = hworld.$(ObjSuf)
HWORLDS = hworld.$(SrcSuf)
HWORLD = hworld$(ExeSuf)

HSERVO = hserv.$(ObjSuf)
HSERVS = hserv.$(SrcSuf)
HSERV = hserv$(ExeSuf)

HCLIENTO = hclient.$(ObjSuf)
HCLIENTS = hclient.$(SrcSuf)
HCLIENT = hclient$(ExeSuf)

HPRODO = hprod.$(ObjSuf)
HPRODS = hprod.$(SrcSuf)
HPROD = hprod$(ExeSuf)

HCONSO = hcons.$(ObjSuf)
HCONSS = hcons.$(SrcSuf)
HCONS = hcons$(ExeSuf)

HCONSYBSO = hconsybs.$(ObjSuf)
HCONSYBSS = hconsybs.$(SrcSuf)
HCONSYBS = hconsybs$(ExeSuf)

HSIMPLEO = hsimple.$(ObjSuf)
HSIMPLES = hsimple.$(SrcSuf)
HSIMPLE = hsimple$(ExeSuf)

MINEXAMO = minexam.$(ObjSuf)
MINEXAMS = minexam.$(SrcSuf)
MINEXAM = minexam$(ExeSuf)

SERVER_YBSO = server_ybs.$(ObjSuf)
SERVER_YBS = server_ybs.$(SrcSuf)
SERVER_YBS = server_ybs$(ExeSuf)

TSTRINGO = tstring.$(ObjSuf)
TSTRINGS = tstring.$(SrcSuf)
TSTRING = tstring$(ExeSuf)

TCOLLEXO = tcollex.$(ObjSuf)
TCOLLEXS = tcollex.$(SrcSuf)
TCOLLEX = tcollex$(ExeSuf)

VVECTORO = vvector.$(ObjSuf)
VVECTORS = vvector.$(SrcSuf)
VVECTOR = vvector$(ExeSuf)

VMATRIXO = vmatrix.$(ObjSuf)
VMATRIXS = vmatrix.$(SrcSuf)
VMATRIX = vmatrix$(ExeSuf)

VLAZYO = vlazy.$(ObjSuf)
VLAZYS = vlazy.$(SrcSuf)
VLAZY = vlazy$(ExeSuf)

GUITESTO = guitest.$(ObjSuf)
GUITESTS = guitest.$(SrcSuf)
GUITEST = guitest$(ExeSuf)

OBJS = $(CLIENT_YBSO) $(EVENTO) $(HSERVO) $(HCLIENTO) $(HPRODO)\
$(HCONSO) $(HCONSYBSO) \
$(HWORLDO) $(HSIMPLEO) $(MINEXAMO) $(SERVER_YBSO) $(TSTRINGO) \
$(TCOLLEXO) $(VVECTORO) $(VMATRIXO) $(VLAZYO) $(GUITEST)

PROGRAMS = $(CLIENT_YBS) $(EVENT) $(HSERV) $(HCLIENT) $(HPROD)\
$(HCONS) $(HCONSYBS)\
$(HWORLD) $(HSIMPLE) $(MINEXAM) $(SERVER_YBS) $(TSTRING) \
$(TCOLLEX) $(VVECTOR) $(VMATRIX) $(VLAZY) $(GUITEST)

all: $(PROGRAMS)

$(CLIENT_YBS): $(CLIENT_YBSO)
$(LD) $(LDFLAGS) $(CLIENT_YBSO) $(GLIBS) $(OutPutOpt) $(CLIENT_YBS)
@echo "$(CLIENT_YBS) done"

$(EVENT): $(EVENTO) $(MAINEVENTO)
$(LD) $(SOFLAGS) $(LDFLAGS) $(EVENTO) $(OutPutOpt) $(EVENTSO)
$(LD) $(LDFLAGS) $(MAINEVENTO) $(EVENTLIB) $(LIBS) $(OutPutOpt) $(EVENT)
@echo "$(EVENT) done"

$(HSERV): $(HSERVO)
$(LD) $(LDFLAGS) $(HSERVO) $(GLIBS) $(OutPutOpt) $(HSERV)
@echo "$(HSERV) done"

$(HCLIENT): $(HCLIENTO)
$(LD) $(LDFLAGS) $(HCLIENTO) $(LIBS) $(OutPutOpt) $(HCLIENT)
@echo "$(HCLIENT) done"

$(HPROD): $(HPRODO)
$(LD) $(LDFLAGS) $(HPRODO) $(GLIBS) $(OutPutOpt) $(HPROD)
@echo "$(HPROD) done"

$(HCONS): $(HCONSO)
$(LD) $(LDFLAGS) $(HCONSO) $(GLIBS) $(OutPutOpt) $(HCONS)
@echo "$(HCONS) done"

$(HCONSYBS): $(HCONSYBSO)
$(LD) $(LDFLAGS) $(HCONSYBSO) $(GLIBS) $(OutPutOpt) $(HCONSYBS)
@echo "$(HCONSYBS) done"

$(HWORLD): $(HWORLDO)
$(LD) $(LDFLAGS) $(HWORLDO) $(GLIBS) $(OutPutOpt) $(HWORLD)
@echo "$(HWORLD) done"

$(HSIMPLE): $(HSIMPLEO)
$(LD) $(LDFLAGS) $(HSIMPLEO) $(LIBS) $(OutPutOpt) $(HSIMPLE)
@echo "$(HSIMPLE) done"

$(MINEXAM): $(MINEXAMO)
$(LD) $(LDFLAGS) $(MINEXAMO) $(LIBS) $(OutPutOpt) $(MINEXAM)
@echo "$(MINEXAM) done"

$(SERVER_YBS): $(SERVER_YBSO)
$(LD) $(LDFLAGS) $(SERVER_YBSO) $(LIBS) $(OutPutOpt) $(SERVER_YBS)
@echo "$(SERVER_YBS) done"

$(TSTRING): $(TSTRINGO)
$(LD) $(LDFLAGS) $(TSTRINGO) $(LIBS) $(OutPutOpt) $(TSTRING)
@echo "$(TSTRING) done"

$(TCOLLEX): $(TCOLLEXO)
$(LD) $(LDFLAGS) $(TCOLLEXO) $(LIBS) $(OutPutOpt) $(TCOLLEX)
@echo "$(TCOLLEX) done"

$(VVECTOR): $(VVECTORO)
$(LD) $(LDFLAGS) $(VVECTORO) $(LIBS) $(OutPutOpt) $(VVECTOR)
@echo "$(VVECTOR) done"

$(VMATRIX): $(VMATRIXO)
$(LD) $(LDFLAGS) $(VMATRIXO) $(LIBS) $(OutPutOpt) $(VMATRIX)
@echo "$(VMATRIX) done"

$(VLAZY): $(VLAZYO)
$(LD) $(LDFLAGS) $(VLAZYO) $(LIBS) $(OutPutOpt) $(VLAZY)
@echo "$(VLAZY) done"

$(GUITEST): $(GUITESTO)
$(LD) $(LDFLAGS) $(GUITESTO) $(GLIBS) $(OutPutOpt) $(GUITEST)
@echo "$(GUITEST) done"

clean:
@rm -f $(OBJS) EventCint.$(SrcSuf) EventCint.h core

.SUFFIXES: .$(SrcSuf)

###

Event.o: Event.h
MainEvent.o: Event.h

EventCint.$(SrcSuf): Event.h LinkDef.h
@echo "Generating dictionary ..."
@$(ROOTSYS)/bin/rootcint -f EventCint.$(SrcSuf) -c Event.h LinkDef.h

.$(SrcSuf).$(ObjSuf):
$(CXX) $(CXXFLAGS) -c $<

--------------C8DB3D1D4E694732E77C0ABB--