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