File indexing completed on 2024-04-06 12:11:37
0001 #include "Fireworks/Core/src/FWEveDetectorGeo.h"
0002 #include "Fireworks/Core/src/FWGeometryTableView.h"
0003 #include "Fireworks/Core/src/FWGeometryTableManager.h"
0004 #include "Fireworks/Core/interface/FWGeometryTableViewManager.h"
0005 #include "Fireworks/Core/interface/fwLog.h"
0006 #include "Fireworks/Core/src/FWPopupMenu.cc"
0007
0008 #include "TGeoMatrix.h"
0009
0010
0011
0012
0013 FWEveDetectorGeo::FWEveDetectorGeo(FWGeometryTableView* v) : m_browser(v), m_maxLevel(0), m_filterOff(false) {}
0014
0015 FWGeometryTableManagerBase* FWEveDetectorGeo::tableManager() { return m_browser->getTableManager(); }
0016
0017 FWGeometryTableViewBase* FWEveDetectorGeo::browser() { return m_browser; }
0018
0019
0020 void FWEveDetectorGeo::Paint(Option_t* opt) {
0021 FWGeoTopNode::Paint();
0022
0023
0024 if (m_browser->getTableManager()->refEntries().empty())
0025 return;
0026
0027 TEveGeoManagerHolder gmgr(FWGeometryTableViewManager::getGeoMangeur());
0028
0029 m_maxLevel = m_browser->getVisLevel() + m_browser->getTableManager()->getLevelOffset();
0030
0031 m_filterOff = m_browser->getFilter().empty();
0032
0033 Int_t topIdx = m_browser->getTopNodeIdx();
0034 FWGeometryTableManagerBase::Entries_i sit = m_browser->getTableManager()->refEntries().begin();
0035
0036 TGeoHMatrix mtx;
0037 if (topIdx >= 0) {
0038 std::advance(sit, topIdx);
0039 m_browser->getTableManager()->getNodeMatrix(*sit, mtx);
0040 }
0041
0042 bool drawsChildren = false;
0043
0044 if (((FWGeometryTableManager*)tableManager())->getVisibilityChld(*sit))
0045 drawsChildren = paintChildNodesRecurse(sit, topIdx, mtx);
0046
0047 if (sit->testBit(FWGeometryTableManagerBase::kVisNodeSelf) &&
0048 ((FWGeometryTableManager*)tableManager())->getVisibility(*sit))
0049 paintShape(topIdx, mtx, m_browser->getVolumeMode(), drawsChildren);
0050
0051 fflush(stdout);
0052 }
0053
0054
0055 bool FWEveDetectorGeo::paintChildNodesRecurse(FWGeometryTableManagerBase::Entries_i pIt,
0056 Int_t cnt,
0057 const TGeoHMatrix& parentMtx) {
0058 TGeoNode* parentNode = pIt->m_node;
0059 int nD = parentNode->GetNdaughters();
0060
0061 int dOff = 0;
0062
0063 pIt++;
0064 int pcnt = cnt + 1;
0065
0066 bool drawsChildNodes = false;
0067
0068 FWGeometryTableManagerBase::Entries_i it;
0069 for (int n = 0; n != nD; ++n) {
0070 it = pIt;
0071 std::advance(it, n + dOff);
0072 cnt = pcnt + n + dOff;
0073
0074 TGeoHMatrix nm = parentMtx;
0075 nm.Multiply(it->m_node->GetMatrix());
0076
0077 bool drawsChildNodesSecondGen = false;
0078 if (m_filterOff || m_browser->isSelectedByRegion()) {
0079 if (((FWGeometryTableManager*)tableManager())->getVisibilityChld(*it) && (it->m_level < m_maxLevel)) {
0080 drawsChildNodesSecondGen = paintChildNodesRecurse(it, cnt, nm);
0081 }
0082
0083 if (((FWGeometryTableManager*)tableManager())->getVisibility(*it)) {
0084 paintShape(cnt, nm, m_browser->getVolumeMode(), drawsChildNodesSecondGen);
0085 drawsChildNodes = true;
0086 }
0087
0088 } else {
0089 if (((FWGeometryTableManager*)tableManager())->getVisibilityChld(*it) &&
0090 (it->m_level < m_maxLevel || m_browser->getIgnoreVisLevelWhenFilter())) {
0091 drawsChildNodesSecondGen = paintChildNodesRecurse(it, cnt, nm);
0092 }
0093
0094 ((FWGeometryTableManager*)tableManager())->assertNodeFilterCache(*it);
0095 if (((FWGeometryTableManager*)tableManager())->getVisibility(*it)) {
0096 paintShape(cnt, nm, m_browser->getVolumeMode(), drawsChildNodesSecondGen);
0097 drawsChildNodes = true;
0098 }
0099 }
0100
0101 drawsChildNodes |= drawsChildNodesSecondGen;
0102 FWGeometryTableManagerBase::getNNodesTotal(parentNode->GetDaughter(n), dOff);
0103 }
0104
0105 return drawsChildNodes;
0106 }
0107
0108
0109
0110 TString FWEveDetectorGeo::GetHighlightTooltip() {
0111 std::set<TGLPhysicalShape*>::iterator it = fHted.begin();
0112 int idx = tableIdx(*it);
0113 if (idx > 0) {
0114 FWGeometryTableManagerBase::NodeInfo& data = m_browser->getTableManager()->refEntries().at(idx);
0115 return data.name();
0116 }
0117 return "error";
0118 }
0119
0120
0121
0122 void FWEveDetectorGeo::popupMenu(int x, int y, TGLViewer* v) {
0123 FWPopupMenu* nodePopup = FWGeoTopNode::setPopupMenu(x, y, v, false);
0124
0125 if (nodePopup)
0126 nodePopup->Connect("Activated(Int_t)", "FWGeometryTableView", m_browser, "chosenItem(Int_t)");
0127 }