lets store the floats in case we decide to do a float computation here in the future
56 {
57
59 unsigned int event_bcid = thisEvent->bcid();
60
61
62 SG::ReadHandle<LArDigitContainer> inputContainer(
m_digitKey,ctx);
63
64 SG::WriteHandle<LArRawSCContainer> outputContainerHdl(
m_larRawSCKey,ctx);
65 ATH_CHECK(outputContainerHdl.record(std::make_unique<LArRawSCContainer>()));
66 auto *outputContainer = outputContainerHdl.ptr();
68 outputContainer->reserve(inputContainer->size());
69 DataPool<LArRawSC> dataItemsPool(ctx);
70 dataItemsPool.reserve(inputContainer->size());
71
72
74 const LArPedestalSC* Peds=dynamic_cast<const LArPedestalSC*>(pedHdl.cptr());
75 if (!Peds) return StatusCode::FAILURE;
76
77 SG::ReadCondHandle<ILArOFC> ofcHdl(
m_keyOFCSC,ctx);
78 const LArOFCSC* OFCs=dynamic_cast<const LArOFCSC*>(ofcHdl.cptr());
79 if (!OFCs) return StatusCode::FAILURE;
80
81 SG::ReadCondHandle<ILArRamp> rampHdl(
m_keyRampSC,ctx);
82 const LArRampSC* Ramps=dynamic_cast<const LArRampSC*>(rampHdl.cptr());
83 if (!Ramps) return StatusCode::FAILURE;
84
86 const LArDAC2uASC* DAC2uAs=dynamic_cast<const LArDAC2uASC*>(dac2uaHdl.cptr());
87 if (!DAC2uAs) return StatusCode::FAILURE;
88
90 const LAruA2MeVSC* uA2MeVs=dynamic_cast<const LAruA2MeVSC*>(ua2mevHdl.cptr());
91 if (!uA2MeVs) return StatusCode::FAILURE;
92
94 const LArMphysOverMcalSC* MphysOverMcals=dynamic_cast<const LArMphysOverMcalSC*>(mphysHdl.cptr());
95 if (!MphysOverMcals) return StatusCode::FAILURE;
96
98 const LArHVScaleCorrSC* HVScaleCorrs=dynamic_cast<const LArHVScaleCorrSC*>(hvHdl.cptr());
99 if (!HVScaleCorrs) return StatusCode::FAILURE;
100
102
104
105
106 for (const LArDigit* digit : *inputContainer) {
107
108 const LArSCDigit* digitSC=
dynamic_cast<const LArSCDigit*
>(
digit);
109 if(!digitSC){
111 return StatusCode::FAILURE;
112 }
113 const std::vector<uint16_t>& bcids = digitSC->
BCId();
114 const HWIdentifier
id=
digit->hardwareID();
115 std::flush(std::cout);
116 const std::vector<short>& samples=
digit->samples();
122 float dac2ua=DAC2uAs->
DAC2UA(
id);
123 float ua2mev=uA2MeVs->
UA2MEV(
id);
126 float ELSB = 12.5;
127
129 ATH_MSG_ERROR(
"No valid pedestal for connected channel " <<
id.get_identifier32().get_compact() <<
" gain " << gain);
130 return StatusCode::FAILURE;
131 }
133 ATH_MSG_ERROR(
"No valid ofca for connected channel " <<
id.get_identifier32().get_compact() <<
" gain " << gain);
134 return StatusCode::FAILURE;
135 }
137 ATH_MSG_ERROR(
"No valid ofcb for connected channel " <<
id.get_identifier32().get_compact() <<
" gain " << gain);
138 return StatusCode::FAILURE;
139 }
141 ATH_MSG_ERROR(
"No valid ramp for connected channel " <<
id.get_identifier32().get_compact() <<
" gain " << gain);
142 return StatusCode::FAILURE;
143 }
145 ATH_MSG_ERROR(
"wrong ramp size for connected channel " <<
id.get_identifier32().get_compact() <<
" gain " << gain);
146 return StatusCode::FAILURE;
147 }
149 ATH_MSG_ERROR(
"No valid dac2ua for connected channel " <<
id.get_identifier32().get_compact());
150 return StatusCode::FAILURE;
151 }
153 ATH_MSG_ERROR(
"No valid ua2mev for connected channel " <<
id.get_identifier32().get_compact());
154 return StatusCode::FAILURE;
155 }
157 ATH_MSG_ERROR(
"No valid mphys for connected channel " <<
id.get_identifier32().get_compact() <<
" gain " << gain);
158 return StatusCode::FAILURE;
159 }
161 ATH_MSG_ERROR(
"No valid hvcorr for connected channel " <<
id.get_identifier32().get_compact());
162 return StatusCode::FAILURE;
163 }
164
166 std::vector<float> ofca_mev(ofca.size());
167 std::vector<float> ofcb_mev(ofca.size());
170 for (
unsigned int i = 0;
i < ofca.size(); ++
i) {
171 ofca_mev[
i] = ofca[
i] * ramp[1] * dac2ua * ua2mev / ELSB;
172 ofcb_mev[
i] = ofcb[
i] * ramp[1] * dac2ua * ua2mev / ELSB;
174 ofca_mev[
i] /= mphys;
175 ofcb_mev[
i] /= mphys;
176 }
178 ofca_mev[
i] *= hvcorr;
179 ofcb_mev[
i] *= hvcorr;
180 }
181 }
183 float suma=0;
for(
auto a:ofca)suma+=
a;
184 float sumb=0;
for(
auto b:ofcb)sumb+=
b;
185 peda=
ped-ramp[0]/ramp[1]*suma;
186 pedb=
ped-ramp[0]/ramp[1]*sumb;
187 }
188
189 bool aoverflow=false;
190 bool boverflow=false;
191 bool pedoverflow=false;
192
193 std::vector<int> ofca_int(ofca.size(),0);
194 std::vector<int> ofcb_int(ofca.size(),0);
195 int peda_int=0;
196 int pedb_int=0;
197
198 const int pedHardpoint = 3;
199 const int firLSBdropped = 8;
200 const int satLSBdropped = 6;
201 const int paramBitSize = 18;
202
203 for (
unsigned int i = 0;
i < ofca.size(); ++
i) {
204 if (!
floatToInt(ofca_mev[i], ofca_int[i], firLSBdropped - pedHardpoint,
205 paramBitSize)) {
206 aoverflow = true;
207 }
208 if (!
floatToInt(ofcb_mev[i], ofcb_int[i], satLSBdropped - pedHardpoint,
209 paramBitSize)) {
210 boverflow = true;
211 }
212 }
213 if(!
floatToInt(peda,peda_int,pedHardpoint,paramBitSize))pedoverflow=
true;
214 if(!
floatToInt(pedb,pedb_int,pedHardpoint,paramBitSize))pedoverflow=
true;
215
216 unsigned int nsamples = samples.size();
217 unsigned int firsamples=4;
218 int startSample=-1;
219 for(
unsigned int is=0; is<
nsamples; ++is){
220 if(bcids[is]==event_bcid) startSample=is;
221 }
222 int maxNenergies = 0;
223 if(startSample<0){
224 ATH_MSG_WARNING(
"could not find correct BCID for recomputing the energies, event BCID="<<event_bcid<<
" first sample BCID " << (nsamples?bcids[0]:-1));
225 }
226 else{
227 maxNenergies=
nsamples-firsamples-startSample+1;
229 }
230 if(maxNenergies<0) {
231 maxNenergies=0;
232 } else {
234 }
235 if((int)nEnergies>maxNenergies){
236 ATH_MSG_WARNING(
"requested nEnergies > maxNenergies " <<
m_nEnergies <<
">" <<maxNenergies<<
". setting nEnegries to maxNenergies");
237 nEnergies=maxNenergies;
238 }
239
240 std::vector<unsigned short> newBCIDs(nEnergies,0);
241 std::vector<int> newEnergies(nEnergies,0);
242 std::vector<int> tauEnergies(nEnergies,0);
243 std::vector<bool> passSelections(nEnergies,false);
244 std::vector<bool> satur(nEnergies,false);
245 const unsigned int nMaxBitsEnergy=18;
246 const unsigned int nMaxBitsEnergyTau=22;
247
248 for(
unsigned int ss=0;
ss<nEnergies; ++
ss){
249
250 int64_t computedE=0;
251 int64_t computedEtau=0;
252 unsigned short bcid = bcids[startSample+
ss];
254 for(unsigned int is=0; is<firsamples; ++is){
255 int sample = samples[startSample +
ss + is];
257 sample *= std::pow(2, pedHardpoint);
258 computedE +=
static_cast<int64_t
>(
sample - peda_int) * ofca_int[is];
259 computedEtau +=
static_cast<int64_t
>(
sample - pedb_int) * ofcb_int[is];
260 }
261 computedE=computedE>>firLSBdropped;
262 computedEtau=computedEtau>>satLSBdropped;
263
264 if(std::abs(computedE)>std::pow(2,nMaxBitsEnergy-1)){
265 if (computedE >= 0)
266 computedE = std::pow(2, nMaxBitsEnergy - 1) - 1;
267 else
268 computedE = 0;
269 }
270 if (std::abs(computedEtau) > std::pow(2, nMaxBitsEnergyTau - 1)) {
271 if (computedEtau >= 0)
272 computedEtau = std::pow(2, nMaxBitsEnergyTau - 1) - 1;
273 else
274 computedEtau = -std::pow(2, nMaxBitsEnergyTau - 1) + 1;
275 }
276 newEnergies[
ss] = computedE;
277 tauEnergies[
ss] = computedEtau;
278 bool passSelection = false;
279 if (computedE < 0 && computedE > -80) {
280 if (computedEtau > 8 * computedE && computedEtau < -8 * computedE)
281 passSelection = true;
282 } else if (computedE < 800) {
283 if (computedEtau > -8 * computedE && computedEtau < 8 * computedE)
284 passSelection = true;
285 } else if (computedE >= 800) {
286 if (computedEtau > -8 * computedE && computedEtau < 16 * computedE)
287 passSelection = true;
288 }
289 passSelections[
ss] = passSelection;
290 }
291 LArRawSC* scraw = dataItemsPool.nextElementPtr();
292
296 scraw->
setBCIds(std::move(newBCIDs));
304
305 outputContainer->push_back(scraw);
306
307 }
308
309
310 return StatusCode::SUCCESS;
311}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
LArVectorProxy RampRef_t
This class defines the interface for accessing Ramp @stereotype Interface.
virtual const float & DAC2UA(const HWIdentifier &chid) const
access to DAC2UA conversion factor index by Identifier, and gain setting
virtual const float & HVScaleCorr(const HWIdentifier &chid) const
SG::ReadCondHandleKey< ILArHVScaleCorr > m_keyHVScaleCorrSC
static bool floatToInt(float val, int &newval, int hardpoint, int size)
reproduce LDPB package computation in https://gitlab.cern.ch/atlas-lar-online/onlinelatomedb/-/blob/m...
SG::ReadCondHandleKey< ILArDAC2uA > m_keyDAC2uASC
SG::WriteHandleKey< LArRawSCContainer > m_larRawSCKey
SG::ReadCondHandleKey< ILArPedestal > m_keyPedestalSC
Gaudi::Property< bool > m_applyHVCorrection
SG::ReadCondHandleKey< ILArMphysOverMcal > m_keyMphysOverMcalSC
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
SG::ReadCondHandleKey< ILAruA2MeV > m_keyuA2MeVSC
SG::ReadCondHandleKey< LArOnOffIdMapping > m_cablingKey
Gaudi::Property< int > m_nEnergies
SG::ReadCondHandleKey< ILArRamp > m_keyRampSC
SG::ReadCondHandleKey< ILArOFC > m_keyOFCSC
Gaudi::Property< bool > m_useR0
SG::ReadHandleKey< LArDigitContainer > m_digitKey
Gaudi::Property< bool > m_applyMphysOverMcal
Gaudi::Property< bool > m_isADCBas
Gaudi::Property< int > m_startSample
virtual const float & MphysOverMcal(const HWIdentifier &chid, int gain) const
virtual OFCRef_t OFC_b(const HWIdentifier &CellID, int gain, int tbin=0) const
virtual OFCRef_t OFC_a(const HWIdentifier &CellID, int gain, int tbin=0) const
access to OFCs by online ID, gain, and tbin (!=0 for testbeam)
ILArOFC::OFCRef_t OFCRef_t
virtual float pedestal(const HWIdentifier &CellID, int gain) const
virtual RampRef_t ADC2DAC(const HWIdentifier &CellID, int gain) const
void setBCIds(const std::vector< unsigned short > &&bcids)
Set bcids.
void setSaturation(const std::vector< bool > &&satur)
@set saturation flags
void setEnergies(const std::vector< int > &&energies)
Set energies .
void setHardwareId(const HWIdentifier id)
Set identifier.
void setTauEnergies(const std::vector< int > &&tauEnergies)
Set energies*taus .
void setPassTauSelection(const std::vector< bool > &&pass)
@set true if passes the tau selection
void setOFCbOverflow(bool overflow)
@set OFCb Overflow
void setOFCaOverflow(bool overflow)
@set OFCa Overflow
void setSourceId(const unsigned sourceId)
Set source id.
void setChannel(const unsigned chan)
Set channel number.
void setPedOverflow(bool overflow)
@set pedestal Overflow
unsigned int SourceId() const
const std::vector< unsigned short > & BCId() const
bool valid() const
Test to see if the proxy has been initialized.
virtual const float & UA2MEV(const HWIdentifier &chid) const
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
setEventNumber setTimeStamp bcid