CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CmsShowMain.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Core
4 // Class : CmsShowMain
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author:
10 // Created: Mon Dec 3 08:38:38 PST 2007
11 //
12 
13 // system include files
14 #include <sstream>
15 #include <boost/bind.hpp>
16 #include <boost/program_options.hpp>
17 #include <string.h>
18 
19 #include "TSystem.h"
20 #include "TGLWidget.h"
21 #include "TTimer.h"
22 #include "TROOT.h"
23 #include "TGFileDialog.h"
24 #include "TGMsgBox.h"
25 #include "TMonitor.h"
26 #include "TServerSocket.h"
27 #include "TEveLine.h"
28 #include "TEveManager.h"
29 #include "TFile.h"
30 #include "TGClient.h"
31 
33 
35 
49 
54 
56 
60 
62 
64 
65 #if defined(R__LINUX)
66 #include "TGX11.h" // !!!! AMT has to be at the end to pass build
67 #include "X11/Xlib.h"
68 #endif
69 //
70 // constants, enums and typedefs
71 //
72 
73 static const char* const kInputFilesOpt = "input-files";
74 static const char* const kInputFilesCommandOpt = "input-files,i";
75 static const char* const kConfigFileOpt = "config-file";
76 static const char* const kConfigFileCommandOpt = "config-file,c";
77 static const char* const kGeomFileOpt = "geom-file";
78 static const char* const kGeomFileCommandOpt = "geom-file,g";
79 static const char* const kSimGeomFileOpt = "sim-geom-file";
80 static const char* const kSimGeomFileCommandOpt= "sim-geom-file";
81 static const char* const kNoConfigFileOpt = "noconfig";
82 static const char* const kNoConfigFileCommandOpt = "noconfig,n";
83 static const char* const kPlayOpt = "play";
84 static const char* const kPlayCommandOpt = "play,p";
85 static const char* const kLoopOpt = "loop";
86 static const char* const kLoopCommandOpt = "loop";
87 static const char* const kLogLevelCommandOpt = "log";
88 static const char* const kLogLevelOpt = "log";
89 static const char* const kEveOpt = "eve";
90 static const char* const kEveCommandOpt = "eve";
91 static const char* const kAdvancedRenderOpt = "shine";
92 static const char* const kAdvancedRenderCommandOpt = "shine,s";
93 static const char* const kHelpOpt = "help";
94 static const char* const kHelpCommandOpt = "help,h";
95 static const char* const kSoftCommandOpt = "soft";
96 static const char* const kPortCommandOpt = "port";
97 static const char* const kPlainRootCommandOpt = "prompt";
98 static const char* const kRootInteractiveCommandOpt = "root-interactive,r";
99 static const char* const kChainCommandOpt = "chain";
100 static const char* const kLiveCommandOpt = "live";
101 static const char* const kFieldCommandOpt = "field";
102 static const char* const kFreePaletteCommandOpt = "free-palette";
103 static const char* const kAutoSaveAllViews = "auto-save-all-views";
104 static const char* const kEnableFPE = "enable-fpe";
105 static const char* const kZeroWinOffsets = "zero-window-offsets";
106 static const char* const kNoVersionCheck = "no-version-check";
107 
108 
109 //
110 // constructors and destructor
111 //
113  : CmsShowMainBase(),
114  m_navigator(new CmsShowNavigator(*this)),
115  m_metadataManager(new FWLiteJobMetadataManager()),
116  m_context(new fireworks::Context(changeManager(),
117  selectionManager(),
118  eiManager(),
119  colorManager(),
120  m_metadataManager.get())),
121  m_loadedAnyInputFile(false),
122  m_openFile(0),
123  m_live(false),
124  m_liveTimer(new SignalTimer()),
125  m_liveTimeout(600000),
126  m_lastXEventSerial(0),
127  m_noVersionCheck(false)
128 {
129  try {
130  TGLWidget* w = TGLWidget::Create(gClient->GetDefaultRoot(), kTRUE, kTRUE, 0, 10, 10);
131  delete w;
132  }
133  catch (std::exception& iException) {
134  fwLog(fwlog::kError) << "Failed creating an OpenGL window: " << iException.what() << "\n"
135  "Things to check:\n"
136  "- Is DISPLAY environment variable set?\n"
137  "- Are OpenGL libraries installed?\n"
138  "- If running remotely, make sure you use 'ssh -X' or 'ssh -Y'.\n"
139  "See also: https://twiki.cern.ch/twiki/bin/viewauth/CMS/WorkBookFireworks\n";
140  gSystem->Exit(1);
141  }
142 
143  eiManager()->setContext(m_context.get());
144 
145 
146  std::string descString(argv[0]);
147  descString += " [options] <data file>\nGeneral";
148 
149  namespace po = boost::program_options;
150  po::options_description desc(descString);
151  desc.add_options()
152  (kInputFilesCommandOpt, po::value< std::vector<std::string> >(), "Input root files")
153  (kConfigFileCommandOpt, po::value<std::string>(), "Include configuration file")
154  (kNoConfigFileCommandOpt, "Empty configuration")
155  (kNoVersionCheck, "No file version check")
156  (kGeomFileCommandOpt, po::value<std::string>(), "Include geometry file")
157  (kSimGeomFileCommandOpt,po::value<std::string>(), "Set simulation geometry file to browser")
158  (kFieldCommandOpt, po::value<double>(), "Set magnetic field value explicitly. Default is auto-field estimation")
159  (kRootInteractiveCommandOpt, "Enable root interactive prompt")
160  (kSoftCommandOpt, "Try to force software rendering to avoid problems with bad hardware drivers")
161  (kHelpCommandOpt, "Display help message");
162 
163  po::options_description livedesc("Live Event Display");
164  livedesc.add_options()
165  (kPlayCommandOpt, po::value<float>(), "Start in play mode with given interval between events in seconds")
166  (kPortCommandOpt, po::value<unsigned int>(), "Listen to port for new data files to open")
167  (kLoopCommandOpt, "Loop events in play mode")
168  (kChainCommandOpt, po::value<unsigned int>(), "Chain up to a given number of recently open files. Default is 1 - no chain")
169  (kLiveCommandOpt, "Enforce playback mode if a user is not using display")
170  (kAutoSaveAllViews, po::value<std::string>(), "Auto-save all views with given prefix (run_event_lumi_view.png is appended)");
171 
172  po::options_description debugdesc("Debug");
173  debugdesc.add_options()
174  (kLogLevelCommandOpt, po::value<unsigned int>(), "Set log level starting from 0 to 4 : kDebug, kInfo, kWarning, kError")
175  (kEveCommandOpt, "Show TEveBrowser to help debug problems")
176  (kEnableFPE, "Enable detection of floating-point exceptions");
177 
178 
179  po::options_description rnrdesc("Appearance");
180  rnrdesc.add_options()
181  (kFreePaletteCommandOpt, "Allow free color selection (requires special configuration!)")
182  (kZeroWinOffsets, "Disable auto-detection of window position offsets")
183  (kAdvancedRenderCommandOpt, "Enable line anti-aliasing");
184  po::positional_options_description p;
185  p.add(kInputFilesOpt, -1);
186 
187 
188  po::options_description hiddendesc("hidden");
189  hiddendesc.add_options();
190 
191  po::options_description all("");
192  all.add(desc).add(rnrdesc).add(livedesc).add(debugdesc);
193 
194 
195  int newArgc = argc;
196  char **newArgv = argv;
197  po::variables_map vm;
198  try{
199  po::store(po::command_line_parser(newArgc, newArgv).
200  options(all).positional(p).run(), vm);
201 
202  po::notify(vm);
203  }
204  catch ( const std::exception& e)
205  {
206  // Return with exit status 0 to avoid generating crash reports
207 
208  fwLog(fwlog::kError) << e.what() << std::endl;
209  std::cout << all <<std::endl;
210  exit(0);
211  }
212 
213  if(vm.count(kHelpOpt)) {
214  std::cout << all <<std::endl;
215  exit(0);
216  }
217 
218  if(vm.count(kLogLevelOpt)) {
219  fwlog::LogLevel level = (fwlog::LogLevel)(vm[kLogLevelOpt].as<unsigned int>());
221  }
222 
223  if(vm.count(kPlainRootCommandOpt)) {
224  fwLog(fwlog::kInfo) << "Plain ROOT prompt requested" << std::endl;
225  return;
226  }
227 
228  const char* cmspath = gSystem->Getenv("CMSSW_BASE");
229  if(0 == cmspath) {
230  throw std::runtime_error("CMSSW_BASE environment variable not set");
231  }
232 
233  // input file
234  if (vm.count(kInputFilesOpt)) {
235  m_inputFiles = vm[kInputFilesOpt].as< std::vector<std::string> >();
236  }
237 
238  if (!m_inputFiles.size())
239  fwLog(fwlog::kInfo) << "No data file given." << std::endl;
240  else if (m_inputFiles.size() == 1)
241  fwLog(fwlog::kInfo) << "Input " << m_inputFiles.front() << std::endl;
242  else
243  fwLog(fwlog::kInfo) << m_inputFiles.size() << " input files; first: " << m_inputFiles.front() << ", last: " << m_inputFiles.back() << std::endl;
244 
245  // configuration file
246  if (vm.count(kConfigFileOpt)) {
247  setConfigFilename(vm[kConfigFileOpt].as<std::string>());
248  if (access(configFilename(), R_OK) == -1)
249  {
250  fwLog(fwlog::kError) << "Specified configuration file does not exist. Quitting.\n";
251  exit(0);
252  }
253  } else {
254  if (vm.count(kNoConfigFileOpt)) {
255  fwLog(fwlog::kInfo) << "No configuration is loaded, show everything.\n";
256  setConfigFilename("");
257  } else
258  setConfigFilename("default.fwc");
259  }
260  fwLog(fwlog::kInfo) << "Config " << configFilename() << std::endl;
261 
262  // geometry
263  if (vm.count(kGeomFileOpt)) {
264  setGeometryFilename(vm[kGeomFileOpt].as<std::string>());
265  } else {
266  // fwLog(fwlog::kInfo) << "No geom file name. Choosing default.\n";
267  setGeometryFilename("cmsGeom10.root");
268  }
269  fwLog(fwlog::kInfo) << "Geometry file " << geometryFilename() << "\n";
270 
271  if (vm.count(kSimGeomFileOpt)) {
272  setSimGeometryFilename(vm[kSimGeomFileOpt].as<std::string>());
273  } else {
274  setSimGeometryFilename("cmsSimGeom-14.root");
275  }
276  // Free-palette palette
277  if (vm.count(kFreePaletteCommandOpt)) {
279  fwLog(fwlog::kInfo) << "Palette restriction removed on user request!\n";
280  }
281  bool eveMode = vm.count(kEveOpt);
282 
283  //Delay creating guiManager and enabling autoloading until here so that if we have a 'help' request we don't
284  // open any graphics or build dictionaries
286 
287  TEveManager::Create(kFALSE, "FIV");
288 
289  setup(m_navigator.get(), m_context.get(), m_metadataManager.get());
290 
291  if (vm.count(kZeroWinOffsets))
292  {
294  fwLog(fwlog::kInfo) << "Window offsets reset on user request!\n";
295  }
296 
297  if ( vm.count(kAdvancedRenderOpt) )
298  {
299  TEveLine::SetDefaultSmooth(kTRUE);
300  }
301 
302  //figure out where to find macros
303  //tell ROOT where to find our macros
305  // first check if port is not occupied
306  if (vm.count(kPortCommandOpt)) {
307  f=boost::bind(&CmsShowMain::setupSocket, this, vm[kPortCommandOpt].as<unsigned int>());
308  startupTasks()->addTask(f);
309  }
310 
311  f=boost::bind(&CmsShowMainBase::loadGeometry,this);
312  startupTasks()->addTask(f);
313  f=boost::bind(&CmsShowMainBase::setupViewManagers,this);
314  startupTasks()->addTask(f);
315  f=boost::bind(&CmsShowMainBase::setupConfiguration,this);
316  startupTasks()->addTask(f);
317  f=boost::bind(&CmsShowMain::setupDataHandling,this);
318  startupTasks()->addTask(f);
319 
320  if (vm.count(kLoopOpt))
321  setPlayLoop();
322 
323  if (eveMode) {
324  f = boost::bind(&CmsShowMainBase::setupDebugSupport,this);
325  startupTasks()->addTask(f);
326  }
327  if(vm.count(kChainCommandOpt)) {
328  f = boost::bind(&CmsShowNavigator::setMaxNumberOfFilesToChain, m_navigator.get(), vm[kChainCommandOpt].as<unsigned int>());
329  startupTasks()->addTask(f);
330  }
331  if (vm.count(kPlayOpt)) {
332  f = boost::bind(&CmsShowMainBase::setupAutoLoad, this, vm[kPlayOpt].as<float>());
333  startupTasks()->addTask(f);
334  }
335 
336  if(vm.count(kLiveCommandOpt))
337  {
338  f = boost::bind(&CmsShowMain::setLiveMode, this);
339  startupTasks()->addTask(f);
340  }
341 
342  if(vm.count(kFieldCommandOpt))
343  {
344  m_context->getField()->setSource(FWMagField::kUser);
345  m_context->getField()->setUserField(vm[kFieldCommandOpt].as<double>());
346  }
347  if(vm.count(kAutoSaveAllViews)) {
349  fmt += "%u_%u_%u_%s.png";
351  }
352  if(vm.count(kNoVersionCheck)) {
353  m_noVersionCheck=true;
354  }
355  if(vm.count(kEnableFPE)) {
356  gSystem->SetFPEMask();
357  }
358 
359  if (vm.count(kPortCommandOpt)) {
360  f=boost::bind(&CmsShowMain::connectSocket, this);
361  startupTasks()->addTask(f);
362  }
363 
365 }
366 
367 //
368 // Destruction
369 //
370 
372 {
373  //avoids a seg fault from eve which happens if eve is terminated after the GUI is gone
375 }
376 
377 class DieTimer : public TTimer
378 {
379 protected:
381 public:
382  DieTimer(CmsShowMain* app) : TTimer(), fApp(app)
383  {
384  Start(0, kTRUE);
385  }
386 
387  virtual Bool_t Notify() override
388  {
389  TurnOff();
390  fApp->doExit();
391  delete this;
392  return kFALSE;
393  }
394 };
395 
397 {
398  new DieTimer(this);
399 }
400 
402 {
403  // pre terminate eve
404  m_context->deleteEveElements();
406 
407  // sleep at least 150 ms
408  // windows in ROOT GUI are destroyed in 150 ms timeout after
409  gSystem->Sleep(151);
410  gSystem->ProcessEvents();
411  gSystem->ExitLoop();
412 }
413 
414 //
415 // assignment operators
416 //
417 // const CmsShowMain& CmsShowMain::operator=(const CmsShowMain& rhs)
418 // {
419 // //An exception safe implementation is
420 // CmsShowMain temp(rhs);
421 // swap(rhs);
422 //
423 // return *this;
424 // }
425 
426 //
427 // member functions
428 //
429 
430 const fwlite::Event*
432 {
433  if (m_navigator.get())
434  return static_cast<const fwlite::Event*>(m_navigator->getCurrentEvent());
435  return 0;
436 }
437 
438 void
440 {
441  m_openFile = file;
442  if (file)
443  guiManager()->titleChanged(m_navigator->frameTitle());
444 
446 }
447 
448 void
450 {
452  guiManager()->titleChanged(m_navigator->frameTitle());
454 }
455 
457  //printf("Need to reset\n");
458 }
459 
461 {
462  const char* kRootType[] = {"ROOT files","*.root", 0, 0};
463  TGFileInfo fi;
464  fi.fFileTypes = kRootType;
465  /* this is how things used to be done:
466  fi.fIniDir = ".";
467  this is bad because the destructor calls delete[] on fIniDir.
468  */
469  fi.fIniDir = new char[128];
470  strncpy(fi.fIniDir, ".", 127);
471  guiManager()->updateStatus("waiting for data file ...");
472  new TGFileDialog(gClient->GetDefaultRoot(), guiManager()->getMainFrame(), kFDOpen, &fi);
473  guiManager()->updateStatus("loading file ...");
474  if (fi.fFilename) {
475  m_navigator->openFile(fi.fFilename);
476  m_loadedAnyInputFile = true;
477  m_navigator->firstEvent();
478  checkPosition();
479  draw();
480  }
481  guiManager()->clearStatus();
482 }
483 
485 {
486  const char* kRootType[] = {"ROOT files","*.root", 0, 0};
487  TGFileInfo fi;
488  fi.fFileTypes = kRootType;
489  /* this is how things used to be done:
490  fi.fIniDir = ".";
491  this is bad because the destructor calls delete[] on fIniDir.
492  */
493  fi.fIniDir = new char[128];
494  strncpy(fi.fIniDir, ".", 127);
495  guiManager()->updateStatus("waiting for data file ...");
496  new TGFileDialog(gClient->GetDefaultRoot(), guiManager()->getMainFrame(), kFDOpen, &fi);
497  guiManager()->updateStatus("loading file ...");
498  if (fi.fFilename) {
499  m_navigator->appendFile(fi.fFilename, false, false);
500  m_loadedAnyInputFile = true;
501  checkPosition();
502  draw();
503  guiManager()->titleChanged(m_navigator->frameTitle());
504  }
505  guiManager()->clearStatus();
506 }
507 
508 void
510 {
511  if (m_searchFiles.get() == 0) {
512  m_searchFiles = std::auto_ptr<CmsShowSearchFiles>(new CmsShowSearchFiles("",
513  "Open Remote Data Files",
514  guiManager()->getMainFrame(),
515  500, 400));
516  m_searchFiles->CenterOnParent(kTRUE,TGTransientFrame::kBottomRight);
517  }
518  std::string chosenFile = m_searchFiles->chooseFileFromURL();
519  if(!chosenFile.empty()) {
520  guiManager()->updateStatus("loading file ...");
521  if(m_navigator->openFile(chosenFile.c_str())) {
522  m_loadedAnyInputFile = true;
523  m_navigator->firstEvent();
524  checkPosition();
525  draw();
526  guiManager()->clearStatus();
527  } else {
528  guiManager()->updateStatus("failed to load data file");
529  }
530  }
531 }
532 
533 //
534 // const member functions
535 //
536 
537 //_______________________________________________________________________________
538 void
540 {
542 
543  // case when start with no input file
545  {
546  if (m_monitor.get())
548  return;
549  }
550 
551  bool reachedEnd = (forward() && m_navigator->isLastEvent()) || (!forward() && m_navigator->isFirstEvent());
552 
553  if (loop() && reachedEnd)
554  {
555  forward() ? m_navigator->firstEvent() : m_navigator->lastEvent();
556  draw();
557  }
558  else if (!reachedEnd)
559  {
560  forward() ? m_navigator->nextEvent() : m_navigator->previousEvent();
561  draw();
562  }
563 
564  // stop loop in case no loop or monitor mode
565  if (reachedEnd && (loop() || m_monitor.get()) == kFALSE)
566  {
567  if (forward() && m_navigator->isLastEvent())
568  {
570  checkPosition();
571  }
572 
573  if ((!forward()) && m_navigator->isFirstEvent())
574  {
576  checkPosition();
577  }
578  }
579  else
581 }
582 
583 //______________________________________________________________________________
584 
585 void
587 {
588  if ((m_monitor.get() || loop() ) && isPlaying())
589  return;
590 
592 
593  if (m_navigator->isFirstEvent())
595 
596  if (m_navigator->isLastEvent())
597  {
598  guiManager()->disableNext();
599  // force enable play events action in --port mode
600  if (m_monitor.get() && !guiManager()->playEventsAction()->isEnabled())
602  }
603 }
604 
605 //==============================================================================
606 void
608 {
609  guiManager()->updateStatus("Setting up data handling...");
610 
611 
612  // navigator filtering ->
613  m_navigator->fileChanged_.connect(boost::bind(&CmsShowMain::fileChangedSlot, this, _1));
614  m_navigator->editFiltersExternally_.connect(boost::bind(&FWGUIManager::updateEventFilterEnable, guiManager(), _1));
615  m_navigator->filterStateChanged_.connect(boost::bind(&CmsShowMain::navigatorChangedFilterState, this, _1));
616  m_navigator->postFiltering_.connect(boost::bind(&CmsShowMain::postFiltering, this, _1));
617 
618  // navigator fitlering <-
621 
622  // Data handling. File related and therefore not in the base class.
623  if (guiManager()->getAction(cmsshow::sOpenData) != 0)
624  guiManager()->getAction(cmsshow::sOpenData)->activated.connect(sigc::mem_fun(*this, &CmsShowMain::openData));
625  if (guiManager()->getAction(cmsshow::sAppendData) != 0)
626  guiManager()->getAction(cmsshow::sAppendData)->activated.connect(sigc::mem_fun(*this, &CmsShowMain::appendData));
627  if (guiManager()->getAction(cmsshow::sSearchFiles) != 0)
629 
630  setupActions();
631  // init data from CmsShowNavigator configuration, can do this with signals since there were not connected yet
632  guiManager()->setFilterButtonIcon(m_navigator->getFilterState());
633 
634  for (unsigned int ii = 0; ii < m_inputFiles.size(); ++ii)
635  {
636  const std::string& fname = m_inputFiles[ii];
637  if (fname.empty())
638  continue;
639  guiManager()->updateStatus("loading data file ...");
640  if (!m_navigator->appendFile(fname, false, false))
641  {
642  guiManager()->updateStatus("failed to load data file");
643  }
644  else
645  {
646  m_loadedAnyInputFile = true;
647 
648  }
649  }
650 
652  {
653  m_navigator->firstEvent();
654  checkPosition();
655  draw();
656  }
657  else if (m_monitor.get() == 0 && (eiManager()->begin() != eiManager()->end()) )
658  {
659  if (m_inputFiles.empty())
660  openDataViaURL();
661  else
662  openData();
663  }
664 }
665 
666 void
667 CmsShowMain::setupSocket(unsigned int iSocket)
668 {
669  m_monitor = std::auto_ptr<TMonitor>(new TMonitor);
670  TServerSocket* server = new TServerSocket(iSocket,kTRUE);
671  if (server->GetErrorCode())
672  {
673  fwLog(fwlog::kError) << "CmsShowMain::setupSocket, can't create socket on port "<< iSocket << "." << std::endl;
674  exit(0);
675  }
676  m_monitor->Add(server);
677 }
678 
679 void
681 {
682  m_monitor->Connect("Ready(TSocket*)","CmsShowMain",this,"notified(TSocket*)");
683 
684 }
685 
686 void
687 CmsShowMain::notified(TSocket* iSocket)
688 {
689  TServerSocket* server = dynamic_cast<TServerSocket*> (iSocket);
690  if (server)
691  {
692  TSocket* connection = server->Accept();
693  if (connection)
694  {
695  m_monitor->Add(connection);
696  std::stringstream s;
697  s << "received connection from "<<iSocket->GetInetAddress().GetHostName();
698  guiManager()->updateStatus(s.str().c_str());
699  }
700  }
701  else
702  {
703  char buffer[4096];
704  memset(buffer,0,sizeof(buffer));
705  if (iSocket->RecvRaw(buffer, sizeof(buffer)) <= 0)
706  {
707  m_monitor->Remove(iSocket);
708  //std::stringstream s;
709  //s << "closing connection to "<<iSocket->GetInetAddress().GetHostName();
710  //m_guiManager->updateStatus(s.str().c_str());
711  delete iSocket;
712  return;
713  }
714  std::string fileName(buffer);
715  std::string::size_type lastNonSpace = fileName.find_last_not_of(" \n\t");
716  if (lastNonSpace != std::string::npos)
717  {
718  fileName.erase(lastNonSpace+1);
719  }
720 
721  std::stringstream s;
722  s <<"New file notified '"<<fileName<<"'";
723  guiManager()->updateStatus(s.str().c_str());
724 
725  bool appended = m_navigator->appendFile(fileName, true, m_live);
726 
727  if (appended)
728  {
729  if (m_live && isPlaying() && forward())
730  m_navigator->activateNewFileOnNextEvent();
731  else if (!isPlaying())
732  checkPosition();
733 
734  // bootstrap case: --port and no input file
736  {
737  m_loadedAnyInputFile = true;
738  m_navigator->firstEvent();
739  if (!isPlaying())
740  draw();
741  }
742 
743  std::stringstream sr;
744  sr <<"New file registered '"<<fileName<<"'";
745  guiManager()->updateStatus(sr.str().c_str());
746  }
747  else
748  {
749  std::stringstream sr;
750  sr <<"New file NOT registered '"<<fileName<<"'";
751  guiManager()->updateStatus(sr.str().c_str());
752  }
753  }
754 }
755 
756 void
758 {
760  if (m_live)
761  m_navigator->resetNewFileOnNextEvent();
762  setIsPlaying(false);
764  checkPosition();
765 }
766 
767 void
769 {
771  if (m_navigator->filesNeedUpdate() == false)
772  {
773  guiManager()->setFilterButtonText(m_navigator->filterStatusMessage());
774  checkPosition();
775  }
776 }
777 
778 void
780 {
781  if (m_navigator->getFilterState() == CmsShowNavigator::kWithdrawn )
783  else
784  m_navigator->toggleFilterEnable();
785 }
786 
787 void
789 {
790  // called only if filter has changed
791  guiManager()->updateStatus("Filtering events");
792 }
793 
794 void
796 {
797  // called only filter is changed
798  guiManager()->clearStatus();
799  if (doDraw) draw();
800  checkPosition();
801  guiManager()->setFilterButtonText(m_navigator->filterStatusMessage());
802 }
803 
804 //______________________________________________________________________________
805 
806 void
808 {
809  m_live = true;
810  m_liveTimer.reset(new SignalTimer());
811  m_liveTimer->timeout_.connect(boost::bind(&CmsShowMain::checkLiveMode,this));
812 
813  Window_t rootw, childw;
814  Int_t root_x, root_y, win_x, win_y;
815  UInt_t mask;
816  gVirtualX->QueryPointer(gClient->GetDefaultRoot()->GetId(),
817  rootw, childw,
818  root_x, root_y,
819  win_x, win_y,
820  mask);
821 
822 
823  m_liveTimer->SetTime(m_liveTimeout);
824  m_liveTimer->Reset();
825  m_liveTimer->TurnOn();
826 }
827 
828 void
830 {
831  m_liveTimer->TurnOff();
832 
833 #if defined(R__LINUX)
834  TGX11 *x11 = dynamic_cast<TGX11*>(gVirtualX);
835  if (x11) {
836  XAnyEvent *ev = (XAnyEvent*) x11->GetNativeEvent();
837  // printf("serial %d \n",(int)ev->serial );
838 
839  if ( !isPlaying() && m_lastXEventSerial == ev->serial )
841  m_lastXEventSerial = ev->serial;
842  }
843 #endif
844  m_liveTimer->SetTime((Long_t)(m_liveTimeout));
845  m_liveTimer->Reset();
846  m_liveTimer->TurnOn();
847 }
DieTimer(CmsShowMain *app)
Definition: CmsShowMain.cc:382
void fileChangedSlot(const TFile *file)
Definition: CmsShowMain.cc:439
static const char *const kPlayCommandOpt
Definition: CmsShowMain.cc:84
static const char *const kNoVersionCheck
Definition: CmsShowMain.cc:106
void navigatorChangedFilterState(int)
Definition: CmsShowMain.cc:768
void openData()
Definition: CmsShowMain.cc:460
const fwlite::Event * getCurrentEvent() const
Definition: CmsShowMain.cc:431
CmsShowMain * fApp
Definition: CmsShowMain.cc:380
static const char *const kGeomFileCommandOpt
Definition: CmsShowMain.cc:78
void showEventFilterGUI(const TGWindow *p)
FWSelectionManager * selectionManager()
sigc::signal< void > filterButtonClicked_
Definition: FWGUIManager.h:205
static const char *const kChainCommandOpt
Definition: CmsShowMain.cc:99
static const char *const kAutoSaveAllViews
Definition: CmsShowMain.cc:103
bool m_loadedAnyInputFile
Definition: CmsShowMain.h:119
void resetInitialization()
Definition: CmsShowMain.cc:456
virtual void checkPosition()
Definition: CmsShowMain.cc:586
virtual void eventChangedImp()
Definition: CmsShowMain.cc:449
FWGUIManager * guiManager()
static const char *const kZeroWinOffsets
Definition: CmsShowMain.cc:105
void appendData()
Definition: CmsShowMain.cc:484
void preFiltering()
Definition: CmsShowMain.cc:788
void setupSocket(unsigned int)
Definition: CmsShowMain.cc:667
void setFilterButtonIcon(int)
void checkLiveMode()
Definition: CmsShowMain.cc:829
static const char *const kFieldCommandOpt
Definition: CmsShowMain.cc:101
void enable()
Definition: CSGAction.cc:284
FWEventItemsManager * eiManager()
sigc::signal< void > activated
Definition: CSGAction.h:88
static const char *const kLogLevelOpt
Definition: CmsShowMain.cc:88
static const char *const kSimGeomFileOpt
Definition: CmsShowMain.cc:79
std::auto_ptr< FWLiteJobMetadataManager > m_metadataManager
Definition: CmsShowMain.h:115
static const char *const kNoConfigFileOpt
Definition: CmsShowMain.cc:81
const char * configFilename() const
const std::string sOpenData
Definition: ActionsList.cc:12
void setup(FWNavigatorBase *navigator, fireworks::Context *context, FWJobMetadataManager *metadataManager)
void updateStatus(const char *status)
void setContext(fireworks::Context *)
virtual ~CmsShowMain()
Definition: CmsShowMain.cc:371
int ii
Definition: cuy.py:588
uint16_t size_type
static const char *const kConfigFileCommandOpt
Definition: CmsShowMain.cc:76
void setupDataHandling()
Definition: CmsShowMain.cc:607
void enableActions(bool enable=true)
virtual void autoLoadNewEvent()
Definition: CmsShowMain.cc:539
static const char * fmt
Definition: Version.cc:9
std::auto_ptr< SignalTimer > m_liveTimer
Definition: CmsShowMain.h:126
static const char *const kAdvancedRenderOpt
Definition: CmsShowMain.cc:91
CmsShowMain(int argc, char *argv[])
Definition: CmsShowMain.cc:112
static const char *const kGeomFileOpt
Definition: CmsShowMain.cc:77
std::auto_ptr< fireworks::Context > m_context
Definition: CmsShowMain.h:116
LogLevel
Definition: fwLog.h:35
void setupAutoLoad(float x)
static const char *const kPortCommandOpt
Definition: CmsShowMain.cc:96
void setGeometryFilename(const std::string &filename)
static const char *const kPlayOpt
Definition: CmsShowMain.cc:83
void filterButtonClicked()
Definition: CmsShowMain.cc:779
void resetWMOffsets()
const std::string sAppendData
Definition: ActionsList.cc:13
bool loop() const
virtual Bool_t Notify() override
Definition: CmsShowMain.cc:387
CmsShowTaskExecutor * startupTasks()
virtual Bool_t isEnabled() const
Definition: CSGAction.cc:308
std::auto_ptr< TMonitor > m_monitor
Definition: CmsShowMain.h:132
UInt_t m_lastXEventSerial
Definition: CmsShowMain.h:128
sigc::signal< void, const TGWindow * > showEventFilterGUI_
Definition: FWGUIManager.h:206
static const char *const kEveOpt
Definition: CmsShowMain.cc:89
virtual void quit()
Definition: CmsShowMain.cc:396
virtual void eventChangedImp()
static const char *const kConfigFileOpt
Definition: CmsShowMain.cc:75
static const char *const kFreePaletteCommandOpt
Definition: CmsShowMain.cc:102
static const char *const kLoopOpt
Definition: CmsShowMain.cc:85
static const char *const kEveCommandOpt
Definition: CmsShowMain.cc:90
double f[11][100]
static const char *const kSoftCommandOpt
Definition: CmsShowMain.cc:95
static const char *const kLogLevelCommandOpt
Definition: CmsShowMain.cc:87
CmsShowMainFrame * getMainFrame() const
Definition: FWGUIManager.h:199
void disablePrevious()
static const char *const kNoConfigFileCommandOpt
Definition: CmsShowMain.cc:82
static const char *const kEnableFPE
Definition: CmsShowMain.cc:104
std::vector< std::string > m_inputFiles
Definition: CmsShowMain.h:118
void setLiveMode()
Definition: CmsShowMain.cc:807
void setIsPlaying(bool value)
void setSimGeometryFilename(const std::string &filename)
void clearStatus()
void postFiltering(bool)
Definition: CmsShowMain.cc:795
const_iterator begin() const
NOTE: iterator is allowed to return a null object for items that have been removed.
CSGAction * getAction(const std::string name)
static const char *const kLiveCommandOpt
Definition: CmsShowMain.cc:100
void updateEventFilterEnable(bool)
static const char *const kHelpCommandOpt
Definition: CmsShowMain.cc:94
static const char *const kInputFilesCommandOpt
Definition: CmsShowMain.cc:74
#define fwLog(_level_)
Definition: fwLog.h:50
static const char *const kInputFilesOpt
Definition: CmsShowMain.cc:73
static const char *const kPlainRootCommandOpt
Definition: CmsShowMain.cc:97
tuple argc
Definition: dir2webdir.py:38
const TFile * m_openFile
Definition: CmsShowMain.h:120
void setAutoSaveAllViewsFormat(const std::string &fmt)
std::auto_ptr< CmsShowNavigator > m_navigator
Definition: CmsShowMain.h:114
void setFilterButtonText(const char *txt)
std::auto_ptr< CmsShowSearchFiles > m_searchFiles
Definition: CmsShowMain.h:122
static const char *const kRootInteractiveCommandOpt
Definition: CmsShowMain.cc:98
CSGContinuousAction * playEventsAction()
string fname
main script
bool m_noVersionCheck
Definition: CmsShowMain.h:130
static const char *const kAdvancedRenderCommandOpt
Definition: CmsShowMain.cc:92
void doExit()
Definition: CmsShowMain.cc:401
bool isPlaying() const
boost::function0< void > TaskFunctor
void showEventFilterGUI()
void addTask(const TaskFunctor &iTask)
int m_liveTimeout
Definition: CmsShowMain.h:127
void evePreTerminate()
void setMaxNumberOfFilesToChain(unsigned int i)
static void enable()
enable automatic library loading
tuple cout
Definition: gather_cfg.py:121
virtual void stopPlaying()
Definition: CmsShowMain.cc:757
void notified(TSocket *)
Definition: CmsShowMain.cc:687
tuple level
Definition: testEve_cfg.py:34
T w() const
bool forward() const
volatile std::atomic< bool > shutdown_flag false
const std::string & geometryFilename(void)
static void EnableFreePalette()
void setPresentLogLevel(LogLevel)
Definition: fwLog.cc:55
static const char *const kSimGeomFileCommandOpt
Definition: CmsShowMain.cc:80
void connectSocket()
Definition: CmsShowMain.cc:680
void titleChanged(const char *title)
static const char *const kHelpOpt
Definition: CmsShowMain.cc:93
void disableNext()
static const char *const kLoopCommandOpt
Definition: CmsShowMain.cc:86
void openDataViaURL()
Definition: CmsShowMain.cc:509
void reachedEnd()
void setConfigFilename(const std::string &f)
T get(const Candidate &c)
Definition: component.h:55
const_iterator end() const
const std::string sSearchFiles
Definition: ActionsList.cc:14