00001 #ifndef UtilAlgos_ObjectCounter_h 00002 #define UtilAlgos_ObjectCounter_h 00003 00018 #include "FWCore/Framework/interface/EDAnalyzer.h" 00019 #include "FWCore/Framework/interface/Event.h" 00020 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00021 #include "FWCore/Framework/interface/TypeID.h" 00022 #include <iostream> 00023 #include <cmath> 00024 00025 template<typename C> 00026 class ObjectCounter : public edm::EDAnalyzer { 00027 public: 00029 explicit ObjectCounter( const edm::ParameterSet& ); 00031 void endJob(); 00032 00033 private: 00035 virtual void analyze( const edm::Event&, const edm::EventSetup& ); 00037 std::string src_; 00039 bool verbose_; 00041 unsigned long n_, nSum_, n2Sum_; 00042 }; 00043 00044 template<typename C> 00045 ObjectCounter<C>::ObjectCounter( const edm::ParameterSet& par ) : 00046 src_( par.template getParameter<std::string>( "src" ) ), 00047 verbose_( par.template getUntrackedParameter<bool>( "verbose", true ) ), 00048 n_( 0 ), nSum_( 0 ), n2Sum_( 0 ) { 00049 } 00050 00051 template<typename C> 00052 void ObjectCounter<C>::endJob() { 00053 double n = 0, n2 = 0, s; 00054 if ( n_!= 0 ) { 00055 n = double( nSum_ ) / n_; 00056 n2 = double ( n2Sum_ ) / n_; 00057 } 00058 s = sqrt( n2 - n * n ); 00059 if ( verbose_ ) { 00060 edm::TypeID id( typeid( typename C::value_type ) ); 00061 std::cout << ">>> collection \"" << src_ << "\" contains (" 00062 << n << " +/- " << s << ") " 00063 << id.friendlyClassName() << " objects" << std::endl; 00064 } 00065 } 00066 00067 template<typename C> 00068 void ObjectCounter<C>::analyze( const edm::Event& evt, const edm::EventSetup& ) { 00069 edm::Handle<C> h; 00070 evt.getByLabel( src_, h ); 00071 if (!h.isValid()) { 00072 std::cerr << ">>> product: " << src_ << " not found" << std::endl; 00073 } else { 00074 int n = h->size(); 00075 nSum_ += n; 00076 n2Sum_ += ( n * n ); 00077 } 00078 ++ n_; 00079 } 00080 00081 #endif