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