CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

FWElectronDetailView Class Reference

#include <FWElectronDetailView.h>

Inheritance diagram for FWElectronDetailView:
FWDetailViewGL< reco::GsfElectron > FWDetailView< reco::GsfElectron > FWDetailViewBase

List of all members.

Public Member Functions

 FWElectronDetailView ()
virtual ~FWElectronDetailView ()

Private Member Functions

void addSceneInfo (const reco::GsfElectron *i, TEveElementList *tList)
void addTrackPointsInCaloData (const reco::GsfElectron *, TEveCaloLego *)
virtual void build (const FWModelId &id, const reco::GsfElectron *)
Bool_t checkRange (Double_t &, Double_t &, Double_t &, Double_t &, Double_t, Double_t)
double deltaEtaSuperClusterTrackAtVtx (const reco::GsfElectron &)
double deltaPhiSuperClusterTrackAtVtx (const reco::GsfElectron &)
void drawCrossHair (const reco::GsfElectron *, TEveCaloLego *, TEveElementList *)
 FWElectronDetailView (const FWElectronDetailView &)
const FWElectronDetailViewoperator= (const FWElectronDetailView &)
virtual void setTextInfo (const FWModelId &id, const reco::GsfElectron *)

Private Attributes

FWECALDetailViewBuilderm_builder
TEveCaloData * m_data
TLegend * m_legend

Detailed Description

Definition at line 31 of file FWElectronDetailView.h.


Constructor & Destructor Documentation

FWElectronDetailView::FWElectronDetailView ( )

Definition at line 39 of file FWElectronDetailView.cc.

                                           :
   m_data(0),
   m_builder(0),
   m_legend(0)
{
}
FWElectronDetailView::~FWElectronDetailView ( ) [virtual]

Definition at line 46 of file FWElectronDetailView.cc.

References m_builder, m_data, and FWDetailViewGL< reco::GsfElectron >::m_eveViewer.

{  
   m_eveViewer->GetGLViewer()->DeleteOverlayElements(TGLOverlayElement::kUser);

   delete m_builder;
   if (m_data) m_data->DecDenyDestroy();
}
FWElectronDetailView::FWElectronDetailView ( const FWElectronDetailView ) [private]

Member Function Documentation

void FWElectronDetailView::addSceneInfo ( const reco::GsfElectron i,
TEveElementList *  tList 
) [private]

Definition at line 365 of file FWElectronDetailView.cc.

References reco::GsfElectron::caloPosition(), funct::cos(), delta, EcalBarrel, EcalEndcap, reco::LeafCandidate::eta(), m_legend, reco::LeafCandidate::phi(), funct::sin(), reco::GsfElectron::superCluster(), funct::tan(), reco::LeafCandidate::theta(), x, detailsBasic3DVector::y, and z.

Referenced by build().

