CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/Validation/RecoParticleFlow/plugins/PFMETFilter.cc

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   //std::cout << "FL: beginJob" << std::endl;
00073 }
00074 
00075 bool PFMETFilter::filter(edm::Event& iEvent, 
00076                     const edm::EventSetup& iSetup)
00077 {
00078   //std::cout << "FL: filter" << std::endl;
00079   //std::cout << "FL: Mins = " << min_ << std::endl;
00080 
00081   if (!checkInput()) return true; // no filtering !
00082 
00083   bool skip=false;
00084 
00085   for (unsigned int varc=0;varc<collections_.size();++varc)
00086   {
00087     //std::cout << "FL: var[" << varc << "] = " << collections_[varc] << std::endl;
00088     //std::cout << "FL: var[0] = " << collections_[0] << std::endl;
00089 
00090     // if the collection is collection1-collection2:
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       //std::cout << "collection1 = " << collection1 << std::endl;
00097       std::string collection2;
00098       collection2.assign(collections_[varc],minuspos+1,collections_[varc].size());
00099       //std::cout << "collection2 = " << collection2 << std::endl;
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       //std::cout << "FL: var10.pt = " << var10->et() << std::endl;
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       //std::cout << "FL: coll_var1[" << variables_[varc] << "] = " << coll_var1 << std::endl;
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       //std::cout << "FL: var20.pt = " << var20->et() << std::endl;
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       //std::cout << "FL: coll_var2[" << variables_[varc] << "] = " << coll_var2 << std::endl;
00142       //std::cout << "FL: max_[varc] = " << max_[varc] << std::endl;
00143       //std::cout << "FL: min_[varc] = " << min_[varc] << std::endl;
00144 
00145       // Delta computation
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       // cuts
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       //std::cout << "skip = " << skip << std::endl;
00184     }
00185     else
00186     {
00187       // get the variable:
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       //std::cout << "FL: var00.pt = " << var00->et() << std::endl;
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         //std::cout << "FL: SETc = " << SETc << std::endl;
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       //std::cout << "FL: coll_var[" << variables_[varc] << "] = " << coll_var << std::endl;
00262       //std::cout << "FL: max_[varc] = " << max_[varc] << std::endl;
00263       //std::cout << "FL: min_[varc] = " << min_[varc] << std::endl;
00264 
00265       // cuts
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       //std::cout << "skip = " << skip << std::endl;
00276     }
00277   }
00278   //std::cout << "final skip = " << skip << std::endl;
00279   return !skip;
00280 }
00281 
00282 void PFMETFilter::endJob()
00283 {
00284   //std::cout << "FL: endJob" << std::endl;
00285 }