Re: Seg violation during TTree::Branch

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Feb 23 2000 - 12:12:18 MET


Hi Ulrich,
You had an error in your Event constructor (copy/paste problem ::) )
Replace the following lines :

  if(!fgB0sMimps) fgB0sMimps = new TClonesArray("Mimp",1000);
  if(!fgMuminusMimps) fgB0sMimps = new TClonesArray("Mimp",1000);
  if(!fgMuplusMimps) fgB0sMimps = new TClonesArray("Mimp",1000);
by
  if(!fgB0sMimps) fgB0sMimps = new TClonesArray("Mimp",1000);
  if(!fgMuminusMimps) fgMuminusMimps = new TClonesArray("Mimp",1000);
  if(!fgMuplusMimps) fgMuplusMimps = new TClonesArray("Mimp",1000);

Rene Brun

Ulrich Husemann wrote:
> 
> 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