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