{
   unsigned int subdetId(0);

   if ( !i->superCluster()->seed()->hitsAndFractions().empty() )
      subdetId = i->superCluster()->seed()->hitsAndFractions().front().first.subdetId();

   // centroids
   Double_t x(0), y(0), z(0);
   Double_t delta(0.02);
   if (subdetId == EcalEndcap) delta = 2.5;
   TEveStraightLineSet *scposition = new TEveStraightLineSet("sc position");
   scposition->SetPickable(kTRUE);
   scposition->SetTitle("Super cluster centroid");
   if (subdetId == EcalBarrel) {
      x = i->caloPosition().eta();
      y = i->caloPosition().phi();
   } else if (subdetId == EcalEndcap) {
      x = i->caloPosition().x();
      y = i->caloPosition().y();
   }
   scposition->AddLine(x-delta,y,z,x+delta,y,z);
   scposition->AddLine(x,y-delta,z,x,y+delta,z);
   scposition->AddLine(x,y,z-delta,x,y,z+delta);
   scposition->SetLineColor(kBlue);
   scposition->SetLineWidth(2);
   scposition->SetDepthTest(kFALSE);
   tList->AddElement(scposition);

   scposition->SetMarkerColor(kBlue);
   scposition->SetMarkerStyle(2);
   m_legend->AddEntry(scposition, "Super cluster centroid", "p");

   // seed position
   TEveStraightLineSet *seedposition = new TEveStraightLineSet("seed position");
   seedposition->SetTitle("Seed cluster centroid");
   seedposition->SetPickable(kTRUE);
   if (subdetId == EcalBarrel) {
      x  = i->superCluster()->seed()->position().eta();
      y  = i->superCluster()->seed()->position().phi();
   } else if (subdetId == EcalEndcap) {
      x  = i->superCluster()->seed()->position().x();
      y  = i->superCluster()->seed()->position().y();
   }
   seedposition->AddLine(x-delta,y-delta,z,x+delta,y+delta,z);
   seedposition->AddLine(x-delta,y+delta,z,x+delta,y-delta,z);
   seedposition->SetLineColor(kRed);
   seedposition->SetLineWidth(2);
   seedposition->SetDepthTest(kFALSE);
   tList->AddElement(seedposition);

   seedposition->SetMarkerColor(kRed);
   seedposition->SetMarkerStyle(5);
   m_legend->AddEntry(seedposition, "Seed cluster centroid", "p");

   // electron direction (show it if it's within
   // the area of interest)
   if ( fabs(i->phi()-i->caloPosition().phi())< 25*0.0172 &&
        fabs(i->eta()-i->caloPosition().eta())< 25*0.0172 )
   {
      TEveStraightLineSet *eldirection = new TEveStraightLineSet("seed position");
      eldirection->SetTitle("Electron direction at vertex");
      eldirection->SetPickable(kTRUE);
      if (subdetId == EcalBarrel) {
         x = i->eta();
         y = i->phi();
      }else{
         x = 310*fabs(tan(i->theta()))*cos(i->phi());
         y = 310*fabs(tan(i->theta()))*sin(i->phi());
      }
      eldirection->AddLine(x-delta,y-delta,z,x+delta,y+delta,z);
      eldirection->AddLine(x-delta,y+delta,z,x+delta,y-delta,z);
      eldirection->SetLineColor(kGreen);
      eldirection->SetDepthTest(kFALSE);
      tList->AddElement(eldirection);

      eldirection->SetMarkerColor(kGreen);
      eldirection->SetMarkerStyle(5);
      m_legend->AddEntry(eldirection, "Direction at vertex", "p");
   }
}
void FWElectronDetailView::addTrackPointsInCaloData ( const reco::GsfElectron i,
TEveCaloLego *  lego 
) [private]

Definition at line 299 of file FWElectronDetailView.cc.

References reco::GsfElectron::caloPosition(), checkRange(), data, reco::GsfElectron::deltaEtaSeedClusterTrackAtCalo(), deltaEtaSuperClusterTrackAtVtx(), reco::GsfElectron::deltaPhiSeedClusterTrackAtCalo(), deltaPhiSuperClusterTrackAtVtx(), EcalBarrel, EcalEndcap, eta(), phi, pos, and reco::GsfElectron::superCluster().

Referenced by build().

{
   unsigned int subdetId(0);

   if ( !i->superCluster()->seed()->hitsAndFractions().empty() )
      subdetId = i->superCluster()->seed()->hitsAndFractions().front().first.subdetId();

   TEveCaloDataVec* data = (TEveCaloDataVec*)lego->GetData();
   Double_t em, eM, pm, pM;
   data->GetEtaLimits(em, eM);
   data->GetPhiLimits(pm, pM);
   data->IncDenyDestroy();
   Bool_t changed = kFALSE;
   // add cells in third layer if necessary

   //   trackpositionAtCalo
   {
      double eta = i->superCluster()->seed()->position().eta() -
                   i->deltaEtaSeedClusterTrackAtCalo();
      double phi = i->superCluster()->seed()->position().phi() -
                   i->deltaPhiSeedClusterTrackAtCalo();

      if (subdetId == EcalBarrel)
      {
         if (checkRange(em, eM, pm, pM, eta, phi))
            changed = kTRUE;
      }
      else if (subdetId == EcalEndcap) {
         TVector3 pos;
         pos.SetPtEtaPhi(i->superCluster()->seed()->position().rho(),eta, phi);
         if (checkRange(em, eM, pm, pM, pos.X(), pos.Y()))
            changed = kTRUE;

      }
   }
   // pinposition
   {
      double eta = i->caloPosition().eta() - deltaEtaSuperClusterTrackAtVtx(*i);
      double phi = i->caloPosition().phi() - deltaPhiSuperClusterTrackAtVtx(*i);
      if (subdetId == EcalBarrel)
      {
         if (checkRange(em, eM, pm, pM, eta, phi))
            changed = kTRUE;
      }
      else if (subdetId == EcalEndcap) {
         TVector3 pos;
         pos.SetPtEtaPhi(i->caloPosition().rho(), eta, phi);
         if (checkRange(em, eM, pm, pM, pos.X(), pos.Y()))
            changed = kTRUE;
      }
   }
   if (changed)
   {
      data->AddTower(em, eM, pm, pM);
      data->FillSlice(2, 0);   data->DataChanged();

      lego->ComputeBBox();
      Double_t legoScale = ((eM - em) < (pM - pm)) ? (eM - em) : (pM - pm);
      lego->InitMainTrans();
      lego->RefMainTrans().SetScale(legoScale, legoScale, legoScale*0.5);
      lego->RefMainTrans().SetPos((eM+em)*0.5, (pM+pm)*0.5, 0);
      lego->ElementChanged(true);
   }
}
void FWElectronDetailView::build ( const FWModelId id,
const reco::GsfElectron iElectron 
) [private, virtual]

