problems with modified Event example

From: Steffen A. Bass (bass@phy.duke.edu)
Date: Wed Jun 17 1998 - 21:03:07 MEST


Hello rooters,
I have modified the Event example from the root distribution for
my own purposes. It works fine as long as I only write a small number of  
event objects with small array sizes. If I increase the number of events
and their size I get a segmentation violation.
My main program is given below, the class definitions and implementations
are in the attachments (beware, the stuff is not compilable since I
truncated the main program to the parts relevant for my problem).

I'd be grateful for any hints on what is going wrong.
Thanks a lot,
	Steffen

--------------------------------------------------------------------------
  Dr. Steffen A. Bass                           phone : [01] 919 660 2570
  Duke University, Dept. of Physics             fax   : [01] 919 660 2464
  Box 90305, Durham N.C. 27708-0305, USA        e-mail: bass@phy.duke.edu
--------------------------------------------------------------------------


// globals and include files
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>

#include "TROOT.h"
#include "TFile.h"
#include "TBranch.h"
#include "TTree.h"
#include "TClonesArray.h"
#include "TMath.h"

#include "TOscarEvent.h"  // here are the new event classes


//--------------------------------------------------------------------------
main()
{
  TROOT simple("simple","tree for OSCAR events");

   Int_t nevent = 0;
   Int_t comp   = 2;       // by default file is compressed
   Int_t split  = 1;       // by default, split Event in sub branches

   TOscarEvent *event=0;  // create event, header and particle objects
   TOscarFileHeader *fheader;
   TParticle *particle;


   Int_t nb = 0;
   Int_t bufsize;

   // Create a new ROOT binary machine independent file.
   // Note that this file may contain any kind of ROOT objects, histograms,
   // pictures, graphics objects, detector geometries, tracks, events, etc..
   // This file is now becoming the current directory.

   TFile *hfile = new TFile("Event.root","RECREATE","TTree ROOT file");
   hfile->SetCompressionLevel(comp);


   // Create a ROOT Tree 
   TTree *tree = new TTree("T","ROOT tree");
   tree->SetAutoSave(100000);  // autosave when 1 Mbyte written
   bufsize = 400000;
   if (split)  bufsize /= 4;

   tree->Branch("fHeaderBranch","TOscarFileHeader", &fheader, bufsize,split);

   fheader = new TOscarFileHeader();

// ... initialize fheader object

   tree->Branch("EventBranch", "TOscarEvent", &event, bufsize,split);

  while(... generating event data ...)
    {

      event = new TOscarEvent();

      for (Int_t i = 0; i < part_mult ; i++) 
	{
	  particle = new TParticle();

	... filling particle object ...

	  event->AddParticle(particle);

	  delete particle;
	}

      nb += tree->Fill();  //fill the branch - the segmentation violation
                           // happens here

      delete event;

      nevent++;
      cout << "processing event # " << nevent << endl;
     
    }      
 
  hfile->Write(); // write tree to file
  //  tree->Print();
   

  Double_t mbytes = 0.000001*nb;


  printf("\n%d events and %f Mbytes processed.\n",nevent,mbytes);
  printf("file compression factor = %f\n",hfile->GetCompressionFactor());
   
  hfile->Close();
  return 0;
}
 


#include "TOscarEvent.h"
#include "TRandom.h"

ClassImp(TOscarFileHeader)
ClassImp(TOscarEvent)
ClassImp(TParticle)

TClonesArray *gParticles;
Int_t gPartCount;
Int_t gArraySize=50000;

//____________________________________________________________________________
 TOscarEvent::TOscarEvent()
{
//   Create one Event object
//   When the constructor is invoked for the first time, the global
//   variable gParticles is NULL. The TClonesArray gParticles is created.
//
   gPartCount= 0;
   if (!gParticles) gParticles = new TClonesArray("TParticle", gArraySize);
   fParticles = gParticles;
}

//____________________________________________________________________________
 TOscarEvent::~TOscarEvent()
{
  //Clear();
  fParticles->Clear();
   // cout << "destructing event " << endl;
}

//____________________________________________________________________________
void TOscarEvent::AddParticle(TParticle *part)
{
// Add a new particle to the list of particles for this event.
// To avoid calling the very time consuming operator new for each track,
// the standard but not well know C++ operator "new with placement" is called.
// if tracks[i] is NULL, a new Track object will be created
// otherwise the previous Track[i] will be overwritten.

   TClonesArray &particles = *fParticles;
   if(gPartCount==gArraySize) 
     {
       cout << " ERROR : too many particles in TClonesArray !! " << endl
	    << "         -> resize gArraySize " << endl;
 	 return;
     }
      new(particles[gPartCount++]) TParticle(part);
   //   particles[gPartCount++] = new TParticle(part);
   
}


//____________________________________________________________________________

TParticle::TParticle(TParticle *part) :TObject()
{
//*-*-*-*-*-*-*-*-*-*-*Particle copy constructor*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  =======================

  fP0   =  part->fP0;
  fPx   =  part->fPx;
  fPy   =  part->fPy;
  fPz   =  part->fPz;
  fMass =  part->fMass;
  fR0   =  part->fR0;
  fRx   =  part->fRx;
  fRy   =  part->fRy;
  fRz   =  part->fRz;
  fNum  =  part->fNum;
  fId   =  part->fId;
  //
  fPt   =  part->fPt;
  fY    =  part->fY;
  fPhi  =  part->fPhi;
  fTheta=  part->fTheta;
  fPabs =  part->fPabs;
}



#include "TObject.h"
#include "TClonesArray.h"
#include "TMath.h"
#include <iostream.h>


