00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "TGeoTube.h"
00018 #include "TEveJetCone.h"
00019 #include "TEveGeoNode.h"
00020 #include "TEveScalableStraightLineSet.h"
00021 #include "TEveTrack.h"
00022
00023 #include "Fireworks/Calo/interface/FWTauProxyBuilderBase.h"
00024 #include "Fireworks/Calo/interface/makeEveJetCone.h"
00025 #include "Fireworks/Core/interface/Context.h"
00026 #include "Fireworks/Calo/interface/thetaBins.h"
00027 #include "Fireworks/Core/interface/BuilderUtils.h"
00028 #include "Fireworks/Core/interface/FWEventItem.h"
00029 #include "Fireworks/Core/interface/FWViewEnergyScale.h"
00030
00031 #include "Fireworks/Tracks/interface/TrackUtils.h"
00032
00033 #include "DataFormats/TauReco/interface/BaseTau.h"
00034 #include "DataFormats/TrackReco/interface/Track.h"
00035
00036
00037 FWTauProxyBuilderBase::FWTauProxyBuilderBase():
00038 m_minTheta(0),
00039 m_maxTheta(0)
00040 {
00041 }
00042
00043 FWTauProxyBuilderBase::~FWTauProxyBuilderBase()
00044 {
00045 }
00046
00047 void
00048 FWTauProxyBuilderBase::buildBaseTau( const reco::BaseTau& iTau, const reco::Jet& iJet, TEveElement* comp, FWViewType::EType type, const FWViewContext* vc)
00049 {
00050
00051 addLeadTrack( iTau, comp );
00052 addConstituentTracks( iTau, comp );
00053
00054
00055 if (FWViewType::isProjected(type))
00056 {
00057 double phi = iTau.phi();
00058 double theta = iTau.theta();
00059 double size = 1;
00060
00061 bool barrel = (theta< context().caloTransAngle() || theta > (TMath::Pi() - context().caloTransAngle()));
00062 float ecalR = barrel ? context().caloR1() : context().caloR2();
00063 float ecalZ = barrel ? context().caloZ1() : context().caloZ2();
00064
00065 TEveScalableStraightLineSet* marker = new TEveScalableStraightLineSet( "energy" );
00066
00067 if( type == FWViewType::kRhoZ )
00068 {
00069 double r(0);
00070 ( theta < context().caloTransAngle() || M_PI-theta < context().caloTransAngle()) ?
00071 r = ecalZ/fabs(cos(theta)) :
00072 r = ecalR/sin(theta);
00073
00074 fireworks::addRhoZEnergyProjection( this, comp, ecalR, ecalZ, m_minTheta-0.003, m_maxTheta+0.003, phi);
00075
00076 marker->SetScaleCenter( 0., (phi>0 ? r*fabs(sin(theta)) : -r*fabs(sin(theta))), r*cos(theta) );
00077 marker->AddLine(0., (phi>0 ? r*fabs(sin(theta)) : -r*fabs(sin(theta))), r*cos(theta),
00078 0., (phi>0 ? (r+size)*fabs(sin(theta)) : -(r+size)*fabs(sin(theta))), (r+size)*cos(theta) );
00079
00080 }
00081 else
00082 {
00083 std::pair<double,double> phiRange = fireworks::getPhiRange( m_phis, phi );
00084 double min_phi = phiRange.first-M_PI/36/2;
00085 double max_phi = phiRange.second+M_PI/36/2;
00086 if( fabs(phiRange.first-phiRange.first)<1e-3 ) {
00087 min_phi = phi-M_PI/36/2;
00088 max_phi = phi+M_PI/36/2;
00089 }
00090 TEveGeoManagerHolder gmgr(TEveGeoShape::GetGeoMangeur());
00091 TGeoBBox *sc_box = new TGeoTubeSeg(ecalR - 1, ecalR + 1, 1, min_phi * 180 / M_PI, max_phi * 180 / M_PI);
00092 TEveGeoShape *shape = fireworks::getShape( "spread", sc_box, item()->defaultDisplayProperties().color() );
00093 shape->SetPickable(kTRUE);
00094 setupAddElement( shape, comp );
00095
00096 marker->SetScaleCenter(ecalR*cos(phi), ecalR*sin(phi), 0);
00097 marker->AddLine( ecalR*cos( phi ), ecalR*sin( phi ), 0,
00098 ( ecalR+size )*cos( phi ), ( ecalR+size )*sin( phi ), 0);
00099 }
00100 marker->SetLineWidth(4);
00101 FWViewEnergyScale* caloScale = vc->getEnergyScale();
00102 marker->SetScale(caloScale->getScaleFactor3D()*(caloScale->getPlotEt() ? iTau.et() : iTau.energy()));
00103 setupAddElement( marker, comp );
00104 m_lines.push_back(fireworks::scaleMarker(marker, iTau.et(), iTau.energy(), vc));
00105
00106 context().voteMaxEtAndEnergy( iTau.et(), iTau.energy());
00107 }
00108 else
00109 {
00110
00111 TEveJetCone* cone = fireworks::makeEveJetCone(iJet, context());
00112 const FWDisplayProperties &dp = item()->defaultDisplayProperties();
00113 cone->SetFillColor(dp.color());
00114 cone->SetLineColor(dp.color());
00115 setupAddElement( cone, comp );
00116 cone->SetMainTransparency(TMath::Min(100, 80 + dp.transparency() / 5));
00117 }
00118 }
00119
00120
00121 void
00122 FWTauProxyBuilderBase::addConstituentTracks( const reco::BaseTau &tau, class TEveElement* product )
00123 {
00124 for( reco::TrackRefVector::iterator i = tau.signalTracks().begin(), iEnd = tau.signalTracks().end();
00125 i != iEnd; ++i ) {
00126 TEveTrack* track( 0 );
00127 if( i->isAvailable() ) {
00128 track = fireworks::prepareTrack( **i, context().getTrackPropagator() );
00129 track->MakeTrack();
00130 setupAddElement( track, product );
00131 }
00132 }
00133 }
00134
00135
00136 void
00137 FWTauProxyBuilderBase::addLeadTrack( const reco::BaseTau &tau, class TEveElement *product )
00138 {
00139 const reco::TrackRef leadTrack = tau.leadTrack();
00140 if( !leadTrack ) return;
00141
00142 TEveTrack* track = fireworks::prepareTrack( *leadTrack, context().getTrackPropagator() );
00143 if( track )
00144 {
00145 track->MakeTrack();
00146 setupAddElement( track, product );
00147 }
00148 }
00149
00150 void
00151 FWTauProxyBuilderBase::localModelChanges(const FWModelId& iId, TEveElement* iCompound,
00152 FWViewType::EType viewType, const FWViewContext* vc)
00153 {
00154 if (FWViewType::isProjected(viewType))
00155 increaseComponentTransparency(iId.index(), iCompound, "TEveJetCone", 80);
00156 }
00157
00158 void
00159 FWTauProxyBuilderBase::scaleProduct(TEveElementList* parent, FWViewType::EType viewType, const FWViewContext* vc)
00160 {
00161 if (FWViewType::isProjected(viewType))
00162 {
00163 typedef std::vector<fireworks::scaleMarker> Lines_t;
00164 FWViewEnergyScale* caloScale = vc->getEnergyScale();
00165
00166 for (Lines_t::iterator i = m_lines.begin(); i!= m_lines.end(); ++ i)
00167 {
00168 if (vc == (*i).m_vc)
00169 {
00170 float value = caloScale->getPlotEt() ? (*i).m_et : (*i).m_energy;
00171 (*i).m_ls->SetScale(caloScale->getScaleFactor3D()*value);
00172 TEveProjected* proj = *(*i).m_ls->BeginProjecteds();
00173 proj->UpdateProjection();
00174 }
00175 }
00176 }
00177 }
00178
00179 void
00180 FWTauProxyBuilderBase::cleanLocal()
00181 {
00182 m_lines.clear();
00183 }