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
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
00040 produces<trigger::TriggerFilterObjectWithRefs>();
00041 }
00042
00043 HLTEgammaDoubleEtFilter::~HLTEgammaDoubleEtFilter(){}
00044
00045
00046 bool
00047 HLTEgammaDoubleEtFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00048 {
00049
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
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
00063 int n(0);
00064
00065
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
00084 bool accept(n>=npaircut_);
00085
00086
00087 iEvent.put(filterproduct);
00088
00089 return accept;
00090 }
00091
00092
00093