Hi ROOTers,
I'm currently writing a named script (ROOT v3.02/07 on Linux
PC running RH7.1) to perform cuts a series
of files, each one containing a tree holding the data objects. I've used
MakeSelector to build the skeleton selector code for this tree. Due to the
nature of the data, I want to analyse each file separately and then
append the TEventList generated by the MakeSelector code to this file. My
script loops over each file in turn (I've included the script code below),
but each time the line "t4->Process(...);" is executed, I get the error
message:
Function Analyse() busy. loaded after
"/home/morgan/Analysis/drift1/protodrift/TDriftEvent/./Analyse.C"
Error: G__unloadfile() Can not unload
"/home/morgan/Analysis/drift1/protodrift/TDriftEvent/./Analyse.C", file
busy FILE:Analyse.C LINE:21
*** Interpreter error recovered ***
This doesn't seem to affect the execution (first time), but if I try to
execute it again, I get the error message:
Function Analyse() busy. loaded after "/cern/root/lib/libProof.so"
Error: G__unloadfile() Can not unload "/cern/root/lib/libProof.so", file
busy FILE:Analyse.C LINE:32
*** Interpreter error recovered ***
Also, on second execution, the script falls over with a seg fault that
seems to be due to how I write the list to the file (I use Write with the
fOverwrite option because I'm tuning cuts and only want one list in
there), I've included the
relevant code fragments from the selector code below as well. I'm making
some really simple mistake, but any help would be very gratefully
received! Thanks,
Ben Morgan.
CODE FOR ANALYSE
------------------------------------------------------------------------------
#include <iostream.h>
int Analyse()
{
char filedirectory[100];
char filename[100];
int lowrun, uprun;
cout<<"Enter directory containing files to be analysed: "<<endl;
cin>>filedirectory;
cout<<"Enter run number bounds to be analysed: ";
cin>>lowrun>>uprun;
cout<<endl;
for(int i=lowrun; i<(uprun+1); i++)
{
if(gROOT->FindObject(filename))
delete gROOT->FindObject(filename);
sprintf(filename,"%s/Trun0%d.root",filedirectory,i);
cout<<"Start of loop for file "<<filename<<endl;
TFile *f = new TFile(filename,"update");
cout<<"Address of Tfile Object is "<<f<<endl;
TTree *t4 = (TTree*)f.Get("DriftEventData");
t4->Process("EventSelector.C","fillList");
cout<<"End of loop "<<i<<endl<<endl;
}
if(gROOT->FindObject(filename))
delete gROOT->FindObject(filename);
return 0;
}
-------------------------------------------------------------------------------
MAKESELECTOR FUNCTIONS
-------------------------------------------------------------------------------
TEventList *clist = 0;
Bool_t useList, fillList;
void EventSelector::Begin(TTree *tree)
{
// Function called before starting the event loop.
// Initialize the tree branches.
Init(tree);
TString option = GetOption();
fillList=kFALSE;
useList=kFALSE;
fChain->SetEventList(0);
delete gDirectory->GetList()->FindObject("clist");
if (option.Contains("fillList")) {
fillList = kTRUE;
clist = new TEventList("clist","selection from Cut",5000);
}
if (option.Contains("useList")) {
useList = kTRUE;
TFile *f = fChain->GetCurrentFile();
elist = (TEventList*)f.Get("clist");
if (elist) elist->SetDirectory(0);
fChain->SetEventList(clist);
}
cout<<"In Selector, current file is: "<<fChain->GetCurrentFile()<<endl;
}
void EventSelector::Terminate()
{
// Function called at the end of the event loop.
if(fillList)
{
cout<<"Writing (Rewriting) List to File"<<endl;
clist->Write("clist",TObject::kOverwrite);
}
cout<<"Termintate Selector Loop"<<endl;
}
--
-------------------------------------------------------------------------------
Mr. Ben Morgan
Postgraduate Student
University of Sheffield
Department of Physics & Astronomy
Hicks Building
Hounsfield Road
Sheffield S3 7RH
-------------------------------------------------------------------------------
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:53 MET