17DiTauSelectionCut::DiTauSelectionCut(
const std::string& sName, DiTauSelectionTool* tDTST)
23DiTauSelectionCut::~DiTauSelectionCut()
28void DiTauSelectionCut::writeControlHistograms()
30 m_hHistCutPre->Write();
35std::unique_ptr<TH1F> DiTauSelectionCut::CreateControlPlot(
const char* sName,
const char* sTitle,
int iBins,
double dXLow,
double dXUp)
37 if (m_tDTST->m_bCreateControlPlots)
39 auto hHist = std::make_unique<TH1F>(sName, sTitle, iBins, dXLow, dXUp);
40 hHist->SetDirectory(0);
48void DiTauSelectionCut::fillHistogramCutPre(
const xAOD::DiTauJet& xDiTau)
50 fillHistogram(xDiTau, *m_hHistCutPre);
54void DiTauSelectionCut::fillHistogramCut(
const xAOD::DiTauJet& xDiTau)
56 fillHistogram(xDiTau, *m_hHistCut);
61void DiTauSelectionCut::setProperty(
const std::string& name,
const std::string& value)
63 std::map<std::string, std::string&>::iterator
it = m_mProperties.find(name);
64 if(it == m_mProperties.end() )
65 throw std::runtime_error ((
"Undeclared property: " + name +
"\n").c_str());
70void DiTauSelectionCut::declareProperty(
const std::string& name, std::string& loc)
72 m_mProperties.try_emplace(name, loc);
76std::string DiTauSelectionCut::getProperty(
const std::string& name)
78 std::map<std::string, std::string&>::iterator
it = m_mProperties.find(name);
79 if(it == m_mProperties.end() )
80 throw std::runtime_error ((
"Undeclared property: " + name +
"\n").c_str());
88DiTauSelectionCutPt::DiTauSelectionCutPt(DiTauSelectionTool* tDTST)
89 : DiTauSelectionCut(
"CutPt", tDTST)
91 m_hHistCutPre = CreateControlPlot(
"hPt_pre",
"Pt_pre;di-#tau-p_{T} [GeV]; events",1000,0,1000);
92 m_hHistCut = CreateControlPlot(
"hPt_cut",
"Pt_cut;di-#tau-p_{T} [GeV]; events",1000,0,1000);
96void DiTauSelectionCutPt::fillHistogram(
const xAOD::DiTauJet& xDiTau, TH1F& hHist)
const
98 hHist.Fill(xDiTau.
pt()/1000.);
105 "Selection of ditaus according to their transverse momentum" );
112 double pt = xDiTau.
pt() / 1000.;
114 if (m_tDTST->m_vPtRegion.size() == 1)
116 if ( pt >= m_tDTST->m_vPtRegion.at(0) )
122 unsigned int iNumPtRegion = m_tDTST->m_vPtRegion.size()/2;
123 for(
unsigned int iPtRegion = 0; iPtRegion < iNumPtRegion; iPtRegion++ )
125 if ( pt >= m_tDTST->m_vPtRegion.at(iPtRegion*2) and pt <= m_tDTST->m_vPtRegion.at(iPtRegion*2+1))
131 m_tDTST->msg() << MSG::VERBOSE <<
"DiTau failed pt requirement, ditau pt [GeV]: " <<
pt <<
endmsg;
137DiTauSelectionCutAbsEta::DiTauSelectionCutAbsEta(DiTauSelectionTool* tDTST)
138 : DiTauSelectionCut(
"CutAbsEta", tDTST)
140 m_hHistCutPre = CreateControlPlot(
"hEta_pre",
"Eta_pre;di-#tau-#eta; events",100,-3,3);
141 m_hHistCut = CreateControlPlot(
"hEta_cut",
"Eta_cut;di-#tau-#eta; events",100,-3,3);
145void DiTauSelectionCutAbsEta::fillHistogram(
const xAOD::DiTauJet& xDiTau, TH1F& hHist)
const
147 hHist.Fill(xDiTau.
eta());
151void DiTauSelectionCutAbsEta::setAcceptInfo(
asg::AcceptInfo& info)
const
153 info.addCut(
"AbsEta",
154 "Selection of ditaus according to their absolute pseudorapidity" );
161 unsigned int iNumEtaRegion = m_tDTST->m_vAbsEtaRegion.size()/2;
162 for(
unsigned int iEtaRegion = 0; iEtaRegion < iNumEtaRegion; iEtaRegion++ )
164 if ( std::abs( xDiTau.
eta() ) >= m_tDTST->m_vAbsEtaRegion.at(iEtaRegion*2) and std::abs( xDiTau.
eta() ) <= m_tDTST->m_vAbsEtaRegion.at(iEtaRegion*2+1))
170 m_tDTST->msg() << MSG::VERBOSE <<
"DiTau failed eta requirement, ditau eta: " << xDiTau.
eta() <<
endmsg;
176DiTauSelectionCutNSubjets::DiTauSelectionCutNSubjets(DiTauSelectionTool* tDTST)
177 : DiTauSelectionCut(
"CutNSubjets", tDTST)
179 m_hHistCutPre = CreateControlPlot(
"hNSubjets_pre",
"NSubjets_pre;di-#tau NSubjets; events",30,0,30);
180 m_hHistCut = CreateControlPlot(
"hNSubjets_cut",
"NSubjets_cut;di-#tau NSubjets; events",30,0,30);
184void DiTauSelectionCutNSubjets::fillHistogram(
const xAOD::DiTauJet& xDiTau, TH1F& hHist)
const
190void DiTauSelectionCutNSubjets::setAcceptInfo(
asg::AcceptInfo& info)
const
192 info.addCut(
"NSubjets",
193 "Selection of ditaus according to their number of subjets" );
196bool DiTauSelectionCutNSubjets::accept(
const xAOD::DiTauJet& xDiTau,
201 if (m_tDTST->m_vNSubjetsRegion.size() == 1)
203 if ( nsubjets >= m_tDTST->m_vNSubjetsRegion.at(0) )
209 unsigned int iNumNSubjetsRegion = m_tDTST->m_vNSubjetsRegion.size()/2;
210 for(
unsigned int iNSubjetsRegion = 0; iNSubjetsRegion < iNumNSubjetsRegion; iNSubjetsRegion++ )
212 if ( nsubjets >= m_tDTST->m_vNSubjetsRegion.at(iNSubjetsRegion*2) and nsubjets <= m_tDTST->m_vNSubjetsRegion.at(iNSubjetsRegion*2+1))
218 m_tDTST->msg() << MSG::VERBOSE <<
"DiTau failed NSubjets requirement, ditau number of subjets: " << nsubjets <<
endmsg;
224DiTauSelectionCutAbsCharge::DiTauSelectionCutAbsCharge(DiTauSelectionTool* tDTST)
225 : DiTauSelectionCut(
"CutAbsCharge", tDTST),
226 m_bDiTauCharge(-1234)
228 m_hHistCutPre = CreateControlPlot(
"hCharge_pre",
"Charge_pre;charge; events",7,-3.5,3.5);
229 m_hHistCut = CreateControlPlot(
"hCharge_cut",
"Charge_cut;charge; events",7,-3.5,3.5);
233void DiTauSelectionCutAbsCharge::fillHistogram(
const xAOD::DiTauJet& , TH1F& hHist)
const
235 hHist.Fill(m_bDiTauCharge);
239void DiTauSelectionCutAbsCharge::setAcceptInfo(
asg::AcceptInfo& info)
const
241 info.addCut(
"AbsCharge",
242 "Selection of taus according to their absolute charge" );
245bool DiTauSelectionCutAbsCharge::accept(
const xAOD::DiTauJet& xTau,
250 if ( acc_charge.isAvailable(xTau) ) {
251 m_bDiTauCharge = acc_charge(xTau);
253 for (
const auto& xTrack : xTau.
trackLinks()) {
254 if (!xTrack.isValid())
258 for (
int i = 0;
i < 2; ++
i) {
259 TLorentzVector tlvSubjet = TLorentzVector();
262 double dR = tlvSubjet.DeltaR((*xTrack)->p4());
264 m_bDiTauCharge += (*xTrack)->charge();
273 for(
unsigned int iCharge = 0; iCharge < m_tDTST->m_vAbsCharges.size(); iCharge++ )
275 if ( std::abs( m_bDiTauCharge ) == m_tDTST->m_vAbsCharges.at(iCharge) )
281 m_tDTST->msg() << MSG::VERBOSE <<
"DiTau failed charge requirement, ditau charge: " << m_bDiTauCharge <<
endmsg;
288DiTauSelectionCutOmniScore::DiTauSelectionCutOmniScore(DiTauSelectionTool* tDTST)
289 : DiTauSelectionCut(
"CutOmniScore", tDTST)
291 m_hHistCutPre = CreateControlPlot(
"hOmniScore_pre",
"OmniScore_pre;OmniScore; events",100,0,1);
292 m_hHistCut = CreateControlPlot(
"hOmniScore_cut",
"OmniScore_cut;OmniScore; events",100,0,1);
295void DiTauSelectionCutOmniScore::fillHistogram(
const xAOD::DiTauJet& xTau, TH1F& hHist)
const
298 hHist.Fill(acc_OmniScore(xTau));
301void DiTauSelectionCutOmniScore::setAcceptInfo(
asg::AcceptInfo& info)
const
303 info.addCut(
"OmniScore",
304 "Selection of taus according to their OmniScore" );
307bool DiTauSelectionCutOmniScore::accept(
const xAOD::DiTauJet& xTau,
312 float dOmniScore =
acc(xTau);
313 unsigned int iNumOmniScoreRegion = m_tDTST->m_vOmniScoreRegion.size()/2;
314 for(
unsigned int iOmniScoreRegion = 0; iOmniScoreRegion < iNumOmniScoreRegion; iOmniScoreRegion++ )
316 if ( dOmniScore >= m_tDTST->m_vOmniScoreRegion.at(iOmniScoreRegion*2) and dOmniScore <= m_tDTST->m_vOmniScoreRegion.at(iOmniScoreRegion*2+1))
322 m_tDTST->msg() << MSG::VERBOSE <<
"Tau failed OmniScore requirement, tau OmniScore: " << dOmniScore <<
endmsg;
328DiTauSelectionCutOmniIDWP::DiTauSelectionCutOmniIDWP(DiTauSelectionTool* tDTST)
329 : DiTauSelectionCut(
"CutOmniIDWP", tDTST)
331 m_hHistCutPre = CreateControlPlot(
"hOmniIDWP_pre",
"OmniIDWP_pre;; events",8,-.5,7.5);
332 m_hHistCut = CreateControlPlot(
"hOmniIDWP_cut",
"OmniIDWP_cut;; events",8,-.5,7.5);
334 if (!m_hHistCutPre or !m_hHistCut)
337 m_hHistCutPre->GetXaxis()->SetBinLabel(1,
"!VeryLoose");
338 m_hHistCutPre->GetXaxis()->SetBinLabel(2,
"VeryLoose");
339 m_hHistCutPre->GetXaxis()->SetBinLabel(3,
"!Loose");
340 m_hHistCutPre->GetXaxis()->SetBinLabel(4,
"Loose");
341 m_hHistCutPre->GetXaxis()->SetBinLabel(5,
"!Medium");
342 m_hHistCutPre->GetXaxis()->SetBinLabel(6,
"Medium");
343 m_hHistCutPre->GetXaxis()->SetBinLabel(7,
"!Tight");
344 m_hHistCutPre->GetXaxis()->SetBinLabel(8,
"Tight");
345 m_hHistCut->GetXaxis()->SetBinLabel(1,
"!VeryLoose");
346 m_hHistCut->GetXaxis()->SetBinLabel(2,
"VeryLoose");
347 m_hHistCut->GetXaxis()->SetBinLabel(3,
"!Loose");
348 m_hHistCut->GetXaxis()->SetBinLabel(4,
"Loose");
349 m_hHistCut->GetXaxis()->SetBinLabel(5,
"!Medium");
350 m_hHistCut->GetXaxis()->SetBinLabel(6,
"Medium");
351 m_hHistCut->GetXaxis()->SetBinLabel(7,
"!Tight");
352 m_hHistCut->GetXaxis()->SetBinLabel(8,
"Tight");
356void DiTauSelectionCutOmniIDWP::fillHistogram(
const xAOD::DiTauJet& xTau, TH1F& hHist)
const
358 if(m_tDTST->m_useOmniScore){
363 hHist.Fill(acc_OmniVeryLoose(xTau));
364 hHist.Fill(acc_OmniLoose(xTau)+2);
365 hHist.Fill(acc_OmniMedium(xTau)+4);
366 hHist.Fill(acc_OmniTight(xTau)+6);
371void DiTauSelectionCutOmniIDWP::setAcceptInfo(
asg::AcceptInfo& info)
const
373 info.addCut(
"OmniIDWP",
374 "Selection of ditaus according to their OmniIDScore" );
382 switch (m_tDTST->m_iOmniIDWP)
389 if (!acc_OmniVeryLoose.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING <<
"Omni VeryLoose WP not available" <<
endmsg;
390 else bPass = acc_OmniVeryLoose(xTau);
394 if (!acc_OmniLoose.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING <<
"Omni Loose WP not available" <<
endmsg;
395 else bPass = acc_OmniLoose(xTau);
399 if (!acc_OmniMedium.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING <<
"Omni Medium WP not available" <<
endmsg;
400 else bPass = acc_OmniMedium(xTau);
404 if (!acc_OmniTight.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING <<
"Omni Tight WP not available" <<
endmsg;
405 else bPass = acc_OmniTight(xTau);
408 m_tDTST->msg() << MSG::WARNING <<
"The Omni ID working point with the enum " << m_tDTST->m_iOmniIDWP <<
" is not available" <<
endmsg;
416 m_tDTST->msg() << MSG::VERBOSE <<
"DiTau failed OmniIDWP requirement" <<
endmsg;
Helper class to provide constant type-safe access to aux data.
void setCutResult(const std::string &cutName, bool cutResult)
Set the result of a cut, based on the cut name (safer).
virtual double eta() const
The pseudorapidity ( ) of the particle.
float subjetEta(unsigned int numSubjet) const
virtual double pt() const
The transverse momentum ( ) of the particle.
float subjetE(unsigned int numSubjet) const
float subjetPt(unsigned int numSubjet) const
float subjetPhi(unsigned int numSubjet) const
const TrackParticleLinks_t & trackLinks() const
DiTauJet_v1 DiTauJet
Definition of the current version.