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 }