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