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 "TSeqCollection.h" 00010 00011 using namespace Sct; 00012 00013 namespace SctDataDisplay { 00014 00015 DisplayManager::DisplayManager() { 00016 m_batchMode=false; 00017 } 00018 00019 DisplayManager& DisplayManager::instance() { 00020 static DisplayManager disp; 00021 return disp; 00022 } 00023 00024 bool DisplayManager::addToMap(string className, shared_ptr<Displayer> displayer) { 00025 if (instance().displayerMap.find(className) != instance().displayerMap.end()) return false; 00026 instance().displayerMap[className] = displayer; 00027 return true; 00028 } 00029 00030 shared_ptr<DisplayData> DisplayManager::display(shared_ptr<const Serializable> ob, const DisplayInfo& info, std::ostream& os) { 00031 if (!ob) 00032 throw InvalidArgumentError("Passed a null pointer to DisplayManager::display", __FILE__, __LINE__); 00033 00034 if (instance().displayerMap.find(ob->getClassName()) == instance().displayerMap.end()) { 00035 for (unsigned int i=0; i<instance().genericList.size(); ++i) { 00036 if (instance().genericList[i]->canDisplay(*ob)) 00037 return instance().genericList[i]->display(ob, info, os); 00038 } 00039 00040 throw NoDisplayerException("No Displayer for class: " + ob->getClassName(), __FILE__, __LINE__); 00041 } 00042 00043 return instance().displayerMap[ob->getClassName()]->display(ob, info, os); 00044 } 00045 00046 00047 bool DisplayManager::addGeneric(shared_ptr<GenericDisplayer> generic) { 00048 instance().genericList.push_back(generic); 00049 return true; 00050 } 00051 00052 bool DisplayManager::batchMode(){ 00053 return instance().m_batchMode; 00054 } 00055 00056 std::string DisplayManager::getOutputDir(){ 00057 if (instance().m_outputdir=="") return instance().m_outputdir; 00058 return instance().m_outputdir + "/"; 00059 } 00060 00061 void DisplayManager::setOutputDir(const std::string& s){ 00062 instance().setBatchMode(); 00063 std::cout << "OUTPUT=" << s << std::endl; 00064 instance().m_outputdir=s; 00065 } 00066 00067 void DisplayManager::setBatchMode(bool b){ 00068 instance().m_batchMode=b; 00069 } 00070 00071 void DisplayManager::OutputCanvases(){ 00072 00073 TSeqCollection* list = gROOT->GetListOfCanvases(); 00074 for (int i=0; i<=list->LastIndex(); ++i){ 00075 TCanvas* canvas=static_cast<TCanvas*>(list->At(i)); 00076 string filename=getOutputDir() + canvas->GetName() + ".eps"; 00077 00078 while (true) { 00079 unsigned ipos=filename.rfind(' '); 00080 if (ipos==string::npos) break; 00081 filename[ipos]='_'; 00082 } 00083 std::cout << "FILE " << filename << std::endl; 00084 canvas->Print((filename).c_str()); 00085 } 00086 } 00087 00088 }