ATLAS Offline Software
LArOFPhasePicker.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
10 
13 
14 LArOFPhasePicker::LArOFPhasePicker(const std::string& name, ISvcLocator* pSvcLocator) :
15  AthAlgorithm(name, pSvcLocator),
16  m_inputPhase(nullptr),
17  m_onlineID(nullptr),
18  m_groupingType(LArConditionsContainerBase::Unknown)
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 ) {
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 = (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 = (const LArOnlineID_Base*)ll;
79  ATH_MSG_DEBUG(" Found the LArOnlineID helper. ");
80  }
81  }
82 
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()) {
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) {
114  ATH_CHECK(pickOFC());
115  }
116 
117  if (m_doShape) {
118  ATH_CHECK(pickShape());
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 );
130  ATH_MSG_INFO(detStore()->dump());
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 
LArConditionsContainerBase::SuperCells
@ SuperCells
Definition: LArConditionsContainerBase.h:51
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
ReadOfcFromCool.phase
phase
Definition: ReadOfcFromCool.py:127
LArOFPhasePicker::initialize
StatusCode initialize()
Definition: LArOFPhasePicker.cxx:36
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
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
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
LArConditionsContainerBase::SingleGroup
@ SingleGroup
Definition: LArConditionsContainerBase.h:46
LArOFCBinComplete::bin
virtual const int & bin(const HWIdentifier &chid, const int &gain) const
Definition: LArOFCBinComplete.h:19
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
LArOFPhasePicker::m_timeOffsetCorr
int m_timeOffsetCorr
Definition: LArOFPhasePicker.h:55
LArConditionsContainerDB::iteratorT
Declaration of const iterator.
Definition: LArConditionsContainerDB.h:72
LArOFPhasePicker::m_keyShape_new
std::string m_keyShape_new
Definition: LArOFPhasePicker.h:50
LArOFPhasePicker::m_doShape
bool m_doShape
Definition: LArOFPhasePicker.h:57
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
skel.it
it
Definition: skel.GENtoEVGEN.py:423
LArOFPhasePicker::m_onlineID
const LArOnlineID_Base * m_onlineID
Definition: LArOFPhasePicker.h:42
LArOFPhasePicker::pickOFC
StatusCode pickOFC()
Definition: LArOFPhasePicker.cxx:124
LArShapeComplete
This class implements the ILArShape interface.
Definition: LArShapeComplete.h:26
LArOFPhasePicker::~LArOFPhasePicker
~LArOFPhasePicker()
LArShapeComplete.h
LArOFPhasePicker::m_keyShape
std::string m_keyShape
Definition: LArOFPhasePicker.h:49
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
HWIdentifier
Definition: HWIdentifier.h:13
CaloGain::LARNGAIN
@ LARNGAIN
Definition: CaloGain.h:19
LArOFPhasePicker::m_keyOFC
std::string m_keyOFC
Definition: LArOFPhasePicker.h:47
XMLtoHeader.count
count
Definition: XMLtoHeader.py:85
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
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
LArOFPhasePicker::m_inputPhase
const LArOFCBinComplete * m_inputPhase
Definition: LArOFPhasePicker.h:41
LArOFPhasePicker::execute
StatusCode execute()
Definition: LArOFPhasePicker.cxx:88
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LArConditionsContainerBase::GroupingType
GroupingType
Grouping type.
Definition: LArConditionsContainerBase.h:44
LArConditionsContainer::end
ConstConditionsMapIterator end(unsigned int gain) const
end of all channels for this gain
LArOFCBinComplete.h
LArOFCComplete.h
LArOFPhasePicker::pickShape
StatusCode pickShape()
Definition: LArOFPhasePicker.cxx:224
LArOnlineID_Base::isHECchannel
virtual bool isHECchannel(const HWIdentifier id) const =0
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
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
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
LArOFPhasePicker::LArOFPhasePicker
LArOFPhasePicker(const std::string &name, ISvcLocator *pSvcLocator)
Definition: LArOFPhasePicker.cxx:14
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
min
#define min(a, b)
Definition: cfImp.cxx:40
LArOFPhasePicker::m_groupingName
std::string m_groupingName
Definition: LArOFPhasePicker.h:52
LArOnlineID_Base
Helper for the Liquid Argon Calorimeter cell identifiers.
Definition: LArOnlineID_Base.h:105
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
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArOnlineID
Definition: LArOnlineID.h:20
LArConditionsContainerBase::ExtendedFTGrouping
@ ExtendedFTGrouping
Definition: LArConditionsContainerBase.h:49
LArOFPhasePicker::m_doOFC
bool m_doOFC
Definition: LArOFPhasePicker.h:57
CaloGain::LARHIGHGAIN
@ LARHIGHGAIN
Definition: CaloGain.h:18
LArOnline_SuperCellID
Definition: LArOnline_SuperCellID.h:20
LArOFPhasePicker::stop
StatusCode stop()
Definition: LArOFPhasePicker.cxx:95
LArOFPhasePicker::m_keyPhase
std::string m_keyPhase
Definition: LArOFPhasePicker.h:51
LArOFPhasePicker::m_groupingType
int m_groupingType
Definition: LArOFPhasePicker.h:54
LArOFPhasePicker::m_ofcWKey
SG::ReadCondHandleKey< LArOFCweightSC > m_ofcWKey
Definition: LArOFPhasePicker.h:44
LArOFCweightSC
Definition: LArOFCweightSC.h:16
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
LArOFCweightSC::getW
const float & getW(const HWIdentifier &chid) const
Definition: LArOFCweightSC.cxx:24
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
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.
LArOFPhasePicker::m_defaultPhase
int m_defaultPhase
Definition: LArOFPhasePicker.h:56
LArOnline_SuperCellID.h
LArOFPhasePicker::m_keyOFC_new
std::string m_keyOFC_new
Definition: LArOFPhasePicker.h:48
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
FourMomUtils::dump
std::ostream & dump(std::ostream &out, const I4MomIter iBeg, const I4MomIter iEnd)
Helper to stream out a range of I4Momentum objects.
Definition: P4Dumper.h:24
ReadOfcFromCool.ofc
ofc
Definition: ReadOfcFromCool.py:110
LArConditionsContainerBase::FeedThroughGrouping
@ FeedThroughGrouping
Definition: LArConditionsContainerBase.h:48
LArOFPhasePicker::m_isSC
bool m_isSC
Definition: LArOFPhasePicker.h:58
LArOFPhasePicker.h
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
DiTauMassTools::TauTypes::ll
@ ll
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:49