[ROOT] Updating existing tree.

From: Nicholai Kuropatkin (kuropat@fnal.gov)
Date: Thu Feb 01 2001 - 22:44:05 MET


 Dear rooters.
 In my data analyses I need to process a list of gziped data files creating
 a root tree. After a while another list should be processed and selected events
 should be added to the existing tree on the same file increasing statistics.
 I have solved the problem reading existing tree, adding new events and writing
  a new temporary file that will replace the old one.
  It works, but looks complicated. 
  I just wonder if there is a better way to achieve the same goal.

 Extraction from my program follows.
 
                        Thanks for any suggestion.
			
			                                Nikolai                


#include <stdlib.h>
#include "TROOT.h"
#include "TFile.h"
#include "TRandom.h"
#include "TTree.h"
#include "TBranch.h"
#include "TClonesArray.h"
#include "TStopwatch.h"
#include "TUnixSystem.h"
#include "TRecon.h"

//_____________________________________________________________________________
int main(int argc, char **argv)
{
   TROOT vt2rtup("vt2rtup","Create root tree from vtuple");

   char vtup_file[256]=" ";
   char vtup_list[256]=" ";
   char out_file[256]=" ";
   char tmp_file[256]=" ";
   const char mode[2]="r";
   const char lmod[2]="r";
   Int_t comp   = 2;       // by default file is compressed
 

//
   TUnixSystem *os = new TUnixSystem();
   if ( os->Init()) { cout<<"error creating os interface"<<endl; }  
   char command[180] = "gunzip -c ";

    FILE *pipe;
   TTree *Stup=0;
   TFile *hfile=0;
    FILE *fp;

   TRecon *event= new TRecon();



//
//   Create temporary root file
//
		 
	  hfile = new TFile(tmp_file,"recreate","ntuple");
          hfile->SetCompressionLevel(comp);
//
     
     // Create a ROOT tree with one branch 

      Stup = new TTree(name,title);
      Stup->Branch("RN",&RN.run,varlist);

// Try to open an old file if any

     TFile *f1 = new TFile(out_file);
     Bool_t stat = f1->IsOpen();
     if ( stat ) {                    // if the file is opend
//
//  read an old tree
//
       TTree *oldTree = (TTree*)f1->Get(name);
       oldTree->SetBranchAddress("RN",&RN.run);
 
      Int_t nentries = oldTree->GetEntries();

   for (Int_t i=0;i<nentries;i++) {      // copy it to a new tree
      oldTree->GetEntry(i);
      Stup->Fill();
   }
     f1->Close();
     
                 } 

     hfile->cd();		 
//
//   Read the list of vtuple files and process them one by one
//
     cout<<" list of vtuples file="<<vtup_list<<endl;   
     if( (fp = fopen(vtup_list,lmod)) == NULL)
    {
    cout<<" Error opening vtup_list"<<endl;
   fclose(fp);
   hfile->Close();
   return -1;    
    } else  {                                 // if list open -  OK
     while ( !feof(fp) ) {                    // read file loop
     fscanf(fp," %s ",vtup_file);
     cout<<" Processing "<<vtup_file<<endl;

     
     strcpy(command,"gunzip -c  ");
     strcat(command,vtup_file);

      pipe = os->OpenPipe(command,mode);
      if( ! pipe )
    {
    cout<<"Error opening vtup file "<<endl;
     return -1;
     } else {                                    // if pipe is opened

//
    while ( !feof(pipe) ) {                      // read file loop 
//   
//
//   File processing loop
//  
      Stup->Fill();                                   // Fill new tree
//                            	

     }                                                // if read OK
          else {                                      // if error in the file
     cout<<" Error reading the vtuple"<<endl;
//
     os->ClosePipe(pipe);                               // close pipe
     break;	 
   }                                                  // 

          }                                           // end read vtup   
   os->ClosePipe(pipe);                               // close pipe
            }                                         // end if pipe open
          }                                           // end of read list
	}                                             // end if list open
//
   Stup->Write();                                     // Write temporary file
   hfile->Close();
//
   strcpy(command,"mv ");                             // Replace the old one
   strcat(command,tmp_file);
   strcat(command," ");
   strcat(command,out_file);
   os->Exec(command);
//

   return 0;
}



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:35 MET