CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_1/src/Fireworks/Vertices/plugins/FWVertexProxyBuilder.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:     Vertexs
00004 // Class  :     FWVertexProxyBuilder
00005 //
00006 // Implementation:
00007 //     <Notes on implementation>
00008 //
00009 // Original Author:  Chris Jones
00010 //         Created:  Tue Dec  2 14:17:03 EST 2008
00011 // $Id: FWVertexProxyBuilder.cc,v 1.16 2012/03/13 04:22:06 amraktad Exp $
00012 //
00013 // user include files// user include files
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&); // stop default
00062    const FWVertexProxyBuilder& operator=(const FWVertexProxyBuilder&); // stop default
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    // marker
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    // ellipse
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       // external scaling
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       // cache 3D extend used in eval bbox and render 3D
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      // eveEllipsoid->SetFillColor(item()->defaultDisplayProperties().color());
00121      // eveEllipsoid->SetLineColor(item()->defaultDisplayProperties().color());    
00122       eveEllipsoid->SetMainColor(color + context().colorManager()->offsetOfLimitedColors());
00123    }
00124 
00125    // tracks
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 // static member functions
00173 //
00174 REGISTER_FWPROXYBUILDER(FWVertexProxyBuilder, reco::Vertex, "Vertices", FWViewType::k3DBit | FWViewType::kAllRPZBits);