CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/RecoVertex/PrimaryVertexProducer/plugins/PrimaryVertexProducer.cc

Go to the documentation of this file.
00001 #include "RecoVertex/PrimaryVertexProducer/interface/PrimaryVertexProducer.h"
00002 
00003 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00004 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00005 #include "DataFormats/Common/interface/Handle.h"
00006 #include "FWCore/Framework/interface/MakerMacros.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 
00009 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00010 #include "RecoVertex/VertexPrimitives/interface/TransientVertex.h"
00011 
00012 #include "FWCore/Framework/interface/ESHandle.h"
00013 #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
00014 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
00015 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00016 
00017 //using namespace reco;
00018 
00019 //
00020 // constants, enums and typedefs
00021 //
00022 
00023 //
00024 // static data member definitions
00025 //
00026 
00027 //
00028 // constructors and destructor
00029 //
00030 PrimaryVertexProducer::PrimaryVertexProducer(const edm::ParameterSet& conf)
00031   : theAlgo(conf), theConfig(conf)
00032 {
00033   edm::LogInfo("PVDebugInfo") 
00034     << "Initializing PV producer " << "\n";
00035   fVerbose=conf.getUntrackedParameter<bool>("verbose", false);
00036   trackLabel = conf.getParameter<edm::InputTag>("TrackLabel");
00037   beamSpotLabel = conf.getParameter<edm::InputTag>("beamSpotLabel");
00038  
00039   produces<reco::VertexCollection>();
00040 
00041 }
00042 
00043 
00044 PrimaryVertexProducer::~PrimaryVertexProducer() {}
00045 
00046 //
00047 // member functions
00048 //
00049 
00050 // ------------ method called to produce the data  ------------
00051 void
00052 PrimaryVertexProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00053 {
00054   using namespace edm;
00055 
00056   std::auto_ptr<reco::VertexCollection> result(new reco::VertexCollection);
00057   reco::VertexCollection vColl;
00058 
00059   // get the BeamSpot, it will alwys be needed, even when not used as a constraint
00060   reco::BeamSpot vertexBeamSpot;
00061   edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
00062   iEvent.getByLabel(beamSpotLabel,recoBeamSpotHandle);
00063   if (recoBeamSpotHandle.isValid()){
00064     vertexBeamSpot = *recoBeamSpotHandle;
00065   }else{
00066     edm::LogError("UnusableBeamSpot") << "No beam spot available from EventSetup";
00067   }
00068 
00069 
00070 
00071   // get RECO tracks from the event
00072   // `tks` can be used as a ptr to a reco::TrackCollection
00073   edm::Handle<reco::TrackCollection> tks;
00074   iEvent.getByLabel(trackLabel, tks);
00075 
00076 
00077   // interface RECO tracks to vertex reconstruction
00078   edm::ESHandle<TransientTrackBuilder> theB;
00079   iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",theB);
00080   std::vector<reco::TransientTrack> t_tks = (*theB).build(tks, vertexBeamSpot);
00081   if(fVerbose) {std::cout << "RecoVertex/PrimaryVertexProducer"
00082                      << "Found: " << t_tks.size() << " reconstructed tracks" << "\n";
00083   }
00084 
00085 
00086   // call vertex reconstruction
00087   std::vector<TransientVertex> t_vts = theAlgo.vertices(t_tks, vertexBeamSpot);
00088   if(fVerbose){
00089     std::cout <<"RecoVertex/PrimaryVertexProducer: "
00090               << " found " << t_vts.size() << " reconstructed vertices" << "\n";
00091   }
00092    
00093   // convert transient vertices returned by the theAlgo to (reco) vertices
00094   for (std::vector<TransientVertex>::const_iterator iv = t_vts.begin();
00095        iv != t_vts.end(); iv++) {
00096     reco::Vertex v = *iv;
00097     vColl.push_back(v);
00098   }
00099 
00100   if (vColl.empty()) {
00101     GlobalError bse(vertexBeamSpot.rotatedCovariance3D());
00102     if ( (bse.cxx() <= 0.) || 
00103         (bse.cyy() <= 0.) ||
00104         (bse.czz() <= 0.) ) {
00105       AlgebraicSymMatrix33 we;
00106       we(0,0)=10000; we(1,1)=10000; we(2,2)=10000;
00107       vColl.push_back(reco::Vertex(vertexBeamSpot.position(), we,0.,0.,0));
00108       if(fVerbose){
00109         std::cout <<"RecoVertex/PrimaryVertexProducer: "
00110                   << "Beamspot with invalid errors "<<bse.matrix()<<std::endl;
00111         std::cout << "Will put Vertex derived from dummy-fake BeamSpot into Event.\n";
00112       }
00113     } else {
00114       vColl.push_back(reco::Vertex(vertexBeamSpot.position(), 
00115                                  vertexBeamSpot.rotatedCovariance3D(),0.,0.,0));
00116       if(fVerbose){
00117         std::cout <<"RecoVertex/PrimaryVertexProducer: "
00118                   << " will put Vertex derived from BeamSpot into Event.\n";
00119       }
00120     }
00121   }
00122 
00123   if(fVerbose){
00124     int ivtx=0;
00125     for(reco::VertexCollection::const_iterator v=vColl.begin(); 
00126         v!=vColl.end(); ++v){
00127       std::cout << "recvtx "<< ivtx++ 
00128                 << "#trk " << std::setw(3) << v->tracksSize()
00129                 << " chi2 " << std::setw(4) << v->chi2() 
00130                 << " ndof " << std::setw(3) << v->ndof() 
00131                 << " x "  << std::setw(6) << v->position().x() 
00132                 << " dx " << std::setw(6) << v->xError()
00133                 << " y "  << std::setw(6) << v->position().y() 
00134                 << " dy " << std::setw(6) << v->yError()
00135                 << " z "  << std::setw(6) << v->position().z() 
00136                 << " dz " << std::setw(6) << v->zError()
00137                 << std::endl;
00138     }
00139   }
00140 
00141   
00142   *result = vColl;
00143   //  iEvent.put(result, "PrimaryVertex");
00144   iEvent.put(result);
00145   
00146 }
00147 
00148 
00149 //define this as a plug-in
00150 DEFINE_FWK_MODULE(PrimaryVertexProducer);