class TParticle: public TObject {
// Steffen A. Bass
// simple particle class, contains one TClonesArray, otherwise only
// basic types in order not to have any problems in ROOT

private:
        Double_t      fP0;           // energy 
        Double_t      fPx;           // X component of the momentum
        Double_t      fPy;           // Y component of the momentum
        Double_t      fPz;           // Z component of the momentum
        Double_t      fMass;         // mass of particle
        Double_t      fR0;           // r_0 of particle
        Double_t      fRx;           // X location 
        Double_t      fRy;           // Y 
        Double_t      fRz;           // Z
        Int_t         fNum;          // particle number
        Int_t         fId;           // particle ID
	// members to be calculated
	Double_t      fPt;           // transverse momentum
	Double_t      fY;            // rapidity
	Double_t      fPhi;          // azimuthal angle
	Double_t      fTheta;        // polar angle
	Double_t      fPabs;         // total momentum

public:
        TParticle() {;}
        TParticle(TParticle *part);
        ~TParticle() {;}

        Double_t       GetPx()    {return fPx;}
        Double_t       GetPy()    {return fPy;}
        Double_t       GetPz()    {return fPz;}
        Double_t       GetP0()    {return fP0;}
        Double_t       GetR0()    {return fR0;}
        Double_t       GetRx()    {return fRx;}
        Double_t       GetRy()    {return fRy;}
        Double_t       GetRz()    {return fRz;}
        Double_t       GetMass()  {return fMass;}
        Int_t          GetNum()   {return fNum;}
        Int_t          GetId()    {return fId;}
	Double_t       GetPt()    {return fPt;}
	Double_t       GetY()     {return fY;}
	Double_t       GetPhi()   {return fPhi;}
	Double_t       GetTheta() {return fTheta;}
	Double_t       GetPabs()  {return fPabs;}

        void SetMomenta(Double_t px, Double_t py, Double_t pz)
          {
            fPx=px; 
            fPy=py; 
            fPz=pz;
          }

        void SetLocation(Double_t rx, Double_t ry, Double_t rz)
          {
            fRx=rx; 
            fRy=ry; 
            fRz=rz;
          }

        void SetTime(Double_t r0)     { fR0=r0; }
        void SetEnergy(Double_t p0)   { fP0=p0; }
        void SetMass(Double_t m)      { fMass=m; }
        void SetId(Int_t i)           { fId=i; }
        void SetNum(Int_t num)        { fNum=num; }
        void SetPt(Double_t pt)       { fPt=pt; }
	void SetY(Double_t y)         { fY=y; }
        void SetPhi(Double_t phi)     { fPhi=phi; }
        void SetTheta(Double_t theta) { fTheta=theta; }
	void SetPabs(Double_t pabs)   { fPabs=pabs; }

        ClassDef(TParticle,1)
};


class TOscarFileHeader : public TObject {
// Steffen A. Bass
// class for OSCAR fileheader

public:
  Char_t   fOscarTag[13];
  Char_t   fOscarFiletype[13];
  Char_t   fModelName[9];
  Char_t   fModelVersion[9];
  Int_t    fProjMass;
  Int_t    fTarMass;
  Int_t    fProjCharge;
  Int_t    fTarCharge;
  Char_t   fRefFrame[5];
  Double_t fEBeam;
  Int_t    fNumTestPtcls;

public:
  TOscarFileHeader(){;}
  ~TOscarFileHeader(){;} 

   void SetFileType(Char_t *oftag, Char_t *oftype)
     {
       for(Int_t i=0; i<12; i++) {fOscarTag[i]=oftag[i];}
       for(Int_t i=0; i<12; i++) {fOscarFiletype[i]=oftype[i];}
     }

   void SetModelType( Char_t *model, Char_t *version)
     {
       for(Int_t i=0; i<8; i++) {fModelName[i]=model[i];}
       for(Int_t i=0; i<8; i++) {fModelVersion[i]=version[i];}
     }

   void SetCollSystem(Int_t ap, Int_t zp, Int_t at, Int_t zt, Double_t eb)
     {
       fProjMass=ap;
       fProjCharge=zp;
       fTarMass=at;
       fTarCharge=zt;
       fEBeam=eb;
     }

   void SetRefFrame(Char_t *refsys)
     {
       for(Int_t i=0; i<4; i++) {fRefFrame[i]=refsys[i];}
     }

   void SetTestPtcls(Int_t tp)
     {
       fNumTestPtcls=tp;
     }

   Int_t      GetProjMass()   { return fProjMass; }
   Int_t      GetProjCharge() { return fProjCharge; }
   Int_t      GetTarMass()    { return fTarMass; }
   Int_t      GetTarCharge()  { return fTarCharge; }
   Double_t   GetEbeam()      { return fEBeam; }
   Int_t      GetTestPtcls()  { return fNumTestPtcls; }
   Char_t     *GetRefFrame()  { return fRefFrame; }

    ClassDef(TOscarFileHeader,1)  //Event Header
};


class TOscarEvent : public TObject {
// Steffen A. Bass
// class for OSCAR events (final_id_px format)

public:
   Int_t                fEventNumber;
   Int_t                fPartMult;
   Double_t             fImpactParameter;
   TClonesArray         *fParticles;

public:
   TOscarEvent();
   ~TOscarEvent();

   void          SetEventNumber(Int_t evnum) { fEventNumber = evnum; }
   void          SetPartMult(Int_t pmult) { fPartMult = pmult; }
   void          SetImpactParameter(Double_t b) { fImpactParameter = b; }

   void          AddParticle(TParticle *part);

   Int_t              GetEventNumber()     { return fEventNumber; }
   Int_t              GetPartMult()        { return fPartMult; }
   Double_t           GetImpactParameter() { return fImpactParameter;}
   TClonesArray      *GetParticles()       { return fParticles; }

    ClassDef(TOscarEvent,1)  //Event structure
};





This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:34 MET