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