CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/Fireworks/ParticleFlow/plugins/FWPFEcalRecHitLegoProxyBuilder.cc

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    // printf("FWPFEcalRecHitLegoProxyBuilder::scaleProduct >> scale %f \n", caloScale->getValToHeight());
00013    for( rh::iterator i = m_recHits.begin(); i != m_recHits.end(); ++i )
00014    {  // Tallest tower needs deciding still
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;            // Get total for x,y,z values
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 &centre, 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(); //cache 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();                                     // Conversion of rechit X/Y values for plotting in Eta/Phi
00099          etaphiCorners[i].fY = cv.Phi();
00100          etaphiCorners[i].fZ = 0.0;
00101 
00102          etaphiCorners[i+4].fX = etaphiCorners[i].fX;                        // Top can simply be plotted exactly over the top of the bottom face
00103          etaphiCorners[i+4].fY = etaphiCorners[i].fY;
00104          etaphiCorners[i+4].fZ = 0.001;
00105          // printf("%f %f %d \n",  etaphiCorners[i].fX, etaphiCorners[i].fY, i);
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       // Stop phi wrap
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 );