00001 #include "DisplayManager.h" 00002 #include "DisplayInfo.h" 00003 #include "Exceptions.h" 00004 #include "Displayer.h" 00005 #include "Sct/Serializable.h" 00006 #include "Sct/LogicErrors.h" 00007 #include "TROOT.h" 00008 #include "TCanvas.h" 00009 #include "TFile.h" 00010 #include "TSeqCollection.h" 00011 00012 using namespace Sct; 00013 00014 namespace SctDataDisplay { 00015 00016 DisplayManager::DisplayManager() { 00017 m_batchMode=false; 00018 } 00019 00020 DisplayManager& DisplayManager::instance() { 00021 static DisplayManager disp; 00022 return disp; 00023 } 00024 00025 bool DisplayManager::addToMap(string className, shared_ptr<Displayer> displayer) { 00026 if (instance().displayerMap.find(className) != instance().displayerMap.end()) return false; 00027 instance().displayerMap[className] = displayer; 00028 return true; 00029 } 00030 00031 shared_ptr<DisplayData> DisplayManager::display(shared_ptr<const Serializable> ob, const DisplayInfo& info, std::ostream& os) { 00032 if (!ob) 00033 throw InvalidArgumentError("Passed a null pointer to DisplayManager::display", __FILE__, __LINE__); 00034 00035 if (rootMode()){ 00036 std::string filename=DisplayManager::getOutputDir() + ob->getClassName(); 00037 filename+="."; 00038 filename+=ob->getUniqueID(); 00039 filename+=".root"; 00040 shared_ptr<TFile> newfile(new TFile(filename.c_str(),"RECREATE")); 00041 s_file=newfile; 00042 std::cout << "FILE " << filename << std::endl; 00043 } 00044 00045 if (instance().displayerMap.find(ob->getClassName()) == instance().displayerMap.end()) { 00046 for (unsigned int i=0; i<instance().genericList.size(); ++i) { 00047 if (instance().genericList[i]->canDisplay(*ob)) 00048 return instance().genericList[i]->display(ob, info, os); 00049 } 00050 00051 throw NoDisplayerException("No Displayer for class: " + ob->getClassName(), __FILE__, __LINE__); 00052 } 00053 00054 return instance().displayerMap[ob->getClassName()]->display(ob, info, os); 00055 } 00056 00057 00058 bool DisplayManager::addGeneric(shared_ptr<GenericDisplayer> generic) { 00059 instance().genericList.push_back(generic); 00060 return true; 00061 } 00062 00063 bool DisplayManager::batchMode(){ 00064 return instance().m_batchMode; 00065 } 00066 00067 bool DisplayManager::rootMode(){ 00068 return instance().m_rootMode; 00069 } 00070 00071 std::string DisplayManager::getOutputDir(){ 00072 if (instance().m_outputdir=="") return instance().m_outputdir; 00073 return instance().m_outputdir + "/"; 00074 } 00075 00076 void DisplayManager::setOutputDir(const std::string& s){ 00077 instance().setBatchMode(); 00078 std::cout << "OUTPUT=" << s << std::endl; 00079 instance().m_outputdir=s; 00080 } 00081 00082 void DisplayManager::setBatchMode(bool b){ 00083 instance().m_batchMode=b; 00084 } 00085 00086 void DisplayManager::setRootMode(bool b){ 00087 instance().m_rootMode=b; 00088 } 00089 00090 shared_ptr<TDirectory> DisplayManager::getTDirectory(){ 00091 return s_file; 00092 } 00093 00094 void DisplayManager::OutputCanvases(){ 00095 if (rootMode())return; 00096 TSeqCollection* list = gROOT->GetListOfCanvases(); 00097 for (int i=0; i<=list->LastIndex(); ++i){ 00098 TCanvas* canvas=static_cast<TCanvas*>(list->At(i)); 00099 string filename=getOutputDir() + canvas->GetName() + ".eps"; 00100 while (true) { 00101 unsigned ipos=filename.rfind(' '); 00102 if (ipos==string::npos) break; 00103 filename[ipos]='_'; 00104 } 00105 std::cout << "FILE " << filename << std::endl; 00106 canvas->Print((filename).c_str()); 00107 } 00108 } 00109 shared_ptr<TDirectory> DisplayManager::s_file; 00110 }