# TKey* ``` Book space in a file, create I/O buffers, to fill them, (un)compress them. The TKey class includes functions to book space in a file, to create I/O buffers, to fill these buffers, to compress/uncompress data buffers. Before saving (making persistent) an object in a file, a key must be created. The key structure contains all the information to uniquely identify a persistent object in a file. | Data Member | Explanation | |-------------|-------------| | fNbytes | Number of bytes for the compressed object and key. | | fObjlen | Length of uncompressed object. | | fDatime | Date/Time when the object was written. | | fKeylen | Number of bytes for the key structure. | | fCycle | Cycle number of the object. | | fSeekKey | Address of the object on file (points to fNbytes). This is a redundant information used to cross-check the data base integrity. | | fSeekPdir | Pointer to the directory supporting this object.| | fClassName | Object class name. | | fName | Name of the object. | | fTitle | Title of the object. | In the 16 highest bits of fSeekPdir is encoded a pid offset. This offset is to be added to the pid index stored in the TRef object and the referenced TObject. The TKey class is used by ROOT to: - Write an object in the current directory - Write a new ntuple buffer The structure of a file is shown in TFile::TFile. The structure of a directory is shown in TDirectoryFile::TDirectoryFile. The TKey class is used by the TBasket class. See also TTree. ``` ```cpp class TKey : public TNamed ``` ## class ```cpp private: enum EStatusBits { kIsDirectoryFile = BIT(14) }; TKey(const TKey&); // TKey objects are not copiable. TKey& operator=(const TKey&); // TKey objects are not copiable. protected: Int_t fVersion; ///< Key version identifier Int_t fNbytes; ///< Number of bytes for the object on file Int_t fObjlen; ///< Length of uncompressed object in bytes TDatime fDatime; ///< Date/Time of insertion in file Short_t fKeylen; ///< Number of bytes for the key itself Short_t fCycle; ///< Cycle number Long64_t fSeekKey; ///< Location of object on file Long64_t fSeekPdir; ///< Location of parent directory on file TString fClassName; ///< Object Class name Int_t fLeft; ///< Number of bytes left in current segment char *fBuffer; ///< Object buffer TBuffer *fBufferRef; ///< Pointer to the TBuffer object UShort_t fPidOffset; ///ReadObj(); /// #### Example2: Usual case (recommended unless performance is critical) /// MyClass *obj = dynamic_cast(key->ReadObj()); /// which support also the more complex inheritance like: /// class MyClass : public AnotherClass, public TObject /// Of course, dynamic_cast<> can also be used in the example 1. virtual TObject *ReadObjWithBuffer(char *bufferRead); /// To read a TObject* from bufferRead. /// This function is identical to TKey::ReadObj, but it reads directly from /// bufferRead instead of reading from a file. /// The object associated to this key is read from the buffer into memory /// Using the class identifier we find the TClass object for this class. /// A TClass object contains a full description (i.e. dictionary) of the /// associated class. In particular the TClass object can create a new /// object of the class type it describes. This new object now calls its /// Streamer function to rebuilt itself. /// ### Note /// This function is called only internally by ROOT classes. /// Although being public it is not supposed to be used outside ROOT. /// If used, you must make sure that the bufferRead is large enough to /// accomodate the object being read. /// To read an object (non deriving from TObject) from the file. /// This is more user friendly version of TKey::ReadObjectAny. /// See TKey::ReadObjectAny for more details. template T *ReadObject() { return reinterpret_cast(ReadObjectAny(TClass::GetClass(typeid(T)))); } virtual void *ReadObjectAny(const TClass *expectedClass); /// To read an object (non deriving from TObject) from the file. /// If expectedClass is not null, we checked that that actual class of the /// object stored is suitable to be stored in a pointer pointing to an object /// of class 'expectedClass'. We also adjust the value of the returned address /// so that it is suitable to be cast (C-Style) /// a pointer pointing to an object of class 'expectedClass'. /// So for example if the class Bottom inherits from Top and the object /// stored is of type Bottom you can safely do: /// ~~~{.cpp} /// auto TopClass = TClass::GetClass("Top"); /// auto ptr = (Top*) key->ReadObjectAny( TopClass ); /// if (ptr==0) printError("the object stored in the key is not of the expected type\n"); /// ~~~ /// The object associated to this key is read from the file into memory. /// Once the key structure is read (via Streamer) the class identifier /// of the object is known. /// Using the class identifier we find the TClass object for this class. /// A TClass object contains a full description (i.e. dictionary) of the /// associated class. In particular the TClass object can create a new /// object of the class type it describes. This new object now calls its /// Streamer function to rebuilt itself. virtual void ReadBuffer(char *&buffer); /// Decode input buffer. /// In some situation will add key to gDirectory. void ReadKeyBuffer(char *&buffer);/// Decode input buffer. virtual Bool_t ReadFile();/// Read the key structure from the file virtual void SetBuffer() { fBuffer = new char[fNbytes];} virtual void SetParent(const TObject *parent);/// Set parent in key buffer. void SetMotherDir(TDirectory* dir) { fMotherDir = dir; } virtual Int_t Sizeof() const; /// Return the size in bytes of the key header structure. /// An explaination about the nbytes (Int_t nbytes) variable used in the /// function. The size of fSeekKey and fSeekPdir is 8 instead of 4 if version is /// greater than 1000. /// | Component | Sizeof | /// |-------------------|--------| /// | fNbytes | 4 | /// | sizeof(Version_t) | 2 | /// | fObjlen | 4 | /// | fKeylen | 2 | /// | fCycle | 2 | /// | fSeekKey | 4 or 8 | /// | fSeekPdir | 4 or 8 | /// | **TOTAL** | 22 | virtual Int_t WriteFile(Int_t cycle=1, TFile* f = 0); /// Write the encoded object supported by this key. /// The function returns the number of bytes committed to the file. /// If a write error occurs, the number of bytes returned is -1. ```