Hi John,
You have an error in treecons.C.
When a Tree has N entries, the last entry number is N-1.
Your program will work if you change treecons.C as shown below.
Rene Brun
void treecons()
{
TMapFile *fi = TMapFile::Create("treeprod.map");
int old_entries = 0;
int new_entries = 0;
int mult;
TTree* arbmap = 0;
while(1){
arbmap = (TTree*)fi->Get("Arbre", arbmap);
new_entries = (Int_t)arbmap->GetEntries();
if(new_entries > old_entries){
old_entries = new_entries;
cout << "Got new event: event number " << old_entries;
arbmap->SetBranchAddress("mult",&mult);
arbmap->GetEntry(old_entries-1);
cout << " + Mult=" << mult<<endl;
arbmap->Draw("mult");
gPad->Modified();
gPad->Update();
}
if(gSystem->ProcessEvents()) break;
}
}
Frankland John wrote:
>
> Hello ROOTworld
>
> After several hours playing around and reading the digest...
> In the attached example scripts, I "succeeded" in filling a TTree in one
> process
> (treeprod.C) and reading it at the same time in another (treecons.C). Or
> rather, reading the
> number of entries in the TTree is fine, but when I try to read the value of
> the branch variable
> ("mult") I get nonsense, unless I do a TTree::Draw("mult") in which case I get
> the correct
> spectrum and subsequent calls to TTree::GetEntry(i) followed by cout << mult
> give the
> right value.
>
> In other words, when the 2 scripts are running I get, on the treeprod()
> terminal:
>
> 13th event... Mult=41
> 14th event... Mult=15
> 15th event... Mult=23
> 16th event... Mult=24
> 17th event... Mult=48
> 18th event... Mult=12
> ...
> and on the treecons() terminal :
>
> Got new event: event number 13 + Mult=1079526108
> <TCanvas::MakeDefCanvas>: created default TCanvas with name c1
> Got new event: event number 14 + Mult=41
> Got new event: event number 15 + Mult=15
> Got new event: event number 16 + Mult=23
> Got new event: event number 17 + Mult=24
> Got new event: event number 18 + Mult=48
> Got new event: event number 19 + Mult=12
> ...
>
> Oh, in fact I've just noticed that the value of "mult" is one event behind the
> correct value as well!
> Without the "Draw" line in treecons I get
>
> Got new event: event number 13 + Mult=1079526108
> Got new event: event number 14 + Mult=1079526108
> Got new event: event number 15 + Mult=1079526108
> Got new event: event number 16 + Mult=1079526108
> Got new event: event number 17 + Mult=1079526108
> Got new event: event number 18 + Mult=1079526108
> etc. etc.
>
> Can somebody help please ?
> Also, is it possible to share the TTree in this way and still write it to disk
> ?
> Because when I tried to open the TMapFile after stopping the scripts I was
> informed
> (quite logically) that said file is not a TFile... Is it just a buffer of
> sorts ?
>
> What I actually want to be able to do is to store incoming data acquisition
> events in a TTree
> whilst an independent process triggered by a certain type of event would then
> look back through
> all the previously stored events for some correlation. Is this the best (only)
> way to do it ?
>
> Sorry if this is just too basic (again)
> Thanks for any help
> John
>
> --
> John D. Franklandtel: +33
> Beam Coordinator (0)231454628
> GANIL fax: +33
> B.P. 55027 (0)231454665
> 14076 CAEN Cedex
> 05
>
> -----------------------------------------------------------------------
> //$Id: indra2root.C,v 1.4 2003/10/06 22:16:15 franklan Exp $
> // Lecture d'un fichier d'evenements INDRA et transformation en arbre ROOT
> //
> #ifndef __CINT__
> #include <cstdio>
> #include <Riostream.h>
> #include <fstream>
> #endif
>
> #include "TMapFile.h"
> #include "TTree.h"
> #include "TRandom.h"
> #include "TSystem.h"
>
> //
> // Fabriquer un arbre de Events
> //
> void treeprod()
> {
>
> TMapFile *fi = TMapFile::Create("treeprod.map","RECREATE",1000000,
> "Memory mapped TTree");
>
> TTree *mt=new TTree("Arbre","Arbre d'Event");
> mt->SetDirectory(0);
> fi->Add(mt, "Arbre");
>
> int mult;
> mt->Branch("mult",&mult,"mult/I");
>
> mt->Print();
> fi->Print();
>
> int i=0;
>
> while(1){
> mult = gRandom->Integer(50);
> mt->Fill();
> i++;
> cout << i << "th event... Mult=" << mult << endl;
> fi->Update();
> gSystem->Sleep(1000);
> }
> }
>
> -----------------------------------------------------------------------
> #ifndef __CINT__
> #include <cstdio>
> #include <Riostream.h>
> #include <fstream>
> #endif
>
> #include "TMapFile.h"
> #include "TTree.h"
> #include "TSystem.h"
> #include "TCanvas.h"
>
> void treecons()
> {
> TMapFile *fi = TMapFile::Create("treeprod.map");
>
> int old_entries = 0;
> int mult;
> TTree* arbmap = 0;
> while(1){
>
> arbmap = (TTree*)fi->Get("Arbre", arbmap);
>
> if(arbmap->GetEntries() > old_entries){
> old_entries = arbmap->GetEntries();
> cout << "Got new event: event number " << old_entries;
> arbmap->SetBranchAddress("mult",&mult);
> arbmap->GetEntry(old_entries);
> cout << " + Mult=" << mult<<endl;
> arbmap->Draw("mult");
> gPad->Modified();
> gPad->Update();
> }
> if(gSystem->ProcessEvents()) break;
> }
>
> }
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET