Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "RecoTauTag/RecoTau/interface/TauDiscriminationProducerBase.h"
00008 #include "FWCore/ParameterSet/interface/FileInPath.h"
00009 #include "FWCore/Utilities/interface/Exception.h"
00010 #include "RecoTauTag/RecoTau/interface/AntiElectronIDMVA3.h"
00011 #include "DataFormats/Math/interface/deltaR.h"
00012 #include "PhysicsTools/MVAComputer/interface/zstream.h"
00013 #include "DataFormats/TauReco/interface/PFTauDiscriminator.h"
00014
00015 #include <TMath.h>
00016
00017 #include <iostream>
00018 #include <sstream>
00019 #include <fstream>
00020
00021 using namespace reco;
00022
00023 class PFRecoTauDiscriminationAgainstElectronMVA3 : public PFTauDiscriminationProducerBase
00024 {
00025 public:
00026 explicit PFRecoTauDiscriminationAgainstElectronMVA3(const edm::ParameterSet& iConfig)
00027 : PFTauDiscriminationProducerBase(iConfig),
00028 moduleLabel_(iConfig.getParameter<std::string>("@module_label")),
00029 mva_(0),
00030 category_output_(0)
00031 {
00032
00033
00034
00035 method_ = iConfig.getParameter<std::string>("method");
00036 inputFileName1prongNoEleMatchWOgWOgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWOgWOgsfBL");
00037 inputFileName1prongNoEleMatchWOgWgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWOgWgsfBL");
00038 inputFileName1prongNoEleMatchWgWOgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWgWOgsfBL");
00039 inputFileName1prongNoEleMatchWgWgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWgWgsfBL");
00040 inputFileName1prongWOgWOgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWOgWOgsfBL");
00041 inputFileName1prongWOgWgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWOgWgsfBL");
00042 inputFileName1prongWgWOgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWgWOgsfBL");
00043 inputFileName1prongWgWgsfBL_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWgWgsfBL");
00044 inputFileName1prongNoEleMatchWOgWOgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWOgWOgsfEC");
00045 inputFileName1prongNoEleMatchWOgWgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWOgWgsfEC");
00046 inputFileName1prongNoEleMatchWgWOgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWgWOgsfEC");
00047 inputFileName1prongNoEleMatchWgWgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongNoEleMatchWgWgsfEC");
00048 inputFileName1prongWOgWOgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWOgWOgsfEC");
00049 inputFileName1prongWOgWgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWOgWgsfEC");
00050 inputFileName1prongWgWOgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWgWOgsfEC");
00051 inputFileName1prongWgWgsfEC_ = iConfig.getParameter<edm::FileInPath>("inputFileName1prongWgWgsfEC");
00052
00053 returnMVA_ = iConfig.getParameter<bool>("returnMVA");
00054 minMVA1prongNoEleMatchWOgWOgsfBL_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWOgWOgsfBL");
00055 minMVA1prongNoEleMatchWOgWgsfBL_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWOgWgsfBL");
00056 minMVA1prongNoEleMatchWgWOgsfBL_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWgWOgsfBL");
00057 minMVA1prongNoEleMatchWgWgsfBL_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWgWgsfBL");
00058 minMVA1prongWOgWOgsfBL_ = iConfig.getParameter<double>("minMVA1prongWOgWOgsfBL");
00059 minMVA1prongWOgWgsfBL_ = iConfig.getParameter<double>("minMVA1prongWOgWgsfBL");
00060 minMVA1prongWgWOgsfBL_ = iConfig.getParameter<double>("minMVA1prongWgWOgsfBL");
00061 minMVA1prongWgWgsfBL_ = iConfig.getParameter<double>("minMVA1prongWgWgsfBL");
00062 minMVA1prongNoEleMatchWOgWOgsfEC_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWOgWOgsfEC");
00063 minMVA1prongNoEleMatchWOgWgsfEC_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWOgWgsfEC");
00064 minMVA1prongNoEleMatchWgWOgsfEC_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWgWOgsfEC");
00065 minMVA1prongNoEleMatchWgWgsfEC_ = iConfig.getParameter<double>("minMVA1prongNoEleMatchWgWgsfEC");
00066 minMVA1prongWOgWOgsfEC_ = iConfig.getParameter<double>("minMVA1prongWOgWOgsfEC");
00067 minMVA1prongWOgWgsfEC_ = iConfig.getParameter<double>("minMVA1prongWOgWgsfEC");
00068 minMVA1prongWgWOgsfEC_ = iConfig.getParameter<double>("minMVA1prongWgWOgsfEC");
00069 minMVA1prongWgWgsfEC_ = iConfig.getParameter<double>("minMVA1prongWgWgsfEC");
00070 minMVA3prongMatch_ = iConfig.getParameter<double>("minMVA3prongMatch");
00071 minMVA3prongNoMatch_ = iConfig.getParameter<double>("minMVA3prongNoMatch");
00072
00073 srcGsfElectrons_ = iConfig.getParameter<edm::InputTag>("srcGsfElectrons");
00074
00075 mva_ = new AntiElectronIDMVA3();
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 mva_->Initialize_from_file(method_,
00095 inputFileName1prongNoEleMatchWOgWOgsfBL_.fullPath(),
00096 inputFileName1prongNoEleMatchWOgWgsfBL_.fullPath(),
00097 inputFileName1prongNoEleMatchWgWOgsfBL_.fullPath(),
00098 inputFileName1prongNoEleMatchWgWgsfBL_.fullPath(),
00099 inputFileName1prongWOgWOgsfBL_.fullPath(),
00100 inputFileName1prongWOgWgsfBL_.fullPath(),
00101 inputFileName1prongWgWOgsfBL_.fullPath(),
00102 inputFileName1prongWgWgsfBL_.fullPath(),
00103 inputFileName1prongNoEleMatchWOgWOgsfEC_.fullPath(),
00104 inputFileName1prongNoEleMatchWOgWgsfEC_.fullPath(),
00105 inputFileName1prongNoEleMatchWgWOgsfEC_.fullPath(),
00106 inputFileName1prongNoEleMatchWgWgsfEC_.fullPath(),
00107 inputFileName1prongWOgWOgsfEC_.fullPath(),
00108 inputFileName1prongWOgWgsfEC_.fullPath(),
00109 inputFileName1prongWgWOgsfEC_.fullPath(),
00110 inputFileName1prongWgWgsfEC_.fullPath());
00111
00112
00113 if ( returnMVA_ ) {
00114 produces<PFTauDiscriminator>("category");
00115 }
00116 }
00117
00118 void beginEvent(const edm::Event&, const edm::EventSetup&);
00119
00120 double discriminate(const PFTauRef&);
00121
00122 void endEvent(edm::Event&);
00123
00124 ~PFRecoTauDiscriminationAgainstElectronMVA3()
00125 {
00126 delete mva_;
00127 }
00128
00129 private:
00130 bool isInEcalCrack(double) const;
00131 std::string readZippedFile(const std::string& fileName)
00132 {
00133
00134
00135
00136 std::ifstream file;
00137 file.open(fileName.c_str());
00138 if ( !file.good() ) throw cms::Exception("InvalidFileState")
00139 << "Failed to open MVA file = " << fileName << " !!\n";
00140 std::ostringstream buffer_zipped;
00141 while ( file.good() ) {
00142 buffer_zipped << (char)file.get();
00143 }
00144 file.close();
00145
00146 ext::izstream gunzip(&file);
00147 std::ostringstream buffer_unzipped;
00148 buffer_unzipped << gunzip.rdbuf();
00149
00150 return buffer_unzipped.str();
00151 }
00152
00153 std::string moduleLabel_;
00154 std::string method_ ;
00155 edm::FileInPath inputFileName1prongNoEleMatchWOgWOgsfBL_;
00156 edm::FileInPath inputFileName1prongNoEleMatchWOgWgsfBL_;
00157 edm::FileInPath inputFileName1prongNoEleMatchWgWOgsfBL_;
00158 edm::FileInPath inputFileName1prongNoEleMatchWgWgsfBL_;
00159 edm::FileInPath inputFileName1prongWOgWOgsfBL_;
00160 edm::FileInPath inputFileName1prongWOgWgsfBL_;
00161 edm::FileInPath inputFileName1prongWgWOgsfBL_;
00162 edm::FileInPath inputFileName1prongWgWgsfBL_;
00163 edm::FileInPath inputFileName1prongNoEleMatchWOgWOgsfEC_;
00164 edm::FileInPath inputFileName1prongNoEleMatchWOgWgsfEC_;
00165 edm::FileInPath inputFileName1prongNoEleMatchWgWOgsfEC_;
00166 edm::FileInPath inputFileName1prongNoEleMatchWgWgsfEC_;
00167 edm::FileInPath inputFileName1prongWOgWOgsfEC_;
00168 edm::FileInPath inputFileName1prongWOgWgsfEC_;
00169 edm::FileInPath inputFileName1prongWgWOgsfEC_;
00170 edm::FileInPath inputFileName1prongWgWgsfEC_;
00171 AntiElectronIDMVA3* mva_;
00172 bool returnMVA_ ;
00173 double minMVA1prongNoEleMatchWOgWOgsfBL_ ;
00174 double minMVA1prongNoEleMatchWOgWgsfBL_ ;
00175 double minMVA1prongNoEleMatchWgWOgsfBL_ ;
00176 double minMVA1prongNoEleMatchWgWgsfBL_ ;
00177 double minMVA1prongWOgWOgsfBL_ ;
00178 double minMVA1prongWOgWgsfBL_ ;
00179 double minMVA1prongWgWOgsfBL_ ;
00180 double minMVA1prongWgWgsfBL_ ;
00181 double minMVA1prongNoEleMatchWOgWOgsfEC_ ;
00182 double minMVA1prongNoEleMatchWOgWgsfEC_ ;
00183 double minMVA1prongNoEleMatchWgWOgsfEC_ ;
00184 double minMVA1prongNoEleMatchWgWgsfEC_ ;
00185 double minMVA1prongWOgWOgsfEC_ ;
00186 double minMVA1prongWOgWgsfEC_ ;
00187 double minMVA1prongWgWOgsfEC_ ;
00188 double minMVA1prongWgWgsfEC_ ;
00189 double minMVA3prongMatch_ ;
00190 double minMVA3prongNoMatch_ ;
00191 edm::InputTag srcGsfElectrons_;
00192 edm::Handle<reco::GsfElectronCollection> gsfElectrons_;
00193 edm::Handle<TauCollection> taus_;
00194 std::auto_ptr<PFTauDiscriminator> category_output_;
00195 size_t tauIndex_;
00196 };
00197
00198 void PFRecoTauDiscriminationAgainstElectronMVA3::beginEvent(const edm::Event& evt, const edm::EventSetup& es)
00199 {
00200 if ( returnMVA_ ) {
00201 evt.getByLabel(TauProducer_, taus_);
00202 category_output_.reset(new PFTauDiscriminator(TauRefProd(taus_)));
00203 tauIndex_ = 0;
00204 }
00205 evt.getByLabel(srcGsfElectrons_, gsfElectrons_);
00206 }
00207
00208 double PFRecoTauDiscriminationAgainstElectronMVA3::discriminate(const PFTauRef& thePFTauRef)
00209 {
00210 double mva = 1.;
00211 double workingPoint = 1.;
00212 double category = -1.;
00213 bool isGsfElectronMatched = false;
00214
00215
00216
00217
00218 if( (*thePFTauRef).leadPFChargedHadrCand().isNonnull()) {
00219 for ( reco::GsfElectronCollection::const_iterator theGsfElectron = gsfElectrons_->begin();
00220 theGsfElectron != gsfElectrons_->end(); ++theGsfElectron ) {
00221 if ( theGsfElectron->pt() > 10. ) {
00222 double deltaREleTau = deltaR(theGsfElectron->p4(), thePFTauRef->p4());
00223
00224 if ( deltaREleTau < 0.3 ) {
00225 double mva_match = mva_->MVAValue(*thePFTauRef, *theGsfElectron);
00226 double workingPoint_match = 0.;
00227 size_t numSignalPFGammaCands = thePFTauRef->signalPFGammaCands().size();
00228 bool hasGsfTrack = thePFTauRef->leadPFChargedHadrCand()->gsfTrackRef().isNonnull();
00229
00230 if ( thePFTauRef->signalPFChargedHadrCands().size() == 1 ) {
00232 Float_t TauEtaAtEcalEntrance = -99.;
00233 float sumEtaTimesEnergy = 0;
00234 float sumEnergy = 0;
00235 for(unsigned int j = 0 ; j < ((*thePFTauRef).signalPFCands()).size() ; j++){
00236 reco::PFCandidateRef pfcandidate = ((*thePFTauRef).signalPFCands()).at(j);
00237 sumEtaTimesEnergy += pfcandidate->positionAtECALEntrance().eta()*pfcandidate->energy();
00238 sumEnergy += pfcandidate->energy();
00239 }
00240 if(sumEnergy>0)TauEtaAtEcalEntrance = sumEtaTimesEnergy/sumEnergy;
00241
00242 if (isInEcalCrack(TauEtaAtEcalEntrance)){
00243 if ( returnMVA_ ) {
00244
00245 category_output_->setValue(tauIndex_, category);
00246 ++tauIndex_;
00247
00248 return -99;
00249 } else {
00250
00251 return 0;
00252 }
00253 }
00255
00256 double mvaCut = 999.;
00257 if ( TMath::Abs(thePFTauRef->eta()) < 1.5 ) {
00258 if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
00259 category = 4.;
00260 mvaCut = minMVA1prongWOgWOgsfBL_;
00261 } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
00262 category = 5.;
00263 mvaCut = minMVA1prongWOgWgsfBL_;
00264 } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
00265 category = 6.;
00266 mvaCut = minMVA1prongWgWOgsfBL_;
00267 } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
00268 category = 7.;
00269 mvaCut = minMVA1prongWgWgsfBL_;
00270 }
00271 } else {
00272 if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
00273 category = 12.;
00274 mvaCut = minMVA1prongWOgWOgsfEC_;
00275 } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
00276 category = 13.;
00277 mvaCut = minMVA1prongWOgWgsfEC_;
00278 } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
00279 category = 14.;
00280 mvaCut = minMVA1prongWgWOgsfEC_;
00281 } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
00282 category = 15.;
00283 mvaCut = minMVA1prongWgWgsfEC_;
00284 }
00285 }
00286 workingPoint_match = (mva_match > mvaCut);
00287
00288 } else {
00289 category = 16.;
00290 workingPoint_match = (mva_match > minMVA3prongMatch_);
00291 }
00292 mva = TMath::Min(mva, mva_match);
00293 workingPoint = TMath::Min(workingPoint, workingPoint_match);
00294 isGsfElectronMatched = true;
00295 }
00296 }
00297 }
00298
00299 if ( !isGsfElectronMatched ) {
00300 mva = mva_->MVAValue(*thePFTauRef);
00301 size_t numSignalPFGammaCands = thePFTauRef->signalPFGammaCands().size();
00302 bool hasGsfTrack = thePFTauRef->leadPFChargedHadrCand()->gsfTrackRef().isNonnull();
00303 if ( thePFTauRef->signalPFChargedHadrCands().size() == 1 ) {
00305 Float_t TauEtaAtEcalEntrance = -99.;
00306 float sumEtaTimesEnergy = 0;
00307 float sumEnergy = 0;
00308 for(unsigned int j = 0 ; j < ((*thePFTauRef).signalPFCands()).size() ; j++){
00309 reco::PFCandidateRef pfcandidate = ((*thePFTauRef).signalPFCands()).at(j);
00310 sumEtaTimesEnergy += pfcandidate->positionAtECALEntrance().eta()*pfcandidate->energy();
00311 sumEnergy += pfcandidate->energy();
00312 }
00313 if(sumEnergy>0)TauEtaAtEcalEntrance = sumEtaTimesEnergy/sumEnergy;
00314
00315 if (isInEcalCrack(TauEtaAtEcalEntrance)){
00316 if ( returnMVA_ ) {
00317
00318 category_output_->setValue(tauIndex_, category);
00319 ++tauIndex_;
00320
00321 return -99;
00322 } else {
00323
00324 return 0;
00325 }
00326 }
00328
00329 double mvaCut = 999.;
00330 if ( TMath::Abs(thePFTauRef->eta()) < 1.5 ) {
00331 if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
00332 category = 0.;
00333 mvaCut = minMVA1prongNoEleMatchWOgWOgsfBL_;
00334 } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
00335 category = 1.;
00336 mvaCut = minMVA1prongNoEleMatchWOgWgsfBL_;
00337 } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
00338 category = 2.;
00339 mvaCut = minMVA1prongNoEleMatchWgWOgsfBL_;
00340 } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
00341 category = 3.;
00342 mvaCut = minMVA1prongNoEleMatchWgWgsfBL_;
00343 }
00344 } else {
00345 if ( numSignalPFGammaCands == 0 && !hasGsfTrack ) {
00346 category = 8.;
00347 mvaCut = minMVA1prongNoEleMatchWOgWOgsfEC_;
00348 } else if ( numSignalPFGammaCands == 0 && hasGsfTrack ) {
00349 category = 9.;
00350 mvaCut = minMVA1prongNoEleMatchWOgWgsfEC_;
00351 } else if ( numSignalPFGammaCands >= 1 && !hasGsfTrack ) {
00352 category = 10.;
00353 mvaCut = minMVA1prongNoEleMatchWgWOgsfEC_;
00354 } else if ( numSignalPFGammaCands >= 1 && hasGsfTrack ) {
00355 category = 11.;
00356 mvaCut = minMVA1prongNoEleMatchWgWgsfEC_;
00357 }
00358 }
00359 workingPoint = (mva > mvaCut);
00360
00361 } else {
00362 category = 17.;
00363 workingPoint = (mva > minMVA3prongNoMatch_);
00364 }
00365 }
00366 }
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377 if ( returnMVA_ ) {
00378
00379 category_output_->setValue(tauIndex_, category);
00380 ++tauIndex_;
00381
00382 return mva;
00383 } else {
00384 return workingPoint;
00385 }
00386 }
00387
00388 void PFRecoTauDiscriminationAgainstElectronMVA3::endEvent(edm::Event& evt)
00389 {
00390
00391 if ( returnMVA_ ) {
00392 evt.put(category_output_, "category");
00393 }
00394 }
00395
00396 bool
00397 PFRecoTauDiscriminationAgainstElectronMVA3::isInEcalCrack(double eta) const
00398 {
00399 eta = fabs(eta);
00400 return (eta>1.460 && eta<1.558);
00401 }
00402
00403 DEFINE_FWK_MODULE(PFRecoTauDiscriminationAgainstElectronMVA3);