CMS 3D CMS Logo

Public Member Functions | Public Attributes | Private Attributes

VertexFromTrackProducer Class Reference

#include <RecoVertex/PrimaryVertexProducer/src/VertexFromTrackProducer.cc>

Inheritance diagram for VertexFromTrackProducer:
edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

edm::ParameterSet config () const
virtual void produce (edm::Event &, const edm::EventSetup &)
 VertexFromTrackProducer (const edm::ParameterSet &)
 ~VertexFromTrackProducer ()

Public Attributes

edm::InputTag beamSpotLabel
edm::InputTag trackLabel
edm::InputTag triggerFilterElectronsSrc
edm::InputTag triggerFilterMuonsSrc
edm::InputTag vertexLabel

Private Attributes

bool fIsRecoCandidate
bool fUseBeamSpot
bool fUseTriggerFilterElectrons
bool fUseTriggerFilterMuons
bool fUseVertex
bool fVerbose
edm::ParameterSet theConfig

Detailed Description

Description: produces a primary vertex extrapolating the track of a candidate on the beam axis

Implementation: <Notes on="" implementation>="">

Definition at line 37 of file VertexFromTrackProducer.h.


Constructor & Destructor Documentation

VertexFromTrackProducer::VertexFromTrackProducer ( const edm::ParameterSet conf) [explicit]

Definition at line 33 of file VertexFromTrackProducer.cc.

References beamSpotLabel, fIsRecoCandidate, fUseBeamSpot, fUseTriggerFilterElectrons, fUseTriggerFilterMuons, fUseVertex, fVerbose, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), trackLabel, triggerFilterElectronsSrc, triggerFilterMuonsSrc, and vertexLabel.

  : theConfig(conf)
{
  edm::LogInfo("PVDebugInfo") 
    << "Initializing  VertexFromTrackProducer" << "\n";
  fVerbose = conf.getUntrackedParameter<bool>("verbose", false);
  trackLabel = conf.getParameter<edm::InputTag>("trackLabel");
  fIsRecoCandidate = conf.getParameter<bool>("isRecoCandidate");
  fUseBeamSpot = conf.getParameter<bool>("useBeamSpot");
  fUseVertex = conf.getParameter<bool>("useVertex");
  fUseTriggerFilterElectrons = conf.getParameter<bool>("useTriggerFilterElectrons");
  fUseTriggerFilterMuons = conf.getParameter<bool>("useTriggerFilterMuons");
  triggerFilterElectronsSrc = conf.getParameter<edm::InputTag>("triggerFilterElectronsSrc");
  triggerFilterMuonsSrc = conf.getParameter<edm::InputTag>("triggerFilterMuonsSrc");
  vertexLabel = conf.getParameter<edm::InputTag>("vertexLabel");
  beamSpotLabel = conf.getParameter<edm::InputTag>("beamSpotLabel");
 
  produces<reco::VertexCollection>();

}
VertexFromTrackProducer::~VertexFromTrackProducer ( )

Definition at line 55 of file VertexFromTrackProducer.cc.

{}

Member Function Documentation

edm::ParameterSet VertexFromTrackProducer::config ( void  ) const [inline]

Definition at line 45 of file VertexFromTrackProducer.h.

References theConfig.

{ return theConfig; }
void VertexFromTrackProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
) [virtual]

Implements edm::EDProducer.

Definition at line 63 of file VertexFromTrackProducer.cc.

References SiPixelRawToDigiRegional_cfi::beamSpot, beamSpotLabel, gather_cfg::cout, fIsRecoCandidate, fUseBeamSpot, fUseTriggerFilterElectrons, fUseTriggerFilterMuons, fUseVertex, fVerbose, edm::Event::getByLabel(), i, edm::HandleBase::isValid(), reco::Vertex::position(), reco::BeamSpot::position(), edm::Event::put(), query::result, trackLabel, trigger::TriggerElectron, triggerFilterElectronsSrc, triggerFilterMuonsSrc, trigger::TriggerMuon, v, vertexLabel, reco::Vertex::xError(), reco::Vertex::yError(), and reco::Vertex::zError().

