00001
00012 #include "HLTrigger/HLTcore/interface/TriggerSummaryProducerAOD.h"
00013 #include "DataFormats/HLTReco/interface/TriggerEvent.h"
00014
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016
00017 #include<string>
00018
00019 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
00020 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidateFwd.h"
00021 #include "DataFormats/EgammaCandidates/interface/Electron.h"
00022 #include "DataFormats/EgammaCandidates/interface/ElectronFwd.h"
00023 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
00024 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
00025 #include "DataFormats/JetReco/interface/CaloJet.h"
00026 #include "DataFormats/JetReco/interface/CaloJetCollection.h"
00027 #include "DataFormats/Candidate/interface/CompositeCandidate.h"
00028 #include "DataFormats/Candidate/interface/CompositeCandidateFwd.h"
00029 #include "DataFormats/METReco/interface/MET.h"
00030 #include "DataFormats/METReco/interface/METFwd.h"
00031 #include "DataFormats/METReco/interface/CaloMET.h"
00032 #include "DataFormats/METReco/interface/CaloMETFwd.h"
00033 #include "DataFormats/HcalIsolatedTrack/interface/IsolatedPixelTrackCandidate.h"
00034 #include "DataFormats/HcalIsolatedTrack/interface/IsolatedPixelTrackCandidateFwd.h"
00035
00036 #include "DataFormats/L1Trigger/interface/L1HFRingsFwd.h"
00037 #include "DataFormats/L1Trigger/interface/L1EmParticleFwd.h"
00038 #include "DataFormats/L1Trigger/interface/L1JetParticleFwd.h"
00039 #include "DataFormats/L1Trigger/interface/L1MuonParticleFwd.h"
00040 #include "DataFormats/L1Trigger/interface/L1EtMissParticleFwd.h"
00041
00042 #include "DataFormats/L1Trigger/interface/L1HFRings.h"
00043 #include "DataFormats/L1Trigger/interface/L1EmParticle.h"
00044 #include "DataFormats/L1Trigger/interface/L1JetParticle.h"
00045 #include "DataFormats/L1Trigger/interface/L1MuonParticle.h"
00046 #include "DataFormats/L1Trigger/interface/L1EtMissParticle.h"
00047
00048 #include "DataFormats/JetReco/interface/PFJet.h"
00049 #include "DataFormats/JetReco/interface/PFJetCollection.h"
00050 #include "DataFormats/TauReco/interface/PFTau.h"
00051 #include "DataFormats/TauReco/interface/PFTauFwd.h"
00052
00053 #include <algorithm>
00054 #include <typeinfo>
00055
00056
00057
00058
00059
00060 TriggerSummaryProducerAOD::TriggerSummaryProducerAOD(const edm::ParameterSet& ps) :
00061 pn_(ps.getParameter<std::string>("processName")),
00062 selector_(edm::ProcessNameSelector(pn_)),
00063 tns_(),
00064 filterTagsEvent_(pn_!="*"),
00065 filterTagsGlobal_(pn_!="*"),
00066 collectionTagsEvent_(pn_!="*"),
00067 collectionTagsGlobal_(pn_!="*"),
00068 toc_(),
00069 tags_(),
00070 offset_(),
00071 fobs_(),
00072 keys_(),
00073 ids_(),
00074 maskFilters_()
00075 {
00076 if (pn_=="@") {
00077
00078 if (edm::Service<edm::service::TriggerNamesService>().isAvailable()) {
00079
00080 tns_ = edm::Service<edm::service::TriggerNamesService>().operator->();
00081 if (tns_!=0) {
00082 pn_=tns_->getProcessName();
00083 } else {
00084 edm::LogError("TriggerSummaryProducerAOD") << "HLT Error: TriggerNamesService pointer = 0!";
00085 pn_="*";
00086 }
00087 } else {
00088 edm::LogError("TriggerSummaryProducerAOD") << "HLT Error: TriggerNamesService not available!";
00089 pn_="*";
00090 }
00091 selector_=edm::ProcessNameSelector(pn_);
00092 filterTagsEvent_ =InputTagSet(pn_!="*");
00093 filterTagsGlobal_ =InputTagSet(pn_!="*");
00094 collectionTagsEvent_ =InputTagSet(pn_!="*");
00095 collectionTagsGlobal_=InputTagSet(pn_!="*");
00096 }
00097 LogDebug("TriggerSummaryProducerAOD") << "Using process name: '" << pn_ <<"'";
00098
00099 filterTagsGlobal_.clear();
00100 collectionTagsGlobal_.clear();
00101
00102 produces<trigger::TriggerEvent>();
00103
00104 }
00105
00106 TriggerSummaryProducerAOD::~TriggerSummaryProducerAOD()
00107 {
00108 }
00109
00110
00111
00112
00113
00114 namespace {
00115 inline void
00116 tokenizeTag(const std::string& tag, std::string& label, std::string& instance, std::string& process){
00117
00118 using std::string;
00119
00120 const char token(':');
00121 const string empty;
00122
00123 label=tag;
00124 const string::size_type i1(label.find(token));
00125 if (i1==string::npos) {
00126 instance=empty;
00127 process=empty;
00128 } else {
00129 instance=label.substr(i1+1);
00130 label.resize(i1);
00131 const string::size_type i2(instance.find(token));
00132 if (i2==string::npos) {
00133 process=empty;
00134 } else {
00135 process=instance.substr(i2+1);
00136 instance.resize(i2);
00137 }
00138 }
00139 }
00140 }
00141
00142
00143 void
00144 TriggerSummaryProducerAOD::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00145 {
00146 using namespace std;
00147 using namespace edm;
00148 using namespace reco;
00149 using namespace l1extra;
00150 using namespace trigger;
00151
00154 fobs_.clear();
00155 iEvent.getMany(selector_,fobs_);
00156 const unsigned int nfob(fobs_.size());
00157 LogTrace("TriggerSummaryProducerAOD") << "Number of filter objects found: " << nfob;
00158
00159 string tagLabel,tagInstance,tagProcess;
00160
00166 maskFilters_.clear();
00167 maskFilters_.resize(nfob);
00168 filterTagsEvent_.clear();
00169 collectionTagsEvent_.clear();
00170 unsigned int nf(0);
00171 for (unsigned int ifob=0; ifob!=nfob; ++ifob) {
00172 maskFilters_[ifob]=false;
00173 const vector<string>& collectionTags_(fobs_[ifob]->getCollectionTagsAsStrings());
00174 const unsigned int ncol(collectionTags_.size());
00175 if (ncol>0) {
00176 nf++;
00177 maskFilters_[ifob]=true;
00178 const string& label (fobs_[ifob].provenance()->moduleLabel());
00179 const string& instance (fobs_[ifob].provenance()->productInstanceName());
00180 const string& process (fobs_[ifob].provenance()->processName());
00181 filterTagsEvent_.insert(InputTag(label,instance,process));
00182 for (unsigned int icol=0; icol!=ncol; ++icol) {
00183
00184 tokenizeTag(collectionTags_[icol],tagLabel,tagInstance,tagProcess);
00185 collectionTagsEvent_.insert(InputTag(tagLabel,tagInstance,pn_));
00186 }
00187 }
00188 }
00190 if (filterTagsEvent_.size()!=nf) {
00191 LogError("TriggerSummaryProducerAOD")
00192 << "Mismatch in number of filter tags: "
00193 << filterTagsEvent_.size() << "!=" << nf ;
00194 }
00195
00197 collectionTagsGlobal_.insert(collectionTagsEvent_.begin(),collectionTagsEvent_.end());
00198 filterTagsGlobal_.insert(filterTagsEvent_.begin(),filterTagsEvent_.end());
00199
00201 if (isDebugEnabled()) {
00202
00204 const unsigned int nc(collectionTagsEvent_.size());
00205 LogTrace("TriggerSummaryProducerAOD") << "Number of unique collections requested " << nc;
00206 const InputTagSet::const_iterator cb(collectionTagsEvent_.begin());
00207 const InputTagSet::const_iterator ce(collectionTagsEvent_.end());
00208 for ( InputTagSet::const_iterator ci=cb; ci!=ce; ++ci) {
00209 LogTrace("TriggerSummaryProducerAOD") << distance(cb,ci) << " " << ci->encode();
00210 }
00211 const unsigned int nf(filterTagsEvent_.size());
00212 LogTrace("TriggerSummaryProducerAOD") << "Number of unique filters requested " << nf;
00213 const InputTagSet::const_iterator fb(filterTagsEvent_.begin());
00214 const InputTagSet::const_iterator fe(filterTagsEvent_.end());
00215 for ( InputTagSet::const_iterator fi=fb; fi!=fe; ++fi) {
00216 LogTrace("TriggerSummaryProducerAOD") << distance(fb,fi) << " " << fi->encode();
00217 }
00218
00219 }
00220
00226 toc_.clear();
00227 tags_.clear();
00228 keys_.clear();
00229 offset_.clear();
00230 fillTriggerObjectCollections< RecoEcalCandidateCollection>(iEvent);
00231 fillTriggerObjectCollections< ElectronCollection>(iEvent);
00232 fillTriggerObjectCollections< RecoChargedCandidateCollection>(iEvent);
00233 fillTriggerObjectCollections< CaloJetCollection>(iEvent);
00234 fillTriggerObjectCollections< CompositeCandidateCollection>(iEvent);
00235 fillTriggerObjectCollections< METCollection>(iEvent);
00236 fillTriggerObjectCollections< CaloMETCollection>(iEvent);
00237 fillTriggerObjectCollections<IsolatedPixelTrackCandidateCollection>(iEvent);
00239 fillTriggerObjectCollections< L1EmParticleCollection>(iEvent);
00240 fillTriggerObjectCollections< L1MuonParticleCollection>(iEvent);
00241 fillTriggerObjectCollections< L1JetParticleCollection>(iEvent);
00242 fillTriggerObjectCollections< L1EtMissParticleCollection>(iEvent);
00243 fillTriggerObjectCollections< L1HFRingsCollection>(iEvent);
00245 fillTriggerObjectCollections< PFJetCollection>(iEvent);
00246 fillTriggerObjectCollections< PFTauCollection>(iEvent);
00248 const unsigned int nk(tags_.size());
00249 LogDebug("TriggerSummaryProducerAOD") << "Number of collections found: " << nk;
00250 const unsigned int no(toc_.size());
00251 LogDebug("TriggerSummaryProducerAOD") << "Number of physics objects found: " << no;
00252
00255 auto_ptr<TriggerEvent> product(new TriggerEvent(pn_,nk,no,nf));
00256
00258 product->addCollections(tags_,keys_);
00259 product->addObjects(toc_);
00260
00262 for (unsigned int ifob=0; ifob!=nfob; ++ifob) {
00263 if (maskFilters_[ifob]) {
00264 const string& label (fobs_[ifob].provenance()->moduleLabel());
00265 const string& instance (fobs_[ifob].provenance()->productInstanceName());
00266 const string& process (fobs_[ifob].provenance()->processName());
00267 const edm::InputTag filterTag(label,instance,process);
00268 ids_.clear();
00269 keys_.clear();
00270 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->photonIds() ,fobs_[ifob]->photonRefs());
00271 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->electronIds() ,fobs_[ifob]->electronRefs());
00272 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->muonIds() ,fobs_[ifob]->muonRefs());
00273 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->jetIds() ,fobs_[ifob]->jetRefs());
00274 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->compositeIds(),fobs_[ifob]->compositeRefs());
00275 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->basemetIds() ,fobs_[ifob]->basemetRefs());
00276 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->calometIds() ,fobs_[ifob]->calometRefs());
00277 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->pixtrackIds() ,fobs_[ifob]->pixtrackRefs());
00278 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->l1emIds() ,fobs_[ifob]->l1emRefs());
00279 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->l1muonIds() ,fobs_[ifob]->l1muonRefs());
00280 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->l1jetIds() ,fobs_[ifob]->l1jetRefs());
00281 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->l1etmissIds() ,fobs_[ifob]->l1etmissRefs());
00282 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->l1hfringsIds(),fobs_[ifob]->l1hfringsRefs());
00283 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->pfjetIds() ,fobs_[ifob]->pfjetRefs());
00284 fillFilterObjectMembers(iEvent,filterTag,fobs_[ifob]->pftauIds() ,fobs_[ifob]->pftauRefs());
00285 product->addFilter(filterTag,ids_,keys_);
00286 }
00287 }
00288
00289 OrphanHandle<TriggerEvent> ref = iEvent.put(product);
00290 LogTrace("TriggerSummaryProducerAOD") << "Number of physics objects packed: " << ref->sizeObjects();
00291 LogTrace("TriggerSummaryProducerAOD") << "Number of filter objects packed: " << ref->sizeFilters();
00292
00293 }
00294
00295 template <typename C>
00296 void TriggerSummaryProducerAOD::fillTriggerObjectCollections(const edm::Event& iEvent) {
00297
00301
00302 using namespace std;
00303 using namespace edm;
00304 using namespace reco;
00305 using namespace l1extra;
00306 using namespace trigger;
00307
00308 vector<Handle<C> > collections;
00309 iEvent.getMany(selector_,collections);
00310 const unsigned int nc(collections.size());
00311
00312 for (unsigned int ic=0; ic!=nc; ++ic) {
00313 const Provenance& provenance(*(collections[ic].provenance()));
00314 const string& label (provenance.moduleLabel());
00315 const string& instance (provenance.productInstanceName());
00316 const string& process (provenance.processName());
00317 const InputTag collectionTag(label,instance,process);
00318
00319 if (collectionTagsEvent_.find(collectionTag)!=collectionTagsEvent_.end()) {
00320 const ProductID pid(collections[ic].provenance()->productID());
00321 if (offset_.find(pid)!=offset_.end()) {
00322 LogError("TriggerSummaryProducerAOD") << "Duplicate pid!";
00323 }
00324 offset_[pid]=toc_.size();
00325 const unsigned int n(collections[ic]->size());
00326 for (unsigned int i=0; i!=n; ++i) {
00327 fillTriggerObject( (*collections[ic])[i] );
00328 }
00329 tags_.push_back(collectionTag.encode());
00330 keys_.push_back(toc_.size());
00331 }
00332
00333 }
00334 }
00335
00336 template <typename T>
00337 void TriggerSummaryProducerAOD::fillTriggerObject(const T& object) {
00338
00339 using namespace trigger;
00340 toc_.push_back( TriggerObject(object) );
00341
00342 return;
00343 }
00344
00345 void TriggerSummaryProducerAOD::fillTriggerObject(const l1extra::L1HFRings& object) {
00346
00347 using namespace l1extra;
00348 using namespace trigger;
00349
00350 toc_.push_back(TriggerObject(TriggerL1HfRingEtSums,
00351 object.hfEtSum(L1HFRings::kRing1PosEta),
00352 object.hfEtSum(L1HFRings::kRing1NegEta),
00353 object.hfEtSum(L1HFRings::kRing2PosEta),
00354 object.hfEtSum(L1HFRings::kRing2NegEta) ) );
00355 toc_.push_back(TriggerObject(TriggerL1HfBitCounts,
00356 object.hfBitCount(L1HFRings::kRing1PosEta),
00357 object.hfBitCount(L1HFRings::kRing1NegEta),
00358 object.hfBitCount(L1HFRings::kRing2PosEta),
00359 object.hfBitCount(L1HFRings::kRing2NegEta) ) );
00360
00361 return;
00362 }
00363
00364 void TriggerSummaryProducerAOD::fillTriggerObject(const l1extra::L1EtMissParticle& object) {
00365
00366 using namespace l1extra;
00367 using namespace trigger;
00368
00369 toc_.push_back( TriggerObject(object) );
00370 if (object.type()==L1EtMissParticle::kMET) {
00371 toc_.push_back(TriggerObject(TriggerL1ETT,object.etTotal(),0.0,0.0,0.0));
00372 } else if (object.type()==L1EtMissParticle::kMHT) {
00373 toc_.push_back(TriggerObject(TriggerL1HTT,object.etTotal(),0.0,0.0,0.0));
00374 } else {
00375 toc_.push_back(TriggerObject(0, object.etTotal(),0.0,0.0,0.0));
00376 }
00377
00378 return;
00379 }
00380
00381 void TriggerSummaryProducerAOD::fillTriggerObject(const reco::CaloMET& object) {
00382
00383 using namespace reco;
00384 using namespace trigger;
00385
00386 toc_.push_back( TriggerObject(object) );
00387 toc_.push_back(TriggerObject(TriggerTET ,object.sumEt() ,0.0,0.0,0.0));
00388 toc_.push_back(TriggerObject(TriggerMETSig ,object.mEtSig() ,0.0,0.0,0.0));
00389 toc_.push_back(TriggerObject(TriggerELongit,object.e_longitudinal(),0.0,0.0,0.0));
00390
00391 return;
00392 }
00393
00394 void TriggerSummaryProducerAOD::fillTriggerObject(const reco::MET& object) {
00395
00396 using namespace reco;
00397 using namespace trigger;
00398
00399 toc_.push_back( TriggerObject(object) );
00400 toc_.push_back(TriggerObject(TriggerTHT ,object.sumEt() ,0.0,0.0,0.0));
00401 toc_.push_back(TriggerObject(TriggerMHTSig ,object.mEtSig() ,0.0,0.0,0.0));
00402 toc_.push_back(TriggerObject(TriggerHLongit,object.e_longitudinal(),0.0,0.0,0.0));
00403
00404 return;
00405 }
00406
00407 template <typename C>
00408 void TriggerSummaryProducerAOD::fillFilterObjectMembers(const edm::Event& iEvent, const edm::InputTag& tag, const trigger::Vids& ids, const std::vector<edm::Ref<C> >& refs) {
00409
00413
00414 using namespace std;
00415 using namespace edm;
00416 using namespace reco;
00417 using namespace l1extra;
00418 using namespace trigger;
00419
00420 if (ids.size()!=refs.size()) {
00421 LogError("TriggerSummaryProducerAOD") << "Vector length is different: "
00422 << ids.size() << " " << refs.size();
00423 }
00424
00425 const unsigned int n(min(ids.size(),refs.size()));
00426 for (unsigned int i=0; i!=n; ++i) {
00427 const ProductID pid(refs[i].id());
00428 if (offset_.find(pid)==offset_.end()) {
00429 const string& label(iEvent.getProvenance(pid).moduleLabel());
00430 const string& instance(iEvent.getProvenance(pid).productInstanceName());
00431 const string& process(iEvent.getProvenance(pid).processName());
00432 LogError("TriggerSummaryProducerAOD")
00433 << "Uunknown pid:"
00434 << " FilterTag/Key: " << tag.encode()
00435 << "/" << i
00436 << " CollectionTag/Key: "
00437 << InputTag(label,instance,process).encode()
00438 << "/" << refs[i].key()
00439 << " CollectionType: " << typeid(C).name();
00440 } else {
00441 fillFilterObjectMember(offset_[pid],ids[i],refs[i]);
00442 }
00443 }
00444 return;
00445
00446 }
00447
00448 template <typename C>
00449 void TriggerSummaryProducerAOD::fillFilterObjectMember(const int& offset, const int& id, const edm::Ref<C> & ref) {
00450
00451 keys_.push_back(offset+ref.key());
00452 ids_.push_back(id);
00453
00454 return;
00455 }
00456
00457 void TriggerSummaryProducerAOD::fillFilterObjectMember(const int& offset, const int& id, const edm::Ref<l1extra::L1HFRingsCollection> & ref) {
00458
00459 using namespace trigger;
00460
00461 if (id==TriggerL1HfBitCounts) {
00462 keys_.push_back(offset+2*ref.key()+1);
00463 } else {
00464 keys_.push_back(offset+2*ref.key()+0);
00465 }
00466 ids_.push_back(id);
00467
00468 return;
00469 }
00470
00471 void TriggerSummaryProducerAOD::fillFilterObjectMember(const int& offset, const int& id, const edm::Ref<l1extra::L1EtMissParticleCollection> & ref) {
00472
00473 using namespace trigger;
00474
00475 if ( (id==TriggerL1ETT) || (id==TriggerL1HTT) ) {
00476 keys_.push_back(offset+2*ref.key()+1);
00477 } else {
00478 keys_.push_back(offset+2*ref.key()+0);
00479 }
00480 ids_.push_back(id);
00481
00482 return;
00483 }
00484
00485 void TriggerSummaryProducerAOD::fillFilterObjectMember(const int& offset, const int& id, const edm::Ref<reco::CaloMETCollection> & ref) {
00486
00487 using namespace trigger;
00488
00489 if ( (id==TriggerTHT) || (id==TriggerTET) ) {
00490 keys_.push_back(offset+4*ref.key()+1);
00491 } else if ( (id==TriggerMETSig) || (id==TriggerMHTSig) ) {
00492 keys_.push_back(offset+4*ref.key()+2);
00493 } else if ( (id==TriggerELongit) || (id==TriggerHLongit) ) {
00494 keys_.push_back(offset+4*ref.key()+3);
00495 } else {
00496 keys_.push_back(offset+4*ref.key()+0);
00497 }
00498 ids_.push_back(id);
00499
00500 return;
00501 }
00502
00503 void TriggerSummaryProducerAOD::fillFilterObjectMember(const int& offset, const int& id, const edm::Ref<reco::METCollection> & ref) {
00504
00505 using namespace trigger;
00506
00507 if ( (id==TriggerTHT) || (id==TriggerTET) ) {
00508 keys_.push_back(offset+4*ref.key()+1);
00509 } else if ( (id==TriggerMETSig) || (id==TriggerMHTSig) ) {
00510 keys_.push_back(offset+4*ref.key()+2);
00511 } else if ( (id==TriggerELongit) || (id==TriggerHLongit) ) {
00512 keys_.push_back(offset+4*ref.key()+3);
00513 } else {
00514 keys_.push_back(offset+4*ref.key()+0);
00515 }
00516 ids_.push_back(id);
00517
00518 return;
00519 }
00520
00521 void TriggerSummaryProducerAOD::endJob() {
00522
00523 using namespace std;
00524 using namespace edm;
00525 using namespace trigger;
00526
00527 LogVerbatim("TriggerSummaryProducerAOD") << endl;
00528 LogVerbatim("TriggerSummaryProducerAOD") << "TriggerSummaryProducerAOD::endJob - accumulated tags:" << endl;
00529
00530 const unsigned int nc(collectionTagsGlobal_.size());
00531 const unsigned int nf(filterTagsGlobal_.size());
00532 LogVerbatim("TriggerSummaryProducerAOD") << " Overall number of Collections/Filters: "
00533 << nc << "/" << nf << endl;
00534
00535 LogVerbatim("TriggerSummaryProducerAOD") << " The collections: " << nc << endl;
00536 const InputTagSet::const_iterator cb(collectionTagsGlobal_.begin());
00537 const InputTagSet::const_iterator ce(collectionTagsGlobal_.end());
00538 for ( InputTagSet::const_iterator ci=cb; ci!=ce; ++ci) {
00539 LogVerbatim("TriggerSummaryProducerAOD") << " " << distance(cb,ci) << " " << ci->encode() << endl;
00540 }
00541
00542 LogVerbatim("TriggerSummaryProducerAOD") << " The filters:" << nf << endl;
00543 const InputTagSet::const_iterator fb(filterTagsGlobal_.begin());
00544 const InputTagSet::const_iterator fe(filterTagsGlobal_.end());
00545 for ( InputTagSet::const_iterator fi=fb; fi!=fe; ++fi) {
00546 LogVerbatim("TriggerSummaryProducerAOD") << " " << distance(fb,fi) << " " << fi->encode() << endl;
00547 }
00548
00549 LogVerbatim("TriggerSummaryProducerAOD") << "TriggerSummaryProducerAOD::endJob." << endl;
00550 LogVerbatim("TriggerSummaryProducerAOD") << endl;
00551
00552 return;
00553
00554 }