ATLAS Offline Software
LArShapeCorrector.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
9 #include <memory>
10 
11 LArShapeCorrector::LArShapeCorrector(const std::string& name, ISvcLocator* pSvcLocator) :
12  AthAlgorithm(name, pSvcLocator),
13  m_groupingType(LArConditionsContainerBase::Unknown)
14 {
15  declareProperty("KeyShape",m_keyShape="LArShape_org");
16  declareProperty("KeyShape_newcorr",m_keyShape_newcorr="LArShape");
17  declareProperty("KeyShapeResidual",m_keyShapeResidual="LArResiduals");
18  declareProperty("GroupingType",m_groupingName="ExtendedSubDetector");
19  declareProperty("ShapePhase",m_phase=0);
20 }
21 
23 = default;
24 
26 {
27  if ( m_groupingName == "Unknown" ) {
29  } else if ( m_groupingName == "SingleGroup" ) {
31  } else if ( m_groupingName == "SubDetector" ) {
33  } else if ( m_groupingName == "FeedThrough" ) {
35  } else if ( m_groupingName == "ExtendedFeedThrough" ) {
37  } else if ( m_groupingName == "ExtendedSubDetector" ) {
39  } else if ( m_groupingName == "SuperCells" ) {
41  } else {
42  ATH_MSG_ERROR( "Grouping type " << m_groupingName << " is not foreseen!" ) ;
43  ATH_MSG_ERROR( "Only \"Unknown\", \"SingleGroup\", \"SubDetector\", \"FeedThrough\", \"ExtendedFeedThrough\", \"ExtendedSubDetector\" and \"SuperCells\" are allowed" ) ;
44  return StatusCode::FAILURE ;
45  }
46 
47  return StatusCode::SUCCESS;
48 }
49 
51 {
52  return StatusCode::SUCCESS;
53 }
54 
55 
56 
58 
59  ATH_MSG_DEBUG(" In stop() ");
60 
61  const LArShapeComplete* inputShape=nullptr;
62  StatusCode sc=detStore()->retrieve(inputShape,m_keyShape);
63  if (sc.isFailure()) {
64  ATH_MSG_ERROR( "Failed to get input Shapes with key " << m_keyShape );
65  return sc;
66  }
67 
68 
69  const LArShapeComplete* inputShapeResidual=nullptr;
70  sc=detStore()->retrieve(inputShapeResidual,m_keyShapeResidual);
71  if (sc.isFailure()) {
72  ATH_MSG_ERROR( "Failed to get input Shape residuals with key " << m_keyShapeResidual );
73  return sc;
74  }
75 
76  std::unique_ptr<LArShapeComplete> larShapeCompleteCorr=std::make_unique<LArShapeComplete>();
77  larShapeCompleteCorr->setGroupingType( static_cast<LArConditionsContainerBase::GroupingType>(m_groupingType));
78  sc = larShapeCompleteCorr->initialize();
79  if ( sc.isFailure() ) {
80  ATH_MSG_ERROR( "Could not initialize LArShapeComplete data object - exit!" ) ;
81  return sc;
82  }
83 
84  ATH_MSG_DEBUG("Working on Shape container '"<< m_keyShape << "' new container will be '" << m_keyShape_newcorr << "'");
85  int count = 0;
86  for(unsigned int gain = CaloGain::LARHIGHGAIN; gain < CaloGain::LARNGAIN; ++gain) {
89  for(; it!=it_e;++it){
90 
92  const HWIdentifier id = it.channelId() ;
93  const int nPhases=shape.shapeSize();
94  if (nPhases==0) {
95  //ATH_MSG_DEBUG("Got empty Shape object for channel " << id.get_compact() << " (disconnected?)");
96  continue;
97  }
98  count++;
99 
100  ILArShape::ShapeRef_t vShape = shape.shape(m_phase);
101  ILArShape::ShapeRef_t vShapeDer = shape.shapeDer(m_phase);
102  const float timeOffset=shape.timeOffset();
103  //some sanity check on the Shapes
104  bool doShapeCorr=true;
105  if ( vShape.size() == 0 || vShapeDer.size() == 0 ) {
106  ATH_MSG_WARNING( "Shape not found for gain "<< gain << " channel 0x" << std::hex << id.get_compact() << std::dec );
107  continue;
108  }
109  if ( vShape.size() != vShapeDer.size() ) {
110  ATH_MSG_WARNING( "Shape (" << vShape.size() << ") derivative (" << vShapeDer.size() << ") don't have the same size for channel 0x"
111  << std::hex << id.get_compact() << std::dec );
112  continue;
113  }
114 
115  std::vector<float> theShape;
116  std::vector<float> theShapeDer;
117 
118  ILArShape::ShapeRef_t vShapeResidual=inputShapeResidual->Shape(id,gain,8); // only one phase, stored in phase #8
119  ILArShape::ShapeRef_t vShapeResidualDer=inputShapeResidual->ShapeDer(id,gain,8);
120  if ( vShapeResidual.size() == 0 || vShapeResidualDer.size() == 0 ) {
121  ATH_MSG_WARNING( "Shape residual not found for gain " << gain
122  << " channel 0x" << std::hex << id.get_compact() << std::dec
123  << ". Will not be applied!" );
124  doShapeCorr=false;
125  }
126  if ( vShapeResidual.size() != vShapeResidualDer.size() ) {
127  ATH_MSG_ERROR( "Shape residual (" << vShapeResidual.size() << ") and its derivative (" << vShapeResidualDer.size()
128  << ") don't have the same size for channel 0x"
129  << std::hex << id.get_compact() << std::dec
130  << ". Will be not applied!" );
131  doShapeCorr=false;
132  }
133 
134  // check if shape and residuals sizes match
135  if ( vShape.size() > vShapeResidual.size() ) { //FIXME, allow to apply 5 sample residual on 4 sample shape
136  ATH_MSG_WARNING( "Shape residual size does not match the shape size for channel 0x"
137  << std::hex << id.get_compact() << std::dec
138  << ". Will be not corrected!" );
139  doShapeCorr=false;
140  }
141 
142  if (doShapeCorr) {
143  for (unsigned k=0;k<vShape.size();k++) {
144  theShape.push_back( vShape[k] + vShapeResidual[k] );
145  theShapeDer.push_back( vShapeDer[k] + vShapeResidualDer[k] );
146  ATH_MSG_VERBOSE("Shape channel= " << id.get_compact() << ": " << k << "\t" << vShape[k] << "\t" << vShapeDer[k]);
147  ATH_MSG_VERBOSE("Shape residual channel= " << id.get_compact() << ": " << k << "\t" << vShapeResidual[k] << "\t" << vShapeResidualDer[k]);
148  }//end loop over samples
149  }
150  else { //doShapeCorr==fase
151  for (unsigned k=0;k<vShape.size();k++) {
152  theShape.push_back( vShape[k] );
153  theShapeDer.push_back( vShapeDer[k] );
154  }
155  }//end else
156 
157  std::vector<std::vector<float> > shapeAmpl;
158  shapeAmpl.push_back(theShape);
159  std::vector<std::vector<float> > shapeDer;
160  shapeDer.push_back(theShapeDer);
161  larShapeCompleteCorr->set(id,(int)gain,shapeAmpl,shapeDer,timeOffset,25.);
162 
163  }//end loop over cells
164  }//end loop over gains
165 
166  ATH_MSG_DEBUG(" Selected shapes for " << count << " cells. NChannels=" << larShapeCompleteCorr->chan_size());
167 
168  sc = detStore()->record(std::move(larShapeCompleteCorr), m_keyShape_newcorr);
169  if (sc.isFailure()) {
170  ATH_MSG_ERROR( "Failed to record LArShapeComplete object with key " << m_keyShape_newcorr );
171  return sc;
172  }
173  ATH_MSG_INFO( "Successfully registered LArShapeComplete object with key " << m_keyShape_newcorr );
174 
176  if (sc.isFailure()) {
177  ATH_MSG_ERROR( "Failed to sym-link LArShapeComplete object" );
178  return sc;
179  }
180 
181  //ATH_MSG_INFO( detStore()->dump() );
182 
183  return StatusCode::SUCCESS;
184 
185 }
186 
LArConditionsContainerBase::SuperCells
@ SuperCells
Definition: LArConditionsContainerBase.h:51
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArConditionsContainerBase::SingleGroup
@ SingleGroup
Definition: LArConditionsContainerBase.h:46
LArConditionsContainerBase::ExtendedSubDetGrouping
@ ExtendedSubDetGrouping
Definition: LArConditionsContainerBase.h:50
LArConditionsContainerBase::SubDetectorGrouping
@ SubDetectorGrouping
Definition: LArConditionsContainerBase.h:47
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArConditionsContainerDB::iteratorT
Declaration of const iterator.
Definition: LArConditionsContainerDB.h:72
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
skel.it
it
Definition: skel.GENtoEVGEN.py:396
LArShapeComplete
This class implements the ILArShape interface.
Definition: LArShapeComplete.h:26
LArShapeCorrector::m_keyShapeResidual
std::string m_keyShapeResidual
Definition: LArShapeCorrector.h:28
LArShapeComplete.h
LArShapeCorrector::execute
StatusCode execute()
Definition: LArShapeCorrector.cxx:50
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
HWIdentifier
Definition: HWIdentifier.h:13
CaloGain::LARNGAIN
@ LARNGAIN
Definition: CaloGain.h:19
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LArShapeCorrector::m_phase
int m_phase
Definition: LArShapeCorrector.h:32
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
LArShapeCorrector::initialize
StatusCode initialize()
Definition: LArShapeCorrector.cxx:25
LArShapeCorrector::LArShapeCorrector
LArShapeCorrector(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArShapeCorrector.cxx:11
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LArShapeCorrector::~LArShapeCorrector
~LArShapeCorrector()
LArConditionsContainerBase::GroupingType
GroupingType
Grouping type.
Definition: LArConditionsContainerBase.h:44
LArConditionsContainer::end
ConstConditionsMapIterator end(unsigned int gain) const
end of all channels for this gain
ClassID_traits.h
a traits class that associates a CLID to a type T It also detects whether T inherits from Gaudi DataO...
LArShapeCorrector::stop
StatusCode stop()
Definition: LArShapeCorrector.cxx:57
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
ClassID_traits
Default, invalid implementation of ClassID_traits.
Definition: Control/AthenaKernel/AthenaKernel/ClassID_traits.h:40
LArConditionsContainerBase::Unknown
@ Unknown
Definition: LArConditionsContainerBase.h:45
LArConditionsContainerBase
This is a non-template implementation base class for LArConditionsContainer.
Definition: LArConditionsContainerBase.h:40
AthAlgorithm
Definition: AthAlgorithm.h:47
LArShapeCorrector::m_keyShape_newcorr
std::string m_keyShape_newcorr
Definition: LArShapeCorrector.h:27
LArShapeCorrector.h
LArShapeCorrector::m_groupingName
std::string m_groupingName
Definition: LArShapeCorrector.h:30
LArConditionsContainer::chan_size
chan_size_type chan_size() const
number of channels - from MultChanCollection
LArShapeCorrector::m_keyShape
std::string m_keyShape
Definition: LArShapeCorrector.h:26
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
LArShapeComplete::set
void set(const HWIdentifier &CellID, int gain, const std::vector< std::vector< float > > &vShape, const std::vector< std::vector< float > > &vShapeDer, float timeOffset=0, float timeBinWidth=25./24.)
Definition: LArShapeComplete.cxx:17
LArConditionsContainerBase::ExtendedFTGrouping
@ ExtendedFTGrouping
Definition: LArConditionsContainerBase.h:49
CaloGain::LARHIGHGAIN
@ LARHIGHGAIN
Definition: CaloGain.h:18
LArShapeCorrector::m_groupingType
int m_groupingType
Definition: LArShapeCorrector.h:31
LArShapeComplete::ShapeDer
virtual ShapeRef_t ShapeDer(const HWIdentifier &CellID, int gain, int tbin=0, int mode=0) const override
Definition: LArShapeComplete.cxx:44
LArConditionsContainer::initialize
virtual StatusCode initialize()
Initialization done after creation or read back - derived classes may augment the functionality.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
LArConditionsContainer< LArShapeP2 >::ConstReference
Subset::ConstReference ConstReference
Definition: LArConditionsContainer.h:80
LArConditionsContainer::begin
ConstConditionsMapIterator begin(unsigned int gain) const
get iterator for all channels for a gain
LArShapeComplete::Shape
virtual ShapeRef_t Shape(const HWIdentifier &CellID, int gain, int tbin=0, int mode=0) const override
Definition: LArShapeComplete.cxx:29
CaloGain.h
LArConditionsContainerBase::FeedThroughGrouping
@ FeedThroughGrouping
Definition: LArConditionsContainerBase.h:48
fitman.k
k
Definition: fitman.py:528
LArVectorProxy
Proxy for accessing a range of float values like a vector.
Definition: LArVectorProxy.h:38