ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
LArCalorimeter
LArClusterRec
src
LArClusterCollisionTimeAlg.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
LArClusterRec/LArClusterCollisionTimeAlg.h
"
6
#include "
CxxUtils/trapping_fp.h
"
7
8
#include <algorithm>
9
10
//__________________________________________________________________________
11
StatusCode
LArClusterCollisionTimeAlg::initialize
()
12
{
13
ATH_MSG_DEBUG
(
"LArClusterCollisionTimeAlg initialize()"
);
14
ATH_CHECK
(
m_clusterContainerName
.initialize() );
15
ATH_CHECK
(
m_outputName
.initialize() );
16
return
StatusCode::SUCCESS;
17
18
}
19
20
//__________________________________________________________________________
21
StatusCode
LArClusterCollisionTimeAlg::finalize
()
22
{
23
24
ATH_MSG_INFO
(
m_nCollEvt
<<
"/"
<<
m_nEvt
<<
" Events found to be collision events with at least one cluster in each EM endcap."
);
25
ATH_MSG_DEBUG
(
"LArClusterCollisionTimeAlg finalize()"
);
26
return
StatusCode::SUCCESS;
27
}
28
29
LArClusterCollisionTimeAlg::perSide_t
LArClusterCollisionTimeAlg::analyseClustersPerSide
(std::vector<const xAOD::CaloCluster*>& clusters)
const
{
30
31
perSide_t
result;
32
33
//Sort clusters by Energy
34
std::sort
(clusters.begin(),clusters.end(),[](
const
xAOD::CaloCluster
* o1,
const
xAOD::CaloCluster
* o2) {return o1->e() > o2->e();});
35
36
result.nClusters=std::min(
m_maxClusters
.value(),clusters.size());
37
38
if
(result.nClusters>0) {
39
// Tell clang to optimize assuming that FP operations may trap.
40
CXXUTILS_TRAPPING_FP
;
41
42
for
(
size_t
i=0;i<result.nClusters;++i) {
43
const
xAOD::CaloCluster
* clu=clusters[i];
44
result.time+=clu->
time
();
45
result.energy+=clu->
e
();
46
}
47
48
result.time/=(float)(result.nClusters);
49
result.energy/=(float)(result.nClusters);
50
}
51
52
return
result;
53
}
54
55
//__________________________________________________________________________
56
StatusCode
LArClusterCollisionTimeAlg::execute
(
const
EventContext& ctx)
const
{
57
ATH_MSG_DEBUG
(
"LArClusterCollisionTimeAlg execute()"
);
58
59
m_nEvt
++;
60
61
// Get the cluster container
62
SG::ReadHandle<xAOD::CaloClusterContainer>
cluster_container (
m_clusterContainerName
,ctx);
63
if
( !cluster_container.
isValid
()) {
// record empty object
64
ATH_MSG_WARNING
(
"Could not get ClusterContainer with key "
<<
m_clusterContainerName
);
65
// Construct the output object
66
SG::WriteHandle<LArCollisionTime>
larTime (
m_outputName
,ctx);
67
ATH_CHECK
( larTime.
record
(std::make_unique<LArCollisionTime>()) );
68
return
StatusCode::SUCCESS;
69
}
70
71
std::vector<const xAOD::CaloCluster*> clustersEMECA,clustersEMECC;
72
73
const
unsigned
barrelPattern=
CaloSampling::barrelPattern
();
74
75
for
(
const
xAOD::CaloCluster
* pCluster : *cluster_container) {
76
if
((pCluster->samplingPattern() & barrelPattern) == 0 ) {
//Take only clusters that have only endcap samplings, ignore barrel
77
if
(pCluster->eta()>0.)
78
clustersEMECA.push_back(pCluster);
79
else
80
clustersEMECC.push_back(pCluster);
81
}
82
}
//End loop over clusters
83
84
const
perSide_t
sideA=
analyseClustersPerSide
(clustersEMECA);
85
const
perSide_t
sideC=
analyseClustersPerSide
(clustersEMECC);
86
87
auto
tmplarTime = std::make_unique<LArCollisionTime>(sideA.nClusters,sideC.nClusters,sideA.energy,sideC.energy,sideA.time,sideC.time);
88
// Construct the output object
89
SG::WriteHandle<LArCollisionTime>
larTime (
m_outputName
,ctx);
90
if
(! larTime.
put
(std::move (tmplarTime)) ) {
91
ATH_MSG_WARNING
(
"Could not record the LArCollisionTime object with key "
<<
m_outputName
);
92
}
93
94
ATH_MSG_DEBUG
(
"Number/Time/Energy, Side A: "
<< sideA.nClusters <<
"/"
<< sideA.time <<
"/"
<< sideA.energy);
95
ATH_MSG_DEBUG
(
"Number/Time/Energy, Side C: "
<< sideC.nClusters <<
"/"
<< sideC.time <<
"/"
<< sideC.energy);
96
97
if
( sideA.nClusters>0 && sideC.nClusters>0 && std::fabs(sideA.time-sideC.time)<
m_timeCut
) {
98
setFilterPassed
(
true
,ctx);
99
m_nCollEvt
++;
100
}
101
else
{
102
setFilterPassed
(
false
,ctx);
103
}
104
105
106
return
StatusCode::SUCCESS;
107
}
ATH_CHECK
#define ATH_CHECK
Evaluate an expression and check for errors.
Definition
AthCheckMacros.h:40
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition
AthMsgStreamMacros.h:31
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition
AthMsgStreamMacros.h:32
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition
AthMsgStreamMacros.h:29
LArClusterCollisionTimeAlg.h
AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Definition
AthCommonAlgorithm.h:99
CaloSampling::barrelPattern
static constexpr unsigned int barrelPattern()
Get the bit-pattern for barrel samplings.
Definition
Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:75
LArClusterCollisionTimeAlg::execute
StatusCode execute(const EventContext &ctx) const override final
standard Athena-Algorithm method
Definition
LArClusterCollisionTimeAlg.cxx:56
LArClusterCollisionTimeAlg::analyseClustersPerSide
perSide_t analyseClustersPerSide(std::vector< const xAOD::CaloCluster * > &clusters) const
Definition
LArClusterCollisionTimeAlg.cxx:29
LArClusterCollisionTimeAlg::m_clusterContainerName
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_clusterContainerName
Definition
LArClusterCollisionTimeAlg.h:61
LArClusterCollisionTimeAlg::m_outputName
SG::WriteHandleKey< LArCollisionTime > m_outputName
Definition
LArClusterCollisionTimeAlg.h:62
LArClusterCollisionTimeAlg::m_nCollEvt
std::atomic< unsigned > m_nCollEvt
Definition
LArClusterCollisionTimeAlg.h:53
LArClusterCollisionTimeAlg::initialize
StatusCode initialize() override final
standard Athena-Algorithm method
Definition
LArClusterCollisionTimeAlg.cxx:11
LArClusterCollisionTimeAlg::m_nEvt
std::atomic< unsigned > m_nEvt
Definition
LArClusterCollisionTimeAlg.h:52
LArClusterCollisionTimeAlg::m_maxClusters
Gaudi::Property< size_t > m_maxClusters
Definition
LArClusterCollisionTimeAlg.h:59
LArClusterCollisionTimeAlg::m_timeCut
Gaudi::Property< float > m_timeCut
Definition
LArClusterCollisionTimeAlg.h:58
LArClusterCollisionTimeAlg::finalize
StatusCode finalize() override final
standard Athena-Algorithm method
Definition
LArClusterCollisionTimeAlg.cxx:21
SG::ReadHandle
Definition
StoreGate/StoreGate/ReadHandle.h:67
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
SG::WriteHandle
Definition
StoreGate/StoreGate/WriteHandle.h:73
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
SG::WriteHandle::put
const_pointer_type put(std::unique_ptr< T > data, bool returnExisting=false) const
Record an object to the store.
xAOD::CaloCluster_v1::time
flt_t time() const
Access cluster time.
xAOD::CaloCluster_v1::e
virtual double e() const
The total energy of the particle.
Definition
CaloCluster_v1.cxx:265
std::sort
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
Definition
DVL_algorithms.h:554
xAOD::CaloCluster
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Definition
Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloCluster.h:19
LArClusterCollisionTimeAlg::perSide_t
Definition
LArClusterCollisionTimeAlg.h:36
trapping_fp.h
Tell the compiler to optimize assuming that FP may trap.
CXXUTILS_TRAPPING_FP
#define CXXUTILS_TRAPPING_FP
Definition
trapping_fp.h:24
Generated on
for ATLAS Offline Software by
1.17.0