ATLAS Offline Software
LArCollisionTimeAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "LArCollisionTimeAlg.h"
6 #include "Identifier/Identifier.h"
8 
9 
11  {
12  ATH_MSG_DEBUG ("LArCollisionTimeAlg initialize()");
13 
14  //retrieve ID helpers
15  ATH_CHECK(detStore()->retrieve(m_calo_id,"CaloCell_ID"));
16 
17  //Initialize VarHandles
21 
22  return StatusCode::SUCCESS;
23 
24  }
25 
26 //__________________________________________________________________________
28  {
29  ATH_MSG_DEBUG ("LArCollisionTimeAlg finalize()");
30  return StatusCode::SUCCESS;
31  }
32 
33 //__________________________________________________________________________
34 StatusCode LArCollisionTimeAlg::execute(const EventContext& ctx) const
35  {
36  //.............................................
37 
38  ATH_MSG_DEBUG ("LArCollisionTimeAlg execute()");
39 
40  //Input read handle:
42 
43  //Output write handle:
45 
46  if(!cell_container.isValid()) {
47  ATH_MSG_INFO (" Could not get pointer to Cell Container ");
48  // Construct a dummy output object
49  ATH_CHECK( larTimeWH.record (std::make_unique<LArCollisionTime>()) );
50 
51  return StatusCode::SUCCESS;
52  }
53 
54 
56  const CaloNoise* noiseCDO=*noiseHdl;
57 
58 
59  // Loop over the CaloCellContainer
60  int ncellA=0;
61  int ncellC=0;
62  float energyA=0.;
63  float energyC=0.;
64  float timeA=0.;
65  float timeC=0.;
66 
67  CaloCellContainer::const_iterator first_cell = cell_container->begin();
68  CaloCellContainer::const_iterator end_cell = cell_container->end();
69  ATH_MSG_DEBUG ("*** Start loop over CaloCells in LArCollisionTimeAlg");
70  for (; first_cell != end_cell; ++first_cell)
71  {
72  Identifier cellID = (*first_cell)->ID();
73  if (m_calo_id->is_tile(cellID)) continue;
74 
75  double eta = (*first_cell)->eta();
76  if (std::fabs(eta)<1.5) continue;
77 
78  uint16_t provenance = (*first_cell)->provenance();
79 //
80 // check time correctly available
81 // for Data: offline Iteration 0x2000 time available, 0x0100 Iteration converted, not 0x0200 and not 0x0400 (bad cells), 0x00A5 (correctly calibrated)
82 // DSP time 0x1000 : cell from DSP, 0x2000 time available, not 0x0200 and not 0x0400
83 // for MC check time available 0x2000, and not bad cel
84 
85  uint16_t mask1 = 0x3DFF;
86  if (!m_iterCut) mask1 = 0x3CFF;
87  uint16_t cut1 = 0x21A5;
88  if (!m_iterCut) cut1 = 0x20A5;
89 
90  if ( (provenance & mask1) != cut1 && (provenance & 0x3C00) != 0x3000 && !m_isMC) continue;
91  if ( (provenance & 0x2C00) != 0x2000 && m_isMC) continue;
92 
93  const double energy= (*first_cell)->energy();
94  const double noise=noiseCDO->getNoise(cellID,(*first_cell)->gain());
95  double signif=9999.;
96  if (noise>0.) signif = energy/noise;
97  if (signif < 5.) continue;
98 
99  double ecut=-1;
100  if (m_calo_id->is_lar_fcal(cellID) && m_calo_id->calo_sample(cellID)==CaloCell_ID::FCAL0) ecut=1200.;
101  if (m_calo_id->is_em_endcap_inner(cellID) ) ecut=250.;
102 
103  if (ecut<0.) continue;
104  if (energy<ecut) continue;
105 
106  double time = (*first_cell)->time();
107 
108  if (eta>0.) {
109  ncellA += 1;
110  energyA += energy;
111  timeA += time;
112  }
113  else {
114  ncellC += 1;
115  energyC += energy;
116  timeC += time;
117  }
118 
119  }
120 
121  if (ncellA>0) timeA = timeA/((float)(ncellA));
122  if (ncellC>0) timeC = timeC/((float)(ncellC));
123 
124  if (ncellA>m_minCells && ncellC > m_minCells && std::fabs(timeA-timeC)<m_timeCut)
125  setFilterPassed(true,ctx);
126  else
127  setFilterPassed(false,ctx);
128 
129  ATH_MSG_DEBUG( " ncellA, ncellA, energyA, energyC, timeA, timeC " << ncellA << " " << ncellC << " " << energyA << " " << energyC << " " << timeA << " " << timeC);
130  auto larTime = std::make_unique<LArCollisionTime>(ncellA,ncellC,energyA,energyC,timeA,timeC);
131  // Construct the output object
132  if (! larTimeWH.put (std::move (larTime)) ) {
133  ATH_MSG_WARNING( "Could not record the LArCollisionTime object with key "<<m_collTimeName );
134 
135  }
136 
137  return StatusCode::SUCCESS;
138 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
LArCollisionTimeAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override final
standard Athena-Algorithm method
Definition: LArCollisionTimeAlg.cxx:34
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AtlasDetectorID::is_lar_fcal
bool is_lar_fcal(Identifier id) const
Definition: AtlasDetectorID.h:839
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
LArCollisionTimeAlg::m_collTimeName
SG::WriteHandleKey< LArCollisionTime > m_collTimeName
Definition: LArCollisionTimeAlg.h:53
CaloCell_Base_ID::calo_sample
int calo_sample(const Identifier id) const
returns an int taken from Sampling enum and describing the subCalo to which the Id belongs.
Definition: CaloCell_Base_ID.cxx:141
CaloCell_Base_ID::is_tile
bool is_tile(const Identifier id) const
test if the id belongs to the Tiles
CaloNoise::getNoise
float getNoise(const IdentifierHash h, const int gain) const
Accessor by IdentifierHash and gain.
Definition: CaloNoise.h:34
CaloCell_ID.h
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
ParticleGun_FastCalo_ChargeFlip_Config.energy
energy
Definition: ParticleGun_FastCalo_ChargeFlip_Config.py:78
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
LArCollisionTimeAlg::m_minCells
Gaudi::Property< int > m_minCells
Definition: LArCollisionTimeAlg.h:49
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
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
CaloCell_Base_ID::is_em_endcap_inner
bool is_em_endcap_inner(const Identifier id) const
test if the id belongs to the EM Endcap inner wheel
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
LArCollisionTimeAlg::m_timeCut
Gaudi::Property< float > m_timeCut
Definition: LArCollisionTimeAlg.h:48
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
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
LArCollisionTimeAlg::m_noiseCDOKey
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
Definition: LArCollisionTimeAlg.h:54
CaloNoise
Definition: CaloNoise.h:16
LArCollisionTimeAlg::m_isMC
Gaudi::Property< bool > m_isMC
Definition: LArCollisionTimeAlg.h:46
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArCollisionTimeAlg::finalize
virtual StatusCode finalize() override final
standard Athena-Algorithm method
Definition: LArCollisionTimeAlg.cxx:27
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LArCollisionTimeAlg::m_calo_id
const CaloCell_ID * m_calo_id
Definition: LArCollisionTimeAlg.h:41
PlotCalibFromCool.cut1
cut1
Definition: PlotCalibFromCool.py:709
LArCollisionTimeAlg::m_iterCut
Gaudi::Property< bool > m_iterCut
Definition: LArCollisionTimeAlg.h:47
SG::WriteHandle::put
const_pointer_type put(std::unique_ptr< T > data, bool returnExisting=false) const
Record an object to the store.
CaloCell_ID_FCS::FCAL0
@ FCAL0
Definition: FastCaloSim_CaloCell_ID.h:40
LArCollisionTimeAlg::initialize
virtual StatusCode initialize() override final
standard Athena-Algorithm method
Definition: LArCollisionTimeAlg.cxx:10
LArCollisionTimeAlg.h
readCCLHist.float
float
Definition: readCCLHist.py:83
WriteCellNoiseToCool.noise
noise
Definition: WriteCellNoiseToCool.py:380
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
AthReentrantAlgorithm::setFilterPassed
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Definition: AthReentrantAlgorithm.h:139
LArCollisionTimeAlg::m_cellsContName
SG::ReadHandleKey< CaloCellContainer > m_cellsContName
Definition: LArCollisionTimeAlg.h:52