Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-10-25 09:46:16

0001 // -*- C++ -*-
0002 //
0003 // Package:     Calo
0004 // Class  :     FWCaloDataProxyBuilderBase
0005 //
0006 // Implementation:
0007 //     [Notes on implementation]
0008 //
0009 // Original Author:
0010 //         Created:  Mon May 31 15:09:39 CEST 2010
0011 //
0012 
0013 // system include files
0014 
0015 #include <cmath>
0016 
0017 // user includes
0018 #include "TEveCaloData.h"
0019 #include "TEveCalo.h"
0020 #include "TH2F.h"
0021 #include "TEveManager.h"
0022 #include "TEveSelection.h"
0023 
0024 #include "Fireworks/Core/interface/Context.h"
0025 #include "Fireworks/Core/interface/FWEventItem.h"
0026 
0027 #include "Fireworks/Calo/interface/FWCaloDataProxyBuilderBase.h"
0028 #include "Fireworks/Calo/interface/FWFromTEveCaloDataSelector.h"
0029 
0030 #include "DataFormats/CaloTowers/interface/CaloTower.h"
0031 
0032 //
0033 // constants, enums and typedefs
0034 //
0035 
0036 //
0037 // static data member definitions
0038 //
0039 
0040 //
0041 // constructors and destructor
0042 //
0043 FWCaloDataProxyBuilderBase::FWCaloDataProxyBuilderBase() : m_caloData(nullptr), m_sliceIndex(-1) {}
0044 
0045 // FWCaloDataProxyBuilderBase::FWCaloDataProxyBuilderBase(const FWCaloDataProxyBuilderBase& rhs)
0046 // {
0047 //    // do actual copying here;
0048 // }
0049 
0050 FWCaloDataProxyBuilderBase::~FWCaloDataProxyBuilderBase() {}
0051 
0052 //
0053 // assignment operators
0054 //
0055 // const FWCaloDataProxyBuilderBase& FWCaloDataProxyBuilderBase::operator=(const FWCaloDataProxyBuilderBase& rhs)
0056 // {
0057 //   //An exception safe implementation is
0058 //   FWCaloDataProxyBuilderBase temp(rhs);
0059 //   swap(rhs);
0060 //
0061 //   return *this;
0062 // }
0063 
0064 //
0065 // member functions
0066 //
0067 
0068 void FWCaloDataProxyBuilderBase::build(const FWEventItem* iItem, TEveElementList*, const FWViewContext*) {
0069   setCaloData(iItem->context());
0070 
0071   assertCaloDataSlice();
0072   fillCaloData();
0073 
0074   m_caloData->SetSliceColor(m_sliceIndex, item()->defaultDisplayProperties().color());
0075   m_caloData->SetSliceTransparency(m_sliceIndex, item()->defaultDisplayProperties().transparency());
0076   m_caloData->DataChanged();
0077   m_caloData->CellSelectionChanged();
0078 }
0079 
0080 //______________________________________________________________________________
0081 
0082 void FWCaloDataProxyBuilderBase::modelChanges(const FWModelIds&, Product* p) {
0083   if (m_caloData && item()) {
0084     clearCaloDataSelection();
0085     fillCaloData();
0086 
0087     TEveCaloData::vCellId_t& selected = m_caloData->GetCellsSelected();
0088     if (!selected.empty()) {
0089       if (0 == m_caloData->GetSelectedLevel()) {
0090         gEve->GetSelection()->AddElement(m_caloData);
0091       }
0092     } else {
0093       if (1 == m_caloData->GetSelectedLevel() || 2 == m_caloData->GetSelectedLevel()) {
0094         gEve->GetSelection()->RemoveElement(m_caloData);
0095       }
0096     }
0097 
0098     m_caloData->SetSliceColor(m_sliceIndex, item()->defaultDisplayProperties().color());
0099     m_caloData->SetSliceTransparency(m_sliceIndex, item()->defaultDisplayProperties().transparency());
0100     m_caloData->DataChanged();
0101     m_caloData->CellSelectionChanged();
0102   }
0103 }
0104 //______________________________________________________________________________
0105 
0106 void FWCaloDataProxyBuilderBase::itemBeingDestroyed(const FWEventItem* iItem) {
0107   FWProxyBuilderBase::itemBeingDestroyed(iItem);
0108   if (m_caloData) {
0109     clearCaloDataSelection();
0110     FWFromTEveCaloDataSelector* sel = reinterpret_cast<FWFromTEveCaloDataSelector*>(m_caloData->GetUserData());
0111     sel->resetSliceSelector(m_sliceIndex);
0112     m_caloData->DataChanged();
0113   }
0114 }
0115 
0116 void FWCaloDataProxyBuilderBase::clearCaloDataSelection() {
0117   //find all selected cell ids which are not from this FWEventItem and preserve only them
0118   // do this by moving them to the end of the list and then clearing only the end of the list
0119   // this avoids needing any additional memory
0120 
0121   TEveCaloData::vCellId_t& selected = m_caloData->GetCellsSelected();
0122 
0123   TEveCaloData::vCellId_t::iterator itEnd = selected.end();
0124   for (TEveCaloData::vCellId_t::iterator it = selected.begin(); it != itEnd; ++it) {
0125     if (it->fSlice == m_sliceIndex) {
0126       //we have found one we want to get rid of, so we swap it with the
0127       // one closest to the end which is not of this slice
0128       do {
0129         TEveCaloData::vCellId_t::iterator itLast = itEnd - 1;
0130         itEnd = itLast;
0131       } while (itEnd != it && itEnd->fSlice == m_sliceIndex);
0132 
0133       if (itEnd != it) {
0134         std::swap(*it, *itEnd);
0135       } else {
0136         //shouldn't go on since advancing 'it' will put us past itEnd
0137         break;
0138       }
0139       //std::cout <<"keeping "<<it->fTower<<" "<<it->fSlice<<std::endl;
0140     }
0141   }
0142   selected.erase(itEnd, selected.end());
0143 
0144   // reset higlight
0145   m_caloData->GetCellsHighlighted().clear();
0146 }