Implements FWDetailView< reco::GsfElectron >.

Definition at line 58 of file FWElectronDetailView.cc.

References addSceneInfo(), addTrackPointsInCaloData(), FWECALDetailViewBuilder::build(), reco::GsfElectron::caloPosition(), drawCrossHair(), eta(), reco::LeafCandidate::eta(), FWDetailViewBase::item(), m_builder, m_data, FWDetailViewGL< reco::GsfElectron >::m_eveScene, m_legend, reco::LeafCandidate::phi(), phi, setTextInfo(), FWECALDetailViewBuilder::showSuperCluster(), FWECALDetailViewBuilder::showSuperClusters(), reco::GsfElectron::superCluster(), and FWDetailViewGL< reco::GsfElectron >::viewerGL().

{
   if( !iElectron ) return;
   // If SuperCluster reference is not stored,
   // take eta and phi of a Candidate
   double eta = 0;
   double phi = 0;
   if( iElectron->superCluster().isAvailable() ) {
      eta = iElectron->caloPosition().eta();
      phi = iElectron->caloPosition().phi();
   }
   else 
   {
      eta = iElectron->eta();
      phi = iElectron->phi();
   }

   // build ECAL objects
   m_builder = new FWECALDetailViewBuilder( id.item()->getEvent(), id.item()->getGeom(),
                                            eta, phi, 25);
 
   m_builder->showSuperClusters();
   if( iElectron->superCluster().isAvailable() )
      m_builder->showSuperCluster( *(iElectron->superCluster() ), kYellow);
   TEveCaloLego* lego = m_builder->build();
   m_data = lego->GetData();
   m_eveScene->AddElement( lego );

   m_legend = new TLegend(0.01, 0.01, 0.99, 0.99, 0, "NDC");
   m_legend->SetTextSize(0.075);
   m_legend->SetBorderSize(0);
   m_legend->SetMargin(0.15);
   m_legend->SetEntrySeparation(0.05);

   // add Electron specific details
   if( iElectron->superCluster().isAvailable() ) {
      addTrackPointsInCaloData( iElectron, lego );
      drawCrossHair( iElectron, lego, m_eveScene );
      addSceneInfo( iElectron, m_eveScene );
   }
   
   // draw axis at the window corners
   if (1)
   {
   TEveCaloLegoOverlay* overlay = new TEveCaloLegoOverlay();
   overlay->SetShowPlane( kFALSE );
   overlay->SetShowPerspective( kFALSE );
   overlay->SetCaloLego( lego );
   overlay->SetShowScales( 1 ); // temporary
   viewerGL()->AddOverlayElement( overlay );
   }
   // set event handler and flip camera to top view at beginning
   viewerGL()->SetCurrentCamera( TGLViewer::kCameraOrthoXOY );
   FWGLEventHandler* eh =
      new FWGLEventHandler( (TGWindow*)viewerGL()->GetGLWidget(), (TObject*)viewerGL(), lego );
   viewerGL()->SetEventHandler( eh );
   viewerGL()->ResetCamerasAfterNextUpdate();
   viewerGL()->UpdateScene(kFALSE);
   gEve->Redraw3D();

   setTextInfo( id, iElectron );
}
Bool_t FWElectronDetailView::checkRange ( Double_t &  em,
Double_t &  eM,
Double_t &  pm,
Double_t &  pM,
Double_t  eta,
Double_t  phi 
) [private]

Definition at line 267 of file FWElectronDetailView.cc.

References eta(), and phi.

Referenced by addTrackPointsInCaloData().

