00001
00014 #include <iostream>
00015 #include <string>
00016 #include <list>
00017 #include <cmath>
00018 #include <cstdio>
00019 #include <vector>
00020 #include <memory>
00021
00022 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00023 #include "DataFormats/Common/interface/Handle.h"
00024
00025
00026 #include "DataFormats/JetReco/interface/CaloJet.h"
00027 #include "DataFormats/METReco/interface/CaloMETCollection.h"
00028 #include "DataFormats/METReco/interface/CaloMET.h"
00029 #include "SUSYBSMAnalysis/CSA07Skims/interface/HadSUSYQCDSkim.h"
00030
00031 using namespace edm;
00032 using namespace std;
00033 using namespace reco;
00034
00035 class PtSorter {
00036 public:
00037 template <class T> bool operator() ( const T& a, const T& b ) {
00038 return ( a.pt() > b.pt() );
00039 }
00040 };
00041
00042 double DeltaPhi( double v1, double v2 )
00043 {
00044
00045 double diff = fabs( v2 - v1 );
00046 double corr = 2.*acos(-1.) - diff;
00047 if ( diff < acos(-1.) ) { return diff;} else { return corr;}
00048 }
00049
00050 HadSUSYQCDSkim::HadSUSYQCDSkim( const edm::ParameterSet& iConfig ) :
00051 nEvents_(0), nAccepted_(0)
00052 {
00053 CaloJetsrc_ = iConfig.getParameter<InputTag>( "CaloJetsrc" );
00054 CaloJetPtmin_ =
00055 iConfig.getParameter<double>( "CaloJetPtmin");
00056 NminCaloJet_ = iConfig.getParameter<int>( "NminCaloJet");
00057 if ( NminCaloJet_ < 2 ) {
00058 edm::LogError( "HadSUSYQCDSkim" )
00059 << "Setting NminCaloJet to 2 !!";
00060 NminCaloJet_ = 2;
00061 }
00062 CaloMETsrc_ = iConfig.getParameter<InputTag>( "CaloMETsrc" );
00063 }
00064
00065
00066
00067 HadSUSYQCDSkim::~HadSUSYQCDSkim()
00068 {}
00069
00070
00071
00072 bool HadSUSYQCDSkim::filter( edm::Event& iEvent,
00073 const edm::EventSetup& iSetup )
00074 {
00075 nEvents_++;
00076
00077 Handle<CaloJetCollection> CaloJetsHandle;
00078
00079 iEvent.getByLabel( CaloJetsrc_, CaloJetsHandle );
00080
00081
00082
00083
00084
00085
00086
00087 if ( CaloJetsHandle->empty() ) return false;
00088 CaloJetCollection TheCaloJets = *CaloJetsHandle;
00089 std::stable_sort( TheCaloJets.begin(), TheCaloJets.end(), PtSorter() );
00090
00091 Handle<CaloMETCollection> METHandle;
00092
00093 iEvent.getByLabel( CaloMETsrc_, METHandle );
00094
00095
00096
00097
00098
00099
00100
00101 if ( METHandle->empty() ) return false;
00102 double METphi = METHandle->begin()->phi();
00103
00104
00105 int nJet = 0;
00106 double phiJet[2];
00107 for ( CaloJetCollection::const_iterator it = TheCaloJets.begin();
00108 it != TheCaloJets.end() ; it++ ) {
00109 if ( (fabs(it->eta()) < 3.0) &&
00110 (it->pt() > CaloJetPtmin_) ) {
00111 if(nJet<2) phiJet[nJet] = it->phi();
00112 nJet++;
00113 if ( DeltaPhi( it->phi(), METphi ) < 0.3 ) return false;
00114 }
00115 }
00116 if ( nJet < NminCaloJet_ ) return false;
00117
00118 double dphi1 = DeltaPhi( phiJet[0], METphi );
00119 double dphi2 = DeltaPhi( phiJet[1], METphi );
00120 double R1 = sqrt( dphi2*dphi2
00121 + (2.*acos(-1.)-dphi1)*(2.*acos(-1.)-dphi1) );
00122 if ( R1 < 0.5 ) return false;
00123 double R2 = sqrt( dphi1*dphi1
00124 + (2.*acos(-1.)-dphi2)*(2.*acos(-1.)-dphi2) );
00125 if ( R2 < 0.5 ) return false;
00126 if ( DeltaPhi( METphi, phiJet[1] ) < (20./180.*acos(-1.)) )
00127 return false;
00128
00129 nAccepted_++;
00130
00131 return true;
00132 }
00133
00134
00135
00136 void HadSUSYQCDSkim::endJob()
00137 {
00138 edm::LogVerbatim( "HadSUSYQCDSkim" )
00139 << "Events read " << nEvents_
00140 << " Events accepted " << nAccepted_
00141 << "\nEfficiency " << (double)(nAccepted_)/(double)(nEvents_)
00142 << endl;
00143 }