Re: [ROOT] C structure as a branch?

From: Yiqun Wang (yqwang@rcf.rhic.bnl.gov)
Date: Fri Nov 22 2002 - 05:05:39 MET


Hi,

So I try to compile the attached "test.cc". If I do not comment out those
"ClassDef(FitEvent,1)", I got an error:

/tmp/cc3seyVF.o: In function `SmdPeak::SmdPeak(void)':
/home/yqwang/working/K0-short/test.cc:14: undefined reference to `FitEvent
virtual table'
collect2: ld returned 1 exit status
gmake: *** [test] Error 1

If I comment out "ClassDef(FitEvent,1)", compilation is successful.
However, when I run the program, I will get this error:

Error in <TTree::Bronch>: Cannot find class:FitEvent

and I will not get the branch in the root file.

Yiqun Wang

> Don't use typedefs, like in your original example, plain structs like
> this should work too (struct is an all public class in c++):
>
> struct SmdPeak {
>   Float_t peakPos;
>   Float_t peakEnerg;
>   Float_t sigmaPeak;
>   Int_t   corSimuPeak;
>   bool    used;
>
>   SmdPeak() {}
>
>   ClassDef (SmdPeak,1)
> };
>
>
> -- Fons
>
>
> On Thu, 2002-11-21 at 16:25, Rene Brun wrote:
>> Hi,
>>
>> Create classes instead of struct as shown below
>>
>> Rene Brun
>>
>>
>> #include "TTree.h"
>> #include "TFile.h"
>> #include "TRandom.h"
>>
>> class SmdPeak {
>>
>> public:
>>   Float_t peakPos;
>>   Float_t peakEnerg;
>>   Float_t sigmaPeak;
>>   Int_t   corSimuPeak;
>>   bool    used;
>>
>>   SmdPeak() {}
>>
>>   ClassDef (SmdPeak,1)
>> };
>>
>> class FitEvent {
>>
>> public:
>>         UInt_t  runnumber;
>>         Int_t   event;
>>         Int_t   numbXPeaks;
>>         Int_t   numbYPeaks;
>>         Float_t tower[4][3];
>>         Float_t smdX[61];
>>         Float_t smdY[101];
>>         SmdPeak xPeak[4];
>>
>>         ClassDef(FitEvent,1)
>> };
>>
>> void struct2()
>> {
>>    TFile f("struct.root","recreate");
>>    TTree T("T","test struct");
>>    FitEvent *event = new FitEvent;
>>
>>    T.Branch("first","FitEvent",&event);
>>    for (Int_t i=0;i<1000;i++) {
>>       event->event = i;
>>       event->runnumber = (UInt_t)(100*gRandom->Rndm());
>>       //for (Int_t j=0;j<event.count;j++) event.meas[j] = i+j;
>>       T.Fill();
>>    }
>>    T.Print();
>>    T.Show(45);
>>    T.Write();
>> }
>>
>>
>> On Wed, 20 Nov 2002, Yiqun Wang wrote:
>>
>> > Hi,
>> >
>> > Is there a way to create a branch that is an array of C structure?
>> The online reference on
>> >
>> > TBranch(const char *name, void *address, const char *leaflist, Int_t
>> basketsize, Int_t compress) :TNamed(name,leaflist)
>> >
>> > only talked about a C structure branch.
>> >
>> > My header file is like this:
>> >
>> >
>> > typedef struct{
>> >   Float_t peakPos;
>> >   Float_t peakEnerg;
>> >   Float_t sigmaPeak;
>> >   Int_t   corSimuPeak;
>> >   bool    used;
>> > } SmdPeak;
>> >
>> > typedef struct{
>> >
>> > 	UInt_t  runnumber;
>> > 	Int_t   event;
>> > 	Int_t   numbXPeaks;
>> > 	Int_t   numbYPeaks;
>> > 	Float_t tower[4][3];
>> > 	Float_t smdX[61];
>> > 	Float_t smdY[101];
>> > 	SmdPeak xPeak[4];
>> > SmdPeak xPeak[4];
>> > } FitEvent;
>> >
>> >
>> >
> --
> Org:    CERN, European Laboratory for Particle Physics.
> Mail:   1211 Geneve 23, Switzerland
> E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248 WWW:
>   http://root.cern.ch/~rdm/            Fax:   +41 22 7679480







This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:20 MET