50 <<
" Failed to find File = " << inputFileName <<
" !!\n";
56 throw cms::Exception(
"PATTauDiscriminationByIsolationMVARun2::loadMVA")
57 <<
" Failed to load MVA = " << mvaName.data() <<
" from file = " << inputFileName.
fullPath().data() <<
" !!\n";
59 inputFilesToDelete.push_back(inputFile);
77 moduleLabel_(cfg.getParameter<
std::
string>(
"@module_label")),
83 loadMVAfromDB_ = cfg.
exists(
"loadMVAfromDB") ? cfg.
getParameter<
bool>(
"loadMVAfromDB") :
false;
84 if ( !loadMVAfromDB_ ) {
85 if(cfg.
exists(
"inputFileName")){
87 }
else throw cms::Exception(
"MVA input not defined") <<
"Requested to load tau MVA input from ROOT file but no file provided in cfg file";
90 if ( mvaOpt_string ==
"oldDMwoLT" ) mvaOpt_ = kOldDMwoLT;
91 else if ( mvaOpt_string ==
"oldDMwLT" ) mvaOpt_ = kOldDMwLT;
92 else if ( mvaOpt_string ==
"newDMwoLT" ) mvaOpt_ = kNewDMwoLT;
93 else if ( mvaOpt_string ==
"newDMwLT" ) mvaOpt_ = kNewDMwLT;
94 else if ( mvaOpt_string ==
"DBoldDMwLT" ) mvaOpt_ = kDBoldDMwLT;
95 else if ( mvaOpt_string ==
"DBnewDMwLT" ) mvaOpt_ = kDBnewDMwLT;
96 else if ( mvaOpt_string ==
"PWoldDMwLT" ) mvaOpt_ = kPWoldDMwLT;
97 else if ( mvaOpt_string ==
"PWnewDMwLT" ) mvaOpt_ = kPWnewDMwLT;
98 else if ( mvaOpt_string ==
"DBoldDMwLTwGJ" ) mvaOpt_ = kDBoldDMwLTwGJ;
99 else if ( mvaOpt_string ==
"DBnewDMwLTwGJ" ) mvaOpt_ = kDBnewDMwLTwGJ;
100 else throw cms::Exception(
"PATTauDiscriminationByMVAIsolationRun2")
101 <<
" Invalid Configuration Parameter 'mvaOpt' = " << mvaOpt_string <<
" !!\n";
103 if ( mvaOpt_ == kOldDMwoLT || mvaOpt_ == kNewDMwoLT ) mvaInput_ =
new float[6];
104 else if ( mvaOpt_ == kOldDMwLT || mvaOpt_ == kNewDMwLT ) mvaInput_ =
new float[12];
105 else if ( mvaOpt_ == kDBoldDMwLT || mvaOpt_ == kDBnewDMwLT ||
106 mvaOpt_ == kPWoldDMwLT || mvaOpt_ == kPWnewDMwLT ||
107 mvaOpt_ == kDBoldDMwLTwGJ || mvaOpt_ == kDBnewDMwLTwGJ) mvaInput_ =
new float[23];
116 verbosity_ = ( cfg.
exists(
"verbosity") ) ?
119 produces<pat::PATTauDiscriminator>(
"category");
124 double discriminate(
const TauRef&)
const;
130 if(!loadMVAfromDB_)
delete mvaReader_;
132 for ( std::vector<TFile*>::iterator it = inputFilesToDelete_.begin();
133 it != inputFilesToDelete_.end(); ++it ) {
146 enum { kOldDMwoLT, kOldDMwLT, kNewDMwoLT, kNewDMwLT, kDBoldDMwLT, kDBnewDMwLT,
kPWoldDMwLT, kPWnewDMwLT, kDBoldDMwLTwGJ, kDBnewDMwLTwGJ };
167 if ( loadMVAfromDB_ ) {
170 mvaReader_ = loadMVAfromFile(inputFileName_, mvaName_, inputFilesToDelete_);
182 category_output_->setValue(tauIndex_, category);
185 if ( tau->leadChargedHadrCand().
isNull() )
return 0.;
187 int tauDecayMode = tau->decayMode();
189 if ( ((mvaOpt_ == kOldDMwoLT || mvaOpt_ == kOldDMwLT || mvaOpt_ == kDBoldDMwLT || mvaOpt_ == kPWoldDMwLT || mvaOpt_ == kDBoldDMwLTwGJ)
190 && (tauDecayMode == 0 || tauDecayMode == 1 || tauDecayMode == 2 || tauDecayMode == 10))
192 ((mvaOpt_ == kNewDMwoLT || mvaOpt_ == kNewDMwLT || mvaOpt_ == kDBnewDMwLT || mvaOpt_ == kPWnewDMwLT || mvaOpt_ == kDBnewDMwLTwGJ)
193 && (tauDecayMode == 0 || tauDecayMode == 1 || tauDecayMode == 2 || tauDecayMode == 5 || tauDecayMode == 6 || tauDecayMode == 10 || tauDecayMode == 11))
202 float decayDistX = tau->flightLength().x();
203 float decayDistY = tau->flightLength().y();
204 float decayDistZ = tau->flightLength().z();
205 float decayDistMag =
std::sqrt(decayDistX*decayDistX + decayDistY*decayDistY + decayDistZ*decayDistZ);
209 float nPhoton = (
float)clusterVariables_.tau_n_photons_total(*tau);
210 float ptWeightedDetaStrip = clusterVariables_.tau_pt_weighted_deta_strip(*tau, tauDecayMode);
211 float ptWeightedDphiStrip = clusterVariables_.tau_pt_weighted_dphi_strip(*tau, tauDecayMode);
212 float ptWeightedDrSignal = clusterVariables_.tau_pt_weighted_dr_signal(*tau, tauDecayMode);
213 float ptWeightedDrIsolation = clusterVariables_.tau_pt_weighted_dr_iso(*tau, tauDecayMode);
215 float leadingTrackChi2 = tau->leadingTrackNormChi2();
216 float eRatio = clusterVariables_.tau_Eratio(*tau);
219 float gjAngleDiff = -999;
220 if ( tauDecayMode == 10 ) {
221 double mTau = 1.77682;
222 double mAOne = tau->p4().M();
223 double pAOneMag = tau->p();
224 double argumentThetaGJmax = (
std::pow(mTau,2) -
std::pow(mAOne,2) ) / ( 2 * mTau * pAOneMag );
225 double argumentThetaGJmeasured = ( tau->p4().px() * decayDistX + tau->p4().py() * decayDistY + tau->p4().pz() * decayDistZ ) / ( pAOneMag * decayDistMag );
226 if (
std::abs(argumentThetaGJmax) <= 1. &&
std::abs(argumentThetaGJmeasured) <= 1. ) {
227 double thetaGJmax = std::asin( argumentThetaGJmax );
228 double thetaGJmeasured = std::acos( argumentThetaGJmeasured );
229 gjAngleDiff = thetaGJmeasured - thetaGJmax;
233 if ( mvaOpt_ == kOldDMwoLT || mvaOpt_ == kNewDMwoLT ) {
235 mvaInput_[1] =
std::abs((
float)tau->eta());
239 mvaInput_[5] = tauDecayMode;
240 }
else if ( mvaOpt_ == kOldDMwLT || mvaOpt_ == kNewDMwLT ) {
242 mvaInput_[1] =
std::abs((
float)tau->eta());
246 mvaInput_[5] = tauDecayMode;
247 mvaInput_[6] = std::copysign(+1.
f, tau->dxy());
250 mvaInput_[9] = ( tau->hasSecondaryVertex() ) ? 1. : 0.;
252 mvaInput_[11] =
std::min(10.
f, tau->flightLengthSig());
253 }
else if ( mvaOpt_ == kDBoldDMwLT || mvaOpt_ == kDBnewDMwLT ) {
255 mvaInput_[1] =
std::abs((
float)tau->eta());
260 mvaInput_[6] = tauDecayMode;
262 mvaInput_[8] =
std::min(0.5
f, ptWeightedDetaStrip);
263 mvaInput_[9] =
std::min(0.5
f, ptWeightedDphiStrip);
264 mvaInput_[10] =
std::min(0.5
f, ptWeightedDrSignal);
265 mvaInput_[11] =
std::min(0.5
f, ptWeightedDrIsolation);
266 mvaInput_[12] =
std::min(100.
f, leadingTrackChi2);
268 mvaInput_[14] = std::copysign(+1.
f, tau->dxy());
271 mvaInput_[17] = std::copysign(+1.
f, tau->ip3d());
274 mvaInput_[20] = ( tau->hasSecondaryVertex() ) ? 1. : 0.;
276 mvaInput_[22] =
std::min(10.
f, tau->flightLengthSig());
277 }
else if ( mvaOpt_ == kPWoldDMwLT || mvaOpt_ == kPWnewDMwLT ) {
279 mvaInput_[1] =
std::abs((
float)tau->eta());
284 mvaInput_[6] = tauDecayMode;
286 mvaInput_[8] =
std::min(0.5
f, ptWeightedDetaStrip);
287 mvaInput_[9] =
std::min(0.5
f, ptWeightedDphiStrip);
288 mvaInput_[10] =
std::min(0.5
f, ptWeightedDrSignal);
289 mvaInput_[11] =
std::min(0.5
f, ptWeightedDrIsolation);
290 mvaInput_[12] =
std::min(100.
f, leadingTrackChi2);
292 mvaInput_[14] = std::copysign(+1.
f, tau->dxy());
295 mvaInput_[17] = std::copysign(+1.
f, tau->ip3d());
298 mvaInput_[20] = ( tau->hasSecondaryVertex() ) ? 1. : 0.;
300 mvaInput_[22] =
std::min(10.
f, tau->flightLengthSig());
301 }
else if ( mvaOpt_ == kDBoldDMwLTwGJ || mvaOpt_ == kDBnewDMwLTwGJ ) {
303 mvaInput_[1] =
std::abs((
float)tau->eta());
308 mvaInput_[6] = tauDecayMode;
310 mvaInput_[8] =
std::min(0.5
f, ptWeightedDetaStrip);
311 mvaInput_[9] =
std::min(0.5
f, ptWeightedDphiStrip);
312 mvaInput_[10] =
std::min(0.5
f, ptWeightedDrSignal);
313 mvaInput_[11] =
std::min(0.5
f, ptWeightedDrIsolation);
315 mvaInput_[13] = std::copysign(+1.
f, tau->dxy());
318 mvaInput_[16] = std::copysign(+1.
f, tau->ip3d());
321 mvaInput_[19] = ( tau->hasSecondaryVertex() ) ? 1. : 0.;
323 mvaInput_[21] =
std::min(10.
f, tau->flightLengthSig());
324 mvaInput_[22] =
std::max(-1.
f, gjAngleDiff);
327 double mvaValue = mvaReader_->GetClassifier(mvaInput_);
329 edm::LogPrint(
"PATTauDiscByMVAIsolRun2") <<
"<PATTauDiscriminationByMVAIsolationRun2::discriminate>:";
330 edm::LogPrint(
"PATTauDiscByMVAIsolRun2") <<
" tau: Pt = " << tau->pt() <<
", eta = " << tau->eta();
331 edm::LogPrint(
"PATTauDiscByMVAIsolRun2") <<
" isolation: charged = " << chargedIsoPtSum <<
", neutral = " << neutralIsoPtSum <<
", PUcorr = " <<
puCorrPtSum;
332 edm::LogPrint(
"PATTauDiscByMVAIsolRun2") <<
" decay mode = " << tauDecayMode;
333 edm::LogPrint(
"PATTauDiscByMVAIsolRun2") <<
" impact parameter: distance = " << tau->dxy() <<
", significance = " << tau->dxy_Sig();
334 edm::LogPrint(
"PATTauDiscByMVAIsolRun2") <<
" has decay vertex = " << tau->hasSecondaryVertex() <<
":" 335 <<
" distance = " << decayDistMag <<
", significance = " << tau->flightLengthSig();
336 edm::LogPrint(
"PATTauDiscByMVAIsolRun2") <<
"--> mvaValue = " << mvaValue;
T getParameter(std::string const &) const
std::string footprintCorrection_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
std::string photonPtSumOutsideSignalCone_
edm::RefProd< TauCollection > TauRefProd
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define DEFINE_FWK_MODULE(type)
edm::FileInPath inputFileName_
PATTauDiscriminationByMVAIsolationRun2(const edm::ParameterSet &cfg)
bool exists(std::string const ¶meterName) const
checks if a parameter exists
~PATTauDiscriminationByMVAIsolationRun2()
void endEvent(edm::Event &)
void beginEvent(const edm::Event &, const edm::EventSetup &)
TauIdMVAAuxiliaries clusterVariables_
Abs< T >::type abs(const T &t)
const GBRForest * mvaReader_
LocationCode location() const
Where was the file found?
bool isNull() const
Checks for null.
photonPtSumOutsideSignalCone
std::unique_ptr< pat::PATTauDiscriminator > category_output_
std::string neutralIsoPtSums_
double discriminate(const TauRef &) const
std::vector< TFile * > inputFilesToDelete_
std::string chargedIsoPtSums_
std::string fullPath() const
T const * product() const
Power< A, B >::type pow(const A &a, const B &b)
edm::Handle< TauCollection > taus_
std::string puCorrPtSums_