Go to the documentation of this file.00001 #ifndef UtilAlgos_NtpProducer_h
00002 #define UtilAlgos_NtpProducer_h
00003
00013 #include "FWCore/Framework/interface/EDProducer.h"
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00016 #include "FWCore/Utilities/interface/InputTag.h"
00017 #include "CommonTools/Utils/interface/StringObjectFunction.h"
00018
00019 template<typename C>
00020 class NtpProducer : public edm::EDProducer {
00021 public:
00023 NtpProducer( const edm::ParameterSet& );
00025 ~NtpProducer();
00026
00027 protected:
00029 virtual void produce( edm::Event&, const edm::EventSetup& );
00030
00031 private:
00033 edm::InputTag src_;
00035 std::vector<std::pair<std::string, StringObjectFunction<typename C::value_type> > > tags_;
00036 bool lazyParser_;
00037 std::string prefix_;
00038 bool eventInfo_;
00039 };
00040
00041 template<typename C>
00042 NtpProducer<C>::NtpProducer( const edm::ParameterSet& par ) :
00043 src_( par.template getParameter<edm::InputTag>( "src" ) ),
00044 lazyParser_( par.template getUntrackedParameter<bool>( "lazyParser", false ) ),
00045 prefix_( par.template getUntrackedParameter<std::string>( "prefix","" ) ),
00046 eventInfo_( par.template getUntrackedParameter<bool>( "eventInfo",true ) ){
00047 std::vector<edm::ParameterSet> variables =
00048 par.template getParameter<std::vector<edm::ParameterSet> >("variables");
00049 std::vector<edm::ParameterSet>::const_iterator
00050 q = variables.begin(), end = variables.end();
00051 if(eventInfo_){
00052 produces<unsigned int>( prefix_+"EventNumber" ).setBranchAlias( prefix_ + "EventNumber" );
00053 produces<unsigned int>( prefix_ + "RunNumber" ).setBranchAlias( prefix_ + "RunNumber" );
00054 produces<unsigned int>( prefix_ + "LumiBlock" ).setBranchAlias( prefix_ + "Lumiblock" );
00055 }
00056 for (; q!=end; ++q) {
00057 std::string tag = prefix_ + q->getUntrackedParameter<std::string>("tag");
00058 StringObjectFunction<typename C::value_type> quantity(q->getUntrackedParameter<std::string>("quantity"), lazyParser_);
00059 tags_.push_back(std::make_pair(tag, quantity));
00060 produces<std::vector<float> >(tag).setBranchAlias(tag);
00061
00062 }
00063 }
00064
00065 template<typename C>
00066 NtpProducer<C>::~NtpProducer() {
00067 }
00068
00069 template<typename C>
00070 void NtpProducer<C>::produce( edm::Event& iEvent, const edm::EventSetup& ) {
00071 edm::Handle<C> coll;
00072 iEvent.getByLabel(src_, coll);
00073 if(eventInfo_){
00074 std::auto_ptr<unsigned int> event( new unsigned int );
00075 std::auto_ptr<unsigned int> run( new unsigned int );
00076 std::auto_ptr<unsigned int> lumi( new unsigned int );
00077 *event = iEvent.id().event();
00078 *run = iEvent.id().run();
00079 *lumi = iEvent.luminosityBlock();
00080 iEvent.put( event, prefix_ + "EventNumber" );
00081 iEvent.put( run, prefix_ + "RunNumber" );
00082 iEvent.put( lumi, prefix_ + "LumiBlock" );
00083 }
00084 typename std::vector<std::pair<std::string, StringObjectFunction<typename C::value_type> > >::const_iterator
00085 q = tags_.begin(), end = tags_.end();
00086 for(;q!=end; ++q) {
00087 std::auto_ptr<std::vector<float> > x(new std::vector<float>);
00088 x->reserve(coll->size());
00089 for (typename C::const_iterator elem=coll->begin(); elem!=coll->end(); ++elem ) {
00090 x->push_back(q->second(*elem));
00091 }
00092 iEvent.put(x, q->first);
00093 }
00094 }
00095
00096 #endif