|
Gaudi Framework, version v21r8 |
| Home | Generated: 17 Mar 2010 |
#include <THistSvc.h>


Definition at line 26 of file THistSvc.h.
typedef std::map<std::string, THistID> THistSvc::uidMap [private] |
Definition at line 114 of file THistSvc.h.
typedef std::multimap<std::string, THistID> THistSvc::idMap [private] |
Definition at line 115 of file THistSvc.h.
typedef std::map<TObject*, THistID> THistSvc::objMap [private] |
Definition at line 116 of file THistSvc.h.
typedef std::multimap<std::string, std::string> THistSvc::streamMap [private] |
Definition at line 117 of file THistSvc.h.
enum THistSvc::Mode [private] |
| THistSvc::THistSvc | ( | const std::string & | name, | |
| ISvcLocator * | svc | |||
| ) |
Definition at line 40 of file THistSvc.cpp.
00041 : base_class(name, svc), m_log(msgSvc(), name ), signaledStop(false) { 00042 00043 declareProperty ("Output", m_outputfile ); 00044 declareProperty ("Input", m_inputfile ); 00045 declareProperty ("AutoSave", m_autoSave=0 ); 00046 declareProperty ("PrintAll", m_print=false); 00047 declareProperty ("CompressionLevel", m_compressionLevel=1 ); 00048 declareProperty ("MaxFileSize", m_maxFileSize=5120, 00049 "maximum file size in MB. if exceeded, will cause an abort"); 00050 00051 m_inputfile.declareUpdateHandler ( &THistSvc::setupInputFile, this ); 00052 m_outputfile.declareUpdateHandler( &THistSvc::setupOutputFile, this ); 00053 }
| THistSvc::~THistSvc | ( | ) | [protected, virtual] |
| StatusCode THistSvc::initialize | ( | ) | [virtual] |
Reimplemented from Service.
Definition at line 64 of file THistSvc.cpp.
00064 { 00065 GlobalDirectoryRestore restore; 00066 00067 m_alreadyConnectedOutFiles.clear(); 00068 m_alreadyConnectedInFiles.clear(); 00069 00070 StatusCode status = Service::initialize(); 00071 m_log.setLevel( m_outputLevel.value() ); 00072 00073 if (status.isFailure()) { 00074 MsgStream log ( msgSvc(), name() ); 00075 log << MSG::ERROR << "initializing service" << endmsg; 00076 return status; 00077 } 00078 00079 vector<string>::const_iterator itr; 00080 StatusCode st(StatusCode::SUCCESS); 00081 00082 try { 00083 setupOutputFile( m_outputfile ); 00084 } catch ( GaudiException& err ) { 00085 m_log << MSG::ERROR 00086 << "Caught: " << err << endmsg; 00087 st = StatusCode::FAILURE; 00088 } 00089 00090 try { 00091 setupInputFile( m_inputfile ); 00092 } catch ( GaudiException& err ) { 00093 m_log << MSG::ERROR 00094 << "Caught: " << err << endmsg; 00095 st = StatusCode::FAILURE; 00096 } 00097 00098 // Protect against multiple instances of TROOT 00099 if ( 0 == gROOT ) { 00100 static TROOT root("root","ROOT I/O"); 00101 // gDebug = 99; 00102 } else { 00103 m_log << MSG::VERBOSE << "ROOT already initialized, debug = " 00104 << gDebug<< endmsg; 00105 } 00106 00107 IIncidentSvc* p_incSvc(0); 00108 00109 if (service("IncidentSvc", p_incSvc, true).isFailure()) { 00110 m_log << MSG::ERROR << "unable to get the IncidentSvc" << endmsg; 00111 st = StatusCode::FAILURE; 00112 } else { 00113 p_incSvc->addListener( this, "EndEvent", 100, true); 00114 } 00115 00116 if (st.isFailure()) { 00117 m_log << MSG::FATAL << "Unable to initialize THistSvc" << endmsg; 00118 } 00119 00120 return st; 00121 00122 }
| StatusCode THistSvc::reinitialize | ( | ) | [virtual] |
Reimplemented from Service.
Definition at line 127 of file THistSvc.cpp.
00127 { 00128 00129 GlobalDirectoryRestore restore; 00130 00131 m_log << MSG::WARNING << "reinitialize not implemented" << endmsg; 00132 00133 00134 return StatusCode::SUCCESS; 00135 00136 }
| StatusCode THistSvc::finalize | ( | void | ) | [virtual] |
Reimplemented from Service.
Definition at line 141 of file THistSvc.cpp.
00141 { 00142 00143 GlobalDirectoryRestore restore; 00144 00145 m_log << MSG::DEBUG << "THistSvc::finalize" << endmsg; 00146 00147 uidMap::const_iterator uitr; 00148 for (uitr=m_uids.begin(); uitr != m_uids.end(); ++uitr) { 00149 00150 TObject* to = uitr->second.obj; 00151 00152 string dirname("none"); 00153 if (to->IsA()->InheritsFrom("TTree")) { 00154 TTree* tr = dynamic_cast<TTree*>(to); 00155 if (tr->GetDirectory() != 0) { 00156 dirname = tr->GetDirectory()->GetPath(); 00157 } 00158 } else if (to->IsA()->InheritsFrom("TGraph")) { 00159 if (!uitr->second.temp) { 00160 dirname = uitr->second.file->GetPath(); 00161 string id2(uitr->second.id); 00162 id2.erase(0,id2.find("/",1)); 00163 id2.erase(id2.rfind("/"), id2.length()); 00164 if (id2.find("/") == 0) { 00165 id2.erase(0,1); 00166 } 00167 dirname += id2; 00168 } else { 00169 dirname = "/tmp"; 00170 } 00171 } else if (to->IsA()->InheritsFrom("TH1")) { 00172 TH1* th = dynamic_cast<TH1*>(to); 00173 if (th == 0) { 00174 m_log << MSG::ERROR << "Couldn't dcast: " << uitr->first << endmsg; 00175 } else { 00176 if (th->GetDirectory() != 0) { 00177 dirname = th->GetDirectory()->GetPath(); 00178 } 00179 } 00180 } 00181 00182 m_log << MSG::DEBUG << "uid: \"" << uitr->first << "\" temp: " 00183 << uitr->second.temp << " dir: " << dirname 00184 << endmsg; 00185 00186 00187 // if (uitr->second.temp == true) { 00188 // log << MSG::INFO << "Deleting \"" << uitr->first << "\"" << endmsg; 00189 // delete uitr->second.obj; 00190 // } 00191 } 00192 00193 StatusCode sc = write(); 00194 if (sc.isFailure()) { 00195 m_log << MSG::ERROR << "problems writing histograms" << endmsg; 00196 } 00197 00198 if (m_print) { 00199 m_log << MSG::INFO << "Listing contents of ROOT files: " << endmsg; 00200 } 00201 vector<TFile*> deleted_files; 00202 map<string, pair<TFile*,Mode> >::const_iterator itr; 00203 for (itr = m_files.begin(); itr != m_files.end(); ++itr) { 00204 00205 if (find(deleted_files.begin(), deleted_files.end(), itr->second.first) == 00206 deleted_files.end()) { 00207 deleted_files.push_back(itr->second.first); 00208 00209 m_log << MSG::DEBUG << "finalizing stream/file " << itr->first << ":" 00210 << itr->second.first->GetName() 00211 << endmsg; 00212 } else { 00213 m_log << MSG::DEBUG << "already finalized stream " << itr->first << endmsg; 00214 continue; 00215 } 00216 00217 00218 if (m_print && m_log.level() <= MSG::INFO) { 00219 00220 m_log << MSG::INFO; 00221 m_log << "==> File: " << itr->second.first->GetName() 00222 << " stream: " << itr->first << endmsg; 00223 00224 itr->second.first->Print("base"); 00225 } 00226 00227 string tmpfn=itr->second.first->GetName(); 00228 00229 itr->second.first->Close(); 00230 00231 if (itr->second.second==SHARE) { 00232 TFile *outputfile; 00233 //Merge File 00234 try { 00235 m_log << MSG::DEBUG << "Opening Final Output File: " <<m_sharedFiles[itr->first].c_str()<<endmsg; 00236 outputfile = new TFile(m_sharedFiles[itr->first].c_str(), "UPDATE"); 00237 } catch (const std::exception& Exception) { 00238 m_log << MSG::ERROR << "exception caught while trying to open root" 00239 << " file for appending: " << Exception.what() << std::endl 00240 << " -> file probably corrupt." << endmsg; 00241 return StatusCode::FAILURE; 00242 } catch (...) { 00243 m_log << MSG::ERROR << "Problems opening output file \"" << m_sharedFiles[itr->first] 00244 << "\" for append: probably corrupt" << endmsg; 00245 return StatusCode::FAILURE; 00246 } 00247 00248 m_log << MSG::DEBUG << "THistSvc::write()::Merging Rootfile "<<endmsg; 00249 TFile *inputfile; 00250 try { 00251 m_log << MSG::DEBUG << "Openning again Temporary File: " <<tmpfn.c_str()<<endmsg; 00252 inputfile=new TFile(tmpfn.c_str(),"READ"); 00253 } catch (const std::exception& Exception) { 00254 m_log << MSG::ERROR << "exception caught while trying to open root" 00255 << " file for appending: " << Exception.what() << std::endl 00256 << " -> file probably corrupt." << endmsg; 00257 return StatusCode::FAILURE; 00258 } catch (...) { 00259 m_log << MSG::ERROR << "Problems opening output file \"" 00260 << tmpfn.c_str() 00261 << "\" for append: probably corrupt" << endmsg; 00262 return StatusCode::FAILURE; 00263 } 00264 00265 MergeRootFile(outputfile, inputfile); 00266 00267 outputfile->SetCompressionLevel( m_compressionLevel ); 00268 00269 outputfile->Write(); 00270 outputfile->Close(); 00271 inputfile->Close(); 00272 00273 m_log << MSG::DEBUG << "Trying to remove temporary file \"" << tmpfn 00274 << "\""<<endmsg; 00275 00276 std::remove(tmpfn.c_str()); 00277 } 00278 delete itr->second.first; 00279 } 00280 00281 m_sharedFiles.clear(); 00282 m_fileStreams.clear(); 00283 m_files.clear(); 00284 m_uids.clear(); 00285 m_ids.clear(); 00286 m_tobjs.clear(); 00287 00288 return Service::finalize(); 00289 }
| StatusCode THistSvc::regHist | ( | const std::string & | name | ) | [virtual] |
| StatusCode THistSvc::regHist | ( | const std::string & | name, | |
| TH1 * | hist | |||
| ) | [virtual] |
| StatusCode THistSvc::regHist | ( | const std::string & | name, | |
| TH2 * | hist | |||
| ) | [virtual] |
| StatusCode THistSvc::regHist | ( | const std::string & | name, | |
| TH3 * | hist | |||
| ) | [virtual] |
| StatusCode THistSvc::getHist | ( | const std::string & | name, | |
| TH1 *& | hist | |||
| ) | const [virtual] |
| StatusCode THistSvc::getHist | ( | const std::string & | name, | |
| TH2 *& | hist | |||
| ) | const [virtual] |
| StatusCode THistSvc::getHist | ( | const std::string & | name, | |
| TH3 *& | hist | |||
| ) | const [virtual] |
| StatusCode THistSvc::regTree | ( | const std::string & | name | ) | [virtual] |
| StatusCode THistSvc::regTree | ( | const std::string & | name, | |
| TTree * | hist | |||
| ) | [virtual] |
Definition at line 551 of file THistSvc.cpp.
00551 { 00552 StatusCode sc = regHist_i(hist, id); 00553 if (hist != 0 && m_autoSave != 0 && sc.isSuccess()) { 00554 hist->SetAutoSave(m_autoSave); 00555 } 00556 return sc; 00557 }
| StatusCode THistSvc::getTree | ( | const std::string & | name, | |
| TTree *& | hist | |||
| ) | const [virtual] |
| StatusCode THistSvc::regGraph | ( | const std::string & | name | ) | [virtual] |
| StatusCode THistSvc::regGraph | ( | const std::string & | name, | |
| TGraph * | hist | |||
| ) | [virtual] |
Definition at line 570 of file THistSvc.cpp.
00570 { 00571 if ( strcmp(hist->GetName(),"Graph") == 0 ) { 00572 00573 std::string id2(id); 00574 string::size_type i = id2.rfind("/"); 00575 if (i != string::npos) { 00576 id2.erase(0,i+1); 00577 } 00578 00579 m_log << MSG::INFO << "setting name of TGraph id: \"" << id << "\" to \"" 00580 << id2 << "\" since it is unset" << endmsg; 00581 hist->SetName(id2.c_str()); 00582 } 00583 00584 return regHist_i(hist, id); 00585 }
| StatusCode THistSvc::getGraph | ( | const std::string & | name, | |
| TGraph *& | hist | |||
| ) | const [virtual] |
| StatusCode THistSvc::deReg | ( | TObject * | obj | ) | [virtual] |
Definition at line 437 of file THistSvc.cpp.
00437 { 00438 00439 objMap::iterator itr = m_tobjs.find(obj); 00440 if (itr != m_tobjs.end()) { 00441 THistID hid = itr->second; 00442 00443 uidMap::iterator itr2 = m_uids.find(hid.id); 00444 if (itr2 == m_uids.end()) { 00445 m_log << MSG::ERROR << "Problems deregistering TObject \"" 00446 << obj->GetName() 00447 << "\" with id \"" << hid.id << "\"" << endmsg; 00448 return StatusCode::FAILURE; 00449 } 00450 00451 std::string id,root,rem; 00452 parseString(hid.id, root, rem); 00453 00454 idMap::iterator itr3; 00455 bool found(false); 00456 00457 std::pair<idMap::iterator, idMap::iterator> mitr = m_ids.equal_range(rem); 00458 if (mitr.first == mitr.second) { 00459 m_log << MSG::ERROR << "Problems deregistering TObject \"" 00460 << obj->GetName() 00461 << "\" with id \"" << hid.id << "\"" << endmsg; 00462 return StatusCode::FAILURE; 00463 } else { 00464 for (itr3 = mitr.first; itr3 != mitr.second; ++itr3) { 00465 if (itr3->second.obj == obj) { 00466 found = true; 00467 break; 00468 } 00469 } 00470 if (!found) { 00471 m_log << MSG::ERROR << "Problems deregistering TObject \"" 00472 << obj->GetName() 00473 << "\" with id \"" << hid.id << "\"" << endmsg; 00474 } 00475 } 00476 00477 m_tobjs.erase(itr); 00478 m_uids.erase(itr2); 00479 m_ids.erase(itr3); 00480 00481 return StatusCode::SUCCESS; 00482 00483 } else { 00484 m_log << MSG::ERROR << "Cannot unregister TObject \"" << obj->GetName() 00485 << "\": not known to THistSvc" << endmsg; 00486 return StatusCode::FAILURE; 00487 } 00488 00489 }
| StatusCode THistSvc::deReg | ( | const std::string & | name | ) | [virtual] |
Definition at line 495 of file THistSvc.cpp.
00495 { 00496 00497 uidMap::iterator itr = m_uids.find(id); 00498 if (itr == m_uids.end()) { 00499 m_log << MSG::ERROR << "Problems deregistering id \"" 00500 << id << "\"" << endmsg; 00501 return StatusCode::FAILURE; 00502 } 00503 00504 TObject* obj = itr->second.obj; 00505 00506 return deReg(obj); 00507 }
| std::vector< std::string > THistSvc::getHists | ( | ) | const [virtual] |
Definition at line 611 of file THistSvc.cpp.
00611 { 00612 00613 std::vector<std::string> names; 00614 names.reserve(m_uids.size()); 00615 00616 uidMap::const_iterator itr; 00617 for (itr = m_uids.begin(); itr != m_uids.end(); ++itr) { 00618 THistID tid = itr->second; 00619 00620 if (tid.obj->IsA()->InheritsFrom("TH1")) { 00621 names.push_back(itr->first); 00622 } 00623 00624 } 00625 00626 return names; 00627 00628 }
| std::vector< std::string > THistSvc::getTrees | ( | ) | const [virtual] |
Definition at line 639 of file THistSvc.cpp.
00639 { 00640 00641 std::vector<std::string> names; 00642 names.reserve(m_uids.size()); 00643 00644 uidMap::const_iterator itr; 00645 for (itr = m_uids.begin(); itr != m_uids.end(); ++itr) { 00646 THistID tid = itr->second; 00647 00648 if (tid.obj->IsA()->InheritsFrom("TTree")) { 00649 names.push_back(itr->first); 00650 } 00651 00652 } 00653 00654 return names; 00655 00656 }
| std::vector< std::string > THistSvc::getGraphs | ( | ) | const [virtual] |
Definition at line 667 of file THistSvc.cpp.
00667 { 00668 00669 std::vector<std::string> names; 00670 names.reserve(m_uids.size()); 00671 00672 uidMap::const_iterator itr; 00673 for (itr = m_uids.begin(); itr != m_uids.end(); ++itr) { 00674 THistID tid = itr->second; 00675 00676 if (tid.obj->IsA()->InheritsFrom("TGraph")) { 00677 names.push_back(itr->first); 00678 } 00679 00680 } 00681 00682 return names; 00683 00684 }
| StatusCode THistSvc::getTHists | ( | TDirectory * | td, | |
| TList & | tl | |||
| ) | const [virtual] |
Definition at line 339 of file THistSvc.cpp.
00339 { 00340 00341 GlobalDirectoryRestore restore; 00342 00343 gErrorIgnoreLevel = kBreak; 00344 00345 if (!td->cd()) { 00346 m_log << MSG::ERROR << "No such TDirectory \"" << td->GetPath() << "\"" 00347 << endmsg; 00348 return StatusCode::FAILURE; 00349 } 00350 00351 TIter nextkey(td->GetList()); 00352 while (TObject *key = (TObject*)nextkey()) { 00353 if (key != 0) { 00354 if (key->IsA()->InheritsFrom("TH1")) { tl.Add(key); } 00355 } 00356 } 00357 00358 00359 return StatusCode::SUCCESS; 00360 00361 }
| StatusCode THistSvc::getTHists | ( | const std::string & | name, | |
| TList & | tl | |||
| ) | const [virtual] |
Definition at line 366 of file THistSvc.cpp.
00366 { 00367 00368 GlobalDirectoryRestore restore; 00369 00370 gErrorIgnoreLevel = kBreak; 00371 00372 StatusCode sc; 00373 00374 if (!gDirectory->cd(dir.c_str())) { 00375 m_log << MSG::ERROR << "No such TDirectory \"" << dir << "\"" 00376 << endmsg; 00377 sc = StatusCode::FAILURE; 00378 } else { 00379 sc = getTHists(gDirectory,tl); 00380 } 00381 00382 return sc; 00383 00384 }
| StatusCode THistSvc::getTTrees | ( | TDirectory * | td, | |
| TList & | tl | |||
| ) | const [virtual] |
Definition at line 388 of file THistSvc.cpp.
00388 { 00389 00390 GlobalDirectoryRestore restore; 00391 00392 gErrorIgnoreLevel = kBreak; 00393 00394 if (!td->cd()) { 00395 m_log << MSG::ERROR << "No such TDirectory \"" << td->GetPath() << "\"" 00396 << endmsg; 00397 return StatusCode::FAILURE; 00398 } 00399 00400 TIter nextkey(td->GetList()); 00401 while (TObject *key = (TObject*)nextkey()) { 00402 if (key != 0) { 00403 if (key->IsA()->InheritsFrom("TTree")) { tl.Add(key); } 00404 } 00405 } 00406 00407 return StatusCode::SUCCESS; 00408 00409 }
| StatusCode THistSvc::getTTrees | ( | const std::string & | name, | |
| TList & | tl | |||
| ) | const [virtual] |
Definition at line 414 of file THistSvc.cpp.
00414 { 00415 00416 GlobalDirectoryRestore restore; 00417 00418 gErrorIgnoreLevel = kBreak; 00419 00420 StatusCode sc; 00421 00422 if (!gDirectory->cd(dir.c_str())) { 00423 m_log << MSG::ERROR << "No such TDirectory \"" << dir << "\"" 00424 << endmsg; 00425 sc = StatusCode::FAILURE; 00426 } else { 00427 sc = getTTrees(gDirectory,tl); 00428 } 00429 00430 return sc; 00431 00432 }
| bool THistSvc::exists | ( | const std::string & | name | ) | const [virtual] |
| void THistSvc::handle | ( | const Incident & | ) |
Definition at line 1363 of file THistSvc.cpp.
01363 { 01364 01365 if (signaledStop) return ; 01366 01367 // convert to bytes. 01368 Long64_t mfs = (Long64_t)m_maxFileSize.value() * (Long64_t)1048576; 01369 01370 updateFiles(); 01371 01372 map<string, pair<TFile*,Mode> >::const_iterator itr; 01373 for (itr=m_files.begin(); itr!= m_files.end(); ++itr) { 01374 TFile* tf = itr->second.first; 01375 01376 #ifndef NDEBUG 01377 m_log << MSG::DEBUG << "stream: " << itr->first << " name: " 01378 << tf->GetName() << " size: " << tf->GetSize() 01379 << endmsg; 01380 #endif 01381 01382 // Signal job to terminate if output file is too large 01383 if (tf->GetSize() > mfs) { 01384 01385 signaledStop = true; 01386 01387 m_log << MSG::FATAL << "file \"" << tf->GetName() 01388 << "\" associated with stream \"" << itr->first 01389 << "\" has exceeded the max file size of " 01390 << m_maxFileSize.value() << "MB. Terminating Job." 01391 << endmsg; 01392 01393 IEventProcessor* evt(0); 01394 if (service("ApplicationMgr", evt, true).isSuccess()) { 01395 evt->stopRun(); 01396 evt->release(); 01397 } else { 01398 abort(); 01399 } 01400 } 01401 } 01402 }
| StatusCode THistSvc::regHist_i | ( | T * | hist, | |
| const std::string & | name | |||
| ) | [inline, private] |
| StatusCode THistSvc::getHist_i | ( | const std::string & | name, | |
| T *& | hist, | |||
| bool | quiet = false | |||
| ) | const [inline, private] |
| StatusCode THistSvc::readHist_i | ( | const std::string & | name, | |
| T *& | hist | |||
| ) | const [inline, private] |
| StatusCode THistSvc::readHist | ( | const std::string & | name, | |
| TH1 *& | hist | |||
| ) | const [private] |
| StatusCode THistSvc::readHist | ( | const std::string & | name, | |
| TH2 *& | hist | |||
| ) | const [private] |
| StatusCode THistSvc::readHist | ( | const std::string & | name, | |
| TH3 *& | hist | |||
| ) | const [private] |
| StatusCode THistSvc::readTree | ( | const std::string & | name, | |
| TTree *& | hist | |||
| ) | const [private] |
| void THistSvc::updateFiles | ( | ) | [private] |
Definition at line 844 of file THistSvc.cpp.
00844 { 00845 00846 // If TTrees grow beyond TTree::fgMaxFileSize, a new file is 00847 // automatically created by root, and the old one closed. We 00848 // need to migrate all the UIDs over to show the correct file 00849 // pointer. This is ugly. 00850 00851 uidMap::iterator uitr, uitr2; 00852 for (uitr=m_uids.begin(); uitr != m_uids.end(); ++uitr) { 00853 TObject* to = uitr->second.obj; 00854 TFile* oldFile = uitr->second.file; 00855 if (to->IsA()->InheritsFrom("TTree")) { 00856 TTree* tr = dynamic_cast<TTree*>(to); 00857 TFile* newFile = tr->GetCurrentFile(); 00858 00859 if (oldFile != newFile) { 00860 std::string newFileName = newFile->GetName(); 00861 std::string oldFileName(""), streamName, rem; 00862 TFile* dummy; 00863 findStream(uitr->second.id, streamName, rem, dummy); 00864 00865 map<string, pair<TFile*,Mode> >::iterator itr; 00866 for (itr=m_files.begin(); itr!= m_files.end(); ++itr) { 00867 if (itr->second.first == oldFile) { 00868 itr->second.first = newFile; 00869 00870 } 00871 } 00872 00873 uitr2 = uitr; 00874 for (; uitr2 != m_uids.end(); ++uitr2) { 00875 if (uitr2->second.file == oldFile) { 00876 uitr2->second.file = newFile; 00877 } 00878 } 00879 00880 streamMap::iterator sitr; 00881 for (sitr = m_fileStreams.begin(); sitr!=m_fileStreams.end(); ++sitr) { 00882 if (sitr->second == streamName) { 00883 oldFileName = sitr->first; 00884 break; 00885 } 00886 } 00887 00888 00889 #ifndef NDEBUG 00890 m_log << MSG::DEBUG << "migrating uid: " << uitr->second.id 00891 << " stream: " << streamName 00892 << " oldFile: " << oldFileName 00893 << " newFile: " << newFileName 00894 << endmsg; 00895 #endif 00896 00897 00898 if (oldFileName != "") { 00899 while ( (sitr=m_fileStreams.find(oldFileName)) != m_fileStreams.end() ) { 00900 00901 #ifndef NDEBUG 00902 m_log << MSG::DEBUG << "changing filename \"" << oldFileName 00903 << "\" to \"" << newFileName << "\" for stream \"" 00904 << sitr->second << "\"" << endmsg; 00905 #endif 00906 m_fileStreams.erase(sitr); 00907 m_fileStreams.insert( make_pair<std::string,std::string>(newFileName,streamName) ); 00908 } 00909 00910 00911 } else { 00912 m_log << MSG::ERROR 00913 << "Problems updating fileStreams with new file name" << endmsg; 00914 } 00915 00916 } 00917 00918 } 00919 } 00920 00921 }
| StatusCode THistSvc::write | ( | ) | [private] |
Definition at line 926 of file THistSvc.cpp.
00926 { 00927 00928 updateFiles(); 00929 00930 map<string, pair<TFile*,Mode> >::const_iterator itr; 00931 for (itr=m_files.begin(); itr!= m_files.end(); ++itr) { 00932 if (itr->second.second == WRITE || itr->second.second == UPDATE 00933 ||itr->second.second==SHARE) { 00934 itr->second.first->Write("",TObject::kOverwrite); 00935 } else if (itr->second.second == APPEND) { 00936 itr->second.first->Write(""); 00937 } 00938 } 00939 00940 00941 m_log << MSG::DEBUG << "THistSvc::write()::List of Files connected in ROOT " 00942 << endmsg; 00943 00944 TSeqCollection *filelist=gROOT->GetListOfFiles(); 00945 for (int ii=0; ii<filelist->GetEntries(); ii++) { 00946 m_log << MSG::DEBUG 00947 << "THistSvc::write()::List of Files connected in ROOT: \"" 00948 << filelist->At(ii)->GetName()<<"\""<<endmsg; 00949 } 00950 00951 return StatusCode::SUCCESS; 00952 00953 }
| StatusCode THistSvc::connect | ( | const std::string & | ident | ) | [private] |
Definition at line 958 of file THistSvc.cpp.
00958 { 00959 00960 Tokenizer tok(true); 00961 00962 string::size_type loc = ident.find(" "); 00963 string stream = ident.substr(0,loc); 00964 char typ(0); 00965 typedef std::pair<std::string,std::string> Prop; 00966 std::vector<Prop> props; 00967 string val,VAL,TAG,filename,db_typ("ROOT"); 00968 00969 tok.analyse(ident.substr(loc+1,ident.length()), " ", "", "", "=", "'", "'"); 00970 00971 for ( Tokenizer::Items::iterator i = tok.items().begin(); i != tok.items().end(); i++) { 00972 const std::string& tag = (*i).tag(); 00973 TAG = tag; 00974 toupper(TAG); 00975 00976 val = (*i).value(); 00977 VAL = val; 00978 toupper(VAL); 00979 00980 if (TAG == "FILE" || TAG == "DATAFILE") { 00981 filename = val; 00982 removeDoubleSlash( filename ); 00983 } else if ( TAG == "OPT" ) { 00984 if ( VAL == "APPEND" || VAL == "UPDATE" ) { 00985 typ = 'A'; 00986 } else if ( VAL == "CREATE" || VAL == "NEW" || VAL == "WRITE" ) { 00987 typ = 'N'; 00988 } else if ( VAL == "RECREATE" ) { 00989 typ = 'R'; 00990 } else if (VAL == "SHARE") { 00991 typ = 'S'; 00992 } else if ( VAL == "OLD" || VAL == "READ" ) { 00993 typ = 'O'; 00994 } else { 00995 m_log << MSG::ERROR << "Unknown OPT: \"" << (*i).value() << "\"" 00996 << endmsg; 00997 typ = 0; 00998 } 00999 } else if (TAG == "TYP") { 01000 db_typ = (*i).value(); 01001 } else { 01002 props.push_back( Prop((*i).tag(), (*i).value())); 01003 } 01004 01005 } 01006 01007 if (stream == "temp") { 01008 m_log << MSG::ERROR << "in JobOption \"" << ident 01009 << "\": stream name \"temp\" reserved." 01010 << endmsg; 01011 return StatusCode::FAILURE; 01012 } 01013 01014 if (db_typ != "ROOT") { 01015 m_log << MSG::ERROR << "in JobOption \"" << ident 01016 << "\": technology type \"" << db_typ << "\" not supported." 01017 << endmsg; 01018 return StatusCode::FAILURE; 01019 } 01020 01021 01022 if (m_files.find(stream) != m_files.end()) { 01023 m_log << MSG::ERROR << "in JobOption \"" << ident 01024 << "\":\n stream \"" << stream << "\" already connected to file: \"" 01025 << m_files[stream].first->GetName() << "\"" 01026 << endmsg; 01027 return StatusCode::FAILURE; 01028 } 01029 01030 Mode newMode; 01031 if (typ == 'O') { 01032 newMode = THistSvc::READ; 01033 } else if (typ == 'N') { 01034 newMode = THistSvc::WRITE; 01035 } else if (typ == 'A') { 01036 newMode = THistSvc::APPEND; 01037 } else if (typ == 'R') { 01038 newMode = THistSvc::UPDATE; 01039 } else if (typ == 'S') { 01040 newMode = THistSvc::SHARE; 01041 } else { 01042 // something else? 01043 m_log << MSG::ERROR << "No OPT= specified or unknown access mode in: " 01044 << ident << endmsg; 01045 return StatusCode::FAILURE; 01046 } 01047 01048 // Is this file already connected to another stream? 01049 if (m_fileStreams.find(filename) != m_fileStreams.end()) { 01050 std::pair<streamMap::iterator, streamMap::iterator> fitr = 01051 m_fileStreams.equal_range(filename); 01052 01053 std::string oldstream = (fitr.first)->second; 01054 01055 std::pair<TFile*,Mode> f_info = m_files[oldstream]; 01056 01057 if (newMode != f_info.second) { 01058 m_log << MSG::ERROR << "in JobOption \"" << ident 01059 << "\":\n file \"" << filename << "\" already opened by stream: \"" 01060 << oldstream << "\" with different access mode." 01061 << endmsg; 01062 return StatusCode::FAILURE; 01063 } else { 01064 TFile *f2 = f_info.first; 01065 m_files[stream] = make_pair<TFile*,Mode>(f2,newMode); 01066 m_log << MSG::DEBUG << "Connecting stream: \"" << stream 01067 << "\" to previously opened TFile: \"" << filename << "\"" 01068 << endmsg; 01069 return StatusCode::SUCCESS; 01070 } 01071 } 01072 01073 01074 TFile *f(0) ; 01075 if (newMode == THistSvc::READ) { 01076 // old file 01077 01078 try { 01079 f = TFile::Open(filename.c_str(),"READ"); 01080 } catch (const std::exception& Exception) { 01081 m_log << MSG::ERROR << "exception caught while trying to open root" 01082 << " file for reading: " << Exception.what() << std::endl 01083 << " -> file probably corrupt." << endmsg; 01084 return StatusCode::FAILURE; 01085 } catch (...) { 01086 m_log << MSG::ERROR << "Problems opening input file \"" << filename 01087 << "\": probably corrupt" << endmsg; 01088 return StatusCode::FAILURE; 01089 } 01090 01091 if (!f->IsOpen()) { 01092 m_log << MSG::ERROR << "Unable to open input file \"" << filename 01093 << "\": file does not exist" << endmsg; 01094 return StatusCode::FAILURE; 01095 } 01096 01097 01098 } else if (newMode == THistSvc::WRITE) { 01099 // new file 01100 01101 f = TFile::Open(filename.c_str(),"NEW"); 01102 if (!f->IsOpen()) { 01103 m_log << MSG::ERROR << "Unable to create new output file \"" << filename 01104 << "\" for writing: file already exists" << endmsg; 01105 return StatusCode::FAILURE; 01106 } 01107 f->SetCompressionLevel( m_compressionLevel ); 01108 01109 } else if (newMode == THistSvc::APPEND) { 01110 // update file 01111 01112 try { 01113 f = TFile::Open(filename.c_str(),"UPDATE"); 01114 } catch (const std::exception& Exception) { 01115 m_log << MSG::ERROR << "exception caught while trying to open root" 01116 << " file for appending: " << Exception.what() << std::endl 01117 << " -> file probably corrupt." << endmsg; 01118 return StatusCode::FAILURE; 01119 } catch (...) { 01120 m_log << MSG::ERROR << "Problems opening output file \"" << filename 01121 << "\" for append: probably corrupt" << endmsg; 01122 return StatusCode::FAILURE; 01123 } 01124 01125 if (!f->IsOpen()) { 01126 m_log << MSG::ERROR << "Unable to open output file \"" << filename 01127 << "\" for appending" << endmsg; 01128 return StatusCode::FAILURE; 01129 } 01130 f->SetCompressionLevel( m_compressionLevel ); 01131 01132 } else if (newMode == THistSvc::SHARE) { 01133 // SHARE file type 01134 //For SHARE files, all data will be stored in a temp file and will be merged into the target file 01135 //in write() when finalize(), this help to solve some confliction. e.g. with storegate 01136 01137 static int ishared = 0; 01138 stringstream out; 01139 string realfilename=filename; 01140 out << ishared++; 01141 filename = string("tmp_THistSvc_")+out.str()+string(".root"); 01142 01143 m_log << MSG::DEBUG << "Creating temp file \"" << filename 01144 << "\" and realfilename="<<realfilename << endmsg; 01145 m_sharedFiles[stream]=realfilename; 01146 01147 try { 01148 f = TFile::Open(filename.c_str(),"NEW"); 01149 } catch (const std::exception& Exception) { 01150 m_log << MSG::ERROR << "exception caught while trying to open root" 01151 << " file for appending: " << Exception.what() << std::endl 01152 << " -> file probably corrupt." << endmsg; 01153 return StatusCode::FAILURE; 01154 } catch (...) { 01155 m_log << MSG::ERROR << "Problems opening output file \"" << filename 01156 << "\" for append: probably corrupt" << endmsg; 01157 return StatusCode::FAILURE; 01158 } 01159 01160 if (!f->IsOpen()) { 01161 m_log << MSG::ERROR << "Unable to open output file \"" << filename 01162 << "\" for appending" << endmsg; 01163 return StatusCode::FAILURE; 01164 } 01165 f->SetCompressionLevel( m_compressionLevel ); 01166 01167 } else if (newMode == THistSvc::UPDATE) { 01168 // update file 01169 01170 try { 01171 f = TFile::Open(filename.c_str(),"RECREATE"); 01172 } catch (const std::exception& Exception) { 01173 m_log << MSG::ERROR << "exception caught while trying to open root" 01174 << " file for updating: " << Exception.what() << std::endl 01175 << " -> file probably corrupt." << endmsg; 01176 return StatusCode::FAILURE; 01177 } catch (...) { 01178 m_log << MSG::ERROR << "Problems opening output file \"" << filename 01179 << "\" for update: probably corrupt" << endmsg; 01180 return StatusCode::FAILURE; 01181 } 01182 01183 if (!f->IsOpen()) { 01184 m_log << MSG::ERROR << "Unable to open output file \"" << filename 01185 << "\" for updating" << endmsg; 01186 return StatusCode::FAILURE; 01187 } 01188 f->SetCompressionLevel( m_compressionLevel ); 01189 01190 } 01191 01192 m_files[stream] = make_pair<TFile*,Mode>(f,newMode); 01193 m_fileStreams.insert(make_pair<std::string,std::string>(filename,stream)); 01194 01195 m_log << MSG::DEBUG << "Opening TFile \"" << filename << "\" stream: \"" 01196 << stream << "\" mode: \"" << typ << "\"" 01197 << endmsg; 01198 01199 return StatusCode::SUCCESS; 01200 }
| TDirectory * THistSvc::changeDir | ( | const THistSvc::THistID & | hid | ) | const [private] |
Definition at line 1205 of file THistSvc.cpp.
01205 { 01206 01207 string uid = hid.id; 01208 TFile* file = hid.file; 01209 string stream, fdir, bdir, dir, id; 01210 01211 if (file != 0) { 01212 file->cd("/"); 01213 } else { 01214 gROOT->cd(); 01215 } 01216 01217 fdir = uid; 01218 bdir = dirname(fdir); 01219 01220 while ( (dir = dirname(fdir)) != "") { 01221 if (! gDirectory->GetKey(dir.c_str())) { 01222 gDirectory->mkdir(dir.c_str()); 01223 } 01224 gDirectory->cd(dir.c_str()); 01225 } 01226 01227 return gDirectory; 01228 01229 }
| std::string THistSvc::dirname | ( | std::string & | dir | ) | const [private] |
Definition at line 1234 of file THistSvc.cpp.
01234 { 01235 01236 01237 string::size_type i = dir.find("/"); 01238 01239 if (i == string::npos) { 01240 return ""; 01241 } 01242 01243 if ( i == 0 ) { 01244 dir.erase(0,1); 01245 return dirname(dir); 01246 } 01247 01248 string root = dir.substr(0,i); 01249 dir.erase(0,i); 01250 01251 return root; 01252 01253 }
| void THistSvc::removeDoubleSlash | ( | std::string & | id | ) | const [private] |
Definition at line 1272 of file THistSvc.cpp.
01272 { 01273 01274 while (id.find("//") != std::string::npos) { 01275 id.replace(id.find("//"),2,"/"); 01276 } 01277 01278 }
| bool THistSvc::browseTDir | ( | TDirectory * | dir | ) | const [private] |
Definition at line 294 of file THistSvc.cpp.
00294 { 00295 00296 if (dir == 0) { 00297 std::cerr << "TDirectory == 0" << std::endl; 00298 return false; 00299 } 00300 00301 GlobalDirectoryRestore restore; 00302 00303 dir->cd(); 00304 00305 00306 cout << "-> " << dir->GetPath() << " " 00307 << dir->GetListOfKeys()->GetSize() << endl; 00308 00309 // TIter nextkey(dir->GetListOfKeys()); 00310 TIter nextkey(dir->GetList()); 00311 while (TKey *key = (TKey*)nextkey()) { 00312 00313 TObject *obj = key->ReadObj(); 00314 if (obj == 0) { cout << key->GetName() << " obj==0"<< endl; continue; } 00315 // if (obj->IsA()->InheritsFrom("TDirectory")) { 00316 cout << " Key: " << key->GetName() << " " 00317 << " tit: " << obj->GetTitle() << " " 00318 << " (" << key->GetClassName() << ")" << endl; 00319 // } 00320 } 00321 00322 nextkey = dir->GetListOfKeys(); 00323 while (TKey *key = (TKey*)nextkey()) { 00324 00325 TObject *obj = key->ReadObj(); 00326 if (obj == 0) { cout << key->GetName() << " obj==0"<< endl; continue; } 00327 if (obj->IsA()->InheritsFrom("TDirectory")) { 00328 TDirectory *tt = dynamic_cast<TDirectory*>(obj); 00329 browseTDir(tt); 00330 } 00331 } 00332 00333 return true; 00334 }
| bool THistSvc::findStream | ( | const std::string & | name, | |
| std::string & | root, | |||
| std::string & | rem, | |||
| TFile *& | file | |||
| ) | const [private] |
Definition at line 716 of file THistSvc.cpp.
00717 { 00718 00719 string::size_type pos = id.find("/"); 00720 00721 if (pos == string::npos) { 00722 stream = "temp"; 00723 rem = id; 00724 } else if (pos != 0) { 00725 stream = "temp"; 00726 rem = id; 00727 } else { 00728 00729 string::size_type pos2 = id.find("/",pos+1); 00730 00731 if (pos2 == string::npos) { 00732 m_log << MSG::ERROR << "badly formed Hist/Tree id: \"" << id << "\"" 00733 << endmsg; 00734 return false; 00735 } 00736 00737 parseString(id,stream,rem); 00738 00739 } 00740 00741 if (stream == "temp") { 00742 file = 0; 00743 return true; 00744 } 00745 00746 map< string,pair<TFile*,Mode> >::const_iterator itr = m_files.find(stream); 00747 if (itr != m_files.end()) { 00748 file = itr->second.first; 00749 } else { 00750 file = 0; 00751 m_log << MSG::WARNING << "no stream \"" << stream 00752 << "\" associated with id: \"" << id << "\"" 00753 << endmsg; 00754 } 00755 00756 return true; 00757 00758 }
| void THistSvc::parseString | ( | const std::string & | id, | |
| std::string & | root, | |||
| std::string & | rem | |||
| ) | const [private] |
Definition at line 763 of file THistSvc.cpp.
00763 { 00764 string::size_type pos = id.find("/"); 00765 00766 if (pos == string::npos) { 00767 root = ""; 00768 rem = id; 00769 return; 00770 } 00771 00772 if (pos == 0) { 00773 parseString(id.substr(1,id.length()),root,rem); 00774 } else { 00775 root = id.substr(0,pos); 00776 rem = id.substr(pos+1,id.length()); 00777 } 00778 00779 }
| void THistSvc::setupInputFile | ( | Property & | inputfile | ) | [private] |
call-back method to handle input stream property
Definition at line 784 of file THistSvc.cpp.
00785 { 00786 StatusCode sc = StatusCode::SUCCESS; 00787 00788 typedef std::vector<std::string> Strings_t; 00789 for ( Strings_t::const_iterator 00790 itr = m_inputfile.value().begin(), 00791 iEnd = m_inputfile.value().end(); 00792 itr != iEnd; 00793 ++itr ) { 00794 if ( m_alreadyConnectedInFiles.end() == 00795 m_alreadyConnectedInFiles.find( *itr ) ) { 00796 if ( connect(*itr).isFailure() ) { 00797 sc = StatusCode::FAILURE; 00798 } else { 00799 m_alreadyConnectedInFiles.insert( *itr ); 00800 } 00801 } 00802 } 00803 00804 if ( !sc.isSuccess() ) { 00805 throw GaudiException( "Problem connecting inputfile !!", name(), 00806 StatusCode::FAILURE ); 00807 } 00808 return; 00809 }
| void THistSvc::setupOutputFile | ( | Property & | outputfile | ) | [private] |
call-back method to handle output stream property
Definition at line 814 of file THistSvc.cpp.
00815 { 00816 StatusCode sc = StatusCode::SUCCESS; 00817 00818 typedef std::vector<std::string> Strings_t; 00819 for ( Strings_t::const_iterator 00820 itr = m_outputfile.value().begin(), 00821 iEnd = m_outputfile.value().end(); 00822 itr != iEnd; 00823 ++itr ) { 00824 if ( m_alreadyConnectedOutFiles.end() == 00825 m_alreadyConnectedOutFiles.find( *itr ) ) { 00826 if ( connect(*itr).isFailure() ) { 00827 sc = StatusCode::FAILURE; 00828 } else { 00829 m_alreadyConnectedOutFiles.insert( *itr ); 00830 } 00831 } 00832 } 00833 00834 if ( !sc.isSuccess() ) { 00835 throw GaudiException( "Problem connecting outputfile !!", name(), 00836 StatusCode::FAILURE ); 00837 } 00838 return; 00839 }
| void THistSvc::MergeRootFile | ( | TDirectory * | target, | |
| TDirectory * | source | |||
| ) | [private] |
Definition at line 1282 of file THistSvc.cpp.
01282 { 01283 01284 m_log <<MSG::DEBUG << "Target path: " << target->GetPath() << endmsg; 01285 TString path( (char*)strstr(target->GetPath(), ":") ); 01286 path.Remove( 0, 2); 01287 01288 source->cd(path); 01289 TDirectory *current_sourcedir = gDirectory; 01290 01291 // loop over all keys in this directory 01292 TList *lkeys=current_sourcedir->GetListOfKeys(); 01293 int nkeys=lkeys->GetEntries(); 01294 TKey *key; 01295 for (int jj=0; jj<nkeys; jj++) { 01296 key=(TKey*) lkeys->At(jj); 01297 string pathnameinsource=current_sourcedir->GetPath()+string("/")+key->GetName(); 01298 m_log <<MSG::DEBUG << "Reading Key:" << pathnameinsource << endmsg; 01299 //key->Dump(); 01300 //TObject *obj=key->ReadObj(); 01301 TObject *obj=source->Get(pathnameinsource.c_str()); 01302 01303 if (obj->IsA()->InheritsFrom("TDirectory") ) { 01304 // it's a subdirectory 01305 01306 m_log <<MSG::DEBUG << "Found subdirectory " << obj->GetName() 01307 << endmsg; 01308 01309 // create a new subdir of same name and title in the target file 01310 target->cd(); 01311 TDirectory *newtargetdir = 01312 target->mkdir(obj->GetName(), obj->GetTitle() ); 01313 01314 MergeRootFile(newtargetdir, source); 01315 01316 } else if (obj->IsA()->InheritsFrom("TTree")) { 01317 m_log <<MSG::DEBUG << "Found TTree " << obj->GetName() << endmsg; 01318 TTree *mytree=dynamic_cast<TTree*>(obj); 01319 int nentries=(int) mytree->GetEntries(); 01320 mytree->SetBranchStatus("*",1); 01321 01322 m_log <<MSG::DEBUG << "Dumping TTree " << nentries <<" entries" 01323 << endmsg; 01324 //mytree->Print(); 01325 //for (int ij=0; ij<nentries; ij++) { 01326 //m_log <<MSG::DEBUG << "Dumping TTree Show( " << ij <<" )" 01327 //<< endmsg; 01328 //mytree->Show(ij); 01329 //} 01330 target->cd(); 01331 mytree->CloneTree(); 01332 01333 //m_log <<MSG::DEBUG << "Writing TTree to target file: ( " 01334 //<< mycopiedtree->Write(key->GetName()) <<" ) bytes written" 01335 //<< endmsg; 01336 01337 } else if (obj) { 01338 target->cd(); 01339 obj->Write(key->GetName() ); 01340 } 01341 01342 } // while ( ( TKey *key = (TKey*)nextkey() ) ) 01343 01344 // save modifications to target file 01345 01346 }
MsgStream THistSvc::m_log [mutable, private] |
Definition at line 112 of file THistSvc.h.
StringArrayProperty THistSvc::m_inputfile [private] |
Definition at line 152 of file THistSvc.h.
StringArrayProperty THistSvc::m_outputfile [private] |
Definition at line 152 of file THistSvc.h.
std::vector<std::string> THistSvc::m_Rstream [private] |
Definition at line 153 of file THistSvc.h.
std::vector<std::string> THistSvc::m_Wstream [private] |
Definition at line 153 of file THistSvc.h.
IntegerProperty THistSvc::m_autoSave [private] |
Definition at line 154 of file THistSvc.h.
IntegerProperty THistSvc::m_compressionLevel [private] |
Definition at line 154 of file THistSvc.h.
IntegerProperty THistSvc::m_maxFileSize [private] |
Definition at line 154 of file THistSvc.h.
BooleanProperty THistSvc::m_print [private] |
Definition at line 155 of file THistSvc.h.
list of already connected files.
This is to keep track of files registered by the setupInputFile callback method
Definition at line 159 of file THistSvc.h.
list of already connected files.
This is to keep track of files registered by the setupOutputFile callback method
Definition at line 163 of file THistSvc.h.
uidMap THistSvc::m_uids [private] |
Definition at line 167 of file THistSvc.h.
idMap THistSvc::m_ids [private] |
Definition at line 168 of file THistSvc.h.
objMap THistSvc::m_tobjs [private] |
Definition at line 169 of file THistSvc.h.
std::map<std::string, std::pair<TFile*,Mode> > THistSvc::m_files [private] |
Definition at line 171 of file THistSvc.h.
streamMap THistSvc::m_fileStreams [private] |
Definition at line 172 of file THistSvc.h.
std::map<std::string, std::string > THistSvc::m_sharedFiles [private] |
Definition at line 174 of file THistSvc.h.
bool THistSvc::signaledStop [private] |
Definition at line 177 of file THistSvc.h.