CMS 3D CMS Logo

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

Go to the documentation of this file.
00001 
00009 #include "HLTrigger/Egamma/interface/HLTEgammaCaloIsolFilterPairs.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 //
00018 // constructors and destructor
00019 //
00020 HLTEgammaCaloIsolFilterPairs::HLTEgammaCaloIsolFilterPairs(const edm::ParameterSet& iConfig)
00021 {
00022   candTag_ = iConfig.getParameter< edm::InputTag > ("candTag");
00023   isoTag_ = iConfig.getParameter< edm::InputTag > ("isoTag");
00024   nonIsoTag_ = iConfig.getParameter< edm::InputTag > ("nonIsoTag");
00025 
00026   isolcut_EB1  = iConfig.getParameter<double> ("isolcutEB1");
00027   FracCut_EB1 = iConfig.getParameter<double> ("IsoOverEtCutEB1");
00028   IsoloEt2_EB1 = iConfig.getParameter<double> ("IsoOverEt2CutEB1");
00029   isolcut_EE1  = iConfig.getParameter<double> ("isolcutEE1");
00030   FracCut_EE1 = iConfig.getParameter<double> ("IsoOverEtCutEE1");
00031   IsoloEt2_EE1 = iConfig.getParameter<double> ("IsoOverEt2CutEE1");
00032 
00033   isolcut_EB2  = iConfig.getParameter<double> ("isolcutEB2");
00034   FracCut_EB2 = iConfig.getParameter<double> ("IsoOverEtCutEB2");
00035   IsoloEt2_EB2 = iConfig.getParameter<double> ("IsoOverEt2CutEB2");
00036   isolcut_EE2  = iConfig.getParameter<double> ("isolcutEE2");
00037   FracCut_EE2 = iConfig.getParameter<double> ("IsoOverEtCutEE2");
00038   IsoloEt2_EE2 = iConfig.getParameter<double> ("IsoOverEt2CutEE2");
00039 
00040 
00041   AlsoNonIso_1 = iConfig.getParameter<bool> ("AlsoNonIso1");
00042   AlsoNonIso_2 = iConfig.getParameter<bool> ("AlsoNonIso2");
00043 
00044    //register your products
00045    produces<trigger::TriggerFilterObjectWithRefs>();
00046 
00047 }
00048 
00049 HLTEgammaCaloIsolFilterPairs::~HLTEgammaCaloIsolFilterPairs(){}
00050 
00051 
00052 // ------------ method called to produce the data  ------------
00053 bool
00054 HLTEgammaCaloIsolFilterPairs::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00055 {
00056 
00057   // The filter object
00058   using namespace trigger;
00059   std::auto_ptr<trigger::TriggerFilterObjectWithRefs> filterproduct (new trigger::TriggerFilterObjectWithRefs(path(),module()));
00060   
00061   edm::Handle<trigger::TriggerFilterObjectWithRefs> PrevFilterOutput;
00062   
00063   iEvent.getByLabel (candTag_,PrevFilterOutput);
00064 
00065   std::vector<edm::Ref<reco::RecoEcalCandidateCollection> > recoecalcands;
00066   PrevFilterOutput->getObjects(TriggerCluster, recoecalcands);
00067 
00068   //get hold of ecal isolation association map
00069   edm::Handle<reco::RecoEcalCandidateIsolationMap> depMap;
00070   iEvent.getByLabel (isoTag_,depMap);
00071   
00072   //get hold of ecal isolation association map
00073   edm::Handle<reco::RecoEcalCandidateIsolationMap> depNonIsoMap;
00074   if(AlsoNonIso_1 || AlsoNonIso_2) iEvent.getByLabel (nonIsoTag_,depNonIsoMap);
00075   
00076 
00077   int n = 0;
00078    // the list should be interpreted as pairs:
00079   // <recoecalcands[0],recoecalcands[1]>
00080   // <recoecalcands[2],recoecalcands[3]>
00081   // <recoecalcands[4],recoecalcands[5]>
00082   // .......
00083 
00084   // Should I check that the size of recoecalcands is even ?
00085   for (unsigned int i=0; i<recoecalcands.size(); i=i+2) {
00086     
00087     edm::Ref<reco::RecoEcalCandidateCollection> r1 = recoecalcands[i];
00088     edm::Ref<reco::RecoEcalCandidateCollection> r2 = recoecalcands[i+1];
00089     // std::cout<<"CaloIsol 1) Et Eta phi: "<<r1->et()<<" "<<r1->eta()<<" "<<r1->phi()<<" 2) Et eta phi: "<<r2->et()<<" "<<r2->eta()<<" "<<r2->phi()<<std::endl;
00090 
00091     if( PassCaloIsolation(r1,*depMap,*depNonIsoMap,1,AlsoNonIso_1) && PassCaloIsolation(r2,*depMap,*depNonIsoMap,2,AlsoNonIso_2)    )
00092       {
00093         n++;
00094         filterproduct->addObject(TriggerCluster, r1);
00095         filterproduct->addObject(TriggerCluster, r2);
00096       }
00097   }
00098   
00099   // filter decision
00100   bool accept(n>=1);
00101   
00102   // put filter object into the Event
00103   iEvent.put(filterproduct);
00104   
00105   return accept;
00106 }
00107 
00108 bool HLTEgammaCaloIsolFilterPairs::PassCaloIsolation(edm::Ref<reco::RecoEcalCandidateCollection> ref,reco::RecoEcalCandidateIsolationMap IsoMap,reco::RecoEcalCandidateIsolationMap NonIsoMap, int which, bool ChekAlsoNonIso){
00109 
00110   
00111   reco::RecoEcalCandidateIsolationMap::const_iterator mapi = IsoMap.find( ref );
00112 
00113   if(mapi==IsoMap.end()) {
00114     if(ChekAlsoNonIso) mapi = NonIsoMap.find( ref ); 
00115   }
00116 
00117   float vali = mapi->val;
00118   float IsoOE= vali/ref->et();
00119   float IsoOE2= IsoOE/ref->et();
00120   double isolcut=0,FracCut=0,IsoloEt2=0;
00121   if( fabs(ref->eta()) < 1.479){
00122     if(which==1){
00123       isolcut = isolcut_EB1;
00124       FracCut =  FracCut_EB1;
00125       IsoloEt2  =  IsoloEt2_EB1;
00126     }
00127     else if(which==2){
00128       isolcut = isolcut_EB2;
00129       FracCut =  FracCut_EB2;
00130       IsoloEt2  =  IsoloEt2_EB2;    
00131     }
00132     else {return false;}
00133   }
00134   else {
00135     if(which==1){
00136       isolcut = isolcut_EE1;
00137       FracCut =  FracCut_EE1;
00138        IsoloEt2 =  IsoloEt2_EE1;
00139     }
00140     else if(which==2){
00141       isolcut = isolcut_EE2;
00142       FracCut =  FracCut_EE2;
00143       IsoloEt2 = IsoloEt2_EE2;    
00144     }
00145     else {return false;}   
00146   }
00147   
00148   if ( vali < isolcut || IsoOE < FracCut || IsoOE2 < IsoloEt2 ) { return true;}
00149   return false;
00150 }