Dear ROOT users, I get "segmentation violation" at the level of filling up my tree. To my understanding this is due to the shortage of memory and to solve this problem I used SetAutoSave(autos=1000) command and set the bufsize to 1024, nevertheless the problem is still there ! Anybody knows what to do? The code is attached :) Thanks in advance Masoud #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "TROOT.h" #include "TClass.h" #include "TTree.h" #include "TFile.h" #include "cross.h" #include "event_structure.h" #include "tree.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]; extern float AllSolut[2][4][6]; extern int MainCount; static int NoLine; static const Int_t bufsize=1024; //16384 = 2^14 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","test"); // Create a TTree tree = new TTree("t","ppg data"); // Set auto save const Int_t autos=10; t->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,"en1[mul1]/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,"en2[mul2]/F",bufsize); // Create branches with all information of pball track tree->Branch("mulg",&mulg,"mulg/I",bufsize); tree->Branch("thg",thg,"thg[mulg]/F",bufsize); tree->Branch("phg",phg,"phg[mulg]/F",bufsize); tree->Branch("delta",delta,"delta[mulg]/F",bufsize); tree->Branch("energy",energy,"energy[mulg]/F",bufsize); // Create branches with all information of reconstruction tree->Branch("mulr",&mulr,"mulr/I",bufsize); tree->Branch("e1r",e1r,"e1r[mulr]/F",bufsize); tree->Branch("e2r",e2r,"e2r[mulr]/F",bufsize); tree->Branch("egr",egr,"egr[mulr]/F",bufsize); tree->Branch("phgr",phgr,"phgr[mulr]/F",bufsize); return(0); } extern "C" int FillTree(int i,int j,int k) { int cnt,id; // salad part, track No.1 mul1=0; th1 = track.salad[i].the; ph1 = track.salad[i].phi; for(cnt=0;cnt<MAX_SALAD;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<MAX_SALAD;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 && cnt < MAX_PBALL;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 mulr=MainCount; for(cnt=0;cnt<MainCount;cnt++) { e1r[cnt] = (Float_t) AllSolut[cnt][0][0]-MP; e2r[cnt] = (Float_t) AllSolut[cnt][1][0]-MP; egr[cnt] = (Float_t) AllSolut[cnt][2][0]; phgr[cnt] = (Float_t) AllSolut[cnt][2][5]; } // fill ntuple tree->Fill(); // 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); }
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:04 MET