Go to the documentation of this file.00001 #include "Validation/RecoParticleFlow/plugins/PFMETFilter.h"
00002
00003 #include "FWCore/Framework/interface/Event.h"
00004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00005 #include "DataFormats/Common/interface/Handle.h"
00006 #include "FWCore/Framework/interface/ESHandle.h"
00007 #include "FWCore/Utilities/interface/InputTag.h"
00008 #include "DataFormats/Candidate/interface/Candidate.h"
00009 #include "DataFormats/Candidate/interface/CandidateFwd.h"
00010 #include "DataFormats/METReco/interface/MET.h"
00011
00012 PFMETFilter::PFMETFilter(const edm::ParameterSet& iConfig)
00013 {
00014 collections_= iConfig.getParameter< std::vector<std::string> >("Collections");
00015 variables_= iConfig.getParameter< std::vector<std::string> >("Variables");
00016 min_ = iConfig.getParameter< std::vector<double> >("Mins");
00017 max_ = iConfig.getParameter< std::vector<double> >("Maxs");
00018 doMin_ = iConfig.getParameter< std::vector<int> >("DoMin");
00019 doMax_ = iConfig.getParameter< std::vector<int> >("DoMax");
00020 TrueMET_ = iConfig.getParameter<std::string>("TrueMET");
00021 DeltaMEXsigma_ = iConfig.getParameter<double>("DeltaMEXsigma");
00022 sigma_a_ = iConfig.getParameter<double>("sigma_a");
00023 sigma_b_ = iConfig.getParameter<double>("sigma_b");
00024 sigma_c_ = iConfig.getParameter<double>("sigma_c");
00025 verbose_ = iConfig.getParameter<bool>("verbose");
00026 }
00027
00028 PFMETFilter::~PFMETFilter() {}
00029
00030 bool PFMETFilter::checkInput()
00031 {
00032 if (collections_.size()!=min_.size())
00033 {
00034 std::cout << "Error: in PFMETFilter: collections_.size()!=min_.size()" << std::endl;
00035 std::cout << "collections_.size() = " << collections_.size() << std::endl;
00036 std::cout << "min_.size() = " << min_.size() << std::endl;
00037 return false;
00038 }
00039 if (collections_.size()!=max_.size())
00040 {
00041 std::cout << "Error: in PFMETFilter: collections_.size()!=max_.size()" << std::endl;
00042 std::cout << "collections_.size() = " << collections_.size() << std::endl;
00043 std::cout << "max_.size() = " << max_.size() << std::endl;
00044 return false;
00045 }
00046 if (collections_.size()!=doMin_.size())
00047 {
00048 std::cout << "Error: in PFMETFilter: collections_.size()!=min_.size()" << std::endl;
00049 std::cout << "collections_.size() = " << collections_.size() << std::endl;
00050 std::cout << "doMin_.size() = " << doMin_.size() << std::endl;
00051 return false;
00052 }
00053 if (collections_.size()!=doMax_.size())
00054 {
00055 std::cout << "Error: in PFMETFilter: collections_.size()!=min_.size()" << std::endl;
00056 std::cout << "collections_.size() = " << collections_.size() << std::endl;
00057 std::cout << "doMax_.size() = " << doMax_.size() << std::endl;
00058 return false;
00059 }
00060 if (collections_.size()!=variables_.size())
00061 {
00062 std::cout << "Error: in PFMETFilter: collections_.size()!=variables_.size()" << std::endl;
00063 std::cout << "collections_.size() = " << collections_.size() << std::endl;
00064 std::cout << "variables_.size() = " << variables_.size() << std::endl;
00065 return false;
00066 }
00067 return true;
00068 }
00069
00070 void PFMETFilter::beginJob()
00071 {
00072
00073 }
00074
00075 bool PFMETFilter::filter(edm::Event& iEvent,
00076 const edm::EventSetup& iSetup)
00077 {
00078
00079
00080
00081 if (!checkInput()) return true;
00082
00083 bool skip=false;
00084
00085 for (unsigned int varc=0;varc<collections_.size();++varc)
00086 {
00087
00088
00089
00090
00091 const unsigned int minuspos=collections_[varc].find("-");
00092 if (minuspos<collections_[varc].size())
00093 {
00094 std::string collection1;
00095 collection1.assign(collections_[varc],0,minuspos);
00096
00097 std::string collection2;
00098 collection2.assign(collections_[varc],minuspos+1,collections_[varc].size());
00099
00100
00101 const edm::View<reco::Candidate> *var1;
00102 edm::Handle< edm::View<reco::Candidate> > var1_hnd;
00103 bool isVar1 = iEvent.getByLabel(collection1, var1_hnd);
00104 if ( !isVar1 ) {
00105 std::cout << "Warning : no " << collection1 << " in input !" << std::endl;
00106 return false;
00107 }
00108 var1 = var1_hnd.product();
00109 const reco::Candidate *var10 = &(*var1)[0];
00110
00111 double coll_var1;
00112 if (variables_[varc]=="et") coll_var1=var10->et();
00113 else if (variables_[varc]=="phi") coll_var1=var10->phi();
00114 else if (variables_[varc]=="eta") coll_var1=var10->eta();
00115 else
00116 {
00117 std::cout << "Error: PFMETFilter: variable unknown: " << variables_[varc] << std::endl;
00118 return true;
00119 }
00120
00121
00122 const edm::View<reco::Candidate> *var2;
00123 edm::Handle< edm::View<reco::Candidate> > var2_hnd;
00124 bool isVar2 = iEvent.getByLabel(collection2, var2_hnd);
00125 if ( !isVar2 ) {
00126 std::cout << "Warning : no " << collection2 << " in input !" << std::endl;
00127 return false;
00128 }
00129 var2 = var2_hnd.product();
00130 const reco::Candidate *var20 = &(*var2)[0];
00131
00132 double coll_var2;
00133 if (variables_[varc]=="et") coll_var2=var20->et();
00134 else if (variables_[varc]=="phi") coll_var2=var20->phi();
00135 else if (variables_[varc]=="eta") coll_var2=var20->eta();
00136 else
00137 {
00138 std::cout << "Error: PFMETFilter: variable unknown: " << variables_[varc] << std::endl;
00139 return true;
00140 }
00141
00142
00143
00144
00145
00146 double delta=coll_var1-coll_var2;
00147 if (variables_[varc]=="phi")
00148 {
00149 if (coll_var1 > M_PI) coll_var1 -= ceil((coll_var1 - M_PI) / (2 * M_PI)) * 2 * M_PI;
00150 if (coll_var1 <= - M_PI) coll_var1 += ceil((coll_var1 + M_PI) / (-2. * M_PI)) * 2. * M_PI;
00151 if (coll_var2 > M_PI) coll_var2 -= ceil((coll_var2 - M_PI) / (2 * M_PI)) * 2 * M_PI;
00152 if (coll_var2 <= - M_PI) coll_var2 += ceil((coll_var2 + M_PI) / (-2. * M_PI)) * 2 * M_PI;
00153
00154 double deltaphi=-999.0;
00155 if (fabs(coll_var1 - coll_var2)<M_PI)
00156 {
00157 deltaphi=(coll_var1-coll_var2);
00158 }
00159 else
00160 {
00161 if ((coll_var1-coll_var2)>0.0)
00162 {
00163 deltaphi=(2*M_PI - fabs(coll_var1 - coll_var2));
00164 }
00165 else
00166 {
00167 deltaphi=-(2*M_PI - fabs(coll_var1 - coll_var2));
00168 }
00169 }
00170 delta=deltaphi;
00171 }
00172
00173
00174 if (doMin_[varc] && doMax_[varc] && max_[varc]<min_[varc])
00175 {
00176 if (delta>max_[varc] && delta<min_[varc]) skip=true;
00177 }
00178 else
00179 {
00180 if (doMin_[varc] && delta<min_[varc]) skip=true;
00181 if (doMax_[varc] && delta>max_[varc]) skip=true;
00182 }
00183
00184 }
00185 else
00186 {
00187
00188 const edm::View<reco::Candidate> *var0;
00189 edm::Handle< edm::View<reco::Candidate> > var0_hnd;
00190 bool isVar0 = iEvent.getByLabel(collections_[varc], var0_hnd);
00191 if ( !isVar0 ) {
00192 std::cout << "Warning : no " << collections_[varc] << " in input !" << std::endl;
00193 return false;
00194 }
00195 var0 = var0_hnd.product();
00196 const reco::Candidate *var00 = &(*var0)[0];
00197
00198 double coll_var;
00199 if (variables_[varc]=="et") coll_var=var00->et();
00200 else if (variables_[varc]=="phi") coll_var=var00->phi();
00201 else if (variables_[varc]=="eta") coll_var=var00->eta();
00202 else if (variables_[varc]=="DeltaMEXcut")
00203 {
00204
00205 const edm::View<reco::Candidate> *truevar0;
00206 edm::Handle< edm::View<reco::Candidate> > truevar0_hnd;
00207 bool istrueVar0 = iEvent.getByLabel(TrueMET_, truevar0_hnd);
00208 if ( !istrueVar0 ) {
00209 std::cout << "Warning : no " << TrueMET_ << " in input !" << std::endl;
00210 return false;
00211 }
00212 truevar0 = truevar0_hnd.product();
00213 const reco::Candidate *truevar00 = &(*truevar0)[0];
00214
00215 const double DeltaMEX=var00->px()-truevar00->px();
00216 const double DeltaMEY=var00->py()-truevar00->py();
00217 const double cutvalc=sqrt(DeltaMEX*DeltaMEX+DeltaMEY*DeltaMEY);
00218 const reco::MET* met=static_cast<const reco::MET*>(truevar00);
00219 const double SETc=met->sumEt();
00220
00221 const double sigmac=sigma_a_+sigma_b_*sqrt(SETc)+sigma_c_*SETc;
00222 if (cutvalc>DeltaMEXsigma_*sigmac)
00223 {
00224 if (verbose_)
00225 {
00226 std::cout << "DeltaMET = " << var00->et()-truevar00->et() << std::endl;
00227 std::cout << "trueSET = " << SETc << std::endl;
00228 std::cout << "pfMET = " << var00->et() << std::endl;
00229 std::cout << "trueMET = " << truevar00->et() << std::endl;
00230 std::cout << "DeltaMEX = " << DeltaMEX << std::endl;
00231 std::cout << "DeltaMEY = " << DeltaMEY << std::endl;
00232 std::cout << "cutvalc = " << cutvalc << std::endl;
00233 std::cout << "sigmac = " << sigmac << std::endl;
00234 std::cout << "cutvalc/sigmac = " << cutvalc/sigmac << std::endl;
00235 }
00236 return true;
00237 }
00238 else
00239 {
00240 if (verbose_ && (var00->et()-truevar00->et())>300.0)
00241 {
00242 std::cout << "EVENT NOT KEPT:" << std::endl;
00243 std::cout << "DeltaMET = " << var00->et()-truevar00->et() << std::endl;
00244 std::cout << "SETc = " << SETc << std::endl;
00245 std::cout << "pfMET = " << var00->et() << std::endl;
00246 std::cout << "trueMET = " << truevar00->et() << std::endl;
00247 std::cout << "DeltaMEX = " << DeltaMEX << std::endl;
00248 std::cout << "DeltaMEY = " << DeltaMEY << std::endl;
00249 std::cout << "cutvalc = " << cutvalc << std::endl;
00250 std::cout << "sigmac = " << sigmac << std::endl;
00251 std::cout << "cutvalc/sigmac = " << cutvalc/sigmac << std::endl;
00252 }
00253 return false;
00254 }
00255 }
00256 else
00257 {
00258 std::cout << "Error: PFMETFilter: variable unknown: " << variables_[varc] << std::endl;
00259 return true;
00260 }
00261
00262
00263
00264
00265
00266 if (doMin_[varc] && doMax_[varc] && max_[varc]<min_[varc])
00267 {
00268 if (coll_var>max_[varc] && coll_var<min_[varc]) skip=true;
00269 }
00270 else
00271 {
00272 if (doMin_[varc] && coll_var<min_[varc]) skip=true;
00273 if (doMax_[varc] && coll_var>max_[varc]) skip=true;
00274 }
00275
00276 }
00277 }
00278
00279 return !skip;
00280 }
00281
00282 void PFMETFilter::endJob()
00283 {
00284
00285 }