Go to the documentation of this file.00001
00009 #include "HLTrigger/Egamma/interface/HLTEgammaGenericFilter.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 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00019 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
00020 #include "DataFormats/RecoCandidate/interface/RecoEcalCandidateIsolation.h"
00021 #include "DataFormats/Common/interface/AssociationMap.h"
00022 #include "DataFormats/RecoCandidate/interface/RecoCandidate.h"
00023
00024
00025
00026
00027 HLTEgammaGenericFilter::HLTEgammaGenericFilter(const edm::ParameterSet& iConfig){
00028 candTag_ = iConfig.getParameter< edm::InputTag > ("candTag");
00029 isoTag_ = iConfig.getParameter< edm::InputTag > ("isoTag");
00030 nonIsoTag_ = iConfig.getParameter< edm::InputTag > ("nonIsoTag");
00031
00032 lessThan_ = iConfig.getParameter<bool> ("lessThan");
00033 useEt_ = iConfig.getParameter<bool> ("useEt");
00034 thrRegularEB_ = iConfig.getParameter<double> ("thrRegularEB");
00035 thrRegularEE_ = iConfig.getParameter<double> ("thrRegularEE");
00036 thrOverEEB_ = iConfig.getParameter<double> ("thrOverEEB");
00037 thrOverEEE_ = iConfig.getParameter<double> ("thrOverEEE");
00038 thrOverE2EB_ = iConfig.getParameter<double> ("thrOverE2EB");
00039 thrOverE2EE_ = iConfig.getParameter<double> ("thrOverE2EE");
00040
00041 ncandcut_ = iConfig.getParameter<int> ("ncandcut");
00042 doIsolated_ = iConfig.getParameter<bool> ("doIsolated");
00043
00044 store_ = iConfig.getUntrackedParameter<bool> ("SaveTag",false) ;
00045 L1IsoCollTag_= iConfig.getParameter< edm::InputTag > ("L1IsoCand");
00046 L1NonIsoCollTag_= iConfig.getParameter< edm::InputTag > ("L1NonIsoCand");
00047
00048
00049 produces<trigger::TriggerFilterObjectWithRefs>();
00050 }
00051
00052 HLTEgammaGenericFilter::~HLTEgammaGenericFilter(){}
00053
00054
00055
00056 bool
00057 HLTEgammaGenericFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00058 {
00059 using namespace trigger;
00060 std::auto_ptr<trigger::TriggerFilterObjectWithRefs> filterproduct (new trigger::TriggerFilterObjectWithRefs(path(),module()));
00061 if( store_ ){filterproduct->addCollectionTag(L1IsoCollTag_);}
00062 if( store_ && !doIsolated_){filterproduct->addCollectionTag(L1NonIsoCollTag_);}
00063
00064
00065 edm::Ref<reco::RecoEcalCandidateCollection> ref;
00066
00067
00068 int trigger_type = trigger::TriggerCluster;
00069 if ( store_ ) trigger_type = trigger::TriggerPhoton;
00070
00071 edm::Handle<trigger::TriggerFilterObjectWithRefs> PrevFilterOutput;
00072
00073 iEvent.getByLabel (candTag_,PrevFilterOutput);
00074
00075 std::vector<edm::Ref<reco::RecoEcalCandidateCollection> > recoecalcands;
00076 PrevFilterOutput->getObjects(TriggerCluster, recoecalcands);
00077 if(recoecalcands.empty()) PrevFilterOutput->getObjects(TriggerPhoton,recoecalcands);
00078
00079
00080 edm::Handle<reco::RecoEcalCandidateIsolationMap> depMap;
00081 iEvent.getByLabel (isoTag_,depMap);
00082
00083
00084 edm::Handle<reco::RecoEcalCandidateIsolationMap> depNonIsoMap;
00085 if(!doIsolated_) iEvent.getByLabel (nonIsoTag_,depNonIsoMap);
00086
00087
00088 int n = 0;
00089
00090 for (unsigned int i=0; i<recoecalcands.size(); i++) {
00091
00092 ref = recoecalcands[i];
00093 reco::RecoEcalCandidateIsolationMap::const_iterator mapi = (*depMap).find( ref );
00094 if (mapi==(*depMap).end() && !doIsolated_) mapi = (*depNonIsoMap).find( ref );
00095
00096 float vali = mapi->val;
00097 float energy = ref->superCluster()->energy();
00098 float EtaSC = ref->eta();
00099 if (useEt_) energy = energy * sin (2*atan(exp(-EtaSC)));
00100
00101 if ( lessThan_ ) {
00102 if ( (fabs(EtaSC) < 1.479 && vali <= thrRegularEB_) || (fabs(EtaSC) >= 1.479 && vali <= thrRegularEE_) ) {
00103 n++;
00104 filterproduct->addObject(trigger_type, ref);
00105 continue;
00106 }
00107 if (energy > 0. && (thrOverEEB_ > 0. || thrOverEEE_ > 0. || thrOverE2EB_ > 0. || thrOverE2EE_ > 0.) ) {
00108 if ((fabs(EtaSC) < 1.479 && vali/energy <= thrOverEEB_) || (fabs(EtaSC) >= 1.479 && vali/energy <= thrOverEEE_) ) {
00109 n++;
00110 filterproduct->addObject(trigger_type, ref);
00111 continue;
00112 }
00113 if ((fabs(EtaSC) < 1.479 && vali/(energy*energy) <= thrOverE2EB_) || (fabs(EtaSC) >= 1.479 && vali/(energy*energy) <= thrOverE2EE_) ) {
00114 n++;
00115 filterproduct->addObject(trigger_type, ref);
00116 }
00117 }
00118 } else {
00119 if ( (fabs(EtaSC) < 1.479 && vali >= thrRegularEB_) || (fabs(EtaSC) >= 1.479 && vali >= thrRegularEE_) ) {
00120 n++;
00121 filterproduct->addObject(trigger_type, ref);
00122 continue;
00123 }
00124 if (energy > 0. && (thrOverEEB_ > 0. || thrOverEEE_ > 0. || thrOverE2EB_ > 0. || thrOverE2EE_ > 0.) ) {
00125 if ((fabs(EtaSC) < 1.479 && vali/energy >= thrOverEEB_) || (fabs(EtaSC) >= 1.479 && vali/energy >= thrOverEEE_) ) {
00126 n++;
00127 filterproduct->addObject(trigger_type, ref);
00128 continue;
00129 }
00130 if ((fabs(EtaSC) < 1.479 && vali/(energy*energy) >= thrOverE2EB_) || (fabs(EtaSC) >= 1.479 && vali/(energy*energy) >= thrOverE2EE_) ) {
00131 n++;
00132 filterproduct->addObject(trigger_type, ref);
00133 }
00134 }
00135 }
00136 }
00137
00138
00139 bool accept(n>=ncandcut_);
00140
00141
00142 iEvent.put(filterproduct);
00143
00144 return accept;
00145 }
00146