ATLAS Offline Software
LArClusterCollisionTimeAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include <algorithm>
8 
9 //__________________________________________________________________________
11  {
12  ATH_MSG_DEBUG ("LArClusterCollisionTimeAlg initialize()");
15  return StatusCode::SUCCESS;
16 
17  }
18 
19 //__________________________________________________________________________
21  {
22 
23  ATH_MSG_INFO( m_nCollEvt << "/" << m_nEvt << " Events found to be collision events with at least one cluster in each EM endcap." );
24  ATH_MSG_DEBUG ("LArClusterCollisionTimeAlg finalize()");
25  return StatusCode::SUCCESS;
26  }
27 
29 
31 
32  //Sort clusters by Energy
33  std::sort(clusters.begin(),clusters.end(),[](const xAOD::CaloCluster* o1, const xAOD::CaloCluster* o2) {return o1->e() > o2->e();});
34 
35  result.nClusters=std::min(m_maxClusters.value(),clusters.size());
36 
37  if (result.nClusters>0) {
38  for (size_t i=0;i<result.nClusters;++i) {
39  const xAOD::CaloCluster* clu=clusters[i];
40  result.time+=clu->time();
41  result.energy+=clu->e();
42  }
43 
44  result.time/=(float)(result.nClusters);
45  result.energy/=(float)(result.nClusters);
46  }
47 
48  return result;
49 }
50 
51 //__________________________________________________________________________
52 StatusCode LArClusterCollisionTimeAlg::execute(const EventContext& ctx) const {
53  ATH_MSG_DEBUG ("LArClusterCollisionTimeAlg execute()");
54 
55  m_nEvt++;
56 
57  // Get the cluster container
59  if( !cluster_container.isValid()) { // record empty object
60  ATH_MSG_WARNING ("Could not get ClusterContainer with key " << m_clusterContainerName);
61  // Construct the output object
63  ATH_CHECK( larTime.record (std::make_unique<LArCollisionTime>()) );
64  return StatusCode::SUCCESS;
65  }
66 
67  std::vector<const xAOD::CaloCluster*> clustersEMECA,clustersEMECC;
68 
69  const unsigned barrelPattern=CaloSampling::barrelPattern();
70 
71  for(const xAOD::CaloCluster* pCluster : *cluster_container) {
72  if ((pCluster->samplingPattern() & barrelPattern) == 0 ) { //Take only clusters that have only endcap samplings, ignore barrel
73  if (pCluster->eta()>0.)
74  clustersEMECA.push_back(pCluster);
75  else
76  clustersEMECC.push_back(pCluster);
77  }
78  } //End loop over clusters
79 
80  const perSide_t sideA=analyseClustersPerSide(clustersEMECA);
81  const perSide_t sideC=analyseClustersPerSide(clustersEMECC);
82 
83  auto tmplarTime = std::make_unique<LArCollisionTime>(sideA.nClusters,sideC.nClusters,sideA.energy,sideC.energy,sideA.time,sideC.time);
84  // Construct the output object
86  if (! larTime.put (std::move (tmplarTime)) ) {
87  ATH_MSG_WARNING( "Could not record the LArCollisionTime object with key "<<m_outputName );
88  }
89 
90  ATH_MSG_DEBUG("Number/Time/Energy, Side A: " << sideA.nClusters << "/" << sideA.time << "/" << sideA.energy);
91  ATH_MSG_DEBUG("Number/Time/Energy, Side C: " << sideC.nClusters << "/" << sideC.time << "/" << sideC.energy);
92 
93  if ( sideA.nClusters>0 && sideC.nClusters>0 && std::fabs(sideA.time-sideC.time)<m_timeCut) {
94  setFilterPassed(true,ctx);
95  m_nCollEvt++;
96  }
97  else {
98  setFilterPassed(false,ctx);
99  }
100 
101 
102  return StatusCode::SUCCESS;
103 }
xAOD::CaloCluster_v1::time
flt_t time() const
Access cluster time.
LArClusterCollisionTimeAlg::finalize
StatusCode finalize() override final
standard Athena-Algorithm method
Definition: LArClusterCollisionTimeAlg.cxx:20
get_generator_info.result
result
Definition: get_generator_info.py:21
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArClusterCollisionTimeAlg::m_outputName
SG::WriteHandleKey< LArCollisionTime > m_outputName
Definition: LArClusterCollisionTimeAlg.h:62
ZDC::sideC
BySideTypeMod sideC(-1)
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
LArClusterCollisionTimeAlg::execute
StatusCode execute(const EventContext &ctx) const override final
standard Athena-Algorithm method
Definition: LArClusterCollisionTimeAlg.cxx:52
CaloSampling::barrelPattern
static constexpr unsigned int barrelPattern()
Get the bit-pattern for barrel samplings.
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:75
LArClusterCollisionTimeAlg::perSide_t
Definition: LArClusterCollisionTimeAlg.h:36
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
LArClusterCollisionTimeAlg::m_timeCut
Gaudi::Property< float > m_timeCut
Definition: LArClusterCollisionTimeAlg.h:58
lumiFormat.i
int i
Definition: lumiFormat.py:92
LArClusterCollisionTimeAlg::analyseClustersPerSide
perSide_t analyseClustersPerSide(std::vector< const xAOD::CaloCluster * > &clusters) const
Definition: LArClusterCollisionTimeAlg.cxx:28
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
LArClusterCollisionTimeAlg::m_nEvt
std::atomic< unsigned > m_nEvt
Definition: LArClusterCollisionTimeAlg.h:52
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
LArClusterCollisionTimeAlg::m_nCollEvt
std::atomic< unsigned > m_nCollEvt
Definition: LArClusterCollisionTimeAlg.h:53
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
min
#define min(a, b)
Definition: cfImp.cxx:40
LArClusterCollisionTimeAlg.h
LArClusterCollisionTimeAlg::initialize
StatusCode initialize() override final
standard Athena-Algorithm method
Definition: LArClusterCollisionTimeAlg.cxx:10
python.changerun.o2
o2
Definition: changerun.py:45
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
ZDC::sideA
BySideTypeMod sideA(1)
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LArClusterCollisionTimeAlg::m_maxClusters
Gaudi::Property< size_t > m_maxClusters
Definition: LArClusterCollisionTimeAlg.h:59
RunTileMonitoring.clusters
clusters
Definition: RunTileMonitoring.py:133
LArClusterCollisionTimeAlg::m_clusterContainerName
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_clusterContainerName
Definition: LArClusterCollisionTimeAlg.h:61
SG::WriteHandle::put
const_pointer_type put(std::unique_ptr< T > data, bool returnExisting=false) const
Record an object to the store.
python.changerun.o1
o1
Definition: changerun.py:44
xAOD::CaloCluster_v1::e
virtual double e() const
The total energy of the particle.
Definition: CaloCluster_v1.cxx:265
readCCLHist.float
float
Definition: readCCLHist.py:83
AthReentrantAlgorithm::setFilterPassed
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Definition: AthReentrantAlgorithm.h:139