ATLAS Offline Software
Loading...
Searching...
No Matches
LArDigitOscillationCorrTool Class Reference

#include <LArDigitOscillationCorrTool.h>

Inheritance diagram for LArDigitOscillationCorrTool:
Collaboration diagram for LArDigitOscillationCorrTool:

Public Member Functions

 LArDigitOscillationCorrTool (const std::string &type, const std::string &name, const IInterface *parent)
 ~LArDigitOscillationCorrTool ()=default
virtual StatusCode initialize () override
virtual void handle (const Incident &) override
StatusCode calculateEventPhase (const LArDigitContainer &theDC) override
StatusCode correctLArDigits (LArDigitContainer &theDC) override

Private Member Functions

StatusCode retrieveDB ()

Private Attributes

int m_priority
double m_nSigma
double m_eventPhase
double m_omega
const LArEM_IDm_emId {}
const LArFCAL_IDm_fcalId {}
const LArHEC_IDm_hecId {}
const LArOnlineIDm_lar_on_id {}
SG::ReadCondHandleKey< LArOnOffIdMappingm_cablingKey {this, "OnOffMap", "LArOnOffIdMap", "SG key for mapping object"}

Detailed Description

Definition at line 30 of file LArDigitOscillationCorrTool.h.

Constructor & Destructor Documentation

◆ LArDigitOscillationCorrTool()

LArDigitOscillationCorrTool::LArDigitOscillationCorrTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 27 of file LArDigitOscillationCorrTool.cxx.

30 : base_class(type, name, parent),
31 m_priority(1400),
32 m_nSigma(3.0),
33 m_eventPhase(0),
34 m_omega(1.024e6*hertz)
35{
36 declareProperty("BeginRunPriority",m_priority);
37 declareProperty("SignalCutInSigma",m_nSigma);
38 declareProperty("Omega",m_omega);
39}

◆ ~LArDigitOscillationCorrTool()

LArDigitOscillationCorrTool::~LArDigitOscillationCorrTool ( )
default

Member Function Documentation

◆ calculateEventPhase()

StatusCode LArDigitOscillationCorrTool::calculateEventPhase ( const LArDigitContainer & theDC)
override

Definition at line 65 of file LArDigitOscillationCorrTool.cxx.

