ATLAS Offline Software
CaloCellFilterAlg.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 // STL include(s):
6 #include <algorithm>
7 #include <cmath>
8 
9 // Gaudi/Athena include(s):
12 
13 // EDM include(s):
15 #include "CaloIdentifier/CaloID.h"
17 
18 // Local include(s):
19 #include "CaloCellFilterAlg.h"
20 
21 
23  ISvcLocator* pSvcLocator )
24  : AthAlgorithm( name, pSvcLocator ),
25  m_cellsName( "AllCalo" ), m_outputCellsName( "SelectedCells" ),
26  m_maxNCells( 0 ),m_cellEnergyThreshold( 0. ),
27  m_sigmaCut( -1 ),
28  m_emid( 0 ),
29  m_fcalid( 0 ),
30  m_hecid( 0 ),
31  m_tileid( 0 ),
32  m_caloSelection( false ),
33  m_caloSamplingSelection( false ) {
34 
35  // string property for Cell container
36  declareProperty( "CellsName", m_cellsName );
37  // string property for Cell container
38  declareProperty( "OutputCellsName", m_outputCellsName );
39  // list of calo to treat
40  declareProperty( "CaloNums", m_caloNums );
41  // string property for Cell container
42  declareProperty( "MaxNCells", m_maxNCells );
43  // declareProperty("ThresholdGeVCells",m_thresholdGeVCells);
44  // m_thresholdGeVCells --> m_cellEnergyThreshold
45  declareProperty( "CellEnergyThreshold", m_cellEnergyThreshold );
46  declareProperty( "CellSigmaCut", m_sigmaCut );
47  // list of calo samplings to treat
48  declareProperty( "CaloSamplings", m_caloSamplings );
49 }
50 
52 
53  ATH_MSG_INFO( "Initializing" );
54  ATH_MSG_INFO( " reading CaloCellContainer " << m_cellsName );
55  ATH_MSG_INFO( " CellEnergyThreshold " << m_cellEnergyThreshold );
56  ATH_MSG_INFO( " CellSigmaCut " << m_sigmaCut );
57  if( m_maxNCells < 0 ) {
58  ATH_MSG_WARNING( " no cell to select, set jobOpt MaxNCells to the max "
59  "number of cells you want" );
60  } else {
61  if( m_maxNCells == 0 ) {
62  ATH_MSG_WARNING( " select all cells" );
63  } else {
64  ATH_MSG_INFO( " select cells up to " << m_maxNCells << " cells" );
65  }
66  }
67  ATH_MSG_INFO( " ....applying threshold " << m_cellEnergyThreshold );
68 
69  CHECK( detStore()->retrieve( m_emid ) );
71  CHECK( detStore()->retrieve( m_hecid ) );
73 
75 
76  const unsigned int nSubCalo = static_cast< int >( CaloCell_ID::NSUBCALO );
77 
78  //check calo number specified
79  m_caloSelection = false;
80  if( m_caloNums.size() == 0 ) {
81  ATH_MSG_INFO( " No calorimeter selection" );
82  return StatusCode::SUCCESS;
83  } else if( m_caloNums.size() > nSubCalo ) {
85  << " More than " << nSubCalo << " calo specified. "
86  << "Must be wrong. Stop.";
87  return StatusCode::FAILURE;
88  } else {
89  m_caloSelection = true;
90 
91  for( unsigned int index = 0; index < m_caloNums.size(); ++index ) {
92  if( m_caloNums[ index ]>= nSubCalo ) {
94  << "Invalid calo specification:"
95  << m_caloNums[index] << "Stop.";
96  return StatusCode::FAILURE;
97  } else {
98  ATH_MSG_INFO( " Select calorimeter " << m_caloNums[ index ] );
99  }
100  }
101  }
102 
103  const unsigned int nCaloSamplings = static_cast< int >( CaloCell_ID::Unknown );
104 
105  //check calo samplings specified
106  m_caloSamplingSelection = false;
107  if( m_caloSamplings.size() == 0 ) {
108  ATH_MSG_INFO( " No calorimeter sampling selection" );
109  return StatusCode::SUCCESS;
110  } else if( m_caloSamplings.size() > nSubCalo ) {
112  << " More than " << nCaloSamplings << " calo samplings specified. "
113  << "Must be wrong. Stop.";
114  return StatusCode::FAILURE;
115  } else {
117 
118  for( unsigned int index = 0; index < m_caloSamplings.size(); ++index ) {
119  if( m_caloSamplings[ index ]>= nCaloSamplings ) {
121  << "Invalid calo sampling specification:"
122  << m_caloSamplings[index] << "Stop.";
123  return StatusCode::FAILURE;
124  } else {
125  ATH_MSG_INFO( " Select calorimeter sampling " << m_caloSamplings[ index ] );
126  }
127  }
128  }
129 
130  return StatusCode::SUCCESS;
131 }
132 
133 
135 
136  REPORT_MESSAGE( MSG::VERBOSE ) << " in execute";
137 
138  // typedef ObjectVector<CaloCell> CONTAINER;
139  typedef CaloCellContainer CONTAINER;
140 
141  const CONTAINER* cellcoll = nullptr;
142  CHECK( evtStore()->retrieve( cellcoll, m_cellsName ) );
143 
145  CHECK( evtStore()->record( outputCont, m_outputCellsName ) );
146 
147  REPORT_MESSAGE( MSG::VERBOSE ) << " EM Cell container: " << m_cellsName;
148 
149  CONTAINER::const_iterator f_cell = cellcoll->begin();
150  CONTAINER::const_iterator l_cell = cellcoll->end();
151 
152  int index = 0;
153 
154  bool useNoiseCut = false;
155  if( ! m_caloNoiseKey.empty() ) useNoiseCut = true;
156 
157  for( ; f_cell != l_cell; ++f_cell ) {
158 
159  const CaloCell* cell = ( *f_cell );
160 
161  if( m_caloSelection ) {
162  // keep only cells from desired calorimeter
163  const unsigned int iCaloNum =
164  static_cast< unsigned int >( cell->caloDDE()->getSubCalo() );
165  std::vector< unsigned int >::const_iterator theFound =
166  std::find( m_caloNums.begin(), m_caloNums.end(), iCaloNum );
167  if( theFound == m_caloNums.end() ) continue;
168  }
169 
170  if ( m_caloSamplingSelection ) {
171  // keep only cells from desired calorimeter sampling
172  const unsigned int iCaloSampling =
173  static_cast< unsigned int >( cell->caloDDE()->getSampling() );
174  std::vector< unsigned int >::const_iterator theFound =
175  std::find( m_caloSamplings.begin(), m_caloSamplings.end(), iCaloSampling );
176  if( theFound == m_caloSamplings.end() ) continue;
177  }
178 
179  const float e = cell->energy();
180 
181  //fill cell by cell ntuple if required
182  if( m_maxNCells >= 0 ) {
183 
184  if( ( m_maxNCells == 0 ) || ( index < m_maxNCells ) ) {
185 
186  const float th = m_cellEnergyThreshold;
187  static const double epsilon = 0.001;
188 
189  if( std::abs( th ) > epsilon ) {
190  if( th > 0. ) {
191  if( ! ( e > th ) ) continue;
192  } else if( th < 0. ) {
193  if( ! ( std::abs( e ) > std::abs( th ) ) ) continue;
194  }
195  }
196 
197  if( useNoiseCut ) {
199  float sigma = caloNoise->getNoise( cell->ID(), cell->gain() );
200  if( std::abs( e ) < sigma * m_sigmaCut ) continue;
201  }
202 
203  outputCont->push_back( cell );
204  ++index;
205 
206  } else {
207 
208  if( m_maxNCells == index ) {
209  ATH_MSG_WARNING( " Too many cells. Save only "
210  << m_maxNCells );
211  break;
212  }
213  }
214  }
215  }
216 
217  return StatusCode::SUCCESS;
218 }
CaloCellFilterAlg::m_maxNCells
int m_maxNCells
Maximum number of cells to accept.
Definition: CaloCellFilterAlg.h:50
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
CaloCellFilterAlg::CaloCellFilterAlg
CaloCellFilterAlg(const std::string &name, ISvcLocator *pSvcLocator)
Regular Gaudi Algorithm constructor.
Definition: CaloCellFilterAlg.cxx:22
pdg_comparison.sigma
sigma
Definition: pdg_comparison.py:324
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
CaloCellFilterAlg::m_caloSelection
bool m_caloSelection
Definition: CaloCellFilterAlg.h:69
python.Constants.FATAL
int FATAL
Definition: Control/AthenaCommon/python/Constants.py:19
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
CaloCellFilterAlg::m_cellEnergyThreshold
float m_cellEnergyThreshold
threshold on cell energy for ntuple
Definition: CaloCellFilterAlg.h:52
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
ConstDataVector.h
DataVector adapter that acts like it holds const pointers.
index
Definition: index.py:1
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
CaloID.h
CaloCellFilterAlg::m_fcalid
const LArFCAL_ID * m_fcalid
Definition: CaloCellFilterAlg.h:58
CaloCellFilterAlg::m_outputCellsName
std::string m_outputCellsName
output Cell container
Definition: CaloCellFilterAlg.h:49
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
ReadCondHandle.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
CaloCellFilterAlg::execute
virtual StatusCode execute()
Function executed for each event.
Definition: CaloCellFilterAlg.cxx:134
python.TriggerHandler.th
th
Definition: TriggerHandler.py:296
CaloCellFilterAlg::m_caloNoiseKey
SG::ReadCondHandleKey< CaloNoise > m_caloNoiseKey
Key of the CaloNoise Conditions data object.
Definition: CaloCellFilterAlg.h:66
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CaloCellFilterAlg::m_sigmaCut
float m_sigmaCut
cut on abs(E)/sigmaNoise (no cut if <0 )
Definition: CaloCellFilterAlg.h:54
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
AthAlgorithm
Definition: AthAlgorithm.h:47
CaloCellFilterAlg::m_emid
const LArEM_ID * m_emid
Definition: CaloCellFilterAlg.h:57
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
errorcheck.h
Helpers for checking error return status codes and reporting errors.
ConstDataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
CaloCellContainer.h
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
CaloCellFilterAlg.h
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
DeMoScan.index
string index
Definition: DeMoScan.py:362
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
CaloCellFilterAlg::m_tileid
const TileID * m_tileid
Definition: CaloCellFilterAlg.h:60
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
CaloCellFilterAlg::m_hecid
const LArHEC_ID * m_hecid
Definition: CaloCellFilterAlg.h:59
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
ConstDataVector
DataVector adapter that acts like it holds const pointers.
Definition: ConstDataVector.h:76
CaloCell_Base_ID::NSUBCALO
@ NSUBCALO
Definition: CaloCell_Base_ID.h:46
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
SG::AllowEmpty
@ AllowEmpty
Definition: StoreGate/StoreGate/VarHandleKey.h:30
CaloCellFilterAlg::m_cellsName
std::string m_cellsName
Cell container.
Definition: CaloCellFilterAlg.h:48
CaloCellFilterAlg::m_caloNums
std::vector< unsigned int > m_caloNums
which calo to treat
Definition: CaloCellFilterAlg.h:51
CaloCellFilterAlg::initialize
virtual StatusCode initialize()
Function executed before the event loop starts.
Definition: CaloCellFilterAlg.cxx:51
CaloCellFilterAlg::m_caloSamplingSelection
bool m_caloSamplingSelection
Definition: CaloCellFilterAlg.h:70
CaloCellFilterAlg::m_caloSamplings
std::vector< unsigned int > m_caloSamplings
which calo samplings to treat
Definition: CaloCellFilterAlg.h:55