Hi Anthony,
What you want to do is possible if you just want to do a simple write of
an object in your G4 session. Below, you will find a simple example with
a class A (modified from my previous posting of class A).
the following files:
-a one line compile/link script goA
-A.h
-A.cxx
-Amain.cxx a simple main program writing 10 instances of A on a file
Rene Brun
//-------------file goA
g++ -o A -g -fPIC -I$ROOTSYS/include A.cxx Amain.cxx \
-L$ROOTSYS/lib -lCore -lCint -lm -ldl -rdynamic
//-------------file A.h
#ifndef __A_HH__
#define __A_HH__
#include "TObject.h"
class A : public TObject {
public:
A();
virtual ~A();
Float_t fA;
Float_t fB;
ClassDef(A,1) //My small class example
};
#endif
//-------------file A.cxx
#include "A.h"
#include "TBuffer.h"
#include "TMemberInspector.h"
ClassImp(A)
A::A() {
fA = 1;
fB = 2;
}
A::~A() {
}
void A::Streamer(TBuffer &R__b)
{
// Stream an object of class A.
if (R__b.IsReading()) {
Version_t R__v = R__b.ReadVersion(); if (R__v) { }
TObject::Streamer(R__b);
R__b >> fA;
R__b >> fB;
} else {
R__b.WriteVersion(A::IsA());
TObject::Streamer(R__b);
R__b << fA;
R__b << fB;
}
}
void A::ShowMembers(TMemberInspector &, char *) {}
//-----------------------file Amain.cxx
#include "TROOT.h"
#include "TFile.h"
#include "TRandom.h"
#include "A.h"
TROOT simple("simple","trees");
int main()
{
A *a = new A;
char name[10];
TFile f("A.root","recreate");
for (Int_t i=0;i<10;i++) {
a->fA = gRandom->Rndm();
a->fB = gRandom->Gaus(0,1);
sprintf(name,"A%d",i);
a->Write(name);
}
f.ls();
return 0;
}
Anthony Faust wrote:
>
>
> I am writing a class that is intended to be used both with a Geant4
> program, where the class will only be filled an written to a ROOT file,
> and as a stand alone analysis class to be loaded in a ROOT session and will then
> read back the generated G4 ROOT files.
>
> To do this, I created a class which inclued methods to fill my class
> object in the G4 environment all hidden behind preprocessor diectives so they
> would not be seem when working in ROOT. Similarly, I would like to hide as much
> of the ROOT information from G4 as I can so as to minimize the code size.
> However, I can no seem to do this without the linker complaining about a number
> of missing definitions.
>
> What then would be the minimal definition of a class so that its members
> could be written to a ROOT file? Can I simply include a Class::Streamer function
> or must I link in the full ClassDict.XX files (These are the ones I would like
> to avoid) ?
>
> Thanks.
>
> _____________
> Dr. Anthony A. Faust | Anthony.Faust@dres.dnd.ca
> Defence Research Establishment Suffield | PH: (403) 544-5362
> Box 4000, Medicine Hat, Alberta, CANADA T1A 8K6 | FAX: (403) 544-4704
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:43 MET