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
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
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
00048
00049
00050
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
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
00072
00073 edm::Handle<reco::TrackCollection> tks;
00074 iEvent.getByLabel(trackLabel, tks);
00075
00076
00077
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
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
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
00144 iEvent.put(result);
00145
00146 }
00147
00148
00149
00150 DEFINE_FWK_MODULE(PrimaryVertexProducer);