Re: [ROOT] Questions regarding TDirectory

From: Rene Brun (Rene.Brun@cern.ch)
Date: Sun Jan 06 2002 - 09:54:39 MET


Hi Christian,

On Sun, 6 Jan 2002, cstrato@EUnet.at wrote:

> Dear Rene
> 
> Thank you for the fast reply and especially for the implementation
> of TDirectory::FindObjectAny().
> 
> Please let me comment to your answers of my questions to see if my
> code has some flaws:
> 
> 1, Constructor: As far as I understand "gDirectory->FindObject(name)"
> does only find an object if it is already in memory. So in order to
> check if a directory exists in a TFile stored on disk, I did:
> "key = fDir->GetKey(obj->GetName());"
> If (key != 0) then the directory does exist. Is this correct?
> 
Correct

> 2, RecursiveRemove: What I wanted to do is "fDir->Delete(obj)" in
> order to delete an object permanently from TFile on disk.
> I am not sure if "fDir->Delete(obj-GetName())" does delete the object
> permanently, since "obj-GetName()" does not return the namecycle,
> since the object is in memory?
> How can I delete an object permanently from a TFile on disk, when
> the object is loaded into memory already?

Use TDirectory::Delete. Chhose one of the following options depending
what you want do do:

void TDirectory::Delete(const char *namecycle)
//   namecycle has the format name;cycle
//   namecycle = "" same as namecycle ="T*"
//   name  = * means all
//   cycle = * means all cycles (memory and keys)
//   cycle = "" or cycle = 9999 ==> apply to a memory object
//   When name=* use T* to delete subdirectories also
//
//   To delete one directory, you must specify the directory cycle,
//      eg.  file.Delete("dir1;1");
//
//   examples:
//     foo   : delete object named foo in memory
//     foo*  : delete all objects with a name starting with foo
//     foo;1 : delete cycle 1 of foo on file
//     foo;* : delete all cycles of foo on file and also from memory
//     *;2   : delete all objects on file having the cycle 2
//     *;*   : delete all objects from memory and file
//    T*;*   : delete all objects from memory and file and all
subdirectories

> 
> 5, EncodeNameCycle: I need to get "key = fDir->GetKey(name,cycle);",
> so I have written my own function to extract name and cycle, but I
> thought it would be easier if TObject would already contain this
> possibility.
> 
With the new functions FindKey and FindKeyAny, you do not need to call
EncodeNameCycle. You can do directly, eg:
   mydir->FindKey("blabla;1");

Rene Brun

>
Best regards
> Christian
> 
> 
> Rene Brun wrote:
> 
> > Hi Christian,
> >
> > On Fri, 4 Jan 2002, cstrato@EUnet.at wrote:
> >
> > > Dear Rene;
> > >
> > > When trying to create a complicated directory hierarchy in TFile, I came
> > >
> > > across the following questions:
> > >
> > > 1, Constructor: Sorrowly, mkdir() cannot be used to check if a directory
> > >
> > > exists already, since "Error("TDirectory","Directory %s exists
> > > already",name);"
> > > in the constructor does not set "gDirectoy = 0;". I suppose this is a
> > > feature to allow namecycles, but then I would suggest to change "Error"
> > > to "Warning"?
> > >
> > You can check if name (object or directory) is already in the current dir
> > with gDirectory->FindObject(name).
> >
> > > 2, RecursiveRemove(): Is it ok to call RecursiveRemove(), when I want to
> > >
> > > delete a TObject, or does this have side effects? (I need to pass a
> > > TObject and not a namecycle.)
> >
> > Why do you want to call RecursiveRemove? This function is automatically
> > by the TObject destructor when object->TestBit(kMustCleanup) is true.
> > The kMustCleanup bit is automatically set for objects added to TPad
> > and TFolder. You can set this bit yourself object->SetBit(kMustCleanup)
> > if you want this object to be automatically removed from all containers
> > referencing it when the object is deleted.
> > You can add a container to teh list of containers to be cleaned via
> > gROOT->GetListOfCleanups()->Add(mycollection);
> >
> > >
> > > 3, Write(): Is there a reason why the variable "name" is not used in
> > > method
> > > Write(name = 0,..)? It would be great if I could use dir->Write(MyName)
> > > to
> > > write a single object to TFile.
> >
> > You better use object->Write();
> > or object->Write(name);
> >
> > This will write object into the current directory. By default, if you do
> > not specify a name, the object name is used. If you specify the parameter
> > name, this will be the name of the key.
> >
> > > > 4, FindObjectAny(): How can  I
> > find an object in TFile containing a > complicated
> > > hierarchy of TDirectories? It would be great to have a recursive method
> > > analogous to "TFolder::FindObjectAny()".
> >
> > I will implement FindObjectAny. This was not implemented because in case
> > of a complex directory structure, this call will force reading all
> > directory keys in memory. But, I agree that there are more advantages
> > than disadvantages in implementing FindObjectAny.
> >
> > >
> > > 5, EncodeNameCycle(): Since every TObject can be stored in TFile, would
> > > it
> > > be possible to move the methods Encode/DecodeNameCycle() to TObject?
> >
> > Why do you need this ?
> > See object->Write
> >
> > >
> > > 6, Shortcut/Alias: A nice feature of TFolder is that one folder can be
> > > added to different folders. It would be great if this could also be done
> > >
> > > with TDirectory, e.g. as shortcut or alias as known from other file
> > > systems.
> > > Sorrowly, creating a reference TRef does not help, since TBrowser is not
> > >
> > > able to recognize it as alias to TDirectory.
> >
> > Unix-like links are not implemented in TDirectory. This could be added
> > to the current TKey or a new class TKeyLink implemented.
> >
> > Rene Brun.
> >
> > >
> > > Thank you for your help.
> > >
> > > Best regards
> > > Christian
> > > ----------------------------------
> > > C.h.r.i.s.t.i.a.n  S.t.r.a.t.o.w.a
> > > V.i.e.n.n.a,  A.u.s.t.r.i.a
> > >
> > >
> > >
> 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:37 MET