15#include "GaudiKernel/Bootstrap.h"
16#include "GaudiKernel/ISvcLocator.h"
17#include "GaudiKernel/IToolSvc.h"
23#define LARBSDBG(text) m_logstr<<MSG::DEBUG<<text<<endmsg
42 SmartIF<StoreGateSvc> detStore{Gaudi::svcLocator()->service(
"DetectorStore")};
44 m_logstr << MSG::ERROR <<
"Unable to locate DetectorStore" <<
endmsg;
47 StatusCode
sc = detStore->retrieve(online_id,
"LArOnlineID");
49 m_logstr << MSG::FATAL <<
"Could not get LArOnlineID helper !" << endmsg;
53 m_onlineHelper=online_id;
54 m_logstr << MSG::DEBUG <<
" Found the LArOnlineID helper. " << endmsg;
144 const int32_t time,
const int32_t quality,
const uint32_t gain) {
149 m_logstr << MSG::ERROR <<
"LArRODBlockStructure Error: Internal error. Channels not ordered correctly. rcNb=" << rcNb
164 {
m_logstr << MSG::ERROR <<
"LArRodBlockStructure Error: Attempt to write Energy for channel "
168 LARBSDBG(
"LArRodBlockStructure: Setting Energy for channel " <<
m_EIndex <<
". E=" << energy);
169 if (quality<0 && energy<0x7FFE && gain==0) {
171 ShortLong twoValues{};
175 twoValues.s[0]=(int16_t)energy;
180 int16_t* valptr=
reinterpret_cast<int16_t*
>(&oneValue);
181 twoValues.s[0]=valptr[0];
182 twoValues.s[1]=(int16_t)energy;
184 LARBSDBG(
"Writing words: val0= " << twoValues.s[0] <<
" val1= " << twoValues.s[1]);
186 LARBSDBG(
"Writing Raw data to Low E block. E=" << energy);
200 uint32_t gtQ = (gain << 30) | (t_sign<<29) | ((abs_time & 0x1fff)<<16) | (0xffff & quality);
202 LARBSDBG(
"Writing Raw data to High E block. E=" << energy <<
" Q=" << quality);
212 {
m_logstr << MSG::ERROR <<
"Attempt to write Energy for channel " << rcNb <<
" channels into a FEB!" <<
endmsg;
216 if(samples.size() != nsamples) {
217 m_logstr << MSG::ERROR <<
"Number of samples mismatch!\n";
218 m_logstr <<
" nsamples =" << nsamples;
226 if((nsamples/2)*2!=nsamples) {
228 for (
unsigned int i=1;i<nsamples;i+=2)
232 m_RawDataBlock.push_back((gain<<30) | (samples[1]<<18) | samples[0]<<2);
233 for (
unsigned int i=2;i<nsamples;i+=2)
244 unsigned int sizeRead=0;
246 while (sizeRead<fragment.size()) {
247 std::vector<uint32_t>::iterator FebIter;
248 FebIter=fragment.begin()+sizeRead;
252 if (FebIter+currFebSize>fragment.end()) {
254 m_logstr << MSG::ERROR <<
"Got inconsistent ROD-Fragment!" <<
endmsg;
257 m_mFebBlocks[currFEBid].assign(FebIter,FebIter+currFebSize);
259 LARBSDBG(
"Found FEB-id " << currFEBid <<
" in existing ROD-Fragment");
286 uint16_t BlockOffset;
291 LARBSDBG(
"Checking Low Energy Block n=" << n <<
"BlockOffset=" << BlockOffset);
294 for (
unsigned i=0;i<n;i++)
300 LARBSDBG(
"Checking High Energy Block n=" << n <<
"BlockOffset=" << BlockOffset);
302 if (n && !BlockOffset)
304 for(
unsigned int i=0;i<n;i++)
309 LARBSDBG(
"Checking Raw Data Block");
312 LARBSDBG(
"Checking Raw Data Block. n=" << n <<
"BlockOffset=" << BlockOffset);
316 for(
unsigned int i=0;i<n;i++)
324 <<
"Energy-index:" <<
m_EIndex << std::endl
325 <<
"Filled channels: " <<
m_ECounter << std::endl);
333 FEBMAPTYPE::const_iterator feb_it_b=
m_mFebBlocks.begin();
335 FEBMAPTYPE::const_iterator feb_it;
336 for (feb_it=feb_it_b;feb_it!=feb_it_e;++feb_it) {
337 if (feb_it!=feb_it_b)
342 feb_it->second.begin(), feb_it->second.end());
351 LARBSDBG(
"in LArRodBlockPhysicsV2::getNextRawData.");
376 LARBSDBG(
"This run has " << nsamples <<
" samples");
381 gain=3-((
m_GainPtr[channelNumber/16] >> (channelNumber%16)*2) & 0x3);
383 for(
unsigned int i=0;i<nsamples;i++) {
389 samples.push_back((
short) (
x & 0xfff));
395 short movedSample=samples[0];
397 samples[i-1]=samples[i];
406template<
class RAWDATA>
407bool LArRodBlockPhysicsV2::operator ()
408 (
const RAWDATA* ch1,
const RAWDATA* ch2)
const
416 if(febId1 == febId2 ){
422 return febId1 < febId2 ;
430{
std::sort(vDigit.begin(),vDigit.end(),*
this);
#define LARBSDBG(text)
This class provides decoding/encoding from/to ROD format.
std::vector< uint32_t > m_LowEnergyBlock
std::vector< uint32_t > m_HighEnergyBlock
std::vector< uint32_t > m_RawDataBlock
unsigned short m_NFlaggingWords
const uint32_t * m_GainPtr
static std::string BlockType()
virtual int getNextRawData(int &channelNumber, std::vector< short > &samples, uint32_t &gain)
virtual void setNumberOfSamples(const uint8_t n)
virtual void setNumberOfGains(const uint8_t n)
virtual uint32_t getStatus() const
virtual uint16_t getCtrl2(uint32_t adc) const
virtual uint32_t getNumberOfSamples() const
LArRodBlockPhysicsV2(IMessageSvc *msgSvc)
const uint16_t * m_RawDataPtr
virtual void finalizeFEB()
virtual void initializeFragment(std::vector< uint32_t > &fragment)
virtual void setNextEnergy(const int channel, const int32_t energy, const int32_t time, const int32_t quality, const uint32_t gain)
const int16_t * m_LowEPtr
const LArOnlineID * m_onlineHelper
virtual void setRawData(const int channel, const std::vector< short > &samples, const uint32_t gain)
virtual void concatinateFEBs()
virtual uint32_t getNumberOfGains() const
virtual uint16_t getCtrl1(uint32_t adc) const
virtual bool setPointers()
const uint32_t * m_RawDataFlagsPtr
virtual void resetPointers()
const int32_t * m_HighEPtr
virtual uint32_t getRadd(uint32_t adc, uint32_t sample) const
virtual void sortDataVector(std::vector< const LArRawChannel * > &)
const uint32_t * m_FlagPtr
static const uint32_t m_DummyBitMap[4]
virtual uint16_t getCtrl3(uint32_t adc) const
int FebToRodChannel(int ch) const
virtual void initializeFEB(const uint32_t id)
unsigned int m_rearrangeFirstSample
int getBit(const uint32_t *const p, const unsigned chan) const
void setHeader32(const unsigned n, const uint32_t w)
uint16_t LE_getVectorHeader16(const unsigned n) const
void LE_setHeader16(const unsigned n, const uint16_t w)
uint32_t getHeader32(const unsigned n) const
const uint32_t * m_FebBlock
void setBit(uint32_t *const p, const unsigned chan)
std::vector< uint32_t > * m_pRODblock
unsigned short m_iHeadBlockSize
LArRodBlockStructure(IMessageSvc *msgSvc, const std::string &blockType)
std::vector< uint32_t > * m_vFragment
int32_t m_MiddleHeaderSize
uint16_t LE_getHeader16(const unsigned n) const
uint32_t getNumberOfWords() const
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.