Go to the documentation of this file.00001 #include "FWPFEcalRecHitLegoProxyBuilder.h"
00002
00003
00004 void
00005 FWPFEcalRecHitLegoProxyBuilder::scaleProduct( TEveElementList *parent, FWViewType::EType type, const FWViewContext *vc )
00006 {
00007 FWViewEnergyScale *caloScale = vc->getEnergyScale();
00008 bool b = caloScale->getPlotEt();
00009 float maxVal = getMaxVal( b );
00010 typedef std::vector<FWPFLegoRecHit*> rh;
00011
00012
00013 for( rh::iterator i = m_recHits.begin(); i != m_recHits.end(); ++i )
00014 {
00015 if( (*i)->isTallest() == false && (*i)->getEtEnergy( b ) == maxVal )
00016 (*i)->setIsTallest( true );
00017
00018 (*i)->updateScale( vc);
00019 }
00020 }
00021
00022
00023 void
00024 FWPFEcalRecHitLegoProxyBuilder::localModelChanges( const FWModelId &iId, TEveElement *parent,
00025 FWViewType::EType viewType, const FWViewContext *vc )
00026 {
00027 for (TEveElement::List_i i = parent->BeginChildren(); i!= parent->EndChildren(); ++i)
00028 {
00029 {
00030 TEveStraightLineSet* line = dynamic_cast<TEveStraightLineSet*>(*i);
00031 if (line)
00032 {
00033 const FWDisplayProperties &p = item()->modelInfo( iId.index() ).displayProperties();
00034 line->SetMarkerColor( p.color() );
00035 }
00036 }
00037 }
00038 }
00039
00040
00041 TEveVector
00042 FWPFEcalRecHitLegoProxyBuilder::calculateCentre( const std::vector<TEveVector> &corners ) const
00043 {
00044 TEveVector centre;
00045
00046 for( size_t i = 0; i < corners.size(); ++i )
00047 {
00048 centre.fX += corners[i].fX;
00049 centre.fY += corners[i].fY;
00050 centre.fZ += corners[i].fZ;
00051 }
00052 centre *= 1.f / 8.f;
00053
00054 return centre;
00055 }
00056
00057
00058 float
00059 FWPFEcalRecHitLegoProxyBuilder::calculateEt( const TEveVector ¢re, float E )
00060 {
00061 TEveVector vec = centre;
00062 float et;
00063
00064 vec.Normalize();
00065 vec *= E;
00066 et = vec.Perp();
00067
00068 return et;
00069 }
00070
00071
00072 void
00073 FWPFEcalRecHitLegoProxyBuilder::build( const FWEventItem *iItem, TEveElementList *product, const FWViewContext *vc )
00074 {
00075 float maxEnergy = 0.0f;
00076 float maxEt = 0.0f;
00077 size_t itemSize = iItem->size();
00078
00079 for( size_t index = 0; index < itemSize; ++index )
00080 {
00081 TEveCompound *itemHolder = createCompound();
00082 product->AddElement( itemHolder );
00083
00084 const EcalRecHit &iData = modelData( index );
00085 const float *corners = item()->getGeom()->getCorners( iData.detid() );
00086 float energy, et;
00087 std::vector<TEveVector> etaphiCorners(8);
00088 TEveVector centre;
00089
00090 if( corners == 0 )
00091 continue;
00092
00093 int k = 3;
00094 for( int i = 0; i < 4; ++i )
00095 {
00096 int j = k * 3;
00097 TEveVector cv = TEveVector( corners[j], corners[j+1], corners[j+2] );
00098 etaphiCorners[i].fX = cv.Eta();
00099 etaphiCorners[i].fY = cv.Phi();
00100 etaphiCorners[i].fZ = 0.0;
00101
00102 etaphiCorners[i+4].fX = etaphiCorners[i].fX;
00103 etaphiCorners[i+4].fY = etaphiCorners[i].fY;
00104 etaphiCorners[i+4].fZ = 0.001;
00105
00106 --k;
00107 }
00108
00109 centre = calculateCentre( etaphiCorners );
00110 energy = iData.energy();
00111 et = calculateEt( centre, energy );
00112 context().voteMaxEtAndEnergy( et, energy );
00113
00114 if( energy > maxEnergy )
00115 maxEnergy = energy;
00116 if( energy > maxEt )
00117 maxEt = et;
00118
00119
00120 float dPhi1 = etaphiCorners[2].fY - etaphiCorners[1].fY;
00121 float dPhi2 = etaphiCorners[3].fY - etaphiCorners[0].fY;
00122 float dPhi3 = etaphiCorners[1].fY - etaphiCorners[2].fY;
00123 float dPhi4 = etaphiCorners[0].fY - etaphiCorners[3].fY;
00124
00125 if( dPhi1 > 1 )
00126 etaphiCorners[2].fY = etaphiCorners[2].fY - ( 2 * TMath::Pi() );
00127 if( dPhi2 > 1 )
00128 etaphiCorners[3].fY = etaphiCorners[3].fY - ( 2 * TMath::Pi() );
00129 if( dPhi3 > 1 )
00130 etaphiCorners[2].fY = etaphiCorners[2].fY + ( 2 * TMath::Pi() );
00131 if( dPhi4 > 1 )
00132 etaphiCorners[3].fY = etaphiCorners[3].fY + ( 2 * TMath::Pi() );
00133
00134 FWPFLegoRecHit *recHit = new FWPFLegoRecHit( etaphiCorners, itemHolder, this, vc, energy, et );
00135 recHit->setSquareColor(item()->defaultDisplayProperties().color());
00136 m_recHits.push_back( recHit );
00137 }
00138
00139 m_maxEnergy = maxEnergy;
00140 m_maxEt = maxEt;
00141 m_maxEnergyLog = log(maxEnergy);
00142 m_maxEtLog = log(maxEt);
00143
00144 scaleProduct( product, FWViewType::kLegoPFECAL, vc );
00145 }
00146
00147
00148 void
00149 FWPFEcalRecHitLegoProxyBuilder::cleanLocal()
00150 {
00151 for( std::vector<FWPFLegoRecHit*>::iterator i = m_recHits.begin(); i != m_recHits.end(); ++i )
00152 delete (*i);
00153
00154 m_recHits.clear();
00155 }
00156
00157
00158 REGISTER_FWPROXYBUILDER( FWPFEcalRecHitLegoProxyBuilder, EcalRecHit, "Ecal RecHit", FWViewType::kLegoPFECALBit );