ATLAS Offline Software
Loading...
Searching...
No Matches
DiTauSelectionCuts.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6// local include(s)
9
10#include "PATCore/AcceptData.h"
11#include "PATCore/AcceptInfo.h"
12
13using namespace TauAnalysisTools;
14
15//______________________________________________________________________________
17 : m_sName(sName)
18 , m_tDTST(tDTST)
19{}
20
21//______________________________________________________________________________
25
26//______________________________________________________________________________
32
33//______________________________________________________________________________
34std::unique_ptr<TH1F> DiTauSelectionCut::CreateControlPlot(const char* sName, const char* sTitle, int iBins, double dXLow, double dXUp)
35{
36 if (m_tDTST->m_bCreateControlPlots)
37 {
38 auto hHist = std::make_unique<TH1F>(sName, sTitle, iBins, dXLow, dXUp);
39 hHist->SetDirectory(0);
40 return hHist;
41 }
42
43 return nullptr;
44}
45
46//______________________________________________________________________________
51
52//______________________________________________________________________________
57
58
59//______________________________________________________________________________
60void DiTauSelectionCut::setProperty(const std::string& name, const std::string& value)
61{
62 std::map<std::string, std::string&>::iterator it = m_mProperties.find(name);
63 if(it == m_mProperties.end() )
64 throw std::runtime_error (("Undeclared property: " + name + "\n").c_str());
65 it->second = value;
66}
67
68//______________________________________________________________________________
69void DiTauSelectionCut::declareProperty(const std::string& name, std::string& loc)
70{
71 m_mProperties.try_emplace(name, loc);
72}
73
74//______________________________________________________________________________
75std::string DiTauSelectionCut::getProperty(const std::string& name)
76{
77 std::map<std::string, std::string&>::iterator it = m_mProperties.find(name);
78 if(it == m_mProperties.end() )
79 throw std::runtime_error (("Undeclared property: " + name + "\n").c_str());
80
81 return it->second;
82}
83
84
85//_______________________________SelectionCutPt_________________________________
86//______________________________________________________________________________
88 : DiTauSelectionCut("CutPt", tDTST)
89{
90 m_hHistCutPre = CreateControlPlot("hPt_pre","Pt_pre;di-#tau-p_{T} [GeV]; events",1000,0,1000);
91 m_hHistCut = CreateControlPlot("hPt_cut","Pt_cut;di-#tau-p_{T} [GeV]; events",1000,0,1000);
92}
93
94//______________________________________________________________________________
95void DiTauSelectionCutPt::fillHistogram(const xAOD::DiTauJet& xDiTau, TH1F& hHist) const
96{
97 hHist.Fill(xDiTau.pt()/1000.);
98}
99
100//______________________________________________________________________________
102{
103 info.addCut( "Pt",
104 "Selection of ditaus according to their transverse momentum" );
105}
106//______________________________________________________________________________
108 asg::AcceptData& acceptData)
109{
110 // save ditau pt in GeV
111 double pt = xDiTau.pt() / 1000.;
112 // in case of only one entry in vector, run for lower limits
113 if (m_tDTST->m_vPtRegion.size() == 1)
114 {
115 if ( pt >= m_tDTST->m_vPtRegion.at(0) )
116 {
117 acceptData.setCutResult( "Pt", true );
118 return true;
119 }
120 }
121 unsigned int iNumPtRegion = m_tDTST->m_vPtRegion.size()/2;
122 for( unsigned int iPtRegion = 0; iPtRegion < iNumPtRegion; iPtRegion++ )
123 {
124 if ( pt >= m_tDTST->m_vPtRegion.at(iPtRegion*2) and pt <= m_tDTST->m_vPtRegion.at(iPtRegion*2+1))
125 {
126 acceptData.setCutResult( "Pt", true );
127 return true;
128 }
129 }
130 m_tDTST->msg() << MSG::VERBOSE << "DiTau failed pt requirement, ditau pt [GeV]: " << pt << endmsg;
131 return false;
132}
133
134//_____________________________SelectionCutAbsEta_______________________________
135//______________________________________________________________________________
137 : DiTauSelectionCut("CutAbsEta", tDTST)
138{
139 m_hHistCutPre = CreateControlPlot("hEta_pre","Eta_pre;di-#tau-#eta; events",100,-3,3);
140 m_hHistCut = CreateControlPlot("hEta_cut","Eta_cut;di-#tau-#eta; events",100,-3,3);
141}
142
143//______________________________________________________________________________
144void DiTauSelectionCutAbsEta::fillHistogram(const xAOD::DiTauJet& xDiTau, TH1F& hHist) const
145{
146 hHist.Fill(xDiTau.eta());
147}
148
149//______________________________________________________________________________
151{
152 info.addCut( "AbsEta",
153 "Selection of ditaus according to their absolute pseudorapidity" );
154}
155//______________________________________________________________________________
157 asg::AcceptData& acceptData)
158{
159 // check regions of eta, if ditau is in one region then return true; false otherwise
160 unsigned int iNumEtaRegion = m_tDTST->m_vAbsEtaRegion.size()/2;
161 for( unsigned int iEtaRegion = 0; iEtaRegion < iNumEtaRegion; iEtaRegion++ )
162 {
163 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))
164 {
165 acceptData.setCutResult( "AbsEta", true );
166 return true;
167 }
168 }
169 m_tDTST->msg() << MSG::VERBOSE << "DiTau failed eta requirement, ditau eta: " << xDiTau.eta() << endmsg;
170 return false;
171}
172
173//_______________________________SelectionCutNSubjets_________________________________
174//______________________________________________________________________________
176 : DiTauSelectionCut("CutNSubjets", tDTST)
177{
178 m_hHistCutPre = CreateControlPlot("hNSubjets_pre","NSubjets_pre;di-#tau NSubjets; events",30,0,30);
179 m_hHistCut = CreateControlPlot("hNSubjets_cut","NSubjets_cut;di-#tau NSubjets; events",30,0,30);
180}
181
182//______________________________________________________________________________
183void DiTauSelectionCutNSubjets::fillHistogram(const xAOD::DiTauJet& xDiTau, TH1F& hHist) const
184{
185 hHist.Fill(xDiTau.nSubjets());
186}
187
188//______________________________________________________________________________
190{
191 info.addCut( "NSubjets",
192 "Selection of ditaus according to their number of subjets" );
193}
194//______________________________________________________________________________
196 asg::AcceptData& acceptData)
197{
198 float nsubjets = xDiTau.nSubjets();
199 // in case of only one entry in vector, run for lower limits
200 if (m_tDTST->m_vNSubjetsRegion.size() == 1)
201 {
202 if ( nsubjets >= m_tDTST->m_vNSubjetsRegion.at(0) )
203 {
204 acceptData.setCutResult( "NSubjets", true );
205 return true;
206 }
207 }
208 unsigned int iNumNSubjetsRegion = m_tDTST->m_vNSubjetsRegion.size()/2;
209 for( unsigned int iNSubjetsRegion = 0; iNSubjetsRegion < iNumNSubjetsRegion; iNSubjetsRegion++ )
210 {
211 if ( nsubjets >= m_tDTST->m_vNSubjetsRegion.at(iNSubjetsRegion*2) and nsubjets <= m_tDTST->m_vNSubjetsRegion.at(iNSubjetsRegion*2+1))
212 {
213 acceptData.setCutResult( "NSubjets", true );
214 return true;
215 }
216 }
217 m_tDTST->msg() << MSG::VERBOSE << "DiTau failed NSubjets requirement, ditau number of subjets: " << nsubjets << endmsg;
218 return false;
219}
220
221//____________________________SelectionCutAbsCharge_____________________________
222//______________________________________________________________________________
224 : DiTauSelectionCut("CutAbsCharge", tDTST),
225 m_bDiTauCharge(-1234)
226{
227 m_hHistCutPre = CreateControlPlot("hCharge_pre","Charge_pre;charge; events",7,-3.5,3.5);
228 m_hHistCut = CreateControlPlot("hCharge_cut","Charge_cut;charge; events",7,-3.5,3.5);
229}
230
231//______________________________________________________________________________
232void DiTauSelectionCutAbsCharge::fillHistogram(const xAOD::DiTauJet& /*xTau*/, TH1F& hHist) const
233{
234 hHist.Fill(m_bDiTauCharge);
235}
236
237//______________________________________________________________________________
239{
240 info.addCut( "AbsCharge",
241 "Selection of taus according to their absolute charge" );
242}
243//______________________________________________________________________________
245 asg::AcceptData& acceptData)
246{
247 m_bDiTauCharge = 0;
248 static const SG::ConstAccessor<float> acc_charge ("charge");
249 if ( acc_charge.isAvailable(xTau) ) {
250 m_bDiTauCharge = acc_charge(xTau);
251 } else {
252 for (const auto& xTrack : xTau.trackLinks()) {
253 if (!xTrack.isValid())
254 continue;
255
256 if(xTau.nSubjets() >= 2){
257 for (int i = 0; i < 2; ++i) { // loop over two leading subjets
258 TLorentzVector tlvSubjet = TLorentzVector();
259 tlvSubjet.SetPtEtaPhiE(xTau.subjetPt(i), xTau.subjetEta(i),
260 xTau.subjetPhi(i), xTau.subjetE(i));
261 double dR = tlvSubjet.DeltaR((*xTrack)->p4());
262 if (dR < 0.1) {
263 m_bDiTauCharge += (*xTrack)->charge();
264 break; //prevents double counting of tracks
265 }
266 } // loop over subjets
267 }
268 } // loop over tracks
269 }
270
271 // check charge, if ditau has one of the charges requiered then return true; false otherwise
272 for( unsigned int iCharge = 0; iCharge < m_tDTST->m_vAbsCharges.size(); iCharge++ )
273 {
274 if ( std::abs( m_bDiTauCharge ) == m_tDTST->m_vAbsCharges.at(iCharge) )
275 {
276 acceptData.setCutResult( "AbsCharge", true );
277 return true;
278 }
279 }
280 m_tDTST->msg() << MSG::VERBOSE << "DiTau failed charge requirement, ditau charge: " << m_bDiTauCharge << endmsg;
281 return false;
282
283}
284
285//___________________________SelectionCutOmniScore_____________________________
286//______________________________________________________________________________
288 : DiTauSelectionCut("CutOmniScore", tDTST)
289{
290 m_hHistCutPre = CreateControlPlot("hOmniScore_pre","OmniScore_pre;OmniScore; events",100,0,1);
291 m_hHistCut = CreateControlPlot("hOmniScore_cut","OmniScore_cut;OmniScore; events",100,0,1);
292}
293//______________________________________________________________________________
295{
296 static const SG::ConstAccessor<float> acc_OmniScore("omni_score");
297 hHist.Fill(acc_OmniScore(xTau));
298}
299//______________________________________________________________________________
301{
302 info.addCut( "OmniScore",
303 "Selection of taus according to their OmniScore" );
304}
305//______________________________________________________________________________
307 asg::AcceptData& acceptData)
308{
309 // check OmniScore score, if tau has a OmniScore score in one of the regions requiered then return true; false otherwise
310 static const SG::ConstAccessor<float> acc ("omni_score");
311 float dOmniScore = acc(xTau);
312 unsigned int iNumOmniScoreRegion = m_tDTST->m_vOmniScoreRegion.size()/2;
313 for( unsigned int iOmniScoreRegion = 0; iOmniScoreRegion < iNumOmniScoreRegion; iOmniScoreRegion++ )
314 {
315 if ( dOmniScore >= m_tDTST->m_vOmniScoreRegion.at(iOmniScoreRegion*2) and dOmniScore <= m_tDTST->m_vOmniScoreRegion.at(iOmniScoreRegion*2+1))
316 {
317 acceptData.setCutResult( "OmniScore", true );
318 return true;
319 }
320 }
321 m_tDTST->msg() << MSG::VERBOSE << "Tau failed OmniScore requirement, tau OmniScore: " << dOmniScore << endmsg;
322 return false;
323}
324
325//_____________________________SelectionCutOmniIDWP______________________________
326//_______________________________________________________________________________
328 : DiTauSelectionCut("CutOmniIDWP", tDTST)
329{
330 m_hHistCutPre = CreateControlPlot("hOmniIDWP_pre","OmniIDWP_pre;; events",8,-.5,7.5);
331 m_hHistCut = CreateControlPlot("hOmniIDWP_cut","OmniIDWP_cut;; events",8,-.5,7.5);
332 // only proceed if histograms are defined
333 if (!m_hHistCutPre or !m_hHistCut)
334 return;
335
336 m_hHistCutPre->GetXaxis()->SetBinLabel(1,"!VeryLoose");
337 m_hHistCutPre->GetXaxis()->SetBinLabel(2,"VeryLoose");
338 m_hHistCutPre->GetXaxis()->SetBinLabel(3,"!Loose");
339 m_hHistCutPre->GetXaxis()->SetBinLabel(4,"Loose");
340 m_hHistCutPre->GetXaxis()->SetBinLabel(5,"!Medium");
341 m_hHistCutPre->GetXaxis()->SetBinLabel(6,"Medium");
342 m_hHistCutPre->GetXaxis()->SetBinLabel(7,"!Tight");
343 m_hHistCutPre->GetXaxis()->SetBinLabel(8,"Tight");
344 m_hHistCut->GetXaxis()->SetBinLabel(1,"!VeryLoose");
345 m_hHistCut->GetXaxis()->SetBinLabel(2,"VeryLoose");
346 m_hHistCut->GetXaxis()->SetBinLabel(3,"!Loose");
347 m_hHistCut->GetXaxis()->SetBinLabel(4,"Loose");
348 m_hHistCut->GetXaxis()->SetBinLabel(5,"!Medium");
349 m_hHistCut->GetXaxis()->SetBinLabel(6,"Medium");
350 m_hHistCut->GetXaxis()->SetBinLabel(7,"!Tight");
351 m_hHistCut->GetXaxis()->SetBinLabel(8,"Tight");
352}
353
354//______________________________________________________________________________
356{
357 if(m_tDTST->m_useOmniScore){
358 static const SG::ConstAccessor<char> acc_OmniVeryLoose("omni_score_VL");
359 static const SG::ConstAccessor<char> acc_OmniLoose("omni_score_L");
360 static const SG::ConstAccessor<char> acc_OmniMedium("omni_score_M");
361 static const SG::ConstAccessor<char> acc_OmniTight("omni_score_T");
362 hHist.Fill(acc_OmniVeryLoose(xTau));
363 hHist.Fill(acc_OmniLoose(xTau)+2);
364 hHist.Fill(acc_OmniMedium(xTau)+4);
365 hHist.Fill(acc_OmniTight(xTau)+6);
366 }
367}
368
369//______________________________________________________________________________
371{
372 info.addCut( "OmniIDWP",
373 "Selection of ditaus according to their OmniIDScore" );
374}
375//______________________________________________________________________________
377 asg::AcceptData& acceptData)
378{
379 // check Omni ID working point, if ditau passes OmniID working point then return true; false otherwise
380 bool bPass = false;
381 switch (m_tDTST->m_iOmniIDWP)
382 {
383 case OMNIIDNONE:
384 bPass = true;
385 break;
386 case OMNIIDVERYLOOSE:
387 static const SG::ConstAccessor<char> acc_OmniVeryLoose("omni_score_VL");
388 if (!acc_OmniVeryLoose.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING << "Omni VeryLoose WP not available" << endmsg;
389 else bPass = acc_OmniVeryLoose(xTau);
390 break;
391 case OMNIIDLOOSE:
392 static const SG::ConstAccessor<char> acc_OmniLoose("omni_score_L");
393 if (!acc_OmniLoose.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING << "Omni Loose WP not available" << endmsg;
394 else bPass = acc_OmniLoose(xTau);
395 break;
396 case OMNIIDMEDIUM:
397 static const SG::ConstAccessor<char> acc_OmniMedium("omni_score_M");
398 if (!acc_OmniMedium.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING << "Omni Medium WP not available" << endmsg;
399 else bPass = acc_OmniMedium(xTau);
400 break;
401 case OMNIIDTIGHT:
402 static const SG::ConstAccessor<char> acc_OmniTight("omni_score_T");
403 if (!acc_OmniTight.isAvailable(xTau)) m_tDTST->msg() << MSG::WARNING << "Omni Tight WP not available" << endmsg;
404 else bPass = acc_OmniTight(xTau);
405 break;
406 default:
407 m_tDTST->msg() << MSG::WARNING << "The Omni ID working point with the enum " << m_tDTST->m_iOmniIDWP << " is not available" << endmsg;
408 break;
409 }
410 if (bPass)
411 {
412 acceptData.setCutResult( "OmniIDWP", true );
413 return true;
414 }
415 m_tDTST->msg() << MSG::VERBOSE << "DiTau failed OmniIDWP requirement" << endmsg;
416 return false;
417}
418
419
#define endmsg
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
virtual void setAcceptInfo(asg::AcceptInfo &info) const override
virtual void fillHistogram(const xAOD::DiTauJet &xTau, TH1F &hHist) const override
virtual bool accept(const xAOD::DiTauJet &xTau, asg::AcceptData &accept) override
virtual void fillHistogram(const xAOD::DiTauJet &xTau, TH1F &hHist) const override
virtual void setAcceptInfo(asg::AcceptInfo &info) const override
virtual bool accept(const xAOD::DiTauJet &xTau, asg::AcceptData &accept) override
virtual void setAcceptInfo(asg::AcceptInfo &info) const override
virtual void fillHistogram(const xAOD::DiTauJet &xTau, TH1F &hHist) const override
virtual bool accept(const xAOD::DiTauJet &xTau, asg::AcceptData &accept) override
virtual bool accept(const xAOD::DiTauJet &xTau, asg::AcceptData &accept) override
virtual void setAcceptInfo(asg::AcceptInfo &info) const override
virtual void fillHistogram(const xAOD::DiTauJet &xTau, TH1F &hHist) const override
virtual bool accept(const xAOD::DiTauJet &xTau, asg::AcceptData &accept) override
virtual void fillHistogram(const xAOD::DiTauJet &xTau, TH1F &hHist) const override
virtual void setAcceptInfo(asg::AcceptInfo &info) const override
virtual void fillHistogram(const xAOD::DiTauJet &xTau, TH1F &hHist) const override
virtual void setAcceptInfo(asg::AcceptInfo &info) const override
DiTauSelectionCutPt(DiTauSelectionTool *tDTST)
virtual bool accept(const xAOD::DiTauJet &xTau, asg::AcceptData &accept) override
std::unique_ptr< TH1F > CreateControlPlot(const char *sName, const char *sTitle, int iBins, double dXLow, double dXUp)
std::map< std::string, std::string & > m_mProperties
void fillHistogramCut(const xAOD::DiTauJet &xTau)
void fillHistogramCutPre(const xAOD::DiTauJet &xTau)
void setProperty(const std::string &name, const std::string &value)
void declareProperty(const std::string &name, std::string &loc)
DiTauSelectionCut(const std::string &sName, TauAnalysisTools::DiTauSelectionTool *tDTST)
virtual void fillHistogram(const xAOD::DiTauJet &xTau, TH1F &hHist) const =0
std::string getProperty(const std::string &name)
void setCutResult(const std::string &cutName, bool cutResult)
Set the result of a cut, based on the cut name (safer).
Definition AcceptData.h:135
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
float nSubjets() const
DiTauJet_v1 DiTauJet
Definition of the current version.
Definition DiTauJet.h:17