diff --git a/DAQ/src/EventHeaderFromCFOFragment_module.cc b/DAQ/src/EventHeaderFromCFOFragment_module.cc index 063582efed..abde98f418 100644 --- a/DAQ/src/EventHeaderFromCFOFragment_module.cc +++ b/DAQ/src/EventHeaderFromCFOFragment_module.cc @@ -4,30 +4,36 @@ // // ====================================================================== +// Framework #include "art/Framework/Core/EDProducer.h" #include "art/Framework/Principal/Event.h" #include "art/Framework/Services/Registry/ServiceHandle.h" #include "fhiclcpp/ParameterSet.h" - #include "art/Framework/Principal/Handle.h" + +// artdaq #include #include "artdaq-core-mu2e/Overlays/CFOEventFragment.hh" +#include "artdaq-core-mu2e/Overlays/CFO_Packets/CFO_Event.h" +#include "artdaq-core-mu2e/Overlays/CFO_Packets/CFO_EventRecord.h" #include "artdaq-core-mu2e/Overlays/FragmentType.hh" - #include -#include +// Offline +#include "Offline/DataProducts/inc/EventWindowMarker.hh" +// C++ +#include #include - #include #include #include #include #include +// TRACE #include "trace.h" -#define TRACE_NAME "Mu2eSubEventReceiver" +#define TRACE_NAME "EventHeaderFromCFOFragment" namespace art { class EventHeaderFromCFOFragment; @@ -39,8 +45,11 @@ class art::EventHeaderFromCFOFragment : public EDProducer { public: struct Config { - fhicl::Atom cfoTag {fhicl::Name("cfoTag"), fhicl::Comment("Input module")}; - fhicl::Atom diagLevel{fhicl::Name("diagLevel"), fhicl::Comment("diagnostic level")}; + using Name = fhicl::Name; + using Comment = fhicl::Comment; + fhicl::Atom cfoTag {Name("cfoTag"), Comment("Input CFO fragment tag")}; + fhicl::Atom ewm {Name("createEWM"), Comment("Produce an event window marker object")}; + fhicl::Atom diagLevel{Name("diagLevel"), Comment("diagnostic level")}; }; // --- C'tor/d'tor: @@ -54,6 +63,7 @@ class art::EventHeaderFromCFOFragment : public EDProducer { private: art::InputTag cfoFragmentTag_; + bool ewm_; int diagLevel_; }; @@ -65,8 +75,13 @@ art::EventHeaderFromCFOFragment::EventHeaderFromCFOFragment( const art::EDProducer::Table& config) : art::EDProducer{config}, cfoFragmentTag_(config().cfoTag()), + ewm_(config().ewm()), diagLevel_(config().diagLevel()) { produces(); + if(ewm_) { + TLOG(TLVL_DEBUG + 2) << "Producing EventWindowMarker"; + produces(); + } } // ---------------------------------------------------------------------- @@ -74,30 +89,41 @@ art::EventHeaderFromCFOFragment::EventHeaderFromCFOFragment( void art::EventHeaderFromCFOFragment::produce(Event& event) { // Collection of CaloHits for the event - std::unique_ptr evtHdr(new mu2e::EventHeader); - art::Handle cfoFragmentHandle; + std::unique_ptr evtHdr(new mu2e::EventHeader); + std::unique_ptr ewm((ewm_) ? new mu2e::EventWindowMarker : nullptr); + art::Handle cfoFragmentHandle; if(!event.getByLabel(cfoFragmentTag_, cfoFragmentHandle)) { event.put(std::move(evtHdr)); - TLOG(TLVL_DEBUG) << "No CFO fragments found"; + if(ewm_) event.put(std::move(ewm)); + TLOG(TLVL_DEBUG + 1) << "No CFO fragments found"; return; } const auto *fragments = cfoFragmentHandle.product(); if (fragments->size()>0){ const auto &frag = fragments->at(0); - mu2e::CFOEventFragment cfoFrag(frag); - const CFOLib::CFO_Event cfo = cfoFrag.getData(); - //const CFO_EventRecord& cfoRecord = cfo.GetEventRecord(); - evtHdr->mode = 0;//cfo.GetEventMode(); - evtHdr->ewt = static_cast(cfo.GetEventWindowTag().GetEventWindowTag().to_ullong()); - evtHdr->flags = cfo.GetEventMode().isOnSpillFlagSet(); - TLOG(TLVL_DEBUG+20) << "mode = "<< evtHdr->mode <<" ewt = "<< evtHdr->ewt << " flags = " << evtHdr->flags; - }else { - TLOG(TLVL_DEBUG) << "No CFO fragments found in the event"; + const mu2e::CFOEventFragment cfoFrag(frag); + const CFOLib::CFO_Event cfo = cfoFrag.getData(); + const CFOLib::CFO_EventRecord& cfoRecord = cfo.GetEventRecord(); + evtHdr->mode = 0;//cfo.GetEventMode(); + evtHdr->ewt = static_cast(cfo.GetEventWindowTag().GetEventWindowTag().to_ullong()); + evtHdr->flags = cfo.GetEventMode().isOnSpillFlagSet(); + evtHdr->eventDuration = cfoRecord.event_duration; + TLOG(TLVL_DEBUG + 20) << "mode = " << evtHdr->mode << " ewt = "<< evtHdr->ewt << " flags = " << evtHdr->flags + << " onspill = " << evtHdr->isOnSpill() << " duration = " << evtHdr->eventDuration; + } else { + TLOG(TLVL_DEBUG + 3) << "No CFO fragments found in the event"; + } + + if(ewm_) { + constexpr double tick = 25.; // clock ticks -> ns + ewm->_spillType = (evtHdr->isOnSpill()) ? mu2e::EventWindowMarker::SpillType::onspill : mu2e::EventWindowMarker::SpillType::offspill; + ewm->_eventLength = tick * evtHdr->eventDuration; } event.put(std::move(evtHdr)); + if(ewm_) event.put(std::move(ewm)); } // produce() // ======================================================================