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 void DisplayManager::setBatchMode(bool b){ 00057 instance().m_batchMode=b; 00058 } 00059 00060 void DisplayManager::OutputCanvases(){ 00061 00062 TSeqCollection* list = gROOT->GetListOfCanvases(); 00063 for (int i=0; i<=list->LastIndex(); ++i){ 00064 TCanvas* canvas=static_cast<TCanvas*>(list->At(i)); 00065 string filename=canvas->GetName(); 00066 00067 while (true) { 00068 unsigned ipos=filename.rfind(' '); 00069 std::cout << filename << ", " << ipos << std::endl; 00070 if (ipos==string::npos) break; 00071 filename[ipos]='_'; 00072 } 00073 00074 canvas->Print((filename+".eps").c_str()); 00075 } 00076 } 00077 00078 }