![]() |
![]() |
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