Re: [ROOT] invalid class specified in TClonesArray ctor

From: Pasha Murat (630)840-8237 FNAL (630)859-3463 home (murat@murat.fnal.gov)
Date: Sun Jun 25 2000 - 18:26:13 MEST


you may want to put back ClassImp/ClassDef - things stored in TClonesArray
need them. -best, Pasha

Colin Bernet wrote:
> 
> Hi,
> 
> I wanted to adapt the Event and Track classes to my needs, so I just
> renamed the Track class as Hit, removed some methods and the ClassImp,
> ClassDef. I may have removed too many things, cause now I get this
> message when adding a Hit to the TClonesArray in Event :
> 
> Error in <TClonesArray::operator[]>: invalid class specified in
> TClonesArray ctor
> 
> Then a segmentation fault occurs in the TObject constructor (Hit
> inherits from TObject).
> 
> Could you help  ?
> thanks,
> 
>     Colin
> 
>   ----------------------------------------------------------------------------------------------------------------------------------
> #include "Event.h"
> 
> TClonesArray *Event::fgHits = 0;
> 
> //______________________________________________________________________________
> Event::Event()
> {
>    // Create an Event object.
>    // When the constructor is invoked for the first time, the class static
>    // variable fgHits is 0 and the TClonesArray fgHits is created.
> 
>    if (!fgHits) fgHits = new TClonesArray("Hit", 1000);
>    fHits = fgHits;
>    fNHit = 0;
> }
> 
> //______________________________________________________________________________
> Event::~Event()
> {
>    Clear();
> }
> 
> //______________________________________________________________________________
> void Event::AddHit(TString* detname, int channel, float data, int type)
> {
>    TClonesArray &Hits = *fHits;
>    new(Hits[fNHit++]) Hit(detname,channel,data,type);
> }
> 
> //______________________________________________________________________________
> void Event::Clear(Option_t *option)
> {
>    fHits->Clear(option);
> }
> 
> //______________________________________________________________________________
> void Event::Reset(Option_t *option)
> {
> // Static function to reset all static objects for this event
> //   fgHits->Delete(option);
>    delete fgHits; fgHits = 0;
> }
> 
> //______________________________________________________________________________
> void Event::SetHeader(Int_t i, Int_t run)
> {
>    fNHit = 0;
>    fEvtHdr.Set(i, run);
> }
> 
> //______________________________________________________________________________
> Hit::Hit(TString* detname, int channel, float data, int type) : TObject()
> {
>   fDetname=new TString(*detname);
>   fChannel=channel;
>   fData=data;
>   fType=type;
> }
> 
> Hit::IsMeanTimer() {
>   if (fType=1) return 1;
>   else return 0;
> }
> 
> Hit::IsAdc() {
>   if (fType=2) return 1;
>   else return 0;
> }
> 
>   ----------------------------------------------------------------------------------------------------------------------------------
> #ifndef MY_Event
> #define MY_Event
> 
> #include <TString.h>
> #include <TObject.h>
> #include <TClonesArray.h>
> 
> class EventHeader {
> 
>  private:
>   Int_t   fEvtNum;
>   Int_t   fRun;
> 
>  public:
>   EventHeader() : fEvtNum(0), fRun(0) { }
>   virtual ~EventHeader() { }
>   void   Set(Int_t i, Int_t r) { fEvtNum = i; fRun = r;}
>   Int_t  GetEvtNum() const { return fEvtNum; }
>   Int_t  GetRun() const { return fRun; }
> };
> 
> class Event : public TObject {
> 
>  private:
>   Int_t          fNHit;
>   UInt_t         fFlag;
>   EventHeader    fEvtHdr;
>   TClonesArray  *fHits;
> 
>   static TClonesArray *fgHits;
> 
>  public:
>   Event();
>   virtual ~Event();
>   void          Clear(Option_t *option ="");
>   static void   Reset(Option_t *option ="");
>   void          SetNhits(Int_t n) { fNHit = n; }
>   void          SetFlag(UInt_t f) { fFlag = f; }
> 
>   void          SetHeader(Int_t i, Int_t run);
>   void          AddHit(TString* detname, int channel, float data, int type);
> 
>   Int_t         GetNhits() const { return fNHit; }
>   UInt_t        GetFlag() const { return fFlag; }
>   EventHeader*  GetHeader() { return &fEvtHdr; }
>   TClonesArray* GetHits() const { return fHits; }
> };
> 
> class Hit : public TObject {
> 
>  private:
>   TString *fDetname;
>   int fChannel;
>   float fData;
>   int fType;
> 
>  public:
>    Hit() { }
>    Hit(TString* detname, int channel, float data, int type);
>    virtual ~Hit() { }
>    int           IsMeanTimer();
>    int           IsAdc();
> };
> 
> #endif



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:28 MET