ATLAS Offline Software
Loading...
Searching...
No Matches
LArOFCtoOFC.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "LArOFCtoOFC.h"
11
13
14#include "Gaudi/Property.h"
15
16
17
18LArOFCtoOFC::LArOFCtoOFC( const std::string& name,
19 ISvcLocator* pSvcLocator ) :
20 ::AthAlgorithm( name, pSvcLocator )
21{
22 //
23 // Property declaration
24 //
25 declareProperty("inKey",m_inKey="LArOFC_4_3_picked");
26 declareProperty("inShapeKey",m_inShapeKey="LArShape_4_3_picked");
27 declareProperty("outKey",m_outKey="LArOFC");
28 declareProperty("outShapeKey",m_outShapeKey="LArShape");
29 declareProperty("ShiftHEC",m_HECshift=true);
30 declareProperty("doShape",m_doShape=false);
31 declareProperty("NullsAdded",m_numAdd=1);
32
33
34
35}
36
37
39{
40 ATH_MSG_DEBUG ("in stop " << name() << "...");
41
42
43 //Retrieve OFC computed
44 const LArOFCComplete* cellOFC = nullptr;
45 CHECK(detStore()->retrieve(cellOFC,m_inKey));
46
47 //Retrieve online id
48 const LArOnlineID* onlID = nullptr;
49 CHECK(detStore()->retrieve(onlID));
50
51 //Retrieve shape
52 const LArShapeComplete* cellShape = nullptr;
53 if(m_doShape) {
54 CHECK(detStore()->retrieve(cellShape,m_inShapeKey));
55 }
56
57 std::unique_ptr<LArOFCComplete> ofc_cont(new LArOFCComplete());
59 ATH_CHECK( ofc_cont->initialize() );
60
61 //LArShapeComplete *shape_cont = nullptr;
62 std::unique_ptr<LArShapeComplete> shape_cont;
63 if(m_doShape) {
64 shape_cont = std::unique_ptr<LArShapeComplete>(new LArShapeComplete());
65 shape_cont->setGroupingType(LArConditionsContainerBase::ExtendedSubDetGrouping);
66 ATH_CHECK( shape_cont->initialize() );
67 }
68
69 unsigned count=0;
70 for(unsigned int gain = CaloGain::LARHIGHGAIN; gain < CaloGain::LARNGAIN; ++gain) {
73 for(; it!=it_e;++it){
75 const HWIdentifier id = it.channelId() ;
76 const int nPhases=ofc.OFC_aSize();
77 const float timeOffset=ofc.timeOffset();
78 const float timeBinWidth=ofc.timeBinWidth();
79 if (nPhases==0) {
80 ATH_MSG_DEBUG("Got empty OFC object for channel " << onlID->channel_name(id) << " (disconnected?)");
81 continue;
82 }
83 count++;
84
85 std::vector<std::vector<float> > OFC_a;
86 std::vector<std::vector<float> > OFC_b;
87 for(int phase=0; phase<nPhases; ++phase) {
88 ILArOFC::OFCRef_t vOFC_a = ofc.OFC_a(phase);
89 ILArOFC::OFCRef_t vOFC_b = ofc.OFC_b(phase);
90 //some sanity check on the OFCs
91 if ( vOFC_a.size() == 0 || vOFC_b.size() == 0 ) { // no OFCs
92 ATH_MSG_WARNING( "OFC not found for gain "<< gain << " channel " << onlID->channel_name(id) );
93 }else if ( vOFC_a.size() != vOFC_b.size() ) { // different size of OFCs
94 ATH_MSG_WARNING( "OFC a (" << vOFC_a.size() << ") and b (" << vOFC_b.size() << ") are not the same size for channel " << onlID->channel_name(id) );
95 ATH_MSG_WARNING( "Will be not exported !!!" );
96 } else { // we have OFCs
97 if(m_numAdd > 0) { // save in new container, adding 0 appropriatly
98 std::vector<float> newOFCa=vOFC_a.asVector();
99 std::vector<float> newOFCb=vOFC_b.asVector();
100 if(m_HECshift && onlID->isHECchannel(id)) { // in this case put 0 to front
101 for(unsigned i=0; i<m_numAdd; ++i) {
102 newOFCa.insert(newOFCa.begin(),0.);
103 newOFCb.insert(newOFCb.begin(),0.);
104 }
105 } else { // standartly put 0. at the end
106 newOFCa.resize(newOFCa.size()+m_numAdd, 0.);
107 newOFCb.resize(newOFCb.size()+m_numAdd, 0.);
108 }
109
110 OFC_a.push_back(std::move(newOFCa));
111 OFC_b.push_back(std::move(newOFCb));
112 } else { // Not null adding, but cloning the EMBPS medium gain to low gain ones
113 if( (!onlID->isEMBPS(id)) || gain != CaloGain::LARMEDIUMGAIN ) continue;
114 OFC_a.push_back(vOFC_a.asVector());
115 OFC_b.push_back(vOFC_b.asVector());
116
117 }
118 }
119 } // over phases
120 if(m_numAdd > 0) ofc_cont->set(id,(int)gain,OFC_a,OFC_b,timeOffset,timeBinWidth);
121 else if(!OFC_a.empty()) ofc_cont->set(id,CaloGain::LARLOWGAIN,OFC_a,OFC_b,timeOffset,timeBinWidth);
122 } // over channels
123
124 if(m_doShape) { // if also shape needed
127 for(; its!=its_e;++its){
129 const HWIdentifier id = its.channelId() ;
130 const int nPhases=shape.shapeSize();
131 const float timeOffset=shape.timeOffset();
132 const float timeBinWidth=shape.timeBinWidth();
133 if (nPhases==0) {
134 ATH_MSG_DEBUG("Got empty Shape object for channel " << onlID->channel_name(id) << " (disconnected?)");
135 continue;
136 }
137
138 std::vector<std::vector<float> > Shape;
139 std::vector<std::vector<float> > ShapeDer;
140 for(int phase=0; phase<nPhases; ++phase) {
141 ILArShape::ShapeRef_t vShape = shape.shape(phase);
142 ILArShape::ShapeRef_t vShapeDer = shape.shapeDer(phase);
143 //some sanity check
144 if ( vShape.size() == 0 || vShapeDer.size() == 0 ) {
145 ATH_MSG_WARNING( "Shape not found for gain "<< gain << " channel " << onlID->channel_name(id) );
146 }else if ( vShape.size() != vShapeDer.size() ) {
147 ATH_MSG_WARNING( "Shape (" << vShape.size() << ") and ShapeDer (" << vShapeDer.size() << ") are not the same size for channel " << onlID->channel_name(id) );
148 ATH_MSG_WARNING( "Will be not exported !!!" );
149 } else {
150 if(m_numAdd > 0) {// save in new container, adding 0 appropriatly
151 std::vector<float> newShape=vShape.asVector();
152 std::vector<float> newShapeDer=vShapeDer.asVector();
153 if(m_HECshift && onlID->isHECchannel(id)) { // in this case put 0 to front
154 for(unsigned i=0; i<m_numAdd; ++i) {
155 newShape.insert(newShape.begin(),0.);
156 newShapeDer.insert(newShapeDer.begin(),0.);
157 }
158 } else { // standartly put 0. at the end
159 newShape.resize(newShape.size()+m_numAdd, 0.);
160 newShapeDer.resize(newShapeDer.size()+m_numAdd, 0.);
161 }
162
163 Shape.push_back(std::move(newShape));
164 ShapeDer.push_back(std::move(newShapeDer));
165 } else { // not nulls, but copying the medium PS gain to low gain
166 if( (!onlID->isEMBPS(id)) || gain != CaloGain::LARMEDIUMGAIN ) continue;
167 Shape.push_back(vShape.asVector());
168 ShapeDer.push_back(vShapeDer.asVector());
169 }
170 }
171 } // over phases
172 if(m_numAdd > 0) {
173 shape_cont->set(id,(int)gain,Shape,ShapeDer,timeOffset,timeBinWidth);
174 } else {
175 if(!Shape.empty()) shape_cont->set(id,CaloGain::LARLOWGAIN,Shape,ShapeDer,timeOffset,timeBinWidth);
176 }
177 } // over channels
178 } // if m_doShape
179
180 } // over gains
181
182 ATH_MSG_INFO( "Total number of Cell x gains:" << count );
183 LArOFCComplete *ofcptr = ofc_cont.get();
184 CHECK(detStore()->record(std::move(ofc_cont),m_outKey));
185 CHECK(detStore()->symLink(ofcptr,dynamic_cast<ILArOFC*>(ofcptr)));
186 if(m_doShape){
187 LArShapeComplete *shapeptr = shape_cont.get();
188 CHECK(detStore()->record(std::move(shape_cont),m_outShapeKey));
189 CHECK(detStore()->symLink(shapeptr,dynamic_cast<ILArShape*>(shapeptr)));
190 }
191
192 return StatusCode::SUCCESS;
193}
194
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
Defines a common ERRORCODE enum for LAr-Calibration objects.
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 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
float timeBinWidth() const
Return the time bin width for this channel.
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.
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.
LArOFCtoOFC()
Default constructor:
bool m_HECshift
Definition LArOFCtoOFC.h:42
std::string m_inKey
Definition LArOFCtoOFC.h:38
unsigned m_numAdd
Definition LArOFCtoOFC.h:44
std::string m_outKey
Definition LArOFCtoOFC.h:40
std::string m_outShapeKey
Definition LArOFCtoOFC.h:41
std::string m_inShapeKey
Definition LArOFCtoOFC.h:39
virtual StatusCode stop() override
std::string channel_name(const HWIdentifier id) const
Return a string corresponding to a feedthrough name given an identifier.
bool isEMBPS(const HWIdentifier id) const
bool isHECchannel(const HWIdentifier id) const override final
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
@ LARMEDIUMGAIN
Definition CaloGain.h:18
@ LARLOWGAIN
Definition CaloGain.h:18
@ LARNGAIN
Definition CaloGain.h:19
@ LARHIGHGAIN
Definition CaloGain.h:18