00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "Fireworks/Core/interface/FWSimpleProxyBuilderTemplate.h"
00015 #include "Fireworks/Core/interface/FWProxyBuilderConfiguration.h"
00016 #include "Fireworks/Core/interface/FWColorManager.h"
00017 #include "Fireworks/Core/interface/FWEventItem.h"
00018 #include "Fireworks/Core/interface/Context.h"
00019 #include "Fireworks/Core/interface/FWParameters.h"
00020 #include "DataFormats/VertexReco/interface/Vertex.h"
00021 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00022
00023 #include "Fireworks/Vertices/interface/TEveEllipsoid.h"
00024
00025 #include "TEvePointSet.h"
00026 #include "TMatrixDEigen.h"
00027 #include "TMatrixDSym.h"
00028 #include "TDecompSVD.h"
00029 #include "TVectorD.h"
00030 #include "TEveTrans.h"
00031 #include "TEveTrack.h"
00032 #include "TEveTrackPropagator.h"
00033 #include "TEveStraightLineSet.h"
00034 #include "TEveBoxSet.h"
00035 #include "TGeoSphere.h"
00036 #include "TEveGeoNode.h"
00037 #include "TEveVSDStructs.h"
00038
00039 class FWVertexProxyBuilder : public FWSimpleProxyBuilderTemplate<reco::Vertex>
00040 {
00041 public:
00042 FWVertexProxyBuilder() {}
00043 virtual ~FWVertexProxyBuilder() {}
00044
00045 virtual void setItem(const FWEventItem* iItem)
00046 {
00047 FWProxyBuilderBase::setItem(iItem);
00048 if (iItem)
00049 {
00050 iItem->getConfig()->assertParam("Draw Tracks", false);
00051 iItem->getConfig()->assertParam("Draw Pseudo Track", false);
00052 iItem->getConfig()->assertParam("Draw Ellipse", false);
00053 iItem->getConfig()->assertParam("Scale Ellipse",2l, 1l, 10l);
00054 iItem->getConfig()->assertParam("Ellipse Color Index", 6l, 0l, (long)context().colorManager()->numberOfLimitedColors());
00055 }
00056 }
00057
00058 REGISTER_PROXYBUILDER_METHODS();
00059
00060 private:
00061 FWVertexProxyBuilder(const FWVertexProxyBuilder&);
00062 const FWVertexProxyBuilder& operator=(const FWVertexProxyBuilder&);
00063
00064 virtual void build(const reco::Vertex& iData, unsigned int iIndex,TEveElement& oItemHolder, const FWViewContext*);
00065
00066 virtual void localModelChanges(const FWModelId& iId, TEveElement* iCompound,
00067 FWViewType::EType viewType, const FWViewContext* vc);
00068
00069 };
00070
00071
00072 void
00073 FWVertexProxyBuilder::build(const reco::Vertex& iData, unsigned int iIndex, TEveElement& oItemHolder , const FWViewContext*)
00074 {
00075 const reco::Vertex & v = iData;
00076
00077
00078 TEveGeoManagerHolder gmgr(TEveGeoShape::GetGeoMangeur());
00079 TEvePointSet* pointSet = new TEvePointSet();
00080 pointSet->SetNextPoint( v.x(), v.y(), v.z() );
00081 setupAddElement(pointSet, &oItemHolder);
00082
00083
00084
00085 if ( item()->getConfig()->value<bool>("Draw Ellipse"))
00086 {
00087
00088 TEveEllipsoid* eveEllipsoid = new TEveEllipsoid("Ellipsoid", Form("Ellipsoid %d", iIndex));
00089
00090 eveEllipsoid->RefPos().Set(v.x(),v.y(),v.z());
00091
00092 reco::Vertex::Error e= v.error();
00093 TMatrixDSym m(3);
00094 for(int i=0;i<3;i++)
00095 for(int j=0;j<3;j++)
00096 {
00097 m(i,j) = e(i,j);
00098 eveEllipsoid->RefEMtx()(i+1, j+1) = e(i,j);
00099 }
00100
00101
00102 double ellipseScale = 1.;
00103 if ( item()->getConfig()->value<long>("Scale Ellipse"))
00104 ellipseScale = item()->getConfig()->value<long>("Scale Ellipse");
00105
00106 eveEllipsoid->SetScale(ellipseScale);
00107
00108
00109 TMatrixDEigen eig(m);
00110 TVectorD vv ( eig.GetEigenValuesRe());
00111 eveEllipsoid->RefExtent3D().Set(sqrt(vv(0))*ellipseScale,sqrt(vv(1))*ellipseScale,sqrt(vv(2))*ellipseScale);
00112
00113 eveEllipsoid->SetLineWidth(2);
00114 setupAddElement(eveEllipsoid, &oItemHolder);
00115 eveEllipsoid->SetMainTransparency(TMath::Min(100, 80 + item()->defaultDisplayProperties().transparency() / 5));
00116
00117
00118
00119 Color_t color = item()->getConfig()->value<long>("Ellipse Color Index");
00120
00121
00122 eveEllipsoid->SetMainColor(color + context().colorManager()->offsetOfLimitedColors());
00123 }
00124
00125
00126 if ( item()->getConfig()->value<bool>("Draw Tracks"))
00127 {
00128 for(reco::Vertex::trackRef_iterator it = v.tracks_begin() ;
00129 it != v.tracks_end() ; ++it)
00130 {
00131 float w = v.trackWeight(*it);
00132 if (w < 0.5) continue;
00133
00134 const reco::Track & track = *it->get();
00135 TEveRecTrack t;
00136 t.fBeta = 1.;
00137 t.fV = TEveVector(track.vx(), track.vy(), track.vz());
00138 t.fP = TEveVector(track.px(), track.py(), track.pz());
00139 t.fSign = track.charge();
00140 TEveTrack* trk = new TEveTrack(&t, context().getTrackPropagator());
00141 trk->SetMainColor(item()->defaultDisplayProperties().color());
00142 trk->MakeTrack();
00143 setupAddElement(trk, &oItemHolder);
00144 }
00145 }
00146 if ( item()->getConfig()->value<bool>("Draw Pseudo Track"))
00147 {
00148 TEveRecTrack t;
00149 t.fBeta = 1.;
00150 t.fV = TEveVector(v.x(),v.y(),v.z());
00151 t.fP = TEveVector(-v.p4().px(), -v.p4().py(), -v.p4().pz());
00152 t.fSign = 1;
00153 TEveTrack* trk = new TEveTrack(&t, context().getTrackPropagator());
00154 trk->SetLineStyle(7);
00155 trk->MakeTrack();
00156 setupAddElement(trk, &oItemHolder);
00157
00158 }
00159 }
00160
00161 void
00162 FWVertexProxyBuilder::localModelChanges(const FWModelId& iId, TEveElement* iCompound,
00163 FWViewType::EType viewType, const FWViewContext* vc)
00164 {
00165 increaseComponentTransparency(iId.index(), iCompound, "Ellipsoid", 80);
00166 TEveElement* el = iCompound->FindChild("Ellipsoid");
00167 if (el)
00168 el->SetMainColor(item()->getConfig()->value<long>("Ellipse Color Index") + context().colorManager()->offsetOfLimitedColors());
00169 }
00170
00171
00172
00173
00174 REGISTER_FWPROXYBUILDER(FWVertexProxyBuilder, reco::Vertex, "Vertices", FWViewType::k3DBit | FWViewType::kAllRPZBits);