CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/Fireworks/Core/src/FWOverlapTableManager.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     Core
00004 // Class  :     FWOverlapTableManager
00005 // 
00006 // Implementation:
00007 //     [Notes on implementation]
00008 //
00009 // Original Author:  
00010 //         Created:  Wed Jan  4 20:31:32 CET 2012
00011 // $Id: FWOverlapTableManager.cc,v 1.9 2013/04/14 20:41:06 amraktad Exp $
00012 //
00013 
00014 // system include files
00015 
00016 // user include files
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    // gGeoManager->cd();
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 //   topVol->CheckOverlaps(iPrecision);
00109    icheck++;
00110    TGeoIterator git(topVol);
00111    Entries_i eit = m_entries.begin();
00112    /*
00113      if (gGeoManager->GetListOfOverlaps()->GetEntriesFast()) {
00114      int newCnt =  gGeoManager->GetListOfOverlaps()->GetEntriesFast();
00115      for (int i=0; i<newCnt; ++i) {
00116      addOverlapEntry((TGeoOverlap*)gGeoManager->GetListOfOverlaps()->At(i), new TGeoHMatrix(*geom->GetCurrentMatrix()), topNode, next); 
00117      }
00118      oldS= newCnt;
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      //  printf("start to check overlaps on topNodeIdx %s \n", eit->name());
00136        checkingOverlaps=true;
00137      }
00138      else if (checkingOverlaps && ( eit->m_level <= m_entries[m_browser->getTopNodeIdx()].m_level)) 
00139      {
00140        checkingOverlaps=false;
00141      }
00142       // parent index
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       // overlap bits
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               // printf("mother %s overlaps \n", node->GetName());
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                   //                  printf("add %p %p \n", (void*)node->GetVolume(), (void*)m_entries[icheck].m_node->GetVolume());
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    //   geom->SortOverlaps();
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    // printf("add %s \n", ovl->GetTitle());
00217    // get doughter indices of overlaps
00218    /* 
00219       TPMERegexp re(" ", "o");
00220       re.Split(TString(ovl->GetTitle()));
00221       printf("add title %s \n", ovl->GetTitle());
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             // std::string x = re[0].Data();
00239             //if (x.find(n->GetName()) == std::string::npos) printf("ERROT \n");
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          //printf("-----------------------------------------------\n");
00253          // std::string x = re[2].Data();
00254          // if (x.find(n->GetName()) == std::string::npos) printf("ERROT \n");
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          //  printf("stamp %s \n", m_entries[aIdx].name());
00310          aLev--;
00311       }
00312    }
00313 }
00314 
00315 
00316 //_____________________________________________________________________________
00317 
00318 void FWOverlapTableManager::recalculateVisibility( )
00319 {
00320    // printf("overlap recalcuate vis \n");
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   const char* FWOverlapTableManager::cellName(const NodeInfo& data) const
00391   {
00392   if (data.m_parent == -1)
00393   {
00394   int ne = 0;
00395   int no = 0;
00396   TGeoOverlap* ovl;
00397   TEveGeoManagerHolder gmgr( FWGeometryTableViewManager::getGeoMangeur());
00398   TIter next_ovl(gGeoManager->GetListOfOverlaps());
00399   while((ovl = (TGeoOverlap*)next_ovl())) 
00400   ovl->IsOverlap() ? no++ : ne++;
00401      
00402   return Form("%s Ovl[%d] Ext[%d]", data.m_node->GetName(), no, ne);
00403   }
00404   else
00405   {
00406   return data.name();
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    // editor state
00421    //
00422    m_renderer.showEditor(unsortedRow == m_editTransparencyIdx && iCol == 2);
00423 
00424 
00425    // selection state
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    // set column content
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 }