16 return reinterpret_cast<artdaq::Fragments*
>(br->GetAddress());
27 size_t bufsize = (frag.dataSize() + 1) *
sizeof(artdaq::RawDataType) *
nfragments_ ;
31 memcpy( &*
buffer_.begin() +
size_, frag.dataBeginBytes(), frag.dataSizeBytes() );
34 size_ += frag.dataSizeBytes();
44 throw cet::exception(
"SpillWrapper") <<
"Error in SpillWrapper::add(): expected 1 artdaq fragment in event, found " 54 fEventNumber = eventNum;
105 fCherenkov = cherenkov;
111 fMuonStack = muonstack;
117 fPaddleDigit = paddle;
213 for (
size_t eventIt = 0; eventIt < numEvents; ++eventIt)
219 for (std::vector<BeamlineEvent*>::iterator eventIt = fEvents.begin();
220 eventIt != fEvents.end(); ++eventIt) {
229 fEvents.push_back(event);
230 fEvents_TDUIndex[
event->GetTDUTime()] = event;
236 fEvents.insert(fEvents.end(), events.begin(), events.end());
242 fEvents.erase(std::remove_if(fEvents.begin(),
251 if (eventNum >= fEvents.size())
253 <<
"Requested event " << eventNum <<
" does not exist" <<
std::endl;
254 return fEvents[eventNum];
259 if (fEvents_TDUIndex.count(nova_timestamp))
260 return fEvents_TDUIndex[nova_timestamp];
263 <<
"Requested event with timestamp " << nova_timestamp <<
" does not exist" <<
std::endl;
269 return fEvents.size();
280 if (fEventIt >= fEvents.size())
282 <<
"Next requested event (" << fEventIt <<
") does not exist." <<
std::endl;
283 return fEvents.at(fEventIt);
288 return fEventIt+1 < fEvents.size();
293 fBeamlineEvents(nullptr) {
318 std::vector<TriggerPattern::TriggerPattern_t>
324 std::vector<TriggerPattern::TriggerPattern_t> beamlineTriggers;
327 for (
size_t trigIt = 0; trigIt < triggerFrag.triggerFragment.nEntries; ++trigIt) {
329 TriggerPattern::TriggerPattern_t
pattern =
330 triggerFrag.triggerFragment.patterns[trigIt];
333 beamlineTriggers.push_back(pattern);
335 prevT = pattern.timeStamp;
339 return beamlineTriggers;
344 std::vector<TDUFragment*>
349 std::vector<TDUFragment*> beamlineTDUs;
352 std::vector<uint64_t> prevTs;
354 for (std::vector<TDUFragment*>::const_iterator tduFragIt = tduFrags.begin();
355 tduFragIt != tduFrags.end(); ++tduFragIt) {
357 const TDUFragment::TDUFragment_t& tduFrag = (*tduFragIt)->tduFragment[0];
359 if (tduFrag.type == 1 and
360 std::find(prevTs.begin(), prevTs.end(), tduFrag.timestamp) == prevTs.end()) {
361 beamlineTDUs.push_back(*tduFragIt);
362 prevTs.push_back(tduFrag.timestamp);
385 const std::vector<TDUFragment*> tduFrags,
390 const TriggerFragment triggerFrag = spillFrag->triggerFragment;
393 const std::vector<V1742Fragment> v1742Frags = spillFrag->v1742Frags;
398 tdcFrag = spillFrag->tdcFrags[0];
401 <<
"There are " << triggerFrag.triggerFragment.nEntries <<
" triggers, " 402 << v1742Frags.size() <<
" digitizer triggers, " 403 << tdcFrag.tdcEvents.size() <<
" wire chamber triggers and " 404 << tduFrags.size() <<
" TDU timestamps." <<
std::endl;
407 std::vector<TriggerPattern::TriggerPattern_t> triggers_clean
409 std::vector<TDUFragment*> tdu_clean =
CleanTDU(tduFrags);
412 <<
"After cleaning, there are " << triggers_clean.size() <<
" triggers, " 413 << v1742Frags.size() <<
" digitizer triggers, " 414 << tdcFrag.tdcEvents.size() <<
" wire chamber triggers and " 415 << tdu_clean.size() <<
" TDU timestamps." <<
std::endl;
420 unsigned int numTriggers = 0;
422 numTriggers = triggers_clean.size();
424 numTriggers = v1742Frags.size();
426 numTriggers = tdcFrag.tdcEvents.size();
428 numTriggers = tdu_clean.size();
435 (
fUnpackTDU and tdu_clean.size() != numTriggers))
437 <<
"Inconsistent number of data fragments: " 438 <<
"Triggers: " << triggers_clean.size() <<
"; " 439 <<
"Digitizer: " << v1742Frags.size() <<
"; " 440 <<
"Wire Chambers: " << tdcFrag.tdcEvents.size() <<
"; " 441 <<
"TDU: " << tdu_clean.size() <<
"." 490 const std::vector<TDUFragment*>& beamlineTDUs,
495 beamlineTDUs.size() : beamlineTriggers.size();
499 if (!filename.empty()) {
500 char* fullpathname = (
char*)filename.c_str();
504 metadata = ifdhp->getMetadata(relfilename);
506 catch (WebAPIException) {
513 std::istringstream metadataStream;
514 metadataStream.str(metadata);
515 while (metadataStream.good()) {
517 std::getline(metadataStream, line);
518 size_t pos = line.find(
":");
519 if (pos != std::string::npos) {
520 key = line.substr(0, pos);
521 value = line.substr(pos+1);
522 if (key.find(
"Beamline.BeamlineTrigger") != std::string::npos) {
523 value.erase(std::remove(value.begin(), value.end(),
' '), value.end());
524 trigger_condition =
value;
530 for (
unsigned int triggerIt = 0; triggerIt < numTrigs; ++triggerIt) {
534 fUnpackTrigger?
static_cast<uint64_t
>(beamlineTriggers[triggerIt].timeStamp) : 0;
535 long double timestamp_ns = timestamp * 10;
538 uint64_t tduTime =
fUnpackTDU? (beamlineTDUs[triggerIt]->tduFragment.at(0).timestamp +
fTDUOffset) : 0;
544 trigger.SetPattern(
fUnpackTrigger? beamlineTriggers[triggerIt].inputPattern : 0);
545 trigger.SetTDUTime(tduTime);
546 trigger.SetTriggerCondition(trigger_condition);
547 std::vector<rawdata::RawBeamlineTrigger> triggers = {trigger};
564 for (
unsigned int v1742FragIt = 0; v1742FragIt < frags.size(); ++v1742FragIt) {
566 const V1742Fragment& v1742Frag = frags[v1742FragIt];
568 std::vector<rawdata::RawBeamlineDigit> cherenkovDigits, tofDigits,
569 muonStackDigits, paddleDigits, wcDigits, otherDigits;
572 for (
unsigned int waveform = 0; waveform < v1742Frag.waveForms.size(); ++waveform) {
578 =
static_cast<uint64_t
>(v1742Frag.triggerTimeStamps[
static_cast<int>(waveform/8)]);
579 long double timestamp_ns =
static_cast<long double>(
timestamp) * 8.5;
582 digit.
SetWaveform(v1742Frag.waveForms[waveform].data);
583 digit.SetTimestamp(timestamp_ns);
585 switch (digit.ChannelID().System) {
587 cherenkovDigits.push_back(digit);
break;
589 tofDigits.push_back(digit);
break;
591 muonStackDigits.push_back(digit);
break;
593 paddleDigits.push_back(digit);
break;
595 wcDigits.push_back(digit);
break;
597 otherDigits.push_back(digit);
break;
621 unsigned int event = 0;
622 std::vector<std::vector<TDCFragment::TdcEventData> > tdcEvents = frag.tdcEvents;
623 for (std::vector<std::vector<TDCFragment::TdcEventData> >::const_iterator tdcEventIt = tdcEvents.begin();
624 tdcEventIt != tdcEvents.end(); ++tdcEventIt, ++event) {
627 for (
unsigned int wc_num = 0; wc_num < wcs.size(); ++wc_num)
638 std::map<unsigned int, uint16_t> controllerTimestamps;
639 std::map<unsigned int, uint32_t> tdcTimestamps;
642 for (std::vector<TDCFragment::TdcEventData>::const_iterator tdcIt = tdcEventIt->begin(); tdcIt != tdcEventIt->end(); ++tdcIt) {
644 unsigned int tdcNumber = (
int)tdcIt->tdcEventHeader.tdcNumber - 1;
647 unsigned int tdc_on_plane = tdc_on_wc %
fTDCsPerWC;
648 unsigned int plane_on_wc = tdc_on_wc /
fTDCsPerWC;
651 controllerTimestamps[tdcNumber] = tdcIt->tdcEventHeader.controllerTimeStamp;
652 tdcTimestamps[tdcNumber] = tdcIt->tdcEventHeader.tdcTimeStamp;
655 if (tdcIt->tdcEventHeader.eventStatus != 0)
659 for (std::vector<TDCFragment::TdcHit>::const_iterator hitIt = tdcIt->tdcHits.begin(); hitIt != tdcIt->tdcHits.end(); ++hitIt) {
660 unsigned int channel_on_plane = (tdc_on_plane *
fChannelsPerTDC) + (
int)hitIt->channel;
662 plane_on_wc ? wcs[wcNumber].AddYPulse(pulse) : wcs[wcNumber].AddXPulse(pulse);
668 for (std::map<unsigned int, uint16_t>::const_iterator controllerTsIt = controllerTimestamps.begin();
669 controllerTsIt != controllerTimestamps.end(); ++controllerTsIt)
670 if (controllerTsIt->second != controllerTimestamps.begin()->second)
672 <<
"WC controller timestamps differ between TDC fragments." <<
std::endl;
674 for (std::map<unsigned int, uint32_t>::const_iterator tdcTsIt = tdcTimestamps.begin();
675 tdcTsIt != tdcTimestamps.end(); ++tdcTsIt)
676 if (tdcTsIt->second != tdcTimestamps.begin()->second)
678 <<
"TDC timestamps differ between TDC fragments." <<
std::endl;
680 uint32_t tdcTs = tdcTimestamps.begin()->second;
681 uint32_t controllerTs = controllerTimestamps.begin()->second;
683 uint16_t tdcCommon = tdcTs & 0x1FF
u;
684 uint16_t controllerCommon = (controllerTs & 0xFF8
u) >> 3;
685 if (tdcCommon != controllerCommon)
687 <<
"Synchronization problem between MWPC controller and TDC timestamps." <<
std::endl 688 <<
"Bits 8..0 of TDC timestamp " << std::bitset<9>(tdcCommon) <<
"; " 689 <<
"bits 11..3 of controller timetamp " << std::bitset<9>(controllerCommon) <<
std::endl;
691 uint64_t
timestamp =
static_cast<uint64_t
>(((std::bitset<35>(tdcTimestamps.begin()->second) << 3) |
692 (std::bitset<35>(controllerTimestamps.begin()->second & 0x7))).to_ullong());
693 long double timestamp_ns = timestamp * 1.18;
694 for (std::vector<rawdata::RawBeamlineWC>::iterator wcIt = wcs.begin(); wcIt != wcs.end(); ++wcIt)
695 wcIt->SetTimestamp(timestamp_ns);
void AddTimestamp(uint64_t timestamp)
DetectorID TrigDetector() const
Offline DetectorID for trigger.
void reconfigure(const fhicl::ParameterSet &pset)
MaybeLogger_< ELseverityLevel::ELsev_info, true > LogVerbatim
art::ServiceHandle< beamlinegeo::BeamlineGeometry > fGeometry
void SetBeamlineRun(unsigned int run)
void AddOtherDigit(std::vector< rawdata::RawBeamlineDigit > other)
void AddToF(std::vector< rawdata::RawBeamlineDigit > tof)
BeamlineEvent * FindEvent(unsigned int event)
rawdata::RawBeamlineConfig GetConfig() const
void AddTrigger(std::vector< rawdata::RawBeamlineTrigger > trigger)
void AddWCDigit(std::vector< rawdata::RawBeamlineDigit > mwpc)
unsigned int NumWCs() const
Number of WCs in beamline.
const std::size_t nfragments_
std::vector< BeamlineEvent * > GetEvents() const
std::vector< rawdata::RawBeamlineTrigger > GetTrigger() const
std::vector< rawdata::RawBeamlineDigit > GetCherenkov() const
std::vector< rawdata::RawBeamlineWC > GetWC() const
std::vector< uint8_t > buffer_
unsigned int EventNumber() const
void Unpack(const LariatFragment *spillFrag, const std::vector< TDUFragment * > tduFrag, unsigned int run=0, std::string filename="")
::xsd::cxx::tree::exception< char > exception
BeamlineEvent * GetNextEvent()
std::size_t nfragments_processed_
std::string fTriggerSource
void AddEvents(std::vector< BeamlineEvent * > events)
artdaq::Fragments * getFragments(TBranch *br, unsigned entry)
void SetWaveform(std::vector< uint16_t > waveform)
uint64_t GetTDUTime() const
std::vector< rawdata::RawBeamlineDigit > GetToF() const
void AddWC(std::vector< rawdata::RawBeamlineWC > wc)
art::ServiceHandle< beamlineutil::BeamlineChannelMap > fChannelMap
const XML_Char int const XML_Char * value
BeamlineEvents * fBeamlineEvents
T get(std::string const &key) const
std::vector< rawdata::RawBeamlineDigit > GetWCDigit() const
uint64_t GetTimestamp() const
bool ActiveDigitChannel(unsigned int channel) const
Enquire whether this online digitizer channel is active.
void SetBField(float b_field)
std::vector< TDUFragment * > CleanTDU(const std::vector< TDUFragment * > &tduFrags)
BeamlineEvent(unsigned int eventNum)
Methods to interface with the DAQ-formatted output file for the beamline components of the test beam ...
void UnpackTrigger(const std::vector< TriggerPattern::TriggerPattern_t > &beamlineTriggers, const std::vector< TDUFragment * > &beamlineTDUs, std::string filename="")
void AddMuonStack(std::vector< rawdata::RawBeamlineDigit > muonstack)
art::ServiceHandle< beamlineutil::BeamlineMagneticField > fMagneticField
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
void UnpackDigits(const std::vector< V1742Fragment > &frags)
void UnpackWC(const TDCFragment &frag)
std::vector< rawdata::RawBeamlineDigit > GetOtherDigit() const
BeamlineUnpack(const fhicl::ParameterSet &pset)
std::vector< rawdata::RawBeamlineDigit > GetMuonStack() const
float MagneticField(unsigned int beamline_run)
Return the magnetic field for a given beamline data run.
ValidHandle< PROD > getValidHandle(InputTag const &tag) const
void AddConfig(rawdata::RawBeamlineConfig config)
void add(const art::Event &evt, const art::InputTag &tag)
ChannelID DigitChannel(unsigned int channel) const
Offline ChannelID for this online digitizer channel.
void AddPaddleDigit(std::vector< rawdata::RawBeamlineDigit > paddle)
void AddTDUTime(uint64_t tduTime)
void AddCherenkov(std::vector< rawdata::RawBeamlineDigit > cherenkov)
BeamlineEvents * GetBeamlineEvents() const
void SetTimestamp(uint64_t timestamp)
void AddEvent(BeamlineEvent *event)
std::vector< rawdata::RawBeamlineDigit > GetPaddleDigit() const
std::vector< TriggerPattern::TriggerPattern_t > CleanTriggers(const TriggerFragment &triggerFrag)
unsigned int fChannelsPerTDC
unsigned int fTriggerLatency
unsigned int NumEvents() const
void UnpackConfig(unsigned int run)
DetectorID WCDetector(unsigned int detector) const
Offline DetectorID for this online WC detector.