Re: Problem with class import / TTrees

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Aug 06 1999 - 09:10:46 MEST


Hi Ingo,
I have no problems with your example. Could you specify which version
of Root you are using ?
Could you test the following small procedure on your machine?

1- run the following script
===========================
rootcint -f cint.C -c Momentum3.h LinkDef3.h
g++ -fno-rtti -fno-exceptions -fPIC -I$ROOTSYS/include -c cint.C
Momentum3.C
g++ -g -Wl,-soname,Momentum3.so -shared cint.o Momentum3.o -o
Momentum3.so

with
Momentum3.h
===========
#ifndef MOMENTUM3_H
#define MOMENTUM3_H
#include "TObject.h"

class Momentum3: public TObject
{
public:
  Momentum3();
  Float_t p;

  ClassDef(Momentum3,1)
};
#endif

Momentum3.C
===========
#include "Momentum3.h"
ClassImp(Momentum3)

Momentum3::Momentum3()
{
p=0;
}


LinkDef3.h
==========
#ifdef __CINT__

#pragma link off all globals;
#pragma link off all classes;
#pragma link off all functions;

#pragma link C++ class Momentum3;

#endif

The script above runs rootcint and generates a small shared lib
Momentum3.so.
Now runs the standard Root executable and run the following macro m3.C
 Root > .x m3.C

m3.C
====
{

gSystem.Load("Momentum3");
Momentum3 mom, *mymom = & mom;
TFile *hfile = new TFile("my.root", "RECREATE");
TTree *tree = new TTree("T", "MyTree");
tree->Branch("momentum", "Momentum3", &mymom, 64000, 1);

for (int i=0; i< 3; i++)
  {
    mymom->p=i;
    tree->Fill();
  }

tree->Print();
hfile->Write();
hfile->Close();
}

Rene Brun

Ingo Froehlich wrote:
> 
> Hi ROOTers,
> 
> I'm trying to gain experience with root-trees. For this reason I tried to
> import a small test-class to root:
> 
> -----------------Momentum3.h
> #ifndef MOMENTUM3_H
> #define MOMENTUM3_H
> #include "TObject.h"
> 
> class Momentum3: public TObject
> {
> public:
>   Momentum3();
>   Float_t p;
> 
>   ClassDef(Momentum3,1)
> };
> #endif
> -----------------Momentum3.cpp
> #include "Momentum3.h"
> ClassImp(Momentum3)
> 
> Momentum3::Momentum3()
> {
> p=0;
> };
> -----------------
> This class has been used to fill a root-tree:
> -----------------Main.cpp
> #include "TROOT.h"
> #include "TFile.h"
> #include "TTree.h"
> #include "TBranch.h"
> #include "Momentum3.h"
> 
> int main(void)
> {
> TROOT root("disto","Disto Analysis");
> Momentum3 mom, *mymom = & mom;
> TFile *hfile = new TFile("my.root", "RECREATE");
> TTree *tree = new TTree("T", "MyTree");
> tree->Branch("momentum", "Momentum3", &mymom, 64000, 1);
> 
> for (int i=0; i< 3; i++)
>   {
>     mymom->p=i;
>     tree->Fill();
>   }
> 
> hfile->Write();
> hfile->Close();
> return 0;
> }
> ----------------
> If I start my Main, it tells me:
> Fatal in <operator delete>: unreasonable size (1084523672)
> aborting
> 
> In addition, I compile a *.so from the Momentum3 class and the Dictionary,
> but if I try to load this into CINT, a segmentation fault appears
> 
> Do I misunderstand something?
> 
> Thanks for your help and best regards,
> 
> Ingo Froehlich
> 
> --
> Ingo Froehlich, II. Physikalisches Institut, Universitaet Giessen
> Heinrich-Buff-Ring 16, D-35392 Giessen           |  Tel.: 0641 - 99 33250
> EMail: Ingo.Froehlich@exp2.physik.uni-giessen.de |  Fax : 0641 - 99 33209
> Sekretariat II. Physik: 0641 - 99 33261          |                    :-)
> 
> PS: My Makefile:
> ----------------
> .SUFFIXES: .cpp .c
> PACKAGE         = Tproject
> VERSION         = 0
> DICT            = Momentum3.h
> OBJ             = EventDict.o Momentum3.o Main.o
> TOBJS           = EventDict.o Momentum3.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
> 
> # Linux
> C             = gcc
> CFLAGS        = -O3 -Wall -D_DEBUG
> CXX           = g++
> CXXFLAGS      = -O3 -Wall -fPIC -I$(ROOTSYS)/include -D_DEBUG -DLINUX
> LD            = g++
> LDFLAGS       = -g
> SOFLAGS       = -shared
> LIBS          = $(ROOTLIBS) -lg++ -lm -ldl -rdynamic
> GLIBS         = $(ROOTLIBS) $(ROOTGLIBS) -L/usr/X11R6/lib \
>                 -lXpm -lX11 -lg++ -lm -ldl -rdynamic
> 
> #------------------------------------------------------------------------------
> 
> all:            Momentum.so Main
> 
> Momentum.so:    $(TOBJS)
>                 $(LD) $(SOFLAGS) $(TOBJS) $(GLIBS) -o Momentum.so
>                 @echo "$(PROGRAMM) done"
> 
> Main:           $(OBJ)
>                 $(LD) $(LDFLAGS) $(OBJ) $(GLIBS) -o Main
>                 @echo "$(PROGRAMM) done"
> 
> clean:
>                 @rm -f $(OBJS) core
> 
> .cpp.o:
>         @echo compiling $<
>         $(CXX) $(CXXFLAGS) -c $<
> 
> .c.o:
>         @echo compiling $<
>         $(C) $(CFLAGS) -c $<
> 
> EventDict.cpp: $(DICT)
>         @echo "Generating Dictionary"
>         @$(ROOTSYS)/bin/rootcint -f EventDict.cpp -c $(DICT)



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:37 MET