Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "FWCore/Framework/interface/EDProducer.h"
00011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00012 #include "FWCore/Utilities/interface/InputTag.h"
00013
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "FWCore/Framework/interface/MakerMacros.h"
00017 #include "FWCore/Framework/interface/ESHandle.h"
00018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00019
00020 #include "DataFormats/Common/interface/Handle.h"
00021 #include "DataFormats/Common/interface/Ref.h"
00022
00023
00024 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00025 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
00026
00027 #include <memory>
00028 #include <string>
00029 #include <iostream>
00030 #include <vector>
00031
00032 using namespace std;
00033 using namespace reco;
00034 using namespace edm;
00035
00036 class PartonSelector : public edm::EDProducer
00037 {
00038 public:
00039 PartonSelector( const edm::ParameterSet & );
00040 ~PartonSelector();
00041
00042 private:
00043
00044 virtual void produce(edm::Event&, const edm::EventSetup& );
00045 bool withLeptons;
00046 bool withTop;
00047 edm::InputTag inputTagGenParticles_;
00048 };
00049
00050
00051 PartonSelector::PartonSelector( const edm::ParameterSet& iConfig )
00052 {
00053 produces<reco::GenParticleRefVector>();
00054 withLeptons = iConfig.getParameter<bool>("withLeptons");
00055 inputTagGenParticles_ = iConfig.getParameter<edm::InputTag>("src");
00056 if ( iConfig.exists("withTop") ) {
00057 withTop = iConfig.getParameter<bool>("withTop");
00058 } else {
00059 withTop = false;
00060 }
00061 }
00062
00063
00064
00065 PartonSelector::~PartonSelector()
00066 {
00067 }
00068
00069
00070
00071 void PartonSelector::produce( Event& iEvent, const EventSetup& iEs )
00072 {
00073
00074
00075 edm::Handle <reco::GenParticleCollection> particles;
00076 iEvent.getByLabel (inputTagGenParticles_, particles );
00077 edm::LogVerbatim("PartonSelector") << "=== GenParticle size:" << particles->size();
00078 int nPart=0;
00079
00080 auto_ptr<GenParticleRefVector> thePartons ( new GenParticleRefVector);
00081
00082 for (size_t m = 0; m < particles->size(); m++) {
00083
00084
00085 if (m<6) continue;
00086
00087 const GenParticle & aParticle = (*particles)[ m ];
00088
00089 bool isAParton = false;
00090 bool isALepton = false;
00091 int flavour = abs(aParticle.pdgId());
00092 if(flavour == 1 ||
00093 flavour == 2 ||
00094 flavour == 3 ||
00095 flavour == 4 ||
00096 flavour == 5 ||
00097 (flavour == 6 && withTop) ||
00098 flavour == 21 ) isAParton = true;
00099 if(flavour == 11 ||
00100 flavour == 12 ||
00101 flavour == 13 ||
00102 flavour == 14 ||
00103 flavour == 15 ||
00104 flavour == 16 ) isALepton = true;
00105
00106
00107
00108 if( aParticle.status() == 3 && isAParton ) {
00109 thePartons->push_back( GenParticleRef( particles, m ) );
00110 nPart++;
00111 }
00112
00113
00114 int nparton_daughters = 0;
00115 if( aParticle.numberOfDaughters() > 0 && isAParton ) {
00116
00117 for (unsigned int i=0; i < aParticle.numberOfDaughters(); i++){
00118
00119 int daughterFlavour = abs(aParticle.daughter(i)->pdgId());
00120 if( (daughterFlavour == 1 || daughterFlavour == 2 || daughterFlavour == 3 ||
00121 daughterFlavour == 4 || daughterFlavour == 5 || daughterFlavour == 6 || daughterFlavour == 21)) {
00122 nparton_daughters++;
00123 }
00124
00125 }
00126 if(nparton_daughters == 0){
00127 nPart++;
00128 thePartons->push_back( GenParticleRef( particles, m ) );
00129 }
00130
00131 }
00132
00133
00134
00135
00136 if( withLeptons && aParticle.status() == 3 && isALepton ) {
00137 thePartons->push_back( GenParticleRef( particles, m ) );
00138 nPart++;
00139 }
00140 }
00141
00142 edm::LogVerbatim("PartonSelector") << "=== GenParticle selected:" << nPart;
00143 iEvent.put( thePartons );
00144
00145 }
00146
00147 DEFINE_FWK_MODULE(PartonSelector);
00148