ATLAS Offline Software
Loading...
Searching...
No Matches
LArShapeCorrector.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9#include <memory>
10
11LArShapeCorrector::LArShapeCorrector(const std::string& name, ISvcLocator* pSvcLocator) :
12 AthAlgorithm(name, pSvcLocator),
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 { std::move(theShape) };
158 std::vector<std::vector<float> > shapeDer { std::move(theShapeDer) };
159 larShapeCompleteCorr->set(id,(int)gain,shapeAmpl,shapeDer,timeOffset,25.);
160
161 }//end loop over cells
162 }//end loop over gains
163
164 ATH_MSG_DEBUG(" Selected shapes for " << count << " cells. NChannels=" << larShapeCompleteCorr->chan_size());
165
166 sc = detStore()->record(std::move(larShapeCompleteCorr), m_keyShape_newcorr);
167 if (sc.isFailure()) {
168 ATH_MSG_ERROR( "Failed to record LArShapeComplete object with key " << m_keyShape_newcorr );
169 return sc;
170 }
171 ATH_MSG_INFO( "Successfully registered LArShapeComplete object with key " << m_keyShape_newcorr );
172
174 if (sc.isFailure()) {
175 ATH_MSG_ERROR( "Failed to sym-link LArShapeComplete object" );
176 return sc;
177 }
178
179 //ATH_MSG_INFO( detStore()->dump() );
180
181 return StatusCode::SUCCESS;
182
183}
184
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
a traits class that associates a CLID to a type T It also detects whether T inherits from Gaudi DataO...
static Double_t sc
@ Unknown
Definition TruthClasses.h:9
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
LArVectorProxy ShapeRef_t
This class defines the interface for accessing Shape (Nsample variable, Dt = 25 ns fixed) @stereotype...
Definition ILArShape.h:26
ILArShape::ShapeRef_t shapeDer(size_t tbin) const
ILArShape::ShapeRef_t shape(size_t tbin) const
float timeOffset() const
Return the time offset for this channel.
This is a non-template implementation base class for LArConditionsContainer.
ConditionsMap::const_iterator ConstConditionsMapIterator
ConstConditionsMapIterator begin(unsigned int gain) const
get iterator for all channels for a gain
ConstConditionsMapIterator end(unsigned int gain) const
end of all channels for this gain
This class implements the ILArShape interface.
virtual ShapeRef_t ShapeDer(const HWIdentifier &CellID, int gain, int tbin=0, int mode=0) const override
virtual ShapeRef_t Shape(const HWIdentifier &CellID, int gain, int tbin=0, int mode=0) const override
std::string m_groupingName
std::string m_keyShapeResidual
std::string m_keyShape_newcorr
LArShapeCorrector(const std::string &name, ISvcLocator *pSvcLocator)
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
@ LARNGAIN
Definition CaloGain.h:19
@ LARHIGHGAIN
Definition CaloGain.h:18