DisplayManager.cpp

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 }

Generated on Mon Feb 6 14:01:19 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6