66{
67 ATH_MSG_DEBUG ( "In execute: calculate event phase" );
68
69 //Pointer to conditions data objects to get pedetestals
70 ATH_MSG_DEBUG ( "Retrieving pedestal " );
71 const ILArPedestal* larPedestal=nullptr;
72 ATH_CHECK( detStore()->retrieve(larPedestal) );
73
74 //Pointer to conditions data objects to get channel phases
75 ATH_MSG_DEBUG ( "Retrieving channel phases and amplituides " );
76 const ILArH6Oscillation* larH6Oscillations = nullptr;
77 ATH_CHECK( detStore()->retrieve(larH6Oscillations) );
78 unsigned int iHECChan(0);
79 std::vector<std::vector<short> > theSamples;
80 std::vector<float> thePedestals;
81 std::vector<double> theChannelAmplitudes;
82 std::vector<double> theChannelPhases;
83 std::vector<float> theRMSValues;
84
85 //Now all data is available, start loop over Digit Container
86 ATH_MSG_DEBUG ( "Loop over Digit Container with size <" << theDC.size() << ">" );
87
88 SG::ReadCondHandle<LArOnOffIdMapping> cablingHdl{m_cablingKey};
89 const LArOnOffIdMapping* cabling{*cablingHdl};
90 if(!cabling) {
91 ATH_MSG_ERROR("Do not have mapping object " << m_cablingKey.key() );
92 return StatusCode::FAILURE;
93 }
94
95
96 for (unsigned int i=0;i<theDC.size();i++) {
97 //Get data from LArDigit
98 const LArDigit *theDigit = theDC[i];
99 const std::vector<short>& samples = theDigit->samples();
100 const HWIdentifier chid = theDigit->channelID();
101 const CaloGain::CaloGain gain = theDigit->gain();
102
103 // use only HEC channels
104 const Identifier id = cabling->cnvToIdentifier(chid);
105 bool isHEC = false;
106
107 if (m_hecId->is_lar_hec(id)) {
108 isHEC = true;
109 }
110
111 if ( isHEC) {
112 float DBpedestalRMS=larPedestal->pedestalRMS(chid,gain);
113 if (DBpedestalRMS <= (1.0+LArElecCalib::ERRORCODE)) {
114 ATH_MSG_DEBUG ( "No pedestal RMS found for this cell. Exiting ...." );
115 return StatusCode::FAILURE;
116 }
117 const double& DBchannelPhase=larH6Oscillations->channelPhase(chid);
118 const double& DBchannelAmplitude=larH6Oscillations->channelAmplitude(chid);
119
120 if( DBpedestalRMS > 0 && DBchannelAmplitude>0 ) {
121 theRMSValues.push_back(DBpedestalRMS);
122 theSamples.push_back(samples);
123 theChannelPhases.push_back(DBchannelPhase);
124 theChannelAmplitudes.push_back(DBchannelAmplitude);
125 float DBpedestal=larPedestal->pedestal(chid,gain);
126 if (DBpedestal >= (1.0+LArElecCalib::ERRORCODE))
127 thePedestals.push_back(DBpedestal);
128 else {
129 ATH_MSG_DEBUG ( "No valid pedestal found for this cell. Exiting ...." );
130 return StatusCode::FAILURE;
131 }
132 iHECChan++;
133 }
134 }
135 }
136
137 ATH_MSG_DEBUG ( "Start calculating the event phase" );
138 double lchimin = -1;
139 int nTotSamples = 0;
140 for(double myEventPhase = -M_PI; myEventPhase<M_PI; myEventPhase+=0.1) {
141 double lchitest = 0;
142 for (unsigned int i=0;i<iHECChan;i++) {
143 unsigned int nSamples = theSamples[i].size();
144 for(unsigned int j=0;j<nSamples;j++) {
145 // exclude all samples (and the previous and next sample) which
146 //have more than nSigma worth of absolute signal
147 if ( j == 0 || (std::abs(theSamples[i][j] - theSamples[i][0]) <= m_nSigma*theRMSValues[i]
148 && ( j <= 0 || std::abs(theSamples[i][j-1] - theSamples[i][0]) <= m_nSigma*theRMSValues[i])
149 && ( j >= nSamples-1 || std::abs(theSamples[i][j+1] - theSamples[i][0]) <= m_nSigma*theRMSValues[i])) ) {
150
151 if ( lchimin < 0 )
152 nTotSamples ++;
153 lchitest += pow((theSamples[i][j] - thePedestals[i]
154 - theChannelAmplitudes[i]*sin(j*25*ns*m_omega
155 +theChannelPhases[i]+myEventPhase))
156 /theRMSValues[i],2);
157 }
158 }
159 }
160 if ( lchitest < lchimin || lchimin < 0 ) {
161 lchimin = lchitest;
162 m_eventPhase = myEventPhase;
163 }
164 }
165
166 ATH_MSG_DEBUG ( "Ending eventphase calculation. Phase = <" << m_eventPhase << ">, Number of Channels used = <" << iHECChan << ">, Average Number of Samples Used = <"
167 << (iHECChan > 0 ? (double)nTotSamples/iHECChan : 0)
168 << ">" );
169 return StatusCode::SUCCESS;
170}
#define M_PI
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
constexpr int pow(int base, int exp) noexcept
size_type size() const noexcept
Returns the number of elements in the collection.
virtual const double & channelPhase(const HWIdentifier &id) const =0
virtual const double & channelAmplitude(const HWIdentifier &id) const =0
access to channel amplitude index by Identifier
virtual float pedestal(const HWIdentifier &id, int gain) const =0
virtual float pedestalRMS(const HWIdentifier &id, int gain) const =0
access to RMS of Pedestal index by Identifier, and gain setting
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
CaloGain::CaloGain gain() const
Definition LArDigit.h:72
const std::vector< short > & samples() const
Definition LArDigit.h:78
const HWIdentifier & channelID() const
Definition LArDigit.h:69
retrieve(aClass, aKey=None)
Definition PyKernel.py:110

◆ correctLArDigits()

StatusCode LArDigitOscillationCorrTool::correctLArDigits ( LArDigitContainer & theDC)
override

Definition at line 173 of file LArDigitOscillationCorrTool.cxx.

174{
175 ATH_MSG_DEBUG ( "In execute: correct LAr Digit" );
176
177 //Pointer to conditions data objects to get channel phases
178 const ILArH6Oscillation* larH6Oscillations = nullptr;
179 ATH_CHECK( detStore()->retrieve(larH6Oscillations) );
180
181 std::vector<double> theChannelAmplitudes;
182 std::vector<double> theChannelPhases;
183
184 //Now all data is available, start loop over Digit Container
185 ATH_MSG_DEBUG ( "Loop over Digit Container " );
186
187 SG::ReadCondHandle<LArOnOffIdMapping> cablingHdl{m_cablingKey};
188 const LArOnOffIdMapping* cabling{*cablingHdl};
189 if(!cabling) {
190 ATH_MSG_ERROR("Do not have mapping object " << m_cablingKey.key() );
191 return StatusCode::FAILURE;
192 }
193
194 for (unsigned int i=0;i<theDC.size();i++) {
195 //Get data from LArDigit
196 LArDigit * theDigit = theDC[i];
197 const std::vector<short>& samples = theDigit->samples();
198 unsigned int nSamples = samples.size();
199 const HWIdentifier chid = theDigit->channelID();
200 const CaloGain::CaloGain gain = theDigit->gain();
201
202 // correct only HEC channels
203 const Identifier id = cabling->cnvToIdentifier(chid);
204 bool isHEC = false;
205
206 if (m_hecId->is_lar_hec(id)) {
207 isHEC = true;
208 }
209
210 if ( isHEC) {
211 const double& DBchannelPhase=larH6Oscillations->channelPhase(chid);
212 const double& DBchannelAmplitude=larH6Oscillations->channelAmplitude(chid);
213 ATH_MSG_DEBUG ( "The HWId is " << chid
214 << ", the offline Id is " << m_hecId->show_to_string(id,nullptr,'/')
215 << ", the ChannelAmplitude is " << DBchannelAmplitude
216 << ", the ChannelPhase is " << DBchannelPhase );
217 ATH_MSG_DEBUG ( "m_omega value is " << m_omega );
218 if( DBchannelAmplitude>0 ) {
219 std::vector<short> new_samples(nSamples);
220 for(unsigned int j=0;j<nSamples;j++)
221 new_samples[j] = (short)(samples[j] + 0.5
222 - DBchannelAmplitude*sin(j*25*ns*m_omega+DBchannelPhase+m_eventPhase));
223 HWIdentifier new_id(chid);
224 CaloGain::CaloGain new_gain(gain);
225 LArDigit * theNewDigit = new LArDigit(new_id,new_gain,new_samples);
226 theDC[i] = theNewDigit;
227 }
228 }
229 }
230 return StatusCode::SUCCESS;
231}

