Go to the documentation of this file.00001
00011 #include "FWCore/Framework/interface/EDProducer.h"
00012 #include "DataFormats/Common/interface/Association.h"
00013 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00014 #include "SimTracker/TrackHistory/interface/TrackHistory.h"
00015
00016 namespace edm
00017 {
00018 class ParameterSet;
00019 }
00020
00021 class GenTrackMatcher : public edm::EDProducer
00022 {
00023 public:
00025 GenTrackMatcher( const edm::ParameterSet & );
00026
00027 private:
00028 void produce( edm::Event& evt, const edm::EventSetup& es );
00029 TrackHistory tracer_;
00030 edm::InputTag tracks_, genParticles_;
00031 typedef edm::Association<reco::GenParticleCollection> GenParticleMatch;
00032 };
00033
00034 #include "DataFormats/Common/interface/Handle.h"
00035 #include "FWCore/Framework/interface/ESHandle.h"
00036 #include "FWCore/Framework/interface/Event.h"
00037 #include "FWCore/Utilities/interface/EDMException.h"
00038 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00039
00040 using namespace edm;
00041 using namespace std;
00042 using namespace reco;
00043
00044 GenTrackMatcher::GenTrackMatcher(const ParameterSet & p) :
00045 tracer_(p),
00046 tracks_(p.getUntrackedParameter<edm::InputTag>("trackProducer")),
00047 genParticles_(p.getUntrackedParameter<edm::InputTag>("genParticles"))
00048 {
00049 produces<GenParticleMatch>();
00050 }
00051
00052 void GenTrackMatcher::produce(Event& evt, const EventSetup& es)
00053 {
00054 Handle<View<Track> > tracks;
00055 evt.getByLabel(tracks_, tracks);
00056 Handle<vector<int> > barCodes;
00057 evt.getByLabel(genParticles_, barCodes);
00058 Handle<GenParticleCollection> genParticles;
00059 evt.getByLabel(genParticles_, genParticles);
00060 auto_ptr<GenParticleMatch> match(new GenParticleMatch(GenParticleRefProd(genParticles)));
00061 GenParticleMatch::Filler filler(*match);
00062 size_t n = tracks->size();
00063 vector<int> indices(n,-1);
00064 tracer_.newEvent(evt, es);
00065 for (size_t i = 0; i < n; ++ i )
00066 {
00067 RefToBase<Track> track(tracks, i);
00068 if (tracer_.evaluate(track))
00069 {
00070 const HepMC::GenParticle * particle = tracer_.genParticle();
00071 if (particle)
00072 {
00073 int barCode = particle->barcode();
00074 vector<int>::const_iterator b = barCodes->begin(), e = barCodes->end(), f = find( b, e, barCode );
00075 if (f == e) throw edm::Exception(errors::InvalidReference)
00076 << "found matching particle with barcode" << *f
00077 << " which has not been found in " << genParticles_;
00078 indices[i] = *f;
00079 }
00080 }
00081 }
00082 filler.insert(tracks, indices.begin(), indices.end());
00083 filler.fill();
00084 evt.put(match);
00085 }
00086
00087 #include "FWCore/Framework/interface/MakerMacros.h"
00088
00089 DEFINE_FWK_MODULE( GenTrackMatcher );
00090