RE: [ROOT] Locking root files

From: Anton Fokin (fokin@tsl.uu.se)
Date: Wed May 03 2000 - 16:23:11 MEST


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