[G14_run] Bug in rootbeer.

Jamie Fleming jamie.fleming at ed.ac.uk
Thu Apr 10 12:26:12 EDT 2014


Thanks for this Dao. This line is already included in my version of 
TDST,cxx.

I'm experiencing zombies when using the hadd command with ROOT. So I 
believe that these are true zombie files.

Jamie


On 09/04/14 17:19, daoh at andrew.cmu.edu wrote:
> Dear collaborators,
>
> If you are using rootbeer for analysis, your code probably has a small
> bug. The bug causes your code to terminate because it thinks the current
> DST root file is a zombie file. The problem lies inside a very innocent
> lines of code:
>
>
> if((rootbeer=createBeerObject(inFile))==NULL) return;   // create rootbeer
> object, should use continue, not return.
>
> if you go to src/RootBeerUtil.cxx (this folder inside rootbeer), you would
> see the how the createBeerObject function defined.
> If you see the followings, then we have the same version:
>
>
> //************************* createBeerObject()
> ********************************
> TRootBeer *createBeerObject(char *bankFileName){
>    Int_t error=0;
>
>    //work out whether it's a bos file or a root file and create the
>    //appropriate object
>    if((strstr(bankFileName,".root"))!=NULL){
>      rootbeer = new TDST(bankFileName,bankAddress,nBankTypes); //<--problem
> is here
>    }
>    else{
>      rootbeer = new TBos(bankFileName,bankAddress,nBankTypes);
>    }
>    error=rootbeer->GetError(); //<--problem is here
>    if(error){
>      delete rootbeer;
>      return NULL;
>    }
>    else  return rootbeer;
> }
>
>
> The variable error is used as a flag to indicate whether the current root
> file is Zombile or not.
> Open the file TDST.cxx (the same directory), you would see that
> rootbeer->GetError() returns fError.  For some reasons, fError can have a
> non zero value, even though the file is NOT zombie. The problem is that
> the fError needs to be initialized before it can be used (the below
> function is a constructor). So just add this line fError=0; //-->ADDING
> THIS LINE to the function below.
>
> TDST::TDST(const char *bosFile, void* addresses, int total)
> {
> // Create one TDST object and open the 1st data file
>
>    fError=0; //-->ADDING THIS LINE
>    fBankAddr = (struct addressBanks_t*)addresses;        //all info about
> bank variables
>    fBankTotal = total;                                   //total no of
> defined banks
>    fDSTfile = new TFile(bosFile);                        //open DST input file
>    if(fDSTfile->IsZombie()){                             //if failed return
> error
>      fprintf(stderr,"Zombie file? \n");
>      fError=1;
>      return;
>    }
>    fBankTree = (TTree*)gDirectory->Get("bankTree");      //get the tree
>    if(fBankTree==NULL){
>      fprintf(stderr,"failed to open banktree \n");
>      return;
>    }
>    fBigBuff = new char[100000];          //create a 100k buffer to hold the
> event
>    fDataStartAddr = fBigBuff;            //init the data pointer
>    fDataAddr = fBigBuff;                 //ditto
>    fServedBankNo=0;                      //init the no of banks being handled
>    fEntry=0;
>    fMaxEntry=(int)fBankTree->GetEntries(); //get the no of events in the
> DST file
>    for(int n=0;n<fBankTotal;n++){        //init the status of all banks to
> zero
>        fBankStatus[n]=0;
>    }
> }
>
>
>
> If you still have same problems, then the root file is truely a zombie!
> But it is a good practice to initialize variables before using them. Btw,
> you need to reinstall rootbeer.
>
> Sincerely,
> Dao Ho
>
> _______________________________________________
> G14_run mailing list
> G14_run at jlab.org
> https://mailman.jlab.org/mailman/listinfo/g14_run
>


-- 
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.



More information about the G14_run mailing list