Hi Ed, This was a problem in TTree::CloneTree that ignored the case SetDirectory(0) when set in the original tree. The problem had already been fixed in version 3.03 Rene Brun On Mon, 1 Jul 2002, Ed Oltman wrote: > Rene, > Here is a complete(ly contrived) test example that displays the error > messages from my previous post. hsimple is from the tutorials. Note: I > call pOut->SetDirectory(0) for 2 reasons: (1)to force the ntuple to be > memory resident - my app generates ntuples that hundreds of MB and > performance is much better if ntuple is memory resident, and (2)when pOut > reaches a certian size, it tries to write it to the current directory which > is opened for read access only. > > { > TFile *f = new TFile("hsimple.root"); > TNtuple *pIn = (TNtuple *)f->Get("ntuple"); > TNtuple *pOut = new TNtuple("pOut","test","a:b:x"); > pOut->SetDirectory(0); > for(int i=0;i<pIn->GetEntries();i++) > { > pIn->GetEntry(i); > Float_t *p = pIn->GetArgs(); > Float_t a = p[0]*p[1]; > Float_t b = p[1]*p[2]; > Float_t c = p[2]*p[3]; > pOut->Fill(a,b,c); > } > > // In my application, following gets called only after I've examined > // pOut and decided I want to save it. > > TDirectory *pSave = gDirectory; > gDirectory->pwd(); > TFile *pF = new TFile("fft0600_0600.root","RECREATE"); > gDirectory->pwd(); > TNtuple *pClone = (TNtuple *)pOut->CloneTree(); > pClone->Write(); > pF->Close(); > delete pF; > gDirectory = pSave; > gDirectory->pwd(); > } > > > I am running root v3.02/07 on Windows 2k. Thank you for your attention. > > Ed > > > > > Ed, > > > > I do not understand this problem. Coiuld you send me a complete > > test example? > > > > Rene Brun > > > > On Fri, 28 Jun 2002, Ed Oltman wrote: > > > > > Hello, > > > > > > I am getting some Error messages when I write an TNtuple to a > > root file that > > > I > > > don't understand. The good news is that the write operation works. > > > However, I suspect that I am missing something important here. > > > > > > Here is what I do: > > > > > > TFile *f = new TFile("c:\\root\\ap.root"); > > > TNtuple *pIn = (TNtuple *)f->Get("pntup"); > > > . > > > . > > > . > > > TNtuple *pOut = new TNtuple("pOut","x:y:z:a"); > > > pOut->SetDirectroy(0); // keep ntuple "memory resident" > > > . > > > use pIn data to populate pOut ntuple > > > . > > > > > > At some point, I decide to save pOut. This is what I do: > > > > > > TDirectory *pSave = gDirectory; > > > gDirectory->pwd(); > > > TFile *pF = new TFile("fft0600_0600.root","RECREATE"); > > > gDirectory->pwd(); > > > TNtuple *pClone = (TNtuple *)pOut->CloneTree(); > > > pClone->Write(); > > > pF->Close(); > > > delete pF; > > > gDirectory = pSave; > > > gDirectory->pwd(); > > > > > > and here is the output I get when I execute save-to-file code: > > > > > > c:\root\ap.root:/ > > > fft0600_0600.root:/ > > > Error in <TBranch::Write>: File c:\root\ap.root is not writable > > > Error in <TBranch::Write>: File c:\root\ap.root is not writable > > > Error in <TBranch::Write>: File c:\root\ap.root is not writable > > > Error in <TBranch::Write>: File c:\root\ap.root is not writable > > > c:\root\ap.root:/ > > > > > > It is true that c:\root\ap.root is not writable, but why do I get this > > > error? > > > When I later try to open fft0600_0600.root, I can read the > > ntuple withoug > > > problem. > > > > > > > > > Thanks, > > > > > > Ed Oltman > > > > > > > > > > > > > > > > > > > >
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:58 MET