23 #include "TEveQuadSet.h"
24 #include "TGeoVolume.h"
25 #include "TGeoMatrix.h"
26 #include "TGeoShape.h"
28 #include "TGeoMatrix.h"
30 #include "TObjString.h"
32 #include "TGeoOverlap.h"
33 #include "TGeoManager.h"
34 #include "TPolyMarker3D.h"
36 #include "TStopwatch.h"
38 #include "TGeoPainter.h"
55 std::vector<std::string> returnValue;
58 returnValue.push_back(
"Name");
59 returnValue.push_back(
"Color");
60 returnValue.push_back(
"Opcty");
61 returnValue.push_back(
"RnrSelf");
62 returnValue.push_back(
"RnrChildren");
63 returnValue.push_back(
"Overlap");
64 returnValue.push_back(
"RnrMarker");
81 topNodeInfo.
m_node = gGeoManager->GetTopNode();
83 topNodeInfo.
m_color = gGeoManager->GetTopNode()->GetVolume()->GetLineColor();
84 topNodeInfo.
m_transparency = gGeoManager->GetTopNode()->GetVolume()->GetTransparency();
88 m_entries.resize(gGeoManager->GetNNodes());
91 m_entries.resize( gGeoManager->GetNNodes());
93 TGeoVolume* topVol = topNodeInfo.
m_node->GetVolume();
98 bool checkingOverlaps =
false;
99 TGeoManager *
geom = topVol->GetGeoManager();
100 ncheck = topNodeInfo.
m_node->CountDaughters(kFALSE);
101 timer =
new TStopwatch();
102 geom->ClearOverlaps();
103 geom->SetCheckingOverlaps(kTRUE);
107 geom->GetGeomPainter()->OpProgress(topVol->GetName(),icheck,ncheck,timer,kFALSE);
110 TGeoIterator git(topVol);
126 while ((node=git())) {
129 eit->m_color = node->GetVolume()->GetLineColor();
130 eit->m_transparency = node->GetVolume()->GetTransparency();
131 eit->m_level = git.GetLevel();
132 eit->m_parent = icheck;
134 if ((topNodeIdx )== icheck || !topNodeIdx ) {
136 checkingOverlaps=
true;
140 checkingOverlaps=
false;
148 if (pit->m_level < eit->m_level)
153 if ( checkingOverlaps) {
154 if (!node->GetVolume()->IsSelected()) {
155 geom->GetGeomPainter()->OpProgress(node->GetVolume()->GetName(),icheck+1,ncheck,timer,kFALSE);
156 node->GetVolume()->SelectVolume(kFALSE);
158 node->GetVolume()->CheckOverlaps(iPrecision);
160 if (oldS != gGeoManager->GetListOfOverlaps()->GetEntriesFast()) {
167 TGeoHMatrix* motherm =
new TGeoHMatrix(*geom->GetCurrentMatrix());
169 TGeoNode* ni = topNodeInfo.
m_node;
170 for (Int_t i=1; i<=git.GetLevel(); i++) {
171 ni = ni->GetDaughter(git.GetIndex(i));
172 motherm->Multiply(ni->GetMatrix());
176 int newCnt = gGeoManager->GetListOfOverlaps()->GetEntriesFast();
178 for (
int i=oldS; i<newCnt; ++
i)
181 addOverlapEntry((TGeoOverlap*)gGeoManager->GetListOfOverlaps()->At(i),
i, icheck, motherm);
194 topVol->SelectVolume(kTRUE);
195 geom->SetCheckingOverlaps(kFALSE);
197 TObjArray *
overlaps = geom->GetListOfOverlaps();
198 Int_t novlps = overlaps->GetEntriesFast();
200 for (i=0; i<novlps; i++) {
201 obj = (TNamed*)overlaps->At(i);
202 obj->SetName(Form(
"ov%05d",i));
204 geom->GetGeomPainter()->OpProgress(
"Check overlaps:",icheck,ncheck,timer,kTRUE);
205 Info(
"CheckOverlaps",
"Number of illegal overlaps/extrusions : %d\n", novlps);
223 int pcnt = parentIdx+1;
225 TGeoNode* mothern =
m_entries[parentIdx].m_node;
229 for (
int i = 0;
i < mothern->GetNdaughters(); ++
i)
231 TGeoNode*
n = mothern->GetDaughter(
i);
233 int cnt = pcnt +
i+dOff;
235 if (ovl->IsOverlap()) {
236 if (n->GetVolume() == ovl->GetFirstVolume() && (*(ovl->GetFirstMatrix()) == *(n->GetMatrix())))
244 int nno; n->GetOverlaps(nno);
245 nno |= BIT(1); n->SetOverlaps(0, nno);
250 if (n->GetVolume() == ovl->GetSecondVolume() && (*(ovl->GetSecondMatrix()) == *(n->GetMatrix())))
260 int nno; n->GetOverlaps(nno);
261 nno |= (ovl->IsOverlap() ? BIT(1) : BIT(2));
262 n->SetOverlaps(0, nno);
272 TPolyMarker3D* pm = ovl->GetPolyMarker();
273 for (
int j=0;
j<pm->GetN(); ++
j )
277 pm->GetPoint(
j, pl[0], pl[1], pl[2]);
278 motherm->LocalToMaster(pl, pg);
280 float dx = TMath::Abs(ovl->GetOverlap());
283 fwLog(
fwlog::kInfo) << Form(
"WARNING [%s], overlap size = %.1f \n", ovl->GetTitle(), dx);
286 float dy = dx, dz = 0;
287 float fp[3]; fp[0] = pg[0];fp[1] = pg[1];fp[2] = pg[2];
289 fp[0] +dx, fp[1] -dy, fp[2] -dz,
290 fp[0] +dx, fp[1] +dy, fp[2] +dz,
291 fp[0] -dx, fp[1] +dy, fp[2] +dz,
292 fp[0] -dx, fp[1] -dy, fp[2] -dz
299 int aIdx = parentIdx;
int aLev =
m_entries[aIdx].m_level;
302 while(aIdx > topNodeIdx)
331 TGeoNode* parentNode =
m_entries[pIdx].m_node;
332 int nD = parentNode->GetNdaughters();
334 for (
int n = 0;
n != nD; ++
n)
336 int idx = pIdx + 1 +
n + dOff;
362 std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
364 for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
365 const TGeoOverlap* ovl = (
const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
366 if (ovl) ovl->Print();
374 std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
376 for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
377 const TGeoOverlap* ovl = (
const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
382 txt += Form(
"%s: %g, ", ovl->IsOverlap() ?
"Ovl" :
"Extr", ovl->GetOverlap());
383 txt += ovl->GetTitle();
418 if (unsortedRow < 0) printf(
"!!!!!!!!!!!!!!!! error %d %d \n",unsortedRow, iSortedRowNumber);
454 TIter next_ovl(gGeoManager->GetListOfOverlaps());
455 const TGeoOverlap* ovl;
456 while((ovl = (TGeoOverlap*)next_ovl()))
457 ovl->IsOverlap() ? no++ :
ne++;
484 std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
489 for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
490 const TGeoOverlap* ovl = (
const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
492 x += Form(
"%s: %g ", ovl->IsOverlap() ?
"Ovl" :
"Extr", ovl->GetOverlap());
525 std::cerr <<
"This shoud not happen! \n" ;
538 TGeoNode* parentNode =
m_entries[selectedIdx].m_node;
539 int nD = parentNode->GetNdaughters();
540 for (
int n = 0;
n != nD; ++
n)
542 int idx = selectedIdx + 1 +
n + dOff;
std::multimap< int, int > m_mapNodeOverlaps
const char * name() const
std::vector< int > m_row_to_index
void setIsOpen(bool value)
FWEveDigitSetScalableMarker * getMarker()
TGGC * m_highlightContext
void addOverlapEntry(TGeoOverlap *, int, int, TGeoHMatrix *)
void printOverlaps(int) const
void setData(Color_t c, bool)
bool listAllNodes() const
virtual void recalculateVisibilityNodeRec(int)
std::vector< int > m_nodes
void getOverlapTitles(int, TString &) const
virtual std::vector< std::string > getTitles() const
returns the title names for each column
FWTableCellRendererBase * cellRenderer(int iSortedRowNumber, int iCol) const
void setIsParent(bool value)
int m_editTransparencyIdx
FWOverlapTableManager(FWOverlapTableView *)
virtual void setIndentation(int indentation=0)
static void getNNodesTotal(TGeoNode *geoNode, int &off)
void setData(const std::string &, bool isSelected)
virtual void recalculateVisibility()
tuple idx
DEBUGGING if hasattr(process,"trackMonIterativeTracking2012"): print "trackMonIterativeTracking2012 D...
void setDaughtersSelfVisibility(int i, bool v)
virtual int numberOfColumns() const
Number of columns in the table.
static TGeoManager * getGeoMangeur()
char data[epos_bytes_allocation]
int getTopNodeIdx() const
void setBitVal(UChar_t f, bool x)
virtual ~FWOverlapTableManager()
Entries_v::iterator Entries_i
FWTextTreeCellRenderer m_renderer
bool testBitAny(UChar_t f) const
ColorBoxRenderer m_colorBoxRenderer
bool testBit(UChar_t f) const
virtual bool nodeIsParent(const NodeInfo &) const
void importOverlaps(std::string path, double precision)
FWOverlapTableView * m_browser
virtual void showEditor(bool value)