00001 #include "RecoTauTag/RecoTau/interface/PFRecoTauDiscriminationAgainstMuon.h"
00002
00003 void PFRecoTauDiscriminationAgainstMuon::produce(Event& iEvent,const EventSetup& iEventSetup){
00004 Handle<PFTauCollection> thePFTauCollection;
00005 iEvent.getByLabel(PFTauProducer_,thePFTauCollection);
00006
00007
00008 auto_ptr<PFTauDiscriminator> thePFTauDiscriminatorAgainstMuon(new PFTauDiscriminator(PFTauRefProd(thePFTauCollection)));
00009
00010 for(size_t iPFTau=0;iPFTau<thePFTauCollection->size();++iPFTau) {
00011 PFTauRef thePFTauRef(thePFTauCollection,iPFTau);
00012 bool decision = true;
00013
00014 if((*thePFTauRef).hasMuonReference() ){
00015
00016 MuonRef muonref = (*thePFTauRef).leadPFChargedHadrCand()->muonRef();
00017 if (discriminatorOption_ == "noSegMatch") {
00018 if ( muonref ->numberOfMatches() > 0 ) {
00019 decision = false;
00020 }
00021 }
00022 else if (discriminatorOption_ == "twoDCut") {
00023 double seg = muon::segmentCompatibility(*muonref);
00024 double calo= muonref->caloCompatibility();
00025 double border = calo * a + seg * b +c;
00026 if ( border > 0 ) {
00027 decision = false;
00028 }
00029 }
00030 else if (discriminatorOption_ == "merePresence") decision = false;
00031 else if (discriminatorOption_ == "combined") {
00032 unsigned int muType = 0;
00033 if(muonref->isGlobalMuon()) muType = 1;
00034 else if(muonref->isCaloMuon()) muType = 2;
00035 else if(muonref->isTrackerMuon()) muType = 3;
00036 double muonEnergyFraction = (*thePFTauRef).pfTauTagInfoRef()->pfjetRef()->chargedMuEnergyFraction();
00037 bool eta_veto = false;
00038 bool phi_veto = false;
00039 if(fabs(muonref->eta()) > 2.3 || (fabs(muonref->eta()) > 1.4 && fabs(muonref->eta()) < 1.6)) eta_veto = true;
00040 if(muonref->phi() < 0.1 && muonref->phi() > -0.1) phi_veto = true;
00041 if( muType != 1 || muonref ->numberOfMatches() > 0 || eta_veto || phi_veto || muonEnergyFraction > 0.9 ) decision = false;
00042 }
00043 else{
00044
00045 throw edm::Exception(edm::errors::UnimplementedFeature) << " Invalid Discriminator Option! Please check cfi file \n";
00046 }
00047 }
00048
00049 if (decision) {
00050 thePFTauDiscriminatorAgainstMuon->setValue(iPFTau,1);
00051 } else {
00052 thePFTauDiscriminatorAgainstMuon->setValue(iPFTau,0);
00053 }
00054
00055 }
00056 iEvent.put(thePFTauDiscriminatorAgainstMuon);
00057 }
00058