00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "TEveJetCone.h"
00015 #include "TEveScalableStraightLineSet.h"
00016
00017 #include "Fireworks/Core/interface/FWTextProjected.h"
00018 #include "Fireworks/Core/interface/FWEventItem.h"
00019 #include "Fireworks/Core/interface/FWProxyBuilderConfiguration.h"
00020 #include "Fireworks/Core/interface/FWParameters.h"
00021
00022 #include "Fireworks/Core/interface/FWSimpleProxyBuilderTemplate.h"
00023 #include "Fireworks/Core/interface/FWEventItem.h"
00024 #include "Fireworks/Core/interface/Context.h"
00025 #include "Fireworks/Core/interface/FWViewContext.h"
00026 #include "Fireworks/Core/interface/FWViewEnergyScale.h"
00027 #include "Fireworks/Calo/interface/makeEveJetCone.h"
00028 #include "Fireworks/Calo/interface/scaleMarker.h"
00029
00030 #include "DataFormats/JetReco/interface/Jet.h"
00031
00032 namespace fireworks {
00033
00034 struct jetScaleMarker : public scaleMarker {
00035 jetScaleMarker(TEveScalableStraightLineSet* ls, float et, float e, const FWViewContext* vc):
00036 scaleMarker(ls, et, e, vc) , m_text(0) {}
00037
00038 FWEveText* m_text;
00039 };
00040 }
00041
00042 static const std::string kJetLabelsRhoPhiOn("Draw Labels in RhoPhi View");
00043 static const std::string kJetLabelsRhoZOn("Draw Labels in RhoZ View");
00044 static const std::string kJetOffset("Label Offset");
00045
00046
00047 class FWJetProxyBuilder : public FWSimpleProxyBuilderTemplate<reco::Jet>
00048 {
00049 public:
00050 FWJetProxyBuilder();
00051 virtual ~FWJetProxyBuilder();
00052
00053 virtual bool havePerViewProduct(FWViewType::EType) const { return true; }
00054 virtual bool haveSingleProduct() const { return false; }
00055 virtual void cleanLocal();
00056
00057 virtual void setItem(const FWEventItem* iItem)
00058 {
00059 FWProxyBuilderBase::setItem(iItem);
00060 if (iItem) {
00061 iItem->getConfig()->assertParam(kJetLabelsRhoPhiOn, false);
00062 iItem->getConfig()->assertParam(kJetLabelsRhoZOn, false);
00063 iItem->getConfig()->assertParam(kJetOffset, 2.1, 1.0, 5.0);
00064 }
00065 }
00066
00067 REGISTER_PROXYBUILDER_METHODS();
00068
00069 protected:
00070 virtual void buildViewType(const reco::Jet& iData, unsigned int iIndex, TEveElement& oItemHolder, FWViewType::EType type , const FWViewContext*);
00071
00072
00073 virtual void localModelChanges(const FWModelId& iId, TEveElement* iCompound,
00074 FWViewType::EType viewType, const FWViewContext* vc);
00075
00076 virtual void scaleProduct(TEveElementList* parent, FWViewType::EType, const FWViewContext* vc);
00077
00078 private:
00079 typedef std::vector<fireworks::jetScaleMarker> Lines_t;
00080
00081 FWJetProxyBuilder( const FWJetProxyBuilder& );
00082 const FWJetProxyBuilder& operator=( const FWJetProxyBuilder& );
00083
00084 TEveElementList* requestCommon();
00085 void setTextPos(fireworks::jetScaleMarker& s, const FWViewContext* vc, FWViewType::EType);
00086
00087 TEveElementList* m_common;
00088
00089 std::vector<fireworks::jetScaleMarker> m_lines;
00090 };
00091
00092
00093
00094 FWJetProxyBuilder::FWJetProxyBuilder():
00095 m_common(0)
00096 {
00097 m_common = new TEveElementList( "common electron scene" );
00098 m_common->IncDenyDestroy();
00099 }
00100
00101 FWJetProxyBuilder::~FWJetProxyBuilder()
00102 {
00103 m_common->DecDenyDestroy();
00104 }
00105
00106 TEveElementList*
00107 FWJetProxyBuilder::requestCommon()
00108 {
00109 if( m_common->HasChildren() == false )
00110 {
00111 for (int i = 0; i < static_cast<int>(item()->size()); ++i)
00112 {
00113 TEveJetCone* cone = fireworks::makeEveJetCone(modelData(i), context());
00114
00115 m_common->AddElement(cone);
00116 cone->SetFillColor(item()->defaultDisplayProperties().color());
00117 cone->SetLineColor(item()->defaultDisplayProperties().color());
00118
00119 }
00120 }
00121 return m_common;
00122 }
00123
00124 void
00125 FWJetProxyBuilder::buildViewType(const reco::Jet& iData, unsigned int iIndex, TEveElement& oItemHolder, FWViewType::EType type , const FWViewContext* vc)
00126 {
00127
00128 TEveElementList* cones = requestCommon();
00129 TEveElement::List_i coneIt = cones->BeginChildren();
00130 std::advance(coneIt, iIndex);
00131
00132 const FWDisplayProperties &dp = item()->defaultDisplayProperties();
00133 setupAddElement( *coneIt, &oItemHolder );
00134 (*coneIt)->SetMainTransparency(TMath::Min(100, 80 + dp.transparency() / 5));
00135
00136
00137
00138 if (FWViewType::isProjected(type))
00139 {
00140 m_lines.push_back(fireworks::jetScaleMarker(new TEveScalableStraightLineSet("jetline"), iData.et(), iData.energy(), vc));
00141 fireworks::jetScaleMarker& markers = m_lines.back();
00142
00143 float size = 1.f;
00144 double theta = iData.theta();
00145 double phi = iData.phi();
00146
00147 if ( type == FWViewType::kRhoZ )
00148 {
00149 static const float_t offr = 4;
00150 float r_ecal = context().caloR1() + offr;
00151 float z_ecal = context().caloZ1() + offr/tan(context().caloTransAngle());
00152 double r(0);
00153 if ( theta < context().caloTransAngle() || M_PI-theta < context().caloTransAngle())
00154 {
00155 z_ecal = context().caloZ2() + offr/tan(context().caloTransAngle());
00156 r = z_ecal/fabs(cos(theta));
00157 }
00158 else
00159 {
00160 r = r_ecal/sin(theta);
00161 }
00162
00163 markers.m_ls->SetScaleCenter( 0., (phi>0 ? r*fabs(sin(theta)) : -r*fabs(sin(theta))), r*cos(theta) );
00164 markers.m_ls->AddLine( 0., (phi>0 ? r*fabs(sin(theta)) : -r*fabs(sin(theta))), r*cos(theta),
00165 0., (phi>0 ? (r+size)*fabs(sin(theta)) : -(r+size)*fabs(sin(theta))), (r+size)*cos(theta) );
00166 }
00167 else
00168 {
00169 float ecalR = context().caloR1() + 4;
00170 markers.m_ls->SetScaleCenter(ecalR*cos(phi), ecalR*sin(phi), 0);
00171 markers.m_ls->AddLine(ecalR*cos(phi), ecalR*sin(phi), 0, (ecalR+size)*cos(phi), (ecalR+size)*sin(phi), 0);
00172 }
00173
00174 markers.m_ls->SetLineWidth(4);
00175 markers.m_ls->SetLineColor(dp.color());
00176 FWViewEnergyScale* caloScale = vc->getEnergyScale();
00177 markers.m_ls->SetScale(caloScale->getScaleFactor3D()*(caloScale->getPlotEt() ? iData.et() : iData.energy()));
00178
00179 if ((type == FWViewType::kRhoZ && item()->getConfig()->value<bool>(kJetLabelsRhoZOn))||
00180 (type == FWViewType::kRhoPhi && item()->getConfig()->value<bool>(kJetLabelsRhoPhiOn) ) )
00181 {
00182 markers.m_text = new FWEveText(Form("%.1f", vc->getEnergyScale()->getPlotEt() ? iData.et() : iData.energy()));
00183 markers.m_text->SetMainColor( item()->defaultDisplayProperties().color());
00184 setTextPos(markers, vc, type);
00185 }
00186
00187
00188 markers.m_ls->SetMarkerColor(markers.m_ls->GetMainColor());
00189 setupAddElement( markers.m_ls, &oItemHolder );
00190 if (markers.m_text) setupAddElement( markers.m_text, &oItemHolder , false);
00191
00192 }
00193 context().voteMaxEtAndEnergy(iData.et(), iData.energy());
00194
00195 }
00196
00197 void
00198 FWJetProxyBuilder::localModelChanges(const FWModelId& iId, TEveElement* iCompound,
00199 FWViewType::EType viewType, const FWViewContext* vc)
00200 {
00201 increaseComponentTransparency(iId.index(), iCompound, "TEveJetCone", 80);
00202
00203 for (Lines_t::iterator i = m_lines.begin(); i!= m_lines.end(); ++ i)
00204 {
00205 TEveStraightLineSetProjected* projLineSet = (TEveStraightLineSetProjected*)(*(*i).m_ls->BeginProjecteds());
00206 if (projLineSet) projLineSet->UpdateProjection();
00207 }
00208 }
00209
00210
00211 void
00212 FWJetProxyBuilder::cleanLocal()
00213 {
00214 m_lines.clear();
00215 m_common->DestroyElements();
00216 }
00217
00218 void
00219 FWJetProxyBuilder::scaleProduct(TEveElementList* parent, FWViewType::EType type, const FWViewContext* vc)
00220 {
00221 for (Lines_t::iterator i = m_lines.begin(); i!= m_lines.end(); ++ i)
00222 {
00223 if (vc == (*i).m_vc)
00224 {
00225 float value = vc->getEnergyScale()->getPlotEt() ? (*i).m_et : (*i).m_energy;
00226
00227 (*i).m_ls->SetScale(vc->getEnergyScale()->getScaleFactor3D() * value );
00228 if ((*i).m_text)
00229 {
00230 (*i).m_text->SetText(Form("%.1f", value));
00231 setTextPos(*i, vc, type);
00232 }
00233 TEveStraightLineSetProjected* projLineSet = (TEveStraightLineSetProjected*)(*(*i).m_ls->BeginProjecteds());
00234 projLineSet->UpdateProjection();
00235 }
00236 }
00237 }
00238
00239
00240 void FWJetProxyBuilder::setTextPos(fireworks::jetScaleMarker& s, const FWViewContext* vc, FWViewType::EType type)
00241 {
00242 TEveChunkManager::iterator li( s.m_ls->GetLinePlex() );
00243 li.next();
00244 TEveStraightLineSet::Line_t &l = * ( TEveStraightLineSet::Line_t* ) li();
00245 TEveVector v(l.fV2[0] - l.fV1[0], l.fV2[1] - l.fV1[1], l.fV2[2] - l.fV1[2] );
00246 v.Normalize();
00247
00248
00249 double off = item()->getConfig()->value<double>(kJetOffset) -1;
00250 float value = vc->getEnergyScale()->getPlotEt() ? s.m_et : s.m_energy;
00251 double trs = off * 130 * value/context().getMaxEnergyInEvent(vc->getEnergyScale()->getPlotEt());
00252 v *= trs;
00253
00254 float x = l.fV1[0] + v[0];
00255 float y = l.fV1[1] + v[1];
00256 float z = l.fV1[2] + v[2];
00257
00258 s.m_text->m_offsetZ = value/context().getMaxEnergyInEvent(vc->getEnergyScale()->getPlotEt());
00259 s.m_text->RefMainTrans().SetPos(x, y, z);
00260 if ((s.m_text)->BeginProjecteds() != (s.m_text)->EndProjecteds()) {
00261 FWEveTextProjected* textProjected = (FWEveTextProjected*)(*(s.m_text)->BeginProjecteds());
00262 textProjected->UpdateProjection();
00263 }
00264
00265 }
00266
00267 REGISTER_FWPROXYBUILDER( FWJetProxyBuilder, reco::Jet, "Jets", FWViewType::kAll3DBits | FWViewType::kAllRPZBits | FWViewType::kGlimpseBit);