ATLAS Offline Software
Loading...
Searching...
No Matches
LArOFPhasePicker.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
10
13
14LArOFPhasePicker::LArOFPhasePicker(const std::string& name, ISvcLocator* pSvcLocator) :
15 AthAlgorithm(name, pSvcLocator),
16 m_inputPhase(nullptr),
17 m_onlineID(nullptr),
19{
20 declareProperty("KeyOFC",m_keyOFC="LArOFC_org");
21 declareProperty("KeyOFC_new",m_keyOFC_new="LArOFC");
22 declareProperty("KeyShape",m_keyShape="LArShape_org");
23 declareProperty("KeyShape_new",m_keyShape_new="LArShape");
24 declareProperty("KeyPhase",m_keyPhase="");
25 declareProperty("GroupingType",m_groupingName="ExtendedSubDetector");
26 declareProperty("TimeOffsetCorrection",m_timeOffsetCorr=0);
27 declareProperty("DefaultPhase",m_defaultPhase=4);
28 declareProperty("doOFC",m_doOFC=true);
29 declareProperty("doShape",m_doShape=true);
30 declareProperty("isSC",m_isSC=false);
31}
32
34= default;
35
37{
38 if ( m_groupingName == "Unknown" ) {
40 } else if ( m_groupingName == "SingleGroup" ) {
42 } else if ( m_groupingName == "SubDetector" ) {
44 } else if ( m_groupingName == "FeedThrough" ) {
46 } else if ( m_groupingName == "ExtendedFeedThrough" ) {
48 } else if ( m_groupingName == "ExtendedSubDetector" ) {
50 } else if ( m_groupingName == "SuperCells" ) {
52 } else {
53 ATH_MSG_ERROR( "Grouping type " << m_groupingName << " is not foreseen!" ) ;
54 ATH_MSG_ERROR( "Only \"Unknown\", \"SingleGroup\", \"SubDetector\", \"FeedThrough\", \"ExtendedFeedThrough\", \"ExtendedSubDetector\" and \"SuperCells\" are allowed" ) ;
55 return StatusCode::FAILURE ;
56 }
57
58 StatusCode sc;
59 if ( m_isSC ) {
60 const LArOnline_SuperCellID* ll;
61 sc = detStore()->retrieve(ll, "LArOnline_SuperCellID");
62 if (sc.isFailure()) {
63 msg(MSG::ERROR) << "Could not get LArOnlineID helper !" << endmsg;
64 return StatusCode::FAILURE;
65 }
66 else {
67 m_onlineID = static_cast<const LArOnlineID_Base*>(ll);
68 ATH_MSG_DEBUG("Found the LArOnlineID helper");
69 }
70 } else { // m_isSC
71 const LArOnlineID* ll;
72 sc = detStore()->retrieve(ll, "LArOnlineID");
73 if (sc.isFailure()) {
74 msg(MSG::ERROR) << "Could not get LArOnlineID helper !" << endmsg;
75 return StatusCode::FAILURE;
76 }
77 else {
78 m_onlineID = static_cast<const LArOnlineID_Base*>(ll);
79 ATH_MSG_DEBUG(" Found the LArOnlineID helper. ");
80 }
81 }
82
83 ATH_CHECK(m_ofcWKey.initialize(!m_ofcWKey.empty()));
84
85 return StatusCode::SUCCESS;
86}
87
89{
90 return StatusCode::SUCCESS;
91}
92
93
94
96
97 ATH_MSG_DEBUG(" In stop() ");
98
99 if (!m_keyPhase.empty()) {
100 StatusCode sc=detStore()->retrieve(m_inputPhase,m_keyPhase);
101 if (sc.isFailure()) {
102 ATH_MSG_ERROR( "Failed to get input OFC phase with key " << m_keyPhase );
103 ATH_MSG_ERROR( "Will use default phase !!" );
104 m_inputPhase=nullptr;
105 } else {
106 ATH_MSG_DEBUG( "Got OFC phase with key " << m_keyPhase );
107 }
108 }
109 else {
110 ATH_MSG_INFO( "No StoreGate key for OFC bin given. Will use default phase=" << m_defaultPhase );
111 }
112
113 if (m_doOFC) {
115 }
116
117 if (m_doShape) {
119 }
120 return StatusCode::SUCCESS;
121}
122
123
125 StatusCode sc;
126 const LArOFCComplete* inputOFC=nullptr;
127 sc=detStore()->retrieve(inputOFC,m_keyOFC);
128 if (sc.isFailure()) {
129 ATH_MSG_ERROR( "Failed to get input OFCs with key " << m_keyOFC );
131 return sc;
132 }
133
134 std::unique_ptr<LArOFCComplete> larOFCComplete=std::make_unique<LArOFCComplete>();
135 larOFCComplete->setGroupingType( static_cast<LArConditionsContainerBase::GroupingType>(m_groupingType));
136 sc = larOFCComplete->initialize();
137 if ( sc.isFailure() ) {
138 ATH_MSG_ERROR( "Could not initialize LArOFCComplete data object - exit!" ) ;
139 return sc ;
140 }
141 ATH_MSG_DEBUG("Working on OFC container '"<< m_keyOFC << "' new container will be '" << m_keyOFC_new << "'");
142
143 const LArOFCweightSC *ofW = nullptr;
144 if(!m_ofcWKey.empty()) {
146 ofW=*wHdl;
147 if(!ofW){
148 ATH_MSG_WARNING("Could not get the OFCb weights asked with key "<<m_ofcWKey.key()<<", no weighting done !!!");
149 } else {
150 ATH_MSG_DEBUG("Got the OFCb weights with key "<<m_ofcWKey.key());
151 }
152 }
153
154 int count = 0;
155 for(unsigned int gain = CaloGain::LARHIGHGAIN; gain < CaloGain::LARNGAIN; ++gain) {
158 for(; it!=it_e;++it){
160 const HWIdentifier id = it.channelId() ;
161 const int nPhases=ofc.OFC_aSize();
162 if (nPhases==0) {
163 ATH_MSG_DEBUG("Got empty OFC object for channel " << m_onlineID->channel_name(id) << " (disconnected?)");
164 continue;
165 }
166 ATH_MSG_VERBOSE("nPhases=" << nPhases);
167 count++;
168 std::size_t phase=std::min(m_defaultPhase,nPhases-1);
169
170 if(m_inputPhase) {
171 const int p = m_inputPhase->bin(id, gain);
172 ATH_MSG_DEBUG("OFC picking, gain=" << gain << ", channel " << m_onlineID->channel_name(id) <<", p=" << p);
173 if (p>0 && p<nPhases) phase=p;
174 }
175 ATH_MSG_DEBUG("OFC picking, gain=" << gain << ", channel " << m_onlineID->channel_name(id) <<", phase=" << phase);
176 ILArOFC::OFCRef_t vOFC_a = ofc.OFC_a(phase);
177 ILArOFC::OFCRef_t vOFC_b = ofc.OFC_b(phase);
178 const float timeOffset=ofc.timeOffset()+m_timeOffsetCorr;
179 //some sanity check on the OFCs
180 if ( vOFC_a.size() == 0 || vOFC_b.size() == 0 ) {
181 ATH_MSG_WARNING( "OFC not found for gain "<< gain << " channel " << m_onlineID->channel_name(id) );
182
183 }else if ( vOFC_a.size() != vOFC_b.size() ) {
184 ATH_MSG_WARNING( "OFC a (" << vOFC_a.size() << ") and b (" << vOFC_b.size() << ") are not the same size for channel "
185 << m_onlineID->channel_name(id) );
186 ATH_MSG_WARNING( "Will be not exported !!!" );
187 } else { // save in new container
188 std::vector<std::vector<float> > OFC_a;
189 OFC_a.push_back(vOFC_a.asVector());
190 std::vector<std::vector<float> > OFC_b;
191 OFC_b.push_back(vOFC_b.asVector());
192 if(ofW) { // weight OFCb
193 ATH_MSG_DEBUG("weighting channel by "<<ofW->getW(id));
194 std::transform(OFC_b[0].begin(), OFC_b[0].end(), OFC_b[0].begin(),
195 std::bind(std::multiplies<float>(), std::placeholders::_1, ofW->getW(id)));
196 } else if (m_isSC && m_onlineID->isHECchannel(id)) { // weight HEC OFCb for SC
197 ATH_MSG_DEBUG("weighting HEC channel by 1.5");
198 std::transform(OFC_b[0].begin(), OFC_b[0].end(), OFC_b[0].begin(),
199 std::bind(std::multiplies<float>(), std::placeholders::_1, 1.5));
200
201 }
202 larOFCComplete->set(id,(int)gain,OFC_a,OFC_b,timeOffset,25.); //There is no sensible time-bin width for single-phase OFCs 25 seems to make the most sense...
203 }
204 }
205 }
206
207 ATH_MSG_DEBUG(" Selected OFCs for " << count << " cells");
208
209 sc = detStore()->record(std::move(larOFCComplete), m_keyOFC_new);
210 if (sc.isFailure()) {
211 ATH_MSG_ERROR( "Failed to record LArOFCComplete object with key " << m_keyOFC_new );
212 return sc;
213 }
215 if (sc.isFailure()) {
216 ATH_MSG_ERROR( "Failed to sym-link LArOFCComplete object" );
217 return sc;
218 }
219 return StatusCode::SUCCESS;
220
221}
222
223
225{
226 StatusCode sc;
227
228 const LArShapeComplete* inputShape=nullptr;
229 sc=detStore()->retrieve(inputShape,m_keyShape);
230 if (sc.isFailure()) {
231 ATH_MSG_ERROR( "Failed to get input Shapes with key " << m_keyShape );
232 return sc;
233 }
234
235 std::unique_ptr<LArShapeComplete> larShapeComplete=std::make_unique<LArShapeComplete>();
236 larShapeComplete->setGroupingType( static_cast<LArConditionsContainerBase::GroupingType>(m_groupingType));
237 sc = larShapeComplete->initialize();
238 if ( sc.isFailure() ) {
239 ATH_MSG_ERROR( "Could not initialize LArShapeComplete data object - exit!" ) ;
240 return sc ;
241 }
242
243 ATH_MSG_DEBUG("Working on Shape container '"<< m_keyShape << "' new container will be '" << m_keyShape_new << "'");
244 int count = 0;
245 for(unsigned int gain = CaloGain::LARHIGHGAIN; gain < CaloGain::LARNGAIN; ++gain) {
248 for(; it!=it_e;++it){
249
251 const HWIdentifier id = it.channelId() ;
252 const int nPhases=shape.shapeSize();
253 if (nPhases==0) {
254 ATH_MSG_DEBUG("Got empty Shape object for channel " << m_onlineID->channel_name(id) << " (disconnected?)");
255 continue;
256 }
257 count++;
258
259 std::size_t phase=std::min(m_defaultPhase,nPhases-1);
260 if(m_inputPhase) {
261 const int p = m_inputPhase->bin(id, gain);
262 if (p>0 && p<nPhases) phase=p;
263 }
264
265 ATH_MSG_VERBOSE("Shape picking, gain=" << gain << ", channel " << m_onlineID->channel_name(id) << ", phase=" << phase);
266 ILArShape::ShapeRef_t vShape = shape.shape(phase);
267 ILArShape::ShapeRef_t vShapeDer = shape.shapeDer(phase);
268 const float timeOffset=shape.timeOffset();
269 //some sanity check on the Shapes
270 if ( vShape.size() == 0 || vShapeDer.size() == 0 ) {
271 ATH_MSG_WARNING( "Shape not found for gain "<< gain << " channel " << m_onlineID->channel_name(id) );
272 } else if ( vShape.size() != vShapeDer.size() ) {
273 ATH_MSG_WARNING( "Shape a (" << vShape.size() << ") and b (" << vShapeDer.size() << ") are not the same size for channel"
274 << m_onlineID->channel_name(id) );
275 ATH_MSG_WARNING( "Will be not exported !!!" );
276 } else { // save in new container
277 std::vector<std::vector<float> > shapeDer;
278 std::vector<std::vector<float> > shapeAmpl;
279 shapeAmpl.push_back(vShape.asVector());
280 shapeDer.push_back(vShapeDer.asVector());
281 larShapeComplete->set(id,(int)gain,shapeAmpl,shapeDer,timeOffset,25.); //There is no sensible time-bin width for single-phase OFCs 25 seems to make the most sense...
282 }
283 }
284 }
285
286 ATH_MSG_DEBUG(" Selected shapes for " << count << " cells");
287
288 sc = detStore()->record(std::move(larShapeComplete), m_keyShape_new);
289 if (sc.isFailure()) {
290 ATH_MSG_ERROR( "Failed to record LArShapeComplete object with key " << m_keyShape_new );
291 return sc;
292 }
294 if (sc.isFailure()) {
295 ATH_MSG_ERROR( "Failed to sym-link LArShapeComplete object" );
296 return sc;
297 }
298
299 return StatusCode::SUCCESS;
300
301}
302
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#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)
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
MsgStream & msg() const
LArVectorProxy OFCRef_t
This class defines the interface for accessing Optimal Filtering coefficients for each channel provid...
Definition ILArOFC.h:26
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 ILArOFC interface.
const float & getW(const HWIdentifier &chid) const
std::string m_keyShape_new
std::string m_keyPhase
const LArOFCBinComplete * m_inputPhase
SG::ReadCondHandleKey< LArOFCweightSC > m_ofcWKey
LArOFPhasePicker(const std::string &name, ISvcLocator *pSvcLocator)
std::string m_groupingName
const LArOnlineID_Base * m_onlineID
std::string m_keyShape
std::string m_keyOFC_new
StatusCode initialize()
Helper for the Liquid Argon Calorimeter cell identifiers.
This class implements the ILArShape interface.
std::vector< value_type > asVector() const
Convert back to a vector.
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
-event-from-file