File indexing completed on 2024-04-06 12:11:45
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "TEveCompound.h"
0013 #include "TEveTrack.h"
0014 #include "TEveScalableStraightLineSet.h"
0015
0016 #include "Fireworks/Core/interface/FWSimpleProxyBuilderTemplate.h"
0017 #include "Fireworks/Core/interface/FWEventItem.h"
0018 #include "Fireworks/Core/interface/FWViewType.h"
0019
0020 #include "Fireworks/Candidates/interface/CandidateUtils.h"
0021 #include "Fireworks/Tracks/interface/TrackUtils.h"
0022 #include "Fireworks/Electrons/interface/makeSuperCluster.h"
0023
0024 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0025 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
0026
0027 #include "Fireworks/Core/interface/FWProxyBuilderConfiguration.h"
0028
0029
0030
0031
0032
0033
0034
0035 class FWElectronProxyBuilder : public FWSimpleProxyBuilderTemplate<reco::GsfElectron> {
0036 public:
0037 FWElectronProxyBuilder();
0038 ~FWElectronProxyBuilder() override;
0039
0040 using FWProxyBuilderBase::haveSingleProduct;
0041 bool haveSingleProduct() const override { return false; }
0042 using FWProxyBuilderBase::cleanLocal;
0043 void cleanLocal() override;
0044 using FWSimpleProxyBuilderTemplate<reco::GsfElectron>::buildViewType;
0045 void buildViewType(const reco::GsfElectron& iData,
0046 unsigned int iIndex,
0047 TEveElement& oItemHolder,
0048 FWViewType::EType type,
0049 const FWViewContext*) override;
0050
0051 using FWSimpleProxyBuilderTemplate<reco::GsfElectron>::setItem;
0052 void setItem(const FWEventItem* iItem) override;
0053
0054 REGISTER_PROXYBUILDER_METHODS();
0055
0056 FWElectronProxyBuilder(const FWElectronProxyBuilder&) = delete;
0057 const FWElectronProxyBuilder& operator=(const FWElectronProxyBuilder&) = delete;
0058
0059 private:
0060 TEveElementList* requestCommon();
0061
0062 TEveElementList* m_common;
0063 };
0064
0065 FWElectronProxyBuilder::FWElectronProxyBuilder() : m_common(nullptr) {
0066 m_common = new TEveElementList("common electron scene");
0067 m_common->IncDenyDestroy();
0068 }
0069
0070 FWElectronProxyBuilder::~FWElectronProxyBuilder() { m_common->DecDenyDestroy(); }
0071
0072 void FWElectronProxyBuilder::setItem(const FWEventItem* iItem) {
0073 FWProxyBuilderBase::setItem(iItem);
0074
0075 if (iItem) {
0076 iItem->getConfig()->assertParam("LineWidth", long(1), long(1), long(4));
0077 }
0078 }
0079
0080 TEveElementList* FWElectronProxyBuilder::requestCommon() {
0081 if (m_common->HasChildren() == false) {
0082 int width = item()->getConfig()->value<long>("LineWidth");
0083 for (int i = 0; i < static_cast<int>(item()->size()); ++i) {
0084 const reco::GsfElectron& electron = modelData(i);
0085
0086 TEveTrack* track(nullptr);
0087 if (electron.gsfTrack().isAvailable())
0088 track = fireworks::prepareTrack(*electron.gsfTrack(), context().getTrackPropagator());
0089 else
0090 track = fireworks::prepareCandidate(electron, context().getTrackPropagator());
0091 track->MakeTrack();
0092 track->SetLineWidth(width);
0093 setupElement(track);
0094 m_common->AddElement(track);
0095 }
0096 }
0097 return m_common;
0098 }
0099
0100 void FWElectronProxyBuilder::cleanLocal() { m_common->DestroyElements(); }
0101
0102 void FWElectronProxyBuilder::buildViewType(const reco::GsfElectron& electron,
0103 unsigned int iIndex,
0104 TEveElement& oItemHolder,
0105 FWViewType::EType type,
0106 const FWViewContext*) {
0107 TEveElementList* tracks = requestCommon();
0108 TEveElement::List_i trkIt = tracks->BeginChildren();
0109 std::advance(trkIt, iIndex);
0110 setupAddElement(*trkIt, &oItemHolder);
0111
0112 if (type == FWViewType::kRhoPhi || type == FWViewType::kRhoPhiPF)
0113 fireworks::makeRhoPhiSuperCluster(this, electron.superCluster(), electron.phi(), oItemHolder);
0114 else if (type == FWViewType::kRhoZ)
0115 fireworks::makeRhoZSuperCluster(this, electron.superCluster(), electron.phi(), oItemHolder);
0116 }
0117
0118 REGISTER_FWPROXYBUILDER(FWElectronProxyBuilder,
0119 reco::GsfElectron,
0120 "Electrons",
0121 FWViewType::kAll3DBits | FWViewType::kAllRPZBits);
0122
0123
0124
0125
0126
0127
0128
0129 class FWElectronGlimpseProxyBuilder : public FWSimpleProxyBuilderTemplate<reco::GsfElectron> {
0130 public:
0131 FWElectronGlimpseProxyBuilder() {}
0132 ~FWElectronGlimpseProxyBuilder() override {}
0133 using FWSimpleProxyBuilderTemplate<reco::GsfElectron>::build;
0134
0135 REGISTER_PROXYBUILDER_METHODS();
0136
0137 FWElectronGlimpseProxyBuilder(const FWElectronGlimpseProxyBuilder&) = delete;
0138
0139 const FWElectronGlimpseProxyBuilder& operator=(const FWElectronGlimpseProxyBuilder&) = delete;
0140
0141 private:
0142 void build(const reco::GsfElectron& iData,
0143 unsigned int iIndex,
0144 TEveElement& oItemHolder,
0145 const FWViewContext*) override;
0146 };
0147
0148 void FWElectronGlimpseProxyBuilder::build(const reco::GsfElectron& iData,
0149 unsigned int iIndex,
0150 TEveElement& oItemHolder,
0151 const FWViewContext*) {
0152 TEveScalableStraightLineSet* marker = new TEveScalableStraightLineSet("", "");
0153 marker->SetLineWidth(2);
0154 fireworks::addStraightLineSegment(marker, &iData, 1.0);
0155 setupAddElement(marker, &oItemHolder);
0156
0157
0158
0159
0160 }
0161 REGISTER_FWPROXYBUILDER(FWElectronGlimpseProxyBuilder, reco::GsfElectron, "Electrons", FWViewType::kGlimpseBit);