File indexing completed on 2024-04-06 12:11:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "TMath.h"
0025 #include "TEveArrow.h"
0026 #include "TEveScalableStraightLineSet.h"
0027
0028 #include "Fireworks/Core/interface/FWSimpleProxyBuilderTemplate.h"
0029 #include "Fireworks/Core/interface/Context.h"
0030 #include "Fireworks/Core/interface/FWViewEnergyScale.h"
0031 #include "DataFormats/METReco/interface/MET.h"
0032
0033
0034
0035 class FWMET3DProxyBuilder : public FWSimpleProxyBuilderTemplate<reco::MET> {
0036 public:
0037 class Arrow : public TEveArrow {
0038 public:
0039 float m_et;
0040 float m_energy;
0041 const FWViewContext* m_vc;
0042
0043 Arrow(Float_t x, Float_t y, Float_t z, Float_t xo, Float_t yo, Float_t zo = 0)
0044 : TEveArrow(x, y, z, xo, yo, zo), m_et(0), m_energy(0), m_vc(nullptr) {}
0045
0046 void setScale(FWViewEnergyScale* caloScale) {
0047 static float maxW = 3;
0048 float scale = caloScale->getScaleFactor3D() * (caloScale->getPlotEt() ? m_et : m_energy);
0049 fVector.Normalize();
0050 fVector *= scale;
0051 fTubeR = TMath::Min(maxW / scale, 0.08f);
0052 fConeR = TMath::Min(maxW * 2.5f / scale, 0.25f);
0053 }
0054 };
0055
0056 FWMET3DProxyBuilder();
0057 ~FWMET3DProxyBuilder() override;
0058
0059
0060
0061 bool havePerViewProduct(FWViewType::EType) const override { return true; }
0062 void scaleProduct(TEveElementList* parent, FWViewType::EType, const FWViewContext* vc) override;
0063 void cleanLocal() override { m_arrows.clear(); }
0064
0065
0066
0067
0068
0069 REGISTER_PROXYBUILDER_METHODS();
0070
0071 FWMET3DProxyBuilder(const FWMET3DProxyBuilder&) = delete;
0072 const FWMET3DProxyBuilder& operator=(const FWMET3DProxyBuilder&) = delete;
0073
0074 private:
0075 using FWSimpleProxyBuilderTemplate<reco::MET>::build;
0076 void build(const reco::MET&, unsigned int, TEveElement&, const FWViewContext*) override;
0077
0078
0079 std::vector<Arrow*> m_arrows;
0080 };
0081
0082
0083
0084
0085 FWMET3DProxyBuilder::FWMET3DProxyBuilder() {}
0086
0087 FWMET3DProxyBuilder::~FWMET3DProxyBuilder() {}
0088
0089
0090
0091
0092 void FWMET3DProxyBuilder::scaleProduct(TEveElementList* parent, FWViewType::EType type, const FWViewContext* vc) {
0093
0094 FWViewEnergyScale* caloScale = vc->getEnergyScale();
0095
0096 for (std::vector<Arrow*>::iterator i = m_arrows.begin(); i != m_arrows.end(); ++i) {
0097 if (vc == (*i)->m_vc) {
0098 (*i)->setScale(caloScale);
0099 }
0100 }
0101 }
0102
0103 void FWMET3DProxyBuilder::build(const reco::MET& met,
0104 unsigned int iIndex,
0105 TEveElement& oItemHolder,
0106 const FWViewContext* vc) {
0107 float r0;
0108 float phi = met.phi();
0109 float theta = met.theta();
0110
0111 if (TMath::Abs(met.eta()) < context().caloTransEta())
0112 r0 = context().caloR1() / sin(theta);
0113 else
0114 r0 = context().caloZ1() / fabs(cos(theta));
0115
0116 Arrow* arrow = new Arrow(sin(theta) * cos(phi),
0117 sin(theta) * sin(phi),
0118 cos(theta),
0119 r0 * sin(theta) * cos(phi),
0120 r0 * sin(theta) * sin(phi),
0121 r0 * cos(theta));
0122 arrow->m_et = met.et();
0123 arrow->m_energy = met.energy();
0124 arrow->m_vc = vc;
0125 arrow->SetConeL(0.15);
0126 arrow->SetConeR(0.06);
0127 setupAddElement(arrow, &oItemHolder);
0128
0129 m_arrows.push_back(arrow);
0130 arrow->setScale(vc->getEnergyScale());
0131 arrow->setScale(vc->getEnergyScale());
0132
0133 context().voteMaxEtAndEnergy(met.et(), met.energy());
0134 }
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 REGISTER_FWPROXYBUILDER(FWMET3DProxyBuilder, reco::MET, "recoMET", FWViewType::kAll3DBits);