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