◆ handle()

void LArDigitOscillationCorrTool::handle ( const Incident & )
overridevirtual

Definition at line 234 of file LArDigitOscillationCorrTool.cxx.

235{
236 ATH_MSG_DEBUG ( "LArDigitOscillationCorrTool handle()" );
237
238 this->retrieveDB().ignore();
239}

◆ initialize()

StatusCode LArDigitOscillationCorrTool::initialize ( )
overridevirtual

Definition at line 41 of file LArDigitOscillationCorrTool.cxx.

42{
43 ATH_MSG_DEBUG ( "LArDigitOscillationCorrTool initialize() begin" );
44
45 ATH_CHECK( detStore()->retrieve(m_lar_on_id,"LArOnlineID") );
46
47 const CaloCell_ID* idHelper = nullptr;
48 ATH_CHECK( detStore()->retrieve (idHelper, "CaloCell_ID") );
49 m_emId = idHelper->em_idHelper();
50 m_fcalId = idHelper->fcal_idHelper();
51 m_hecId = idHelper->hec_idHelper();
52
53 ATH_CHECK( m_cablingKey.initialize() );
54
55 SmartIF<IIncidentSvc> incSvc{Gaudi::svcLocator()->service("IncidentSvc")};
56 ATH_CHECK(incSvc.isValid());
57
58 //start listening to "BeginRun"
59 incSvc->addListener(this, "BeginRun", m_priority);
60
61 ATH_MSG_DEBUG ( "LArDigitOscillationCorrTool initialize() end" );
62 return StatusCode::SUCCESS;
63}
const LArFCAL_ID * fcal_idHelper() const
access to FCAL idHelper
Definition CaloCell_ID.h:75
const LArEM_ID * em_idHelper() const
access to EM idHelper
Definition CaloCell_ID.h:63
const LArHEC_ID * hec_idHelper() const
access to HEC idHelper
Definition CaloCell_ID.h:69

◆ retrieveDB()

StatusCode LArDigitOscillationCorrTool::retrieveDB ( )
private

Definition at line 242 of file LArDigitOscillationCorrTool.cxx.

243{
244 ATH_MSG_DEBUG ( "in retrieveDB() " );
245 return StatusCode::SUCCESS;
246}

Member Data Documentation

◆ m_cablingKey

SG::ReadCondHandleKey<LArOnOffIdMapping> LArDigitOscillationCorrTool::m_cablingKey {this, "OnOffMap", "LArOnOffIdMap", "SG key for mapping object"}
private

Definition at line 62 of file LArDigitOscillationCorrTool.h.

62{this, "OnOffMap", "LArOnOffIdMap", "SG key for mapping object"};

◆ m_emId

const LArEM_ID* LArDigitOscillationCorrTool::m_emId {}
private

Definition at line 57 of file LArDigitOscillationCorrTool.h.

57{};

◆ m_eventPhase

double LArDigitOscillationCorrTool::m_eventPhase
private

Definition at line 54 of file LArDigitOscillationCorrTool.h.

◆ m_fcalId

const LArFCAL_ID* LArDigitOscillationCorrTool::m_fcalId {}
private

Definition at line 58 of file LArDigitOscillationCorrTool.h.

58{};

◆ m_hecId

const LArHEC_ID* LArDigitOscillationCorrTool::m_hecId {}
private

Definition at line 59 of file LArDigitOscillationCorrTool.h.

59{};

◆ m_lar_on_id

const LArOnlineID* LArDigitOscillationCorrTool::m_lar_on_id {}
private

Definition at line 60 of file LArDigitOscillationCorrTool.h.

60{};

◆ m_nSigma

double LArDigitOscillationCorrTool::m_nSigma
private

Definition at line 53 of file LArDigitOscillationCorrTool.h.

◆ m_omega

double LArDigitOscillationCorrTool::m_omega
private

Definition at line 55 of file LArDigitOscillationCorrTool.h.

◆ m_priority

int LArDigitOscillationCorrTool::m_priority
private

Definition at line 52 of file LArDigitOscillationCorrTool.h.


The documentation for this class was generated from the following files: