ATLAS Offline Software
LArOFCtoOFC.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "LArOFCtoOFC.h"
11 
13 
14 #include "Gaudi/Property.h"
15 
16 
17 
18 LArOFCtoOFC::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  //Retrive 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());
58  ofc_cont->setGroupingType(LArConditionsContainerBase::ExtendedSubDetGrouping);
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(newOFCa);
111  OFC_b.push_back(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(newShape);
164  ShapeDer.push_back(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 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
ReadOfcFromCool.phase
phase
Definition: ReadOfcFromCool.py:127
LArConditionsContainerDB::iteratorT::channelId
HWIdentifier channelId() const
LArOFCComplete::set
void set(const HWIdentifier &CellID, int gain, const std::vector< std::vector< float > > &vOFC_a, const std::vector< std::vector< float > > &vOFC_b, float timeOffset=0, float timeBinWidth=25./24.)
Definition: LArOFCComplete.cxx:17
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArConditionsContainerBase::ExtendedSubDetGrouping
@ ExtendedSubDetGrouping
Definition: LArConditionsContainerBase.h:50
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArOFCtoOFC::m_HECshift
bool m_HECshift
Definition: LArOFCtoOFC.h:42
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:423
LArShapeComplete
This class implements the ILArShape interface.
Definition: LArShapeComplete.h:26
LArShapeComplete.h
LArOFCtoOFC::stop
virtual StatusCode stop() override
Definition: LArOFCtoOFC.cxx:38
HWIdentifier
Definition: HWIdentifier.h:13
CaloGain::LARNGAIN
@ LARNGAIN
Definition: CaloGain.h:19
LArOFCtoOFC::m_doShape
bool m_doShape
Definition: LArOFCtoOFC.h:43
LArCalibErrorCode.h
Defines a common ERRORCODE enum for LAr-Calibration objects.
LArOFCtoOFC::m_numAdd
unsigned m_numAdd
Definition: LArOFCtoOFC.h:44
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
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
LArConditionsContainer::end
ConstConditionsMapIterator end(unsigned int gain) const
end of all channels for this gain
lumiFormat.i
int i
Definition: lumiFormat.py:92
LArOFCtoOFC::m_inShapeKey
std::string m_inShapeKey
Definition: LArOFCtoOFC.h:39
LArOFCComplete.h
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
LArOFCtoOFC::m_outKey
std::string m_outKey
Definition: LArOFCtoOFC.h:40
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
ILArOFC
Definition: ILArOFC.h:14
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
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
errorcheck.h
Helpers for checking error return status codes and reporting errors.
LArOnlineID
Definition: LArOnlineID.h:20
CaloGain::LARHIGHGAIN
@ LARHIGHGAIN
Definition: CaloGain.h:18
LArOFCtoOFC.h
LArOFCtoOFC::m_inKey
std::string m_inKey
Definition: LArOFCtoOFC.h:38
CaloGain::LARMEDIUMGAIN
@ LARMEDIUMGAIN
Definition: CaloGain.h:18
LArOFCtoOFC::m_outShapeKey
std::string m_outShapeKey
Definition: LArOFCtoOFC.h:41
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< LArOFCP1 >::ConstReference
Subset::ConstReference ConstReference
Definition: LArConditionsContainer.h:80
LArOnlineID_Base::isEMBPS
bool isEMBPS(const HWIdentifier id) const
Definition: LArOnlineID_Base.cxx:1665
LArConditionsContainer::begin
ConstConditionsMapIterator begin(unsigned int gain) const
get iterator for all channels for a gain
LArVectorProxy::asVector
std::vector< value_type > asVector() const
Convert back to a vector.
LArOFCtoOFC::LArOFCtoOFC
LArOFCtoOFC()
Default constructor:
LArOnlineID::isHECchannel
bool isHECchannel(const HWIdentifier id) const override final
Definition: LArOnlineID.cxx:734
CaloGain::LARLOWGAIN
@ LARLOWGAIN
Definition: CaloGain.h:18
LArOnlineID_Base::channel_name
std::string channel_name(const HWIdentifier id) const
Return a string corresponding to a feedthrough name given an identifier.
Definition: LArOnlineID_Base.cxx:218
CaloGain.h
ILArShape
Definition: ILArShape.h:13
ReadOfcFromCool.ofc
ofc
Definition: ReadOfcFromCool.py:110
LArOFCComplete
This class implements the ILArOFC interface.
Definition: LArOFCComplete.h:25
LArOnlineID.h
LArVectorProxy
Proxy for accessing a range of float values like a vector.
Definition: LArVectorProxy.h:38