CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/HLTrigger/Egamma/src/HLTEgammaDoubleEtFilter.cc

Go to the documentation of this file.
00001 
00009 #include "HLTrigger/Egamma/interface/HLTEgammaDoubleEtFilter.h"
00010 
00011 #include "DataFormats/Common/interface/Handle.h"
00012 
00013 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
00014 
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016 
00017 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidate.h"
00018 
00019 class EgammaHLTEtSortCriterium{
00020 public:
00021   bool operator() (edm::Ref<reco::RecoEcalCandidateCollection> lhs, edm::Ref<reco::RecoEcalCandidateCollection> rhs){
00022     return lhs->et() > rhs->et();
00023   }
00024 };
00025 
00026 //
00027 // constructors and destructor
00028 //
00029 HLTEgammaDoubleEtFilter::HLTEgammaDoubleEtFilter(const edm::ParameterSet& iConfig)
00030 {
00031    candTag_ = iConfig.getParameter< edm::InputTag > ("candTag");
00032    etcut1_  = iConfig.getParameter<double> ("etcut1");
00033    etcut2_  = iConfig.getParameter<double> ("etcut2");
00034    npaircut_  = iConfig.getParameter<int> ("npaircut");
00035    store_ = iConfig.getUntrackedParameter<bool> ("SaveTag",false) ;
00036    relaxed_ = iConfig.getUntrackedParameter<bool> ("relaxed",true) ;
00037    L1IsoCollTag_= iConfig.getParameter< edm::InputTag > ("L1IsoCand"); 
00038    L1NonIsoCollTag_= iConfig.getParameter< edm::InputTag > ("L1NonIsoCand"); 
00039    //register your products
00040    produces<trigger::TriggerFilterObjectWithRefs>();
00041 }
00042 
00043 HLTEgammaDoubleEtFilter::~HLTEgammaDoubleEtFilter(){}
00044 
00045 // ------------ method called to produce the data  ------------
00046 bool
00047 HLTEgammaDoubleEtFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00048 {
00049     // The filter object
00050   using namespace trigger;
00051     std::auto_ptr<trigger::TriggerFilterObjectWithRefs> filterproduct (new trigger::TriggerFilterObjectWithRefs(path(),module()));
00052     if( store_ ){filterproduct->addCollectionTag(L1IsoCollTag_);}
00053     if( store_ && relaxed_){filterproduct->addCollectionTag(L1NonIsoCollTag_);}
00054   // Ref to Candidate object to be recorded in filter object
00055    edm::Handle<trigger::TriggerFilterObjectWithRefs> PrevFilterOutput;
00056 
00057   iEvent.getByLabel (candTag_,PrevFilterOutput);
00058 
00059   std::vector<edm::Ref<reco::RecoEcalCandidateCollection> >  mysortedrecoecalcands;
00060   PrevFilterOutput->getObjects(TriggerPhoton,  mysortedrecoecalcands);
00061 
00062   // look at all candidates,  check cuts and add to filter object
00063   int n(0);
00064   
00065   // Sort the list
00066   std::sort(mysortedrecoecalcands.begin(), mysortedrecoecalcands.end(), EgammaHLTEtSortCriterium());
00067   edm::Ref<reco::RecoEcalCandidateCollection> ref1, ref2;
00068   for (unsigned int i=0; i<mysortedrecoecalcands.size(); i++) {
00069     ref1 = mysortedrecoecalcands[i];
00070     if( ref1->et() >= etcut1_){
00071       for (unsigned int j=i+1; j<mysortedrecoecalcands.size(); j++) {
00072         ref2 = mysortedrecoecalcands[j];
00073         if( ref2->et() >= etcut2_ ){
00074           filterproduct->addObject(TriggerPhoton, ref1);
00075           filterproduct->addObject(TriggerPhoton, ref2);
00076           n++;
00077         }
00078       }
00079     }
00080   }
00081   
00082 
00083   // filter decision
00084   bool accept(n>=npaircut_);
00085   
00086   // put filter object into the Event
00087   iEvent.put(filterproduct);
00088   
00089   return accept;
00090 }
00091 
00092 
00093