CMS 3D CMS Logo

PFTauSelectorDefinition.h

Go to the documentation of this file.
00001 #ifndef PhysicsTools_PFCandProducer_PFTauSelectorDefinition
00002 #define PhysicsTools_PFCandProducer_PFTauSelectorDefinition
00003 
00004 #include "DataFormats/TauReco/interface/PFTau.h"
00005 #include "DataFormats/TauReco/interface/PFTauDiscriminator.h"
00006 
00007 #include <iostream>
00008 
00009 struct PFTauSelectorDefinition {
00010 
00011   typedef reco::PFTauCollection collection;
00012   typedef edm::Handle< collection > HandleToCollection;
00013   typedef std::vector< reco::PFTau *> container;
00014   typedef container::const_iterator const_iterator;
00015 
00016   struct TDiscCutPair {
00017     edm::Handle<reco::PFTauDiscriminator> m_discHandle;
00018     double m_cut;
00019   };    
00020   typedef std::vector<TDiscCutPair> TDiscCutPairVec;
00021   
00022   PFTauSelectorDefinition ( const edm::ParameterSet & cfg ) {
00023     discriminators_ = cfg.getParameter< std::vector<edm::ParameterSet> >( "discriminators" ); 
00024   }
00025   
00026   const_iterator begin() const { return selected_.begin(); }
00027 
00028   const_iterator end() const { return selected_.end(); }
00029 
00030   void select( const HandleToCollection & hc, 
00031                const edm::Event & e,
00032                const edm::EventSetup& s) 
00033   {
00034            
00035     selected_.clear();
00036     assert( hc.isValid() ); // collection of PFTaus
00037     
00038     // get discriminators and coresponding cuts from stored vpset
00039     static TDiscCutPairVec discriminators;
00040     discriminators.clear();
00041     
00042     for(std::vector< edm::ParameterSet >::iterator it = discriminators_.begin(); 
00043         it != discriminators_.end();
00044         ++it)
00045     {
00046       TDiscCutPair disc;
00047       // get discriminator, check if valid
00048       // assert isn't a good method to do it
00049       if(!(e.getByLabel( it->getParameter<edm::InputTag>("discriminator"), disc.m_discHandle))) assert(0);
00050       disc.m_cut = it->getParameter<double>("selectionCut");
00051       // the discriminator collection and the PFTau collection
00052       // must have the same size
00053       assert( disc.m_discHandle->size() ==  hc->size());
00054       discriminators.push_back(disc);
00055     }
00056       
00057 
00058     unsigned key=0;
00059     static bool passedAllCuts;
00060     for( collection::const_iterator pftau = hc->begin(); 
00061           pftau != hc->end();
00062           ++pftau, ++key) 
00063     {
00064       passedAllCuts = true;
00065       reco::PFTauRef pfTauRef(hc, key);
00066       
00067       //iterate over all discriminators, check the cuts
00068       for (TDiscCutPairVec::iterator discIt = discriminators.begin();
00069            discIt!=discriminators.end();
00070            ++discIt)
00071       {
00072         if ( (*(discIt->m_discHandle))[pfTauRef] <= discIt->m_cut)
00073           passedAllCuts = false;
00074       }
00075       
00076          
00077       if(passedAllCuts)
00078         selected_.push_back( new reco::PFTau(*pftau) );
00079     } // end collection iteration
00080   } // end select()
00081 
00082   size_t size() const { return selected_.size(); }
00083 
00084 private:
00085   container selected_;
00086   std::vector< edm::ParameterSet > discriminators_;
00087   
00088 };
00089 
00090 #endif

Generated on Tue Jun 9 17:45:06 2009 for CMSSW by  doxygen 1.5.4