CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CommonTools/Utils/interface/TFileDirectory.h

Go to the documentation of this file.
00001 #ifndef Utils_TFileDirectory_h
00002 #define Utils_TFileDirectory_h
00003 /* \class TFileDirectory
00004  *
00005  * \author Luca Lista, INFN
00006  *
00007  */
00008 #include <string>
00009 #include "FWCore/Utilities/interface/Exception.h"
00010 #include "CommonTools/Utils/interface/TH1AddDirectorySentry.h"
00011 #include "TFile.h"
00012 #include "TDirectory.h"
00013 #include "TClass.h"
00014 #include "TH1.h"
00015 
00016 namespace fwlite {
00017    class TFileService;
00018 }
00019 
00020 class TFileService;
00021 class TFile;
00022 class TDirectory; 
00023 
00024 class TFileDirectory {
00025    public:
00027       virtual ~TFileDirectory() { }
00028 
00029       // cd()s to requested directory and returns true (if it is not
00030       // able to cd, it throws exception).
00031       bool cd () const;
00032 
00033       // returns a TDirectory pointer
00034       TDirectory *getBareDirectory (const std::string &subdir = "") const;
00035       
00036       // reutrns a "T" pointer matched to objname
00037       template< typename T > T* getObject (const std::string &objname,
00038                                            const std::string &subdir = "")
00039       {
00040          TObject *objPtr = _getObj (objname, subdir);
00041          // Ok, we've got it.  Let's see if it's a histogram
00042          T * retval = dynamic_cast< T* > ( objPtr );
00043          if ( ! retval )
00044          {
00045             // object isn't a of class T
00046             throw
00047                cms::Exception ("ObjectNotCorrectlyTyped")
00048                << "Object named " << objname << " is not of correct type";
00049          }
00050          return retval;
00051       }
00052 
00054       template<typename T>
00055       T * make() const {
00056          TDirectory *d = _cd();
00057          T* t = new T();
00058          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00059          if (func) { TH1AddDirectorySentry sentry; func(t,d); } 
00060          else { d->Append(t); }
00061          return t;
00062       }
00064       template<typename T, typename Arg1>
00065       T * make( const Arg1 & a1 ) const {
00066          TDirectory *d = _cd();
00067          T * t = new T( a1 );
00068          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00069          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00070          else { d->Append(t); }
00071          return t; 
00072       }
00074       template<typename T, typename Arg1, typename Arg2>
00075       T * make( const Arg1 & a1, const Arg2 & a2 ) const {
00076          TDirectory *d = _cd();
00077          T * t =  new T( a1, a2 );
00078          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00079          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00080          else { d->Append(t); }
00081          return t;
00082       }
00084       template<typename T, typename Arg1, typename Arg2, typename Arg3>
00085       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3 ) const {
00086          TDirectory *d = _cd();
00087          T * t =  new T( a1, a2, a3 );
00088          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00089          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00090          else { d->Append(t); }
00091          return t;
00092       }
00094       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4>
00095       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4 ) const {
00096          TDirectory *d = _cd();
00097          T * t =  new T( a1, a2, a3, a4 );
00098          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00099          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00100          else { d->Append(t); }
00101          return t;
00102       }
00104       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00105                typename Arg5>
00106       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00107                 const Arg5 & a5 ) const {
00108          TDirectory *d = _cd();
00109          T * t =  new T( a1, a2, a3, a4, a5 );
00110          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00111          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00112          else { d->Append(t); }
00113          return t;
00114       }
00116       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00117                typename Arg5, typename Arg6>
00118       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00119                 const Arg5 & a5, const Arg6 & a6 ) const {
00120          TDirectory *d = _cd();
00121          T * t =  new T( a1, a2, a3, a4, a5, a6 );
00122          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00123          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00124          else { d->Append(t); }
00125          return t;
00126       }
00128       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00129                typename Arg5, typename Arg6, typename Arg7>
00130       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00131                 const Arg5 & a5, const Arg6 & a6, const Arg7 & a7 ) const {
00132          TDirectory *d = _cd();
00133          T * t =  new T( a1, a2, a3, a4, a5, a6, a7 );
00134          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00135          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00136          else { d->Append(t); }
00137          return t;
00138       }
00140       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00141                typename Arg5, typename Arg6, typename Arg7, typename Arg8>
00142       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00143                 const Arg5 & a5, const Arg6 & a6, const Arg7 & a7, const Arg8 & a8 ) const {
00144          TDirectory *d = _cd();
00145          T * t =  new T( a1, a2, a3, a4, a5, a6, a7, a8 );
00146          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00147          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00148          else { d->Append(t); }
00149          return t;
00150       }
00152       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00153                typename Arg5, typename Arg6, typename Arg7, typename Arg8, 
00154                typename Arg9>
00155       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00156                 const Arg5 & a5, const Arg6 & a6, const Arg7 & a7, const Arg8 & a8,
00157                 const Arg9 & a9 ) const {
00158          TDirectory *d = _cd();
00159          T * t =  new T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
00160          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00161          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00162          else { d->Append(t); }
00163          return t;
00164       }
00166       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00167                typename Arg5, typename Arg6, typename Arg7, typename Arg8, 
00168                typename Arg9, typename Arg10>
00169       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00170                 const Arg5 & a5, const Arg6 & a6, const Arg7 & a7, const Arg8 & a8,
00171                 const Arg9 & a9, const Arg10 & a10 ) const {
00172          TDirectory *d = _cd(); 
00173          T * t =  new T( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 );
00174          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00175          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00176          else { d->Append(t); }
00177          return t;
00178       }
00180       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00181                typename Arg5, typename Arg6, typename Arg7, typename Arg8, 
00182                typename Arg9, typename Arg10, typename Arg11>
00183       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00184                 const Arg5 & a5, const Arg6 & a6, const Arg7 & a7, const Arg8 & a8,
00185                 const Arg9 & a9, const Arg10 & a10, const Arg11 & a11 ) const {
00186          TDirectory *d = _cd();
00187          T * t =  new T( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 );
00188          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00189          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00190          else { d->Append(t); }
00191          return t;
00192       }
00194       template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, 
00195                typename Arg5, typename Arg6, typename Arg7, typename Arg8, 
00196                typename Arg9, typename Arg10, typename Arg11, typename Arg12>
00197       T * make( const Arg1 & a1, const Arg2 & a2, const Arg3 & a3, const Arg4 & a4, 
00198                 const Arg5 & a5, const Arg6 & a6, const Arg7 & a7, const Arg8 & a8,
00199                 const Arg9 & a9, const Arg10 & a10, const Arg11 & a11, const Arg12 & a12 ) const {
00200          TDirectory *d = _cd();
00201          T * t =  new T( a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 );
00202          ROOT::DirAutoAdd_t func = T::Class()->GetDirectoryAutoAdd();
00203          if (func) { TH1AddDirectorySentry sentry; func(t,d); }
00204          else { d->Append(t); }
00205          return t;
00206       }
00208       TFileDirectory mkdir( const std::string & dir, const std::string & descr = "" );
00210       std::string fullPath() const;
00211 
00212    private:
00213       
00214       TObject* _getObj (const std::string &objname, 
00215                         const std::string &subdir = "") const;
00216 
00217       TDirectory* _cd (const std::string &subdir = "",
00218                        bool createNeededDirectories = true) const;
00219 
00220       // it's completely insane that this needs to be const since
00221       // 'mkdir' clearly changes things, but that's the way the cookie
00222       // crumbles...
00223       TDirectory* _mkdir (TDirectory *dirPtr,
00224                           const std::string &dir, 
00225                           const std::string &description) const;
00226 
00227       TFileDirectory( const std::string & dir, const std::string & descr,
00228                       TFile * file, const std::string & path ) : 
00229          file_( file ), dir_( dir ), descr_( descr ), path_( path ) {
00230       }
00231       friend class TFileService;
00232       friend class fwlite::TFileService;
00233       TFile * file_;
00234       std::string dir_, descr_, path_;
00235 };
00236 
00237 #endif