Go to the documentation of this file.00001 #include "Fireworks/Core/src/FWEveDetectorGeo.h"
00002 #include "Fireworks/Core/src/FWGeometryTableView.h"
00003 #include "Fireworks/Core/src/FWGeometryTableManager.h"
00004 #include "Fireworks/Core/interface/FWGeometryTableViewManager.h"
00005 #include "Fireworks/Core/interface/fwLog.h"
00006 #include "Fireworks/Core/src/FWPopupMenu.cc"
00007
00008 #include "TGeoMatrix.h"
00009
00010
00011
00012
00013 FWEveDetectorGeo::FWEveDetectorGeo(FWGeometryTableView* v):
00014 m_browser(v), m_maxLevel(0), m_filterOff(0)
00015 {
00016 }
00017
00018 FWGeometryTableManagerBase* FWEveDetectorGeo::tableManager()
00019 {
00020 return m_browser->getTableManager();
00021 }
00022
00023 FWGeometryTableViewBase* FWEveDetectorGeo::browser()
00024 {
00025 return m_browser;
00026 }
00027
00028
00029 void FWEveDetectorGeo::Paint(Option_t* opt)
00030 {
00031 FWGeoTopNode::Paint();
00032
00033
00034 if (m_browser->getTableManager()->refEntries().empty()) return;
00035
00036 TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
00037
00038 m_maxLevel = m_browser->getVisLevel() + m_browser->getTableManager()->getLevelOffset();
00039
00040 m_filterOff = m_browser->getFilter().empty();
00041
00042 Int_t topIdx = m_browser->getTopNodeIdx();
00043 FWGeometryTableManagerBase::Entries_i sit = m_browser->getTableManager()->refEntries().begin();
00044
00045 TGeoHMatrix mtx;
00046 if (topIdx >= 0)
00047 {
00048 std::advance(sit, topIdx);
00049 m_browser->getTableManager()->getNodeMatrix(*sit, mtx);
00050 }
00051
00052 bool drawsChildren = 0;
00053
00054 if ( ((FWGeometryTableManager*)tableManager())->getVisibilityChld(*sit))
00055 drawsChildren = paintChildNodesRecurse( sit, topIdx, mtx);
00056
00057 if (sit->testBit(FWGeometryTableManagerBase::kVisNodeSelf) && ((FWGeometryTableManager*)tableManager())->getVisibility(*sit))
00058 paintShape( topIdx,mtx, m_browser->getVolumeMode(), drawsChildren );
00059
00060
00061 fflush(stdout);
00062 }
00063
00064
00065
00066 bool FWEveDetectorGeo::paintChildNodesRecurse (FWGeometryTableManagerBase::Entries_i pIt, Int_t cnt, const TGeoHMatrix& parentMtx)
00067 {
00068 TGeoNode* parentNode = pIt->m_node;
00069 int nD = parentNode->GetNdaughters();
00070
00071 int dOff=0;
00072
00073 pIt++;
00074 int pcnt = cnt+1;
00075
00076 bool drawsChildNodes = 0;
00077
00078 FWGeometryTableManagerBase::Entries_i it;
00079 for (int n = 0; n != nD; ++n)
00080 {
00081 it = pIt;
00082 std::advance(it,n + dOff);
00083 cnt = pcnt + n+dOff;
00084
00085 TGeoHMatrix nm = parentMtx;
00086 nm.Multiply(it->m_node->GetMatrix());
00087
00088 bool drawsChildNodesSecondGen = false;
00089 if (m_filterOff || m_browser->isSelectedByRegion())
00090 {
00091 if ( ((FWGeometryTableManager*)tableManager())->getVisibilityChld(*it) && ( it->m_level < m_maxLevel)) {
00092 drawsChildNodesSecondGen = paintChildNodesRecurse(it,cnt , nm);
00093 }
00094
00095 if ( ((FWGeometryTableManager*)tableManager())->getVisibility(*it))
00096 {
00097 paintShape(cnt , nm, m_browser->getVolumeMode(), drawsChildNodesSecondGen );
00098 drawsChildNodes = true;
00099 }
00100
00101 }
00102 else
00103 {
00104 if ( ((FWGeometryTableManager*)tableManager())->getVisibilityChld(*it) && ( it->m_level < m_maxLevel || m_browser->getIgnoreVisLevelWhenFilter() ))
00105 {
00106 drawsChildNodesSecondGen = paintChildNodesRecurse(it,cnt , nm);
00107 }
00108
00109 ((FWGeometryTableManager*)tableManager())->assertNodeFilterCache(*it);
00110 if ( ((FWGeometryTableManager*)tableManager())->getVisibility(*it))
00111 {
00112 paintShape(cnt , nm, m_browser->getVolumeMode(), drawsChildNodesSecondGen );
00113 drawsChildNodes = true;
00114 }
00115 }
00116
00117 drawsChildNodes |= drawsChildNodesSecondGen;
00118 FWGeometryTableManagerBase::getNNodesTotal(parentNode->GetDaughter(n), dOff);
00119 }
00120
00121 return drawsChildNodes;
00122 }
00123
00124
00125
00126 TString FWEveDetectorGeo::GetHighlightTooltip()
00127 {
00128 std::set<TGLPhysicalShape*>::iterator it = fHted.begin();
00129 int idx = tableIdx(*it);
00130 if (idx > 0)
00131 {
00132 FWGeometryTableManagerBase::NodeInfo& data = m_browser->getTableManager()->refEntries().at(idx);
00133 return data.name();
00134 }
00135 return "error";
00136 }
00137
00138
00139
00140 void FWEveDetectorGeo::popupMenu(int x, int y, TGLViewer* v)
00141 {
00142 FWPopupMenu* nodePopup = FWGeoTopNode::setPopupMenu(x, y, v, false);
00143
00144 if (nodePopup) nodePopup->Connect("Activated(Int_t)",
00145 "FWGeometryTableView",
00146 m_browser,
00147 "chosenItem(Int_t)");
00148 }