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  : m_changeManager(new FWModelChangeManager),
51  m_colorManager(new FWColorManager(m_changeManager.get())),
52  m_configurationManager(new FWConfigurationManager),
53  m_eiManager(new FWEventItemsManager(m_changeManager.get())),
54  m_guiManager(nullptr),
55  m_selectionManager(new FWSelectionManager(m_changeManager.get())),
56  m_startupTasks(new CmsShowTaskExecutor),
57  m_viewManager(new FWViewManagerManager(m_changeManager.get(), m_colorManager.get())),
58  m_autoLoadTimer(new SignalTimer()),
59  m_navigatorPtr(nullptr),
60  m_metadataManagerPtr(nullptr),
61  m_contextPtr(nullptr),
62  m_autoSaveAllViewsHeight(-1),
63  m_autoLoadTimerRunning(kFALSE),
64  m_forward(true),
65  m_isPlaying(false),
66  m_loop(false),
67  m_playDelay(3.f) {
69 }
70 
72 
74  m_guiManager->writeToPresentConfigurationFile_.connect(
75  sigc::mem_fun(*this, &CmsShowMainBase::writeToCurrentConfigFile));
76 
77  // init TGSlider state before signals are connected
78  m_guiManager->setDelayBetweenEvents(m_playDelay);
79 
80  m_navigatorPtr->newEvent_.connect(boost::bind(&CmsShowMainBase::eventChangedSlot, this));
81  if (m_guiManager->getAction(cmsshow::sNextEvent) != nullptr)
82  m_guiManager->getAction(cmsshow::sNextEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doNextEvent));
83  if (m_guiManager->getAction(cmsshow::sPreviousEvent) != nullptr)
85  ->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doPreviousEvent));
86  if (m_guiManager->getAction(cmsshow::sGotoFirstEvent) != nullptr)
88  ->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doFirstEvent));
89  if (m_guiManager->getAction(cmsshow::sGotoLastEvent) != nullptr)
91  ->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doLastEvent));
92  if (m_guiManager->getAction(cmsshow::sQuit) != nullptr)
93  m_guiManager->getAction(cmsshow::sQuit)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::quit));
94 
95  m_guiManager->changedEventId_.connect(boost::bind(&CmsShowMainBase::goToRunEvent, this, _1, _2, _3));
96  m_guiManager->playEventsAction()->started_.connect(sigc::mem_fun(*this, &CmsShowMainBase::playForward));
97  m_guiManager->playEventsBackwardsAction()->started_.connect(sigc::mem_fun(*this, &CmsShowMainBase::playBackward));
98  m_guiManager->loopAction()->started_.connect(sigc::mem_fun(*this, &CmsShowMainBase::setPlayLoopImp));
99  m_guiManager->loopAction()->stopped_.connect(sigc::mem_fun(*this, &CmsShowMainBase::unsetPlayLoopImp));
100  m_guiManager->changedDelayBetweenEvents_.connect(boost::bind(&CmsShowMainBase::setPlayDelay, this, _1));
101  m_guiManager->playEventsAction()->stopped_.connect(sigc::mem_fun(*this, &CmsShowMainBase::stopPlaying));
102  m_guiManager->playEventsBackwardsAction()->stopped_.connect(sigc::mem_fun(*this, &CmsShowMainBase::stopPlaying));
103 
104  m_autoLoadTimer->timeout_.connect(boost::bind(&CmsShowMainBase::autoLoadNewEvent, this));
105 }
106 
108  guiManager()->updateStatus("Setting up view manager...");
109 
110  std::shared_ptr<FWViewManagerBase> eveViewManager = std::make_shared<FWEveViewManager>(guiManager());
111  eveViewManager->setContext(m_contextPtr);
112  viewManager()->add(eveViewManager);
113 
114  auto tableViewManager = std::make_shared<FWTableViewManager>(guiManager());
115  configurationManager()->add(std::string("Tables"), tableViewManager.get());
116  viewManager()->add(tableViewManager);
117  eiManager()->goingToClearItems_.connect(boost::bind(&FWTableViewManager::removeAllItems, tableViewManager.get()));
118 
119  auto triggerTableViewManager = std::make_shared<FWTriggerTableViewManager>(guiManager());
120  configurationManager()->add(std::string("TriggerTables"), triggerTableViewManager.get());
121  configurationManager()->add(std::string("L1TriggerTables"),
122  triggerTableViewManager.get()); // AMT: added for backward compatibilty
123  triggerTableViewManager->setContext(m_contextPtr);
124  viewManager()->add(triggerTableViewManager);
125 
126  auto geoTableViewManager =
127  std::make_shared<FWGeometryTableViewManager>(guiManager(), m_simGeometryFilename, m_TGeoName);
128  geoTableViewManager->setContext(m_contextPtr);
129  viewManager()->add(geoTableViewManager);
130 
131  // Unfortunately, due to the plugin mechanism, we need to delay
132  // until here the creation of the FWJobMetadataManager, because
133  // otherwise the supportedTypesAndRepresentations map is empty.
134  // FIXME: should we have a signal for whenever the above mentioned map
135  // changes? Can that actually happer (maybe if we add support
136  // for loading plugins on the fly??).
137  m_metadataManagerPtr->initReps(viewManager()->supportedTypesAndRepresentations());
138 }
139 
141 
143 
146  checkPosition();
147  draw();
148 }
149 
152  checkPosition();
153  draw();
154 }
155 
158  checkPosition();
159  draw();
160 }
163  checkPosition();
164  draw();
165 }
166 
168  m_navigatorPtr->goToRunEvent(run, lumi, event);
169  checkPosition();
170  draw();
171 }
172 
174  m_guiManager->updateStatus("loading event ...");
175 
178  }
180 
181  TStopwatch sw;
182  m_viewManager->eventBegin();
184  m_viewManager->eventEnd();
185  sw.Stop();
186  fwLog(fwlog::kDebug) << "CmsShowMainBase::draw CpuTime " << sw.CpuTime() << " RealTime " << sw.RealTime()
187  << std::endl;
188 
189  if (!m_autoSaveAllViewsFormat.empty()) {
190  m_guiManager->updateStatus("auto saving images ...");
192  }
193  m_guiManager->clearStatus();
194 }
195 
198  FWJobMetadataManager *metadataManager) {
202  m_metadataManagerPtr = metadataManager;
203 
204  m_colorManager->initialize();
207 
208  m_eiManager->newItem_.connect(boost::bind(&FWModelChangeManager::newItemSlot, m_changeManager.get(), _1));
209 
210  m_eiManager->newItem_.connect(boost::bind(&FWViewManagerManager::registerEventItem, m_viewManager.get(), _1));
211  m_configurationManager->add("EventItems", m_eiManager.get());
212  m_configurationManager->add("GUI", m_guiManager.get());
213  m_configurationManager->add("EventNavigator", m_navigatorPtr);
214  m_configurationManager->add("CommonPreferences",
215  m_contextPtr->commonPrefs()); // must be after GUIManager in alphabetical order
216 
217  m_guiManager->writeToConfigurationFile_.connect(boost::bind(&CmsShowMainBase::writeToConfigFile, this, _1));
218 
219  m_guiManager->loadFromConfigurationFile_.connect(boost::bind(&CmsShowMainBase::reloadConfiguration, this, _1));
220  m_guiManager->loadPartialFromConfigurationFile_.connect(
221  boost::bind(&CmsShowMainBase::partialLoadConfiguration, this, _1));
222 
223  m_guiManager->writePartialToConfigurationFile_.connect(
224  boost::bind(&CmsShowMainBase::partialWriteToConfigFile, this, _1));
225 
226  std::string macPath(gSystem->Getenv("CMSSW_BASE"));
227  macPath += "/src/Fireworks/Core/macros";
228  const char *base = gSystem->Getenv("CMSSW_RELEASE_BASE");
229  if (nullptr != base) {
230  macPath += ":";
231  macPath += base;
232  macPath += "/src/Fireworks/Core/macros";
233  }
234  gROOT->SetMacroPath((std::string("./:") + macPath).c_str());
235 
236  m_startupTasks->tasksCompleted_.connect(boost::bind(&FWGUIManager::clearStatus, m_guiManager.get()));
237 }
238 
242 }
243 
245 
247  std::string p = (name == "current") ? m_configFileName.c_str() : name.c_str();
248  new FWPartialConfigSaveGUI(p.c_str(), m_configFileName.c_str(), m_configurationManager.get());
249 }
250 
252  if (config.empty())
253  return;
254 
256 
257  std::string msg = "Reloading configuration " + config + "...";
258  fwLog(fwlog::kDebug) << msg << std::endl;
259  m_guiManager->updateStatus(msg.c_str());
260  m_guiManager->subviewDestroyAll();
261  m_eiManager->clearItems();
263  try {
264  gEve->DisableRedraw();
265  m_configurationManager->readFromFile(config);
266  gEve->EnableRedraw();
267  } catch (SimpleSAXParser::ParserError &e) {
268  Int_t chosen;
269  new TGMsgBox(gClient->GetDefaultRoot(),
270  gClient->GetDefaultRoot(),
271  "Bad configuration",
272  ("Configuration " + config + " cannot be parsed: " + e.error()).c_str(),
273  kMBIconExclamation,
274  kMBCancel,
275  &chosen);
276  } catch (...) {
277  Int_t chosen;
278  new TGMsgBox(gClient->GetDefaultRoot(),
279  gClient->GetDefaultRoot(),
280  "Bad configuration",
281  ("Configuration " + config + " cannot be parsed.").c_str(),
282  kMBIconExclamation,
283  kMBCancel,
284  &chosen);
285  }
286 
287  m_guiManager->updateStatus("");
288 }
289 
291  new FWPartialConfigLoadGUI(name.c_str(), m_configurationManager.get(), m_eiManager.get());
292 }
293 
295  m_playDelay = x;
296  m_guiManager->setDelayBetweenEvents(m_playDelay);
297  if (!m_guiManager->playEventsAction()->isEnabled())
298  m_guiManager->playEventsAction()->enable();
299 
300  m_guiManager->playEventsAction()->switchMode();
301 }
302 
304  m_autoLoadTimer->SetTime((Long_t)(m_playDelay * 1000));
305  m_autoLoadTimer->Reset();
306  m_autoLoadTimer->TurnOn();
307  m_autoLoadTimerRunning = kTRUE;
308 }
309 
311  m_autoLoadTimer->TurnOff();
312  m_autoLoadTimerRunning = kFALSE;
313 }
314 
316  m_guiManager->updateStatus("Setting up configuration...");
317 
318  try {
319  gEve->DisableRedraw();
320  if (m_configFileName.empty()) {
322  } else {
323  char *whereConfig = gSystem->Which(TROOT::GetMacroPath(), m_configFileName.c_str(), kReadPermission);
324  m_configFileName = whereConfig;
325  delete[] whereConfig;
327  }
328  gEve->EnableRedraw();
329  } catch (SimpleSAXParser::ParserError &e) {
330  fwLog(fwlog::kError) << "Unable to load configuration file '" << m_configFileName << "': " << e.error()
331  << std::endl;
332  exit(1);
333  } catch (std::runtime_error &e) {
334  fwLog(fwlog::kError) << "Unable to load configuration file '" << m_configFileName
335  << "' which was specified on command line. Quitting." << std::endl;
336  exit(1);
337  }
338 }
339 
341 
343  m_guiManager->updateStatus("Setting up Eve debug window...");
344  m_guiManager->openEveBrowserForDebugging();
345 }
346 
348  if (!m_loop) {
349  setPlayLoopImp();
350  m_guiManager->loopAction()->activated();
351  }
352 }
353 
355  if (m_loop) {
357  m_guiManager->loopAction()->stop();
358  }
359 }
360 
362 
364 
366 
368  m_isPlaying = false;
370 }
371 
373  m_forward = true;
374  m_isPlaying = true;
375  guiManager()->enableActions(kFALSE);
378 }
379 
381  m_forward = false;
382  m_isPlaying = true;
383  guiManager()->enableActions(kFALSE);
386 }
387 
388 void CmsShowMainBase::loadGeometry() { // prepare geometry service
389  // ATTN: this should be made configurable
390  try {
391  guiManager()->updateStatus("Loading geometry...");
393  } catch (const std::runtime_error &iException) {
394  fwLog(fwlog::kError) << "CmsShowMain::loadGeometry() caught exception: \n"
395  << m_geometryFilename << " " << iException.what() << std::endl;
396  exit(0);
397  }
398 }
399 
401  // Send version info to xrootd.t2.ucsd.edu receiver on port 9698.
402 
403  // receiver
404  struct hostent *h = gethostbyname("xrootd.t2.ucsd.edu");
405  if (!h)
406  return;
407 
408  struct sockaddr_in remoteServAddr;
409  remoteServAddr.sin_family = h->h_addrtype;
410  memcpy((char *)&remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
411  remoteServAddr.sin_port = htons(9698);
412 
413  // socket creation
414  int sd = socket(AF_INET, SOCK_DGRAM, 0);
415  if (sd < 0) {
416  // std::cout << "can't create socket \n";
417  return;
418  }
419  // bind any port
420  // printf("bind port\n");
421  struct sockaddr_in cliAddr;
422  cliAddr.sin_family = AF_INET;
423  cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
424  cliAddr.sin_port = htons(0);
425 
426  int rc = bind(sd, (struct sockaddr *)&cliAddr, sizeof(cliAddr));
427  if (rc < 0) {
428  // std::cout << "can't bind port %d " << rc << std::endl;
429  return;
430  }
431 
432  // get OSX version
433  TString osx_version;
434  try {
435  std::ifstream infoFile("/System/Library/CoreServices/SystemVersion.plist");
436  osx_version.ReadFile(infoFile);
437  TPMERegexp re("ProductVersion\\</key\\>\\n\\t\\<string\\>(10.*)\\</string\\>");
438  re.Match(osx_version);
439  osx_version = re[1];
440  } catch (...) {
441  }
442 
443  // send data
444  SysInfo_t sInfo;
445  gSystem->GetSysInfo(&sInfo);
446  char msg[128];
447 
448  if (gSystem->Getenv("CMSSW_VERSION")) {
449  snprintf(msg, 64, "%s %s %s", gSystem->Getenv("CMSSW_VERSION"), sInfo.fOS.Data(), osx_version.Data());
450  } else {
451  TString versionFileName("data/version.txt");
452  fireworks::setPath(versionFileName);
453  std::ifstream fs(versionFileName);
454  TString infoText;
455  infoText.ReadLine(fs);
456  fs.close();
457  snprintf(msg, 64, "Standalone %s %s %s", infoText.Data(), sInfo.fOS.Data(), osx_version.Data());
458  }
459 
460  int flags = 0;
461  sendto(sd, msg, strlen(msg), flags, (struct sockaddr *)&remoteServAddr, sizeof(remoteServAddr));
462 }
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
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()
void writeToConfigFile(const std::string &config)
std::unique_ptr< FWModelChangeManager > m_changeManager
std::unique_ptr< FWGUIManager > m_guiManager
virtual void nextEvent()=0
FWEventItemsManager * eiManager()
base
Main Program
Definition: newFWLiteAna.py:92
#define nullptr
unsigned long long EventNumber_t
std::unique_ptr< FWEventItemsManager > m_eiManager
void initReps(const FWTypeToRepresentations &iTypeAndReps)
void partialLoadConfiguration(const std::string &config)
void initEveElements()
Definition: Context.cc:86
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:67
void reloadConfiguration(const std::string &config)
virtual void stopPlaying()
FWMagField * getField() const
Definition: Context.h:66
virtual void firstEvent()=0
void loadMap(const char *fileName)
Definition: FWGeometry.cc:99
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
void setGeom(FWGeometry *x)
Definition: Context.h:50
ESource getSource() const
Definition: FWMagField.h:31
virtual void previousEvent()=0
void eventChangedCallback()
void clearStatus()
#define noexcept
void checkFieldInfo(const edm::EventBase *)
Definition: FWMagField.cc:144
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:45
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:160
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:27
void goToRunEvent(edm::RunNumber_t, edm::LuminosityBlockNumber_t, edm::EventNumber_t)
sigc::signal< void > goingToClearItems_
virtual void lastEvent()=0
void setPath(TString &v)
Definition: fwPaths.cc:15
Definition: event.py:1
sigc::signal< void > newEvent_
def exit(msg="")
std::string m_configFileName