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