{
  using namespace edm;

  std::auto_ptr<reco::VertexCollection> result(new reco::VertexCollection);
  reco::VertexCollection vColl;

  math::XYZPoint vertexPoint;
  bool vertexAvailable = false;

  // get the BeamSpot
  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
  iEvent.getByLabel(beamSpotLabel,recoBeamSpotHandle);
  if (recoBeamSpotHandle.isValid()){
    reco::BeamSpot beamSpot = *recoBeamSpotHandle;
    vertexPoint = beamSpot.position();
  }else{
    edm::LogError("UnusableBeamSpot") << "No beam spot found in Event";
  }

  if(fUseVertex)
  {
    // get the Vertex
    edm::Handle<edm::View<reco::Vertex> > recoVertexHandle;
    iEvent.getByLabel(vertexLabel,recoVertexHandle);
    if ((recoVertexHandle.isValid()) && (recoVertexHandle->size()>0)){
      reco::Vertex vertex = recoVertexHandle->at(0);
      vertexPoint = vertex.position();
      vertexAvailable = true;
    }else {
      edm::LogInfo("UnusableVertex")
        << "No vertex found in Event, beam spot used instaed" << "\n";
    }
  }

  const reco::Track* track = 0;
  if(fIsRecoCandidate)
  {
    edm::Handle<edm::View<reco::RecoCandidate> > candidateHandle;
    iEvent.getByLabel(trackLabel, candidateHandle);
    if ((candidateHandle.isValid())&&(candidateHandle->size()>0)){
      double maxpt=0.;
      unsigned i_maxpt=0;
      for (unsigned i = 0; i < candidateHandle->size(); ++i) {
        double pt=candidateHandle->ptrAt(i)->pt();
        if(pt>maxpt)
        {
          i_maxpt=i;
          maxpt=pt;
        }
      }
      track = dynamic_cast<const reco::Track*>(candidateHandle->ptrAt(i_maxpt)->bestTrack());
    }
  } 
  else if(fUseTriggerFilterElectrons) {
    edm::Handle<trigger::TriggerFilterObjectWithRefs> triggerfilter;
    iEvent.getByLabel(triggerFilterElectronsSrc, triggerfilter);
    std::vector<reco::ElectronRef> recocandidates;
    triggerfilter->getObjects(trigger::TriggerElectron,recocandidates);
    if ((recocandidates.size()>0)){
      double maxpt=0.;
      unsigned i_maxpt=0;
      for (unsigned i = 0; i < recocandidates.size(); ++i) {
        double pt=recocandidates.at(i)->pt();
        if(pt>maxpt) 
          {
            i_maxpt=i;
            maxpt=pt;
          }
        track = dynamic_cast<const reco::Track*>(recocandidates.at(i_maxpt)->bestTrack());
      }
    }
  }  
  else if(fUseTriggerFilterMuons) {
    edm::Handle<trigger::TriggerFilterObjectWithRefs> triggerfilter;
    iEvent.getByLabel(triggerFilterMuonsSrc, triggerfilter);
    std::vector<reco::RecoChargedCandidateRef> recocandidates;
    triggerfilter->getObjects(trigger::TriggerMuon,recocandidates);
    if ((recocandidates.size()>0)){
      double maxpt=0.;
      unsigned i_maxpt=0;
      for (unsigned i = 0; i < recocandidates.size(); ++i) {
        double pt=recocandidates.at(i)->pt();
        if(pt>maxpt) 
          {
            i_maxpt=i;
            maxpt=pt;
          }
        track = dynamic_cast<const reco::Track*>(recocandidates.at(i_maxpt)->bestTrack());
      }
    }
  }
  else {
    edm::Handle<edm::View<reco::Track> > trackHandle;
    iEvent.getByLabel(trackLabel, trackHandle);
    if ((trackHandle.isValid())&&(trackHandle->size()>0)){
      double maxpt=0.;
      unsigned i_maxpt=0;
      for (unsigned i = 0; i < trackHandle->size(); ++i) {
        double pt=trackHandle->ptrAt(i)->pt();
        if(pt>maxpt)
        {
          i_maxpt=i;
          maxpt=pt;
        }
      }
      track = dynamic_cast<const reco::Track*>(&*trackHandle->ptrAt(i_maxpt));
    }
  }

  if(track) {
    if(fUseBeamSpot || (fUseVertex && vertexAvailable) ) {
      vertexPoint.SetZ(vertexPoint.z()+track->dz(vertexPoint));
    }
    else {
      vertexPoint.SetZ(track->vz());
    }
  }
  math::Error<3>::type noErrors;
  reco::Vertex v(vertexPoint, noErrors);
  vColl.push_back(v);

  // provide beamspot or primary vertex if no candidate found
  //if(vColl.size()==0)
  //{
  //    math::Error<3>::type noErrors;
  //    reco::Vertex v(vertexPoint, noErrors);
  //    vColl.push_back(v);
  //}

  if(fVerbose){
    int ivtx=0;
    for(reco::VertexCollection::const_iterator v=vColl.begin(); 
        v!=vColl.end(); ++v){
      std::cout << "recvtx "<< ivtx++ 
                << " x "  << std::setw(6) << v->position().x() 
                << " dx " << std::setw(6) << v->xError()
                << " y "  << std::setw(6) << v->position().y() 
                << " dy " << std::setw(6) << v->yError()
                << " z "  << std::setw(6) << v->position().z() 
                << " dz " << std::setw(6) << v->zError()
                << std::endl;
    }
  }

  
  *result = vColl;
  iEvent.put(result);
  
}

Member Data Documentation

Definition at line 50 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 54 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 55 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 57 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 57 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 56 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 59 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 58 of file VertexFromTrackProducer.h.

Referenced by config().

Definition at line 46 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 47 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 48 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().

Definition at line 49 of file VertexFromTrackProducer.h.

Referenced by produce(), and VertexFromTrackProducer().