ATLAS Offline Software
LArDigitOscillationCorrTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "GaudiKernel/MsgStream.h"
8 #include "GaudiKernel/IIncidentSvc.h"
9 #include "CLHEP/Units/SystemOfUnits.h"
10 
15 
16 #include <sstream>
17 #include <iostream>
18 #include <fstream>
19 #include <iomanip>
20 #include <cmath>
21 
22 
23 using CLHEP::hertz;
24 using CLHEP::ns;
25 
26 
28  const std::string& name,
29  const IInterface* parent)
30  : AthAlgTool(type, name, parent) ,
31  m_priority(1400),
32  m_nSigma(3.0),
33  m_eventPhase(0),
34  m_omega(1.024e6*hertz),
35  m_emId(nullptr), m_fcalId(nullptr), m_hecId(nullptr), m_lar_on_id(nullptr)
36 {
37  declareInterface<ILArDigitOscillationCorrTool>(this);
38  declareProperty("BeginRunPriority",m_priority);
39  declareProperty("SignalCutInSigma",m_nSigma);
40  declareProperty("Omega",m_omega);
41 }
42 
44 {
45  ATH_MSG_DEBUG ( "LArDigitOscillationCorrTool initialize() begin" );
46 
47  ATH_CHECK( detStore()->retrieve(m_lar_on_id,"LArOnlineID") );
48 
49  const CaloCell_ID* idHelper = nullptr;
50  ATH_CHECK( detStore()->retrieve (idHelper, "CaloCell_ID") );
51  m_emId = idHelper->em_idHelper();
52  m_fcalId = idHelper->fcal_idHelper();
53  m_hecId = idHelper->hec_idHelper();
54 
56 
57  IIncidentSvc* incSvc = nullptr;
58  ATH_CHECK( service("IncidentSvc", incSvc) );
59 
60  //start listening to "BeginRun"
61  incSvc->addListener(this, "BeginRun", m_priority);
62 
63  ATH_MSG_DEBUG ( "LArDigitOscillationCorrTool initialize() end" );
64  return StatusCode::SUCCESS;
65 }
66 
68 {
69  ATH_MSG_DEBUG ( "In execute: calculate event phase" );
70 
71  //Pointer to conditions data objects to get pedetestals
72  ATH_MSG_DEBUG ( "Retrieving pedestal " );
73  const ILArPedestal* larPedestal=nullptr;
74  ATH_CHECK( detStore()->retrieve(larPedestal) );
75 
76  //Pointer to conditions data objects to get channel phases
77  ATH_MSG_DEBUG ( "Retrieving channel phases and amplituides " );
78  const ILArH6Oscillation* larH6Oscillations = nullptr;
79  ATH_CHECK( detStore()->retrieve(larH6Oscillations) );
80  unsigned int iHECChan(0);
81  std::vector<std::vector<short> > theSamples;
82  std::vector<float> thePedestals;
83  std::vector<double> theChannelAmplitudes;
84  std::vector<double> theChannelPhases;
85  std::vector<float> theRMSValues;
86 
87  //Now all data is available, start loop over Digit Container
88  ATH_MSG_DEBUG ( "Loop over Digit Container with size <" << theDC.size() << ">" );
89 
91  const LArOnOffIdMapping* cabling{*cablingHdl};
92  if(!cabling) {
93  ATH_MSG_ERROR("Do not have mapping object " << m_cablingKey.key() );
94  return StatusCode::FAILURE;
95  }
96 
97 
98  for (unsigned int i=0;i<theDC.size();i++) {
99  //Get data from LArDigit
100  const LArDigit *theDigit = theDC[i];
101  const std::vector<short>& samples = theDigit->samples();
102  const HWIdentifier chid = theDigit->channelID();
103  const CaloGain::CaloGain gain = theDigit->gain();
104 
105  // use only HEC channels
106  const Identifier id = cabling->cnvToIdentifier(chid);
107  bool isHEC = false;
108 
109  if (m_hecId->is_lar_hec(id)) {
110  isHEC = true;
111  }
112 
113  if ( isHEC) {
114  float DBpedestalRMS=larPedestal->pedestalRMS(chid,gain);
115  if (DBpedestalRMS <= (1.0+LArElecCalib::ERRORCODE)) {
116  ATH_MSG_DEBUG ( "No pedestal RMS found for this cell. Exiting ...." );
117  return StatusCode::FAILURE;
118  }
119  // log << MSG::DEBUG << "Retriving channelPhase " << endmsg;
120  const double& DBchannelPhase=larH6Oscillations->channelPhase(chid);
121  // log << MSG::DEBUG << "Retriving channelAmplitude " << endmsg;
122  const double& DBchannelAmplitude=larH6Oscillations->channelAmplitude(chid);
123 
124  if( DBpedestalRMS > 0 && DBchannelAmplitude>0 ) {
125  theRMSValues.push_back(DBpedestalRMS);
126  theSamples.push_back(samples);
127  theChannelPhases.push_back(DBchannelPhase);
128  theChannelAmplitudes.push_back(DBchannelAmplitude);
129  float DBpedestal=larPedestal->pedestal(chid,gain);
130  if (DBpedestal >= (1.0+LArElecCalib::ERRORCODE))
131  thePedestals.push_back(DBpedestal);
132  else {
133  ATH_MSG_DEBUG ( "No valid pedestal found for this cell. Exiting ...." );
134  return StatusCode::FAILURE;
135  }
136  iHECChan++;
137  }
138  }
139  }
140 
141  ATH_MSG_DEBUG ( "Start calculating the event phase" );
142  double lchimin = -1;
143  int nTotSamples = 0;
144  for(double myEventPhase = -M_PI; myEventPhase<M_PI; myEventPhase+=0.1) {
145  double lchitest = 0;
146  for (unsigned int i=0;i<iHECChan;i++) {
147  unsigned int nSamples = theSamples[i].size();
148  for(unsigned int j=0;j<nSamples;j++) {
149  // exclude all samples (and the previous and next sample) which
150  //have more than nSigma worth of absolute signal
151  if ( j == 0 || (std::abs(theSamples[i][j] - theSamples[i][0]) <= m_nSigma*theRMSValues[i]
152  && ( j <= 0 || std::abs(theSamples[i][j-1] - theSamples[i][0]) <= m_nSigma*theRMSValues[i])
153  && ( j >= nSamples-1 || std::abs(theSamples[i][j+1] - theSamples[i][0]) <= m_nSigma*theRMSValues[i])) ) {
154 
155  if ( lchimin < 0 )
156  nTotSamples ++;
157  lchitest += pow((theSamples[i][j] - thePedestals[i]
158  - theChannelAmplitudes[i]*sin(j*25*ns*m_omega
159  +theChannelPhases[i]+myEventPhase))
160  /theRMSValues[i],2);
161  }
162  }
163  }
164  if ( lchitest < lchimin || lchimin < 0 ) {
165  lchimin = lchitest;
166  m_eventPhase = myEventPhase;
167  }
168  }
169 
170  ATH_MSG_DEBUG ( "Ending eventphase calculation. Phase = <" << m_eventPhase << ">, Number of Channels used = <" << iHECChan << ">, Average Number of Samples Used = <"
171  << (iHECChan > 0 ? (double)nTotSamples/iHECChan : 0)
172  << ">" );
173  return StatusCode::SUCCESS;
174 }
175 
176 
178 {
179  ATH_MSG_DEBUG ( "In execute: correct LAr Digit" );
180 
181  //Pointer to conditions data objects to get channel phases
182  const ILArH6Oscillation* larH6Oscillations = nullptr;
183  ATH_CHECK( detStore()->retrieve(larH6Oscillations) );
184 
185  std::vector<double> theChannelAmplitudes;
186  std::vector<double> theChannelPhases;
187 
188  //Now all data is available, start loop over Digit Container
189  ATH_MSG_DEBUG ( "Loop over Digit Container " );
190 
192  const LArOnOffIdMapping* cabling{*cablingHdl};
193  if(!cabling) {
194  ATH_MSG_ERROR("Do not have mapping object " << m_cablingKey.key() );
195  return StatusCode::FAILURE;
196  }
197 
198  for (unsigned int i=0;i<theDC.size();i++) {
199  //Get data from LArDigit
200  LArDigit * theDigit = theDC[i];
201  const std::vector<short>& samples = theDigit->samples();
202  unsigned int nSamples = samples.size();
203  const HWIdentifier chid = theDigit->channelID();
204  const CaloGain::CaloGain gain = theDigit->gain();
205 
206  // correct only HEC channels
207  const Identifier id = cabling->cnvToIdentifier(chid);
208  bool isHEC = false;
209 
210  if (m_hecId->is_lar_hec(id)) {
211  isHEC = true;
212  }
213 
214  if ( isHEC) {
215  const double& DBchannelPhase=larH6Oscillations->channelPhase(chid);
216  const double& DBchannelAmplitude=larH6Oscillations->channelAmplitude(chid);
217  ATH_MSG_DEBUG ( "The HWId is " << chid
218  << ", the offline Id is " << m_hecId->show_to_string(id,nullptr,'/')
219  << ", the ChannelAmplitude is " << DBchannelAmplitude
220  << ", the ChannelPhase is " << DBchannelPhase );
221  ATH_MSG_DEBUG ( "m_omega value is " << m_omega );
222  if( DBchannelAmplitude>0 ) {
223  std::vector<short> new_samples(nSamples);
224  for(unsigned int j=0;j<nSamples;j++)
225  new_samples[j] = (short)(samples[j] + 0.5
226  - DBchannelAmplitude*sin(j*25*ns*m_omega+DBchannelPhase+m_eventPhase));
227  HWIdentifier new_id(chid);
228  CaloGain::CaloGain new_gain(gain);
229  LArDigit * theNewDigit = new LArDigit(new_id,new_gain,new_samples);
230  theDC[i] = theNewDigit;
231  }
232  }
233  }
234  return StatusCode::SUCCESS;
235 }
236 
237 
238 void LArDigitOscillationCorrTool::handle(const Incident& /* inc*/ )
239 {
240  ATH_MSG_DEBUG ( "LArDigitOscillationCorrTool handle()" );
241 
242  this->retrieveDB().ignore();
243 }
244 
245 // *** retrieve subfactors from the DB ***
247 {
248  ATH_MSG_DEBUG ( "in retrieveDB() " );
249  return StatusCode::SUCCESS;
250 }
251 
252 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
ILArPedestal::pedestal
virtual float pedestal(const HWIdentifier &id, int gain) const =0
LArDigitOscillationCorrTool::handle
virtual void handle(const Incident &)
Definition: LArDigitOscillationCorrTool.cxx:238
LArDigitOscillationCorrTool::m_priority
int m_priority
Definition: LArDigitOscillationCorrTool.h:62
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
LArDigitOscillationCorrTool::retrieveDB
StatusCode retrieveDB()
Definition: LArDigitOscillationCorrTool.cxx:246
CaloCell_ID::em_idHelper
const LArEM_ID * em_idHelper() const
access to EM idHelper
Definition: CaloCell_ID.h:63
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArDigitOscillationCorrTool::m_lar_on_id
const LArOnlineID * m_lar_on_id
Definition: LArDigitOscillationCorrTool.h:70
ILArPedestal
Definition: ILArPedestal.h:12
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
CaloCondBlobAlgs_fillNoiseFromASCII.gain
gain
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:110
ReadCellNoiseFromCool.cabling
cabling
Definition: ReadCellNoiseFromCool.py:154
LArDigit::samples
const std::vector< short > & samples() const
Definition: LArDigit.h:78
M_PI
#define M_PI
Definition: ActiveFraction.h:11
LArDigitOscillationCorrTool::LArDigitOscillationCorrTool
LArDigitOscillationCorrTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: LArDigitOscillationCorrTool.cxx:27
LArDigitOscillationCorrTool::m_hecId
const LArHEC_ID * m_hecId
Definition: LArDigitOscillationCorrTool.h:69
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
HWIdentifier
Definition: HWIdentifier.h:13
LArDigitOscillationCorrTool::m_eventPhase
double m_eventPhase
Definition: LArDigitOscillationCorrTool.h:64
LArDigitOscillationCorrTool::m_nSigma
double m_nSigma
Definition: LArDigitOscillationCorrTool.h:63
CaloCell_ID.h
CaloCell_ID::hec_idHelper
const LArHEC_ID * hec_idHelper() const
access to HEC idHelper
Definition: CaloCell_ID.h:69
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
python.SystemOfUnits.hertz
int hertz
Definition: SystemOfUnits.py:125
LArDigitOscillationCorrTool::calculateEventPhase
StatusCode calculateEventPhase(const LArDigitContainer &theDC)
Definition: LArDigitOscillationCorrTool.cxx:67
LArDigitOscillationCorrTool::m_fcalId
const LArFCAL_ID * m_fcalId
Definition: LArDigitOscillationCorrTool.h:68
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LArDigit
Liquid Argon digit base class.
Definition: LArDigit.h:25
lumiFormat.i
int i
Definition: lumiFormat.py:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
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
01SubmitToGrid.samples
samples
Definition: 01SubmitToGrid.py:58
LArDigitOscillationCorrTool::m_omega
double m_omega
Definition: LArDigitOscillationCorrTool.h:65
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AtlasDetectorID::is_lar_hec
bool is_lar_hec(Identifier id) const
Definition: AtlasDetectorID.h:829
CaloCell_ID
Helper class for offline cell identifiers.
Definition: CaloCell_ID.h:34
ILArH6Oscillation.h
LArDigitOscillationCorrTool::initialize
virtual StatusCode initialize()
Definition: LArDigitOscillationCorrTool.cxx:43
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
ILArH6Oscillation::channelAmplitude
virtual const double & channelAmplitude(const HWIdentifier &id) const =0
access to channel amplitude index by Identifier
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
LArDigitContainer.h
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
LArDigit::gain
CaloGain::CaloGain gain() const
Definition: LArDigit.h:72
LArDigitOscillationCorrTool::correctLArDigits
StatusCode correctLArDigits(LArDigitContainer &theDC)
Definition: LArDigitOscillationCorrTool.cxx:177
AtlasDetectorID::show_to_string
std::string show_to_string(Identifier id, const IdContext *context=0, char sep='.') const
or provide the printout in string form
Definition: AtlasDetectorID.cxx:574
ILArPedestal.h
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
ILArH6Oscillation::channelPhase
virtual const double & channelPhase(const HWIdentifier &id) const =0
LArDigitContainer
Container class for LArDigit.
Definition: LArDigitContainer.h:24
python.SystemOfUnits.ns
int ns
Definition: SystemOfUnits.py:130
LArDigit::channelID
const HWIdentifier & channelID() const
Definition: LArDigit.h:69
LArElecCalib::ERRORCODE
@ ERRORCODE
Definition: LArCalibErrorCode.h:17
LArDigits2NtupleDumper.nSamples
nSamples
Definition: LArDigits2NtupleDumper.py:70
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
AthAlgTool
Definition: AthAlgTool.h:26
LArDigitOscillationCorrTool::m_cablingKey
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Definition: LArDigitOscillationCorrTool.h:72
ILArH6Oscillation
Definition: ILArH6Oscillation.h:14
ILArPedestal::pedestalRMS
virtual float pedestalRMS(const HWIdentifier &id, int gain) const =0
access to RMS of Pedestal index by Identifier, and gain setting
LArDigitOscillationCorrTool.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
LArDigitOscillationCorrTool::m_emId
const LArEM_ID * m_emId
Definition: LArDigitOscillationCorrTool.h:67
CaloCell_ID::fcal_idHelper
const LArFCAL_ID * fcal_idHelper() const
access to FCAL idHelper
Definition: CaloCell_ID.h:75
LArOnOffIdMapping
Definition: LArOnOffIdMapping.h:20