CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/Fireworks/Core/src/CmsShowMain.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     Core
00004 // Class  :     CmsShowMain
00005 //
00006 // Implementation:
00007 //     <Notes on implementation>
00008 //
00009 // Original Author:
00010 //         Created:  Mon Dec  3 08:38:38 PST 2007
00011 // $Id: CmsShowMain.cc,v 1.188 2011/02/23 14:07:03 amraktad Exp $
00012 //
00013 
00014 // system include files
00015 #include <sstream>
00016 #include <boost/bind.hpp>
00017 #include <boost/program_options.hpp>
00018 #include <string.h>
00019 
00020 #include "TSystem.h"
00021 #include "TGLWidget.h"
00022 #include "TTimer.h"
00023 #include "TROOT.h"
00024 #include "TGFileDialog.h"
00025 #include "TGMsgBox.h"
00026 #include "TMonitor.h"
00027 #include "TServerSocket.h"
00028 #include "TEveLine.h"
00029 #include "TEveManager.h"
00030 #include "TFile.h"
00031 
00032 #include "Fireworks/Core/src/CmsShowMain.h"
00033 
00034 #include "Fireworks/Core/interface/FWEveViewManager.h"
00035 
00036 #include "Fireworks/Core/interface/FWTableViewManager.h"
00037 #include "Fireworks/Core/interface/FWTriggerTableViewManager.h"
00038 #include "Fireworks/Core/interface/FWEventItemsManager.h"
00039 #include "Fireworks/Core/interface/FWViewManagerManager.h"
00040 #include "Fireworks/Core/interface/FWGUIManager.h"
00041 #include "Fireworks/Core/interface/FWLiteJobMetadataManager.h"
00042 #include "Fireworks/Core/interface/FWModelChangeManager.h"
00043 #include "Fireworks/Core/interface/FWColorManager.h"
00044 #include "Fireworks/Core/src/FWColorSelect.h"
00045 #include "Fireworks/Core/interface/FWSelectionManager.h"
00046 #include "Fireworks/Core/interface/FWConfigurationManager.h"
00047 #include "Fireworks/Core/interface/FWMagField.h"
00048 #include "Fireworks/Core/interface/Context.h"
00049 
00050 #include "Fireworks/Core/interface/CmsShowNavigator.h"
00051 #include "Fireworks/Core/interface/CSGAction.h"
00052 #include "Fireworks/Core/interface/CSGContinuousAction.h"
00053 #include "Fireworks/Core/interface/FWLiteJobMetadataUpdateRequest.h"
00054 
00055 #include "Fireworks/Core/interface/ActionsList.h"
00056 
00057 #include "Fireworks/Core/src/CmsShowTaskExecutor.h"
00058 #include "Fireworks/Core/interface/CmsShowMainFrame.h"
00059 #include "Fireworks/Core/interface/CmsShowSearchFiles.h"
00060 
00061 #include "Fireworks/Core/interface/fwLog.h"
00062 
00063 #include "FWCore/FWLite/interface/AutoLibraryLoader.h"
00064 
00065 //
00066 // constants, enums and typedefs
00067 //
00068 
00069 static const char* const kInputFilesOpt        = "input-files";
00070 static const char* const kInputFilesCommandOpt = "input-files,i";
00071 static const char* const kConfigFileOpt        = "config-file";
00072 static const char* const kConfigFileCommandOpt = "config-file,c";
00073 static const char* const kGeomFileOpt          = "geom-file";
00074 static const char* const kGeomFileCommandOpt   = "geom-file,g";
00075 static const char* const kNoConfigFileOpt      = "noconfig";
00076 static const char* const kNoConfigFileCommandOpt = "noconfig,n";
00077 static const char* const kPlayOpt              = "play";
00078 static const char* const kPlayCommandOpt       = "play,p";
00079 static const char* const kLoopOpt              = "loop";
00080 static const char* const kLoopCommandOpt       = "loop";
00081 static const char* const kDebugOpt             = "debug";
00082 static const char* const kDebugCommandOpt      = "debug,d";
00083 static const char* const kLogLevelCommandOpt   = "log";
00084 static const char* const kLogLevelOpt          = "log";
00085 static const char* const kEveOpt               = "eve";
00086 static const char* const kEveCommandOpt        = "eve";
00087 static const char* const kAdvancedRenderOpt        = "shine";
00088 static const char* const kAdvancedRenderCommandOpt = "shine,s";
00089 static const char* const kHelpOpt        = "help";
00090 static const char* const kHelpCommandOpt = "help,h";
00091 static const char* const kSoftCommandOpt = "soft";
00092 static const char* const kPortCommandOpt = "port";
00093 static const char* const kPlainRootCommandOpt = "prompt";
00094 static const char* const kRootInteractiveCommandOpt = "root-interactive,r";
00095 static const char* const kChainCommandOpt = "chain";
00096 static const char* const kLiveCommandOpt  = "live";
00097 static const char* const kFieldCommandOpt = "field";
00098 static const char* const kFreePaletteCommandOpt = "free-palette";
00099 static const char* const kAutoSaveAllViews = "auto-save-all-views";
00100 static const char* const kEnableFPE        = "enable-fpe";
00101 static const char* const kZeroWinOffsets   = "zero-window-offsets";
00102 
00103 
00104 //
00105 // constructors and destructor
00106 //
00107 CmsShowMain::CmsShowMain(int argc, char *argv[]) 
00108    : CmsShowMainBase(),
00109      m_navigator(new CmsShowNavigator(*this)),
00110      m_metadataManager(new FWLiteJobMetadataManager()),
00111      m_context(new fireworks::Context(changeManager(),
00112                                       selectionManager(),
00113                                       eiManager(),
00114                                       colorManager(),
00115                                       m_metadataManager.get())),
00116      m_loadedAnyInputFile(false),
00117      m_openFile(0),
00118      m_live(false),
00119      m_liveTimer(new SignalTimer()),
00120      m_liveTimeout(600000),
00121      m_lastPointerPositionX(-999),
00122      m_lastPointerPositionY(-999)
00123 {
00124    try {
00125       TGLWidget* w = TGLWidget::Create(gClient->GetDefaultRoot(), kTRUE, kTRUE, 0, 10, 10);
00126       delete w;
00127    }
00128    catch (std::exception& iException) {
00129       std::cerr << "Failed creating an OpenGL window: " << iException.what() << "\n"
00130          "Things to check:\n"
00131          "- Is DISPLAY environment variable set?\n"
00132          "- Are OpenGL libraries installed?\n"
00133          "- If running remotely, make sure you use 'ssh -X' or 'ssh -Y'.\n"
00134          "See also: https://twiki.cern.ch/twiki/bin/viewauth/CMS/WorkBookFireworks\n";
00135       gSystem->Exit(1);
00136    }
00137 
00138    eiManager()->setContext(m_context.get());
00139 
00140    
00141    std::string descString(argv[0]);
00142    descString += " [options] <data file>\nAllowed options";
00143 
00144    namespace po = boost::program_options;
00145    po::options_description desc(descString);
00146    desc.add_options()
00147       (kInputFilesCommandOpt, po::value< std::vector<std::string> >(),   "Input root files")
00148       (kConfigFileCommandOpt, po::value<std::string>(),   "Include configuration file")
00149       (kGeomFileCommandOpt,   po::value<std::string>(),   "Include geometry file")
00150       (kNoConfigFileCommandOpt,                           "Don't load any configuration file")
00151       (kPlayCommandOpt, po::value<float>(),               "Start in play mode with given interval between events in seconds")
00152       (kPortCommandOpt, po::value<unsigned int>(),        "Listen to port for new data files to open")
00153       (kEveCommandOpt,                                    "Show Eve browser to help debug problems")
00154       (kLoopCommandOpt,                                   "Loop events in play mode")
00155       (kPlainRootCommandOpt,                              "Plain ROOT without event display")
00156       (kRootInteractiveCommandOpt,                        "Enable root interactive prompt")
00157       (kDebugCommandOpt,                                  "Start the display from a debugger and produce a crash report")
00158       (kEnableFPE,                                        "Enable detection of floating-point exceptions")
00159       (kLogLevelCommandOpt, po::value<unsigned int>(),    "Set log level starting from 0 to 4 : kDebug, kInfo, kWarning, kError")
00160       (kAdvancedRenderCommandOpt,                         "Use advance options to improve rendering quality       (anti-alias etc)")
00161       (kSoftCommandOpt,                                   "Try to force software rendering to avoid problems with bad hardware drivers")
00162       (kChainCommandOpt, po::value<unsigned int>(),       "Chain up to a given number of recently open files. Default is 1 - no chain")
00163       (kLiveCommandOpt,                                   "Enforce playback mode if a user is not using display")
00164       (kFieldCommandOpt, po::value<double>(),             "Set magnetic field value explicitly. Default is auto-field estimation")
00165       (kFreePaletteCommandOpt,                            "Allow free color selection (requires special configuration!)")
00166       (kAutoSaveAllViews, po::value<std::string>(),       "Auto-save all views with given prefix (run_event_lumi_view.png is appended)")
00167       (kZeroWinOffsets,                                   "Disable auto-detection of window position offsets.")
00168       (kHelpCommandOpt,                                   "Display help message");
00169    po::positional_options_description p;
00170    p.add(kInputFilesOpt, -1);
00171 
00172    int newArgc = argc;
00173    char **newArgv = argv;
00174    po::variables_map vm;
00175    //po::store(po::parse_command_line(newArgc, newArgv, desc), vm);
00176    //po::notify(vm);
00177    po::store(po::command_line_parser(newArgc, newArgv).
00178              options(desc).positional(p).run(), vm);
00179    po::notify(vm);
00180    if(vm.count(kHelpOpt)) {
00181       std::cout << desc <<std::endl;
00182       exit(0);
00183    }
00184       
00185    if(vm.count(kLogLevelOpt)) {
00186       fwlog::LogLevel level = (fwlog::LogLevel)(vm[kLogLevelOpt].as<unsigned int>());
00187       fwlog::setPresentLogLevel(level);
00188    }
00189 
00190    if(vm.count(kPlainRootCommandOpt)) {
00191       fwLog(fwlog::kInfo) << "Plain ROOT prompt requested" << std::endl;
00192       return;
00193    }
00194 
00195    const char* cmspath = gSystem->Getenv("CMSSW_BASE");
00196    if(0 == cmspath) {
00197       throw std::runtime_error("CMSSW_BASE environment variable not set");
00198    }
00199 
00200    // input file
00201    if (vm.count(kInputFilesOpt)) {
00202       m_inputFiles = vm[kInputFilesOpt].as< std::vector<std::string> >();
00203    }
00204 
00205    if (!m_inputFiles.size())
00206       fwLog(fwlog::kInfo) << "No data file given." << std::endl;
00207    else if (m_inputFiles.size() == 1)
00208       fwLog(fwlog::kInfo) << "Input " << m_inputFiles.front() << std::endl;
00209    else
00210       fwLog(fwlog::kInfo) << m_inputFiles.size() << " input files; first: " << m_inputFiles.front() << ", last: " << m_inputFiles.back() << std::endl;
00211 
00212    // configuration file
00213    if (vm.count(kConfigFileOpt)) {
00214       setConfigFilename(vm[kConfigFileOpt].as<std::string>());
00215       if (access(configFilename(), R_OK) == -1)
00216       {
00217          fwLog(fwlog::kError) << "Specified configuration file does not exist. Quitting.\n";
00218          exit(1);
00219       }
00220    } else {
00221       if (vm.count(kNoConfigFileOpt)) {
00222          fwLog(fwlog::kInfo) << "No configuration is loaded, show everything.\n";
00223          setConfigFilename("");
00224       } else
00225          setConfigFilename("default.fwc");
00226    }
00227    fwLog(fwlog::kInfo) << "Config "  <<  configFilename() << std::endl;
00228 
00229    // geometry
00230    if (vm.count(kGeomFileOpt)) {
00231       setGeometryFilename(vm[kGeomFileOpt].as<std::string>());
00232    } else {
00233       fwLog(fwlog::kInfo) << "No geom file name.  Choosing default.\n";
00234       setGeometryFilename("cmsGeom10.root");
00235    }
00236    fwLog(fwlog::kInfo) << "Geom " << geometryFilename() << std::endl;
00237 
00238    // Free-palette palette
00239    if (vm.count(kFreePaletteCommandOpt)) {
00240       FWColorPopup::EnableFreePalette();
00241       fwLog(fwlog::kInfo) << "Palette restriction removed on user request!\n";
00242    }
00243    bool eveMode = vm.count(kEveOpt);
00244 
00245    //Delay creating guiManager and enabling autoloading until here so that if we have a 'help' request we don't
00246    // open any graphics or build dictionaries
00247    AutoLibraryLoader::enable();
00248 
00249    TEveManager::Create(kFALSE, "FIV");
00250 
00251    setup(m_navigator.get(), m_context.get(), m_metadataManager.get());
00252 
00253    if (vm.count(kZeroWinOffsets))
00254    {
00255       guiManager()->resetWMOffsets();
00256       fwLog(fwlog::kInfo) << "Window offsets reset on user request!\n";
00257    }
00258 
00259    if ( vm.count(kAdvancedRenderOpt) ) 
00260    {
00261       TEveLine::SetDefaultSmooth(kTRUE);
00262    }
00263 
00264    //figure out where to find macros
00265    //tell ROOT where to find our macros
00266    CmsShowTaskExecutor::TaskFunctor f;
00267    // first check if port is not occupied
00268    if (vm.count(kPortCommandOpt)) {      
00269       f=boost::bind(&CmsShowMain::setupSocket, this, vm[kPortCommandOpt].as<unsigned int>());    
00270       startupTasks()->addTask(f);        
00271    }
00272     
00273    f=boost::bind(&CmsShowMainBase::loadGeometry,this);
00274    startupTasks()->addTask(f);
00275    f=boost::bind(&CmsShowMainBase::setupViewManagers,this);
00276    startupTasks()->addTask(f);
00277    f=boost::bind(&CmsShowMainBase::setupConfiguration,this);
00278    startupTasks()->addTask(f);
00279    f=boost::bind(&CmsShowMain::setupDataHandling,this);
00280    startupTasks()->addTask(f);
00281 
00282    if (vm.count(kLoopOpt))
00283       setPlayLoop();
00284 
00285    if (eveMode) {
00286       f = boost::bind(&CmsShowMainBase::setupDebugSupport,this);
00287       startupTasks()->addTask(f);
00288    }
00289    if(vm.count(kChainCommandOpt)) {
00290       f = boost::bind(&CmsShowNavigator::setMaxNumberOfFilesToChain, m_navigator.get(), vm[kChainCommandOpt].as<unsigned int>());
00291       startupTasks()->addTask(f);
00292    }
00293    if (vm.count(kPlayOpt)) {
00294       f = boost::bind(&CmsShowMainBase::setupAutoLoad, this, vm[kPlayOpt].as<float>());
00295       startupTasks()->addTask(f);
00296    }
00297 
00298    if(vm.count(kLiveCommandOpt))
00299    {
00300       f = boost::bind(&CmsShowMain::setLiveMode, this);
00301       startupTasks()->addTask(f);
00302    }
00303       
00304    if(vm.count(kFieldCommandOpt)) 
00305    {
00306       m_context->getField()->setSource(FWMagField::kUser);
00307       m_context->getField()->setUserField(vm[kFieldCommandOpt].as<double>());
00308    }
00309    if(vm.count(kAutoSaveAllViews)) {
00310       std::string fmt = vm[kAutoSaveAllViews].as<std::string>();
00311       fmt += "%d_%d_%d_%s.png";
00312       setAutoSaveAllViewsFormat(fmt);
00313    }
00314    if(vm.count(kEnableFPE)) {
00315       gSystem->SetFPEMask();
00316    }
00317 
00318    if (vm.count(kPortCommandOpt)) {      
00319       f=boost::bind(&CmsShowMain::connectSocket, this);          
00320       startupTasks()->addTask(f);        
00321    }
00322 
00323    startupTasks()->startDoingTasks();
00324 }
00325 
00326 //
00327 // Destruction
00328 //
00329 
00330 CmsShowMain::~CmsShowMain()
00331 {}
00332 
00333 class DieTimer : public TTimer
00334 {
00335 protected:
00336    CmsShowMain* fApp;
00337 public:
00338    DieTimer(CmsShowMain* app) : TTimer(), fApp(app)
00339    {
00340       Start(0, kTRUE);
00341    }
00342 
00343    virtual Bool_t Notify()
00344    {
00345       TurnOff();
00346       fApp->doExit();
00347       delete this;
00348       return kFALSE;
00349    }
00350 };
00351 
00352 void CmsShowMain::quit()
00353 {
00354    new DieTimer(this);
00355 }
00356 
00357 void CmsShowMain::doExit()
00358 {
00359    // pre terminate eve
00360    m_context->deleteEveElements();
00361    guiManager()->evePreTerminate();
00362 
00363    // sleep at least 150 ms
00364    // windows in ROOT GUI are destroyed in 150 ms timeout after
00365    gSystem->Sleep(151);
00366    gSystem->ProcessEvents();
00367    gSystem->ExitLoop();
00368 }
00369 
00370 //
00371 // assignment operators
00372 //
00373 // const CmsShowMain& CmsShowMain::operator=(const CmsShowMain& rhs)
00374 // {
00375 //   //An exception safe implementation is
00376 //   CmsShowMain temp(rhs);
00377 //   swap(rhs);
00378 //
00379 //   return *this;
00380 // }
00381 
00382 //
00383 // member functions
00384 //
00385 
00386 const fwlite::Event* 
00387 CmsShowMain::getCurrentEvent() const
00388 {
00389    if (m_navigator.get())
00390      return static_cast<const fwlite::Event*>(m_navigator->getCurrentEvent());
00391    return 0;
00392 }
00393 
00394 void
00395 CmsShowMain::fileChangedSlot(const TFile *file)
00396 {
00397    m_openFile = file;
00398    if (file)
00399       guiManager()->titleChanged(m_navigator->frameTitle());
00400 
00401    m_metadataManager->update(new FWLiteJobMetadataUpdateRequest(getCurrentEvent(), m_openFile));
00402 }
00403 
00404 void
00405 CmsShowMain::eventChangedImp()
00406 {
00407    CmsShowMainBase::eventChangedImp();
00408    guiManager()->titleChanged(m_navigator->frameTitle());
00409    m_metadataManager->update(new FWLiteJobMetadataUpdateRequest(getCurrentEvent(), m_openFile));
00410 }
00411 
00412 void CmsShowMain::resetInitialization() {
00413    //printf("Need to reset\n");
00414 }
00415 
00416 void CmsShowMain::openData()
00417 {
00418    const char* kRootType[] = {"ROOT files","*.root", 0, 0};
00419    TGFileInfo fi;
00420    fi.fFileTypes = kRootType;
00421    /* this is how things used to be done:
00422       fi.fIniDir = ".";
00423       this is bad because the destructor calls delete[] on fIniDir.
00424     */
00425    fi.fIniDir = new char[128];
00426    strncpy(fi.fIniDir, ".", 127);  
00427    guiManager()->updateStatus("waiting for data file ...");
00428    new TGFileDialog(gClient->GetDefaultRoot(), guiManager()->getMainFrame(), kFDOpen, &fi);
00429    guiManager()->updateStatus("loading file ...");
00430    if (fi.fFilename) {
00431       m_navigator->openFile(fi.fFilename);
00432       m_loadedAnyInputFile = true;
00433       m_navigator->firstEvent();
00434       checkPosition();
00435       draw();
00436    }
00437    guiManager()->clearStatus();
00438 }
00439 
00440 void CmsShowMain::appendData()
00441 {
00442    const char* kRootType[] = {"ROOT files","*.root", 0, 0};
00443    TGFileInfo fi;
00444    fi.fFileTypes = kRootType;
00445    /* this is how things used to be done:
00446       fi.fIniDir = ".";
00447       this is bad because the destructor calls delete[] on fIniDir.
00448    */
00449    fi.fIniDir = new char[128];
00450    strncpy(fi.fIniDir,  ".", 127);
00451    guiManager()->updateStatus("waiting for data file ...");
00452    new TGFileDialog(gClient->GetDefaultRoot(), guiManager()->getMainFrame(), kFDOpen, &fi);
00453    guiManager()->updateStatus("loading file ...");
00454    if (fi.fFilename) {
00455       m_navigator->appendFile(fi.fFilename, false, false);
00456       m_loadedAnyInputFile = true;
00457       checkPosition();
00458       draw();
00459       guiManager()->titleChanged(m_navigator->frameTitle());
00460    }
00461    guiManager()->clearStatus();
00462 }
00463 
00464 void
00465 CmsShowMain::openDataViaURL()
00466 {
00467    if (m_searchFiles.get() == 0) {
00468       m_searchFiles = std::auto_ptr<CmsShowSearchFiles>(new CmsShowSearchFiles("",
00469                                                                                "Open Remote Data Files",
00470                                                                                guiManager()->getMainFrame(),
00471                                                                                500, 400));
00472       m_searchFiles->CenterOnParent(kTRUE,TGTransientFrame::kBottomRight);
00473    }
00474    std::string chosenFile = m_searchFiles->chooseFileFromURL();
00475    if(!chosenFile.empty()) {
00476       guiManager()->updateStatus("loading file ...");
00477       if(m_navigator->openFile(chosenFile.c_str())) {
00478          m_navigator->firstEvent();
00479          checkPosition();
00480          draw();
00481          guiManager()->clearStatus();
00482       } else {
00483          guiManager()->updateStatus("failed to load data file");
00484       }
00485    }
00486 }
00487 
00488 //
00489 // const member functions
00490 //
00491 
00492 //_______________________________________________________________________________
00493 void 
00494 CmsShowMain::autoLoadNewEvent()
00495 {
00496    stopAutoLoadTimer();
00497    
00498    // case when start with no input file
00499    if (!m_loadedAnyInputFile)
00500    {
00501       if (m_monitor.get()) 
00502          startAutoLoadTimer();
00503       return;
00504    }
00505 
00506    bool reachedEnd = (forward() && m_navigator->isLastEvent()) || (!forward() && m_navigator->isFirstEvent());
00507 
00508    if (loop() && reachedEnd)
00509    {
00510       forward() ? m_navigator->firstEvent() : m_navigator->lastEvent();
00511       draw();
00512    }
00513    else if (!reachedEnd)
00514    {
00515       forward() ? m_navigator->nextEvent() : m_navigator->previousEvent();
00516       draw();
00517    }
00518 
00519    // stop loop in case no loop or monitor mode
00520    if (reachedEnd && (loop() || m_monitor.get()) == kFALSE)
00521    {
00522       if (forward() && m_navigator->isLastEvent())
00523       {
00524          guiManager()->enableActions();
00525          checkPosition();
00526       }
00527 
00528       if ((!forward()) && m_navigator->isFirstEvent())
00529       {
00530          guiManager()->enableActions();
00531          checkPosition();
00532       }
00533    }
00534    else
00535       startAutoLoadTimer();
00536 }
00537 
00538 //______________________________________________________________________________
00539 
00540 void 
00541 CmsShowMain::checkPosition()
00542 {
00543    if ((m_monitor.get() || loop() ) && isPlaying())
00544       return;
00545    
00546    guiManager()->getMainFrame()->enableNavigatorControls();
00547 
00548    if (m_navigator->isFirstEvent())
00549       guiManager()->disablePrevious();
00550 
00551    if (m_navigator->isLastEvent())
00552    {
00553       guiManager()->disableNext();
00554       // force enable play events action in --port mode
00555       if (m_monitor.get() && !guiManager()->playEventsAction()->isEnabled())
00556          guiManager()->playEventsAction()->enable();
00557    }
00558 }
00559 
00560 //==============================================================================
00561 void
00562 CmsShowMain::setupDataHandling()
00563 {
00564    guiManager()->updateStatus("Setting up data handling...");
00565 
00566 
00567    // navigator filtering  ->
00568    m_navigator->fileChanged_.connect(boost::bind(&CmsShowMain::fileChangedSlot, this, _1));
00569    m_navigator->editFiltersExternally_.connect(boost::bind(&FWGUIManager::updateEventFilterEnable, guiManager(), _1));
00570    m_navigator->filterStateChanged_.connect(boost::bind(&CmsShowMain::navigatorChangedFilterState, this, _1));
00571    m_navigator->postFiltering_.connect(boost::bind(&CmsShowMain::postFiltering, this));
00572 
00573    // navigator fitlering <-
00574    guiManager()->showEventFilterGUI_.connect(boost::bind(&CmsShowNavigator::showEventFilterGUI, m_navigator.get(),_1));
00575    guiManager()->filterButtonClicked_.connect(boost::bind(&CmsShowMain::filterButtonClicked,this));
00576 
00577    // Data handling. File related and therefore not in the base class.
00578    if (guiManager()->getAction(cmsshow::sOpenData)    != 0) 
00579       guiManager()->getAction(cmsshow::sOpenData)->activated.connect(sigc::mem_fun(*this, &CmsShowMain::openData));
00580    if (guiManager()->getAction(cmsshow::sAppendData)  != 0) 
00581       guiManager()->getAction(cmsshow::sAppendData)->activated.connect(sigc::mem_fun(*this, &CmsShowMain::appendData));
00582    if (guiManager()->getAction(cmsshow::sSearchFiles) != 0)
00583       guiManager()->getAction(cmsshow::sSearchFiles)->activated.connect(sigc::mem_fun(*this, &CmsShowMain::openDataViaURL));
00584 
00585    setupActions();
00586    // init data from  CmsShowNavigator configuration, can do this with signals since there were not connected yet
00587    guiManager()->setFilterButtonIcon(m_navigator->getFilterState());
00588 
00589    for (unsigned int ii = 0; ii < m_inputFiles.size(); ++ii)
00590    {
00591       const std::string& fname = m_inputFiles[ii];
00592       if (fname.empty())
00593          continue;
00594       guiManager()->updateStatus("loading data file ...");
00595       if (!m_navigator->appendFile(fname, false, false))
00596       {
00597          guiManager()->updateStatus("failed to load data file");
00598          openData();
00599       }
00600       else
00601       {
00602          m_loadedAnyInputFile = true;
00603 
00604       }
00605    }
00606 
00607    if (m_loadedAnyInputFile)
00608    {
00609       m_navigator->firstEvent();
00610       checkPosition();
00611       draw();
00612    }
00613    else if (m_monitor.get() == 0)
00614       openData();
00615 }
00616 
00617 void
00618 CmsShowMain::setupSocket(unsigned int iSocket)
00619 {
00620    m_monitor = std::auto_ptr<TMonitor>(new TMonitor);
00621    TServerSocket* server = new TServerSocket(iSocket,kTRUE);
00622    if (server->GetErrorCode())
00623    {
00624       fwLog(fwlog::kError) << "CmsShowMain::setupSocket, can't create socket on port "<< iSocket << "." << std::endl;
00625       exit(0);
00626    }    
00627    m_monitor->Add(server);
00628 }
00629 
00630 void
00631 CmsShowMain::connectSocket()
00632 {
00633   m_monitor->Connect("Ready(TSocket*)","CmsShowMain",this,"notified(TSocket*)");
00634 
00635 }
00636 
00637 void
00638 CmsShowMain::notified(TSocket* iSocket)
00639 {
00640    TServerSocket* server = dynamic_cast<TServerSocket*> (iSocket);
00641    if (server)
00642    {
00643       TSocket* connection = server->Accept();
00644       if (connection)
00645       {
00646          m_monitor->Add(connection);
00647          std::stringstream s;
00648          s << "received connection from "<<iSocket->GetInetAddress().GetHostName();
00649          guiManager()->updateStatus(s.str().c_str());
00650       }
00651    }
00652    else
00653    {
00654       char buffer[4096];
00655       memset(buffer,0,sizeof(buffer));
00656       if (iSocket->RecvRaw(buffer, sizeof(buffer)) <= 0)
00657       {
00658          m_monitor->Remove(iSocket);
00659          //std::stringstream s;
00660          //s << "closing connection to "<<iSocket->GetInetAddress().GetHostName();
00661          //m_guiManager->updateStatus(s.str().c_str());
00662          delete iSocket;
00663          return;
00664       }
00665       std::string fileName(buffer);
00666       std::string::size_type lastNonSpace = fileName.find_last_not_of(" \n\t");
00667       if (lastNonSpace != std::string::npos)
00668       {
00669          fileName.erase(lastNonSpace+1);
00670       }
00671 
00672       std::stringstream s;
00673       s <<"New file notified '"<<fileName<<"'";
00674       guiManager()->updateStatus(s.str().c_str());
00675 
00676       bool appended = m_navigator->appendFile(fileName, true, m_live);
00677 
00678       if (appended)
00679       {
00680          if (m_live && isPlaying() && forward())
00681             m_navigator->activateNewFileOnNextEvent();
00682          else if (!isPlaying())
00683             checkPosition();
00684 
00685          // bootstrap case: --port  and no input file
00686          if (!m_loadedAnyInputFile)
00687          {
00688             m_loadedAnyInputFile = true;
00689             m_navigator->firstEvent();
00690             if (!isPlaying())
00691                draw();
00692          }
00693 
00694          std::stringstream sr;
00695          sr <<"New file registered '"<<fileName<<"'";
00696          guiManager()->updateStatus(sr.str().c_str());
00697       }
00698       else
00699       {
00700          std::stringstream sr;
00701          sr <<"New file NOT registered '"<<fileName<<"'";
00702          guiManager()->updateStatus(sr.str().c_str());
00703       }
00704    }
00705 }
00706 
00707 void
00708 CmsShowMain::stopPlaying()
00709 {
00710    stopAutoLoadTimer();
00711    if (m_live)
00712       m_navigator->resetNewFileOnNextEvent();
00713    setIsPlaying(false);
00714    guiManager()->enableActions();
00715    checkPosition();
00716 }
00717 
00718 void
00719 CmsShowMain::navigatorChangedFilterState(int state)
00720 {
00721    guiManager()->setFilterButtonIcon(state);
00722    if (m_navigator->filesNeedUpdate() == false)
00723    {
00724       guiManager()->setFilterButtonText(m_navigator->filterStatusMessage());
00725       checkPosition();
00726    }
00727 }
00728 
00729 void
00730 CmsShowMain::filterButtonClicked()
00731 {
00732    if (m_navigator->getFilterState() == CmsShowNavigator::kWithdrawn )
00733       guiManager()->showEventFilterGUI();
00734    else
00735       m_navigator->toggleFilterEnable();
00736 }
00737 
00738 void
00739 CmsShowMain::preFiltering()
00740 {
00741    // called only if filter has changed
00742    guiManager()->updateStatus("Filtering events");
00743 }
00744 
00745 void
00746 CmsShowMain::postFiltering()
00747 {
00748    // called only filter is changed
00749    guiManager()->clearStatus();
00750    draw();
00751    checkPosition();
00752    guiManager()->setFilterButtonText(m_navigator->filterStatusMessage());
00753 }
00754 
00755 //______________________________________________________________________________
00756 
00757 void
00758 CmsShowMain::setLiveMode()
00759 {
00760    m_live = true;
00761    m_liveTimer.reset(new SignalTimer());
00762    m_liveTimer->timeout_.connect(boost::bind(&CmsShowMain::checkLiveMode,this));
00763 
00764    Window_t rootw, childw;
00765    Int_t root_x, root_y, win_x, win_y;
00766    UInt_t mask;
00767    gVirtualX->QueryPointer(gClient->GetDefaultRoot()->GetId(),
00768                            rootw, childw,
00769                            root_x, root_y,
00770                            win_x, win_y,
00771                            mask);
00772 
00773 
00774    m_liveTimer->SetTime(m_liveTimeout);
00775    m_liveTimer->Reset();
00776    m_liveTimer->TurnOn();
00777 }
00778 
00779 void
00780 CmsShowMain::checkLiveMode()
00781 {
00782    m_liveTimer->TurnOff();
00783 
00784    Window_t rootw, childw;
00785    Int_t root_x, root_y, win_x, win_y;
00786    UInt_t mask;
00787    gVirtualX->QueryPointer(gClient->GetDefaultRoot()->GetId(),
00788                            rootw, childw,
00789                            root_x, root_y,
00790                            win_x, win_y,
00791                            mask);
00792 
00793 
00794    if ( !isPlaying() &&
00795         m_lastPointerPositionX == root_x && 
00796         m_lastPointerPositionY == root_y )
00797    {
00798       guiManager()->playEventsAction()->switchMode();
00799    }
00800 
00801    m_lastPointerPositionX = root_x;
00802    m_lastPointerPositionY = root_y;
00803 
00804 
00805    m_liveTimer->SetTime((Long_t)(m_liveTimeout));
00806    m_liveTimer->Reset();
00807    m_liveTimer->TurnOn();
00808 }