00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
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
00176
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
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
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
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
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
00246
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
00265
00266 CmsShowTaskExecutor::TaskFunctor f;
00267
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
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
00360 m_context->deleteEveElements();
00361 guiManager()->evePreTerminate();
00362
00363
00364
00365 gSystem->Sleep(151);
00366 gSystem->ProcessEvents();
00367 gSystem->ExitLoop();
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
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
00414 }
00415
00416 void CmsShowMain::openData()
00417 {
00418 const char* kRootType[] = {"ROOT files","*.root", 0, 0};
00419 TGFileInfo fi;
00420 fi.fFileTypes = kRootType;
00421
00422
00423
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
00446
00447
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
00490
00491
00492
00493 void
00494 CmsShowMain::autoLoadNewEvent()
00495 {
00496 stopAutoLoadTimer();
00497
00498
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
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
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
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
00574 guiManager()->showEventFilterGUI_.connect(boost::bind(&CmsShowNavigator::showEventFilterGUI, m_navigator.get(),_1));
00575 guiManager()->filterButtonClicked_.connect(boost::bind(&CmsShowMain::filterButtonClicked,this));
00576
00577
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
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
00660
00661
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
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
00742 guiManager()->updateStatus("Filtering events");
00743 }
00744
00745 void
00746 CmsShowMain::postFiltering()
00747 {
00748
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 }