Re: [ROOT] Problem (?) with MakeSelector

From: Rene Brun (Rene.Brun@cern.ch)
Date: Tue May 21 2002 - 19:25:10 MEST


Hi Ben,

Are you sure that you do not have a gROOT->Reset() statement left in your
code ?
Could you try with
 t4->Process("myselect.C+")
instead of
 t4->Process("myselect.C")

Rene Brun

On Tue, 21 May 2002, Ben Morgan wrote:

> 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