CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

HIBestVertexProducer Class Reference

#include <HIBestVertexProducer.h>

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

List of all members.

Public Member Functions

 HIBestVertexProducer (const edm::ParameterSet &ps)
virtual void produce (edm::Event &ev, const edm::EventSetup &es)
 ~HIBestVertexProducer ()

Private Member Functions

void beginJob ()

Private Attributes

edm::InputTag theAdaptiveVertexCollection
edm::InputTag theBeamSpotTag
edm::ParameterSet theConfig
edm::InputTag theMedianVertexCollection

Detailed Description

Definition at line 9 of file HIBestVertexProducer.h.


Constructor & Destructor Documentation

HIBestVertexProducer::HIBestVertexProducer ( const edm::ParameterSet ps) [explicit]

Definition at line 20 of file HIBestVertexProducer.cc.

                            : theConfig(ps),
  theBeamSpotTag(ps.getParameter<edm::InputTag>("beamSpotLabel")),
  theMedianVertexCollection(ps.getParameter<edm::InputTag>("medianVertexCollection")),
  theAdaptiveVertexCollection(ps.getParameter<edm::InputTag>("adaptiveVertexCollection"))
{
  produces<reco::VertexCollection>();
}
HIBestVertexProducer::~HIBestVertexProducer ( )

Definition at line 30 of file HIBestVertexProducer.cc.

{ 
}

Member Function Documentation

void HIBestVertexProducer::beginJob ( void  ) [private, virtual]

Reimplemented from edm::EDProducer.

Definition at line 35 of file HIBestVertexProducer.cc.

{
}
void HIBestVertexProducer::produce ( edm::Event ev,
const edm::EventSetup es 
) [virtual]

Implements edm::EDProducer.

Definition at line 41 of file HIBestVertexProducer.cc.

References SiPixelRawToDigiRegional_cfi::beamSpot, reco::BeamSpot::BeamWidthX(), reco::BeamSpot::BeamWidthY(), edm::Event::getByLabel(), edm::HandleBase::isValid(), reco::BeamSpot::position(), funct::pow(), edm::Handle< T >::product(), edm::Event::put(), reco::BeamSpot::sigmaZ(), reco::BeamSpot::x0(), and reco::BeamSpot::y0().

{
  
  // 1. use best adaptive vertex preferentially
  // 2. use median vertex in case where adaptive algorithm failed
  // 3. use beamspot if netither vertexing method succeeds

  // New vertex collection
  std::auto_ptr<reco::VertexCollection> newVertexCollection(new reco::VertexCollection);

  //** Get precise adaptive vertex **/
  edm::Handle<reco::VertexCollection> vc1;
  ev.getByLabel(theAdaptiveVertexCollection, vc1);
  const reco::VertexCollection *vertices1 = vc1.product();

  if(vertices1->size()==0)
    LogError("HeavyIonVertexing") << "adaptive vertex collection is empty!" << endl;

  if(vertices1->begin()->zError()<3) { 
  
    reco::VertexCollection::const_iterator vertex1 = vertices1->begin();
    newVertexCollection->push_back(*vertex1);

    LogInfo("HeavyIonVertexing") << "adaptive vertex:\n vz = (" 
                                 << vertex1->x() << ", " << vertex1->y() << ", " << vertex1->z() << ")" 
                                 << "\n error = ("
                                 << vertex1->xError() << ", " << vertex1->yError() << ", " 
                                 << vertex1->zError() << ")" << endl;
  } else {
    
    //** Get fast median vertex **/
    edm::Handle<reco::VertexCollection> vc2;
    ev.getByLabel(theMedianVertexCollection, vc2);
    const reco::VertexCollection * vertices2 = vc2.product();
    
    //** Get beam spot position and error **/
    reco::BeamSpot beamSpot;
    edm::Handle<reco::BeamSpot> beamSpotHandle;
    ev.getByLabel(theBeamSpotTag, beamSpotHandle);

    if( beamSpotHandle.isValid() ) 
      beamSpot = *beamSpotHandle;
    else
      LogError("HeavyIonVertexing") << "no beamspot with name: '" << theBeamSpotTag << "'" << endl;

    if(vertices2->size() > 0) { 
      
      reco::VertexCollection::const_iterator vertex2 = vertices2->begin();
      reco::Vertex::Error err;
      err(0,0)=pow(beamSpot.BeamWidthX(),2);
      err(1,1)=pow(beamSpot.BeamWidthY(),2);
      err(2,2)=pow(vertex2->zError(),2);
      reco::Vertex newVertex(reco::Vertex::Point(beamSpot.x0(),beamSpot.y0(),vertex2->z()),
                             err, 0, 1, 1);
      newVertexCollection->push_back(newVertex);  

      LogInfo("HeavyIonVertexing") << "median vertex + beamspot: \n position = (" 
                                   << newVertex.x() << ", " << newVertex.y() << ", " << newVertex.z() << ")" 
                                   << "\n error = ("
                                   << newVertex.xError() << ", " << newVertex.yError() << ", " 
                                   << newVertex.zError() << ")" << endl;
      
    } else { 
      
      reco::Vertex::Error err;
      err(0,0)=pow(beamSpot.BeamWidthX(),2);
      err(1,1)=pow(beamSpot.BeamWidthY(),2);
      err(2,2)=pow(beamSpot.sigmaZ(),2);
      reco::Vertex newVertex(beamSpot.position(), 
                             err, 0, 0, 1);
      newVertexCollection->push_back(newVertex);  

      LogInfo("HeavyIonVertexing") << "beam spot: \n position = (" 
                                   << newVertex.x() << ", " << newVertex.y() << ", " << newVertex.z() << ")" 
                                   << "\n error = ("
                                   << newVertex.xError() << ", " << newVertex.yError() << ", " 
                                   << newVertex.zError() << ")" << endl;
      
    }
    
  }
  
  // put new vertex collection into event
  ev.put(newVertexCollection);
  
}

Member Data Documentation

Definition at line 21 of file HIBestVertexProducer.h.

Definition at line 19 of file HIBestVertexProducer.h.

Definition at line 18 of file HIBestVertexProducer.h.

Definition at line 20 of file HIBestVertexProducer.h.