CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
47 
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(0),
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(0),
61  m_metadataManagerPtr(0),
62  m_contextPtr(0),
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) != 0)
87  m_guiManager->getAction(cmsshow::sNextEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doNextEvent));
88  if (m_guiManager->getAction(cmsshow::sPreviousEvent) != 0)
89  m_guiManager->getAction(cmsshow::sPreviousEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doPreviousEvent));
90  if (m_guiManager->getAction(cmsshow::sGotoFirstEvent) != 0)
91  m_guiManager->getAction(cmsshow::sGotoFirstEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doFirstEvent));
92  if (m_guiManager->getAction(cmsshow::sGotoLastEvent) != 0)
93  m_guiManager->getAction(cmsshow::sGotoLastEvent)->activated.connect(sigc::mem_fun(*this, &CmsShowMainBase::doLastEvent));
94  if (m_guiManager->getAction(cmsshow::sQuit) != 0)
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  boost::shared_ptr<FWViewManagerBase> eveViewManager(new FWEveViewManager(guiManager()));
115  eveViewManager->setContext(m_contextPtr);
116  viewManager()->add(eveViewManager);
117 
118  boost::shared_ptr<FWTableViewManager> tableViewManager(new 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  boost::shared_ptr<FWTriggerTableViewManager> triggerTableViewManager(new 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  boost::shared_ptr<FWGeometryTableViewManager> geoTableViewManager(new FWGeometryTableViewManager(guiManager(), m_simGeometryFilename));
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
224  fireworks::Context *context,
225  FWJobMetadataManager *metadataManager)
226 {
228  m_contextPtr = context;
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  std::string macPath(gSystem->Getenv("CMSSW_BASE"));
251  macPath += "/src/Fireworks/Core/macros";
252  const char* base = gSystem->Getenv("CMSSW_RELEASE_BASE");
253  if(0!=base) {
254  macPath+=":";
255  macPath +=base;
256  macPath +="/src/Fireworks/Core/macros";
257  }
258  gROOT->SetMacroPath((std::string("./:")+macPath).c_str());
259 
260  m_startupTasks->tasksCompleted_.connect(boost::bind(&FWGUIManager::clearStatus,
261  m_guiManager.get()) );
262 }
263 
264 void
266 {
269 }
270 
271 void
273 {
275 }
276 
277 void
279 {
280  if (config.empty())
281  return;
282 
284 
285  std::string msg = "Reloading configuration "
286  + config + "...";
287  fwLog(fwlog::kDebug) << msg << std::endl;
288  m_guiManager->updateStatus(msg.c_str());
289  m_guiManager->subviewDestroyAll();
290  m_eiManager->clearItems();
292  try
293  {
294  gEve->DisableRedraw();
295  m_configurationManager->readFromFile(config);
296  gEve->EnableRedraw();
297  }
299  {
300  Int_t chosen;
301  new TGMsgBox(gClient->GetDefaultRoot(),
302  gClient->GetDefaultRoot(),
303  "Bad configuration",
304  ("Configuration " + config + " cannot be parsed: " + e.error()).c_str(),
305  kMBIconExclamation,
306  kMBCancel,
307  &chosen);
308  }
309  catch (...)
310  {
311  Int_t chosen;
312  new TGMsgBox(gClient->GetDefaultRoot(),
313  gClient->GetDefaultRoot(),
314  "Bad configuration",
315  ("Configuration " + config + " cannot be parsed.").c_str(),
316  kMBIconExclamation,
317  kMBCancel,
318  &chosen);
319  }
320 
321  m_guiManager->updateStatus("");
322 }
323 
324 void
326 {
327  m_playDelay = x;
328  m_guiManager->setDelayBetweenEvents(m_playDelay);
329  if (!m_guiManager->playEventsAction()->isEnabled())
330  m_guiManager->playEventsAction()->enable();
331 
332  m_guiManager->playEventsAction()->switchMode();
333 }
334 
335 void
337 {
338  m_autoLoadTimer->SetTime((Long_t)(m_playDelay*1000));
339  m_autoLoadTimer->Reset();
340  m_autoLoadTimer->TurnOn();
341  m_autoLoadTimerRunning = kTRUE;
342 }
343 
344 void
346 {
347  m_autoLoadTimer->TurnOff();
348  m_autoLoadTimerRunning = kFALSE;
349 }
350 
351 void
353 {
354  m_guiManager->updateStatus("Setting up configuration...");
355  if(m_configurationManager->getIgnore()) {
356  fwLog(fwlog::kInfo) << "No configuration is loaded." << std::endl;
357  m_guiManager->getMainFrame()->MapSubwindows();
358  m_guiManager->getMainFrame()->Layout();
359  m_guiManager->getMainFrame()->MapRaised();
360  m_configFileName = "newconfig.fwc";
361  m_guiManager->createView("Rho Phi");
362  m_guiManager->createView("Rho Z");
363  }
364  else {
365  try
366  {
367  gEve->DisableRedraw();
368  if (m_configFileName.empty())
369  {
370  m_configurationManager->guessAndReadFromFile(m_metadataManagerPtr);
371  }
372  else
373  {
374  char* whereConfig = gSystem->Which(TROOT::GetMacroPath(), m_configFileName.c_str(), kReadPermission);
375  m_configFileName = whereConfig;
376  delete [] whereConfig;
378  }
379  gEve->EnableRedraw();
380  }
382  {
383  fwLog(fwlog::kError) <<"Unable to load configuration file '"
384  << m_configFileName
385  << "': "
386  << e.error()
387  << std::endl;
388  exit(1);
389  }
390  catch (std::runtime_error &e)
391  {
392  fwLog(fwlog::kError) <<"Unable to load configuration file '"
393  << m_configFileName
394  << "' which was specified on command line. Quitting."
395  << std::endl;
396  exit(1);
397  }
398  }
399  /*
400  if(not m_configFileName.empty() ) {
401  //when the program quits we will want to save the configuration automatically
402  m_guiManager->goingToQuit_.connect(
403  boost::bind(&FWConfigurationManager::writeToFile,
404  m_configurationManager.get(),
405  m_configFileName));
406  }
407  */
408 }
409 
410 
411 void
413 {
414  m_playDelay = val;
415 }
416 
417 void
419 {
420  m_guiManager->updateStatus("Setting up Eve debug window...");
421  m_guiManager->openEveBrowserForDebugging();
422 }
423 
424 void
426 {
427  if(!m_loop) {
428  setPlayLoopImp();
429  m_guiManager->loopAction()->activated();
430  }
431 }
432 
433 void
435 {
436  if(m_loop) {
438  m_guiManager->loopAction()->stop();
439  }
440 }
441 
442 void
444 {
445  m_loop = true;
446 }
447 
448 void
450 {
451  m_loop = false;
452 }
453 
454 void
456 {
457  m_eiManager->add(iItem);
458 }
459 
460 void
462 {
463  m_forward = true;
464  m_isPlaying = true;
465  guiManager()->enableActions(kFALSE);
467 }
468 
469 void
471 {
472  m_forward = false;
473  m_isPlaying = true;
474  guiManager()->enableActions(kFALSE);
476 }
477 
478 void
480 { // prepare geometry service
481  // ATTN: this should be made configurable
482  try
483  {
484  guiManager()->updateStatus("Loading geometry...");
487  }
488  catch (const std::runtime_error& iException)
489  {
490  fwLog(fwlog::kError) << "CmsShowMain::loadGeometry() caught exception: \n"
491  << m_geometryFilename << " "
492  << iException.what() << std::endl;
493  exit(0);
494  }
495 }
496 
497 void
499 {
500  // Send version info to xrootd.t2.ucsd.edu receiver on port 9698.
501 
502  // receiver
503  struct hostent* h = gethostbyname("xrootd.t2.ucsd.edu");
504  if (!h) return;
505 
506 
507  struct sockaddr_in remoteServAddr;
508  remoteServAddr.sin_family = h->h_addrtype;
509  memcpy((char *) &remoteServAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
510  remoteServAddr.sin_port = htons(9698);
511 
512  // socket creation
513  int sd = socket(AF_INET,SOCK_DGRAM, 0);
514  if (sd < 0)
515  {
516  // std::cout << "can't create socket \n";
517  return;
518  }
519  // bind any port
520  // printf("bind port\n");
521  struct sockaddr_in cliAddr;
522  cliAddr.sin_family = AF_INET;
523  cliAddr.sin_addr.s_addr = htonl(INADDR_ANY);
524  cliAddr.sin_port = htons(0);
525 
526  int rc = bind(sd, (struct sockaddr *) &cliAddr, sizeof(cliAddr));
527  if (rc < 0) {
528  // std::cout << "can't bind port %d " << rc << std::endl;
529  return;
530  }
531 
532  // get OSX version
533  TString osx_version;
534  try {
535  std::ifstream infoFile("/System/Library/CoreServices/SystemVersion.plist");
536  osx_version.ReadFile(infoFile);
537  TPMERegexp re("ProductVersion\\</key\\>\\n\\t\\<string\\>(10.*)\\</string\\>");
538  re.Match(osx_version);
539  osx_version = re[1];
540  }
541  catch (...) {}
542 
543  // send data
544  SysInfo_t sInfo;
545  gSystem->GetSysInfo(&sInfo);
546  char msg[128];
547 
548  if (gSystem->Getenv("CMSSW_VERSION"))
549  {
550  snprintf(msg, 64,"%s %s %s", gSystem->Getenv("CMSSW_VERSION"), sInfo.fOS.Data(), osx_version.Data());
551  }
552  else
553  {
554  TString versionFileName("data/version.txt");
555  fireworks::setPath(versionFileName);
556  std::ifstream fs(versionFileName);
557  TString infoText;
558  infoText.ReadLine(fs);
559  fs.close();
560  snprintf(msg, 64,"Standalone %s %s %s", infoText.Data(), sInfo.fOS.Data(), osx_version.Data() );
561  }
562 
563 
564  int flags = 0;
565  sendto(sd, msg, strlen(msg), flags,
566  (struct sockaddr *) &remoteServAddr,
567  sizeof(remoteServAddr));
568 }
tuple base
Main Program
Definition: newFWLiteAna.py:92
void registerEventItem(const FWEventItem *iItem)
virtual void goToRunEvent(edm::RunNumber_t, edm::LuminosityBlockNumber_t, edm::EventNumber_t)=0
std::auto_ptr< FWConfigurationManager > m_configurationManager
std::string m_geometryFilename
FWGUIManager * guiManager()
void setGeom(const FWGeometry *x)
Definition: Context.h:51
void writeToConfigFile(const std::string &config)
virtual void nextEvent()=0
tuple lumi
Definition: fjr2json.py:35
FWEventItemsManager * eiManager()
unsigned long long EventNumber_t
std::vector< Variable::Flags > flags
Definition: MVATrainer.cc:135
void initReps(const FWTypeToRepresentations &iTypeAndReps)
void initEveElements()
Definition: Context.cc:95
std::auto_ptr< FWEventItemsManager > m_eiManager
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()
void setupAutoLoad(float x)
FWNavigatorBase * m_navigatorPtr
void newItemSlot(FWEventItem *)
FWBeamSpot * getBeamSpot() const
Definition: Context.h:78
void reloadConfiguration(const std::string &config)
FWMagField * getField() const
Definition: Context.h:77
virtual void firstEvent()=0
std::auto_ptr< SignalTimer > m_autoLoadTimer
void loadMap(const char *fileName)
Definition: FWGeometry.cc:52
void setPlayDelay(Float_t val)
virtual void eventChangedImp()
virtual void quit()=0
FWJobMetadataManager * m_metadataManagerPtr
double f[11][100]
const std::string sGotoLastEvent
Definition: ActionsList.cc:4
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
ESource getSource() const
Definition: FWMagField.h:33
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
virtual void previousEvent()=0
virtual const edm::EventBase * getCurrentEvent() const =0
std::auto_ptr< CmsShowTaskExecutor > m_startupTasks
void eventChangedCallback()
void clearStatus()
void checkFieldInfo(const edm::EventBase *)
Definition: FWMagField.cc:172
FWViewManagerManager * viewManager()
virtual void autoLoadNewEvent()=0
std::string m_simGeometryFilename
void add(boost::shared_ptr< FWViewManagerBase >)
#define fwLog(_level_)
Definition: fwLog.h:50
double sd
const std::string sGotoFirstEvent
Definition: ActionsList.cc:3
fireworks::Context * m_contextPtr
CmsShowCommon * commonPrefs() const
Definition: Context.cc:178
void add(const std::string &iName, FWConfigurable *)
does not take ownership
virtual void stopPlaying()=0
const std::string sPreviousEvent
Definition: ActionsList.cc:6
FWConfigurationManager * configurationManager()
void writeToCurrentConfigFile()
std::string m_autoSaveAllViewsFormat
std::auto_ptr< FWModelChangeManager > m_changeManager
void registerPhysicsObject(const FWPhysicsObjectDesc &iItem)
unsigned int RunNumber_t
volatile std::atomic< bool > shutdown_flag false
Definition: DDAxes.h:10
const std::string sQuit
Definition: ActionsList.cc:22
void goToRunEvent(edm::RunNumber_t, edm::LuminosityBlockNumber_t, edm::EventNumber_t)
std::auto_ptr< FWViewManagerManager > m_viewManager
std::auto_ptr< FWColorManager > m_colorManager
sigc::signal< void > goingToClearItems_
std::auto_ptr< FWGUIManager > m_guiManager
T get(const Candidate &c)
Definition: component.h:55
virtual void lastEvent()=0
void setPath(TString &v)
Definition: fwPaths.cc:15
sigc::signal< void > newEvent_
std::string m_configFileName