RE: [ROOT] writing ntuple to root file

From: Ed Oltman (eoltman@imago.com)
Date: Mon Jul 01 2002 - 17:34:05 MEST


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