[ROOT] segmentation fault with fillin a simple tree

From: Masoud M.Shafiei (shafiei@kvi.nl)
Date: Tue Sep 17 2002 - 00:54:52 MEST


Hi,

        I have a mysterious problem with filling a simple tree.
I am using root 5.15.50 compiled on RedHat 7.3.
I get segmentation fault at the level of filling up the tree.
I ran my gdb debugger and the following message came about:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1026 (LWP 10582)]
0x401f7e51 in TClass::Streamer () from /cern/root/lib/libCore.so.3.03
(gdb) list
386       Delay(2*CLK_TCK);
387     }
388 }
389
390 /*lint -esym(714,testStaDAQ) */
391 void main (int argc, char *argv[])
392 {
393   extern char *optarg;
394   extern int optind;
395   int errflg = 0;
(gdb)

the code is attached,

thanks in advance,
Masoud


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <signal.h>
#include <setjmp.h> 
#include "TROOT.h"
#include "TClass.h"
#include "TTree.h"
#include "TFile.h"
#include "cross.h"
#include "event_structure.h"
#include "tree.h"
#include "TF1.h"
#include "TRandom.h"

#define	MP	 938.27231
#define sqr(x)   ((x)*(x))

TFile         *f;
static TTree         *tree;
extern track_t       track;
extern Island_t      *Islands;
extern float         PbalCoord[2][576];
static int           NoLine;
static const Int_t   bufsize=16384; //16384 = 2^14
static jmp_buf		tree_environment;

static void	fpe_handler(int	sig);

extern "C" 
int BookTree()
{
  // initialize no. of lines
  NoLine=0;

  // Book ntuple
  printf("\n<I> Book ntuple .. \n\n");

  // Create a new ROOT file
  f = new TFile("ppg.root","RECREATE");  
  // Create a TTree
  tree = new TTree("t","ppg data"); 
  // Set auto save
  const Int_t autos=1000;
  tree->SetAutoSave(autos);
  // Create branches with all information of salad track No. 1
  tree->Branch("mul1",&mul1,"mul1/I",bufsize);
  tree->Branch("th1",&th1,"th1/F",bufsize);
  tree->Branch("ph1",&ph1,"ph1/F",bufsize);
  tree->Branch("en1",en1,"en11/F:en12/F:en13/F",bufsize);  
  // Create branches with all information of salad track No. 2
  tree->Branch("mul2",&mul2,"mul2/I",bufsize);
  tree->Branch("th2",&th2,"th2/F",bufsize);
  tree->Branch("ph2",&ph2,"ph2/F",bufsize);
  tree->Branch("en2",en2,"en21/F:en22/F:en23/F",bufsize);  
  // Create branches with all information of pball track
     tree->Branch("mulg",&mulg,"mulg/I",bufsize);
     tree->Branch("thg",thg,"thg1/F:thg2/F:thg3/F:thg4/F:thg5/F:thg6/F:thg7/F:thg8/F:thg9/F:thg10/F",bufsize);
     tree->Branch("phg",phg,"phg1/F:phg2/F:phg3/F:phg4/F:phg5/F:phg6/F:phg7/F:phg8/F:phg9/F:phg10/F",bufsize);
     tree->Branch("delta",delta,"delta1/F:delta2/F:delta3/F:delta4/F:delta5/F:delta6/F:delta7/F:delta8/F:delta9/F:delta10/F",bufsize);
     tree->Branch("energy",energy,"energy1/F:energy2/F:energy3/F:energy4/F:energy5/F:energy6/F:energy7/F:energy8/F:energy9/F:energy10/F",bufsize);   
  // Create branches with all information of reconstruction
  tree->Branch("parity",&parity,"parity/I",bufsize);
  tree->Branch("e1r",&e1r,"e1r/F",bufsize); 
  tree->Branch("e2r",&e2r,"e2r/F",bufsize);   
  tree->Branch("egr",&egr,"egr/F",bufsize);   
  tree->Branch("phgr",&phgr,"phgr/F",bufsize);   

  return(0);
}

extern "C"
int FillTree(int i,int j,int k,float recon[4][6],int rec_parity)
{
  int cnt,id;
  const int SaladSci=24;

  // initialize signal
  //signal(SIGSEGV,fpe_handler);

  // initilization
  parity=0;
  th1=0.;
  ph1=0.;
  th2=0.;
  ph2=0.;
  for(cnt=0;cnt<MAX_SALAD;cnt++) {
    en1[cnt]=0.;
    en2[cnt]=0.;
  }
  for(cnt=0;cnt<MAX_PBALL;cnt++) {
    thg[cnt]=0.;
    phg[cnt]=0.;
    delta[cnt]=0.;
    energy[cnt]=0.;
    e1r=0.;
    e2r=0.;
    egr=0.;
    phgr=0.;
  }
  // salad part, track No.1
  mul1=0;
  th1 = track.salad[i].the;
  ph1 = track.salad[i].phi;
  for(cnt=0;cnt<SaladSci && mul1 < MAX_SALAD-1;cnt++) 
    if(track.salad[i].ene_e[cnt])  
      en1[mul1++] = track.salad[i].ene_e[cnt];
  // salad part, track No.2
  mul2=0;
  th2 = track.salad[j].the;
  ph2 = track.salad[j].phi;   
  for(cnt=0;cnt<SaladSci && mul2 < MAX_SALAD-1;cnt++) 
    if(track.salad[j].ene_e[cnt]) 
      en2[mul2++] = track.salad[j].ene_e[cnt];
  
  // plastic ball part
  mulg=0;
  for(cnt=0;cnt<Islands[k].no && mulg < MAX_PBALL-1;cnt++) {
     id=Islands[k].memb[cnt]; 
     thg[cnt]    = PbalCoord[0][id];
     phg[cnt]    = PbalCoord[1][id];  
    delta[cnt]  = Islands[k].delta[cnt];
    energy[cnt] = Islands[k].energy[cnt];

    mulg++; 
  }

  // reconstruction part
  parity = (Int_t) rec_parity;
  e1r = (Float_t) recon[0][0]-MP;
  e2r = (Float_t) recon[1][0]-MP;
  egr = (Float_t) recon[2][0];
  phgr = (Float_t) recon[2][5];

  // fill ntuple
  tree->Fill();

  // jump
  if(setjmp(tree_environment)) {
    printf("<I> Event bypassed !\n");
    return 0;
  }

  // no of line
  NoLine++;

  return(0);
}

extern "C"
int CloseTree()
{
  // close ntuple
  printf("\n<I> close tree .. \n");

  tree->Print();
  f->Write();
  f->Close();

  // no of lines
  // printf("\n<I> %i written in the tree \n",NoLine);

  return(0);
}

extern "C"
double MyRand()
{
  return gRandom->Rndm();
}

void	fpe_handler(int	sig)
{
  printf("<E> segmentation fault ...\n");
  longjmp(tree_environment,1);
}





This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:10 MET