00001
00002 #define ROOTHISTCNV_RFILECNV_CPP
00003
00004
00005 #include "GaudiKernel/CnvFactory.h"
00006 #include "GaudiKernel/IOpaqueAddress.h"
00007 #include "GaudiKernel/IRegistry.h"
00008 #include "GaudiKernel/MsgStream.h"
00009
00010 #include "TROOT.h"
00011 #include "RFileCnv.h"
00012 #include "TFile.h"
00013
00014
00015
00016 DECLARE_NAMESPACE_CONVERTER_FACTORY(RootHistCnv,RFileCnv)
00017
00018
00019 StatusCode RootHistCnv::RFileCnv::createObj(IOpaqueAddress* pAddress,
00020 DataObject*& refpObject)
00021
00022 {
00023 MsgStream log(msgSvc(), "RFileCnv");
00024 unsigned long* ipar = (unsigned long*)pAddress->ipar();
00025 char mode[2] = { char(ipar[1]), 0 };
00026
00027 std::string fname = pAddress->par()[0];
00028 std::string ooname = pAddress->par()[1];
00029
00030 const std::string* spar = pAddress->par();
00031
00032 std::string oname = spar[1].substr(spar[1].find("/",1)+1, spar[1].length());
00033
00034
00035 if ( 0 == gROOT ) {
00036 static TROOT root("root","ROOT I/O");
00037
00038 } else {
00039 log << MSG::VERBOSE << "ROOT already initialized, debug = "
00040 << gDebug<< endreq;
00041 }
00042
00043
00044
00045
00046 if ( mode[0] == 'O' ) {
00047
00048 if (findTFile(ooname,rfile).isFailure()) {
00049
00050 log << MSG::INFO << "opening Root file \"" << fname << "\" for reading"
00051 << endreq;
00052
00053 rfile = TFile::Open(fname.c_str(),"READ");
00054 if ( rfile != 0 && rfile->IsOpen() ) {
00055 regTFile(ooname,rfile).ignore();
00056
00057 ipar[0] = (unsigned long)rfile;
00058 NTuple::File* pFile = new NTuple::File(objType(), fname, oname);
00059 pFile->setOpen(true);
00060 refpObject = pFile;
00061
00062 return StatusCode::SUCCESS;
00063
00064 } else {
00065 log << MSG::ERROR << "Couldn't open \"" << fname << "\" for reading"
00066 << endreq;
00067 return StatusCode::FAILURE;
00068 }
00069
00070 } else {
00071 log << MSG::DEBUG << "Root file \"" << fname << "\" already opened"
00072 << endreq;
00073 return StatusCode::SUCCESS;
00074 }
00075
00076
00077 } else if ( mode[0] == 'U' ) {
00078 log << MSG::INFO << "opening Root file \"" << fname << "\" for updating"
00079 << endreq;
00080
00081 log << MSG::ERROR << "don't know how to do this yet. Aborting." << endreq;
00082 exit(1);
00083
00084
00085 } else if ( mode[0] == 'N' ) {
00086 log << MSG::INFO << "opening Root file \"" << fname << "\" for writing"
00087 << endreq;
00088
00089
00090 rfile = TFile::Open(fname.c_str(),"RECREATE","Gaudi Trees");
00091 if (! rfile->IsOpen() ) {
00092 log << MSG::ERROR << "Could not open file " << fname << " for writing"
00093 << endreq;
00094 return StatusCode::FAILURE;
00095 }
00096
00097 regTFile(ooname,rfile).ignore();
00098
00099 log << MSG::DEBUG << "creating ROOT file " << fname << endreq;
00100
00101 ipar[0] = (unsigned long)rfile;
00102 NTuple::File* pFile = new NTuple::File(objType(), fname, oname);
00103 pFile->setOpen(true);
00104 refpObject = pFile;
00105 return StatusCode::SUCCESS;
00106
00107 } else {
00108
00109 log << MSG::ERROR << "Uknown mode to access ROOT file" << endreq;
00110 return StatusCode::FAILURE;
00111
00112 }
00113
00114 return StatusCode::FAILURE;
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 }
00129
00130
00131
00132 StatusCode RootHistCnv::RFileCnv::createRep( DataObject* pObject,
00133 IOpaqueAddress*& refpAddress )
00134
00135 {
00136 refpAddress = pObject->registry()->address();
00137 return RFileCnv::updateRep( refpAddress, pObject );
00138 }
00139
00140
00141 StatusCode RootHistCnv::RFileCnv::updateRep( IOpaqueAddress* pAddress,
00142 DataObject* pObject )
00143
00144 {
00145 MsgStream log(msgSvc(), "RFileCnv");
00146 std::string ooname = pAddress->par()[1];
00147
00148 NTuple::File* pFile = dynamic_cast<NTuple::File*>(pObject);
00149 if ( pFile != 0 && pFile->isOpen() ) {
00150
00151 unsigned long* ipar = (unsigned long*)pAddress->ipar();
00152 if (findTFile(ooname,rfile).isFailure()) {
00153 log << MSG::ERROR << "Problems closing TFile " << ooname << endreq;
00154 return StatusCode::FAILURE;
00155 }
00156
00157 rfile->Write(0,TObject::kOverwrite);
00158 if ( log.level() <= MSG::INFO ) {
00159 log << MSG::INFO << "dumping contents of " << ooname << endreq;
00160 rfile->Print();
00161 }
00162 rfile->Close();
00163 delete rfile;
00164
00165 ipar[0] = 0;
00166 pFile->setOpen(false);
00167 return StatusCode::SUCCESS;
00168
00169 } else {
00170 log << MSG::ERROR << "TFile " << ooname << " is not open" << endreq;
00171 }
00172 return StatusCode::FAILURE;
00173 }
00174
00175
00176 RootHistCnv::RFileCnv::~RFileCnv()
00177
00178 {
00179 }