Go to the documentation of this file.00001 #include "RecoTauTag/RecoTau/interface/TauDiscriminationProducerBase.h"
00002
00003 #include <string>
00004
00005 using namespace reco;
00006
00007
00008 template<class TauType, class TauDiscriminator>
00009 TauDiscriminationProducerBase<TauType, TauDiscriminator>::TauDiscriminationProducerBase()
00010 {
00011 throw cms::Exception("TauDiscriminationProducerBase") << " -- default ctor called; derived classes must call " <<
00012 "TauDiscriminationProducerBase(const ParameterSet&)";
00013 }
00014
00015
00016 template<class TauType, class TauDiscriminator>
00017 TauDiscriminationProducerBase<TauType, TauDiscriminator>::TauDiscriminationProducerBase(const edm::ParameterSet& iConfig)
00018 : moduleLabel_(iConfig.getParameter<std::string>("@module_label"))
00019 {
00020
00021 TauProducer_ = iConfig.getParameter<edm::InputTag>(getProducerString<TauType>());
00022
00023
00024
00025 const edm::ParameterSet& prediscriminantConfig = iConfig.getParameter<edm::ParameterSet>("Prediscriminants");
00026
00027
00028 std::string pdBoolOperator = prediscriminantConfig.getParameter<std::string>("BooleanOperator");
00029
00030 transform(pdBoolOperator.begin(), pdBoolOperator.end(), pdBoolOperator.begin(), ::tolower);
00031
00032 if( pdBoolOperator == "and" )
00033 {
00034 andPrediscriminants_ = 0x1;
00035 }
00036 else if ( pdBoolOperator == "or" )
00037 {
00038 andPrediscriminants_ = 0x0;
00039 }
00040 else
00041 {
00042 throw cms::Exception("TauDiscriminationProducerBase") << "PrediscriminantBooleanOperator defined incorrectly, options are: AND,OR";
00043 }
00044
00045
00046 std::vector<std::string> prediscriminantsNames = prediscriminantConfig.getParameterNamesForType<edm::ParameterSet>();
00047
00048 for( std::vector<std::string>::const_iterator iDisc = prediscriminantsNames.begin();
00049 iDisc != prediscriminantsNames.end(); ++iDisc )
00050 {
00051 const edm::ParameterSet& iPredisc = prediscriminantConfig.getParameter<edm::ParameterSet>(*iDisc);
00052 const edm::InputTag& label = iPredisc.getParameter<edm::InputTag>("Producer");
00053 double cut = iPredisc.getParameter<double>("cut");
00054
00055 TauDiscInfo thisDiscriminator;
00056 thisDiscriminator.label = label;
00057 thisDiscriminator.cut = cut;
00058 prediscriminants_.push_back(thisDiscriminator);
00059 }
00060
00061 prediscriminantFailValue_ = 0.;
00062
00063
00064 produces<TauDiscriminator>();
00065 }
00066
00067 template<class TauType, class TauDiscriminator>
00068 void TauDiscriminationProducerBase<TauType, TauDiscriminator>::produce(edm::Event& event, const edm::EventSetup& eventSetup)
00069 {
00070
00071 beginEvent(event, eventSetup);
00072
00073
00074 edm::Handle<TauCollection> taus;
00075 event.getByLabel(TauProducer_, taus);
00076
00077 edm::ProductID tauProductID = taus.id();
00078
00079
00080 std::auto_ptr<TauDiscriminator> output(new TauDiscriminator(TauRefProd(taus)));
00081
00082 size_t nTaus = taus->size();
00083
00084
00085 size_t nPrediscriminants = prediscriminants_.size();
00086 for( size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc )
00087 {
00088 prediscriminants_[iDisc].fill(event);
00089
00090
00091
00092 edm::ProductID discKeyId =
00093 prediscriminants_[iDisc].handle->keyProduct().id();
00094 if (tauProductID != discKeyId) {
00095 throw cms::Exception("MisconfiguredPrediscriminant")
00096 << "The tau collection with input tag " << TauProducer_
00097 << " has product ID: " << tauProductID
00098 << " but the pre-discriminator with input tag "
00099 << prediscriminants_[iDisc].label
00100 << " is keyed with product ID: " << discKeyId << std::endl;
00101 }
00102 }
00103
00104
00105 for( size_t iTau = 0; iTau < nTaus; ++iTau )
00106 {
00107
00108 TauRef tauRef(taus, iTau);
00109
00110 bool passesPrediscriminants = true;
00111
00112 for( size_t iDisc = 0; iDisc < nPrediscriminants; ++iDisc )
00113 {
00114
00115 double discResult = (*prediscriminants_[iDisc].handle)[tauRef];
00116 uint8_t thisPasses = ( discResult > prediscriminants_[iDisc].cut ) ? 1 : 0;
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 if( thisPasses ^ andPrediscriminants_ )
00134 {
00135 passesPrediscriminants = ( andPrediscriminants_ ? 0 : 1 );
00136 break;
00137 }
00138 }
00139
00140 double result = prediscriminantFailValue_;
00141 if( passesPrediscriminants )
00142 {
00143
00144 result = discriminate(tauRef);
00145 }
00146
00147
00148 output->setValue(iTau, result);
00149 }
00150 event.put(output);
00151
00152
00153 endEvent(event);
00154 }
00155
00156
00157 template<> std::string getProducerString<PFTau>() { return "PFTauProducer"; }
00158 template<> std::string getProducerString<CaloTau>() { return "CaloTauProducer"; }
00159
00160
00161 template class TauDiscriminationProducerBase<PFTau, PFTauDiscriminator>;
00162 template class TauDiscriminationProducerBase<CaloTau, CaloTauDiscriminator>;