ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Trigger
TrigHypothesis
TrigHLTJetHypo
src
PileupRemovalCondition.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3
*/
4
#
5
#include "
./PileupRemovalCondition.h
"
6
#include "
./ITrigJetHypoInfoCollector.h
"
7
#include "
TrigHLTJetHypo/TrigHLTJetHypoUtils/IJet.h
"
8
#include "
xAODCaloEvent/CaloCluster.h
"
9
#include "CaloEvent/CaloClusterContainer.h"
10
#include <sstream>
11
#include <cmath>
12
#include <TLorentzVector.h>
13
#include "
CxxUtils/fpcompare.h
"
14
#include "
CxxUtils/phihelper.h
"
15
#include "
FourMomUtils/xAODP4Helpers.h
"
16
17
PileupRemovalCondition::PileupRemovalCondition
(
double
mMin,
double
mMax) :
18
m_min
(mMin),
m_max
(mMax) {
19
}
20
21
bool
PileupRemovalCondition::isSatisfied
(
const
pHypoJet
& ip,
22
const
std::unique_ptr<ITrigJetHypoInfoCollector>& collector)
const
{
23
float
jetEMF = -999;
24
double
LR=-1;
25
ip->getAttribute(
"EMFrac"
,jetEMF);
26
if
(
CxxUtils::fpcompare::less_equal
(0,
double
(jetEMF))){
27
if
(
CxxUtils::fpcompare::greater_equal
(
double
(jetEMF),1.)) LR=-999;
28
else
LR= log10(
double
(1./jetEMF - 1.));
29
}
else
{
30
LR=-999;
31
}
32
bool
pass = LR >
m_max
;
33
// Recalculating the LR only if it's not satisfied the LR>m_max criteria
34
if
(!pass){
35
auto
jetPhi= ip->phi();
36
auto
jetEta= ip->eta();
37
// Recaulculate LR removing pileup clusters contribution if LR passes the m_min cut
38
if
( LR >
m_min
) {
39
size_t
nClusters = (*ip->xAODJet())->numConstituents();
40
double
clusterPU_sumEEM = 0;
double
clusterPU_sumE = 0;
41
for
(
size_t
clust = 0; clust < nClusters; clust++) {
42
const
xAOD::CaloCluster
* aCluster =
dynamic_cast<
const
xAOD::CaloCluster
*
>
((*ip->xAODJet())->rawConstituent(clust));
43
if
(not aCluster)
continue
;
44
double
clusEEM = 0;
45
clusEEM+=(aCluster)->eSample(CaloSampling::EMB1);
46
clusEEM+=(aCluster)->eSample(CaloSampling::EMB2);
47
clusEEM+=(aCluster)->eSample(CaloSampling::EMB3);
48
clusEEM+=(aCluster)->eSample(CaloSampling::EME1);
49
clusEEM+=(aCluster)->eSample(CaloSampling::EME2);
50
clusEEM+=(aCluster)->eSample(CaloSampling::EME3);
51
clusEEM+=(aCluster)->eSample(CaloSampling::FCAL1);
52
double
lambda = aCluster->
getMomentValue
(
xAOD::CaloCluster::CENTER_LAMBDA
);
53
54
if
(lambda > 500)
continue
;
55
double
d_eta = aCluster->
rawEta
() - jetEta;
56
double
d_phi =
xAOD::P4Helpers::deltaPhi
(aCluster->
rawPhi
(),jetPhi);
57
double
d_R2 = d_eta*d_eta + d_phi*d_phi;
58
59
if
(d_R2 < 0.15*0.15)
continue
;
60
clusterPU_sumEEM+=clusEEM/1000.;
61
clusterPU_sumE+=aCluster->
rawE
()/1000.;
62
}
63
double
jetEEM_EMscale = 0;
double
jetE_EMscale = 0;
//Working on EM scale because calE() doesn't always return correct EEM and cluster moment EMF not accessable during testing
64
std::vector<double> samplingEnergy = (*ip->xAODJet())->getAttribute<std::vector<double> >(
"EnergyPerSampling"
);
65
66
for
(
size_t
s=0; s<samplingEnergy.size(); s++) {
67
double
samplingE = 0.001*(samplingEnergy.at(s));
68
if
( s < 8 || (s > 20 && s < 28) ) jetEEM_EMscale+=samplingE;
// EM layers 0-7 and 21-27
69
jetE_EMscale+=samplingE;
70
}
71
if
(
CxxUtils::fpcompare::equal
(0.,
double
(jetE_EMscale - clusterPU_sumE))) jetEMF=999;
72
else
jetEMF = (jetEEM_EMscale - clusterPU_sumEEM)/(jetE_EMscale - clusterPU_sumE);
73
if
(
CxxUtils::fpcompare::less_equal
(0,
double
(jetEMF))) {
74
if
(
CxxUtils::fpcompare::greater_equal
(
double
(jetEMF),1.0)) LR = -999.;
75
else
{LR = log10(
double
(1./jetEMF - 1.));
76
}
77
}
else
{
78
LR = -999.;
79
}
80
pass=LR>
m_max
;
81
}
82
}
83
if
(collector){
84
const
void
* address =
static_cast<
const
void
*
>
(
this
);
85
86
std::stringstream ss0;
87
ss0 <<
"PileupRemovalCondition: ("
<< address <<
") "
88
<<
" LR desired cut, LR necessary cut to start pileup removal algo "
<<
m_max
<<
","
<<
m_min
89
<<
" pass: "
<< std::boolalpha << pass <<
'\n'
;
90
91
auto
j_addr =
static_cast<
const
void
*
>
(ip.get());
92
std::stringstream ss1;
93
ss1 <<
" jet : ("
<< j_addr <<
")"
94
" LR desired cut, LR necessary cut to start pileup removal algo "
<<
m_max
<<
","
<<
m_min
<<
'\n'
;
95
96
collector->collect(ss0.str(), ss1.str());
97
98
}
99
return
pass;
100
}
101
102
103
bool
104
PileupRemovalCondition::isSatisfied
(
const
HypoJetVector
& ips,
105
const
std::unique_ptr<ITrigJetHypoInfoCollector>& c)
const
{
106
auto
result =
isSatisfied
(ips[0], c);
107
return
result;
108
}
109
110
111
std::string
PileupRemovalCondition::toString
()
const
{
112
std::stringstream
ss
;
113
ss
<<
"PileupRemovalCondition ("
<<
this
<<
") "
114
<<
" LR thresh, LRcorr thresh "
115
<<
m_max
<<
","
<<
m_min
116
<<
'\n'
;
117
118
return
ss
.str();
119
}
CaloCluster.h
HypoJetVector
std::vector< pHypoJet > HypoJetVector
Definition
HypoJetDefs.h:27
pHypoJet
std::shared_ptr< const HypoJet::IJet > pHypoJet
Definition
HypoJetDefs.h:25
IJet.h
ITrigJetHypoInfoCollector.h
ss
static Double_t ss
Definition
LArPhysWaveHECTool.cxx:37
PileupRemovalCondition.h
PileupRemovalCondition::m_min
double m_min
Definition
PileupRemovalCondition.h:38
PileupRemovalCondition::isSatisfied
bool isSatisfied(const HypoJetVector &, const std::unique_ptr< ITrigJetHypoInfoCollector > &) const override
Definition
PileupRemovalCondition.cxx:104
PileupRemovalCondition::toString
std::string toString() const override
Definition
PileupRemovalCondition.cxx:111
PileupRemovalCondition::m_max
double m_max
Definition
PileupRemovalCondition.h:39
PileupRemovalCondition::PileupRemovalCondition
PileupRemovalCondition(double mMin, double mMax)
Definition
PileupRemovalCondition.cxx:17
xAOD::CaloCluster_v1::rawE
flt_t rawE() const
xAOD::CaloCluster_v1::getMomentValue
double getMomentValue(MomentType type) const
Retrieve individual moment - no check for existance! Returns -999 on error.
Definition
CaloCluster_v1.h:897
xAOD::CaloCluster_v1::rawPhi
flt_t rawPhi() const
Get in signal state UNCALIBRATED.
xAOD::CaloCluster_v1::rawEta
flt_t rawEta() const
Get in signal state UNCALIBRATED.
xAOD::CaloCluster_v1::CENTER_LAMBDA
@ CENTER_LAMBDA
Shower depth at Cluster Centroid.
Definition
CaloCluster_v1.h:139
fpcompare.h
Workaround x86 precision issues for FP inequality comparisons.
CxxUtils::fpcompare::equal
bool equal(double a, double b)
Compare two FP numbers, working around x87 precision issues.
Definition
fpcompare.h:114
CxxUtils::fpcompare::less_equal
bool less_equal(double a, double b)
Compare two FP numbers, working around x87 precision issues.
Definition
fpcompare.h:218
CxxUtils::fpcompare::greater_equal
bool greater_equal(double a, double b)
Compare two FP numbers, working around x87 precision issues.
Definition
fpcompare.h:192
xAOD::P4Helpers::deltaPhi
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition
xAODP4Helpers.h:69
xAOD::CaloCluster
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Definition
Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloCluster.h:19
phihelper.h
Helper for azimuthal angle calculations.
xAODP4Helpers.h
Generated on
for ATLAS Offline Software by
1.17.0