00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "Fireworks/Core/src/FWOverlapTableManager.h"
00018 #include "Fireworks/Core/src/FWOverlapTableView.h"
00019 #include "Fireworks/Core/src/FWEveDigitSetScalableMarker.cc"
00020 #include "Fireworks/Core/interface/FWGeometryTableViewManager.h"
00021 #include "Fireworks/Core/interface/fwLog.h"
00022
00023 #include "TEveQuadSet.h"
00024 #include "TGeoVolume.h"
00025 #include "TGeoMatrix.h"
00026 #include "TGeoShape.h"
00027 #include "TGeoBBox.h"
00028 #include "TGeoMatrix.h"
00029 #include "TEveUtil.h"
00030 #include "TObjString.h"
00031 #include "TGeoNode.h"
00032 #include "TGeoOverlap.h"
00033 #include "TGeoManager.h"
00034 #include "TPolyMarker3D.h"
00035
00036 #include "TStopwatch.h"
00037 #include "TTimer.h"
00038 #include "TGeoPainter.h"
00039 #include "TPRegexp.h"
00040
00041 FWOverlapTableManager::FWOverlapTableManager(FWOverlapTableView* v ):
00042 FWGeometryTableManagerBase(),
00043 m_browser(v)
00044 {
00045 }
00046
00047 FWOverlapTableManager::~FWOverlapTableManager()
00048 {
00049 }
00050
00051
00052
00053 std::vector<std::string> FWOverlapTableManager::getTitles() const
00054 {
00055 std::vector<std::string> returnValue;
00056 returnValue.reserve(numberOfColumns());
00057
00058 returnValue.push_back("Name");
00059 returnValue.push_back("Color");
00060 returnValue.push_back("Opcty");
00061 returnValue.push_back("RnrSelf");
00062 returnValue.push_back("RnrChildren");
00063 returnValue.push_back("Overlap");
00064 returnValue.push_back("RnrMarker");
00065 return returnValue;
00066 }
00067
00068
00069
00070
00071
00072 void FWOverlapTableManager::importOverlaps(std::string iPath, double iPrecision)
00073 {
00074 m_entries.clear();
00075 m_mapNodeOverlaps.clear();
00076 m_browser->getMarker()->Reset(TEveQuadSet::kQT_FreeQuad, kFALSE, 32 );
00077
00078 TEveGeoManagerHolder mangeur( FWGeometryTableViewManager::getGeoMangeur());
00079
00080 NodeInfo topNodeInfo;
00081 topNodeInfo.m_node = gGeoManager->GetTopNode();
00082 topNodeInfo.m_level = 0;
00083 topNodeInfo.m_color = gGeoManager->GetTopNode()->GetVolume()->GetLineColor();
00084 topNodeInfo.m_transparency = gGeoManager->GetTopNode()->GetVolume()->GetTransparency();
00085 topNodeInfo.m_parent = -1;
00086 topNodeInfo.resetBit(kVisNodeSelf);
00087
00088 m_entries.resize(gGeoManager->GetNNodes());
00089 m_entries[0] = topNodeInfo;
00090
00091 m_entries.resize( gGeoManager->GetNNodes());
00092
00093 TGeoVolume* topVol = topNodeInfo.m_node->GetVolume();
00094 Int_t icheck = 0;
00095 Int_t ncheck = 0;
00096 TStopwatch *timer;
00097 Int_t i;
00098 bool checkingOverlaps = false;
00099 TGeoManager *geom = topVol->GetGeoManager();
00100 ncheck = topNodeInfo.m_node->CountDaughters(kFALSE);
00101 timer = new TStopwatch();
00102 geom->ClearOverlaps();
00103 geom->SetCheckingOverlaps(kTRUE);
00104
00105 int oldS = 0;
00106 timer->Start();
00107 geom->GetGeomPainter()->OpProgress(topVol->GetName(),icheck,ncheck,timer,kFALSE);
00108
00109 icheck++;
00110 TGeoIterator git(topVol);
00111 Entries_i eit = m_entries.begin();
00112
00113
00114
00115
00116
00117
00118
00119
00120 eit++;
00121 TGeoNode *node;
00122 icheck = 1;
00123
00124 int topNodeIdx = m_browser->getTopNodeIdx();
00125
00126 while ((node=git())) {
00127 if (!eit->testBit(kOverlap)) eit->resetBit(kVisNodeSelf);
00128 eit->m_node = node;
00129 eit->m_color = node->GetVolume()->GetLineColor();
00130 eit->m_transparency = node->GetVolume()->GetTransparency();
00131 eit->m_level = git.GetLevel();
00132 eit->m_parent = icheck;
00133
00134 if ((topNodeIdx )== icheck || !topNodeIdx ) {
00135
00136 checkingOverlaps=true;
00137 }
00138 else if (checkingOverlaps && ( eit->m_level <= m_entries[m_browser->getTopNodeIdx()].m_level))
00139 {
00140 checkingOverlaps=false;
00141 }
00142
00143 Entries_i pit = eit;
00144 do
00145 {
00146 --pit;
00147 --(eit->m_parent);
00148 if (pit->m_level < eit->m_level)
00149 break;
00150 } while (pit != m_entries.begin());
00151
00152
00153 if ( checkingOverlaps) {
00154 if (!node->GetVolume()->IsSelected()) {
00155 geom->GetGeomPainter()->OpProgress(node->GetVolume()->GetName(),icheck+1,ncheck,timer,kFALSE);
00156 node->GetVolume()->SelectVolume(kFALSE);
00157
00158 node->GetVolume()->CheckOverlaps(iPrecision);
00159
00160 if (oldS != gGeoManager->GetListOfOverlaps()->GetEntriesFast()) {
00161
00162
00163 eit->setBit(kOverlapChild);
00164 eit->setBit(kVisNodeChld);
00165 eit->setBit(kVisMarker);
00166
00167 TGeoHMatrix* motherm = new TGeoHMatrix(*geom->GetCurrentMatrix());
00168 {
00169 TGeoNode* ni = topNodeInfo.m_node;
00170 for (Int_t i=1; i<=git.GetLevel(); i++) {
00171 ni = ni->GetDaughter(git.GetIndex(i));
00172 motherm->Multiply(ni->GetMatrix());
00173 }
00174 }
00175
00176 int newCnt = gGeoManager->GetListOfOverlaps()->GetEntriesFast();
00177
00178 for (int i=oldS; i<newCnt; ++i)
00179 {
00180
00181 addOverlapEntry((TGeoOverlap*)gGeoManager->GetListOfOverlaps()->At(i), i, icheck, motherm);
00182 }
00183
00184 oldS = newCnt;
00185 }
00186 }
00187 }
00188 eit++;
00189 icheck ++;
00190 }
00191
00192 m_browser->getMarker()->RefitPlex();
00193
00194 topVol->SelectVolume(kTRUE);
00195 geom->SetCheckingOverlaps(kFALSE);
00196
00197 TObjArray *overlaps = geom->GetListOfOverlaps();
00198 Int_t novlps = overlaps->GetEntriesFast();
00199 TNamed *obj;
00200 for (i=0; i<novlps; i++) {
00201 obj = (TNamed*)overlaps->At(i);
00202 obj->SetName(Form("ov%05d",i));
00203 }
00204 geom->GetGeomPainter()->OpProgress("Check overlaps:",icheck,ncheck,timer,kTRUE);
00205 Info("CheckOverlaps", "Number of illegal overlaps/extrusions : %d\n", novlps);
00206 delete timer;
00207 }
00208
00209
00210
00211
00212
00213 void FWOverlapTableManager::addOverlapEntry(TGeoOverlap* ovl, int ovlIdx, Int_t parentIdx, TGeoHMatrix* motherm)
00214 {
00215
00216
00217
00218
00219
00220
00221
00222
00223 int pcnt = parentIdx+1;
00224 int dOff =0;
00225 TGeoNode* mothern = m_entries[parentIdx].m_node;
00226
00227 QuadId* quid = new QuadId(ovl, parentIdx);
00228
00229 for (int i = 0; i < mothern->GetNdaughters(); ++i)
00230 {
00231 TGeoNode* n = mothern->GetDaughter(i);
00232
00233 int cnt = pcnt + i+dOff;
00234
00235 if (ovl->IsOverlap()) {
00236 if (n->GetVolume() == ovl->GetFirstVolume() && (*(ovl->GetFirstMatrix()) == *(n->GetMatrix())))
00237 {
00238
00239
00240
00241 m_entries[cnt].setBit(kOverlap);
00242 m_entries[cnt].setBit(kVisNodeSelf);
00243 m_mapNodeOverlaps.insert(std::pair<int, int>(cnt, ovlIdx));
00244 int nno; n->GetOverlaps(nno);
00245 nno |= BIT(1); n->SetOverlaps(0, nno);
00246 quid->m_nodes.push_back(cnt);
00247 }
00248 }
00249
00250 if (n->GetVolume() == ovl->GetSecondVolume() && (*(ovl->GetSecondMatrix()) == *(n->GetMatrix())))
00251 {
00252
00253
00254
00255
00256 m_entries[cnt].setBit(kOverlap);
00257 m_entries[cnt].setBit(kVisNodeSelf);
00258
00259 m_mapNodeOverlaps.insert(std::pair<int, int>(cnt, ovlIdx));
00260 int nno; n->GetOverlaps(nno);
00261 nno |= (ovl->IsOverlap() ? BIT(1) : BIT(2));
00262 n->SetOverlaps(0, nno);
00263
00264 quid->m_nodes.push_back(cnt);
00265
00266 }
00267
00268
00269 FWGeometryTableManagerBase::getNNodesTotal(n, dOff);
00270 }
00271
00272 TPolyMarker3D* pm = ovl->GetPolyMarker();
00273 for (int j=0; j<pm->GetN(); ++j )
00274 {
00275 double pl[3];
00276 double pg[3];
00277 pm->GetPoint(j, pl[0], pl[1], pl[2]);
00278 motherm->LocalToMaster(pl, pg);
00279
00280 float dx = TMath::Abs(ovl->GetOverlap());
00281 if (dx > 1e5)
00282 {
00283 fwLog(fwlog::kInfo) << Form("WARNING [%s], overlap size = %.1f \n", ovl->GetTitle(), dx);
00284 dx = 10;
00285 }
00286 float dy = dx, dz = 0;
00287 float fp[3]; fp[0] = pg[0];fp[1] = pg[1];fp[2] = pg[2];
00288 float bb[12] = {
00289 fp[0] +dx, fp[1] -dy, fp[2] -dz,
00290 fp[0] +dx, fp[1] +dy, fp[2] +dz,
00291 fp[0] -dx, fp[1] +dy, fp[2] +dz,
00292 fp[0] -dx, fp[1] -dy, fp[2] -dz
00293 };
00294 m_browser->getMarker()->AddQuad(&bb[0]);
00295 m_browser->getMarker()->QuadId(quid);
00296 }
00297
00298
00299 int aIdx = parentIdx; int aLev = m_entries[aIdx].m_level;
00300 int topNodeIdx = m_browser->getTopNodeIdx();
00301
00302 while(aIdx > topNodeIdx)
00303 {
00304 aIdx--;
00305 if (m_entries[aIdx].m_level < aLev)
00306 {
00307 m_entries[aIdx].setBit(kOverlapChild);
00308 m_entries[aIdx].setBit(kVisNodeChld);
00309
00310 aLev--;
00311 }
00312 }
00313 }
00314
00315
00316
00317
00318 void FWOverlapTableManager::recalculateVisibility( )
00319 {
00320
00321 m_row_to_index.clear();
00322 int i = m_browser->getTopNodeIdx();
00323 m_row_to_index.push_back(i);
00324
00325 if (m_entries[i].testBit(kExpanded) )
00326 recalculateVisibilityNodeRec(i);
00327 }
00328
00329 void FWOverlapTableManager::recalculateVisibilityNodeRec( int pIdx)
00330 {
00331 TGeoNode* parentNode = m_entries[pIdx].m_node;
00332 int nD = parentNode->GetNdaughters();
00333 int dOff=0;
00334 for (int n = 0; n != nD; ++n)
00335 {
00336 int idx = pIdx + 1 + n + dOff;
00337 NodeInfo& data = m_entries[idx];
00338
00339
00340 if (m_browser->listAllNodes() || data.testBitAny(kOverlap | kOverlapChild))
00341 m_row_to_index.push_back(idx);
00342
00343 if ((m_browser->listAllNodes() || data.testBit(kOverlapChild)) && data.testBit(kExpanded) )
00344 recalculateVisibilityNodeRec(idx);
00345
00346 FWGeometryTableManagerBase::getNNodesTotal(parentNode->GetDaughter(n), dOff);
00347 }
00348 }
00349
00350
00351
00352
00353 bool FWOverlapTableManager::nodeIsParent(const NodeInfo& data) const
00354 {
00355 return m_browser->listAllNodes() ? data.m_node->GetNdaughters() : data.testBit(kOverlapChild) ;
00356 }
00357
00358 void FWOverlapTableManager::printOverlaps(int idx) const
00359 {
00360
00361 TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
00362 std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
00363 ppp = m_mapNodeOverlaps.equal_range(idx);
00364 for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
00365 const TGeoOverlap* ovl = (const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
00366 if (ovl) ovl->Print();
00367 }
00368 }
00369
00370 void FWOverlapTableManager::getOverlapTitles(int idx, TString& txt) const
00371 {
00372
00373 TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
00374 std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
00375 ppp = m_mapNodeOverlaps.equal_range(idx);
00376 for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
00377 const TGeoOverlap* ovl = (const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
00378 {
00379 txt += "\n";
00380
00381 if (ovl) {
00382 txt += Form("%s: %g, ", ovl->IsOverlap() ? "Ovl" : "Extr", ovl->GetOverlap());
00383 txt += ovl->GetTitle();
00384 }
00385 }
00386 }
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 FWTableCellRendererBase* FWOverlapTableManager::cellRenderer(int iSortedRowNumber, int iCol) const
00413 {
00414 if (m_row_to_index.empty()) return &m_renderer;
00415
00416 int unsortedRow = m_row_to_index[iSortedRowNumber];
00417
00418 if (unsortedRow < 0) printf("!!!!!!!!!!!!!!!! error %d %d \n",unsortedRow, iSortedRowNumber);
00419
00420
00421
00422 m_renderer.showEditor(unsortedRow == m_editTransparencyIdx && iCol == 2);
00423
00424
00425
00426
00427 const NodeInfo& data = m_entries[unsortedRow];
00428
00429 bool isSelected = data.testBit(kHighlighted) || data.testBit(kSelected);
00430 if (m_browser->listAllNodes()) isSelected = isSelected || data.testBit(kOverlap);
00431
00432 if (data.testBit(kSelected))
00433 {
00434 m_highlightContext->SetBackground(0xc86464);
00435 }
00436 else if (data.testBit(kHighlighted) )
00437 {
00438 m_highlightContext->SetBackground(0x6464c8);
00439 }
00440 else if (m_browser->listAllNodes() && data.testBit(kOverlap) )
00441 {
00442 m_highlightContext->SetBackground(0xdddddd);
00443 }
00444
00445
00446
00447
00448 if (iCol == 0)
00449 {
00450 if (unsortedRow == m_browser->getTopNodeIdx())
00451 {
00452 int no = 0, ne =0;
00453 TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
00454 TIter next_ovl(gGeoManager->GetListOfOverlaps());
00455 const TGeoOverlap* ovl;
00456 while((ovl = (TGeoOverlap*)next_ovl()))
00457 ovl->IsOverlap() ? no++ : ne++;
00458
00459 m_renderer.setData(Form("%s Ovl[%d] Ext[%d]", data.m_node->GetName(), no, ne), isSelected);
00460 }
00461 else {
00462 m_renderer.setData(data.name(), isSelected);
00463 }
00464 m_renderer.setIsParent(nodeIsParent(data));
00465
00466 m_renderer.setIsOpen( data.testBit(FWGeometryTableManagerBase::kExpanded));
00467
00468 int level = data.m_level - m_levelOffset;
00469 if (nodeIsParent(data))
00470 m_renderer.setIndentation(20*level);
00471 else
00472 m_renderer.setIndentation(20*level + FWTextTreeCellRenderer::iconWidth());
00473 }
00474 else
00475 {
00476 m_renderer.setIsParent(false);
00477 m_renderer.setIndentation(0);
00478
00479 if (iCol == 5)
00480 {
00481 if (data.testBit(kOverlap) )
00482 {
00483 std::string x;
00484 std::pair<std::multimap<int, int>::const_iterator, std::multimap<int, int>::const_iterator> ppp;
00485 ppp = m_mapNodeOverlaps.equal_range(unsortedRow);
00486
00487 TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
00488
00489 for (std::multimap<int, int>::const_iterator it2 = ppp.first;it2 != ppp.second;++it2) {
00490 const TGeoOverlap* ovl = (const TGeoOverlap*) gGeoManager->GetListOfOverlaps()->At((*it2).second);
00491 if (ovl)
00492 x += Form("%s: %g ", ovl->IsOverlap() ? "Ovl" : "Extr", ovl->GetOverlap());
00493 else
00494 x += "err";
00495
00496 }
00497 m_renderer.setData(x, isSelected);
00498 }
00499 else
00500 {
00501 m_renderer.setData("", isSelected);
00502 }
00503 }
00504 if (iCol == 1)
00505 {
00506 m_colorBoxRenderer.setData(data.m_color, isSelected);
00507 return &m_colorBoxRenderer;
00508 }
00509 else if (iCol == 2 )
00510 {
00511 m_renderer.setData(Form("%d", 100 -data.m_transparency), isSelected);
00512 }
00513 else if (iCol == 3 )
00514 {
00515 m_renderer.setData(data.testBit(kVisNodeSelf) ? "On" : "-", isSelected );
00516
00517 }
00518 else if (iCol == 4 )
00519 {
00520 m_renderer.setData(data.testBit(kVisNodeChld) ? "On" : "-", isSelected);
00521
00522 }
00523 else if (iCol == 6)
00524 {
00525 std::cerr << "This shoud not happen! \n" ;
00526 }
00527 }
00528 return &m_renderer;
00529 }
00530
00531
00532
00533
00534
00535 void FWOverlapTableManager::setDaughtersSelfVisibility(int selectedIdx, bool v)
00536 {
00537 int dOff = 0;
00538 TGeoNode* parentNode = m_entries[selectedIdx].m_node;
00539 int nD = parentNode->GetNdaughters();
00540 for (int n = 0; n != nD; ++n)
00541 {
00542 int idx = selectedIdx + 1 + n + dOff;
00543 NodeInfo& data = m_entries[idx];
00544
00545 data.setBitVal(FWGeometryTableManagerBase::kVisNodeChld, v);
00546 data.setBitVal(FWGeometryTableManagerBase::kVisNodeSelf, v);
00547
00548
00549 FWGeometryTableManagerBase::getNNodesTotal(parentNode->GetDaughter(n), dOff);
00550 }
00551 }