CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/HLTrigger/JetMET/src/HLTJetVBFFilter.cc

Go to the documentation of this file.
00001 
00009 #include "HLTrigger/JetMET/interface/HLTJetVBFFilter.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/JetReco/interface/CaloJetCollection.h"
00018 
00019 #include "FWCore/Framework/interface/ESHandle.h"
00020 #include "FWCore/Framework/interface/EventSetup.h"
00021 
00022 
00023 //
00024 // constructors and destructor
00025 //
00026 HLTJetVBFFilter::HLTJetVBFFilter(const edm::ParameterSet& iConfig)
00027 {
00028    inputTag_    = iConfig.getParameter< edm::InputTag > ("inputTag");
00029    saveTag_     = iConfig.getUntrackedParameter<bool>("saveTag",false);
00030    minEtLow_    = iConfig.getParameter<double> ("minEtLow");
00031    minEtHigh_   = iConfig.getParameter<double> ("minEtHigh");
00032    etaOpposite_ = iConfig.getParameter<bool>   ("etaOpposite"); 
00033    minDeltaEta_ = iConfig.getParameter<double> ("minDeltaEta"); 
00034    minInvMass_  = iConfig.getParameter<double> ("minInvMass"); 
00035 
00036    //register your products
00037    produces<trigger::TriggerFilterObjectWithRefs>();
00038 }
00039 
00040 HLTJetVBFFilter::~HLTJetVBFFilter(){}
00041 
00042 
00043 // ------------ method called to produce the data  ------------
00044 bool
00045 HLTJetVBFFilter::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00046 {
00047   using namespace trigger;
00048   // The filter object
00049   std::auto_ptr<trigger::TriggerFilterObjectWithRefs> 
00050     filterobject (new trigger::TriggerFilterObjectWithRefs(path(),module()));
00051   if (saveTag_) filterobject->addCollectionTag(inputTag_);
00052 
00053   edm::Handle<reco::CaloJetCollection> recocalojets;
00054   iEvent.getByLabel(inputTag_,recocalojets);
00055 
00056   // look at all candidates, check cuts and add to filter object
00057   int n(0);
00058   
00059   
00060   // events with two or more jets
00061   if(recocalojets->size() > 1){
00062     
00063     double ejet1 = 0.;
00064     double pxjet1 = 0.;
00065     double pyjet1 = 0.;
00066     double pzjet1 = 0.;
00067     double etjet1 = 0.;
00068     double etajet1 = 0.;
00069     
00070     double ejet2 = 0.;
00071     double pxjet2 = 0.;
00072     double pyjet2 = 0.;
00073     double pzjet2 = 0.;
00074     double etjet2 = 0.;
00075     double etajet2 = 0.;
00076     
00077     // loop on all jets
00078     for (reco::CaloJetCollection::const_iterator recocalojet1 = recocalojets->begin(); 
00079          recocalojet1 != recocalojets->end(); ++recocalojet1) {
00080       
00081       if( recocalojet1->et() < minEtHigh_ ) break;
00082       
00083       for (reco::CaloJetCollection::const_iterator recocalojet2 = recocalojet1+1; 
00084            recocalojet2 != recocalojets->end(); ++recocalojet2) {
00085         
00086         if( recocalojet2->et() < minEtLow_ ) break;
00087         
00088         ejet1 = recocalojet1->energy();
00089         pxjet1 = recocalojet1->px();
00090         pyjet1 = recocalojet1->py();
00091         pzjet1 = recocalojet1->pz();
00092         etjet1 = recocalojet1->et();
00093         etajet1 = recocalojet1->eta();
00094 
00095         ejet2 = recocalojet2->energy();
00096         pxjet2 = recocalojet2->px();
00097         pyjet2 = recocalojet2->py();
00098         pzjet2 = recocalojet2->pz();
00099         etjet2 = recocalojet2->et();
00100         etajet2 = recocalojet2->eta();
00101         
00102         float deltaetajet = etajet1 - etajet2;
00103         
00104         float invmassjet = sqrt( (ejet1  + ejet2)  * (ejet1  + ejet2) - 
00105                                  (pxjet1 + pxjet2) * (pxjet1 + pxjet2) - 
00106                                  (pyjet1 + pyjet2) * (pyjet1 + pyjet2) - 
00107                                  (pzjet1 + pzjet2) * (pzjet1 + pzjet2) );
00108         
00109         // VBF cuts
00110         if ( (etjet1 > minEtHigh_) &&
00111              (etjet2 > minEtLow_) &&
00112              ( (etaOpposite_ == true && etajet1*etajet2 < 0) || (etaOpposite_ == false) ) &&
00113              (fabs(deltaetajet) > minDeltaEta_) &&
00114              (fabs(invmassjet) > minInvMass_) ){
00115           
00116           ++n;
00117           reco::CaloJetRef ref1(reco::CaloJetRef(recocalojets,distance(recocalojets->begin(),recocalojet1)));
00118           filterobject->addObject(TriggerJet,ref1);
00119           reco::CaloJetRef ref2(reco::CaloJetRef(recocalojets,distance(recocalojets->begin(),recocalojet2)));
00120           filterobject->addObject(TriggerJet,ref2);
00121         
00122         } // VBF cuts
00123       
00124       }
00125     } // loop on all jets
00126     
00127   } // events with two or more jets
00128   
00129   
00130   
00131   // filter decision
00132   bool accept(n>=1);
00133   
00134   // put filter object into the Event
00135   iEvent.put(filterobject);
00136   
00137   return accept;
00138 }