CMS 3D CMS Logo

CmsShowMainBase.cc
Go to the documentation of this file.
1 #include <fstream>
2 #include <sys/types.h>
3 #include <sys/socket.h>
4 #include <netinet/in.h>
5 #include <arpa/inet.h>
6 #include <netdb.h>
7 
8 #include <boost/bind.hpp>
9 
10 #include "TGLWidget.h"
11 #include "TGMsgBox.h"
12 #include "TROOT.h"
13 #include "TSystem.h"
14 #include "TStopwatch.h"
15 #include "TTimer.h"
16 #include "TEveManager.h"
17 #include "TPRegexp.h"
18 
48 
50  :
51  m_changeManager(new FWModelChangeManager),
52  m_colorManager( new FWColorManager(m_changeManager.get())),
53  m_configurationManager(new FWConfigurationManager),
54  m_eiManager(new FWEventItemsManager(m_changeManager.get())),
55  m_guiManager(nullptr),
56  m_selectionManager(new FWSelectionManager(m_changeManager.get())),
57  m_startupTasks(new CmsShowTaskExecutor),
58  m_viewManager(new FWViewManagerManager(m_changeManager.get(), m_colorManager.get())),
59  m_autoLoadTimer(new SignalTimer()),
60  m_navigatorPtr(nullptr),
61  m_metadataManagerPtr(nullptr),
62  m_contextPtr(nullptr),
63  m_autoSaveAllViewsHeight(-1),
64  m_autoLoadTimerRunning(kFALSE),
65  m_forward(true),
66  m_isPlaying(false),
67  m_loop(false),
68  m_playDelay(3.f)
69 {
71 }
72 
74 {
75 }
76 
77 void
79 {
80  m_guiManager->writeToPresentConfigurationFile_.connect(sigc::mem_fun(*this, &CmsShowMainBase::writeToCurrentConfigFile));
81 
82  // init TGSlider state before signals are connected
83  m_guiManager->setDelayBetweenEvents(m_playDelay);
84 
85  m_navigatorPtr->newEvent_.connect(boost::bind(&CmsShowMainBase::eventChangedSlot, this));
86  if (m_guiManager->getAction(cmsshow::sNextEvent) != nullptr)
87  m_guiManager->getAction(cmsshow::sNextEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doNextEvent));
88  if (m_guiManager->getAction(cmsshow::sPreviousEvent) != nullptr)
89  m_guiManager->getAction(cmsshow::sPreviousEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doPreviousEvent));
90  if (m_guiManager->getAction(cmsshow::sGotoFirstEvent) != nullptr)
91  m_guiManager->getAction(cmsshow::sGotoFirstEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doFirstEvent));
92  if (m_guiManager->getAction(cmsshow::sGotoLastEvent) != nullptr)
93  m_guiManager->getAction(cmsshow::sGotoLastEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doLastEvent));
94  if (m_guiManager->getAction(cmsshow::sQuit) != nullptr)
95  m_guiManager->getAction(cmsshow::sQuit)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::quit));
96 
97  m_guiManager->changedEventId_.connect(boost::bind(&CmsShowMainBase::goToRunEvent,this,_1,_2,_3));
98  m_guiManager->playEventsAction()->started_.connect(sigc::mem_fun(*this, &CmsShowMainBase::playForward));
99  m_guiManager->playEventsBackwardsAction()->started_.connect(sigc::mem_fun(*this,&CmsShowMainBase::playBackward));
100  m_guiManager->loopAction()->started_.connect(sigc::mem_fun(*this,&CmsShowMainBase::setPlayLoopImp));
101  m_guiManager->loopAction()->stopped_.connect(sigc::mem_fun(*this,&CmsShowMainBase::unsetPlayLoopImp));
102  m_guiManager->changedDelayBetweenEvents_.connect(boost::bind(&CmsShowMainBase::setPlayDelay,this,_1));
103  m_guiManager->playEventsAction()->stopped_.connect(sigc::mem_fun(*this,&CmsShowMainBase::stopPlaying));
104  m_guiManager->playEventsBackwardsAction()->stopped_.connect(sigc::mem_fun(*this,&CmsShowMainBase::stopPlaying));
105 
106  m_autoLoadTimer->timeout_.connect(boost::bind(&CmsShowMainBase::autoLoadNewEvent, this));
107 }
108 
109 void
111 {
112  guiManager()->updateStatus("Setting up view manager...");
113 
114  std::shared_ptr<FWViewManagerBase> eveViewManager = std::make_shared<FWEveViewManager>(guiManager());
115  eveViewManager->setContext(m_contextPtr);
116  viewManager()->add(eveViewManager);
117 
118  auto tableViewManager = std::make_shared<FWTableViewManager>(guiManager());
119  configurationManager()->add(std::string("Tables"), tableViewManager.get());
120  viewManager()->add(tableViewManager);
121  eiManager()->goingToClearItems_.connect(boost::bind(&FWTableViewManager::removeAllItems, tableViewManager.get()));
122 
123  auto triggerTableViewManager = std::make_shared<FWTriggerTableViewManager>(guiManager());
124  configurationManager()->add(std::string("TriggerTables"), triggerTableViewManager.get());
125  configurationManager()->add(std::string("L1TriggerTables"), triggerTableViewManager.get()); // AMT: added for backward compatibilty
126  triggerTableViewManager->setContext(m_contextPtr);
127  viewManager()->add(triggerTableViewManager);
128 
129  auto geoTableViewManager = std::make_shared<FWGeometryTableViewManager>(guiManager(), m_simGeometryFilename, m_TGeoName);
130  geoTableViewManager->setContext(m_contextPtr);
131  viewManager()->add(geoTableViewManager);
132 
133 
134  // Unfortunately, due to the plugin mechanism, we need to delay
135  // until here the creation of the FWJobMetadataManager, because
136  // otherwise the supportedTypesAndRepresentations map is empty.
137  // FIXME: should we have a signal for whenever the above mentioned map
138  // changes? Can that actually happer (maybe if we add support
139  // for loading plugins on the fly??).
140  m_metadataManagerPtr->initReps(viewManager()->supportedTypesAndRepresentations());
141 }
142 
143 void
145 {
146  eventChangedImp();
147 }
148 
149 void
151 {
153 }
154 
155 void
157 {
159  checkPosition();
160  draw();
161 }
162 
163 void
165 {
167  checkPosition();
168  draw();
169 }
170 
171 void
173 {
175  checkPosition();
176  draw();
177 }
178 void
180 {
182  checkPosition();
183  draw();
184 }
185 
186 void
188 {
189  m_navigatorPtr->goToRunEvent(run, lumi, event);
190  checkPosition();
191  draw();
192 }
193 
194 
195 void
197 {
198  m_guiManager->updateStatus("loading event ...");
199 
201  {
203  }
205 
206  TStopwatch sw;
207  m_viewManager->eventBegin();
209  m_viewManager->eventEnd();
210  sw.Stop();
211  fwLog(fwlog::kDebug) << "CmsShowMainBase::draw CpuTime " << sw.CpuTime()
212  <<" RealTime " << sw.RealTime() << std::endl;
213 
214  if (!m_autoSaveAllViewsFormat.empty())
215  {
216  m_guiManager->updateStatus("auto saving images ...");
218  }
219  m_guiManager->clearStatus();
220 }
221 
222 void
225  FWJobMetadataManager *metadataManager)
226 {
229  m_metadataManagerPtr = metadataManager;
230 
231  m_colorManager->initialize();
234 
235  m_eiManager->newItem_.connect(boost::bind(&FWModelChangeManager::newItemSlot,
236  m_changeManager.get(), _1) );
237 
238  m_eiManager->newItem_.connect(boost::bind(&FWViewManagerManager::registerEventItem,
239  m_viewManager.get(), _1));
240  m_configurationManager->add("EventItems",m_eiManager.get());
241  m_configurationManager->add("GUI",m_guiManager.get());
242  m_configurationManager->add("EventNavigator", m_navigatorPtr);
243  m_configurationManager->add("CommonPreferences", m_contextPtr->commonPrefs()); // must be after GUIManager in alphabetical order
244 
245  m_guiManager->writeToConfigurationFile_.connect(boost::bind(&CmsShowMainBase::writeToConfigFile,
246  this,_1));
247 
248  m_guiManager->loadFromConfigurationFile_.connect(boost::bind(&CmsShowMainBase::reloadConfiguration,
249  this, _1));
250  m_guiManager->loadPartialFromConfigurationFile_.connect(boost::bind(&CmsShowMainBase::partialLoadConfiguration,
251  this, _1));
252 
253  m_guiManager->writePartialToConfigurationFile_.connect(boost::bind(&CmsShowMainBase::partialWriteToConfigFile,
254  this,_1));
255 
256  std::string macPath(gSystem->Getenv("CMSSW_BASE"));
257  macPath += "/src/Fireworks/Core/macros";
258  const char* base = gSystem->Getenv("CMSSW_RELEASE_BASE");
259  if(nullptr!=base) {
260  macPath+=":";
261  macPath +=base;
262  macPath +="/src/Fireworks/Core/macros";
263  }
264  gROOT->SetMacroPath((std::string("./:")+macPath).c_str());
265 
266  m_startupTasks->tasksCompleted_.connect(boost::bind(&FWGUIManager::clearStatus,
267  m_guiManager.get()) );
268 }
269 
270 void
272 {
275 }
276 
277 void
279 {
281 }
282 
283 void
285 {
286  std::string p = (name == "current") ? m_configFileName.c_str() : name.c_str();
287  new FWPartialConfigSaveGUI( p.c_str() , m_configFileName.c_str(), m_configurationManager.get());
288 
289 }
290 
291 
292 void
294 {
295  if (config.empty())
296  return;
297 
299 
300  std::string msg = "Reloading configuration "
301  + config + "...";
302  fwLog(fwlog::kDebug) << msg << std::endl;
303  m_guiManager->updateStatus(msg.c_str());
304  m_guiManager->subviewDestroyAll();
305  m_eiManager->clearItems();
307  try
308  {
309  gEve->DisableRedraw();
310  m_configurationManager->readFromFile(config);
311  gEve->EnableRedraw();
312  }
314  {
315  Int_t chosen;
316  new TGMsgBox(gClient->GetDefaultRoot(),
317  gClient->GetDefaultRoot(),
318  "Bad configuration",
319  ("Configuration " + config + " cannot be parsed: " + e.error()).c_str(),
320  kMBIconExclamation,
321  kMBCancel,
322  &chosen);
323  }
324  catch (...)
325  {
326  Int_t chosen;
327  new TGMsgBox(gClient->GetDefaultRoot(),
328  gClient->GetDefaultRoot(),
329  "Bad configuration",
330  ("Configuration " + config + " cannot be parsed.").c_str(),
331  kMBIconExclamation,
332  kMBCancel,
333  &chosen);
334  }
335 
336  m_guiManager->updateStatus("");
337 }
338 
339 
340 void
342 {
343  new FWPartialConfigLoadGUI(name.c_str(), m_configurationManager.get(), m_eiManager.get());
344 }
345 
346 void
348 {
349  m_playDelay = x;
350  m_guiManager->setDelayBetweenEvents(m_playDelay);
351  if (!m_guiManager->playEventsAction()->isEnabled())
352  m_guiManager->playEventsAction()->enable();
353 
354  m_guiManager->playEventsAction()->switchMode();
355 }
356 
357 void
359 {
360  m_autoLoadTimer->SetTime((Long_t)(m_playDelay*1000));
361  m_autoLoadTimer->Reset();
362  m_autoLoadTimer->TurnOn();
363  m_autoLoadTimerRunning = kTRUE;
364 }
365 
366 void
368 {
369  m_autoLoadTimer->TurnOff();
370  m_autoLoadTimerRunning = kFALSE;
371 }
372 
373 void
375 {
376  m_guiManager->updateStatus("Setting up configuration...");
377 
378  try
379  {
380  gEve->DisableRedraw();
381  if (m_configFileName.empty())
382  {
384  }
385  else
386  {
387  char* whereConfig = gSystem->Which(TROOT::GetMacroPath(), m_configFileName.c_str(), kReadPermission);
388  m_configFileName = whereConfig;
389  delete [] whereConfig;
391  }
392  gEve->EnableRedraw();
393  }
395  {
396  fwLog(fwlog::kError) <<"Unable to load configuration file '"
397  << m_configFileName
398  << "': "
399  << e.error()
400  << std::endl;
401  exit(1);
402  }
403  catch (std::runtime_error &e)
404  {
405  fwLog(fwlog::kError) <<"Unable to load configuration file '"
406  << m_configFileName
407  << "' which was specified on command line. Quitting."
408  << std::endl;
409  exit(1);
410  }
411 }
412 
413 
414 void
416 {
417  m_playDelay = val;
418 }
419 
420 void
422 {
423  m_guiManager->updateStatus("Setting up Eve debug window...");
424  m_guiManager->openEveBrowserForDebugging();
425 }
426 
427 void
429 {
430  if(!m_loop) {
431  setPlayLoopImp();
432  m_guiManager->loopAction()->activated();
433  }
434 }
435 
436 void
438 {
439  if(m_loop) {
441  m_guiManager->loopAction()->stop();
442  }
443 }
444 
445 void
447 {
448  m_loop = true;
449 }
450 
451 void
453 {
454  m_loop = false;
455 }
456 
457 void
459 {
460  m_eiManager->add(iItem);
461 }
462 
463 
464 void
466 {
467  m_isPlaying = false;
469 }
470 
471 void
473 {
474  m_forward = true;
475  m_isPlaying = true;
476  guiManager()->enableActions(kFALSE);
479 }
480 
481 void
483 {
484  m_forward = false;
485  m_isPlaying = true;
486  guiManager()->enableActions(kFALSE);
489 }
490 
491 void
493 { // prepare geometry service
494  // ATTN: this should be made configurable
495  try
496  {
497  guiManager()->updateStatus("Loading geometry...");
500  }
501  catch (const std::runtime_error& iException)
502  {
503  fwLog(fwlog::kError) << "CmsShowMain::loadGeometry() caught exception: \n"
504  << m_geometryFilename << " "
505  << iException.what() << std::endl;
506  exit(0);
507  }
508 }
509 
510 void
512 {
513  // Send version info to xrootd.t2.ucsd.edu receiver on port 9698.
514 
515  // receiver
516  struct hostent* h = gethostbyname("xrootd.t2.ucsd.edu");
517  if (!h) return;
518 
519 
520  struct sockaddr_in remoteServAddr;
521  remoteServAddr.sin_family = h->h_addrtype;
522  memcpy((char *) &remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
523  remoteServAddr.sin_port = htons(9698);
524 
525  // socket creation
526  int sd = socket(AF_INET,SOCK_DGRAM, 0);
527  if (sd < 0)
528  {
529  // std::cout << "can't create socket \n";
530  return;
531  }
532  // bind any port
533  // printf("bind port\n");
534  struct sockaddr_in cliAddr;
535  cliAddr.sin_family = AF_INET;
536  cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
537  cliAddr.sin_port = htons(0);
538 
539  int rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr));
540  if (rc < 0) {
541  // std::cout << "can't bind port %d " << rc << std::endl;
542  return;
543  }
544 
545  // get OSX version
546  TString osx_version;
547  try {
548  std::ifstream infoFile("/System/Library/CoreServices/SystemVersion.plist");
549  osx_version.ReadFile(infoFile);
550  TPMERegexp re("ProductVersion\\</key\\>\\n\\t\\<string\\>(10.*)\\</string\\>");
551  re.Match(osx_version);
552  osx_version = re[1];
553  }
554  catch (...) {}
555 
556  // send data
557  SysInfo_t sInfo;
558  gSystem->GetSysInfo(&sInfo);
559  char msg[128];
560 
561  if (gSystem->Getenv("CMSSW_VERSION"))
562  {
563  snprintf(msg, 64,"%s %s %s", gSystem->Getenv("CMSSW_VERSION"), sInfo.fOS.Data(), osx_version.Data());
564  }
565  else
566  {
567  TString versionFileName("data/version.txt");
568  fireworks::setPath(versionFileName);
569  std::ifstream fs(versionFileName);
570  TString infoText;
571  infoText.ReadLine(fs);
572  fs.close();
573  snprintf(msg, 64,"Standalone %s %s %s", infoText.Data(), sInfo.fOS.Data(), osx_version.Data() );
574  }
575 
576 
577  int flags = 0;
578  sendto(sd, msg, strlen(msg), flags,
579  (struct sockaddr *) &remoteServAddr,
580  sizeof(remoteServAddr));
581 }
void partialWriteToConfigFile(const std::string &config)
void registerEventItem(const FWEventItem *iItem)
virtual void goToRunEvent(edm::RunNumber_t, edm::LuminosityBlockNumber_t, edm::EventNumber_t)=0
std::string m_geometryFilename
FWGUIManager * guiManager()
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
void setGeom(const FWGeometry *x)
Definition: Context.h:51
void writeToConfigFile(const std::string &config)
std::unique_ptr< FWModelChangeManager > m_changeManager
std::unique_ptr< FWGUIManager > m_guiManager
virtual void nextEvent()=0
FWEventItemsManager * eiManager()
#define nullptr
unsigned long long EventNumber_t
std::vector< Variable::Flags > flags
Definition: MVATrainer.cc:135
std::unique_ptr< FWEventItemsManager > m_eiManager
void initReps(const FWTypeToRepresentations &iTypeAndReps)
void partialLoadConfiguration(const std::string &config)
void initEveElements()
Definition: Context.cc:94
std::unique_ptr< SignalTimer > m_autoLoadTimer
Definition: config.py:1
void setup(FWNavigatorBase *navigator, fireworks::Context *context, FWJobMetadataManager *metadataManager)
void updateStatus(const char *status)
unsigned int LuminosityBlockNumber_t
void enableActions(bool enable=true)
virtual void checkPosition()=0
void checkBeamSpot(const edm::EventBase *event)
Definition: FWBeamSpot.cc:6
const std::string sNextEvent
Definition: ActionsList.cc:5
virtual ~CmsShowMainBase() noexcept(false)
config
Definition: looper.py:291
void setupAutoLoad(float x)
std::unique_ptr< FWColorManager > m_colorManager
FWNavigatorBase * m_navigatorPtr
void newItemSlot(FWEventItem *)
FWBeamSpot * getBeamSpot() const
Definition: Context.h:78
void reloadConfiguration(const std::string &config)
virtual void stopPlaying()
FWMagField * getField() const
Definition: Context.h:77
virtual void firstEvent()=0
void loadMap(const char *fileName)
Definition: FWGeometry.cc:56
void setPlayDelay(Float_t val)
virtual void eventChangedImp()
virtual void quit()=0
std::unique_ptr< CmsShowTaskExecutor > m_startupTasks
virtual void checkKeyBindingsOnPLayEventsStateChanged()
FWJobMetadataManager * m_metadataManagerPtr
fireworks::Context * context()
double f[11][100]
const std::string sGotoLastEvent
Definition: ActionsList.cc:4
base
Make Sure CMSSW is Setup ##.
ESource getSource() const
Definition: FWMagField.h:33
virtual void previousEvent()=0
void eventChangedCallback()
void clearStatus()
#define noexcept
void checkFieldInfo(const edm::EventBase *)
Definition: FWMagField.cc:172
std::string m_TGeoName
void add(std::shared_ptr< FWViewManagerBase >)
FWViewManagerManager * viewManager()
virtual void autoLoadNewEvent()=0
std::string m_simGeometryFilename
#define fwLog(_level_)
Definition: fwLog.h:50
double sd
const std::string sGotoFirstEvent
Definition: ActionsList.cc:3
tuple msg
Definition: mps_check.py:285
fireworks::Context * m_contextPtr
CmsShowCommon * commonPrefs() const
Definition: Context.cc:177
void add(const std::string &iName, FWConfigurable *)
does not take ownership
std::unique_ptr< FWConfigurationManager > m_configurationManager
const std::string sPreviousEvent
Definition: ActionsList.cc:6
std::unique_ptr< FWViewManagerManager > m_viewManager
virtual const edm::EventBase * getCurrentEvent() const =0
FWConfigurationManager * configurationManager()
void writeToCurrentConfigFile()
std::string m_autoSaveAllViewsFormat
void registerPhysicsObject(const FWPhysicsObjectDesc &iItem)
unsigned int RunNumber_t
const std::string sQuit
Definition: ActionsList.cc:28
void goToRunEvent(edm::RunNumber_t, edm::LuminosityBlockNumber_t, edm::EventNumber_t)
sigc::signal< void > goingToClearItems_
T get(const Candidate &c)
Definition: component.h:55
virtual void lastEvent()=0
void setPath(TString &v)
Definition: fwPaths.cc:15
Definition: event.py:1
sigc::signal< void > newEvent_
std::string m_configFileName