CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FWOverlapTableManager.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Core
4 // Class : FWOverlapTableManager
5 //
6 // Implementation:
7 // [Notes on implementation]
8 //
9 // Original Author:
10 // Created: Wed Jan 4 20:31:32 CET 2012
11 // $Id: FWOverlapTableManager.cc,v 1.8 2012/04/25 06:09:35 amraktad Exp $
12 //
13 
14 // system include files
15 
16 // user include files
21 
22 #include "TEvePointSet.h"
23 #include "TGeoVolume.h"
24 #include "TGeoMatrix.h"
25 #include "TGeoShape.h"
26 #include "TGeoBBox.h"
27 #include "TGeoMatrix.h"
28 #include "TEveUtil.h"
29 #include "TObjString.h"
30 #include "TGeoNode.h"
31 #include "TGeoOverlap.h"
32 #include "TGeoManager.h"
33 #include "TPolyMarker3D.h"
34 
35 #include "TStopwatch.h"
36 #include "TTimer.h"
37 #include "TGeoPainter.h"
38 #include "TPRegexp.h"
39 
42  m_browser(v)
43 {
44 }
45 
47 {
48 }
49 
50 
51 
52 std::vector<std::string> FWOverlapTableManager::getTitles() const
53 {
54  std::vector<std::string> returnValue;
55  returnValue.reserve(numberOfColumns());
56 
57  returnValue.push_back("Name");
58  returnValue.push_back("Color");
59  returnValue.push_back("Opcty");
60  returnValue.push_back("RnrSelf");
61  returnValue.push_back("RnrChildren");
62  returnValue.push_back("Overlap");
63  returnValue.push_back("RnrMarker");
64  return returnValue;
65 }
66 
67 
68 
69 
70 //---------------------------------------------------------------------------------
71 void FWOverlapTableManager::importOverlaps(std::string iPath, double iPrecision)
72 {
73  m_entries.clear();
74  m_mapNodeOverlaps.clear();
75  m_browser->m_markerVertices.clear();
76  m_browser->m_markerIndices.clear();
77 
78  TEveGeoManagerHolder mangeur( FWGeometryTableViewManager::getGeoMangeur());
79  // gGeoManager->cd();
80  NodeInfo topNodeInfo;
81  topNodeInfo.m_node = gGeoManager->GetTopNode();
82  topNodeInfo.m_level = 0;
83  topNodeInfo.m_color = gGeoManager->GetTopNode()->GetVolume()->GetLineColor();
84  topNodeInfo.m_transparency = gGeoManager->GetTopNode()->GetVolume()->GetTransparency();
85  topNodeInfo.m_parent = -1;
86  topNodeInfo.resetBit(kVisNodeSelf);
87 
88  m_entries.resize(gGeoManager->GetNNodes());
89  m_entries[0] = topNodeInfo;
90 
91  m_entries.resize( gGeoManager->GetNNodes());
92 
93  TGeoVolume* topVol = topNodeInfo.m_node->GetVolume();
94  Int_t icheck = 0;
95  Int_t ncheck = 0;
96  TStopwatch *timer;
97  Int_t i;
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);
104 
105  int oldS = 0;
106  timer->Start();
107  geom->GetGeomPainter()->OpProgress(topVol->GetName(),icheck,ncheck,timer,kFALSE);
108 // topVol->CheckOverlaps(iPrecision);
109  icheck++;
110  TGeoIterator git(topVol);
111  Entries_i eit = m_entries.begin();
112  /*
113  if (gGeoManager->GetListOfOverlaps()->GetEntriesFast()) {
114  int newCnt = gGeoManager->GetListOfOverlaps()->GetEntriesFast();
115  for (int i=0; i<newCnt; ++i) {
116  addOverlapEntry((TGeoOverlap*)gGeoManager->GetListOfOverlaps()->At(i), new TGeoHMatrix(*geom->GetCurrentMatrix()), topNode, next);
117  }
118  oldS= newCnt;
119  }*/
120  eit++;
121  TGeoNode *node;
122  icheck = 1;
123 
124  int topNodeIdx = m_browser->getTopNodeIdx();
125 
126  while ((node=git())) {
127  if (!eit->testBit(kOverlap)) eit->resetBit(kVisNodeSelf);
128  eit->m_node = node;
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;
133 
134  if ((topNodeIdx )== icheck || !topNodeIdx ) {
135  // printf("start to check overlaps on topNodeIdx %s \n", eit->name());
136  checkingOverlaps=true;
137  }
138  else if (checkingOverlaps && ( eit->m_level <= m_entries[m_browser->getTopNodeIdx()].m_level))
139  {
140  checkingOverlaps=false;
141  }
142  // parent index
143  Entries_i pit = eit;
144  do
145  {
146  --pit;
147  --(eit->m_parent);
148  if (pit->m_level < eit->m_level)
149  break;
150  } while (pit != m_entries.begin());
151 
152  // overlap bits
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);
157 
158  node->GetVolume()->CheckOverlaps(iPrecision);
159 
160  if (oldS != gGeoManager->GetListOfOverlaps()->GetEntriesFast()) {
161  // printf("mother %s overlaps \n", node->GetName());
162 
163  eit->setBit(kOverlapChild);
164  eit->setBit(kVisNodeChld);
165  eit->setBit(kVisMarker);
166 
167  TGeoHMatrix* motherm = new TGeoHMatrix(*geom->GetCurrentMatrix());
168  {
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());
173  }
174  }
175 
176  int newCnt = gGeoManager->GetListOfOverlaps()->GetEntriesFast();
177 
178  for (int i=oldS; i<newCnt; ++i)
179  {
180  // printf("add %p %p \n", (void*)node->GetVolume(), (void*)m_entries[icheck].m_node->GetVolume());
181  addOverlapEntry((TGeoOverlap*)gGeoManager->GetListOfOverlaps()->At(i), i, icheck, motherm);
182  }
183 
184  oldS = newCnt;
185  }
186  }
187  }
188  eit++;
189  icheck ++;
190  }
191 
192  topVol->SelectVolume(kTRUE);
193  geom->SetCheckingOverlaps(kFALSE);
194  // geom->SortOverlaps();
195  TObjArray *overlaps = geom->GetListOfOverlaps();
196  Int_t novlps = overlaps->GetEntriesFast();
197  TNamed *obj;
198  for (i=0; i<novlps; i++) {
199  obj = (TNamed*)overlaps->At(i);
200  obj->SetName(Form("ov%05d",i));
201  }
202  geom->GetGeomPainter()->OpProgress("Check overlaps:",icheck,ncheck,timer,kTRUE);
203  Info("CheckOverlaps", "Number of illegal overlaps/extrusions : %d\n", novlps);
204  delete timer;
205 }
206 
207 
208 //______________________________________________________________________________
209 
210 
211 void FWOverlapTableManager::addOverlapEntry(TGeoOverlap* ovl, int ovlIdx, Int_t parentIdx, TGeoHMatrix* motherm)
212 {
213 
214  // printf("add %s \n", ovl->GetTitle());
215  // get doughter indices of overlaps
216  /*
217  TPMERegexp re(" ", "o");
218  re.Split(TString(ovl->GetTitle()));
219  printf("add title %s \n", ovl->GetTitle());
220  */
221  int pcnt = parentIdx+1;
222  int dOff =0;
223  TGeoNode* mothern = m_entries[parentIdx].m_node;
224 
225  for (int i = 0; i < mothern->GetNdaughters(); ++i)
226  {
227  TGeoNode* n = mothern->GetDaughter(i);
228 
229  int cnt = pcnt + i+dOff;
230 
231  if (ovl->IsOverlap()) {
232  if (n->GetVolume() == ovl->GetFirstVolume() && (*(ovl->GetFirstMatrix()) == *(n->GetMatrix())))
233  {
234  // std::string x = re[0].Data();
235  //if (x.find(n->GetName()) == std::string::npos) printf("ERROT \n");
236 
237  m_entries[cnt].setBit(kOverlap);
238  m_entries[cnt].setBit(kVisNodeSelf);
239  m_mapNodeOverlaps.insert(std::pair<int, int>(cnt, ovlIdx));
240  int nno; n->GetOverlaps(nno);
241  nno |= BIT(1); n->SetOverlaps(0, nno);
242  }
243 
244  }
245 
246  if (n->GetVolume() == ovl->GetSecondVolume() && (*(ovl->GetSecondMatrix()) == *(n->GetMatrix())))
247  {
248  //printf("-----------------------------------------------\n");
249  // std::string x = re[2].Data();
250  // if (x.find(n->GetName()) == std::string::npos) printf("ERROT \n");
251 
252  m_entries[cnt].setBit(kOverlap);
253  m_entries[cnt].setBit(kVisNodeSelf);
254 
255  m_mapNodeOverlaps.insert(std::pair<int, int>(cnt, ovlIdx));
256  int nno; n->GetOverlaps(nno);
257  nno |= (ovl->IsOverlap() ? BIT(1) : BIT(2));
258  n->SetOverlaps(0, nno);
259 
260  }
261 
262 
264  }
265 
266  TPolyMarker3D* pm = ovl->GetPolyMarker();
267  for (int j=0; j<pm->GetN(); ++j )
268  {
269  double pl[3];
270  double pg[3];
271  pm->GetPoint(j, pl[0], pl[1], pl[2]);
272  motherm->LocalToMaster(pl, pg);
273  m_browser->m_markerIndices.push_back(ovl->IsExtrusion() ? -parentIdx : parentIdx);
274 
275  m_browser->m_markerVertices.push_back( pg[0]);
276  m_browser->m_markerVertices.push_back( pg[1]);
277  m_browser->m_markerVertices.push_back( pg[2]);
278  }
279 
280 
281  int aIdx = parentIdx;
282  int aLev = m_entries[aIdx].m_level;
283  int topNodeIdx = m_browser->getTopNodeIdx();
284 
285  while(aIdx > topNodeIdx)
286  {
287  aIdx--;
288  if (m_entries[aIdx].m_level < aLev)
289  {
290  m_entries[aIdx].setBit(kOverlapChild);
291  m_entries[aIdx].setBit(kVisNodeChld);
292  // printf("stamp %s \n", m_entries[aIdx].name());
293  aLev--;
294  }
295  }
296 }
297 
298 
299 //_____________________________________________________________________________
300 
302 {
303  // printf("overlap recalcuate vis \n");
304  m_row_to_index.clear();
305  int i = m_browser->getTopNodeIdx();
306  m_row_to_index.push_back(i);
307 
308  if (m_entries[i].testBit(kExpanded) )
310 }
311 
313 {
314  TGeoNode* parentNode = m_entries[pIdx].m_node;
315  int nD = parentNode->GetNdaughters();
316  int dOff=0;
317  for (int n = 0; n != nD; ++n)
318  {
319  int idx = pIdx + 1 + n + dOff;
320  NodeInfo& data = m_entries[idx];
321 
322 
324  m_row_to_index.push_back(idx);
325 
326  if ((m_browser->listAllNodes() || data.testBit(kOverlapChild)) && data.testBit(kExpanded) )
328 
329  FWGeometryTableManagerBase::getNNodesTotal(parentNode->GetDaughter(n), dOff);
330  }
331 }
332 
333 
334 //______________________________________________________________________________
335 
337 {
338  return m_browser->listAllNodes() ? data.m_node->GetNdaughters() : data.testBit(kOverlapChild) ;
339 }
340 
342 {
343 
344  TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
345  std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
346  ppp = m_mapNodeOverlaps.equal_range(idx);
347  for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
348  const TGeoOverlap* ovl = (const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
349  if (ovl) ovl->Print();
350  }
351 }
352 
353 void FWOverlapTableManager::getOverlapTitles(int idx, TString& txt) const
354 {
355 
356  TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
357  std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
358  ppp = m_mapNodeOverlaps.equal_range(idx);
359  for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
360  const TGeoOverlap* ovl = (const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
361  {
362  txt += "\n";
363 
364  if (ovl) {
365  txt += Form("%s: %g, ", ovl->IsOverlap() ? "Ovl" : "Extr", ovl->GetOverlap());
366  txt += ovl->GetTitle();
367  }
368  }
369  }
370 }
371 //______________________________________________________________________________
372 /*
373  const char* FWOverlapTableManager::cellName(const NodeInfo& data) const
374  {
375  if (data.m_parent == -1)
376  {
377  int ne = 0;
378  int no = 0;
379  TGeoOverlap* ovl;
380  TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
381  TIter next_ovl(gGeoManager->GetListOfOverlaps());
382  while((ovl = (TGeoOverlap*)next_ovl()))
383  ovl->IsOverlap() ? no++ : ne++;
384 
385  return Form("%s Ovl[%d] Ext[%d]", data.m_node->GetName(), no, ne);
386  }
387  else
388  {
389  return data.name();
390  }
391  }*/
392 
393 //______________________________________________________________________________
394 
395 FWTableCellRendererBase* FWOverlapTableManager::cellRenderer(int iSortedRowNumber, int iCol) const
396 {
397  if (m_row_to_index.empty()) return &m_renderer;
398 
399  int unsortedRow = m_row_to_index[iSortedRowNumber];
400 
401  if (unsortedRow < 0) printf("!!!!!!!!!!!!!!!! error %d %d \n",unsortedRow, iSortedRowNumber);
402 
403  // editor state
404  //
405  m_renderer.showEditor(unsortedRow == m_editTransparencyIdx && iCol == 2);
406 
407 
408  // selection state
409  //
410  const NodeInfo& data = m_entries[unsortedRow];
411 
412  bool isSelected = data.testBit(kHighlighted) || data.testBit(kSelected);
413  if (m_browser->listAllNodes()) isSelected = isSelected || data.testBit(kOverlap);
414 
415  if (data.testBit(kSelected))
416  {
417  m_highlightContext->SetBackground(0xc86464);
418  }
419  else if (data.testBit(kHighlighted) )
420  {
421  m_highlightContext->SetBackground(0x6464c8);
422  }
423  else if (m_browser->listAllNodes() && data.testBit(kOverlap) )
424  {
425  m_highlightContext->SetBackground(0xdddddd);
426  }
427 
428 
429  // set column content
430  //
431  if (iCol == 0)
432  {
433  if (unsortedRow == m_browser->getTopNodeIdx())
434  {
435  int no = 0, ne =0;
436  TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
437  TIter next_ovl(gGeoManager->GetListOfOverlaps());
438  const TGeoOverlap* ovl;
439  while((ovl = (TGeoOverlap*)next_ovl()))
440  ovl->IsOverlap() ? no++ : ne++;
441 
442  m_renderer.setData(Form("%s Ovl[%d] Ext[%d]", data.m_node->GetName(), no, ne), isSelected);
443  }
444  else {
445  m_renderer.setData(data.name(), isSelected);
446  }
448 
450 
451  int level = data.m_level - m_levelOffset;
452  if (nodeIsParent(data))
453  m_renderer.setIndentation(20*level);
454  else
456  }
457  else
458  {
459  m_renderer.setIsParent(false);
461 
462  if (iCol == 5)
463  {
464  if (data.testBit(kOverlap) )
465  {
466  std::string x;
467  std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
468  ppp = m_mapNodeOverlaps.equal_range(unsortedRow);
469 
470  TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
471 
472  for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
473  const TGeoOverlap* ovl = (const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
474  if (ovl)
475  x += Form("%s: %g ", ovl->IsOverlap() ? "Ovl" : "Extr", ovl->GetOverlap());
476  else
477  x += "err";
478 
479  }
480  m_renderer.setData(x, isSelected);
481  }
482  else
483  {
484  m_renderer.setData("", isSelected);
485  }
486  }
487  if (iCol == 1)
488  {
489  m_colorBoxRenderer.setData(data.m_color, isSelected);
490  return &m_colorBoxRenderer;
491  }
492  else if (iCol == 2 )
493  {
494  m_renderer.setData(Form("%d", 100 -data.m_transparency), isSelected);
495  }
496  else if (iCol == 3 )
497  {
498  m_renderer.setData(data.testBit(kVisNodeSelf) ? "On" : "-", isSelected );
499 
500  }
501  else if (iCol == 4 )
502  {
503  m_renderer.setData(data.testBit(kVisNodeChld) ? "On" : "-", isSelected);
504 
505  }
506  else if (iCol == 6)
507  {
508  bool motherV = false;
509  if (data.testBit(kOverlapChild))
510  {
511  for (std::vector<int>::iterator i = m_browser->m_markerIndices.begin(); i!= m_browser->m_markerIndices.end(); i++)
512  {
513  if (TMath::Abs(*i) == unsortedRow) {
514  motherV = true;
515  break;
516  }
517  }
518  }
519 
520  m_renderer.setData(motherV ? (data.testBit(kVisMarker) ? "On" : "-") : "", isSelected);
521  }
522  }
523  return &m_renderer;
524 }
525 
526 
527 
528 //______________________________________________________________________________
529 
531 {
532  int dOff = 0;
533  TGeoNode* parentNode = m_entries[selectedIdx].m_node;
534  int nD = parentNode->GetNdaughters();
535  for (int n = 0; n != nD; ++n)
536  {
537  int idx = selectedIdx + 1 + n + dOff;
538  NodeInfo& data = m_entries[idx];
539 
542 
543 
544  FWGeometryTableManagerBase::getNNodesTotal(parentNode->GetDaughter(n), dOff);
545  }
546 }
int i
Definition: DBlmapReader.cc:9
std::multimap< int, int > m_mapNodeOverlaps
std::vector< float > m_markerVertices
std::vector< int > m_markerIndices
tuple node
Definition: Node.py:50
void addOverlapEntry(TGeoOverlap *, int, int, TGeoHMatrix *)
bool listAllNodes() const
virtual void recalculateVisibilityNodeRec(int)
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
int j
Definition: DBlmapReader.cc:9
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()
void setDaughtersSelfVisibility(int i, bool v)
virtual int numberOfColumns() const
Number of columns in the table.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
tuple level
Definition: testEve_cfg.py:34
Definition: DDAxes.h:10
mathSSE::Vec4< T > v
virtual bool nodeIsParent(const NodeInfo &) const
void importOverlaps(std::string path, double precision)
FWOverlapTableView * m_browser
virtual void showEditor(bool value)