{
   Bool_t changed = kFALSE;

   //check eta
   if (eta < em)
   {
      em = eta;
      changed = kTRUE;
   }
   else if (eta > eM)
   {
      eM = eta;
      changed = kTRUE;
   }

   // check phi
   if (phi < pm)
   {
      pm = phi;
      changed = kTRUE;
   }
   else if (phi > pM)
   {
      pM = phi;
      changed = kTRUE;
   }
   return changed;
}
double FWElectronDetailView::deltaEtaSuperClusterTrackAtVtx ( const reco::GsfElectron electron) [private]
double FWElectronDetailView::deltaPhiSuperClusterTrackAtVtx ( const reco::GsfElectron electron) [private]
void FWElectronDetailView::drawCrossHair ( const reco::GsfElectron i,
TEveCaloLego *  lego,
TEveElementList *  tList 
) [private]

Definition at line 195 of file FWElectronDetailView.cc.

References reco::GsfElectron::caloPosition(), reco::GsfElectron::deltaEtaSeedClusterTrackAtCalo(), deltaEtaSuperClusterTrackAtVtx(), reco::GsfElectron::deltaPhiSeedClusterTrackAtCalo(), deltaPhiSuperClusterTrackAtVtx(), EcalBarrel, EcalEndcap, eta(), m_legend, phi, pos, and reco::GsfElectron::superCluster().

Referenced by build().

{
   unsigned int subdetId( 0 );
   
   if( !i->superCluster()->seed()->hitsAndFractions().empty() )
      subdetId = i->superCluster()->seed()->hitsAndFractions().front().first.subdetId();

   double ymax = lego->GetPhiMax();
   double ymin = lego->GetPhiMin();
   double xmax = lego->GetEtaMax();
   double xmin = lego->GetEtaMin();

   // draw crosshairs for track intersections

   {
      const double eta = i->superCluster()->seed()->position().eta() -
                         i->deltaEtaSeedClusterTrackAtCalo();
      const double phi = i->superCluster()->seed()->position().phi() -
                         i->deltaPhiSeedClusterTrackAtCalo();

      TEveStraightLineSet *trackpositionAtCalo = new TEveStraightLineSet("sc trackpositionAtCalo");
      trackpositionAtCalo->SetPickable(kTRUE);
      trackpositionAtCalo->SetTitle("Track position at Calo propagating from the outermost state");
      if (subdetId == EcalBarrel)
      {
         trackpositionAtCalo->AddLine(eta, ymin, 0, eta, ymax, 0);
         trackpositionAtCalo->AddLine(xmin, phi, 0, xmax, phi, 0);
      }
      else if (subdetId == EcalEndcap)
      {
         TVector3 pos;
         pos.SetPtEtaPhi(i->superCluster()->seed()->position().rho(), eta, phi);
         trackpositionAtCalo->AddLine(pos.X(), ymin, 0, pos.X(), ymax, 0);
         trackpositionAtCalo->AddLine(xmin, pos.Y(), 0, xmax,pos.Y(),0);
      }
      trackpositionAtCalo->SetDepthTest(kFALSE);
      trackpositionAtCalo->SetLineColor(kBlue);
      tList->AddElement(trackpositionAtCalo);

      m_legend->AddEntry(trackpositionAtCalo, "From outermost state", "l");
   }
   //
   // pin position
   //
   {
      TEveStraightLineSet *pinposition = new TEveStraightLineSet("pin position");
      pinposition->SetPickable(kTRUE);
      pinposition->SetTitle("Track position at Calo propagating from the innermost state");
      Double_t eta = i->caloPosition().eta() - deltaEtaSuperClusterTrackAtVtx(*i);
      Double_t phi = i->caloPosition().phi() - deltaPhiSuperClusterTrackAtVtx(*i);

      if (subdetId == EcalBarrel)
      {
         pinposition->AddLine(eta, ymax, 0, eta, ymin, 0);
         pinposition->AddLine(xmin, phi, 0, xmax, phi, 0);
      }
      else if (subdetId == EcalEndcap)
      {
         TVector3 pos;
         pos.SetPtEtaPhi(i->caloPosition().rho(), eta, phi);
         pinposition->AddLine(pos.X(),ymin, 0, pos.X(), ymax, 0);
         pinposition->AddLine(xmin, pos.Y(), 0, xmax, pos.Y(), 0);
      }
      pinposition->SetDepthTest(kFALSE);
      pinposition->SetLineColor(kRed);
      tList->AddElement(pinposition);

      m_legend->AddEntry(pinposition, "From innermost state", "l");
   }
}
const FWElectronDetailView& FWElectronDetailView::operator= ( const FWElectronDetailView ) [private]
void FWElectronDetailView::setTextInfo ( const FWModelId id,
const reco::GsfElectron electron 
) [private, virtual]

