Re: Seg violation during TTree::Branch

From: Ulrich Husemann (husemann@physik.uni-dortmund.de)
Date: Wed Feb 23 2000 - 11:42:49 MET


Hi Rene!

In the main program I have something like this (simplified)

#include "Event.hh"

Event* event;

void main()
{
	event = new Event();
	evttree = new TTree("evttree","rare decays ROOT tree");
	evttree->Branch("event","Event",&event);
}



The implementation of the classes:

#include "Event.hh"
//#include "arte/ArteMessage.hh"

ClassImp(EventHeader)
ClassImp(Mimp)
ClassImp(Event)

TClonesArray* Event::fgB0sMimps = 0;
TClonesArray* Event::fgMuplusMimps = 0;
TClonesArray* Event::fgMuminusMimps = 0;

//****************************************************************************

EventHeader::EventHeader()
  : fEvtNum(0), fRunNum(0), fDate(0), fTime(0), fBX(0) { }

EventHeader::~EventHeader() { }

void EventHeader::SetAll(Int_t EvtNum, Int_t RunNum, Int_t Date, Int_t
Time, Int_t BX)
{
  fEvtNum = EvtNum;
  fRunNum = RunNum;
  fDate = Date;
  fTime = Time;
  fBX = BX;
}

//****************************************************************************

void Mimp::Clear()
{
  fX = 0; fY=0; fZ = 0;
  fPx = 0; fPy = 0; fPz = 0;
  fCmp = 0; fNsl = 0;
}

void Mimp::SetConvertedMomenta(Float_t tx, Float_t ty, Float_t p)
{
  fPz = p/(sqrt(1 + tx*tx + ty*ty));
  fPx = tx * fPz;
  fPy = ty * fPz;
}

//****************************************************************************

Event::Event()
{
  if(!fgB0sMimps) fgB0sMimps = new TClonesArray("Mimp",1000);
  if(!fgMuminusMimps) fgB0sMimps = new TClonesArray("Mimp",1000);
  if(!fgMuplusMimps) fgB0sMimps = new TClonesArray("Mimp",1000);

  fB0sMimps = fgB0sMimps;
  fMuminusMimps = fgMuminusMimps;
  fMuplusMimps = fgMuplusMimps;
  fNb0sMimps = 0;
  fNmuminusMimps = 0;
  fNmuplusMimps = 0;
}

Event::~Event() {}

void Event::AddMimp(const Mimp* mymimp, char* particle) 
{
  if (particle == "B0s") AddB0sMimp(mymimp);
  else if (particle == "Muplus") AddMuplusMimp(mymimp);
  else if (particle == "Muminus") AddMuminusMimp(mymimp);
  else 
    {
      //arteMsg << "Cannot fill MIMP array for this particle type" <<
endl;
      //arteMsg.warn();
    }
}

void Event::AddB0sMimp(const Mimp* mymimp)
{
  TClonesArray &b0s = *fB0sMimps;
  new(b0s[fNb0sMimps++]) Mimp(mymimp);
}

void Event::AddMuminusMimp(const Mimp* mymimp)
{
  TClonesArray &muminus = *fMuminusMimps;
  new(muminus[fNmuminusMimps++]) Mimp(mymimp);
}

void Event::AddMuplusMimp(const Mimp* mymimp)
{
  TClonesArray &muplus = *fMuplusMimps;
  new(muplus[fNmuplusMimps++]) Mimp(mymimp);
}

void Event::Clear(Option_t *option)
{
  fNb0sMimps = 0;
  fNmuminusMimps = 0;
  fNmuplusMimps = 0;
  fB0sMimps->Clear(option);
  fMuminusMimps->Clear(option);
  fMuplusMimps->Clear(option);
  fEvtHdr.SetAll(0,0,0,0,0);
}

void Event::Reset(Option_t *option)
{
  delete fgB0sMimps; fgB0sMimps = 0;
  delete fgMuminusMimps; fgMuminusMimps = 0;
  delete fgMuplusMimps; fgMuplusMimps = 0;
}

void Event::SetHeader(Int_t EvtNum, Int_t RunNum, Int_t Date, Int_t Time,
Int_t BX)
{
  fEvtHdr.SetAll(EvtNum, RunNum, Date, Time, BX);
}


Ulrich Husemann



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