00001
00002
00003
00004
00005 #include "PhysicsTools/PatAlgos/plugins/PATJetProducer.h"
00006
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008 #include "FWCore/ParameterSet/interface/FileInPath.h"
00009
00010 #include "DataFormats/Common/interface/ValueMap.h"
00011 #include "DataFormats/Common/interface/Association.h"
00012 #include "DataFormats/Candidate/interface/CandAssociation.h"
00013
00014 #include "DataFormats/JetReco/interface/JetTracksAssociation.h"
00015 #include "DataFormats/BTauReco/interface/JetTag.h"
00016 #include "DataFormats/BTauReco/interface/TrackProbabilityTagInfo.h"
00017 #include "DataFormats/BTauReco/interface/TrackIPTagInfo.h"
00018 #include "DataFormats/BTauReco/interface/TrackCountingTagInfo.h"
00019 #include "DataFormats/BTauReco/interface/SecondaryVertexTagInfo.h"
00020 #include "DataFormats/BTauReco/interface/SoftLeptonTagInfo.h"
00021
00022 #include "DataFormats/Candidate/interface/CandMatchMap.h"
00023 #include "SimDataFormats/JetMatching/interface/JetFlavourMatching.h"
00024
00025 #include "DataFormats/HepMCCandidate/interface/GenParticleFwd.h"
00026 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00027
00028 #include "DataFormats/Math/interface/deltaR.h"
00029
00030 #include "DataFormats/PatCandidates/interface/JetCorrFactors.h"
00031
00032 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
00033 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
00034
00035 #include <vector>
00036 #include <memory>
00037 #include <algorithm>
00038
00039
00040 using namespace pat;
00041
00042
00043 PATJetProducer::PATJetProducer(const edm::ParameterSet& iConfig) :
00044 useUserData_(iConfig.exists("userData"))
00045 {
00046
00047 jetsSrc_ = iConfig.getParameter<edm::InputTag>( "jetSource" );
00048 embedCaloTowers_ = false;
00049 if ( iConfig.exists("embedCaloTowers") ) {
00050 embedCaloTowers_ = iConfig.getParameter<bool>( "embedCaloTowers" );
00051 }
00052 embedPFCandidates_ = iConfig.getParameter<bool>( "embedPFCandidates" );
00053 getJetMCFlavour_ = iConfig.getParameter<bool>( "getJetMCFlavour" );
00054 jetPartonMapSource_ = iConfig.getParameter<edm::InputTag>( "JetPartonMapSource" );
00055 addGenPartonMatch_ = iConfig.getParameter<bool>( "addGenPartonMatch" );
00056 embedGenPartonMatch_ = iConfig.getParameter<bool>( "embedGenPartonMatch" );
00057 genPartonSrc_ = iConfig.getParameter<edm::InputTag>( "genPartonMatch" );
00058 addGenJetMatch_ = iConfig.getParameter<bool>( "addGenJetMatch" );
00059 embedGenJetMatch_ = iConfig.getParameter<bool>( "embedGenJetMatch" );
00060 genJetSrc_ = iConfig.getParameter<edm::InputTag>( "genJetMatch" );
00061 addPartonJetMatch_ = iConfig.getParameter<bool>( "addPartonJetMatch" );
00062 partonJetSrc_ = iConfig.getParameter<edm::InputTag>( "partonJetSource" );
00063 addJetCorrFactors_ = iConfig.getParameter<bool>( "addJetCorrFactors" );
00064 jetCorrFactorsSrc_ = iConfig.getParameter<std::vector<edm::InputTag> >( "jetCorrFactorsSource" );
00065 addBTagInfo_ = iConfig.getParameter<bool>( "addBTagInfo" );
00066 addDiscriminators_ = iConfig.getParameter<bool>( "addDiscriminators" );
00067 discriminatorTags_ = iConfig.getParameter<std::vector<edm::InputTag> >( "discriminatorSources" );
00068 addTagInfos_ = iConfig.getParameter<bool>( "addTagInfos" );
00069 tagInfoTags_ = iConfig.getParameter<std::vector<edm::InputTag> >( "tagInfoSources" );
00070 addAssociatedTracks_ = iConfig.getParameter<bool>( "addAssociatedTracks" );
00071 trackAssociation_ = iConfig.getParameter<edm::InputTag>( "trackAssociationSource" );
00072 addJetCharge_ = iConfig.getParameter<bool>( "addJetCharge" );
00073 jetCharge_ = iConfig.getParameter<edm::InputTag>( "jetChargeSource" );
00074 addJetID_ = iConfig.getParameter<bool>( "addJetID");
00075 jetIDMapLabel_ = iConfig.getParameter<edm::InputTag>( "jetIDMap");
00076
00077 addEfficiencies_ = iConfig.getParameter<bool>("addEfficiencies");
00078 if (addEfficiencies_) {
00079 efficiencyLoader_ = pat::helper::EfficiencyLoader(iConfig.getParameter<edm::ParameterSet>("efficiencies"));
00080 }
00081
00082 addResolutions_ = iConfig.getParameter<bool>("addResolutions");
00083 if (addResolutions_) {
00084 resolutionLoader_ = pat::helper::KinResolutionsLoader(iConfig.getParameter<edm::ParameterSet>("resolutions"));
00085 }
00086 if (discriminatorTags_.empty()) {
00087 addDiscriminators_ = false;
00088 } else {
00089 for (std::vector<edm::InputTag>::const_iterator it = discriminatorTags_.begin(), ed = discriminatorTags_.end(); it != ed; ++it) {
00090 std::string label = it->label();
00091 std::string::size_type pos = label.find("JetTags");
00092 if ((pos != std::string::npos) && (pos != label.length() - 7)) {
00093 label.erase(pos+7);
00094 }
00095 discriminatorLabels_.push_back(label);
00096 }
00097 }
00098 if (tagInfoTags_.empty()) {
00099 addTagInfos_ = false;
00100 } else {
00101 for (std::vector<edm::InputTag>::const_iterator it = tagInfoTags_.begin(), ed = tagInfoTags_.end(); it != ed; ++it) {
00102 std::string label = it->label();
00103 std::string::size_type pos = label.find("TagInfos");
00104 if ((pos != std::string::npos) && (pos != label.length() - 8)) {
00105 label.erase(pos+8);
00106 }
00107 tagInfoLabels_.push_back(label);
00108 }
00109 }
00110 if (!addBTagInfo_) { addDiscriminators_ = false; addTagInfos_ = false; }
00111
00112 if ( useUserData_ ) {
00113 userDataHelper_ = PATUserDataHelper<Jet>(iConfig.getParameter<edm::ParameterSet>("userData"));
00114 }
00115
00116 produces<std::vector<Jet> >();
00117 produces<reco::GenJetCollection> ("genJets");
00118 produces<std::vector<CaloTower> > ("caloTowers");
00119 produces<reco::PFCandidateCollection > ("pfCandidates");
00120 produces<edm::OwnVector<reco::BaseTagInfo> > ("tagInfos");
00121 }
00122
00123
00124 PATJetProducer::~PATJetProducer() {
00125
00126 }
00127
00128
00129 void PATJetProducer::produce(edm::Event & iEvent, const edm::EventSetup & iSetup)
00130 {
00131
00132 if (iEvent.isRealData()){
00133 getJetMCFlavour_ = false;
00134 addGenPartonMatch_ = false;
00135 addGenJetMatch_ = false;
00136 addPartonJetMatch_ = false;
00137 }
00138
00139
00140 edm::Handle<edm::View<reco::Jet> > jets;
00141 iEvent.getByLabel(jetsSrc_, jets);
00142
00143 if (efficiencyLoader_.enabled()) efficiencyLoader_.newEvent(iEvent);
00144 if (resolutionLoader_.enabled()) resolutionLoader_.newEvent(iEvent, iSetup);
00145
00146
00147 edm::Handle<reco::JetFlavourMatchingCollection> jetFlavMatch;
00148 if (getJetMCFlavour_) iEvent.getByLabel (jetPartonMapSource_, jetFlavMatch);
00149
00150
00151 edm::Handle<edm::Association<reco::GenParticleCollection> > partonMatch;
00152 if (addGenPartonMatch_) iEvent.getByLabel(genPartonSrc_, partonMatch);
00153
00154 edm::Handle<edm::Association<reco::GenJetCollection> > genJetMatch;
00155 if (addGenJetMatch_) iEvent.getByLabel(genJetSrc_, genJetMatch);
00156
00157
00158
00159
00160
00161
00162
00163 std::vector<edm::ValueMap<JetCorrFactors> > jetCorrs;
00164 if (addJetCorrFactors_) {
00165 for ( size_t i = 0; i < jetCorrFactorsSrc_.size(); ++i ) {
00166 edm::Handle<edm::ValueMap<JetCorrFactors> > jetCorr;
00167 iEvent.getByLabel(jetCorrFactorsSrc_[i], jetCorr);
00168 jetCorrs.push_back( *jetCorr );
00169 }
00170 }
00171
00172
00173 std::vector<edm::Handle<reco::JetFloatAssociation::Container> > jetDiscriminators;
00174 if (addBTagInfo_ && addDiscriminators_) {
00175 jetDiscriminators.resize(discriminatorTags_.size());
00176 for (size_t i = 0; i < discriminatorTags_.size(); ++i) {
00177 iEvent.getByLabel(discriminatorTags_[i], jetDiscriminators[i]);
00178 }
00179 }
00180 std::vector<edm::Handle<edm::View<reco::BaseTagInfo> > > jetTagInfos;
00181 if (addBTagInfo_ && addTagInfos_) {
00182 jetTagInfos.resize(tagInfoTags_.size());
00183 for (size_t i = 0; i < tagInfoTags_.size(); ++i) {
00184 iEvent.getByLabel(tagInfoTags_[i], jetTagInfos[i]);
00185 }
00186 }
00187
00188
00189 edm::Handle<reco::JetTracksAssociation::Container > hTrackAss;
00190 if (addAssociatedTracks_) iEvent.getByLabel(trackAssociation_, hTrackAss);
00191 edm::Handle<reco::JetFloatAssociation::Container > hJetChargeAss;
00192 if (addJetCharge_) iEvent.getByLabel(jetCharge_, hJetChargeAss);
00193
00194
00195 edm::Handle<reco::JetIDValueMap> hJetIDMap;
00196 if ( addJetID_ ) iEvent.getByLabel( jetIDMapLabel_, hJetIDMap );
00197
00198
00199 std::auto_ptr< std::vector<Jet> > patJets ( new std::vector<Jet>() );
00200
00201 std::auto_ptr<reco::GenJetCollection > genJetsOut ( new reco::GenJetCollection() );
00202 std::auto_ptr<std::vector<CaloTower> > caloTowersOut( new std::vector<CaloTower> () );
00203 std::auto_ptr<reco::PFCandidateCollection > pfCandidatesOut( new reco::PFCandidateCollection() );
00204 std::auto_ptr<edm::OwnVector<reco::BaseTagInfo> > tagInfosOut ( new edm::OwnVector<reco::BaseTagInfo>() );
00205
00206
00207 edm::RefProd<reco::GenJetCollection > h_genJetsOut = iEvent.getRefBeforePut<reco::GenJetCollection >( "genJets" );
00208 edm::RefProd<std::vector<CaloTower> > h_caloTowersOut = iEvent.getRefBeforePut<std::vector<CaloTower> > ( "caloTowers" );
00209 edm::RefProd<reco::PFCandidateCollection > h_pfCandidatesOut = iEvent.getRefBeforePut<reco::PFCandidateCollection > ( "pfCandidates" );
00210 edm::RefProd<edm::OwnVector<reco::BaseTagInfo> > h_tagInfosOut = iEvent.getRefBeforePut<edm::OwnVector<reco::BaseTagInfo> > ( "tagInfos" );
00211
00212 bool first=true;
00213 for (edm::View<reco::Jet>::const_iterator itJet = jets->begin(); itJet != jets->end(); itJet++) {
00214
00215
00216 unsigned int idx = itJet - jets->begin();
00217 edm::RefToBase<reco::Jet> jetRef = jets->refAt(idx);
00218 edm::Ptr<reco::Jet> jetPtr = jets->ptrAt(idx);
00219 Jet ajet(jetRef);
00220
00221
00222 if ( (ajet.isCaloJet() || ajet.isJPTJet() ) && embedCaloTowers_) {
00223 const reco::CaloJet *cj = 0;
00224 const reco::JPTJet * jptj = 0;
00225 if ( ajet.isCaloJet()) cj = dynamic_cast<const reco::CaloJet *>(jetRef.get());
00226 else {
00227 jptj = dynamic_cast<const reco::JPTJet *>(jetRef.get() );
00228 cj = dynamic_cast<const reco::CaloJet *>(jptj->getCaloJetRef().get() );
00229 }
00230 pat::CaloTowerFwdPtrCollection itowersRef;
00231 std::vector< CaloTowerPtr > itowers = cj->getCaloConstituents();
00232 for ( std::vector<CaloTowerPtr>::const_iterator towBegin = itowers.begin(), towEnd = itowers.end(), itow = towBegin; itow != towEnd; ++itow ) {
00233 if( itow->isAvailable() && itow->isNonnull() ){
00234 caloTowersOut->push_back( **itow );
00235
00236 edm::Ref<std::vector<CaloTower> > caloTowerRef( h_caloTowersOut, caloTowersOut->size() - 1);
00237 edm::Ptr<CaloTower> caloForwardRef ( h_caloTowersOut.id(), caloTowerRef.key(), h_caloTowersOut.productGetter() );
00238
00239 edm::Ptr<CaloTower> caloBackRef ( *itow );
00240
00241 itowersRef.push_back( pat::CaloTowerFwdPtrCollection::value_type ( caloForwardRef, caloBackRef ) );
00242 }
00243 }
00244 ajet.setCaloTowers( itowersRef );
00245 }
00246
00247
00248 if (ajet.isPFJet() && embedPFCandidates_) {
00249 const reco::PFJet *cj = dynamic_cast<const reco::PFJet *>(jetRef.get());
00250 pat::PFCandidateFwdPtrCollection iparticlesRef;
00251 std::vector< reco::PFCandidatePtr > iparticles = cj->getPFConstituents();
00252 for ( std::vector<reco::PFCandidatePtr>::const_iterator partBegin = iparticles.begin(),
00253 partEnd = iparticles.end(), ipart = partBegin;
00254 ipart != partEnd; ++ipart ) {
00255 pfCandidatesOut->push_back( **ipart );
00256
00257 edm::Ref<reco::PFCandidateCollection> pfCollectionRef( h_pfCandidatesOut, pfCandidatesOut->size() - 1);
00258 edm::Ptr<reco::PFCandidate> pfForwardRef ( h_pfCandidatesOut.id(), pfCollectionRef.key(), h_pfCandidatesOut.productGetter() );
00259
00260 edm::Ptr<reco::PFCandidate> pfBackRef ( *ipart );
00261
00262 iparticlesRef.push_back( pat::PFCandidateFwdPtrCollection::value_type ( pfForwardRef, pfBackRef ) );
00263 }
00264 ajet.setPFCandidates( iparticlesRef );
00265 }
00266
00267 if (addJetCorrFactors_) {
00268
00269 for ( unsigned int i=0; i<jetCorrFactorsSrc_.size(); ++i ) {
00270 const JetCorrFactors& jcf = jetCorrs[i][jetRef];
00271
00272
00273 ajet.addJECFactors(jcf);
00274 }
00275 std::vector<std::string> levels = jetCorrs[0][jetRef].correctionLabels();
00276 if(std::find(levels.begin(), levels.end(), "L2L3Residual")!=levels.end()){
00277 ajet.initializeJEC(jetCorrs[0][jetRef].jecLevel("L2L3Residual"));
00278 }
00279 else if(std::find(levels.begin(), levels.end(), "L3Absolute")!=levels.end()){
00280 ajet.initializeJEC(jetCorrs[0][jetRef].jecLevel("L3Absolute"));
00281 }
00282 else{
00283 ajet.initializeJEC(jetCorrs[0][jetRef].jecLevel("Uncorrected"));
00284 if(first){
00285 edm::LogWarning("L3Absolute not found") << "L2L3Residual and L3Absolute are not part of the correction applied jetCorrFactors \n"
00286 << "of module " << jetCorrs[0][jetRef].jecSet() << " jets will remain"
00287 << " uncorrected."; first=false;
00288 }
00289 }
00290 }
00291
00292
00293 if (getJetMCFlavour_) {
00294 ajet.setPartonFlavour( (*jetFlavMatch)[edm::RefToBase<reco::Jet>(jetRef)].getFlavour() );
00295 }
00296
00297 if (addGenPartonMatch_) {
00298 reco::GenParticleRef parton = (*partonMatch)[jetRef];
00299 if (parton.isNonnull() && parton.isAvailable()) {
00300 ajet.setGenParton(parton, embedGenPartonMatch_);
00301 }
00302 }
00303
00304 if (addGenJetMatch_) {
00305 reco::GenJetRef genjet = (*genJetMatch)[jetRef];
00306 if (genjet.isNonnull() && genjet.isAvailable()) {
00307 genJetsOut->push_back( *genjet );
00308
00309 edm::Ref<reco::GenJetCollection > genForwardRef ( h_genJetsOut, genJetsOut->size() - 1 );
00310
00311 edm::Ref<reco::GenJetCollection > genBackRef ( genjet );
00312
00313 edm::FwdRef<reco::GenJetCollection > genjetFwdRef ( genForwardRef, genBackRef );
00314 ajet.setGenJetRef(genjetFwdRef );
00315 }
00316 }
00317
00318 if (efficiencyLoader_.enabled()) {
00319 efficiencyLoader_.setEfficiencies( ajet, jetRef );
00320 }
00321
00322
00323 if (resolutionLoader_.enabled()) {
00324 resolutionLoader_.setResolutions(ajet);
00325 }
00326
00327
00328 if (addPartonJetMatch_) {
00329 }
00330
00331
00332 if (addBTagInfo_) {
00333 if (addDiscriminators_) {
00334 for (size_t k=0; k<jetDiscriminators.size(); ++k) {
00335 float value = (*jetDiscriminators[k])[jetRef];
00336 ajet.addBDiscriminatorPair(std::make_pair(discriminatorLabels_[k], value));
00337 }
00338 }
00339 if (addTagInfos_) {
00340 for (size_t k=0; k<jetTagInfos.size(); ++k) {
00341 const edm::View<reco::BaseTagInfo> & taginfos = *jetTagInfos[k];
00342
00343 edm::Ptr<reco::BaseTagInfo> match;
00344
00345 if ((idx < taginfos.size()) && (taginfos[idx].jet() == jetRef)) {
00346 match = taginfos.ptrAt(idx);
00347 } else {
00348
00349 for (edm::View<reco::BaseTagInfo>::const_iterator itTI = taginfos.begin(), edTI = taginfos.end(); itTI != edTI; ++itTI) {
00350 if (itTI->jet() == jetRef) { match = taginfos.ptrAt( itTI - taginfos.begin() ); break; }
00351 }
00352 }
00353 if (match.isNonnull()) {
00354 tagInfosOut->push_back( match->clone() );
00355
00356 edm::Ptr<reco::BaseTagInfo> tagInfoForwardPtr ( h_tagInfosOut.id(), &tagInfosOut->back(), tagInfosOut->size() - 1 );
00357
00358 edm::Ptr<reco::BaseTagInfo> tagInfoBackPtr ( match );
00359
00360 TagInfoFwdPtrCollection::value_type tagInfoFwdPtr( tagInfoForwardPtr, tagInfoBackPtr ) ;
00361 ajet.addTagInfo(tagInfoLabels_[k], tagInfoFwdPtr );
00362 }
00363 }
00364 }
00365 }
00366
00367 if (addAssociatedTracks_) ajet.setAssociatedTracks( (*hTrackAss)[jetRef] );
00368
00369 if (addJetCharge_) ajet.setJetCharge( (*hJetChargeAss)[jetRef] );
00370
00371
00372 if (addJetID_ && ajet.isCaloJet() ) {
00373 reco::JetID jetId = (*hJetIDMap)[ jetRef ];
00374 ajet.setJetID( jetId );
00375 }
00376
00377 else if ( addJetID_ && ajet.isJPTJet() ){
00378 const reco::JPTJet *jptj = dynamic_cast<const reco::JPTJet *>(jetRef.get());
00379 reco::JetID jetId = (*hJetIDMap)[ jptj->getCaloJetRef() ];
00380 ajet.setJetID( jetId );
00381 }
00382 if ( useUserData_ ) {
00383 userDataHelper_.add( ajet, iEvent, iSetup );
00384 }
00385 patJets->push_back(ajet);
00386 }
00387
00388
00389 std::sort(patJets->begin(), patJets->end(), pTComparator_);
00390
00391
00392 iEvent.put(patJets);
00393
00394 iEvent.put( genJetsOut, "genJets" );
00395 iEvent.put( caloTowersOut, "caloTowers" );
00396 iEvent.put( pfCandidatesOut, "pfCandidates" );
00397 iEvent.put( tagInfosOut, "tagInfos" );
00398
00399
00400 }
00401
00402
00403 void PATJetProducer::fillDescriptions(edm::ConfigurationDescriptions & descriptions)
00404 {
00405 edm::ParameterSetDescription iDesc;
00406 iDesc.setComment("PAT jet producer module");
00407
00408
00409 iDesc.add<edm::InputTag>("jetSource", edm::InputTag("no default"))->setComment("input collection");
00410
00411
00412 iDesc.addOptional<bool>("embedCaloTowers", false)->setComment("embed external CaloTowers (not to be used on AOD input)");
00413 iDesc.add<bool>("embedPFCandidates", true)->setComment("embed external PFCandidates");
00414
00415
00416 iDesc.add<bool>("addGenPartonMatch", true)->setComment("add MC matching");
00417 iDesc.add<bool>("embedGenPartonMatch", false)->setComment("embed MC matched MC information");
00418 iDesc.add<edm::InputTag>("genPartonMatch", edm::InputTag())->setComment("input with MC match information");
00419
00420 iDesc.add<bool>("addGenJetMatch", true)->setComment("add MC matching");
00421 iDesc.add<bool>("embedGenJetMatch", false)->setComment("embed MC matched MC information");
00422 iDesc.add<edm::InputTag>("genJetMatch", edm::InputTag())->setComment("input with MC match information");
00423
00424 iDesc.add<bool>("addJetCharge", true);
00425 iDesc.add<edm::InputTag>("jetChargeSource", edm::InputTag("patJetCharge"));
00426
00427
00428 iDesc.add<bool>("addJetID", true)->setComment("Add jet ID information");
00429 iDesc.add<edm::InputTag>("jetIDMap", edm::InputTag())->setComment("jet id map");
00430
00431 iDesc.add<bool>("addPartonJetMatch", false);
00432 iDesc.add<edm::InputTag>("partonJetSource", edm::InputTag("NOT IMPLEMENTED"));
00433
00434
00435 iDesc.add<bool>("addAssociatedTracks", true);
00436 iDesc.add<edm::InputTag>("trackAssociationSource", edm::InputTag("ic5JetTracksAssociatorAtVertex"));
00437
00438
00439 iDesc.add<bool>("addTagInfos", true);
00440 std::vector<edm::InputTag> emptyVInputTags;
00441 iDesc.add<std::vector<edm::InputTag> >("tagInfoSources", emptyVInputTags);
00442
00443
00444 iDesc.add<bool>("addJetCorrFactors", true);
00445 iDesc.add<std::vector<edm::InputTag> >("jetCorrFactorsSource", emptyVInputTags);
00446
00447
00448 iDesc.add<bool>("addBTagInfo",true);
00449 iDesc.add<bool>("addDiscriminators", true);
00450 iDesc.add<std::vector<edm::InputTag> >("discriminatorSources", emptyVInputTags);
00451
00452
00453 iDesc.add<bool>("getJetMCFlavour", true);
00454 iDesc.add<edm::InputTag>("JetPartonMapSource", edm::InputTag("jetFlavourAssociation"));
00455
00456 pat::helper::KinResolutionsLoader::fillDescription(iDesc);
00457
00458
00459 edm::ParameterSetDescription efficienciesPSet;
00460 efficienciesPSet.setAllowAnything();
00461 iDesc.add("efficiencies", efficienciesPSet);
00462 iDesc.add<bool>("addEfficiencies", false);
00463
00464
00465 edm::ParameterSetDescription userDataPSet;
00466 PATUserDataHelper<Jet>::fillDescription(userDataPSet);
00467 iDesc.addOptional("userData", userDataPSet);
00468
00469 descriptions.add("PATJetProducer", iDesc);
00470 }
00471
00472 #include "FWCore/Framework/interface/MakerMacros.h"
00473
00474 DEFINE_FWK_MODULE(PATJetProducer);
00475