Implements FWDetailView< reco::GsfElectron >.

Definition at line 134 of file FWElectronDetailView.cc.

References reco::LeafCandidate::charge(), reco::GsfElectron::deltaEtaSeedClusterTrackAtCalo(), reco::GsfElectron::deltaEtaSuperClusterTrackAtVtx(), reco::GsfElectron::deltaPhiSeedClusterTrackAtCalo(), reco::GsfElectron::deltaPhiSuperClusterTrackAtVtx(), reco::GsfElectron::ecalDrivenSeed(), reco::LeafCandidate::et(), reco::LeafCandidate::eta(), getHLTprescales::index, FWDetailViewBase::item(), m_builder, FWDetailViewGL< reco::GsfElectron >::m_infoCanvas, m_legend, FWECALDetailViewBuilder::makeLegend(), reco::LeafCandidate::phi(), reco::GsfElectron::superCluster(), reco::GsfElectron::trackerDrivenSeed(), x, and detailsBasic3DVector::y.

Referenced by build().

{
   m_infoCanvas->cd();

   float_t x  = 0.02;
   float_t x2 = 0.52;
   float   y  = 0.95;

   TLatex* latex = new TLatex( x, y, "" );
   const double textsize( 0.05 );
   latex->SetTextSize( 2*textsize );

   latex->DrawLatex( x, y, id.item()->modelName( id.index() ).c_str() );
   y -= latex->GetTextSize()*0.6;

   latex->SetTextSize( textsize );
   float lineH = latex->GetTextSize()*0.6;

   latex->DrawLatex( x, y, Form( " E_{T} = %.1f GeV, #eta = %0.2f, #varphi = %0.2f",
                                 electron->et(), electron->eta(), electron->phi()) );
   y -= lineH;
   // summary
   if( electron->charge() > 0 )
      latex->DrawLatex( x, y, " charge = +1" );
   else
      latex->DrawLatex( x, y, " charge = -1" );
   y -= lineH;

   if( electron->superCluster().isAvailable() ) {     
      // delta phi/eta in
      latex->DrawLatex( x, y, "SuperCluster vs inner state extrapolation" );
      y -= lineH;
      latex->DrawLatex(  x, y, TString::Format(" #Delta#eta_{in} = %.3f",   electron->deltaEtaSuperClusterTrackAtVtx()) );
      latex->DrawLatex( x2, y, TString::Format("#Delta#varphi_{in} = %.3f", electron->deltaPhiSuperClusterTrackAtVtx()) );
      y -= lineH;

      // delta phi/eta out
      latex->DrawLatex( x, y, "SeedCluster vs outer state extrapolation" );
      y -= lineH;

      latex->DrawLatex(  x, y, TString::Format(" #Delta#eta_{out} = %.3f",    electron->deltaEtaSeedClusterTrackAtCalo()) );
      latex->DrawLatex( x2, y, TString::Format(" #Delta#varphi_{out} = %.3f", electron->deltaPhiSeedClusterTrackAtCalo()) );
      y -= 2*lineH;
   } else {
     latex->DrawLatex( x, y, "Ref to SuperCluster is not available" );
   }

   latex->DrawLatex(x, y, TString::Format(" Tracker driven seed: %s", electron->trackerDrivenSeed() ? "YES" : "NO"));
   y -= lineH;
   latex->DrawLatex(x, y, TString::Format(" ECAL driven seed: %s",    electron->ecalDrivenSeed() ? "YES" : "NO"));
   y -= lineH;

   y = m_builder->makeLegend( 0.02, y );
   y -= lineH;

   m_legend->SetY2(y);
   m_legend->Draw();
   m_legend = 0; // Deleted together with TPad.
}

Member Data Documentation

Definition at line 54 of file FWElectronDetailView.h.

Referenced by build(), setTextInfo(), and ~FWElectronDetailView().

TEveCaloData* FWElectronDetailView::m_data [private]

Definition at line 53 of file FWElectronDetailView.h.

Referenced by build(), and ~FWElectronDetailView().

TLegend* FWElectronDetailView::m_legend [private]

Definition at line 55 of file FWElectronDetailView.h.

Referenced by addSceneInfo(), build(), drawCrossHair(), and setTextInfo().