Hi Rene,
thanks for the reply, but it looks like it doesn't work for me...
I have one process which opens a root file with "RECREATE" option and
constantly fills a tree. Autosave is set to 100 events and I call
gDirectory->SaveSelf() after each event. See the code lines below:
// open a file
EventFile = new TFile(EventFileName,"RECREATE");
EventFile->SetCompressionLevel(0);
// create a tree
fTree = new TTree("CHICSiTree",title);
fTree->SetAutoSave(100);
fTree->Branch("Event", "TCHICSiEvent", &fEvent, 64000, 1);
// inside the main loop
fTree->Fill();
gDirectory->SaveSelf();
Another process is a macro reading the tree. It works but the number of
events is always the same. On the other hand if I open and close file, it
works as expected, filling histograms "on-line"... I tryed to put different
lines in the macro in different places. Nothing helps...
{
gROOT->Reset();
TH1F *Hist[32];
char Name[128];
char Title[128];
for(Int_t i=0;i<32;i++) {
sprintf(Name,"Detector%d",i+1);
sprintf(Title,"%d ",i+1);
Hist[i] = new TH1F(Name,Title,100,0,100);
Hist[i]->SetStats(kFALSE);
}
printf("\n\n-- CHICSi on-line macro demo --\n\n");
Short_t RingNumber;
RQuantInputDescriptor * InputDescriptor = new RQuantInputDescriptor();
InputDescriptor->SetNParam(1);
InputDescriptor->SetParamName(0,"Ring number:");
InputDescriptor->SetParam(0,10);
new RQuantInputFrame(InputDescriptor, gClient->GetRoot(),
gRQuantMainFrame, 600, 400);
RingNumber = InputDescriptor->GetParam(0);
TCHICSiEvent* Event = new TCHICSiEvent();
TFile File("/home/anton/data/run001.root");
TTree* Tree = (TTree*) File.Get("CHICSiTree");
TBranch* Branch = Tree->GetBranch("Event");
Branch->SetAddress(&Event);
Int_t FirstEvent = 0;
while (!gPreviewFrame->IsStopMacro()) {
gDirectory->ReadKeys();
Tree = (TTree*) File.Get("CHICSiTree");
Branch = Tree->GetBranch("Event");
Branch->SetAddress(&Event);
Int_t NEvent = Int_t(Tree->GetEntries());
Int_t NTrack;
Short_t Ring;
printf("NEvent = %d\n",NEvent);
for(Int_t EventCount=FirstEvent;EventCount<NEvent;EventCount++) {
Tree->GetEvent(EventCount);
NTrack = Event->GetNTrack();
for(Int_t TrackCount=0;TrackCount<NTrack;TrackCount++) {
Track = Event->GetTrack(TrackCount);
Ring = Track->GetRing();
if (Ring == RingNumber)
Hist[Track->GetRow()-1]->Fill(Track->GetdEHigh(),1);
}
if (!(EventCount%1))
gSystem->ProcessEvents();
}
gSystem->ProcessEvents();
FirstEvent = NEvent;
TCanvas *Canvas;
if (gROOT->FindObject("PreviewCanvas")) {
Canvas = PreviewCanvas;
Canvas->cd();
Canvas->Clear();
}
else
Canvas = new TCanvas("Canvas","CHICSi event tree demo",1300,500);
Canvas->Divide(8,4);
for(Int_t i=0;i<32;i++) {
Canvas->cd(i+1);
Hist[i]->Draw();
}
Canvas->Modified();
Canvas->Update();
gSystem->Sleep(1000);
}
File.Close();
printf("Macro execution terminated. Exiting...\n");
}
-----Original Message-----
From: owner-roottalk@pcroot.cern.ch
[mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Rene Brun
Sent: Tuesday, May 02, 2000 6:43 PM
To: KOSU_FOKIN@garbo.lucas.lu.se
Cc: roottalk@pcroot.cern.ch
Subject: Re: [ROOT] Locking root files
Hi Anton,
look at
http://root.cern.ch/root/html/TDirectory.html#TDirectory:ReadKeys
http://root.cern.ch/root/html/TDirectory.html#TDirectory:SaveSelf
Rene Brun
KOSU_FOKIN@garbo.lucas.lu.se wrote:
>
> Hi rooters,
>
> is there an opportunity to "lock" a root file? I have an event
> logger, which writes events in a root file and a client, which
> reads and process them. It works fine until logger performs
> autosave of a root tree and the client tryes to recover keys
> from "not closed" file at the same time. Then everything crashes.
>
> Any suggestions?
>
> /Anton
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:24 MET