00001 #ifndef Utils_TFileDirectory_h
00002 #define Utils_TFileDirectory_h
00003
00004
00005
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
00030
00031 bool cd () const;
00032
00033
00034 TDirectory *getBareDirectory (const std::string &subdir = "") const;
00035
00036
00037 template< typename T > T* getObject (const std::string &objname,
00038 const std::string &subdir = "")
00039 {
00040 TObject *objPtr = _getObj (objname, subdir);
00041
00042 T * retval = dynamic_cast< T* > ( objPtr );
00043 if ( ! retval )
00044 {
00045
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
00221
00222
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