TTree is non-initialized in compiled code (ROOT 2.22.04, RHL 6.0)

Matthew D. Langston (langston@SLAC.stanford.edu)
Wed, 07 Jul 1999 14:48:07 -0700


This is a multi-part message in MIME format.

--Boundary_(ID_lm7kP0/xSM1da5TI/+7vwg)
Content-type: text/plain; charset=us-ascii
Content-transfer-encoding: 7BIT

Why does the attached trivial `main.cxx' not work when it is compiled,
but works just fine when it is interpreted? Here is the output from
running the same file in both "compiled mode" and "interpreted mode":

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
begin compiled output
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$ ./main
ntuple has 1000000000 branches
ntuple has nan entries
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end compiled output
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
begin interpreted output
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$ root -l -b -n -q main.cxx
*******************************************
* *
* W E L C O M E to R O O T *
* *
* Version 2.22/06 23 June 1999 *
* *
* You are welcome to visit our Web site *
* http://root.cern.ch *
* *
*******************************************

CINT/ROOT C/C++ Interpreter version 5.14.6, Jun 10 1999
Type ? for help. Commands must be C++ statements.
Enclose multiple statements between { }.
root [0]
Processing main.cxx...
ntuple has 32 branches
ntuple has 998 entries
(int)0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end interpreted output
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

It is as if the TTree in the compiled version of "main.cxx" isn't being
initialized by the TTree named "h10" in the test ".root" file
(i.e. notice the nice round number, 1E+09, for the number of branches,
and the NAN for the number of entries). However, clearly the TFile and
TTree pointers are valid, as evidenced by the two assert statements.

I have included a Makefile (for RedHat Linux 6.0 Intel) which builds the
compiled version of "main.cxx". This Makefile may only require editing
"ROOTSYS" in order to work on other platforms. Simply type "make check"
to demonstrate my problem. The interpreted versions of "main.cxx" is
run with the command "root -l -b -n -q main.cxx".

Note that the test file,
"/afs/slac.stanford.edu/public/users/langston/root/wabmc_test.root",
which is obviously served by an AFS server, is also available via
anonymous ftp at
"ftp://ftp.slac.stanford.edu/users/langston/root/wabmc_test.root".

Machine configuration
---------------------
RedHat Linux 6.0 Intel
kernel 2.2.5 (rpm version kernel-2.2.5-22)
glibc 2.1.1 (rpm version glibc-2.1.1-6)
egcs 1.1.2 (rpm version egcs-1.1.2-12)
binutils 2.9.1.0.23 (rpm version binutils-2.9.1.0.23-1
ROOT 2.22.04

--
Matthew D. Langston
SLD, Stanford Linear Accelerator Center
langston@SLAC.Stanford.EDU

--Boundary_(ID_lm7kP0/xSM1da5TI/+7vwg) Content-type: text/plain; charset=us-ascii; name=main.cxx Content-disposition: inline; filename=main.cxx Content-transfer-encoding: 7BIT

#ifndef __CINT__ #include <TROOT.h> #include <TFile.h> #include <TTree.h> #endif

#include <cassert> #include <iostream>

int main( int argc, const char* argv[] ) { #ifndef __CINT__ TROOT myApplication( "WAB", "WAB MC test" ); #endif

TFile* file = new TFile( "/afs/slac.stanford.edu/public/users/langston/root/wabmc_test.root" ); assert( file != 0 );

TTree* ntuple = ( TTree* ) file->Get( "h10" ); assert( ntuple != 0 );

cerr << "ntuple has " << ntuple->GetNbranches() << " branches" << endl; cerr << "ntuple has " << ntuple->GetEntries() << " entries" << endl;

if ( ntuple->GetEntries() != 998 ) { exit( 1 ); } return 0; }

--Boundary_(ID_lm7kP0/xSM1da5TI/+7vwg) Content-type: text/plain; charset=us-ascii; name=Makefile Content-disposition: inline; filename=Makefile Content-transfer-encoding: 7BIT

# -*- Makefile -*- # # Matthew D. Langston <langston@SLAC.Stanford.EDU> # 1999-06-27

## System dependent macros. CC = g++ CXX = g++ CPPFLAGS = -g -Wall $(ROOT_CFLAGS) LDFLAGS = $(ROOT_LDFLAGS) $(ROOT_LIBS)

## ROOT macros. ROOTSYS = /usr/local/root ROOT_CFLAGS = -I$(ROOTSYS)/include ROOT_LDFLAGS = -L$(ROOTSYS)/lib -Wl,-rpath,$(ROOTSYS)/lib ROOT_LIBS = -lCint -lNew -lBase -lClib -lCont -lFunc -lGraf -lGraf3d \ -lHist -lHtml -lMatrix -lMeta -lMinuit -lNet -lPhysics \ -lPostscript -lProof -lTree -lUnix -lZip -lm -ldl

# Everything below here is "generic", meaning it only requires that you # have GNU make and gcc. You shouldn't have to edit anything below this # line. SOURCES = main.cxx PROGRAMS = main TESTS = $(PROGRAMS)

.PHONY: all check clean realclean all: $(PROGRAMS)

# Include dependency files. include $(SOURCES:.cxx=.d)

realclean: clean; rm -f *.d $(PROGRAMS) clean:; rm -f core a.out *.o *~ check: $(TESTS) @failed=0; all=0; \ srcdir=$(srcdir); export srcdir; \ for tst in $(TESTS); do \ if test -f $$tst; then dir=.; \ else dir="$(srcdir)"; fi; \ if $(TESTS_ENVIRONMENT) $$dir/$$tst; then \ all=`expr $$all + 1`; \ echo "PASS: $$tst"; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="$$failed of $$all tests failed"; \ fi; \ dashes=`echo "$$banner" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ echo "$$dashes"; \ test "$$failed" -eq 0

# pattern rules %.d: %.cxx; $(SHELL) -ec '$(CC) -MM $(CPPFLAGS) $< | sed '\''s/\($*\)\.o[ :]*/\1.o $@: /g'\'' > $@; test -s $@ || rm -f $@' %.o: %.cxx; $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

--Boundary_(ID_lm7kP0/xSM1da5TI/+7vwg)--