From 5728b1c2c2b83b4bed4ac860e08028e47f7b6b3b Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Tue, 13 Jan 2026 13:19:43 -0600 Subject: [PATCH 01/29] Add module to print STMFragments --- DAQ/src/STMPrintFragments_module.cc | 116 ++++++++++++++++++++++++++++ DAQ/test/inspectSTMFile.fcl | 28 +++---- 2 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 DAQ/src/STMPrintFragments_module.cc diff --git a/DAQ/src/STMPrintFragments_module.cc b/DAQ/src/STMPrintFragments_module.cc new file mode 100644 index 0000000000..40a2236041 --- /dev/null +++ b/DAQ/src/STMPrintFragments_module.cc @@ -0,0 +1,116 @@ +// ====================================================================== +// +// STMPrintFragments_plugin: Add CRV data products to the event +// +// ====================================================================== + +#include "art/Framework/Core/EDAnalyzer.h" +#include "art/Framework/Principal/Event.h" +#include "art/Framework/Services/Registry/ServiceHandle.h" +#include "fhiclcpp/ParameterSet.h" + +#include "Offline/ProditionsService/inc/ProditionsHandle.hh" +#include "art/Framework/Principal/Handle.h" +#include "artdaq-core-mu2e/Overlays/STMFragment.hh" +#include + +#include +#include +#include + +namespace art +{ + class STMPrintFragments; +} + +using art::STMPrintFragments; + +// ====================================================================== + +class art::STMPrintFragments : public EDAnalyzer +{ + public: + struct Config + { + // // fhicl::Atom diagLevel{fhicl::Name("diagLevel"), fhicl::Comment("diagnostic Level")}; + // // fhicl::Atom CRVDataDecodersTag{fhicl::Name("crvTag"), + // // fhicl::Comment("crv Fragments Tag")}; + }; + + // --- C'tor/d'tor: + explicit STMPrintFragments(const art::EDAnalyzer::Table& config); + + // --- Production: + virtual void analyze(const Event&); + + private: + // int decompressCrvDigi(uint8_t adc); + // int16_t decompressCrvDigi(int16_t adc); + + // int _diagLevel; + // art::InputTag _CRVDataDecodersTag; + // mu2e::ProditionsHandle _channelMap_h; + +}; // STMPrintFragments + +// ====================================================================== + +STMPrintFragments::STMPrintFragments(const art::EDAnalyzer::Table& config) : + art::EDAnalyzer{config} +{ + // produces(); +} + +// ---------------------------------------------------------------------- + +void STMPrintFragments::analyze(const Event& event) +{ + art::EventNumber_t eventNumber = event.event(); + + auto STMFragments = event.getValidHandle("daq:STM"); + + std::cout << std::dec << "Analyzer: Run " << event.run() << ", subrun " << event.subRun() + << ", event " << eventNumber << " has " << std::endl; + std::cout << STMFragments->size() << " STM fragments." << std::endl; + + // std::vector>> fragmentHandles; + // fragmentHandles = event.getMany>(); + // std::cout << "AE: fragmentHandles.size() = " << fragmentHandles.size() << std::endl; + // for (auto const& hndl : fragmentHandles) { + // std::cout << "AE: hdnle = " << hndl << std::endl; + // for (auto const& fragment : *hndl) { + // int fragID = fragment.fragmentID(); + // std::cout << "AE: fragID = " << fragID << std::endl; + // } + // } + int frag_counter = 0; + for (auto& frag : *STMFragments) { + ++frag_counter; + + auto stm_frag = static_cast(frag); + // const auto dataBegin = stm_frag.dataBegin(); + const auto stmDataBegin = stm_frag.GetTHdr();//reinterpret_cast(dataBegin); + for (size_t i = 0; i < 100; ++i) { + std::cout << "Frag #" << frag_counter << ": *(stmDataBegin+" << i << ") = " << *(stmDataBegin+i) << std::endl; + } + + // // std::cout << "Trigger Header Address: " << stm_frag.GetTHdr() << std::endl; + // std::cout << "Frag #" << frag_counter << ": EvNum: " << *(stm_frag.EvNum()) << std::endl; + // std::cout << "Frag #" << frag_counter << ": DataType: " << *(stm_frag.DataType()) << std::endl; + // std::cout << "Frag #" << frag_counter << ": EvLen: " << *(stm_frag.EvLen()) << std::endl; + + // unsigned int max_samples = (*(stm_frag.EvLen()))/100.; + // std::cout << "Frag #" << frag_counter << ": First " << max_samples << " int16s of data: "; + // for (size_t i = 0; i < max_samples; ++i) { + // std::cout << *(stm_frag.DataBegin()+i) << " "; + // } + // std::cout << std::endl; + // std::cout << "Trigger Header Channel: " << *(stm_frag.GetTHdr()) << std::endl; + // std::cout << "Trigger Header EvNum: " << *(stm_frag.GetTHdr()+8) << std::endl; + } + +} // produce() + +// ====================================================================== + +DEFINE_ART_MODULE(STMPrintFragments) diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index 81d9e9737e..18c25a1762 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -20,27 +20,27 @@ physics : { producers : { makeSTMDigisHPGe : { module_type : STMWaveformDigisFromFragments - stmTag : "daq:STM" - } + stmTag : "daq:STM" + } } analyzers : { - frag: - { - module_type : FragmentWatcher - mode_bitmask : 7 - } - #stm : - #{ - # module_type : STMPrintFragments - #} + # frag: + # { + # module_type : FragmentWatcher + # mode_bitmask : 7 + # } + stm : + { + module_type : STMPrintFragments + } } - t1 : [ makeSTMDigisHPGe ] - # e1 : [ stm, stmOutput ] - e1 : [ frag, stmOutput ] + t1 : [ ] # makeSTMDigisHPGe ] + e1 : [ stm, stmOutput ] + #e1 : [ frag, stmOutput ] trigger_paths : [t1] end_paths : [e1] From 1386b4364eae7f2292d320674d5a5bca834f13c8 Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Tue, 13 Jan 2026 13:20:00 -0600 Subject: [PATCH 02/29] Fix whitespace --- .../STMWaveformDigisFromFragments_module.cc | 172 +++++++++--------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/DAQ/src/STMWaveformDigisFromFragments_module.cc b/DAQ/src/STMWaveformDigisFromFragments_module.cc index c52909bfd3..14029be8bc 100644 --- a/DAQ/src/STMWaveformDigisFromFragments_module.cc +++ b/DAQ/src/STMWaveformDigisFromFragments_module.cc @@ -25,7 +25,7 @@ #include #include #include - + // ROOT includes #include #include @@ -68,7 +68,7 @@ class art::STMWaveformDigisFromFragments : public EDProducer private: art::InputTag _stmFragmentsTag; - + // Fhicl params double _width_guess; double _rise_time_guess; @@ -82,19 +82,19 @@ class art::STMWaveformDigisFromFragments : public EDProducer double avg_num = 0; // Pulse time average den double avg_den = 0; - + // Params to store end of last event int lastEventLength = 0; uint64_t lastEWT = 0; std::vector prevEvent; - + int eventCounter = 0; - + static double rising_edge(double*t, double*p); static double osc_rising_edge(double*t, double*p); double fit_rising_edge(std::vector x, std::vector y, double pulse_time); std::vector linspace(double start_in, double end_in, int num_in); - + }; // STMWaveformDigisFromFragments // ====================================================================== @@ -118,12 +118,12 @@ double STMWaveformDigisFromFragments::fit_rising_edge(std::vector x, std double amp_guess = *std::max_element(y.begin(),y.end()); // amplitude double center_guess = pulse_time; // pulse centre double t0_guess = center_guess - _width_guess / 2; // rising edge t0 - + // Find the middle of the pulse (same as middle of data) int middle = (x.size() / 2); - // x values to middle + // x values to middle std::vector fit_x(x.begin(), x.begin()+middle); - // y values to middle + // y values to middle std::vector fit_y(y.begin(), y.begin()+middle); // Get start point double start = fit_x.front(); @@ -138,7 +138,7 @@ double STMWaveformDigisFromFragments::fit_rising_edge(std::vector x, std fn->SetParameters(offset_guess, amp_guess, _rise_time_guess, t0_guess); fn->SetParNames("Offset","A","#tau","t_{0}"); fn->SetLineWidth(3); - + // Draw and fit graph TGraph *g = new TGraph(vsize, &fit_x[0], &fit_y[0]); g->Draw("A*"); @@ -161,7 +161,7 @@ std::vector STMWaveformDigisFromFragments::linspace(double start_in, dou double num = num_in; if (num == 0) { return linspaced; } - if (num == 1) + if (num == 1) { linspaced.push_back(start); return linspaced; @@ -187,7 +187,7 @@ STMWaveformDigisFromFragments::STMWaveformDigisFromFragments(const art::EDProduc ,_samp_freq(config().samp_freq()) ,_pulse_region(config().pulse_region()) ,_pulses_per_event(config().pulses_per_event()) - + { // Set the size of the vector prevEvent.resize(_pulse_region); @@ -201,7 +201,7 @@ void STMWaveformDigisFromFragments::produce(Event& event) { eventCounter++; std::unique_ptr stm_waveform_digis(new mu2e::STMWaveformDigiCollection); - + //auto STMFragments = event.getValidHandle("daq:STM"); art::Handle STMFragmentsH; if(!event.getByLabel(_stmFragmentsTag, STMFragmentsH)) { @@ -215,7 +215,7 @@ void STMWaveformDigisFromFragments::produce(Event& event) const auto& stm_frag = static_cast(frag); uint64_t EWT = *(stm_frag.EvNum()); - int16_t event_len = *(stm_frag.EvLen()); + int16_t event_len = *(stm_frag.EvLen()); detID = *(stm_frag.detID()) & 0xFF; //std::cout << "DetID: " << *(stm_frag.detID()) << " | " << detID << "\n"; //std::cout << "In event: " << event_number << " | Length of event: " << event_len << "\n"; @@ -234,7 +234,7 @@ void STMWaveformDigisFromFragments::produce(Event& event) uint64_t ADC; memcpy(&ADC, adc, sizeof(ADC)); //std::cout << "ADC time = " << ADC << " = " << (ADC/75e6) << "\n"; - + std::vector adcs; adcs.reserve(event_len); for (int16_t i_adc_sample = 0; i_adc_sample < event_len; ++i_adc_sample) { @@ -247,79 +247,79 @@ void STMWaveformDigisFromFragments::produce(Event& event) // Initialise vectors for pulse locations and fit vals std::vector pulse_locs; std::vector fit_vals; - + // Get and fit the pulses for(size_t i=0; i < adcs.size(); i++){ // If the data is above the pulse threshold if (adcs[i] > _threshold) { - // If the pulse started in the previous event - if (avg_den > 0 && i == 0) { - // Reset the average number... - avg_num = 0; - // Sum negative value from the previous event - for (int k = -avg_den; k < 0; ++k) { - avg_num += k; - } - } // End if pulse in previous event - // Average pulse time numerator - avg_num += i; - // Average pulse time denonimator - avg_den += 1; + // If the pulse started in the previous event + if (avg_den > 0 && i == 0) { + // Reset the average number... + avg_num = 0; + // Sum negative value from the previous event + for (int k = -avg_den; k < 0; ++k) { + avg_num += k; + } + } // End if pulse in previous event + // Average pulse time numerator + avg_num += i; + // Average pulse time denonimator + avg_den += 1; } else { - // Else if not in a pulse region - if (avg_num != 0) { - // Calculate the pulse time average - int avg_time = static_cast(avg_num / avg_den); - // Store current pulse location - double pulse_loc = avg_time; - // Minimum pulse fit region - int pulse_min = static_cast(pulse_loc - (_pulse_region - 1) / 2); - // Maximum pulse fit region - int pulse_max = static_cast(pulse_loc + (_pulse_region - 1) / 2); - // Get diff - int pulse_diff = (pulse_max+1) - pulse_min; - // x values to fit - double p_min = pulse_min / _samp_freq; - double p_max = pulse_max / _samp_freq; - std::vector x(_pulse_region); - // Find linspace in pulse region - x = linspace(p_min, p_max, _pulse_region); - // y values to fit - std::vector y; - for(int k=0; k < pulse_diff; k++){ - y.push_back(adcs[pulse_min + k]); - } - // If the minimum pulse fit region is in the previous event - if (pulse_min < 0) { - // get start value in last event to copy - int del = pulse_min + _pulse_region; - // Store the y data that is in the previous event - std::vector prev_event(prevEvent.begin() + del, prevEvent.end()); - // Store the y data that is in this event - std::vector this_event(adcs.begin(), adcs.begin() + pulse_max + 1); - // New y values to fit - y.insert(y.begin(), prev_event.begin(), prev_event.end()); - y.insert(y.end(), this_event.begin(), this_event.end()); - } - // Fit rising edge - double rising_edge_fit = fit_rising_edge(x, y, pulse_loc / _samp_freq); - if(rising_edge_fit > 0){ - // rising edge is not in last event - // Save pulse time and fit vals in this event - pulse_locs.push_back(pulse_loc); - fit_vals.push_back(rising_edge_fit); - } - // Save the length of the event - lastEventLength = adcs.size(); - // Save last pulse region of event - int copyloc = adcs.size() - _pulse_region; - prevEvent.insert(prevEvent.begin(), adcs.begin() + copyloc, adcs.end()); - // Increment number of pulses - pulse_num++; - } - // Reset average variables - avg_num = 0; - avg_den = 0; + // Else if not in a pulse region + if (avg_num != 0) { + // Calculate the pulse time average + int avg_time = static_cast(avg_num / avg_den); + // Store current pulse location + double pulse_loc = avg_time; + // Minimum pulse fit region + int pulse_min = static_cast(pulse_loc - (_pulse_region - 1) / 2); + // Maximum pulse fit region + int pulse_max = static_cast(pulse_loc + (_pulse_region - 1) / 2); + // Get diff + int pulse_diff = (pulse_max+1) - pulse_min; + // x values to fit + double p_min = pulse_min / _samp_freq; + double p_max = pulse_max / _samp_freq; + std::vector x(_pulse_region); + // Find linspace in pulse region + x = linspace(p_min, p_max, _pulse_region); + // y values to fit + std::vector y; + for(int k=0; k < pulse_diff; k++){ + y.push_back(adcs[pulse_min + k]); + } + // If the minimum pulse fit region is in the previous event + if (pulse_min < 0) { + // get start value in last event to copy + int del = pulse_min + _pulse_region; + // Store the y data that is in the previous event + std::vector prev_event(prevEvent.begin() + del, prevEvent.end()); + // Store the y data that is in this event + std::vector this_event(adcs.begin(), adcs.begin() + pulse_max + 1); + // New y values to fit + y.insert(y.begin(), prev_event.begin(), prev_event.end()); + y.insert(y.end(), this_event.begin(), this_event.end()); + } + // Fit rising edge + double rising_edge_fit = fit_rising_edge(x, y, pulse_loc / _samp_freq); + if(rising_edge_fit > 0){ + // rising edge is not in last event + // Save pulse time and fit vals in this event + pulse_locs.push_back(pulse_loc); + fit_vals.push_back(rising_edge_fit); + } + // Save the length of the event + lastEventLength = adcs.size(); + // Save last pulse region of event + int copyloc = adcs.size() - _pulse_region; + prevEvent.insert(prevEvent.begin(), adcs.begin() + copyloc, adcs.end()); + // Increment number of pulses + pulse_num++; + } + // Reset average variables + avg_num = 0; + avg_den = 0; } } // Make sure variables are reset if events are not consecutive @@ -331,17 +331,17 @@ void STMWaveformDigisFromFragments::produce(Event& event) double peak_fitTime1 = 0; double peak_fitTime2 = 0; double peak_sep = 0; - // Find separation of first two consecutive pulses + // Find separation of first two consecutive pulses if(pulse_locs.size()>2){ peak_fitTime1 = fit_vals[0]*1e9; peak_fitTime2 = fit_vals[1]*1e9; peak_sep = (peak_fitTime2 - peak_fitTime1); } std::cout << "pulse 0 = " << peak_fitTime1 << " | pulse 1 = " << peak_fitTime2 << " | pulse sep = " << peak_sep << "\n"; - + // Store EWT lastEWT = EWT; - + // Create the STMWaveformDigi and put it in the event uint32_t trig_time_offset = 0; mu2e::STMWaveformDigi stm_waveform(detID, EWT, DTC, ADC, trig_time_offset, peak_fitTime1, peak_fitTime2, peak_sep, adcs); From f7aced11c9ce60fa0284f6dacd2b1e250c45eacf Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Tue, 13 Jan 2026 16:24:55 -0600 Subject: [PATCH 03/29] Print all data in STMPrintFragments --- DAQ/src/STMPrintFragments_module.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/DAQ/src/STMPrintFragments_module.cc b/DAQ/src/STMPrintFragments_module.cc index 40a2236041..9ac20d7743 100644 --- a/DAQ/src/STMPrintFragments_module.cc +++ b/DAQ/src/STMPrintFragments_module.cc @@ -87,11 +87,13 @@ void STMPrintFragments::analyze(const Event& event) for (auto& frag : *STMFragments) { ++frag_counter; - auto stm_frag = static_cast(frag); - // const auto dataBegin = stm_frag.dataBegin(); - const auto stmDataBegin = stm_frag.GetTHdr();//reinterpret_cast(dataBegin); - for (size_t i = 0; i < 100; ++i) { - std::cout << "Frag #" << frag_counter << ": *(stmDataBegin+" << i << ") = " << *(stmDataBegin+i) << std::endl; + // auto stm_frag = static_cast(frag); + const auto dataBegin = frag.dataBegin(); + const auto dataEnd = frag.dataEnd(); + const auto stmDataBegin = reinterpret_cast(dataBegin); + const auto stmDataEnd = reinterpret_cast(dataEnd); + for (auto i = stmDataBegin; i != stmDataEnd; ++i) { + std::cout << "Frag #" << frag_counter << ": *(stmDataBegin+" << i - stmDataBegin << ") = " << *i << std::endl; } // // std::cout << "Trigger Header Address: " << stm_frag.GetTHdr() << std::endl; From 7726df5dbfc0adebd43277045d4e294ab19bf5d5 Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Tue, 13 Jan 2026 16:27:06 -0600 Subject: [PATCH 04/29] Update STM modules for running on new dummy data --- DAQ/src/STMDigisFromFragments_module.cc | 130 +++++++++++++++++++++ DAQ/test/inspectSTMFile.fcl | 20 ++-- RecoDataProducts/inc/STMWaveformDigi.hh | 9 +- STMReco/fcl/plotSTMWaveformDigis.fcl | 29 ++--- STMReco/src/PlotSTMWaveformDigis_module.cc | 4 +- 5 files changed, 158 insertions(+), 34 deletions(-) create mode 100644 DAQ/src/STMDigisFromFragments_module.cc diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc new file mode 100644 index 0000000000..4e824a946d --- /dev/null +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -0,0 +1,130 @@ +// ====================================================================== +// +// STMDigisFromFragments: create all types of STMDigis from STMFragments +// +// ====================================================================== + +#include "art/Framework/Core/EDProducer.h" +#include "art/Framework/Principal/Event.h" +#include "art/Framework/Services/Registry/ServiceHandle.h" +#include "fhiclcpp/ParameterSet.h" + +#include "Offline/ProditionsService/inc/ProditionsHandle.hh" +#include "Offline/RecoDataProducts/inc/STMWaveformDigi.hh" +#include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" +#include "art/Framework/Principal/Handle.h" +#include "artdaq-core-mu2e/Overlays/STMFragment.hh" +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ROOT includes +#include +#include +#include +#include +#include +#include +#include +#include + +namespace art +{ + class STMDigisFromFragments; +} + +using art::STMDigisFromFragments; + +// ====================================================================== + +class art::STMDigisFromFragments : public EDProducer +{ + public: + struct Config + { + fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("Input module")}; + // TODO: add fhicl parameters to that we can choose which types of fragments we read out + // e.g. fhicl::Atom processRaw {fhicl::Name("processRaw"), fhicl::Comment("Process Raw STMFragments")}; + }; + + // --- C'tor/d'tor: + explicit STMDigisFromFragments(const art::EDProducer::Table& config); + + // --- Production: + virtual void produce(Event&); + + private: + + art::InputTag _stmFragmentsTag; + +}; // STMDigisFromFragments + +// ====================================================================== + + +STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table& config) : + art::EDProducer{config} + ,_stmFragmentsTag(config().stmTag()) + +{ + // Set the size of the vector + produces("raw"); + produces("zs"); + produces("mwd"); // TODO: we should create an STMMWDDigi collection instead of STMWaveformDigis for this +} + +// ---------------------------------------------------------------------- + + +void STMDigisFromFragments::produce(Event& event) +{ + std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr mwd_waveform_digis(new mu2e::STMWaveformDigiCollection); + + art::Handle STMFragmentsH; + event.getByLabel(_stmFragmentsTag, STMFragmentsH); + const auto STMFragments = STMFragmentsH.product(); + + int frag_id = 0; // TODO: read from the STMFragment itself + for (const auto& frag : *STMFragments) { + // const auto& stm_frag = static_cast(frag); + const auto dataBegin = frag.dataBegin(); + const auto dataEnd = frag.dataEnd(); + const auto stmDataBegin = reinterpret_cast(dataBegin); + const auto stmDataEnd = reinterpret_cast(dataEnd); + auto n_data = stmDataEnd - stmDataBegin; // TODO: read from the STMFragment itself + + mu2e::STMWaveformDigi stm_waveform; + stm_waveform.set_data(n_data, stmDataBegin); + + if (frag_id == 0) { + raw_waveform_digis->emplace_back(stm_waveform); + } + else if (frag_id == 1) { + zs_waveform_digis->emplace_back(stm_waveform); + } + else if (frag_id == 2) { + mwd_waveform_digis->emplace_back(stm_waveform); + } + ++frag_id; + } + + event.put(std::move(raw_waveform_digis), "raw"); + event.put(std::move(zs_waveform_digis), "zs"); + event.put(std::move(mwd_waveform_digis), "mwd"); + +} // produce() + +// ====================================================================== + +DEFINE_ART_MODULE(STMDigisFromFragments) diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index 18c25a1762..8558ca9751 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -9,8 +9,6 @@ process_name : STMDigiFromFragment source : { module_type : RootInput fileNames : @nil - - # firstEvent : 500 maxEvents : -1 } @@ -18,10 +16,10 @@ source : { physics : { producers : { - makeSTMDigisHPGe : { - module_type : STMWaveformDigisFromFragments + makeSTMDigis : { + module_type : STMDigisFromFragments stmTag : "daq:STM" - } + } } analyzers : { @@ -31,15 +29,16 @@ physics : { # module_type : FragmentWatcher # mode_bitmask : 7 # } - stm : + stmPrint : { module_type : STMPrintFragments } } - t1 : [ ] # makeSTMDigisHPGe ] - e1 : [ stm, stmOutput ] + t1 : [ makeSTMDigis ] +# e1 : [ stmOutput ] + e1 : [ stmPrint, stmOutput ] #e1 : [ frag, stmOutput ] trigger_paths : [t1] @@ -50,7 +49,8 @@ physics : { outputs : { stmOutput : { module_type : RootOutput - fileName : "dig.stm.art" - outputCommands : [ "drop *_*_*_*", "keep mu2e::STMWaveformDigis_*_*_*" ] + fileName : "dig.stm.art" + outputCommands : [ "keep *_*_*_*", "drop artdaq::*_*_*_*" ] +# outputCommands : [ "drop *_*_*_*", "keep mu2e::STMWaveformDigis_*_*_*" ] } } diff --git a/RecoDataProducts/inc/STMWaveformDigi.hh b/RecoDataProducts/inc/STMWaveformDigi.hh index 276b923df4..a506dbc682 100644 --- a/RecoDataProducts/inc/STMWaveformDigi.hh +++ b/RecoDataProducts/inc/STMWaveformDigi.hh @@ -35,16 +35,17 @@ namespace mu2e { double peak_fitTime2 () const { return _peak_fitTime2; } double peak_sep () const { return _peak_sep; } const std::vector& adcs () const { return _adcs; } - + void set_data ( size_t n_data, int16_t const* data ) { _adcs.resize(n_data); std::copy(data, data+n_data, _adcs.begin()); } // TODO: remove this method + private: int16_t _DetID; uint64_t _EWT; uint64_t _DTCtime; uint64_t _ADCtime; uint32_t _trigTimeOffset; // time offset from EWT? to first ADC value [ct] - double _peak_fitTime1; // fit time of first rising edge (ns) - double _peak_fitTime2; // fit time of second rising edge (ns) - double _peak_sep; // separation time (ns) + double _peak_fitTime1; // fit time of first rising edge (ns) // TODO: remove this parameter + double _peak_fitTime2; // fit time of second rising edge (ns) // TODO: remove this parameter + double _peak_sep; // separation time (ns) // TODO: remove this parameter std::vector _adcs; // vector of ADC values for the waveform }; diff --git a/STMReco/fcl/plotSTMWaveformDigis.fcl b/STMReco/fcl/plotSTMWaveformDigis.fcl index f51f63401f..010501e5cd 100644 --- a/STMReco/fcl/plotSTMWaveformDigis.fcl +++ b/STMReco/fcl/plotSTMWaveformDigis.fcl @@ -21,40 +21,33 @@ physics: { producers : { } filters : { } analyzers : { - plotHPGeWaveformDigis : { + plotRawWaveformDigis : { module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "FromSTMTestBeamData:HPGe" + stmWaveformDigisTag : "makeSTMDigis:raw" subtractPedestal : false verbosityLevel : 0 - xAxis : "event_time" + xAxis : "sample_number" } - plotLaBrWaveformDigis : { + plotZSWaveformDigis : { module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "FromSTMTestBeamData:LaBr" + stmWaveformDigisTag : "makeSTMDigis:zs" subtractPedestal : false verbosityLevel : 0 - xAxis : "event_time" + xAxis : "sample_number" } - plotHPGeWaveformDigisZP : { + plotMWDWaveformDigis : { module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "zeroSuppressHPGe" + stmWaveformDigisTag : "makeSTMDigis:mwd" subtractPedestal : false verbosityLevel : 0 - xAxis : "event_time" - } - plotLaBrWaveformDigisZP : { - module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "zeroSuppressLaBr" - subtractPedestal : false - verbosityLevel : 0 - xAxis : "event_time" + xAxis : "sample_number" } } # setup paths trigger_paths: [ ] - anaPath : [ plotHPGeWaveformDigis, plotLaBrWaveformDigis, - plotHPGeWaveformDigisZP, plotLaBrWaveformDigisZP ] + anaPath : [ plotRawWaveformDigis, plotZSWaveformDigis, + plotMWDWaveformDigis ] end_paths: [anaPath] } diff --git a/STMReco/src/PlotSTMWaveformDigis_module.cc b/STMReco/src/PlotSTMWaveformDigis_module.cc index ba314322bc..bcfd8d8aa1 100644 --- a/STMReco/src/PlotSTMWaveformDigis_module.cc +++ b/STMReco/src/PlotSTMWaveformDigis_module.cc @@ -57,7 +57,7 @@ namespace mu2e { _subtractPedestal(config().subtractPedestal()), _xAxis(config().xAxis()), _verbosityLevel(config().verbosityLevel()), - _channel(STMUtils::getChannel(config().stmWaveformDigisTag())) + _channel(STMChannel::findByName("HPGe")) // FIXME: don't hardcode this probably don't want to do what we had before and try to infer it from the art::InputTag like this "STMUtils::getChannel(config().stmWaveformDigisTag()))" { } void PlotSTMWaveformDigis::analyze(const art::Event& event) { @@ -77,7 +77,7 @@ namespace mu2e { for (const auto& adcs : *waveformsHandle) { histname.str(""); - histname << "evt" << event.event() << "_adcs" << count; + histname << "evt" << event.event() << "_waveform" << count; histtitle.str(""); histtitle << "Event " << event.event() << " Waveform " << count << " (" << _channel.name() << ")"; From 85a3d7b024ea15b9a455ab5e229203e77040432f Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Fri, 16 Jan 2026 11:24:55 -0600 Subject: [PATCH 05/29] Update CMakeLists for STM modules and add ROOT macro --- DAQ/CMakeLists.txt | 25 ++++++++++++++++++++- DAQ/src/STMDigisFromFragments_module.cc | 13 ++++++----- DAQ/src/STMPrintFragments_module.cc | 2 ++ STMReco/test/plotDummyDigis.C | 30 +++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 STMReco/test/plotDummyDigis.C diff --git a/DAQ/CMakeLists.txt b/DAQ/CMakeLists.txt index d32ee8e7c6..d519b93851 100644 --- a/DAQ/CMakeLists.txt +++ b/DAQ/CMakeLists.txt @@ -99,7 +99,28 @@ cet_build_plugin(STMWaveformDigisFromFragments art::module Offline::RecoDataProducts BTrk_difAlgebra ) - + +cet_build_plugin(STMDigisFromFragments art::module + REG_SOURCE src/STMDigisFromFragments_module.cc + LIBRARIES REG + Offline::DAQ + Offline::ProditionsService + Offline::DataProducts + Offline::RecoDataProducts + BTrk_difAlgebra +) + +cet_build_plugin(STMPrintFragments art::module + REG_SOURCE src/STMPrintFragments_module.cc + LIBRARIES REG + Offline::DAQ + Offline::ProditionsService + Offline::DataProducts + Offline::RecoDataProducts + BTrk_difAlgebra +) + + cet_build_plugin(StrawDigisFromArtdaqFragments art::module REG_SOURCE src/StrawDigisFromArtdaqFragments_module.cc LIBRARIES REG @@ -184,6 +205,8 @@ cet_build_plugin(MTPHitsFromDTCEvents art::module Offline::RecoDataProducts ) +install(DIRECTORY test DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/Offline/DAQ) install_source(SUBDIRS src) install_headers(USE_PROJECT_NAME SUBDIRS inc) install_fhicl(SUBDIRS fcl SUBDIRNAME Offline/DAQ/fcl) +install_fhicl(SUBDIRS test GLOB SUBDIRNAME Offline/DAQ/test) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 4e824a946d..6374f21464 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -95,8 +95,8 @@ void STMDigisFromFragments::produce(Event& event) event.getByLabel(_stmFragmentsTag, STMFragmentsH); const auto STMFragments = STMFragmentsH.product(); - int frag_id = 0; // TODO: read from the STMFragment itself for (const auto& frag : *STMFragments) { + auto frag_id = frag.fragmentID(); // const auto& stm_frag = static_cast(frag); const auto dataBegin = frag.dataBegin(); const auto dataEnd = frag.dataEnd(); @@ -105,18 +105,19 @@ void STMDigisFromFragments::produce(Event& event) auto n_data = stmDataEnd - stmDataBegin; // TODO: read from the STMFragment itself mu2e::STMWaveformDigi stm_waveform; - stm_waveform.set_data(n_data, stmDataBegin); - if (frag_id == 0) { + if (frag_id == 100) { + stm_waveform.set_data(n_data-mu2e::STMFragment::RAW_HEADER_LEN, stmDataBegin+mu2e::STMFragment::RAW_HEADER_LEN); raw_waveform_digis->emplace_back(stm_waveform); } - else if (frag_id == 1) { + else if (frag_id == 101) { + stm_waveform.set_data(n_data-mu2e::STMFragment::ZS_HEADER_LEN, stmDataBegin+mu2e::STMFragment::ZS_HEADER_LEN); zs_waveform_digis->emplace_back(stm_waveform); } - else if (frag_id == 2) { + else if (frag_id == 102) { + stm_waveform.set_data(n_data-mu2e::STMFragment::MWD_HEADER_LEN, stmDataBegin+mu2e::STMFragment::MWD_HEADER_LEN); mwd_waveform_digis->emplace_back(stm_waveform); } - ++frag_id; } event.put(std::move(raw_waveform_digis), "raw"); diff --git a/DAQ/src/STMPrintFragments_module.cc b/DAQ/src/STMPrintFragments_module.cc index 9ac20d7743..6957419b89 100644 --- a/DAQ/src/STMPrintFragments_module.cc +++ b/DAQ/src/STMPrintFragments_module.cc @@ -92,6 +92,8 @@ void STMPrintFragments::analyze(const Event& event) const auto dataEnd = frag.dataEnd(); const auto stmDataBegin = reinterpret_cast(dataBegin); const auto stmDataEnd = reinterpret_cast(dataEnd); + auto frag_id = frag.fragmentID(); + std::cout << "frag_id = " << frag_id << std::endl; for (auto i = stmDataBegin; i != stmDataEnd; ++i) { std::cout << "Frag #" << frag_counter << ": *(stmDataBegin+" << i - stmDataBegin << ") = " << *i << std::endl; } diff --git a/STMReco/test/plotDummyDigis.C b/STMReco/test/plotDummyDigis.C new file mode 100644 index 0000000000..ab6c98fef4 --- /dev/null +++ b/STMReco/test/plotDummyDigis.C @@ -0,0 +1,30 @@ +// +// +void plotDummyDigis(std::string filename = "stmWaveformDigis.root") { + + TFile* file = new TFile(filename.c_str(), "READ"); + + TCanvas* c1 = new TCanvas(); + c1->Divide(2, 2); + + c1->cd(1); + TH1F* hRawWaveform = (TH1F*) file->Get("plotRawWaveformDigis/evt0_waveform0"); + TString title(hRawWaveform->GetTitle()); + title += " RAW"; + hRawWaveform->SetTitle(title); + hRawWaveform->Draw("HIST"); + + c1->cd(2); + TH1F* hZSWaveform = (TH1F*) file->Get("plotZSWaveformDigis/evt0_waveform0"); + title = hZSWaveform->GetTitle(); + title += " ZS"; + hZSWaveform->SetTitle(title); + hZSWaveform->Draw("HIST"); + + c1->cd(3); + TH1F* hMWDWaveform = (TH1F*) file->Get("plotMWDWaveformDigis/evt0_waveform0"); + title = hMWDWaveform->GetTitle(); + title += " MWD"; + hMWDWaveform->SetTitle(title); + hMWDWaveform->Draw("HIST"); +} From c54393cc6c2eabb8f10ab2eaa30cf74dfaf426bc Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Wed, 4 Feb 2026 13:20:19 -0600 Subject: [PATCH 06/29] Remove old STM unpacking module --- DAQ/CMakeLists.txt | 10 - .../STMWaveformDigisFromFragments_module.cc | 357 ------------------ 2 files changed, 367 deletions(-) delete mode 100644 DAQ/src/STMWaveformDigisFromFragments_module.cc diff --git a/DAQ/CMakeLists.txt b/DAQ/CMakeLists.txt index d519b93851..be1c885513 100644 --- a/DAQ/CMakeLists.txt +++ b/DAQ/CMakeLists.txt @@ -90,16 +90,6 @@ cet_build_plugin(PrefetchDAQData art::module Offline::RecoDataProducts ) -cet_build_plugin(STMWaveformDigisFromFragments art::module - REG_SOURCE src/STMWaveformDigisFromFragments_module.cc - LIBRARIES REG - Offline::DAQ - Offline::ProditionsService - Offline::DataProducts - Offline::RecoDataProducts - BTrk_difAlgebra -) - cet_build_plugin(STMDigisFromFragments art::module REG_SOURCE src/STMDigisFromFragments_module.cc LIBRARIES REG diff --git a/DAQ/src/STMWaveformDigisFromFragments_module.cc b/DAQ/src/STMWaveformDigisFromFragments_module.cc deleted file mode 100644 index 14029be8bc..0000000000 --- a/DAQ/src/STMWaveformDigisFromFragments_module.cc +++ /dev/null @@ -1,357 +0,0 @@ -// ====================================================================== -// -// STMWaveformDigisFromFragments: create STMWaveformDigis from STMFragments -// -// ====================================================================== - -#include "art/Framework/Core/EDProducer.h" -#include "art/Framework/Principal/Event.h" -#include "art/Framework/Services/Registry/ServiceHandle.h" -#include "fhiclcpp/ParameterSet.h" - -#include "Offline/ProditionsService/inc/ProditionsHandle.hh" -#include "Offline/RecoDataProducts/inc/STMWaveformDigi.hh" -#include "art/Framework/Principal/Handle.h" -#include "artdaq-core-mu2e/Overlays/STMFragment.hh" -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ROOT includes -#include -#include -#include -#include -#include -#include -#include -#include - -namespace art -{ - class STMWaveformDigisFromFragments; -} - -using art::STMWaveformDigisFromFragments; - -// ====================================================================== - -class art::STMWaveformDigisFromFragments : public EDProducer -{ - public: - struct Config - { - fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("Input module")}; - fhicl::Atom width_guess{ fhicl::Name("width_guess"), fhicl::Comment("Estimate of pulse width for fit (default = 150e-9)")}; - fhicl::Atom rise_time_guess{ fhicl::Name("rise_time_guess"), fhicl::Comment("Estimate of pulse rise time for fit (default = 6e-9)")}; - fhicl::Atom threshold{ fhicl::Name("threshold"), fhicl::Comment("Threshold to define the peak (default = 20000)")}; - fhicl::Atom samp_freq{ fhicl::Name("samp_freq"), fhicl::Comment("Sampling frequency of ADC (default = 300e6)")}; - fhicl::Atom pulse_region{ fhicl::Name("pulse_region"), fhicl::Comment("Number of ADC values to fit around pulse (default 51)")}; - fhicl::Atom pulses_per_event{fhicl::Name("pulses_per_event"), fhicl::Comment("Number of pulses per event to find Delta t (default = 2)")}; - }; - - // --- C'tor/d'tor: - explicit STMWaveformDigisFromFragments(const art::EDProducer::Table& config); - - // --- Production: - virtual void produce(Event&); - - private: - - art::InputTag _stmFragmentsTag; - - // Fhicl params - double _width_guess; - double _rise_time_guess; - double _threshold; - double _samp_freq; - int _pulse_region; - int _pulses_per_event; - - // Averaging params - // Pulse time average num - double avg_num = 0; - // Pulse time average den - double avg_den = 0; - - // Params to store end of last event - int lastEventLength = 0; - uint64_t lastEWT = 0; - std::vector prevEvent; - - int eventCounter = 0; - - static double rising_edge(double*t, double*p); - static double osc_rising_edge(double*t, double*p); - double fit_rising_edge(std::vector x, std::vector y, double pulse_time); - std::vector linspace(double start_in, double end_in, int num_in); - -}; // STMWaveformDigisFromFragments - -// ====================================================================== - -// Rising edge function -double STMWaveformDigisFromFragments::rising_edge(double* t, double* p){ - - double offset = p[0]; - double amplitude = p[1]; - double rise_time = p[2]; - double t0 = p[3]; - return offset + amplitude * (1 - exp(-(t[0] - t0) / rise_time)) * (t[0] >= t0); - -} - -// Fitting function -double STMWaveformDigisFromFragments::fit_rising_edge(std::vector x, std::vector y, double pulse_time) { - - // Function guess values - double offset_guess = *std::min_element(y.begin(),y.end()); // offset - double amp_guess = *std::max_element(y.begin(),y.end()); // amplitude - double center_guess = pulse_time; // pulse centre - double t0_guess = center_guess - _width_guess / 2; // rising edge t0 - - // Find the middle of the pulse (same as middle of data) - int middle = (x.size() / 2); - // x values to middle - std::vector fit_x(x.begin(), x.begin()+middle); - // y values to middle - std::vector fit_y(y.begin(), y.begin()+middle); - // Get start point - double start = fit_x.front(); - // Get end point - double end = fit_x.back(); - - int vsize = fit_x.size(); - - // Fit all pulses - TF1* fn = new TF1("fn", rising_edge, start, end, 4); - // Initial guesses for the parameters - fn->SetParameters(offset_guess, amp_guess, _rise_time_guess, t0_guess); - fn->SetParNames("Offset","A","#tau","t_{0}"); - fn->SetLineWidth(3); - - // Draw and fit graph - TGraph *g = new TGraph(vsize, &fit_x[0], &fit_y[0]); - g->Draw("A*"); - g->Fit("fn","Q"); - double rise_time = fn->GetParameter(2); - double t0 = fn->GetParameter(3); - // Calculate rising edge - double rising_edge_fit = t0 + rise_time; - // Return rising edge - return rising_edge_fit; -} - -std::vector STMWaveformDigisFromFragments::linspace(double start_in, double end_in, int num_in) -{ - - std::vector linspaced; - - double start = start_in; - double end = end_in; - double num = num_in; - - if (num == 0) { return linspaced; } - if (num == 1) - { - linspaced.push_back(start); - return linspaced; - } - - double delta = (end - start) / (num - 1); - - for(int i=0; i < num-1; ++i) - { - linspaced.push_back(start + delta * i); - } - linspaced.push_back(end); // I want to ensure that start and end - // are exactly the same as the input - return linspaced; -} - -STMWaveformDigisFromFragments::STMWaveformDigisFromFragments(const art::EDProducer::Table& config) : - art::EDProducer{config} - ,_stmFragmentsTag(config().stmTag()) - ,_width_guess(config().width_guess()) - ,_rise_time_guess(config().rise_time_guess()) - ,_threshold(config().threshold()) - ,_samp_freq(config().samp_freq()) - ,_pulse_region(config().pulse_region()) - ,_pulses_per_event(config().pulses_per_event()) - -{ - // Set the size of the vector - prevEvent.resize(_pulse_region); - produces(); -} - -// ---------------------------------------------------------------------- - - -void STMWaveformDigisFromFragments::produce(Event& event) -{ - eventCounter++; - std::unique_ptr stm_waveform_digis(new mu2e::STMWaveformDigiCollection); - - //auto STMFragments = event.getValidHandle("daq:STM"); - art::Handle STMFragmentsH; - if(!event.getByLabel(_stmFragmentsTag, STMFragmentsH)) { - event.put(std::move(stm_waveform_digis)); - return; - } - const auto STMFragments = STMFragmentsH.product(); - - int16_t detID = 0; - for (const auto& frag : *STMFragments) { - const auto& stm_frag = static_cast(frag); - - uint64_t EWT = *(stm_frag.EvNum()); - int16_t event_len = *(stm_frag.EvLen()); - detID = *(stm_frag.detID()) & 0xFF; - //std::cout << "DetID: " << *(stm_frag.detID()) << " | " << detID << "\n"; - //std::cout << "In event: " << event_number << " | Length of event: " << event_len << "\n"; - - // Get 40MHz DTC clock time - uint16_t DTC0 = static_cast((*(stm_frag.GetTHdr() + 28) >> 8) & 0xF) & 0xFFFF; - uint16_t DTC1 = static_cast(*(stm_frag.GetTHdr() + 29)) & 0xFFFF; - uint16_t DTC2 = static_cast(*(stm_frag.GetTHdr() + 30)) & 0xFFFF; - uint16_t DTC3 = static_cast(*(stm_frag.GetTHdr() + 31)) & 0xFFFF; - uint64_t DTC = static_cast(DTC3) << 40 | static_cast(DTC2) << 24 | static_cast(DTC1) << 8 | static_cast(DTC0); - //std::cout << "DTCs: " << std::hex << DTC0 << " " << DTC1 << " " << DTC2 << " " << DTC3 << " --> " << DTC << std::dec << std::endl; - //std::cout << "DTC time = " << DTC << " = " << (DTC/40e6) << "\n"; - - // Get 75MHz ADC clock time - int16_t adc[4] = {*(stm_frag.GetTHdr() + 4),*(stm_frag.GetTHdr() + 5),*(stm_frag.GetTHdr() + 6),*(stm_frag.GetTHdr() + 7)}; - uint64_t ADC; - memcpy(&ADC, adc, sizeof(ADC)); - //std::cout << "ADC time = " << ADC << " = " << (ADC/75e6) << "\n"; - - std::vector adcs; - adcs.reserve(event_len); - for (int16_t i_adc_sample = 0; i_adc_sample < event_len; ++i_adc_sample) { - adcs.emplace_back(*(stm_frag.DataBegin()+i_adc_sample)); - } - - // Number of pulses - int pulse_num = 0; - - // Initialise vectors for pulse locations and fit vals - std::vector pulse_locs; - std::vector fit_vals; - - // Get and fit the pulses - for(size_t i=0; i < adcs.size(); i++){ - // If the data is above the pulse threshold - if (adcs[i] > _threshold) { - // If the pulse started in the previous event - if (avg_den > 0 && i == 0) { - // Reset the average number... - avg_num = 0; - // Sum negative value from the previous event - for (int k = -avg_den; k < 0; ++k) { - avg_num += k; - } - } // End if pulse in previous event - // Average pulse time numerator - avg_num += i; - // Average pulse time denonimator - avg_den += 1; - } else { - // Else if not in a pulse region - if (avg_num != 0) { - // Calculate the pulse time average - int avg_time = static_cast(avg_num / avg_den); - // Store current pulse location - double pulse_loc = avg_time; - // Minimum pulse fit region - int pulse_min = static_cast(pulse_loc - (_pulse_region - 1) / 2); - // Maximum pulse fit region - int pulse_max = static_cast(pulse_loc + (_pulse_region - 1) / 2); - // Get diff - int pulse_diff = (pulse_max+1) - pulse_min; - // x values to fit - double p_min = pulse_min / _samp_freq; - double p_max = pulse_max / _samp_freq; - std::vector x(_pulse_region); - // Find linspace in pulse region - x = linspace(p_min, p_max, _pulse_region); - // y values to fit - std::vector y; - for(int k=0; k < pulse_diff; k++){ - y.push_back(adcs[pulse_min + k]); - } - // If the minimum pulse fit region is in the previous event - if (pulse_min < 0) { - // get start value in last event to copy - int del = pulse_min + _pulse_region; - // Store the y data that is in the previous event - std::vector prev_event(prevEvent.begin() + del, prevEvent.end()); - // Store the y data that is in this event - std::vector this_event(adcs.begin(), adcs.begin() + pulse_max + 1); - // New y values to fit - y.insert(y.begin(), prev_event.begin(), prev_event.end()); - y.insert(y.end(), this_event.begin(), this_event.end()); - } - // Fit rising edge - double rising_edge_fit = fit_rising_edge(x, y, pulse_loc / _samp_freq); - if(rising_edge_fit > 0){ - // rising edge is not in last event - // Save pulse time and fit vals in this event - pulse_locs.push_back(pulse_loc); - fit_vals.push_back(rising_edge_fit); - } - // Save the length of the event - lastEventLength = adcs.size(); - // Save last pulse region of event - int copyloc = adcs.size() - _pulse_region; - prevEvent.insert(prevEvent.begin(), adcs.begin() + copyloc, adcs.end()); - // Increment number of pulses - pulse_num++; - } - // Reset average variables - avg_num = 0; - avg_den = 0; - } - } - // Make sure variables are reset if events are not consecutive - if(EWT != lastEWT+1){ - avg_num = 0; - avg_den = 0; - } - - double peak_fitTime1 = 0; - double peak_fitTime2 = 0; - double peak_sep = 0; - // Find separation of first two consecutive pulses - if(pulse_locs.size()>2){ - peak_fitTime1 = fit_vals[0]*1e9; - peak_fitTime2 = fit_vals[1]*1e9; - peak_sep = (peak_fitTime2 - peak_fitTime1); - } - std::cout << "pulse 0 = " << peak_fitTime1 << " | pulse 1 = " << peak_fitTime2 << " | pulse sep = " << peak_sep << "\n"; - - // Store EWT - lastEWT = EWT; - - // Create the STMWaveformDigi and put it in the event - uint32_t trig_time_offset = 0; - mu2e::STMWaveformDigi stm_waveform(detID, EWT, DTC, ADC, trig_time_offset, peak_fitTime1, peak_fitTime2, peak_sep, adcs); - stm_waveform_digis->push_back(stm_waveform); - } - - event.put(std::move(stm_waveform_digis)); - -} // produce() - -// ====================================================================== - -DEFINE_ART_MODULE(STMWaveformDigisFromFragments) From e4cd1b073c740139ac35d4db4adb50c1ed48eec5 Mon Sep 17 00:00:00 2001 From: Andrew Edmonds Date: Wed, 4 Feb 2026 13:56:52 -0600 Subject: [PATCH 07/29] Update STM unpacking module with new STMFragment definition --- DAQ/src/STMDigisFromFragments_module.cc | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 6374f21464..9900582d4d 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -96,26 +96,20 @@ void STMDigisFromFragments::produce(Event& event) const auto STMFragments = STMFragmentsH.product(); for (const auto& frag : *STMFragments) { - auto frag_id = frag.fragmentID(); - // const auto& stm_frag = static_cast(frag); - const auto dataBegin = frag.dataBegin(); - const auto dataEnd = frag.dataEnd(); - const auto stmDataBegin = reinterpret_cast(dataBegin); - const auto stmDataEnd = reinterpret_cast(dataEnd); - auto n_data = stmDataEnd - stmDataBegin; // TODO: read from the STMFragment itself + const auto& stm_frag = static_cast(frag); mu2e::STMWaveformDigi stm_waveform; - if (frag_id == 100) { - stm_waveform.set_data(n_data-mu2e::STMFragment::RAW_HEADER_LEN, stmDataBegin+mu2e::STMFragment::RAW_HEADER_LEN); + if (stm_frag.isRaw()) { + stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); raw_waveform_digis->emplace_back(stm_waveform); } - else if (frag_id == 101) { - stm_waveform.set_data(n_data-mu2e::STMFragment::ZS_HEADER_LEN, stmDataBegin+mu2e::STMFragment::ZS_HEADER_LEN); + else if (stm_frag.isZS()) { + stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); zs_waveform_digis->emplace_back(stm_waveform); } - else if (frag_id == 102) { - stm_waveform.set_data(n_data-mu2e::STMFragment::MWD_HEADER_LEN, stmDataBegin+mu2e::STMFragment::MWD_HEADER_LEN); + else if (stm_frag.isMWD()) { + stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); mwd_waveform_digis->emplace_back(stm_waveform); } } From a536eb57ffca6c6de5c39e3048b1b841bb94ca65 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Fri, 6 Feb 2026 16:37:28 -0600 Subject: [PATCH 08/29] Changes made by Bryan --- STMReco/src/PlotSTMWaveformDigis_module.cc | 69 ++++++++++++++++------ STMReco/test/plotDummyDigis.C | 47 +++++++++++++++ 2 files changed, 99 insertions(+), 17 deletions(-) diff --git a/STMReco/src/PlotSTMWaveformDigis_module.cc b/STMReco/src/PlotSTMWaveformDigis_module.cc index bcfd8d8aa1..e10950987a 100644 --- a/STMReco/src/PlotSTMWaveformDigis_module.cc +++ b/STMReco/src/PlotSTMWaveformDigis_module.cc @@ -9,11 +9,12 @@ #include "fhiclcpp/types/Atom.h" #include "canvas/Utilities/InputTag.h" #include "messagefacility/MessageLogger/MessageLogger.h" - #include "art_root_io/TFileService.h" #include #include +#include +#include // root #include "TH1F.h" #include "TF1.h" @@ -39,10 +40,16 @@ namespace mu2e { }; using Parameters = art::EDAnalyzer::Table; explicit PlotSTMWaveformDigis(const Parameters& conf); - + private: + void beginJob() override;//For _hist + void endJob() override; //For printing counter void analyze(const art::Event& e) override; - + + TH1F* _hist; + int ZeroLengthCount = 0; + art::InputTag _stmWaveformDigisTag; + art::ProductToken _stmWaveformDigisToken; bool _subtractPedestal; std::string _xAxis; @@ -53,6 +60,7 @@ namespace mu2e { PlotSTMWaveformDigis::PlotSTMWaveformDigis(const Parameters& config ) : art::EDAnalyzer{config}, + _stmWaveformDigisTag{config().stmWaveformDigisTag()}, _stmWaveformDigisToken(consumes(config().stmWaveformDigisTag())), _subtractPedestal(config().subtractPedestal()), _xAxis(config().xAxis()), @@ -60,6 +68,20 @@ namespace mu2e { _channel(STMChannel::findByName("HPGe")) // FIXME: don't hardcode this probably don't want to do what we had before and try to infer it from the art::InputTag like this "STMUtils::getChannel(config().stmWaveformDigisTag()))" { } + void PlotSTMWaveformDigis::beginJob(){ + + art::ServiceHandle tfs; + std::string X = std::string(_stmWaveformDigisTag.instance()); + std::transform(X.begin(),X.end(),X.begin(), toupper); + std::string hWaveLength_title = "Waveform Lengths for " + X + " Pulses"; + _hist = tfs->make("hWaveLength", hWaveLength_title.c_str() ,1000,0,1000); + + } + + void PlotSTMWaveformDigis::endJob(){ + std::cout<< " Zero length Waveforms Count = "<< ZeroLengthCount < tfs; @@ -73,30 +95,43 @@ namespace mu2e { std::cout << _channel.name() << " Pedestal = " << pedestal << std::endl; } + const auto nsPerCt = stmEnergyCalib.nsPerCt(_channel); - for (const auto& adcs : *waveformsHandle) { + for (const auto& waveform : *waveformsHandle) { + histname.str(""); histname << "evt" << event.event() << "_waveform" << count; histtitle.str(""); histtitle << "Event " << event.event() << " Waveform " << count << " (" << _channel.name() << ")"; - Binning binning = STMUtils::getBinning(adcs, _xAxis, nsPerCt); - TH1F* hWaveform = tfs->make(histname.str().c_str(), histtitle.str().c_str(), binning.nbins(),binning.low(),binning.high()); - - for (size_t i_adc = 0; i_adc < adcs.adcs().size(); ++i_adc) { - const auto adc = adcs.adcs().at(i_adc); - - auto content = adc; - if (_subtractPedestal) { - content -= pedestal; - } - - hWaveform->SetBinContent(i_adc+1, content); // bins start numbering at 1 + if (waveform.adcs().size() == 0){ + ZeroLengthCount++; + } else { + _hist->Fill(waveform.adcs().size()); //_hist was created outside so there should be no problem here + + Binning binning = STMUtils::getBinning(waveform, _xAxis, nsPerCt); + TH1F* hWaveform = tfs->make(histname.str().c_str(), histtitle.str().c_str(), binning.nbins(),binning.low(),binning.high()); + + for(size_t i_adc = 0; i_adc < waveform.adcs().size();++i_adc){ + + const auto adc = waveform.adcs().at(i_adc); + + auto content = adc; + if (_subtractPedestal) { + content -= pedestal; + } + + hWaveform->SetBinContent(i_adc+1,content); + } + + } + } + ++count; } - } } + DEFINE_ART_MODULE(mu2e::PlotSTMWaveformDigis) diff --git a/STMReco/test/plotDummyDigis.C b/STMReco/test/plotDummyDigis.C index ab6c98fef4..8955339bd0 100644 --- a/STMReco/test/plotDummyDigis.C +++ b/STMReco/test/plotDummyDigis.C @@ -12,6 +12,8 @@ void plotDummyDigis(std::string filename = "stmWaveformDigis.root") { TString title(hRawWaveform->GetTitle()); title += " RAW"; hRawWaveform->SetTitle(title); + hRawWaveform->SetLineWidth(3); + hRawWaveform->SetLineColor(kGreen); hRawWaveform->Draw("HIST"); c1->cd(2); @@ -19,6 +21,8 @@ void plotDummyDigis(std::string filename = "stmWaveformDigis.root") { title = hZSWaveform->GetTitle(); title += " ZS"; hZSWaveform->SetTitle(title); + hZSWaveform->SetLineWidth(3); + hZSWaveform->SetLineColor(kBlue); hZSWaveform->Draw("HIST"); c1->cd(3); @@ -26,5 +30,48 @@ void plotDummyDigis(std::string filename = "stmWaveformDigis.root") { title = hMWDWaveform->GetTitle(); title += " MWD"; hMWDWaveform->SetTitle(title); + hMWDWaveform->SetLineWidth(3); + hMWDWaveform->SetLineColor(kRed); hMWDWaveform->Draw("HIST"); + +//New Canvas with all the histograms in the same axis +//No need to redefine the histograms from before + TCanvas* c2 = new TCanvas(); + c2->SetTitle("STMWaveformDigis Super Imposed"); + + hRawWaveform->SetLineColor(kGreen); + hRawWaveform->SetLineWidth(3); + + hZSWaveform->SetLineColor(kBlue); + hZSWaveform->SetLineWidth(3); + + hMWDWaveform->SetLineColor(kRed); + hMWDWaveform->SetLineWidth(3); + + hRawWaveform->GetYaxis()->SetRangeUser(-1800,1800); + hRawWaveform->Draw(); + hZSWaveform->Draw("SAME"); + hMWDWaveform->Draw("SAME"); + + auto legend = new TLegend(); + legend->AddEntry(hRawWaveform, "Raw","1"); + legend->AddEntry(hZSWaveform,"ZS","1"); + legend->AddEntry(hMWDWaveform,"MWD","1"); + //legend->Draw(); + +//New Canvas where the histogram plots the number of bins from the other two + TCanvas* c3 = new TCanvas(); + c3->SetTitle("Number of bins from MWDWaveform and hZSWaveform"); + + TH1F* hDigiSize = new TH1F("hDigiSize","Number of bins in histograms",1000,0,1000); + hDigiSize->Fill(hMWDWaveform->GetNbinsX()); + hDigiSize->Fill(hZSWaveform->GetNbinsX()); + hDigiSize->Draw(); + + + //Below is used to create a copy of the previous canvas + // TCanvas* c4 = new TCanvas(); + // c4->DrawClonePad(); + } + From 6277972e6448baff02f5ed45b6eaff6ede9e743d Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Sun, 15 Feb 2026 19:11:58 -0600 Subject: [PATCH 09/29] Changes made by Bryan for STM MWD Spectrum Module --- DAQ/src/STMDigisFromFragments_module.cc | 28 ++++++++++++++++++---- DAQ/test/inspectSTMFile.fcl | 4 ++-- STMReco/fcl/plotSTMMWDSpectrum.fcl | 4 ++-- STMReco/src/PlotSTMMWDSpectrum_module.cc | 12 +++++++++- STMReco/src/PlotSTMWaveformDigis_module.cc | 2 +- 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 9900582d4d..d417351e96 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -79,7 +79,7 @@ STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table("raw"); produces("zs"); - produces("mwd"); // TODO: we should create an STMMWDDigi collection instead of STMWaveformDigis for this + produces("mwd"); // TODO: we should create an STMMWDDigi collection instead of STMWaveformDigis for this } // ---------------------------------------------------------------------- @@ -89,7 +89,8 @@ void STMDigisFromFragments::produce(Event& event) { std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); - std::unique_ptr mwd_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr mwd_digis(new mu2e::STMMWDDigiCollection); + // std::unique_ptr mwd_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); @@ -109,14 +110,31 @@ void STMDigisFromFragments::produce(Event& event) zs_waveform_digis->emplace_back(stm_waveform); } else if (stm_frag.isMWD()) { - stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); - mwd_waveform_digis->emplace_back(stm_waveform); + + int n_MWD_digis = stm_frag.payloadWords(); //number read -> to digis + + for (int i_MWD = 0 ; i_MWD < n_MWD_digis; ++i_MWD){ + + auto const* pointer = stm_frag.payloadBegin(); //tells where to read data + int16_t i_pointer = pointer[i_MWD]; //Retrives value of ith index of pointer + + mu2e::STMMWDDigi mwd_digi(0,i_pointer); + + mwd_digis->emplace_back(mwd_digi); + //mu2e::STMMWDDigi mwd_digi(0,i_pointer); + //mwd_digi->emplace_back(mwd_digi); + + + //stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin());//original + //mwd_waveform_digis->emplace_back(stm_waveform);}//original + } } + } event.put(std::move(raw_waveform_digis), "raw"); event.put(std::move(zs_waveform_digis), "zs"); - event.put(std::move(mwd_waveform_digis), "mwd"); + event.put(std::move(mwd_digis), "mwd"); } // produce() diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index 8558ca9751..b2c5b1a0af 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -37,8 +37,8 @@ physics : { } t1 : [ makeSTMDigis ] -# e1 : [ stmOutput ] - e1 : [ stmPrint, stmOutput ] + e1 : [ stmOutput ] + # e1 : [ stmPrint, stmOutput ] #e1 : [ frag, stmOutput ] trigger_paths : [t1] diff --git a/STMReco/fcl/plotSTMMWDSpectrum.fcl b/STMReco/fcl/plotSTMMWDSpectrum.fcl index 3ed41cc3e6..337789ff8c 100644 --- a/STMReco/fcl/plotSTMMWDSpectrum.fcl +++ b/STMReco/fcl/plotSTMMWDSpectrum.fcl @@ -23,12 +23,12 @@ physics: { } plotLaBrMWDSpectrum : { module_type : PlotSTMMWDSpectrum - stmMWDDigisTag : "mwdLaBr" + stmMWDDigisTag : "makeSTMDigis:mwd" } } # setup paths trigger_paths: [ ] - anaPath : [ plotHPGeMWDSpectrum, plotLaBrMWDSpectrum ] + anaPath : [ plotLaBrMWDSpectrum ] end_paths: [anaPath] } diff --git a/STMReco/src/PlotSTMMWDSpectrum_module.cc b/STMReco/src/PlotSTMMWDSpectrum_module.cc index e75051fc64..3f88df801e 100644 --- a/STMReco/src/PlotSTMMWDSpectrum_module.cc +++ b/STMReco/src/PlotSTMMWDSpectrum_module.cc @@ -17,6 +17,7 @@ #include "Offline/MCDataProducts/inc/StepPointMC.hh" #include // root +#include "TH2F.h" #include "TH1F.h" #include "TF1.h" #include "TTree.h" @@ -43,6 +44,9 @@ namespace mu2e { void beginJob() override; void analyze(const art::Event& e) override; + TH2F* _twoDhist; //Histograms of Energy vs binned event + int eventCount = 0; + TH1D* _mwdSpectrum; art::ProductToken _stmMWDDigisToken; }; @@ -56,16 +60,22 @@ namespace mu2e { art::ServiceHandle tfs; // create histograms _mwdSpectrum=tfs->make("mwdSpectrum", "MWD Spectrum", 1000, 0, 1e4); + _twoDhist=tfs->make("twoDhist","Pulse Height vs events;Event Bins; Pulse Height", + 1000,0,1000, // X-axis scale + 1000,0,1e5); // Y-axis scale } void PlotSTMMWDSpectrum::analyze(const art::Event& event) { auto mwdDigisHandle = event.getValidHandle(_stmMWDDigisToken); - + int binBlock = eventCount/100; + for (const auto& mwdDigi : *mwdDigisHandle) { auto energy = mwdDigi.energy(); _mwdSpectrum->Fill(energy); + _twoDhist->Fill(binBlock, energy); } + ++eventCount; } } diff --git a/STMReco/src/PlotSTMWaveformDigis_module.cc b/STMReco/src/PlotSTMWaveformDigis_module.cc index e10950987a..ad38759262 100644 --- a/STMReco/src/PlotSTMWaveformDigis_module.cc +++ b/STMReco/src/PlotSTMWaveformDigis_module.cc @@ -46,7 +46,7 @@ namespace mu2e { void endJob() override; //For printing counter void analyze(const art::Event& e) override; - TH1F* _hist; + TH1F* _hist; //Hist for WaveLength int ZeroLengthCount = 0; art::InputTag _stmWaveformDigisTag; From 84d2e6b1abe9054987e36cf3762a7b9d9dfea565 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Wed, 25 Feb 2026 11:49:43 -0600 Subject: [PATCH 10/29] Changes made by Bryan in attempt to read new file --- DAQ/src/STMDigisFromFragments_module.cc | 64 ++++++++++++---------- DAQ/src/STMPrintFragments_module.cc | 39 ++++++++----- DAQ/test/inspectSTMFile.fcl | 7 ++- STMReco/fcl/makeSTMHits.fcl | 6 +- STMReco/fcl/plotSTMWaveformDigis.fcl | 2 +- STMReco/src/MakeSTMHits_module.cc | 2 +- STMReco/src/PlotSTMWaveformDigis_module.cc | 5 +- 7 files changed, 70 insertions(+), 55 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index d417351e96..5961653165 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -1,4 +1,4 @@ -// ====================================================================== +// ===================================================================== // // STMDigisFromFragments: create all types of STMDigis from STMFragments // @@ -14,6 +14,7 @@ #include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" #include "art/Framework/Principal/Handle.h" #include "artdaq-core-mu2e/Overlays/STMFragment.hh" +#include #include #include @@ -94,48 +95,51 @@ void STMDigisFromFragments::produce(Event& event) art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); - const auto STMFragments = STMFragmentsH.product(); - - for (const auto& frag : *STMFragments) { - const auto& stm_frag = static_cast(frag); - - mu2e::STMWaveformDigi stm_waveform; - - if (stm_frag.isRaw()) { - stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); - raw_waveform_digis->emplace_back(stm_waveform); - } - else if (stm_frag.isZS()) { - stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); - zs_waveform_digis->emplace_back(stm_waveform); - } - else if (stm_frag.isMWD()) { - - int n_MWD_digis = stm_frag.payloadWords(); //number read -> to digis + const auto STMContainerFragments = STMFragmentsH.product(); + + for (const auto& frag : *STMContainerFragments) { + // const auto& stm_frag = static_cast(frag); //What was here originally to read other file + artdaq::ContainerFragment contf(frag); + + for (size_t ii = 0; ii < contf.block_count(); ++ii){ + const auto& art_frag = *contf[ii]; + const auto& stm_frag = static_cast(art_frag); + mu2e::STMWaveformDigi stm_waveform; + + if (stm_frag.isRaw()) { + stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); + raw_waveform_digis->emplace_back(stm_waveform); + } + else if (stm_frag.isZS()) { + stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); + zs_waveform_digis->emplace_back(stm_waveform); + } + else if (stm_frag.isMWD()) { + + int n_MWD_digis = stm_frag.payloadWords(); //number read -> to digis - for (int i_MWD = 0 ; i_MWD < n_MWD_digis; ++i_MWD){ + for (int i_MWD = 0 ; i_MWD < n_MWD_digis; ++i_MWD){ - auto const* pointer = stm_frag.payloadBegin(); //tells where to read data - int16_t i_pointer = pointer[i_MWD]; //Retrives value of ith index of pointer + auto const* pointer = stm_frag.payloadBegin(); //tells where to read data + int16_t i_pointer = pointer[i_MWD]; //Retrives value of ith index of pointer - mu2e::STMMWDDigi mwd_digi(0,i_pointer); + mu2e::STMMWDDigi mwd_digi(0,i_pointer); - mwd_digis->emplace_back(mwd_digi); + mwd_digis->emplace_back(mwd_digi); //mu2e::STMMWDDigi mwd_digi(0,i_pointer); //mwd_digi->emplace_back(mwd_digi); //stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin());//original //mwd_waveform_digis->emplace_back(stm_waveform);}//original - } + } + } } - } - event.put(std::move(raw_waveform_digis), "raw"); - event.put(std::move(zs_waveform_digis), "zs"); - event.put(std::move(mwd_digis), "mwd"); - + event.put(std::move(raw_waveform_digis), "raw"); + event.put(std::move(zs_waveform_digis), "zs"); + event.put(std::move(mwd_digis), "mwd"); } // produce() // ====================================================================== diff --git a/DAQ/src/STMPrintFragments_module.cc b/DAQ/src/STMPrintFragments_module.cc index 6957419b89..16392f1b2d 100644 --- a/DAQ/src/STMPrintFragments_module.cc +++ b/DAQ/src/STMPrintFragments_module.cc @@ -13,6 +13,7 @@ #include "art/Framework/Principal/Handle.h" #include "artdaq-core-mu2e/Overlays/STMFragment.hh" #include +#include "artdaq-core/Data/ContainerFragment.hh" #include #include @@ -32,6 +33,7 @@ class art::STMPrintFragments : public EDAnalyzer public: struct Config { + fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("stmTag for new file")}; // // fhicl::Atom diagLevel{fhicl::Name("diagLevel"), fhicl::Comment("diagnostic Level")}; // // fhicl::Atom CRVDataDecodersTag{fhicl::Name("crvTag"), // // fhicl::Comment("crv Fragments Tag")}; @@ -44,6 +46,8 @@ class art::STMPrintFragments : public EDAnalyzer virtual void analyze(const Event&); private: + + art::InputTag _stmFragmentsTag; // int decompressCrvDigi(uint8_t adc); // int16_t decompressCrvDigi(int16_t adc); @@ -57,6 +61,7 @@ class art::STMPrintFragments : public EDAnalyzer STMPrintFragments::STMPrintFragments(const art::EDAnalyzer::Table& config) : art::EDAnalyzer{config} + ,_stmFragmentsTag(config().stmTag()) { // produces(); } @@ -67,11 +72,11 @@ void STMPrintFragments::analyze(const Event& event) { art::EventNumber_t eventNumber = event.event(); - auto STMFragments = event.getValidHandle("daq:STM"); + auto STMContainerFragments = event.getValidHandle(_stmFragmentsTag); //Changed from STMFragments -> STMContainerFragments std::cout << std::dec << "Analyzer: Run " << event.run() << ", subrun " << event.subRun() << ", event " << eventNumber << " has " << std::endl; - std::cout << STMFragments->size() << " STM fragments." << std::endl; + std::cout << STMContainerFragments->size() << " STM fragments." << std::endl; // std::vector>> fragmentHandles; // fragmentHandles = event.getMany>(); @@ -84,19 +89,25 @@ void STMPrintFragments::analyze(const Event& event) // } // } int frag_counter = 0; - for (auto& frag : *STMFragments) { + for (auto& frag : *STMContainerFragments) { ++frag_counter; - + + //New lines + artdaq::ContainerFragment contf(frag); // interpret the fragment as a ContainerFragemnt (Will look inside here) + std::cout<<"N Blocks in the container = " << std::endl; //Should be 3 for the 3 STM Fragments // auto stm_frag = static_cast(frag); - const auto dataBegin = frag.dataBegin(); - const auto dataEnd = frag.dataEnd(); - const auto stmDataBegin = reinterpret_cast(dataBegin); - const auto stmDataEnd = reinterpret_cast(dataEnd); - auto frag_id = frag.fragmentID(); - std::cout << "frag_id = " << frag_id << std::endl; - for (auto i = stmDataBegin; i != stmDataEnd; ++i) { - std::cout << "Frag #" << frag_counter << ": *(stmDataBegin+" << i - stmDataBegin << ") = " << *i << std::endl; - } + + for (size_t ii = 0; ii< contf.block_count(); ++ii){ + + const auto dataBegin = frag.dataBegin(); + const auto dataEnd = frag.dataEnd(); + const auto stmDataBegin = reinterpret_cast(dataBegin); + const auto stmDataEnd = reinterpret_cast(dataEnd); + auto frag_id = frag.fragmentID(); + std::cout << "frag_id = " << frag_id << std::endl; + for (auto i = stmDataBegin; i != stmDataEnd; ++i) { + std::cout << "Frag #" << frag_counter << ": *(stmDataBegin+" << i - stmDataBegin << ") = " << *i << std::endl; + } // // std::cout << "Trigger Header Address: " << stm_frag.GetTHdr() << std::endl; // std::cout << "Frag #" << frag_counter << ": EvNum: " << *(stm_frag.EvNum()) << std::endl; @@ -111,8 +122,8 @@ void STMPrintFragments::analyze(const Event& event) // std::cout << std::endl; // std::cout << "Trigger Header Channel: " << *(stm_frag.GetTHdr()) << std::endl; // std::cout << "Trigger Header EvNum: " << *(stm_frag.GetTHdr()+8) << std::endl; + } } - } // produce() // ====================================================================== diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index b2c5b1a0af..c4df9b844c 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -18,7 +18,7 @@ physics : { producers : { makeSTMDigis : { module_type : STMDigisFromFragments - stmTag : "daq:STM" + stmTag : "daq:ContainerSTM" } } @@ -32,13 +32,14 @@ physics : { stmPrint : { module_type : STMPrintFragments + stmTag : "daq:ContainerSTM" } } t1 : [ makeSTMDigis ] - e1 : [ stmOutput ] - # e1 : [ stmPrint, stmOutput ] + # e1 : [ stmOutput ] + e1 : [ stmPrint ] #e1 : [ frag, stmOutput ] trigger_paths : [t1] diff --git a/STMReco/fcl/makeSTMHits.fcl b/STMReco/fcl/makeSTMHits.fcl index 6785ddf8b6..e66e55ce3d 100644 --- a/STMReco/fcl/makeSTMHits.fcl +++ b/STMReco/fcl/makeSTMHits.fcl @@ -17,7 +17,7 @@ physics: { stmMWDDigisTag : "mwdHPGe" } stmHitsLaBr : { module_type : MakeSTMHits - stmMWDDigisTag : "mwdLaBr" + stmMWDDigisTag : "makeSTMDigis:mwd" } } filters : { @@ -25,9 +25,9 @@ physics: { analyzers : { } # setup paths - HPGePath : [ stmHitsHPGe ] + # HPGePath : [ stmHitsHPGe ] LaBrPath : [ stmHitsLaBr ] - trigger_paths: [ HPGePath, LaBrPath ] + trigger_paths: [LaBrPath ] outPath : [ STMOutput ] end_paths: [outPath] } diff --git a/STMReco/fcl/plotSTMWaveformDigis.fcl b/STMReco/fcl/plotSTMWaveformDigis.fcl index 4e005a61b8..57b815f7ae 100644 --- a/STMReco/fcl/plotSTMWaveformDigis.fcl +++ b/STMReco/fcl/plotSTMWaveformDigis.fcl @@ -46,7 +46,7 @@ physics: { } # setup paths trigger_paths: [ ] - anaPath : [ plotRawWaveformDigis, plotZSWaveformDigis, plotMWDWaveformDigis ] + anaPath : [ plotRawWaveformDigis, plotZSWaveformDigis ] end_paths: [anaPath] } diff --git a/STMReco/src/MakeSTMHits_module.cc b/STMReco/src/MakeSTMHits_module.cc index 3336b4de69..3c9f830787 100644 --- a/STMReco/src/MakeSTMHits_module.cc +++ b/STMReco/src/MakeSTMHits_module.cc @@ -53,7 +53,7 @@ namespace mu2e { MakeSTMHits::MakeSTMHits(const Parameters& config ) : art::EDProducer{config} ,_stmMWDDigisToken(consumes(config().stmMWDDigisTag())) - ,_channel(STMUtils::getChannel(config().stmMWDDigisTag())) + ,_channel(STMChannel::LaBr) ,_stmEnergyCalib_h() { produces(); diff --git a/STMReco/src/PlotSTMWaveformDigis_module.cc b/STMReco/src/PlotSTMWaveformDigis_module.cc index ad38759262..732c739328 100644 --- a/STMReco/src/PlotSTMWaveformDigis_module.cc +++ b/STMReco/src/PlotSTMWaveformDigis_module.cc @@ -97,7 +97,7 @@ namespace mu2e { const auto nsPerCt = stmEnergyCalib.nsPerCt(_channel); - + std::cout<<"size = "<size()<SetBinContent(i_adc+1,content); } From 1978bc0db4e834f9da8fd77b8660c16e8d2b25bc Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Mon, 9 Mar 2026 15:28:00 -0500 Subject: [PATCH 11/29] Changes by bryan march9th, work on Fragment and mwd.fcl --- DAQ/src/STMDigisFromFragments_module.cc | 150 +++++++++++++++--- DAQ/src/STMPrintFragments_module.cc | 5 +- DAQ/test/inspectSTMFile.fcl | 2 +- STMReco/fcl/mwd.fcl | 17 +- STMReco/src/PlotSTMWaveformDigis_module.cc | 8 +- .../STMMovingWindowDeconvolution_module.cc | 5 +- 6 files changed, 153 insertions(+), 34 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 5961653165..12baf827c8 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -37,6 +37,7 @@ #include #include #include +#include //temporary namespace art { @@ -96,50 +97,161 @@ void STMDigisFromFragments::produce(Event& event) art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); const auto STMContainerFragments = STMFragmentsH.product(); + + + //Variables to keep track of all zero element arrays& empty arrays + size_t zeroRaw_arrays = 0; + size_t zeroZS_arrays = 0; + size_t emptyRaw_arrays = 0; + size_t emptyZS_arrays = 0; + for (const auto& frag : *STMContainerFragments) { // const auto& stm_frag = static_cast(frag); //What was here originally to read other file artdaq::ContainerFragment contf(frag); + for (size_t ii = 0; ii < contf.block_count(); ++ii){ - const auto& art_frag = *contf[ii]; + const artdaq::Fragment art_frag = *contf[ii]; const auto& stm_frag = static_cast(art_frag); mu2e::STMWaveformDigi stm_waveform; + + // std::cout<<"ii = "<< ii<<" isRaw = "<< stm_frag.isRaw()<<" isZS = "<Raw has no empty arrays it seems + }else{ + for(size_t k = 0; k< N; ++k){ + if(payloadarray[k] != 0){ + allZeros = false; //Break if you find an element that isn't zero + break; + } + } + //Check to see if first 20 elements have any zero + for(size_t z20 =0; z20 < std::min(N,20); ++z20){ + if(payloadarray[z20] == 0){ + first20hasZeros = true;//Break if you find any element with a zero, will disrupt header + break; + } + } + + if (allZeros == true || first20hasZeros == true){ + ++zeroRaw_arrays; //Adds to the zero array counter + std::cout<<"PayloadWords for zeroRaw array: "<(N,10);++zz){ + std::cout<(N,20); ++kk){ + std::cout<emplace_back(stm_waveform); + } + } + + //end of check + + //Originally outside the check + //stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); + //raw_waveform_digis->emplace_back(stm_waveform); + } else if (stm_frag.isZS()) { - stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); - zs_waveform_digis->emplace_back(stm_waveform); + //A check to see what inside these arrays + auto payloadarray= stm_frag.payloadBegin(); + auto N = stm_frag.payloadWords(); + bool allZeros = true; //Assume we have an array with all zeros + bool first20hasZeros = false; //Checking header + + if(N ==0){ //If payloadwords = 0 then the array is empty + ++emptyZS_arrays; + std::cout<< "Found empty ZS array at ii = "<Raw has no empty arrays it seems + }else{ + for(size_t k = 0; k< N; ++k){ + if(payloadarray[k] != 0){ + allZeros = false; //Break if you find an element that isn't zero + break; + } + } + //Check to see if first 20 elements have any zero + for(size_t z20 =0; z20 < std::min(N,20); ++z20){ + if(payloadarray[z20] == 0){ + first20hasZeros = true;//Break if you find any element with a zero, will disrupt header + break; + } + } + + if (allZeros == true || first20hasZeros == true){ + ++zeroZS_arrays; //Adds to the zero array counter + std::cout<<"PayloadWords for zeroZS array: "<(N,10);++zz){ + std::cout<(N,20); ++kk){ + std::cout<emplace_back(stm_waveform); + } + } + + //end of check + + //stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); + //zs_waveform_digis->emplace_back(stm_waveform); + } else if (stm_frag.isMWD()) { - int n_MWD_digis = stm_frag.payloadWords(); //number read -> to digis - for (int i_MWD = 0 ; i_MWD < n_MWD_digis; ++i_MWD){ - auto const* pointer = stm_frag.payloadBegin(); //tells where to read data int16_t i_pointer = pointer[i_MWD]; //Retrives value of ith index of pointer - mu2e::STMMWDDigi mwd_digi(0,i_pointer); - mwd_digis->emplace_back(mwd_digi); - //mu2e::STMMWDDigi mwd_digi(0,i_pointer); - //mwd_digi->emplace_back(mwd_digi); - - - //stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin());//original - //mwd_waveform_digis->emplace_back(stm_waveform);}//original + std::cout<< "mwd_digis size = " << mwd_digis->size()<<"\n"; } + } } } - event.put(std::move(raw_waveform_digis), "raw"); - event.put(std::move(zs_waveform_digis), "zs"); - event.put(std::move(mwd_digis), "mwd"); + //Final checks + std::cout<<"---------------------------------------------------------\n"<<"\n"; + std::cout << "raw_waveform_digis total size = "<size()<<"\n"; //Check before being put in + std::cout << "zs_waveform_digis total size = "<size()<<"\n"; + std::cout << "mwd_digis total size = " << mwd_digis->size()<<"\n"; + + std::cout<<"---------------------------------------------------------\n"<<"\n"; + std::cout<< "Number of Zero arrays for Raw = " <(frag); for (size_t ii = 0; ii< contf.block_count(); ++ii){ - const auto dataBegin = frag.dataBegin(); const auto dataEnd = frag.dataEnd(); const auto stmDataBegin = reinterpret_cast(dataBegin); const auto stmDataEnd = reinterpret_cast(dataEnd); auto frag_id = frag.fragmentID(); std::cout << "frag_id = " << frag_id << std::endl; + std::cout<< "container block_count = "<(conf().stmWaveformDigisTag())), - channel(STMUtils::getChannel(conf().stmWaveformDigisTag())), + channel(STMChannel::findByName("HPGe")), // FIXME: don't hardcode this probably don't want to do what we had before and try to infer it from the art::InputTag like this "STMUtils::getChannel(config().stmWaveformDigisTag()))" tau(conf().tau()), M(conf().M()), L(conf().L()), @@ -160,6 +160,7 @@ namespace mu2e { if (verbosityLevel > 10) verbosityLevel = 10; _xAxis = conf().xAxis() ? *(conf().xAxis()) : ""; + std::cout<<"BG"<<_xAxis<Branch("E", &E, "E/D"); ttree->Branch("waveformID", &waveformID, "waveformID/i"); }; - if (_xAxis != "") { + if (_xAxis == "") { if (verbosityLevel >= 5) { throw cet::exception("STMMovingWindowDecomposition") << "No xAxis scale defined despite requesting verbosity level >= 5" << std::endl; }; From dcf986496903faef85593005e5e320ac40c533eb Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 2 Apr 2026 19:35:35 -0500 Subject: [PATCH 12/29] Changes to unpacking, bryan --- DAQ/src/STMDigisFromFragments_module.cc | 514 ++++++++++++------ DAQ/src/STMPrintFragments_module.cc | 6 +- DAQ/test/inspectSTMFile.fcl | 8 +- STMReco/fcl/mwd.fcl | 7 +- STMReco/src/PlotSTMWaveformDigis_module.cc | 30 +- .../STMMovingWindowDeconvolution_module.cc | 42 +- 6 files changed, 429 insertions(+), 178 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 12baf827c8..d15fc805a0 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -45,215 +45,405 @@ namespace art } using art::STMDigisFromFragments; - // ====================================================================== class art::STMDigisFromFragments : public EDProducer { - public: - struct Config - { +public: + struct Config { fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("Input module")}; - // TODO: add fhicl parameters to that we can choose which types of fragments we read out - // e.g. fhicl::Atom processRaw {fhicl::Name("processRaw"), fhicl::Comment("Process Raw STMFragments")}; + fhicl::Atom rawFile {fhicl::Name("rawFile"), "raw.bin"}; + fhicl::Atom zsFile {fhicl::Name("zsFile"), "zs.bin"}; + fhicl::Atom phFile {fhicl::Name("phFile"), "ph.bin"}; + fhicl::Atom rawHeaderFile {fhicl::Name("rawHeaderFile"), "rawWithHeader.bin"}; + fhicl::Atom eventFile {fhicl::Name("eventFile"), "event.bin"}; }; + + explicit STMDigisFromFragments(const art::EDProducer::Table& config); // constructor created, config via fcl + virtual ~STMDigisFromFragments(); //declares destructor - // --- C'tor/d'tor: - explicit STMDigisFromFragments(const art::EDProducer::Table& config); - - // --- Production: - virtual void produce(Event&); - - private: + virtual void produce(Event &) override; + void endJob() override;//Final prinout summary +private: art::InputTag _stmFragmentsTag; - + std::ofstream _rawOut; //Files which can be acessesed throughout + std::ofstream _zsOut; + std::ofstream _phOut; + std::ofstream _rawHeaderOut; + std::ofstream _eventOut; + + //Metrics + size_t _totalEvents{0}; //Another way to initialize to zero + size_t _totalFragments{0}; + size_t _totalContainers{0}; + size_t _totalInner{0}; + size_t _totalRaw{0}; + size_t _totalZS{0}; + size_t _totalPH{0}; }; // STMDigisFromFragments // ====================================================================== -STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table& config) : - art::EDProducer{config} +STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table& config) + : art::EDProducer{config} ,_stmFragmentsTag(config().stmTag()) { // Set the size of the vector - produces("raw"); + produces("raw");//Waveform produces("zs"); - produces("mwd"); // TODO: we should create an STMMWDDigi collection instead of STMWaveformDigis for this + //produces("mwd");//MWD digi series + + //Georges's suggestions + produces("ph"); + produces("rawWithHeader"); + + //turns file into binary + _rawOut.open(config().rawFile(), std::ios::binary); + _zsOut.open(config().zsFile(), std::ios::binary); + _phOut.open(config().phFile(), std::ios::binary); + _rawHeaderOut.open(config().rawHeaderFile(), std::ios::binary); + _eventOut.open(config().eventFile(), std::ios::binary); + + //Check to make sure we are reading the file + if(!_rawOut || !_zsOut || !_phOut || !_rawHeaderOut || !_eventOut){ + throw cet::exception("FILEOPEN")<< "Failed to open one or more output files\n"; + } } -// ---------------------------------------------------------------------- +STMDigisFromFragments::~STMDigisFromFragments(){ + if ( _rawOut.is_open() ) + _rawOut.close(); + if ( _zsOut.is_open() ) + _zsOut.close(); + if ( _phOut.is_open() ) + _phOut.close(); + if( _rawHeaderOut.is_open() ) + _rawHeaderOut.close(); + if( _eventOut.is_open() ) + _eventOut.close(); //Closing files +} +// ---------------------------------------------------------------------- void STMDigisFromFragments::produce(Event& event) { + + ++_totalEvents; //Increment Event Counter + std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); - std::unique_ptr mwd_digis(new mu2e::STMMWDDigiCollection); + std::unique_ptr ph_digis(new mu2e::STMMWDDigiCollection); + + // std::unique_ptr ph_waveform_digis (new mu2e::STMWaveformDigiCollection); + std::unique_ptr raw_header_waveform_digis(new mu2e::STMWaveformDigiCollection); // std::unique_ptr mwd_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); - const auto STMContainerFragments = STMFragmentsH.product(); + const auto STMFragments = STMFragmentsH.product(); - - //Variables to keep track of all zero element arrays& empty arrays + auto writePayload = [](std::ofstream& out, // [] is a capture list that only works with these parameters + const int16_t* data, + size_t words){ + out.write(reinterpret_cast(data),//Writing to file stream in binary + words * sizeof(int16_t)); + }; - size_t zeroRaw_arrays = 0; - size_t zeroZS_arrays = 0; - size_t emptyRaw_arrays = 0; - size_t emptyZS_arrays = 0; - - for (const auto& frag : *STMContainerFragments) { - // const auto& stm_frag = static_cast(frag); //What was here originally to read other file - artdaq::ContainerFragment contf(frag); + //Variables to keep track of all zero element arrays& empty arrays + size_t zeroRaw_frags = 0; + size_t zeroZS_frags = 0; + size_t emptyRaw_frags = 0; + size_t emptyZS_frags = 0; + size_t zeroPH_frags = 0;//Rename MWD ->ph to avoid confusion, MWD is the algorithm which capture pulse heights + size_t emptyPH_digis = 0; - - for (size_t ii = 0; ii < contf.block_count(); ++ii){ - const artdaq::Fragment art_frag = *contf[ii]; - const auto& stm_frag = static_cast(art_frag); - mu2e::STMWaveformDigi stm_waveform; - // std::cout<<"ii = "<< ii<<" isRaw = "<< stm_frag.isRaw()<<" isZS = "<(payloadWords,20); ++kk){ + std::cout<< payloadPtr[kk] <<" "; + } + std::cout<< "Raw i = " << i <<"\n"; + + //Ideally only good frags get up to here + //------full data (header + payload) + { + //Waveform with data creation + auto ptr = stm_frag.dataBegin();//Inner variable + auto words = stm_frag.dataWords(); + stm_waveform.set_data(words, ptr); + raw_header_waveform_digis->emplace_back(stm_waveform); + writePayload(_rawHeaderOut,ptr,words); + } + + //----- payload-only + { + auto ptr = stm_frag.payloadBegin(); + auto words = stm_frag.payloadWords(); + stm_waveform.set_data(words, ptr); + raw_waveform_digis->emplace_back(stm_waveform); + writePayload(_rawOut, ptr, words); + } + + + }//End of isRaw + else if (stm_frag.isZS()){ + ++_totalZS; //Incremenet ZS counter + + auto payloadPtr = stm_frag.payloadBegin(); + auto payloadWords = stm_frag.payloadWords(); + bool allZeros = true; //assumes all adcs are zero + + //Check if payload is empty + if (payloadWords == 0) { + std::cout<< "Found an empty ZS frag at i = " << i<< "\n"; + ++emptyZS_frags; //Increment empty ZS counter + continue; + } + //Check if any adc are non-zero + for (size_t k = 0 ; k < payloadWords ; ++k){ + if(payloadPtr[k] != 0 ){ + allZeros = false; + break; + } + } + //Check if zero filled + if (allZeros) { + std::cout << "Found a zero filled ZS frag at i = "<< i<< "\n"; + ++zeroZS_frags; + continue; + } + //Print first 20 payload adcs + std::cout<< "First 20 adcs: "; + for (size_t kk = 0 ; kk < std::min(payloadWords,20) ; ++kk){ + std::cout << payloadPtr[kk] << " "; + } + std::cout << "ZS i = " << i << "\n"; + + //Defintions for payload references + auto payloadEnd = payloadPtr + payloadWords; + size_t seg = 0; + size_t totalLen = 0; + uint16_t lastZSindex = 0; //keeps track of last recorded index from header -> with respect to what? + uint16_t lastLen = 0; //keeps track of last recoded length from header + + while (payloadPtr + 2 <= payloadEnd){ + uint16_t current_zs_location = static_cast(payloadPtr[0]); + uint16_t current_zs_size = static_cast(payloadPtr[1]); + auto adc = payloadPtr + 2; + if (adc + current_zs_size > payloadEnd) + break; + + uint32_t trigTimeOffset = current_zs_location; + std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_Size - 1 + mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use + zs_waveform_digis->emplace_back(stm_waveform); //emplace + writePayload(_zsOut, payloadPtr, payloadWords); + + //A print check per segment + std::cout << "i = " << i << ", seg = "<< seg << ", zs_location = " << current_zs_location << ", current_ZS_size = " << current_zs_size + <<", trigTimeOffset = " << trigTimeOffset << "\n"; + + lastZSindex = current_zs_location; + lastLen = current_zs_size; + totalLen += lastLen; + ++seg; + + payloadPtr = adc + current_zs_size; + } + //Summary + std::cout << "ZS i = " << i + << "segments = " << seg + << "lastZSindex = " << lastZSindex + << " lastZSLen = " << lastLen << "with a total calculated length of " << totalLen << "\n"; + + + + //----- payload-only + //{ + //stm_waveform.set_data(words,ptr); + //zs_waveform_digis->emplace_back(stm_waveform); + //writePayload(_zsOut, ptr, words); + //} + + }//End of isZS + else if (stm_frag.isMWD()){ + ++_totalPH; + //Check if zero filled + auto payloadPtr = stm_frag.payloadBegin(); + auto payloadWords = stm_frag.payloadWords(); + bool allZeros = true; + + if (payloadWords ==0){ + ++emptyPH_digis; + continue; + } + + //Check if zero filled + for (size_t k = 0; k< payloadWords; ++k) { + if (payloadPtr[k] !=0){ + allZeros = false; + break; + } + } + //count if zero filled + if (allZeros){ + ++zeroPH_frags; + continue; + } + + int n_PH_digis = stm_frag.payloadWords(); + for (int i_PH = 0; i_PH < n_PH_digis; ++i_PH){ + auto const* ptr = stm_frag.payloadBegin(); + int16_t i_ptr = ptr[i_PH]; + mu2e::STMMWDDigi PH_digi(0, i_ptr); + ph_digis->emplace_back(PH_digi); + } - if (stm_frag.isRaw()) { - - //A check to see what inside these arrays - auto payloadarray= stm_frag.payloadBegin(); - auto N = stm_frag.payloadWords(); - bool allZeros = true; //Assume we have an array with all zeros - bool first20hasZeros = false; //Checking header - - if(N ==0){ //If payloadwords = 0 then the array is empty - ++emptyRaw_arrays; - std::cout<< "Found empty Raw array at ii = "<Raw has no empty arrays it seems - }else{ - for(size_t k = 0; k< N; ++k){ - if(payloadarray[k] != 0){ - allZeros = false; //Break if you find an element that isn't zero - break; - } - } - //Check to see if first 20 elements have any zero - for(size_t z20 =0; z20 < std::min(N,20); ++z20){ - if(payloadarray[z20] == 0){ - first20hasZeros = true;//Break if you find any element with a zero, will disrupt header - break; - } - } - - if (allZeros == true || first20hasZeros == true){ - ++zeroRaw_arrays; //Adds to the zero array counter - std::cout<<"PayloadWords for zeroRaw array: "<(N,10);++zz){ - std::cout<(N,20); ++kk){ - std::cout<emplace_back(stm_waveform); - } - } - - //end of check - - //Originally outside the check - //stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); - //raw_waveform_digis->emplace_back(stm_waveform); - - } - else if (stm_frag.isZS()) { - //A check to see what inside these arrays - auto payloadarray= stm_frag.payloadBegin(); - auto N = stm_frag.payloadWords(); - bool allZeros = true; //Assume we have an array with all zeros - bool first20hasZeros = false; //Checking header - - if(N ==0){ //If payloadwords = 0 then the array is empty - ++emptyZS_arrays; - std::cout<< "Found empty ZS array at ii = "<Raw has no empty arrays it seems - }else{ - for(size_t k = 0; k< N; ++k){ - if(payloadarray[k] != 0){ - allZeros = false; //Break if you find an element that isn't zero - break; - } - } - //Check to see if first 20 elements have any zero - for(size_t z20 =0; z20 < std::min(N,20); ++z20){ - if(payloadarray[z20] == 0){ - first20hasZeros = true;//Break if you find any element with a zero, will disrupt header - break; - } - } - - if (allZeros == true || first20hasZeros == true){ - ++zeroZS_arrays; //Adds to the zero array counter - std::cout<<"PayloadWords for zeroZS array: "<(N,10);++zz){ - std::cout<(N,20); ++kk){ - std::cout<emplace_back(stm_waveform); - } - } - - //end of check - - //stm_waveform.set_data(stm_frag.payloadWords(), stm_frag.payloadBegin()); - //zs_waveform_digis->emplace_back(stm_waveform); - - } - else if (stm_frag.isMWD()) { - int n_MWD_digis = stm_frag.payloadWords(); //number read -> to digis - for (int i_MWD = 0 ; i_MWD < n_MWD_digis; ++i_MWD){ - auto const* pointer = stm_frag.payloadBegin(); //tells where to read data - int16_t i_pointer = pointer[i_MWD]; //Retrives value of ith index of pointer - mu2e::STMMWDDigi mwd_digi(0,i_pointer); - mwd_digis->emplace_back(mwd_digi); - std::cout<< "mwd_digis size = " << mwd_digis->size()<<"\n"; - } - - } + //stm_waveform.set_data(words, ptr); + //ph_waveform_digis->emplace_back(stm_waveform); + //writePayload(_phOut, ptr, words); + + }//End of isMWD and is checks + + //---Combined stream write w. order preserved ---- + { + const int16_t* cptr = nullptr; + size_t cwords = 0; + + if (stm_frag.isRaw()){ + cptr = stm_frag.dataBegin(); + cwords = stm_frag.dataWords(); + } + else if (stm_frag.isZS()){ + cptr = stm_frag.payloadBegin(); + cwords = stm_frag.payloadWords(); + } + else if (stm_frag.isMWD()){ + cptr = stm_frag.payloadBegin(); + cwords = stm_frag.payloadWords(); + } + + if (cptr != nullptr && cwords >0) { + _eventOut.write(reinterpret_cast(cptr), + cwords * sizeof(int16_t) ); + } + } + + }//End Container loop + } else { + //fallback (non-container case) + mu2e::STMFragment stm_frag(frag); + auto ptr = stm_frag.payloadBegin(); + auto words = stm_frag.payloadWords(); + + if (stm_frag.isRaw()) { + writePayload(_rawOut, ptr, words); + } } - } + } //End of frags loop---George suggestions - //Final checks - std::cout<<"---------------------------------------------------------\n"<<"\n"; - std::cout << "raw_waveform_digis total size = "<size()<<"\n"; //Check before being put in - std::cout << "zs_waveform_digis total size = "<size()<<"\n"; - std::cout << "mwd_digis total size = " << mwd_digis->size()<<"\n"; + //Event Summary -> tells us what happens per event + std::cout<<"---------------------------------------------------------"<<"\n"; + std::cout << "raw_waveform_digis total size with data = "<size()<<"\n"; + std::cout << "zs_waveform_digis total size with data = "<size()<<"\n"; + std::cout << "mwd_digis total size with data = " << ph_digis->size()<<"\n"; - std::cout<<"---------------------------------------------------------\n"<<"\n"; - std::cout<< "Number of Zero arrays for Raw = " < stmWaveformDigisTag{ Name("stmWaveformDigisTag"), Comment("InputTag for STMWaveformDigiCollection")}; fhicl::Atom subtractPedestal{ Name("subtractPedestal"), Comment("True/False whether to subtract the pedestal before plotting")}; - fhicl::Atom xAxis{ Name("xAxis"), Comment("Choice of x-axis unit: \"sample_number\", \"adcs_time\", or \"event_time\"") }; + fhicl::Atom xAxis{ Name("xAxis"), Comment("Choice of x-axis unit: \"sample_number\", \"adcs_time\", or \"event_time\"")} ; fhicl::Atom verbosityLevel{ Name("verbosityLevel"), Comment("Verbosity level")}; }; using Parameters = art::EDAnalyzer::Table; @@ -49,7 +49,7 @@ namespace mu2e { TH1F* _hist; //Hist for WaveLength int ZeroLengthCount = 0; art::InputTag _stmWaveformDigisTag; - + art::ProductToken _stmWaveformDigisToken; bool _subtractPedestal; std::string _xAxis; @@ -87,7 +87,6 @@ namespace mu2e { art::ServiceHandle tfs; auto waveformsHandle = event.getValidHandle(_stmWaveformDigisToken); - std::stringstream histname, histtitle; int count = 0; STMEnergyCalib const& stmEnergyCalib = _stmEnergyCalib_h.get(event.id()); // get prodition @@ -110,20 +109,39 @@ namespace mu2e { ZeroLengthCount++; } else { _hist->Fill(waveform.adcs().size()); //_hist was created outside so there should be no problem here - + + std::stringstream histname2;//New histogram to include the offset waveform from trigTimeOffset + histname2 << histname.str() << "_offset"; + Binning binning = STMUtils::getBinning(waveform, _xAxis, nsPerCt); TH1F* hWaveform = tfs->make(histname.str().c_str(), histtitle.str().c_str(), binning.nbins(),binning.low(),binning.high()); + TH1F* hWaveformOffset = tfs->make(histname2.str().c_str(),histtitle.str().c_str(),binning.nbins(),binning.low(),binning.high());//Exact copy except for name + + hWaveform->GetYaxis()->SetTitle("ADCs"); + hWaveform->GetXaxis()->SetTitle("Sample Number"); + + hWaveformOffset->GetYaxis()->SetTitle("ADCs"); + hWaveformOffset->GetXaxis()->SetTitle("Sample Number"); for(size_t i_adc = 0; i_adc < waveform.adcs().size();++i_adc){ const auto adc = waveform.adcs().at(i_adc); - auto content = adc; if (_subtractPedestal) { content -= pedestal; } hWaveform->SetBinContent(i_adc+1,content); - } + hWaveformOffset->SetBinContent(i_adc+1,content); //Exact copy + } + + //For offset waveforms + auto zs_offset = waveform.trigTimeOffset(); //Grabs stored offset + int n_bins = hWaveformOffset->GetNbinsX(); //Grabs already contained nbins from waveform + double xmin = hWaveformOffset->GetXaxis()->GetXmin();// gets xmin from waveform + double xmax = hWaveformOffset->GetXaxis()->GetXmax();//gets xman from waveform + + hWaveformOffset->SetBins(n_bins, xmin + zs_offset, xmax + zs_offset);// shifts the xmin and xmax by offset, keeps numbers of bins + } ++count; diff --git a/STMReco/src/STMMovingWindowDeconvolution_module.cc b/STMReco/src/STMMovingWindowDeconvolution_module.cc index 6b8e6331dd..755436d70f 100644 --- a/STMReco/src/STMMovingWindowDeconvolution_module.cc +++ b/STMReco/src/STMMovingWindowDeconvolution_module.cc @@ -65,7 +65,8 @@ namespace mu2e { fhicl::OptionalAtom makeTTreeEnergies{ Name("makeTTreeEnergies"), Comment("Controls whether to make the TTree with branches time, E")}; fhicl::OptionalAtom TTreeEnergyCalib{ Name("TTreeEnergyCalib"), Comment("Controls whether to make the energy TTrees with units of energy or in ADC values. If 0, will leave as ADC value, otherwise will multiply by this calibration to generate the energy.")}; fhicl::OptionalAtom verbosityLevel{Name("verbosityLevel"), Comment("Verbosity level")}; - fhicl::OptionalAtom xAxis{ Name("xAxis"), Comment("Choice of x-axis unit for histograms if verbosity level >= 5: \"sample_number\", \"waveform_time\", or \"event_time\"") }; + fhicl::OptionalAtom xAxis{ Name("xAxis"), Comment("Choice of x-axis unit for histograms if verbosity level >= 5: \"sample_number\", \"waveform_time\", or \"event_time\"") + }; }; using Parameters = art::EDProducer::Table; @@ -210,6 +211,7 @@ namespace mu2e { // create output std::unique_ptr outputMWDDigis(new STMMWDDigiCollection); auto waveformDigisHandle = event.getValidHandle(_stmWaveformDigisToken); + // get prodition STMEnergyCalib const& stmEnergyCalib = _stmEnergyCalib_h.get(event.id()); pedestal = stmEnergyCalib.pedestal(channel); @@ -220,6 +222,11 @@ namespace mu2e { eventId = event.id().event(); waveformID = 0; for (STMWaveformDigi waveform : *waveformDigisHandle) { + + //Check prints -------------------------------------- + std::cout << "event id = "<< event.id().event()<make(("h_peak_threshold"+histsuffix.str()).c_str(), "Threshold", binning.nbins(),binning.low(),binning.high()); + // now label them + h_waveform->GetXaxis()->SetTitle("Sample Number"); + h_waveform->GetYaxis()->SetTitle("ADCs"); + + h_deconvolved->GetXaxis()->SetTitle("Sample Number"); + h_deconvolved->GetYaxis()->SetTitle("ADCs"); + + h_differentiated->GetXaxis()->SetTitle("Sample Number"); + h_differentiated->GetYaxis()->SetTitle("ADCs"); + + h_averaged->GetXaxis()->SetTitle("Sample Number"); + h_averaged->GetYaxis()->SetTitle("ADCs"); + + h_baseline_mean->GetXaxis()->SetTitle("Sample Number"); + h_baseline_mean->GetYaxis()->SetTitle("ADCs"); + + h_baseline_mean_plus_stddev->GetXaxis()->SetTitle("Sample Number"); + h_baseline_mean_plus_stddev->GetYaxis()->SetTitle("ADCs"); + + h_baseline_mean_minus_stddev->GetXaxis()->SetTitle("Sample Number"); + h_baseline_mean_minus_stddev->GetYaxis()->SetTitle("ADCs"); + + h_peak_threshold->GetXaxis()->SetTitle("Sample Number"); + h_peak_threshold->GetYaxis()->SetTitle("ADCs"); + for (size_t i = 0; i < deconvolved_data.size(); ++i) { h_waveform->SetBinContent(i+1, waveform.adcs()[i] - pedestal); // remove the pedestal h_deconvolved->SetBinContent(i+1, deconvolved_data[i]); @@ -424,7 +457,12 @@ namespace mu2e { h_baseline_mean_minus_stddev->SetBinContent(i+1, baseline_mean - baseline_stddev); h_peak_threshold->SetBinContent(i+1, baseline_mean - nsigma_cut * baseline_stddev); } + TH1D* h_peaks = tfs->make(("h_peaks"+histsuffix.str()).c_str(), "Peaks", binning.nbins(),binning.low(),binning.high()); + + h_peaks->GetXaxis()->SetTitle("Sample Number"); + h_peaks->GetYaxis()->SetTitle("ADC peak"); + for (size_t i_peak = 0; i_peak < peak_heights.size(); ++i_peak) { // std::cout << "t = " << peak_times[i_peak] << ", E = " << peak_heights[i_peak] << std::endl; h_peaks->SetBinContent(peak_times[i_peak]+1, peak_heights[i_peak]); From 7ef4a54db5ad14ecdc87ed2bb8b2280985b6360c Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Mon, 6 Apr 2026 11:47:35 -0500 Subject: [PATCH 13/29] latest changes to unpacking - bryan --- DAQ/src/STMDigisFromFragments_module.cc | 235 +++++++++++++----------- 1 file changed, 131 insertions(+), 104 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index d15fc805a0..e6bd6eadaa 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -45,7 +45,6 @@ namespace art } using art::STMDigisFromFragments; -// ====================================================================== class art::STMDigisFromFragments : public EDProducer { @@ -81,6 +80,14 @@ class art::STMDigisFromFragments : public EDProducer size_t _totalRaw{0}; size_t _totalZS{0}; size_t _totalPH{0}; + + //Additional metrics + size_t _totalZeroRaw{0}; + size_t _totalZeroZS{0}; + size_t _totalZeroPH{0}; + size_t _totalEmptyRaw{0}; + size_t _totalEmptyZS{0}; + size_t _totalEmptyPH{0}; }; // STMDigisFromFragments // ====================================================================== @@ -92,13 +99,10 @@ STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table("raw");//Waveform + produces("raw");//Waveforms produces("zs"); - //produces("mwd");//MWD digi series - - //Georges's suggestions - produces("ph"); produces("rawWithHeader"); + produces("ph"); // digi series //turns file into binary _rawOut.open(config().rawFile(), std::ios::binary); @@ -111,6 +115,7 @@ STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table raw_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr ph_digis(new mu2e::STMMWDDigiCollection); - - // std::unique_ptr ph_waveform_digis (new mu2e::STMWaveformDigiCollection); std::unique_ptr raw_header_waveform_digis(new mu2e::STMWaveformDigiCollection); - // std::unique_ptr mwd_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original + //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); @@ -151,19 +154,21 @@ void STMDigisFromFragments::produce(Event& event) out.write(reinterpret_cast(data),//Writing to file stream in binary words * sizeof(int16_t)); }; - - //Variables to keep track of all zero element arrays& empty arrays - size_t zeroRaw_frags = 0; - size_t zeroZS_frags = 0; - size_t emptyRaw_frags = 0; - size_t emptyZS_frags = 0; - size_t zeroPH_frags = 0;//Rename MWD ->ph to avoid confusion, MWD is the algorithm which capture pulse heights - size_t emptyPH_digis = 0; + //Event Metrics + size_t localRaw_frags{0}; + size_t localZS_frags{0}; + size_t localPH_frags{0}; + size_t zeroRaw_frags{0}; + size_t zeroZS_frags{0}; + size_t zeroPH_frags{0}; + size_t emptyRaw_frags{0}; + size_t emptyZS_frags{0}; + size_t emptyPH_frags{0}; //loop over frags for (const auto& frag : *STMFragments) { - ++_totalFragments; //Increment Frag counter + ++_totalFragments; //Increment Total Frag counter //Check if this is a container fragment if (frag.type() == artdaq::Fragment::ContainerFragmentType){ @@ -174,26 +179,29 @@ void STMDigisFromFragments::produce(Event& event) _totalInner += blocks; //loop over container + // i index corresponds to inner frag for (size_t i = 0; i < cont_frag.block_count(); ++i){ auto inner_frag = cont_frag.at(i); mu2e::STMFragment stm_frag(*inner_frag); mu2e::STMWaveformDigi stm_waveform; - auto ptr = stm_frag.payloadBegin();//Outer variable - auto words = stm_frag.payloadWords(); + //auto ptr = stm_frag.payloadBegin();//Outer variable + //auto words = stm_frag.payloadWords(); if (stm_frag.isRaw()) { - ++_totalRaw; //Increment raw counter - + ++_totalRaw; //Increment job counter + ++localRaw_frags;//Increment event counter + auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); - bool allZeros = true; - - //Chekcs if payloadwords reads empty frag + bool allZeros = true;//Assume raw frag is zero filled + + //Checks for empty frag if (payloadWords == 0) { - std::cout<< "Found an empty Raw frag at i = " << i <<"\n"; - ++emptyRaw_frags;// Increment Empty Raw counter + std::cout<< "\nFound an empty frag, i = " << i <<" @Raw\n"; + ++_totalEmptyRaw;//Job counter + ++emptyRaw_frags;//Event counter continue;//stops this loop check and goes to next frag } @@ -207,50 +215,55 @@ void STMDigisFromFragments::produce(Event& event) //Chekcs if zero filled if (allZeros){ - std::cout<< "Found a zero filled Raw frag at i = " << i << "\n"; - ++zeroRaw_frags;//Increment Zero Raw Counter + std::cout << "\nFound a zero filled frag, i = " << i << " @Raw\n"; + ++_totalZeroRaw;//Increment counters + ++zeroRaw_frags;//Increment Zero Raw Counter continue; } //Print first 20 values - std::cout<< "First 20 adcs: "; + std::cout << "\nFirst 20 adcs: "; for (size_t kk = 0; kk < std::min(payloadWords,20); ++kk){ - std::cout<< payloadPtr[kk] <<" "; + std::cout << payloadPtr[kk] << " ,"; } - std::cout<< "Raw i = " << i <<"\n"; + std::cout << "\nRaw header : ZS Length = " << stm_frag.zsLength() + << " , ZS Regions = " << stm_frag.zsRegions() + << " , i = " << i << " @Raw\n"; //Ideally only good frags get up to here //------full data (header + payload) { //Waveform with data creation - auto ptr = stm_frag.dataBegin();//Inner variable - auto words = stm_frag.dataWords(); - stm_waveform.set_data(words, ptr); + auto dataPtr = stm_frag.dataBegin();//Inner variable + auto dataWords = stm_frag.dataWords(); + stm_waveform.set_data(dataWords, dataPtr); raw_header_waveform_digis->emplace_back(stm_waveform); - writePayload(_rawHeaderOut,ptr,words); + writePayload( _rawHeaderOut , dataPtr, dataWords); } //----- payload-only { - auto ptr = stm_frag.payloadBegin(); - auto words = stm_frag.payloadWords(); - stm_waveform.set_data(words, ptr); + //auto payloadPtr = stm_frag.payloadBegin(); + //auto payloadWords = stm_frag.payloadWords(); + stm_waveform.set_data(payloadWords, payloadPtr); raw_waveform_digis->emplace_back(stm_waveform); - writePayload(_rawOut, ptr, words); + writePayload(_rawOut, payloadPtr, payloadWords); } - }//End of isRaw + else if (stm_frag.isZS()){ ++_totalZS; //Incremenet ZS counter - + ++localZS_frags; + auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); bool allZeros = true; //assumes all adcs are zero //Check if payload is empty if (payloadWords == 0) { - std::cout<< "Found an empty ZS frag at i = " << i<< "\n"; + std::cout << "\nFound an empty frag, i = " << i<< " @ZS\n"; + ++_totalEmptyZS; ++emptyZS_frags; //Increment empty ZS counter continue; } @@ -263,73 +276,73 @@ void STMDigisFromFragments::produce(Event& event) } //Check if zero filled if (allZeros) { - std::cout << "Found a zero filled ZS frag at i = "<< i<< "\n"; + std::cout << "\nFound a zero filled frag, i = "<< i<< " @ZS\n"; + ++_totalZeroZS; ++zeroZS_frags; continue; } //Print first 20 payload adcs - std::cout<< "First 20 adcs: "; + std::cout << "\nFirst 20 adcs: "; for (size_t kk = 0 ; kk < std::min(payloadWords,20) ; ++kk){ - std::cout << payloadPtr[kk] << " "; + std::cout << payloadPtr[kk] << " , "; } - std::cout << "ZS i = " << i << "\n"; + std::cout << "i = " << i << " @ZS\n"; //Defintions for payload references - auto payloadEnd = payloadPtr + payloadWords; + auto dataPtr = stm_frag.dataBegin(); + auto dataWords = stm_frag.dataWords(); + auto dataEnd = dataPtr + dataWords; size_t seg = 0; size_t totalLen = 0; uint16_t lastZSindex = 0; //keeps track of last recorded index from header -> with respect to what? uint16_t lastLen = 0; //keeps track of last recoded length from header + + writePayload(_zsOut, payloadPtr, payloadWords); - while (payloadPtr + 2 <= payloadEnd){ - uint16_t current_zs_location = static_cast(payloadPtr[0]); - uint16_t current_zs_size = static_cast(payloadPtr[1]); - auto adc = payloadPtr + 2; - if (adc + current_zs_size > payloadEnd) + while (dataPtr + 2 <= dataEnd){ + uint16_t current_zs_location = static_cast(dataPtr[0]); + uint16_t current_zs_size = static_cast(dataPtr[1]); + auto adc = dataPtr + 2; + if (adc + current_zs_size > dataEnd) break; uint32_t trigTimeOffset = current_zs_location; std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_Size - 1 mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use zs_waveform_digis->emplace_back(stm_waveform); //emplace - writePayload(_zsOut, payloadPtr, payloadWords); //A print check per segment - std::cout << "i = " << i << ", seg = "<< seg << ", zs_location = " << current_zs_location << ", current_ZS_size = " << current_zs_size - <<", trigTimeOffset = " << trigTimeOffset << "\n"; + std::cout << "Region = " << seg << " , zs_location = " << current_zs_location << " , current_ZS_size = " << current_zs_size + << " , trigTimeOffset = " << trigTimeOffset << "\n" ; lastZSindex = current_zs_location; lastLen = current_zs_size; totalLen += lastLen; ++seg; - payloadPtr = adc + current_zs_size; + dataPtr = adc + current_zs_size; } //Summary - std::cout << "ZS i = " << i - << "segments = " << seg - << "lastZSindex = " << lastZSindex - << " lastZSLen = " << lastLen << "with a total calculated length of " << totalLen << "\n"; - - - - //----- payload-only - //{ - //stm_waveform.set_data(words,ptr); - //zs_waveform_digis->emplace_back(stm_waveform); - //writePayload(_zsOut, ptr, words); - //} + std::cout << "ZS Regions = " << seg + << " , lastZSindex = " << lastZSindex + << " , lastZSLen = " << lastLen + << " , ZS total length = " << totalLen + << " , i = " << i << " @ZS\n"; }//End of isZS + else if (stm_frag.isMWD()){ ++_totalPH; + ++localPH_frags; //Check if zero filled auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); bool allZeros = true; if (payloadWords ==0){ - ++emptyPH_digis; + ++_totalEmptyPH; + ++emptyPH_frags; + std::cout << "\nFound an empty frag, i = " << i<< " @PH\n"; continue; } @@ -342,21 +355,23 @@ void STMDigisFromFragments::produce(Event& event) } //count if zero filled if (allZeros){ + ++_totalZeroPH; ++zeroPH_frags; + std::cout<< "\nFound a zero filled frag, i = " << i<< " @PH\n"; continue; } + + std::cout << "\nFound a good frag, i = " << i <<" @PH\n"; + size_t digiWords = stm_frag.payloadWords(); + auto const* digiPtr = stm_frag.payloadBegin(); + + writePayload(_phOut,digiPtr, digiWords); - int n_PH_digis = stm_frag.payloadWords(); - for (int i_PH = 0; i_PH < n_PH_digis; ++i_PH){ - auto const* ptr = stm_frag.payloadBegin(); - int16_t i_ptr = ptr[i_PH]; - mu2e::STMMWDDigi PH_digi(0, i_ptr); + for (size_t i_PH = 0; i_PH < digiWords ; ++i_PH){ + int16_t PH = digiPtr[i_PH]; + mu2e::STMMWDDigi PH_digi(0, PH); ph_digis->emplace_back(PH_digi); } - - //stm_waveform.set_data(words, ptr); - //ph_waveform_digis->emplace_back(stm_waveform); - //writePayload(_phOut, ptr, words); }//End of isMWD and is checks @@ -398,28 +413,31 @@ void STMDigisFromFragments::produce(Event& event) } //End of frags loop---George suggestions //Event Summary -> tells us what happens per event - std::cout<<"---------------------------------------------------------"<<"\n"; - std::cout << "raw_waveform_digis total size with data = "<size()<<"\n"; - std::cout << "zs_waveform_digis total size with data = "<size()<<"\n"; - std::cout << "mwd_digis total size with data = " << ph_digis->size()<<"\n"; - - std::cout<< "---------------------------------------------------------"<<"\n"; - std::cout<< "Number of Zero arrays for Raw = " << zeroRaw_frags<< "\n"; - std::cout<< "Number of Zero arrays for ZS = " << zeroZS_frags<< "\n"; - std::cout<< "Number of Zero digis for MWD = " << zeroPH_frags<< "\n"; - - std::cout<< "---------------------------------------------------------"<<"\n"; - std::cout<< "Number of empty arrays for Raw = " <size() <<"\n"; + std::cout << "Extracted ZS waveforms : "<< zs_waveform_digis->size() <<"\n"; + std::cout << "Extracted PH digis : " << ph_digis->size() <<"\n"; + + std::cout << "\n--- Frags Read ---\n"; + std::cout << "Raw frags : " << localRaw_frags << "\n"; + std::cout << "ZS frags : " << localZS_frags << "\n"; + std::cout << "PH frags : " << localPH_frags << "\n"; + + std::cout << "\n--- Filter results ---\n"; + std::cout << "Zero Raw frags : " << zeroRaw_frags << "\n"; + std::cout << "Zero ZS frags : " << zeroZS_frags << "\n"; + std::cout << "Zero PH frags : " << zeroPH_frags << "\n"; + + std::cout << "Empty Raw frags : " << emptyRaw_frags <<"\n"; + std::cout << "Empty ZS frags : " << emptyZS_frags << "\n"; + std::cout << "Empty PH frags : " << emptyPH_frags << "\n"; + + std::cout << "=================================\n"; + //Final move event.put(std::move(raw_waveform_digis), "raw"); event.put(std::move(zs_waveform_digis), "zs"); event.put(std::move(ph_digis), "ph"); - //New parameters to consider - //event.put(std::move(ph_waveform_digis), "ph"); event.put(std::move(raw_header_waveform_digis), "rawWithHeader"); } // produce() @@ -430,17 +448,26 @@ void STMDigisFromFragments::produce(Event& event) void STMDigisFromFragments::endJob() { //Tells us what happened at the very end - std::cout << "\n========== STM SUMMARY ==========\n"; + std::cout << "\n========== STM JOB SUMMARY ==========\n"; std::cout << "Total events : " << _totalEvents << "\n"; std::cout << "Total fragments : " << _totalFragments << "\n"; std::cout << "Container frags : " << _totalContainers << "\n"; std::cout << "Inner fragments : " << _totalInner << "\n"; - std::cout << "\n--- Data types ---\n"; + std::cout << "\n--- Data types read ---\n"; std::cout << "RAW : " << _totalRaw << "\n"; std::cout << "ZS : " << _totalZS << "\n"; - std::cout << "PH : " << _totalPH << "\n"; + std::cout << "PH : " << _totalPH << "\n"; + + std::cout << "\n-- -Data types filtered ---\n"; + std::cout << "Zero RAW frags : " << _totalZeroRaw << "\n"; + std::cout << "Zero ZS frags : " << _totalZeroZS << "\n"; + std::cout << "Zero PH frags : " << _totalZeroPH << "\n"; + std::cout << "Empty Raw frags : " << _totalEmptyRaw << "\n"; + std::cout << "Empty ZS frags : " << _totalEmptyZS << "\n"; + std::cout << "Empty PH frags : " << _totalEmptyPH << "\n"; + std::cout << "=================================\n"; } From 67030a2093f47e8e7ed85aa391710ae0094cae8e Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 10:18:58 -0500 Subject: [PATCH 14/29] Changes to unpacking - bryan --- DAQ/src/STMDigisFromFragments_module.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index e6bd6eadaa..c9733c7412 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -226,7 +226,8 @@ void STMDigisFromFragments::produce(Event& event) for (size_t kk = 0; kk < std::min(payloadWords,20); ++kk){ std::cout << payloadPtr[kk] << " ,"; } - std::cout << "\nRaw header : ZS Length = " << stm_frag.zsLength() + std::cout << "\nRaw header : Raw Length = " << stm_frag.rawLength() + <<" , ZS Length = " << stm_frag.zsLength() << " , ZS Regions = " << stm_frag.zsRegions() << " , i = " << i << " @Raw\n"; @@ -312,7 +313,7 @@ void STMDigisFromFragments::produce(Event& event) zs_waveform_digis->emplace_back(stm_waveform); //emplace //A print check per segment - std::cout << "Region = " << seg << " , zs_location = " << current_zs_location << " , current_ZS_size = " << current_zs_size + std::cout << "Region = " << seg << " , zs_index = " << current_zs_location << " , zs_size = " << current_zs_size << " , trigTimeOffset = " << trigTimeOffset << "\n" ; lastZSindex = current_zs_location; @@ -460,7 +461,7 @@ void STMDigisFromFragments::endJob() { std::cout << "ZS : " << _totalZS << "\n"; std::cout << "PH : " << _totalPH << "\n"; - std::cout << "\n-- -Data types filtered ---\n"; + std::cout << "\n--- Data types filtered ---\n"; std::cout << "Zero RAW frags : " << _totalZeroRaw << "\n"; std::cout << "Zero ZS frags : " << _totalZeroZS << "\n"; std::cout << "Zero PH frags : " << _totalZeroPH << "\n"; From 2b9d4e51a2297737cd6e99ff714338d4ae8f72e0 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 11:07:50 -0500 Subject: [PATCH 15/29] 1st changes MWD->PH --- .../inc/{STMMWDDigi.hh => STMPHDigi.hh} | 16 ++++++++-------- RecoDataProducts/src/classes.h | 2 +- RecoDataProducts/src/classes_def.xml | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) rename RecoDataProducts/inc/{STMMWDDigi.hh => STMPHDigi.hh} (58%) diff --git a/RecoDataProducts/inc/STMMWDDigi.hh b/RecoDataProducts/inc/STMPHDigi.hh similarity index 58% rename from RecoDataProducts/inc/STMMWDDigi.hh rename to RecoDataProducts/inc/STMPHDigi.hh index 02cdce60df..d6d5fc9c1c 100644 --- a/RecoDataProducts/inc/STMMWDDigi.hh +++ b/RecoDataProducts/inc/STMPHDigi.hh @@ -1,5 +1,5 @@ -#ifndef RecoDataProducts_STMMWDDigi_hh -#define RecoDataProducts_STMMWDDigi_hh +#ifndef RecoDataProducts_STMPHDigi_hh +#define RecoDataProducts_STMPHDigi_hh // // Data product that represents an uncalibrated hit in the STM // @@ -12,11 +12,11 @@ namespace mu2e { - class STMMWDDigi { + class STMPHDigi { public: - STMMWDDigi() : _time(0), _energy(0){}; + STMPHDigi() : _time(0), _energy(0){}; - STMMWDDigi(uint32_t time, int16_t energy) : _time(time), _energy(energy) {}; + STMPHDigi(uint32_t time, int16_t energy) : _time(time), _energy(energy) {}; uint32_t time() const { return _time; } @@ -27,14 +27,14 @@ namespace mu2e { int16_t _energy; // uncalibrated energy [ADC units] }; - typedef std::vector STMMWDDigiCollection; + typedef std::vector STMPHDigiCollection; - bool lessByTime(const STMMWDDigi& a, const STMMWDDigi& b) { + bool lessByTime(const STMPHDigi& a, const STMPHDigi& b) { if (a.time() < b.time()) { return true; } else { return false; } } - bool lessByEnergy(const STMMWDDigi& a, const STMMWDDigi& b) { + bool lessByEnergy(const STMPHDigi& a, const STMPHDigi& b) { if (a.energy() < b.energy()) { return true; } else { return false; } } diff --git a/RecoDataProducts/src/classes.h b/RecoDataProducts/src/classes.h index b95d8f6cd4..f191428da0 100644 --- a/RecoDataProducts/src/classes.h +++ b/RecoDataProducts/src/classes.h @@ -95,7 +95,7 @@ // STM #include "Offline/RecoDataProducts/inc/STMWaveformDigi.hh" -#include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" +#include "Offline/RecoDataProducts/inc/STMPHDigi.hh" #include "Offline/RecoDataProducts/inc/STMHit.hh" // MTP diff --git a/RecoDataProducts/src/classes_def.xml b/RecoDataProducts/src/classes_def.xml index 7e239ba0be..81380ec4f5 100644 --- a/RecoDataProducts/src/classes_def.xml +++ b/RecoDataProducts/src/classes_def.xml @@ -445,9 +445,9 @@ - - - + + + From 628a15c382f6666c97156b9252ec31fdc127ffa4 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 11:23:01 -0500 Subject: [PATCH 16/29] 2nd set, MWD->PH --- DAQ/src/STMDigisFromFragments_module.cc | 14 ++++---- .../{MWDTree_module.cc => PHTree_module.cc} | 34 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) rename STMMC/src/{MWDTree_module.cc => PHTree_module.cc} (72%) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index c9733c7412..d48c819af3 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -11,7 +11,7 @@ #include "Offline/ProditionsService/inc/ProditionsHandle.hh" #include "Offline/RecoDataProducts/inc/STMWaveformDigi.hh" -#include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" +#include "Offline/RecoDataProducts/inc/STMPHDigi.hh" #include "art/Framework/Principal/Handle.h" #include "artdaq-core-mu2e/Overlays/STMFragment.hh" #include @@ -102,7 +102,7 @@ STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table("raw");//Waveforms produces("zs"); produces("rawWithHeader"); - produces("ph"); // digi series + produces("ph"); // digi series //turns file into binary _rawOut.open(config().rawFile(), std::ios::binary); @@ -140,7 +140,7 @@ void STMDigisFromFragments::produce(Event& event) std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); - std::unique_ptr ph_digis(new mu2e::STMMWDDigiCollection); + std::unique_ptr ph_digis(new mu2e::STMPHDigiCollection); std::unique_ptr raw_header_waveform_digis(new mu2e::STMWaveformDigiCollection); //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original @@ -332,7 +332,7 @@ void STMDigisFromFragments::produce(Event& event) }//End of isZS - else if (stm_frag.isMWD()){ + else if (stm_frag.isPH()){ ++_totalPH; ++localPH_frags; //Check if zero filled @@ -370,11 +370,11 @@ void STMDigisFromFragments::produce(Event& event) for (size_t i_PH = 0; i_PH < digiWords ; ++i_PH){ int16_t PH = digiPtr[i_PH]; - mu2e::STMMWDDigi PH_digi(0, PH); + mu2e::STMPHDigi PH_digi(0, PH); ph_digis->emplace_back(PH_digi); } - }//End of isMWD and is checks + }//End of isPH and is checks //---Combined stream write w. order preserved ---- { @@ -389,7 +389,7 @@ void STMDigisFromFragments::produce(Event& event) cptr = stm_frag.payloadBegin(); cwords = stm_frag.payloadWords(); } - else if (stm_frag.isMWD()){ + else if (stm_frag.isPH()){ cptr = stm_frag.payloadBegin(); cwords = stm_frag.payloadWords(); } diff --git a/STMMC/src/MWDTree_module.cc b/STMMC/src/PHTree_module.cc similarity index 72% rename from STMMC/src/MWDTree_module.cc rename to STMMC/src/PHTree_module.cc index e0703eca35..727192fb86 100644 --- a/STMMC/src/MWDTree_module.cc +++ b/STMMC/src/PHTree_module.cc @@ -1,5 +1,5 @@ // Adapted from ReadVirtualDetector_module.cc -// For STMMWDDigis, generates a TTree with the time and energy +// For STMPHDigis, generates a TTree with the time and energy // Original author: Ivan Logashenko // Adapted by: Pawel Plesniak @@ -25,7 +25,7 @@ #include "messagefacility/MessageLogger/MessageLogger.h" // Offline includes -#include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" +#include "Offline/RecoDataProducts/inc/STMPHDigi.hh" // ROOT includes #include "art_root_io/TFileService.h" @@ -36,44 +36,44 @@ typedef cet::map_vector_key key_type; typedef unsigned long VolumeId_type; namespace mu2e { - class MWDTree : public art::EDAnalyzer { + class PHTree : public art::EDAnalyzer { public: using Name=fhicl::Name; using Comment=fhicl::Comment; struct Config { - fhicl::Atom STMMWDDigiTag{Name("STMMWDDigiTag"), Comment("Tag identifying the MWD Digis")}; + fhicl::Atom STMPHDigiTag{Name("STMPHDigiTag"), Comment("Tag identifying the PH Digis")}; fhicl::OptionalAtom EnergyCalib{ Name("EnergyCalib"), Comment("Controls whether to make the energy TTrees with units of energy or in ADC values. If 0, will leave as ADC value, otherwise will multiply by this calibration to generate the energy.")}; }; using Parameters = art::EDAnalyzer::Table; - explicit MWDTree(const Parameters& conf); + explicit PHTree(const Parameters& conf); void analyze(const art::Event& e); void endJob(); private: - art::ProductToken STMMWDDigiToken; + art::ProductToken STMPHDigiToken; int eventCounter = 0, digiCounter = 0; TTree* ttree; uint32_t time = 0; double E = 0, EnergyCalib = 0; }; - MWDTree::MWDTree(const Parameters& conf) : + PHTree::PHTree(const Parameters& conf) : art::EDAnalyzer(conf), - STMMWDDigiToken(consumes(conf().STMMWDDigiTag())) { + STMPHDigiToken(consumes(conf().STMPHDigiTag())) { EnergyCalib = conf().EnergyCalib() ? *(conf().EnergyCalib()) : 1.0; art::ServiceHandle tfs; - ttree = tfs->make("ttree", "MWD ttree"); + ttree = tfs->make("ttree", "PH ttree"); ttree->Branch("time", &time, "time/i"); // ns ttree->Branch("E", &E, "E/D"); // keV }; - void MWDTree::analyze(const art::Event& event) { + void PHTree::analyze(const art::Event& event) { // Get the data products from the event - auto const& MWDDigis = event.getProduct(STMMWDDigiToken); - if (MWDDigis.empty()) + auto const& PHDigis = event.getProduct(STMPHDigiToken); + if (PHDigis.empty()) return; eventCounter++; // Loop over all VD hits - for (const STMMWDDigi& digi : MWDDigis) { + for (const STMPHDigi& digi : PHDigis) { // Extract the parameters time = digi.time(); E = digi.energy() * EnergyCalib; @@ -87,13 +87,13 @@ namespace mu2e { return; }; - void MWDTree::endJob() { - mf::LogInfo log("MWD tree summary"); - log << "=========MWD tree summary =========\n"; + void PHTree::endJob() { + mf::LogInfo log("PH tree summary"); + log << "========= PH tree summary =========\n"; log << std::left << std::setw(25) << "\tProcessed events: " << eventCounter << "\n"; log << std::left << std::setw(25) << "\tProcessed digis: " << digiCounter << "\n"; log << "===================================\n"; }; }; // end namespace mu2e -DEFINE_ART_MODULE(mu2e::MWDTree) +DEFINE_ART_MODULE(mu2e::PHTree) From 65087c242f94db8c962ea74056cd552fdbdb1d4d Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 11:41:16 -0500 Subject: [PATCH 17/29] 3rd, MWD->PH --- STMMC/CMakeLists.txt | 4 ++-- STMMC/fcl/HPGeReco.fcl | 24 ++++++++++++------------ STMMC/fcl/MakeTree.fcl | 6 +++--- STMMC/fcl/prolog.fcl | 6 +++--- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/STMMC/CMakeLists.txt b/STMMC/CMakeLists.txt index 7e719143d7..ccec9dee51 100644 --- a/STMMC/CMakeLists.txt +++ b/STMMC/CMakeLists.txt @@ -43,8 +43,8 @@ cet_build_plugin(HPGeWaveformsFromStepPointMCs art::module Offline::STMConditions Offline::GlobalConstantsService ) -cet_build_plugin(MWDTree art::module - REG_SOURCE src/MWDTree_module.cc +cet_build_plugin(PHTree art::module + REG_SOURCE src/PHTree_module.cc LIBRARIES REG art_root_io::TFileService_service Offline::RecoDataProducts diff --git a/STMMC/fcl/HPGeReco.fcl b/STMMC/fcl/HPGeReco.fcl index b6dc9d5362..7a4563be45 100644 --- a/STMMC/fcl/HPGeReco.fcl +++ b/STMMC/fcl/HPGeReco.fcl @@ -49,17 +49,17 @@ physics : { makeTTreeGradients: false makeTTreeWaveforms: false } - MWDHPGe : { + PHHPGe : { module_type : STMMovingWindowDeconvolution - stmWaveformDigisTag : @local::STMMCAnalysis.MWD.HPGe.stmWaveformDigisTag.concatenated - tau : @local::STMMCAnalysis.MWD.HPGe.tau - M : @local::STMMCAnalysis.MWD.HPGe.M - L : @local::STMMCAnalysis.MWD.HPGe.L - nsigma_cut : @local::STMMCAnalysis.MWD.HPGe.nsigma_cut - thresholdgrad : @local::STMMCAnalysis.MWD.HPGe.thresholdgrad - defaultBaselineMean : @local::STMMCAnalysis.MWD.HPGe.defaultBaselineMean.suppressed - defaultBaselineSD : @local::STMMCAnalysis.MWD.HPGe.defaultBaselineSD.suppressed - makeTTreeMWD: false + stmWaveformDigisTag : @local::STMMCAnalysis.PH.HPGe.stmWaveformDigisTag.concatenated + tau : @local::STMMCAnalysis.PH.HPGe.tau + M : @local::STMMCAnalysis.PH.HPGe.M + L : @local::STMMCAnalysis.PH.HPGe.L + nsigma_cut : @local::STMMCAnalysis.PH.HPGe.nsigma_cut + thresholdgrad : @local::STMMCAnalysis.PH.HPGe.thresholdgrad + defaultBaselineMean : @local::STMMCAnalysis.PH.HPGe.defaultBaselineMean.suppressed + defaultBaselineSD : @local::STMMCAnalysis.PH.HPGe.defaultBaselineSD.suppressed + makeTTreePH: false makeTTreeEnergies: false TTreeEnergyCalib : @local::HPGeDigitization.EnergyPerADCBin verbosityLevel : 0 @@ -72,7 +72,7 @@ physics : { STMWaveformDigisTag : @local::HPGeDigitization.concatenation.filterTag } } - digitization_path : [DigiHPGe, concatenateWaveformsHPGe, concatenationFilterHPGe, ZSHPGe, MWDHPGe] + digitization_path : [DigiHPGe, concatenateWaveformsHPGe, concatenationFilterHPGe, ZSHPGe, PHHPGe] trigger_paths : [digitization_path] output_path : [compressedOutput] end_paths : [output_path] @@ -85,7 +85,7 @@ outputs : { SelectEvents: ["digitization_path"] outputCommands: [ "drop *_*_*_*", - "keep mu2e::STMMWDDigis_MWDHPGe_*_HPGeReco" + "keep mu2e::STMPHDigis_PHHPGe_*_HPGeReco" ] } } diff --git a/STMMC/fcl/MakeTree.fcl b/STMMC/fcl/MakeTree.fcl index 1bcf442025..bad498198d 100644 --- a/STMMC/fcl/MakeTree.fcl +++ b/STMMC/fcl/MakeTree.fcl @@ -43,9 +43,9 @@ physics: { SimParticlemvTag : @local::SimplifyStage2Data.SimParticlemvTag Detector: @local::SimplifyStage2Data.DetectorName.LaBr } - MWDSpectra : { - module_type : MWDTree - STMMWDDigiTag : @local::STMMCAnalysis.MWD.HPGe.STMMWDDigiTag + PHSpectra : { + module_type : PHTree + STMPHDigiTag : @local::STMMCAnalysis.PH.HPGe.STMPHDigiTag EnergyCalib : @local::HPGeDigitization.EnergyPerADCBin } } diff --git a/STMMC/fcl/prolog.fcl b/STMMC/fcl/prolog.fcl index 1b56b4f7d1..2dca0648fa 100644 --- a/STMMC/fcl/prolog.fcl +++ b/STMMC/fcl/prolog.fcl @@ -111,7 +111,7 @@ STMMCAnalysis : { naverage : @local::STM.HPGe.naverage } } - MWD : { + PH : { HPGe : { stmWaveformDigisTag : { ZS: "ZSHPGe:" @@ -130,7 +130,7 @@ STMMCAnalysis : { full: @local::STM.HPGe.defaultBaselineSD suppressed: 0 } - STMMWDDigiTag : "MWDHPGe:" + STMPHDigiTag : "PHHPGe:" } LaBr : { stmWaveformDigisTag : "ZSLaBr:" @@ -141,7 +141,7 @@ STMMCAnalysis : { thresholdgrad : @local::STM.HPGe.thresholdgrad defaultBaselineMean : @local::STM.HPGe.defaultBaselineMean defaultBaselineSD : @local::STM.HPGe.defaultBaselineSD - STMMWDDigiTag : "MWDLaBr:" + STMPHDigiTag : "PHLaBr:" } } } From 5f454cca009e8b14bbf5c61eab32c4076e967ec3 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 12:23:49 -0500 Subject: [PATCH 18/29] 4th, MWD->PH --- .../STMMovingWindowDeconvolution_module.cc | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/STMReco/src/STMMovingWindowDeconvolution_module.cc b/STMReco/src/STMMovingWindowDeconvolution_module.cc index 755436d70f..b52c343d42 100644 --- a/STMReco/src/STMMovingWindowDeconvolution_module.cc +++ b/STMReco/src/STMMovingWindowDeconvolution_module.cc @@ -35,7 +35,7 @@ #include "Offline/GlobalConstantsService/inc/GlobalConstantsHandle.hh" #include "Offline/GlobalConstantsService/inc/ParticleDataList.hh" #include "Offline/RecoDataProducts/inc/STMWaveformDigi.hh" -#include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" +#include "Offline/RecoDataProducts/inc/STMPHDigi.hh" #include "Offline/Mu2eUtilities/inc/STMUtils.hh" #include "Offline/ProditionsService/inc/ProditionsHandle.hh" #include "Offline/STMConditions/inc/STMEnergyCalib.hh" @@ -61,7 +61,7 @@ namespace mu2e { fhicl::Atom thresholdgrad{Name("thresholdgrad"), Comment("Threshold on gradient to cut out peaks when calculating baseline")}; fhicl::Atom defaultBaselineMean{Name("defaultBaselineMean"), Comment("Default mean to use for baseline when ZS removes all baseline data, in ADC values")}; fhicl::Atom defaultBaselineSD{Name("defaultBaselineSD"), Comment("Default standard deviation to use for baseline when ZS removes all baseline data, in ADC values")}; - fhicl::OptionalAtom makeTTreeMWD{ Name("makeTTreeMWD"), Comment("Controls whether to make the TTree with branches ADC, deconvoluted, differentiated, averaged")}; + fhicl::OptionalAtom makeTTreePH{ Name("makeTTreePH"), Comment("Controls whether to make the TTree with branches ADC, deconvoluted, differentiated, averaged")}; fhicl::OptionalAtom makeTTreeEnergies{ Name("makeTTreeEnergies"), Comment("Controls whether to make the TTree with branches time, E")}; fhicl::OptionalAtom TTreeEnergyCalib{ Name("TTreeEnergyCalib"), Comment("Controls whether to make the energy TTrees with units of energy or in ADC values. If 0, will leave as ADC value, otherwise will multiply by this calibration to generate the energy.")}; fhicl::OptionalAtom verbosityLevel{Name("verbosityLevel"), Comment("Verbosity level")}; @@ -95,7 +95,7 @@ namespace mu2e { double thresholdgrad = 0.0; // threshold on gradient double defaultBaselineMean = 0.0; double defaultBaselineSD = 0.0; - bool makeTTreeMWD = false; // controls whether to make MWD process TTree + bool makeTTreePH = false; // controls whether to make PH process TTree bool makeTTreeEnergies = false; // controls whether to make results TTree int verbosityLevel = 0; // std cout verbosity level std::string _xAxis = ""; // optional parameter for x-axis unit if plotting histograms @@ -103,7 +103,7 @@ namespace mu2e { // Proditions service ProditionsHandle _stmEnergyCalib_h; - // MWD analysis variables + // PH analysis variables std::vector ADCs; // input waveform ADCs unsigned long int nADCs = 0; // size of input data unsigned long int i = 0; // iterator @@ -115,7 +115,7 @@ namespace mu2e { std::vector averaged_data; double sum = 0.0; // variable part of avarege() int count = 0; // counter variable - int16_t mwd_energy = 0; + int16_t ph_energy = 0; // Peak finding variables double baseline_mean = 0.0; @@ -154,7 +154,7 @@ namespace mu2e { thresholdgrad(conf().thresholdgrad()), defaultBaselineMean(conf().defaultBaselineMean()), defaultBaselineSD(conf().defaultBaselineSD()) { - produces(); + produces(); if (M < L) throw cet::exception("Configuration", "L (" + std::to_string(L) + ") is greater than M (" + std::to_string(M) + "), reconfigure\n"); verbosityLevel = conf().verbosityLevel() ? *(conf().verbosityLevel()) : 0; @@ -162,10 +162,10 @@ namespace mu2e { verbosityLevel = 10; _xAxis = conf().xAxis() ? *(conf().xAxis()) : ""; std::cout<<"BG"<<_xAxis< tfs; ttree = tfs->make("ttree", "STMMovingWindowDeconvolution pulse finding ttree"); ttree->Branch("ADC", &ADC, "ADC/S"); @@ -209,7 +209,7 @@ namespace mu2e { void STMMovingWindowDeconvolution::produce(art::Event& event) { // create output - std::unique_ptr outputMWDDigis(new STMMWDDigiCollection); + std::unique_ptr outputPHDigis(new STMPHDigiCollection); auto waveformDigisHandle = event.getValidHandle(_stmWaveformDigisToken); // get prodition @@ -255,23 +255,23 @@ namespace mu2e { if (nPeaks && verbosityLevel) // TODO - change to verbosityLevel std::cout << "MWD: found " << nPeaks << " peaks in event " << event.id() << std::endl; for (i = 0; i < nPeaks; ++i) { - mwd_energy = (peak_heights[i] < ADCMax) ? ADCMax : static_cast(peak_heights[i]); // When saturating the int16_t limit, deconvolution goes below the int16_t limit so the energy turns negative. This clips the energy and the limit - STMMWDDigi mwd_digi(peak_times[i], -1 * mwd_energy); // peak_heights are negative, make them positive here - if (mwd_digi.energy() < -100) + ph_energy = (peak_heights[i] < ADCMax) ? ADCMax : static_cast(peak_heights[i]); // When saturating the int16_t limit, deconvolution goes below the int16_t limit so the energy turns negative. This clips the energy and the limit + STMPHDigi ph_digi(peak_times[i], -1 * ph_energy); // peak_heights are negative, make them positive here + if (ph_digi.energy() < -100) throw cet::exception("logicError", "The peak height must be positive!"); - outputMWDDigis->push_back(mwd_digi); + outputPHDigis->push_back(ph_digi); if (makeTTreeEnergies) { - time = mwd_digi.time(); - E = mwd_digi.energy() * TTreeEnergyCalib; + time = ph_digi.time(); + E = ph_digi.energy() * TTreeEnergyCalib; ttree->Fill(); }; if (verbosityLevel > 3) - std::cout << "energy: " << mwd_digi.energy() << std::endl; + std::cout << "energy: " << ph_digi.energy() << std::endl; }; // Save data to TTree - if (makeTTreeMWD) { + if (makeTTreePH) { time = waveform.trigTimeOffset(); for (i = 0; i < nADCs; i++) { ADC = ADCs[i]; @@ -289,8 +289,8 @@ namespace mu2e { }; if (verbosityLevel) - std::cout << "MWD: " << channel.name() << ": " << outputMWDDigis->size() << " MWD digis found" << std::endl; - event.put(std::move(outputMWDDigis)); + std::cout << "MWD: " << channel.name() << ": " << outputPHDigis->size() << " PH digis found" << std::endl; + event.put(std::move(outputPHDigis)); }; From 79ed3f711ab5b263ffda772b6b9c8babc0fab070 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 12:32:17 -0500 Subject: [PATCH 19/29] 5th, MWD->PH --- ..._module.cc => PlotSTMPHSpectrum_module.cc} | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) rename STMReco/src/{PlotSTMMWDSpectrum_module.cc => PlotSTMPHSpectrum_module.cc} (60%) diff --git a/STMReco/src/PlotSTMMWDSpectrum_module.cc b/STMReco/src/PlotSTMPHSpectrum_module.cc similarity index 60% rename from STMReco/src/PlotSTMMWDSpectrum_module.cc rename to STMReco/src/PlotSTMPHSpectrum_module.cc index 3f88df801e..4995dc4aef 100644 --- a/STMReco/src/PlotSTMMWDSpectrum_module.cc +++ b/STMReco/src/PlotSTMPHSpectrum_module.cc @@ -1,5 +1,5 @@ // -// Analyzer module to create a histogram of the STMMWDDigi uncalibrated energies +// Analyzer module to create a histogram of the STMPHDigi uncalibrated energies // #include "art/Framework/Principal/Event.h" #include "art/Framework/Core/EDAnalyzer.h" @@ -24,21 +24,21 @@ #include "TSpectrum.h" #include "TGraph.h" -#include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" +#include "Offline/RecoDataProducts/inc/STMPHDigi.hh" using namespace std; using CLHEP::Hep3Vector; namespace mu2e { - class PlotSTMMWDSpectrum : public art::EDAnalyzer { + class PlotSTMPHSpectrum : public art::EDAnalyzer { public: using Name=fhicl::Name; using Comment=fhicl::Comment; struct Config { - fhicl::Atom stmMWDDigisTag{ Name("stmMWDDigisTag"), Comment("InputTag for STMMWDDigiCollection")}; + fhicl::Atom stmPHDigisTag{ Name("stmPHDigisTag"), Comment("InputTag for STMPHDigiCollection")}; }; using Parameters = art::EDAnalyzer::Table; - explicit PlotSTMMWDSpectrum(const Parameters& conf); + explicit PlotSTMPHSpectrum(const Parameters& conf); private: void beginJob() override; @@ -47,36 +47,36 @@ namespace mu2e { TH2F* _twoDhist; //Histograms of Energy vs binned event int eventCount = 0; - TH1D* _mwdSpectrum; - art::ProductToken _stmMWDDigisToken; + TH1D* _phSpectrum; + art::ProductToken _stmPHDigisToken; }; - PlotSTMMWDSpectrum::PlotSTMMWDSpectrum(const Parameters& config ) : + PlotSTMPHSpectrum::PlotSTMPHSpectrum(const Parameters& config ) : art::EDAnalyzer{config}, - _stmMWDDigisToken(consumes(config().stmMWDDigisTag())) + _stmPHDigisToken(consumes(config().stmPHDigisTag())) { } - void PlotSTMMWDSpectrum::beginJob() { + void PlotSTMPHSpectrum::beginJob() { art::ServiceHandle tfs; // create histograms - _mwdSpectrum=tfs->make("mwdSpectrum", "MWD Spectrum", 1000, 0, 1e4); + _phSpectrum=tfs->make("phSpectrum", "PH Spectrum", 1000, 0, 1e4); _twoDhist=tfs->make("twoDhist","Pulse Height vs events;Event Bins; Pulse Height", 1000,0,1000, // X-axis scale 1000,0,1e5); // Y-axis scale } - void PlotSTMMWDSpectrum::analyze(const art::Event& event) { + void PlotSTMPHSpectrum::analyze(const art::Event& event) { - auto mwdDigisHandle = event.getValidHandle(_stmMWDDigisToken); + auto phDigisHandle = event.getValidHandle(_stmPHDigisToken); int binBlock = eventCount/100; - for (const auto& mwdDigi : *mwdDigisHandle) { - auto energy = mwdDigi.energy(); - _mwdSpectrum->Fill(energy); + for (const auto& phDigi : *phDigisHandle) { + auto energy = phDigi.energy(); + _phSpectrum->Fill(energy); _twoDhist->Fill(binBlock, energy); } ++eventCount; } } -DEFINE_ART_MODULE(mu2e::PlotSTMMWDSpectrum) +DEFINE_ART_MODULE(mu2e::PlotSTMPHSpectrum) From aa13eb207d796fbe2ff81bbd520c356a6dc2d6ab Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 13:14:54 -0500 Subject: [PATCH 20/29] 6, MWD->PH --- STMReco/CMakeLists.txt | 6 ++-- STMReco/fcl/mwd_testbeam.fcl | 2 +- STMReco/fcl/plotSTMMWDSpectrum.fcl | 35 --------------------- STMReco/fcl/plotSTMPHSpectrum.fcl | 35 +++++++++++++++++++++ STMReco/src/MakeSTMHits_module.cc | 18 +++++------ STMReco/src/PlotSTMEnergySpectrum_module.cc | 2 +- 6 files changed, 49 insertions(+), 49 deletions(-) delete mode 100644 STMReco/fcl/plotSTMMWDSpectrum.fcl create mode 100644 STMReco/fcl/plotSTMPHSpectrum.fcl diff --git a/STMReco/CMakeLists.txt b/STMReco/CMakeLists.txt index 6488dcaa77..be76a02e26 100644 --- a/STMReco/CMakeLists.txt +++ b/STMReco/CMakeLists.txt @@ -17,8 +17,8 @@ cet_build_plugin(PlotSTMEnergySpectrum art::module Offline::RecoDataProducts ) -cet_build_plugin(PlotSTMMWDSpectrum art::module - REG_SOURCE src/PlotSTMMWDSpectrum_module.cc +cet_build_plugin(PlotSTMPHSpectrum art::module + REG_SOURCE src/PlotSTMPHSpectrum_module.cc LIBRARIES REG art_root_io::TFileService_service Offline::GlobalConstantsService @@ -71,7 +71,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/makeSTMHits_testbeam.fcl ${CURR configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/mwd.fcl ${CURRENT_BINARY_DIR} fcl/mwd.fcl COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/mwd_testbeam.fcl ${CURRENT_BINARY_DIR} fcl/mwd_testbeam.fcl COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/plotSTMEnergySpectrum.fcl ${CURRENT_BINARY_DIR} fcl/plotSTMEnergySpectrum.fcl COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/plotSTMMWDSpectrum.fcl ${CURRENT_BINARY_DIR} fcl/plotSTMMWDSpectrum.fcl COPYONLY) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/plotSTMPHSpectrum.fcl ${CURRENT_BINARY_DIR} fcl/plotSTMPHSpectrum.fcl COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/plotSTMWaveformDigis.fcl ${CURRENT_BINARY_DIR} fcl/plotSTMWaveformDigis.fcl COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/prolog.fcl ${CURRENT_BINARY_DIR} fcl/prolog.fcl COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fcl/prolog_testbeam.fcl ${CURRENT_BINARY_DIR} fcl/prolog_testbeam.fcl COPYONLY) diff --git a/STMReco/fcl/mwd_testbeam.fcl b/STMReco/fcl/mwd_testbeam.fcl index 3369288552..e2ca4fa4b7 100644 --- a/STMReco/fcl/mwd_testbeam.fcl +++ b/STMReco/fcl/mwd_testbeam.fcl @@ -1,5 +1,5 @@ # -# Apply mpoving window deconvolution algorithm to zero-suppressed STMWaveformDigis +# Apply Moving Window Deconvolution algorithm to zero-suppressed STMWaveformDigis # #include "Offline/STMReco/fcl/prolog_testbeam.fcl" diff --git a/STMReco/fcl/plotSTMMWDSpectrum.fcl b/STMReco/fcl/plotSTMMWDSpectrum.fcl deleted file mode 100644 index 337789ff8c..0000000000 --- a/STMReco/fcl/plotSTMMWDSpectrum.fcl +++ /dev/null @@ -1,35 +0,0 @@ -# -# Plot STMWaveformDigis -# - -#include "Offline/fcl/standardServices.fcl" - -process_name: PlotSTMMWDSpectrum - -source : { - module_type : RootInput -} - -services : @local::Services.Reco -physics: { - producers : { - } - filters : { - } - analyzers : { - plotHPGeMWDSpectrum : { - module_type : PlotSTMMWDSpectrum - stmMWDDigisTag : "mwdHPGe" - } - plotLaBrMWDSpectrum : { - module_type : PlotSTMMWDSpectrum - stmMWDDigisTag : "makeSTMDigis:mwd" - } - } - # setup paths - trigger_paths: [ ] - anaPath : [ plotLaBrMWDSpectrum ] - end_paths: [anaPath] -} - -services.TFileService.fileName : "stmMWDSpectrum.root" diff --git a/STMReco/fcl/plotSTMPHSpectrum.fcl b/STMReco/fcl/plotSTMPHSpectrum.fcl new file mode 100644 index 0000000000..947ece3aee --- /dev/null +++ b/STMReco/fcl/plotSTMPHSpectrum.fcl @@ -0,0 +1,35 @@ +# +# Plot STMWaveformDigis +# + +#include "Offline/fcl/standardServices.fcl" + +process_name: PlotSTMPHSpectrum + +source : { + module_type : RootInput +} + +services : @local::Services.Reco +physics: { + producers : { + } + filters : { + } + analyzers : { + plotHPGePHSpectrum : { + module_type : PlotSTMPHSpectrum + stmPHDigisTag : "phHPGe" + } + plotLaBrPHSpectrum : { + module_type : PlotSTMPHSpectrum + stmPHDigisTag : "makeSTMDigis:ph" + } + } + # setup paths + trigger_paths: [ ] + anaPath : [ plotLaBrPHSpectrum ] + end_paths: [anaPath] +} + +services.TFileService.fileName : "stmPHSpectrum.root" diff --git a/STMReco/src/MakeSTMHits_module.cc b/STMReco/src/MakeSTMHits_module.cc index 3c9f830787..3fc67aa36f 100644 --- a/STMReco/src/MakeSTMHits_module.cc +++ b/STMReco/src/MakeSTMHits_module.cc @@ -1,5 +1,5 @@ // -// Create STMHits from STMMWDDigis +// Create STMHits from STMPHDigis // #include "art/Framework/Principal/Event.h" #include "art/Framework/Core/EDProducer.h" @@ -22,7 +22,7 @@ #include "TH1F.h" #include "TTree.h" -#include "Offline/RecoDataProducts/inc/STMMWDDigi.hh" +#include "Offline/RecoDataProducts/inc/STMPHDigi.hh" #include "Offline/RecoDataProducts/inc/STMHit.hh" // C++ @@ -37,7 +37,7 @@ namespace mu2e { using Name=fhicl::Name; using Comment=fhicl::Comment; struct Config { - fhicl::Atom stmMWDDigisTag{ Name("stmMWDDigisTag"), Comment("InputTag for STMMWDDigiCollection")}; + fhicl::Atom stmPHDigisTag{ Name("stmPHDigisTag"), Comment("InputTag for STMPHDigiCollection")}; }; using Parameters = art::EDProducer::Table; explicit MakeSTMHits(const Parameters& conf); @@ -45,14 +45,14 @@ namespace mu2e { private: void produce(art::Event& e) override; - art::ProductToken _stmMWDDigisToken; + art::ProductToken _stmPHDigisToken; STMChannel _channel; ProditionsHandle _stmEnergyCalib_h; }; MakeSTMHits::MakeSTMHits(const Parameters& config ) : art::EDProducer{config} - ,_stmMWDDigisToken(consumes(config().stmMWDDigisTag())) + ,_stmPHDigisToken(consumes(config().stmPHDigisTag())) ,_channel(STMChannel::LaBr) ,_stmEnergyCalib_h() { @@ -62,16 +62,16 @@ namespace mu2e { void MakeSTMHits::produce(art::Event& event) { // create output unique_ptr outputSTMHits(new STMHitCollection); - auto mwdDigisHandle = event.getValidHandle(_stmMWDDigisToken); + auto phDigisHandle = event.getValidHandle(_stmPHDigisToken); STMEnergyCalib const& stmEnergyCalib = _stmEnergyCalib_h.get(event.id()); // get calibration const auto nsPerCt = stmEnergyCalib.nsPerCt(_channel); const auto& pars = stmEnergyCalib.calib(_channel); - for (const auto& mwd_digi : *mwdDigisHandle) { - auto uncalib_time = mwd_digi.time(); - auto uncalib_energy = mwd_digi.energy(); + for (const auto& ph_digi : *phDigisHandle) { + auto uncalib_time = ph_digi.time(); + auto uncalib_energy = ph_digi.energy(); float time = uncalib_time*nsPerCt; float energy = pars.p0 + pars.p1*uncalib_energy + pars.p2*uncalib_energy*uncalib_energy; diff --git a/STMReco/src/PlotSTMEnergySpectrum_module.cc b/STMReco/src/PlotSTMEnergySpectrum_module.cc index 1a0fa43424..64850d1e83 100644 --- a/STMReco/src/PlotSTMEnergySpectrum_module.cc +++ b/STMReco/src/PlotSTMEnergySpectrum_module.cc @@ -1,5 +1,5 @@ // -// Analyzer module to create a histogram of the STMMWDDigi uncalibrated energies +// Analyzer module to create a histogram of the STMPHDigi uncalibrated energies // #include "art/Framework/Principal/Event.h" #include "art/Framework/Core/EDAnalyzer.h" From d2269f02e5aa48e9233119b4629bd1deb1ce9e16 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 9 Apr 2026 13:29:25 -0500 Subject: [PATCH 21/29] 7th, MWD->PH --- STMReco/fcl/makeSTMHits.fcl | 6 +++--- STMReco/fcl/mwd.fcl | 12 ++++++------ STMReco/fcl/plotSTMWaveformDigis.fcl | 4 ++-- STMReco/test/plotDummyDigis.C | 26 +++++++++++++------------- STMReco/test/{plotMWD.C => plotPH.c} | 16 ++++++++-------- 5 files changed, 32 insertions(+), 32 deletions(-) rename STMReco/test/{plotMWD.C => plotPH.c} (78%) diff --git a/STMReco/fcl/makeSTMHits.fcl b/STMReco/fcl/makeSTMHits.fcl index e66e55ce3d..805964516e 100644 --- a/STMReco/fcl/makeSTMHits.fcl +++ b/STMReco/fcl/makeSTMHits.fcl @@ -1,5 +1,5 @@ # -# Create STMHits from STMMWDDigis +# Create STMHits from STMPHDigis # #include "Offline/fcl/standardServices.fcl" @@ -14,10 +14,10 @@ services : @local::Services.Reco physics: { producers : { stmHitsHPGe : { module_type : MakeSTMHits - stmMWDDigisTag : "mwdHPGe" + stmPHDigisTag : "phHPGe" } stmHitsLaBr : { module_type : MakeSTMHits - stmMWDDigisTag : "makeSTMDigis:mwd" + stmPHDigisTag : "makeSTMDigis:ph" } } filters : { diff --git a/STMReco/fcl/mwd.fcl b/STMReco/fcl/mwd.fcl index 31abe6858b..f270d3e430 100644 --- a/STMReco/fcl/mwd.fcl +++ b/STMReco/fcl/mwd.fcl @@ -5,7 +5,7 @@ #include "Offline/fcl/standardServices.fcl" #include "Offline/STMReco/fcl/prolog.fcl" -process_name: STMMWD +process_name: STMPH source : { module_type : RootInput @@ -17,7 +17,7 @@ services : { physics: { producers : { - mwdHPGe : { + phHPGe : { module_type : STMMovingWindowDeconvolution stmWaveformDigisTag : "makeSTMDigis:zs" verbosityLevel : 6 @@ -31,7 +31,7 @@ physics: { xAxis: "sample_number" } - mwdLaBr : { + phLaBr : { module_type : STMMovingWindowDeconvolution stmWaveformDigisTag : "makeSTMDigis:zs" verbosityLevel : 6 @@ -49,8 +49,8 @@ physics: { analyzers : { } # setup paths - HPGePath : [ mwdHPGe ] - # LaBrPath : [ mwdLaBr ] + HPGePath : [ phHPGe ] + # LaBrPath : [ phLaBr ] trigger_paths: [ HPGePath ] outPath : [ STMOutput ] end_paths: [outPath] @@ -62,6 +62,6 @@ outputs: { module_type: RootOutput outputCommands: [ "keep *_*_*_*" ] SelectEvents: [ ] - fileName : "dig.owner.MWDWaveformDigis.version.sequencer.art" + fileName : "dig.owner.PHWaveformDigis.version.sequencer.art" } } diff --git a/STMReco/fcl/plotSTMWaveformDigis.fcl b/STMReco/fcl/plotSTMWaveformDigis.fcl index 57b815f7ae..1ab4371ad1 100644 --- a/STMReco/fcl/plotSTMWaveformDigis.fcl +++ b/STMReco/fcl/plotSTMWaveformDigis.fcl @@ -36,9 +36,9 @@ physics: { xAxis : "sample_number" } - plotMWDWaveformDigis : { + plotPHWaveformDigis : { module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "makeSTMDigis:mwd" + stmWaveformDigisTag : "makeSTMDigis:ph" subtractPedestal : false verbosityLevel : 0 xAxis : "sample_number" diff --git a/STMReco/test/plotDummyDigis.C b/STMReco/test/plotDummyDigis.C index 8955339bd0..4e2accf708 100644 --- a/STMReco/test/plotDummyDigis.C +++ b/STMReco/test/plotDummyDigis.C @@ -26,13 +26,13 @@ void plotDummyDigis(std::string filename = "stmWaveformDigis.root") { hZSWaveform->Draw("HIST"); c1->cd(3); - TH1F* hMWDWaveform = (TH1F*) file->Get("plotMWDWaveformDigis/evt0_waveform0"); - title = hMWDWaveform->GetTitle(); - title += " MWD"; - hMWDWaveform->SetTitle(title); - hMWDWaveform->SetLineWidth(3); - hMWDWaveform->SetLineColor(kRed); - hMWDWaveform->Draw("HIST"); + TH1F* hPHWaveform = (TH1F*) file->Get("plotPHWaveformDigis/evt0_waveform0"); + title = hPHWaveform->GetTitle(); + title += " PH "; + hPHWaveform->SetTitle(title); + hPHWaveform->SetLineWidth(3); + hPHWaveform->SetLineColor(kRed); + hPHWaveform->Draw("HIST"); //New Canvas with all the histograms in the same axis //No need to redefine the histograms from before @@ -45,26 +45,26 @@ void plotDummyDigis(std::string filename = "stmWaveformDigis.root") { hZSWaveform->SetLineColor(kBlue); hZSWaveform->SetLineWidth(3); - hMWDWaveform->SetLineColor(kRed); - hMWDWaveform->SetLineWidth(3); + hPHWaveform->SetLineColor(kRed); + hPHWaveform->SetLineWidth(3); hRawWaveform->GetYaxis()->SetRangeUser(-1800,1800); hRawWaveform->Draw(); hZSWaveform->Draw("SAME"); - hMWDWaveform->Draw("SAME"); + hPHWaveform->Draw("SAME"); auto legend = new TLegend(); legend->AddEntry(hRawWaveform, "Raw","1"); legend->AddEntry(hZSWaveform,"ZS","1"); - legend->AddEntry(hMWDWaveform,"MWD","1"); + legend->AddEntry(hPHWaveform,"PH","1"); //legend->Draw(); //New Canvas where the histogram plots the number of bins from the other two TCanvas* c3 = new TCanvas(); - c3->SetTitle("Number of bins from MWDWaveform and hZSWaveform"); + c3->SetTitle("Number of bins from hPHWaveform and hZSWaveform"); TH1F* hDigiSize = new TH1F("hDigiSize","Number of bins in histograms",1000,0,1000); - hDigiSize->Fill(hMWDWaveform->GetNbinsX()); + hDigiSize->Fill(hPHWaveform->GetNbinsX()); hDigiSize->Fill(hZSWaveform->GetNbinsX()); hDigiSize->Draw(); diff --git a/STMReco/test/plotMWD.C b/STMReco/test/plotPH.c similarity index 78% rename from STMReco/test/plotMWD.C rename to STMReco/test/plotPH.c index 78c87b4473..849d44c477 100644 --- a/STMReco/test/plotMWD.C +++ b/STMReco/test/plotPH.c @@ -3,7 +3,7 @@ // This ROOT macro runs on the output of the STMMovingWindowDeconvolution module // with verbosity level set to 5 // -void plotMWD(std::string filename = "mwd.root") { +void plotPH(std::string filename = "ph.root") { TFile* file = new TFile(filename.c_str(), "READ"); @@ -13,42 +13,42 @@ void plotMWD(std::string filename = "mwd.root") { std::string evt_wvf = "evt1_wvf161"; - TH1F* hRawWaveform = (TH1F*) file->Get(("mwdLaBr/h_waveform_"+evt_wvf).c_str()); + TH1F* hRawWaveform = (TH1F*) file->Get(("phLaBr/h_waveform_"+evt_wvf).c_str()); hRawWaveform->SetStats(false); hRawWaveform->SetLineColor(kBlack); hRawWaveform->Draw("HIST"); leg->AddEntry(hRawWaveform, "raw waveform", "l"); - TH1F* hDeconvolved = (TH1F*) file->Get(("mwdLaBr/h_deconvolved_"+evt_wvf).c_str()); + TH1F* hDeconvolved = (TH1F*) file->Get(("phLaBr/h_deconvolved_"+evt_wvf).c_str()); hDeconvolved->SetLineColor(kOrange); hDeconvolved->Draw("HIST SAME"); leg->AddEntry(hDeconvolved, "deconvolution (tau parameter)", "l"); - TH1F* hDifferentiated = (TH1F*) file->Get(("mwdLaBr/h_differentiated_"+evt_wvf).c_str()); + TH1F* hDifferentiated = (TH1F*) file->Get(("phLaBr/h_differentiated_"+evt_wvf).c_str()); hDifferentiated->SetLineColor(kSpring); hDifferentiated->Draw("HIST SAME"); leg->AddEntry(hDifferentiated, "differentiation (M parameter)", "l"); - TH1F* hAveraged = (TH1F*) file->Get(("mwdLaBr/h_averaged_"+evt_wvf).c_str()); + TH1F* hAveraged = (TH1F*) file->Get(("phLaBr/h_averaged_"+evt_wvf).c_str()); hAveraged->SetLineColor(kRed); hAveraged->SetLineWidth(2); hAveraged->Draw("HIST SAME"); leg->AddEntry(hAveraged, "average (L parameter)", "l"); - TH1F* hBaselineMean = (TH1F*) file->Get(("mwdLaBr/h_baseline_mean_"+evt_wvf).c_str()); + TH1F* hBaselineMean = (TH1F*) file->Get(("phLaBr/h_baseline_mean_"+evt_wvf).c_str()); hBaselineMean->SetLineColor(kBlue); hBaselineMean->SetLineWidth(2); hBaselineMean->Draw("HIST SAME"); leg->AddEntry(hBaselineMean, "baseline mean", "l"); - TH1F* hPeaks = (TH1F*) file->Get(("mwdLaBr/h_peaks_"+evt_wvf).c_str()); + TH1F* hPeaks = (TH1F*) file->Get(("phLaBr/h_peaks_"+evt_wvf).c_str()); hPeaks->SetLineColor(kBlue); hPeaks->SetLineWidth(2); hPeaks->Draw("HIST SAME"); leg->AddEntry(hPeaks, "found peaks", "l"); - TH1F* hPeakThresh = (TH1F*) file->Get(("mwdLaBr/h_peak_threshold_"+evt_wvf).c_str()); + TH1F* hPeakThresh = (TH1F*) file->Get(("phLaBr/h_peak_threshold_"+evt_wvf).c_str()); hPeakThresh->SetLineColor(kRed); hPeakThresh->SetLineWidth(2); hPeakThresh->SetLineStyle(kDashed); From c7b43749d57a30ef724faefeb3cad497ecb3c261 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Mon, 13 Apr 2026 11:48:40 -0500 Subject: [PATCH 22/29] Unpacing with new checks and verbosity level --- DAQ/src/STMDigisFromFragments_module.cc | 184 ++++++++++++++---------- DAQ/test/inspectSTMFile.fcl | 1 + 2 files changed, 112 insertions(+), 73 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index d48c819af3..356961f54b 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -56,6 +56,7 @@ class art::STMDigisFromFragments : public EDProducer fhicl::Atom phFile {fhicl::Name("phFile"), "ph.bin"}; fhicl::Atom rawHeaderFile {fhicl::Name("rawHeaderFile"), "rawWithHeader.bin"}; fhicl::Atom eventFile {fhicl::Name("eventFile"), "event.bin"}; + fhicl::OptionalAtom verbosityLevel{fhicl::Name("verbosityLevel"), fhicl::Comment("Verbosity level")}; }; explicit STMDigisFromFragments(const art::EDProducer::Table& config); // constructor created, config via fcl @@ -88,6 +89,9 @@ class art::STMDigisFromFragments : public EDProducer size_t _totalEmptyRaw{0}; size_t _totalEmptyZS{0}; size_t _totalEmptyPH{0}; + + //fhicl varibales + int _verbosityLevel = 0; }; // STMDigisFromFragments // ====================================================================== @@ -96,6 +100,7 @@ class art::STMDigisFromFragments : public EDProducer STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table& config) : art::EDProducer{config} ,_stmFragmentsTag(config().stmTag()) + ,_verbosityLevel(config().verbosityLevel() ? *(config().verbosityLevel()) : 0) { // Set the size of the vector @@ -165,7 +170,9 @@ void STMDigisFromFragments::produce(Event& event) size_t emptyRaw_frags{0}; size_t emptyZS_frags{0}; size_t emptyPH_frags{0}; - + uint16_t ZSfromRaw{0}; //Keep track of ZS length from raw header + bool readRawZSinfo{0}; + //loop over frags for (const auto& frag : *STMFragments) { ++_totalFragments; //Increment Total Frag counter @@ -199,7 +206,7 @@ void STMDigisFromFragments::produce(Event& event) //Checks for empty frag if (payloadWords == 0) { - std::cout<< "\nFound an empty frag, i = " << i <<" @Raw\n"; + if(_verbosityLevel >=3){std::cout<< "\nFound an empty frag, i = " << i <<" @Raw\n";} ++_totalEmptyRaw;//Job counter ++emptyRaw_frags;//Event counter continue;//stops this loop check and goes to next frag @@ -213,24 +220,32 @@ void STMDigisFromFragments::produce(Event& event) } } - //Chekcs if zero filled + //Check if zero filled if (allZeros){ - std::cout << "\nFound a zero filled frag, i = " << i << " @Raw\n"; + if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = " << i << " @Raw\n";} ++_totalZeroRaw;//Increment counters ++zeroRaw_frags;//Increment Zero Raw Counter continue; } - //Print first 20 values - std::cout << "\nFirst 20 adcs: "; - for (size_t kk = 0; kk < std::min(payloadWords,20); ++kk){ - std::cout << payloadPtr[kk] << " ,"; - } - std::cout << "\nRaw header : Raw Length = " << stm_frag.rawLength() - <<" , ZS Length = " << stm_frag.zsLength() - << " , ZS Regions = " << stm_frag.zsRegions() - << " , i = " << i << " @Raw\n"; + //Print first 20 values + if (_verbosityLevel >=3){std::cout << "\nFound a good frag, i = " << i <<" @Raw\n";} + if (_verbosityLevel >= 4){ + std::cout << "\nFirst 20 adcs: "; + for (size_t kk = 0; kk < std::min(payloadWords,20); ++kk){ + std::cout << payloadPtr[kk] << " ,"; + } + if(_verbosityLevel >=5){ + std::cout << "\nRaw header : Raw Length = " << stm_frag.rawLength() + <<" , ZS Length = " << stm_frag.zsLength() + << " , ZS Regions = " << stm_frag.zsRegions() + << " , i = " << i << " @Raw\n"; + } + } + ZSfromRaw = stm_frag.zsLength();//Stores ZS length on outside variable + readRawZSinfo = 1;//Shows we were able to read the Raw header information + //Ideally only good frags get up to here //------full data (header + payload) { @@ -263,7 +278,7 @@ void STMDigisFromFragments::produce(Event& event) //Check if payload is empty if (payloadWords == 0) { - std::cout << "\nFound an empty frag, i = " << i<< " @ZS\n"; + if (_verbosityLevel >=3){std::cout << "\nFound an empty frag, i = " << i << " @ZS\n";} ++_totalEmptyZS; ++emptyZS_frags; //Increment empty ZS counter continue; @@ -277,18 +292,22 @@ void STMDigisFromFragments::produce(Event& event) } //Check if zero filled if (allZeros) { - std::cout << "\nFound a zero filled frag, i = "<< i<< " @ZS\n"; + if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = "<< i << " @ZS\n";} ++_totalZeroZS; ++zeroZS_frags; continue; } //Print first 20 payload adcs - std::cout << "\nFirst 20 adcs: "; - for (size_t kk = 0 ; kk < std::min(payloadWords,20) ; ++kk){ - std::cout << payloadPtr[kk] << " , "; - } - std::cout << "i = " << i << " @ZS\n"; + if (_verbosityLevel >=3){std::cout << "\nFound a good frag, i = " << i << " @ZS\n";} + if (_verbosityLevel >=4){ + std::cout << "\nFirst 20 adcs: "; + for (size_t kk = 0 ; kk < std::min(payloadWords,20) ; ++kk){ + std::cout << payloadPtr[kk] << " , "; + } + std::cout << "i = " << i << " @ZS\n"; + } + //Defintions for payload references auto dataPtr = stm_frag.dataBegin(); auto dataWords = stm_frag.dataWords(); @@ -311,24 +330,39 @@ void STMDigisFromFragments::produce(Event& event) std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_Size - 1 mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use zs_waveform_digis->emplace_back(stm_waveform); //emplace + + if (_verbosityLevel >=6){ + //A print check per segment + std::cout << "Region = " << seg << " , zs_index = " << current_zs_location << " , zs_size = " << current_zs_size + << " , trigTimeOffset = " << trigTimeOffset << "\n" ; + } - //A print check per segment - std::cout << "Region = " << seg << " , zs_index = " << current_zs_location << " , zs_size = " << current_zs_size - << " , trigTimeOffset = " << trigTimeOffset << "\n" ; - + //Update variables lastZSindex = current_zs_location; lastLen = current_zs_size; totalLen += lastLen; ++seg; - dataPtr = adc + current_zs_size; } - //Summary - std::cout << "ZS Regions = " << seg - << " , lastZSindex = " << lastZSindex - << " , lastZSLen = " << lastLen - << " , ZS total length = " << totalLen - << " , i = " << i << " @ZS\n"; + + if (_verbosityLevel >=5){ + //Summary + std::cout << "ZS Regions = " << seg + << " , lastZSindex = " << lastZSindex + << " , lastZSLen = " << lastLen + << " , ZS total length = " << totalLen + << " , i = " << i << " @ZS\n"; + } + + //Throw out if ZSLengthfromRaw != totalLen + if (readRawZSinfo && ZSfromRaw != totalLen){ + throw cet::exception("Mismatch") + << "\n=== ZS Length mismatch ===\n" + << "ZS length from Raw header " << ZSfromRaw << "\n" + << "ZS length calculated from file : " << totalLen << "\n" + << "Found at inner frag i : " << i <<"\n"; + ; + } }//End of isZS @@ -341,9 +375,9 @@ void STMDigisFromFragments::produce(Event& event) bool allZeros = true; if (payloadWords ==0){ + if (_verbosityLevel >= 3){std::cout << "\nFound an empty frag, i = " << i<< " @PH\n";} ++_totalEmptyPH; ++emptyPH_frags; - std::cout << "\nFound an empty frag, i = " << i<< " @PH\n"; continue; } @@ -356,13 +390,14 @@ void STMDigisFromFragments::produce(Event& event) } //count if zero filled if (allZeros){ + if (_verbosityLevel >=3){ std::cout<< "\nFound a zero filled frag, i = " << i<< " @PH\n";} ++_totalZeroPH; ++zeroPH_frags; - std::cout<< "\nFound a zero filled frag, i = " << i<< " @PH\n"; continue; } - std::cout << "\nFound a good frag, i = " << i <<" @PH\n"; + if (_verbosityLevel >= 3){std::cout << "\nFound a good frag, i = " << i <<" @PH\n";} + size_t digiWords = stm_frag.payloadWords(); auto const* digiPtr = stm_frag.payloadBegin(); @@ -413,28 +448,30 @@ void STMDigisFromFragments::produce(Event& event) } } //End of frags loop---George suggestions - //Event Summary -> tells us what happens per event - std::cout << "\n========== STM EVENT SUMMARY ==========\n"; - std::cout << "Extracted Raw waveforms : "<< raw_waveform_digis->size() <<"\n"; - std::cout << "Extracted ZS waveforms : "<< zs_waveform_digis->size() <<"\n"; - std::cout << "Extracted PH digis : " << ph_digis->size() <<"\n"; - - std::cout << "\n--- Frags Read ---\n"; - std::cout << "Raw frags : " << localRaw_frags << "\n"; - std::cout << "ZS frags : " << localZS_frags << "\n"; - std::cout << "PH frags : " << localPH_frags << "\n"; + if (_verbosityLevel >= 2 ){ + //Event Summary -> tells us what happens per event + std::cout << "\n========== STM EVENT SUMMARY ==========\n"; + std::cout << "Extracted Raw waveforms : "<< raw_waveform_digis->size() <<"\n"; + std::cout << "Extracted ZS waveforms : "<< zs_waveform_digis->size() <<"\n"; + std::cout << "Extracted PH digis : " << ph_digis->size() <<"\n"; + + std::cout << "\n--- Frags Read ---\n"; + std::cout << "Raw frags : " << localRaw_frags << "\n"; + std::cout << "ZS frags : " << localZS_frags << "\n"; + std::cout << "PH frags : " << localPH_frags << "\n"; - std::cout << "\n--- Filter results ---\n"; - std::cout << "Zero Raw frags : " << zeroRaw_frags << "\n"; - std::cout << "Zero ZS frags : " << zeroZS_frags << "\n"; - std::cout << "Zero PH frags : " << zeroPH_frags << "\n"; - - std::cout << "Empty Raw frags : " << emptyRaw_frags <<"\n"; - std::cout << "Empty ZS frags : " << emptyZS_frags << "\n"; - std::cout << "Empty PH frags : " << emptyPH_frags << "\n"; + std::cout << "\n--- Filter results ---\n"; + std::cout << "Zero Raw frags : " << zeroRaw_frags << "\n"; + std::cout << "Zero ZS frags : " << zeroZS_frags << "\n"; + std::cout << "Zero PH frags : " << zeroPH_frags << "\n"; + + std::cout << "Empty Raw frags : " << emptyRaw_frags <<"\n"; + std::cout << "Empty ZS frags : " << emptyZS_frags << "\n"; + std::cout << "Empty PH frags : " << emptyPH_frags << "\n"; + + std::cout << "=================================\n"; + } - std::cout << "=================================\n"; - //Final move event.put(std::move(raw_waveform_digis), "raw"); event.put(std::move(zs_waveform_digis), "zs"); @@ -447,31 +484,32 @@ void STMDigisFromFragments::produce(Event& event) void STMDigisFromFragments::endJob() { + if (_verbosityLevel >= 1){ + //Tells us what happened at the very end + std::cout << "\n========== STM JOB SUMMARY ==========\n"; - //Tells us what happened at the very end - std::cout << "\n========== STM JOB SUMMARY ==========\n"; + std::cout << "Total events : " << _totalEvents << "\n"; + std::cout << "Total fragments : " << _totalFragments << "\n"; + std::cout << "Container frags : " << _totalContainers << "\n"; + std::cout << "Inner fragments : " << _totalInner << "\n"; - std::cout << "Total events : " << _totalEvents << "\n"; - std::cout << "Total fragments : " << _totalFragments << "\n"; - std::cout << "Container frags : " << _totalContainers << "\n"; - std::cout << "Inner fragments : " << _totalInner << "\n"; + std::cout << "\n--- Data types read ---\n"; + std::cout << "RAW : " << _totalRaw << "\n"; + std::cout << "ZS : " << _totalZS << "\n"; + std::cout << "PH : " << _totalPH << "\n"; - std::cout << "\n--- Data types read ---\n"; - std::cout << "RAW : " << _totalRaw << "\n"; - std::cout << "ZS : " << _totalZS << "\n"; - std::cout << "PH : " << _totalPH << "\n"; + std::cout << "\n--- Data types filtered ---\n"; + std::cout << "Zero RAW frags : " << _totalZeroRaw << "\n"; + std::cout << "Zero ZS frags : " << _totalZeroZS << "\n"; + std::cout << "Zero PH frags : " << _totalZeroPH << "\n"; + std::cout << "Empty Raw frags : " << _totalEmptyRaw << "\n"; + std::cout << "Empty ZS frags : " << _totalEmptyZS << "\n"; + std::cout << "Empty PH frags : " << _totalEmptyPH << "\n"; - std::cout << "\n--- Data types filtered ---\n"; - std::cout << "Zero RAW frags : " << _totalZeroRaw << "\n"; - std::cout << "Zero ZS frags : " << _totalZeroZS << "\n"; - std::cout << "Zero PH frags : " << _totalZeroPH << "\n"; - std::cout << "Empty Raw frags : " << _totalEmptyRaw << "\n"; - std::cout << "Empty ZS frags : " << _totalEmptyZS << "\n"; - std::cout << "Empty PH frags : " << _totalEmptyPH << "\n"; + std::cout << "=================================\n"; - std::cout << "=================================\n"; + } } - DEFINE_ART_MODULE(STMDigisFromFragments) diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index d6d00c70d8..dace008d8e 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -19,6 +19,7 @@ physics : { makeSTMDigis : { module_type : STMDigisFromFragments stmTag : "daq:ContainerSTM" + verbosityLevel : 6 } } From a43f5b9a8bd7b04682e614ffc409460fcf5000aa Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Wed, 15 Apr 2026 12:24:20 -0500 Subject: [PATCH 23/29] Binary and Unpacking seperated --- DAQ/CMakeLists.txt | 8 + DAQ/src/STMBinaryDigisFromFragments_module.cc | 499 ++++++++++++++++++ DAQ/src/STMDigisFromFragments_module.cc | 109 +--- DAQ/test/inspectSTMFile.fcl | 26 +- STMMC/fcl/HPGeReco.fcl | 14 +- 5 files changed, 552 insertions(+), 104 deletions(-) create mode 100644 DAQ/src/STMBinaryDigisFromFragments_module.cc diff --git a/DAQ/CMakeLists.txt b/DAQ/CMakeLists.txt index f010e21b54..050dd78bf9 100644 --- a/DAQ/CMakeLists.txt +++ b/DAQ/CMakeLists.txt @@ -111,6 +111,14 @@ cet_build_plugin(STMDigisFromFragments art::module Offline::RecoDataProducts ) +cet_build_plugin(STMBinaryDigisFromFragments art::module + REG_SOURCE src/STMBinaryDigisFromFragments_module.cc + LIBRARIES REG + Offline::DAQ + Offline::ProditionsService + Offline::DataProducts + Offline::RecoDataProducts +) cet_build_plugin(STMPrintFragments art::module REG_SOURCE src/STMPrintFragments_module.cc diff --git a/DAQ/src/STMBinaryDigisFromFragments_module.cc b/DAQ/src/STMBinaryDigisFromFragments_module.cc new file mode 100644 index 0000000000..c4b7a79d36 --- /dev/null +++ b/DAQ/src/STMBinaryDigisFromFragments_module.cc @@ -0,0 +1,499 @@ +// ===================================================================== +// +// STMBinaryDigisFromFragments: Binary file writing +// +// ====================================================================== + +#include "art/Framework/Core/EDProducer.h" +#include "art/Framework/Principal/Event.h" +#include "art/Framework/Services/Registry/ServiceHandle.h" +#include "fhiclcpp/ParameterSet.h" + +#include "Offline/ProditionsService/inc/ProditionsHandle.hh" +#include "Offline/RecoDataProducts/inc/STMWaveformDigi.hh" +#include "Offline/RecoDataProducts/inc/STMPHDigi.hh" +#include "art/Framework/Principal/Handle.h" +#include "artdaq-core-mu2e/Overlays/STMFragment.hh" +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// ROOT includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace art +{ + class STMBinaryDigisFromFragments; +} + +using art::STMBinaryDigisFromFragments; + +class art::STMBinaryDigisFromFragments : public EDProducer +{ +public: + struct Config { + fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("Input module")}; + fhicl::Atom rawFile {fhicl::Name("rawFile"), "raw.bin"}; + fhicl::Atom zsFile {fhicl::Name("zsFile"), "zs.bin"}; + fhicl::Atom phFile {fhicl::Name("phFile"), "ph.bin"}; + fhicl::Atom rawHeaderFile {fhicl::Name("rawHeaderFile"), "rawWithHeader.bin"}; + fhicl::Atom eventFile {fhicl::Name("eventFile"), "event.bin"}; + fhicl::OptionalAtom verbosityLevel{fhicl::Name("verbosityLevel"), fhicl::Comment("Verbosity level")}; + }; + + explicit STMBinaryDigisFromFragments(const art::EDProducer::Table& config); // constructor created, config via fcl + virtual ~STMBinaryDigisFromFragments(); //declares destructor + + virtual void produce(Event &) override; + void endJob() override;//Final prinout summary + +private: + art::InputTag _stmFragmentsTag; + std::ofstream _rawOut; //Files which can be acessesed throughout + std::ofstream _zsOut; + std::ofstream _phOut; + std::ofstream _rawHeaderOut; + std::ofstream _eventOut; + + //Metrics + size_t _totalEvents{0}; //Another way to initialize to zero + size_t _totalFragments{0}; + size_t _totalContainers{0}; + size_t _totalInner{0}; + size_t _totalRaw{0}; + size_t _totalZS{0}; + size_t _totalPH{0}; + + //Additional metrics + size_t _totalZeroRaw{0}; + size_t _totalZeroZS{0}; + size_t _totalZeroPH{0}; + size_t _totalEmptyRaw{0}; + size_t _totalEmptyZS{0}; + size_t _totalEmptyPH{0}; + + //fhicl varibales + int _verbosityLevel = 0; +}; // STMDigisFromFragments + +// ====================================================================== + + +STMBinaryDigisFromFragments::STMBinaryDigisFromFragments(const art::EDProducer::Table& config) + : art::EDProducer{config} + ,_stmFragmentsTag(config().stmTag()) + ,_verbosityLevel(config().verbosityLevel() ? *(config().verbosityLevel()) : 0) + +{ + //turns files into binary + _rawOut.open(config().rawFile(), std::ios::binary); + _zsOut.open(config().zsFile(), std::ios::binary); + _phOut.open(config().phFile(), std::ios::binary); + _rawHeaderOut.open(config().rawHeaderFile(), std::ios::binary); + _eventOut.open(config().eventFile(), std::ios::binary); + + //Check to make sure we are reading the file + if(!_rawOut || !_zsOut || !_phOut || !_rawHeaderOut || !_eventOut){ + throw cet::exception("FILEOPEN")<< "Failed to open one or more output files\n"; + } + +} + +STMBinaryDigisFromFragments::~STMBinaryDigisFromFragments(){ + if ( _rawOut.is_open() ) + _rawOut.close(); + if ( _zsOut.is_open() ) + _zsOut.close(); + if ( _phOut.is_open() ) + _phOut.close(); + if( _rawHeaderOut.is_open() ) + _rawHeaderOut.close(); + if( _eventOut.is_open() ) + _eventOut.close(); +}//Closing files + +// ---------------------------------------------------------------------- + +void STMBinaryDigisFromFragments::produce(Event& event) +{ + + ++_totalEvents; //Increment Total Event Counter + + std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr ph_digis(new mu2e::STMPHDigiCollection); + std::unique_ptr raw_header_waveform_digis(new mu2e::STMWaveformDigiCollection); + //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original + + art::Handle STMFragmentsH; + event.getByLabel(_stmFragmentsTag, STMFragmentsH); + const auto STMFragments = STMFragmentsH.product(); + + auto writePayload = [](std::ofstream& out, // [] is a capture list that only works with these parameters + const int16_t* data, + size_t words){ + out.write(reinterpret_cast(data),//Writing to file stream in binary + words * sizeof(int16_t)); + }; + + //Event Metrics + size_t localRaw_frags{0}; + size_t localZS_frags{0}; + size_t localPH_frags{0}; + size_t zeroRaw_frags{0}; + size_t zeroZS_frags{0}; + size_t zeroPH_frags{0}; + size_t emptyRaw_frags{0}; + size_t emptyZS_frags{0}; + size_t emptyPH_frags{0}; + //uint16_t ZSfromRaw{0}; //Keep track of ZS length from raw header + //bool readRawZSinfo{false}; + + //loop over frags + for (const auto& frag : *STMFragments) { + ++_totalFragments; //Increment Total Frag counter + + if (_verbosityLevel >=3){ std::cout <<"\nFrag_ID : " << frag.fragmentID() << "\n";} + + //Check if this is a container fragment + if (frag.type() == artdaq::Fragment::ContainerFragmentType){ + + artdaq::ContainerFragment cont_frag(frag); + ++_totalContainers; + size_t blocks = cont_frag.block_count(); + _totalInner += blocks; + + //loop over container + // i index corresponds to inner frag + for (size_t i = 0; i < cont_frag.block_count(); ++i){ + + auto inner_frag = cont_frag.at(i); + mu2e::STMFragment stm_frag(*inner_frag); + mu2e::STMWaveformDigi stm_waveform; + + //auto ptr = stm_frag.payloadBegin();//Outer variable + //auto words = stm_frag.payloadWords(); + + if (stm_frag.isRaw()) { + ++_totalRaw; //Increment job counter + ++localRaw_frags;//Increment event counter + + auto payloadPtr = stm_frag.payloadBegin(); + auto payloadWords = stm_frag.payloadWords(); + bool allZeros = true;//Assume raw frag is zero filled + + //Checks for empty frag + if (payloadWords == 0) { + if(_verbosityLevel >=3){std::cout<< "\nFound an empty frag, i = " << i <<" @Raw\n";} + ++_totalEmptyRaw;//Job counter + ++emptyRaw_frags;//Event counter + continue;//stops this loop check and goes to next frag + } + + //Check if any data points are not zero + for (size_t k =0; k < payloadWords; ++k){ + if (payloadPtr[k] != 0){ + allZeros = false; + break; + } + } + + //Check if zero filled + if (allZeros){ + if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = " << i << " @Raw\n";} + ++_totalZeroRaw;//Increment counters + ++zeroRaw_frags;//Increment Zero Raw Counter + continue; + } + + //Print first 20 values + if (_verbosityLevel >=3){std::cout << "\nFound a good frag, i = " << i <<" @Raw\n";} + + if (_verbosityLevel >= 4){ + std::cout << "\nFirst 20 adcs: "; + for (size_t kk = 0; kk < std::min(payloadWords,20); ++kk){ + std::cout << payloadPtr[kk] << " ,"; + } + if(_verbosityLevel >=5){ + std::cout << "\nRaw header : Raw Length = " << stm_frag.rawLength() + <<" , ZS Length = " << stm_frag.zsLength() + << " , ZS Regions = " << stm_frag.zsRegions() + << " , i = " << i << " @Raw\n"; + } + } + //ZSfromRaw = stm_frag.zsLength();//Stores ZS length on outside variable + // readRawZSinfo = 1;//Shows we were able to read the Raw header information + + //Ideally only good frags get up to here + //------full data (header + payload) + { + //Waveform with data creation + auto dataPtr = stm_frag.dataBegin();//Inner variable + auto dataWords = stm_frag.dataWords(); + writePayload( _rawHeaderOut , dataPtr, dataWords); + } + + //----- payload-only + { + //auto payloadPtr = stm_frag.payloadBegin(); + //auto payloadWords = stm_frag.payloadWords(); + stm_waveform.set_data(payloadWords, payloadPtr); + raw_waveform_digis->emplace_back(stm_waveform); + writePayload(_rawOut, payloadPtr, payloadWords); + } + + }//End of isRaw + + else if (stm_frag.isZS()){ + ++_totalZS; //Incremenet ZS counter + ++localZS_frags; + + auto payloadPtr = stm_frag.payloadBegin(); + auto payloadWords = stm_frag.payloadWords(); + bool allZeros = true; //assumes all adcs are zero + + //Check if payload is empty + if (payloadWords == 0) { + if (_verbosityLevel >=3){std::cout << "\nFound an empty frag, i = " << i << " @ZS\n";} + ++_totalEmptyZS; + ++emptyZS_frags; //Increment empty ZS counter + continue; + } + //Check if any adc are non-zero + for (size_t k = 0 ; k < payloadWords ; ++k){ + if(payloadPtr[k] != 0 ){ + allZeros = false; + break; + } + } + //Check if zero filled + if (allZeros) { + if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = "<< i << " @ZS\n";} + ++_totalZeroZS; + ++zeroZS_frags; + continue; + } + //Print first 20 payload adcs + if (_verbosityLevel >=3){std::cout << "\nFound a good frag, i = " << i << " @ZS\n";} + + if (_verbosityLevel >=4){ + std::cout << "\nFirst 20 adcs: "; + for (size_t kk = 0 ; kk < std::min(payloadWords,20) ; ++kk){ + std::cout << payloadPtr[kk] << " , "; + } + std::cout << "i = " << i << " @ZS\n"; + } + + //Defintions for payload references + auto dataPtr = stm_frag.dataBegin(); + auto dataWords = stm_frag.dataWords(); + auto dataEnd = dataPtr + dataWords; + size_t seg = 0; + size_t totalLen = 0; + uint16_t lastZSindex = 0; //keeps track of last recorded index from header -> with respect to what? + uint16_t lastLen = 0; //keeps track of last recorded length from header + + writePayload(_zsOut, payloadPtr, payloadWords); + + while (dataPtr + 2 <= dataEnd){ + uint16_t current_zs_location = static_cast(dataPtr[0]); + uint16_t current_zs_size = static_cast(dataPtr[1]); + auto adc = dataPtr + 2; + if (adc + current_zs_size > dataEnd) + break; + + uint32_t trigTimeOffset = current_zs_location; + std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_Size - 1 + mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use + zs_waveform_digis->emplace_back(stm_waveform); //emplace + + if (_verbosityLevel >=6){ + //A print check per segment + std::cout << "Region = " << seg << " , zs_index = " << current_zs_location << " , zs_size = " << current_zs_size + << " , trigTimeOffset = " << trigTimeOffset << "\n" ; + } + + //Update variables + lastZSindex = current_zs_location; + lastLen = current_zs_size; + totalLen += lastLen; + ++seg; + dataPtr = adc + current_zs_size; + } + + if (_verbosityLevel >=5){ + //Summary + std::cout << "ZS Regions = " << seg + << " , lastZSindex = " << lastZSindex + << " , lastZSLen = " << lastLen + << " , ZS total length = " << totalLen + << " , i = " << i << " @ZS\n"; + } + + //Throw out if ZSLengthfromRaw != totalLen + //if (readRawZSinfo && ZSfromRaw != totalLen){ + //throw cet::exception("Mismatch") + // << "\n=== ZS Length mismatch ===\n" + // << "ZS length from Raw header " << ZSfromRaw << "\n" + // << "ZS length calculated from file : " << totalLen << "\n" + // << "Found at inner frag i : " << i <<"\n"; + // } + + }//End of isZS + + else if (stm_frag.isPH()){ + ++_totalPH; + ++localPH_frags; + //Check if zero filled + auto payloadPtr = stm_frag.payloadBegin(); + auto payloadWords = stm_frag.payloadWords(); + bool allZeros = true; + + if (payloadWords ==0){ + if (_verbosityLevel >= 3){std::cout << "\nFound an empty frag, i = " << i<< " @PH\n";} + ++_totalEmptyPH; + ++emptyPH_frags; + continue; + } + + //Check if zero filled + for (size_t k = 0; k< payloadWords; ++k) { + if (payloadPtr[k] !=0){ + allZeros = false; + break; + } + } + //count if zero filled + if (allZeros){ + if (_verbosityLevel >=3){ std::cout<< "\nFound a zero filled frag, i = " << i<< " @PH\n";} + ++_totalZeroPH; + ++zeroPH_frags; + continue; + } + + if (_verbosityLevel >= 3){std::cout << "\nFound a good frag, i = " << i <<" @PH\n";} + + size_t digiWords = stm_frag.payloadWords(); + auto const* digiPtr = stm_frag.payloadBegin(); + + writePayload(_phOut,digiPtr, digiWords); + + for (size_t i_PH = 0; i_PH < digiWords ; ++i_PH){ + int16_t PH = digiPtr[i_PH]; + mu2e::STMPHDigi PH_digi(0, PH); + ph_digis->emplace_back(PH_digi); + } + + }//End of isPH and is checks + + //---Combined stream write w. order preserved ---- + { + const int16_t* cptr = nullptr; + size_t cwords = 0; + + if (stm_frag.isRaw()){ + cptr = stm_frag.dataBegin(); + cwords = stm_frag.dataWords(); + } + else if (stm_frag.isZS()){ + cptr = stm_frag.payloadBegin(); + cwords = stm_frag.payloadWords(); + } + else if (stm_frag.isPH()){ + cptr = stm_frag.payloadBegin(); + cwords = stm_frag.payloadWords(); + } + + if (cptr != nullptr && cwords >0) { + _eventOut.write(reinterpret_cast(cptr), + cwords * sizeof(int16_t) ); + } + } + + }//End Container loop + } else { + //fallback (non-container case) + mu2e::STMFragment stm_frag(frag); + auto ptr = stm_frag.payloadBegin(); + auto words = stm_frag.payloadWords(); + + if (stm_frag.isRaw()) { + writePayload(_rawOut, ptr, words); + } + } + } //End of frags loop---George suggestions + if (_verbosityLevel >= 2 ){ + //Event Summary -> tells us what happens per event + std::cout << "\n========== STM EVENT SUMMARY - (Binary Module) ==========\n"; + std::cout << "Extracted Raw waveforms : "<< raw_waveform_digis->size() <<"\n"; + std::cout << "Extracted ZS waveforms : "<< zs_waveform_digis->size() <<"\n"; + std::cout << "Extracted PH digis : " << ph_digis->size() <<"\n"; + + std::cout << "\n--- Frags Read ---\n"; + std::cout << "Raw frags : " << localRaw_frags << "\n"; + std::cout << "ZS frags : " << localZS_frags << "\n"; + std::cout << "PH frags : " << localPH_frags << "\n"; + + std::cout << "\n--- Filter results ---\n"; + std::cout << "Zero Raw frags : " << zeroRaw_frags << "\n"; + std::cout << "Zero ZS frags : " << zeroZS_frags << "\n"; + std::cout << "Zero PH frags : " << zeroPH_frags << "\n"; + + std::cout << "Empty Raw frags : " << emptyRaw_frags <<"\n"; + std::cout << "Empty ZS frags : " << emptyZS_frags << "\n"; + std::cout << "Empty PH frags : " << emptyPH_frags << "\n"; + + std::cout << "=================================\n"; + } + +} // produce() + +// ====================================================================== + +void STMBinaryDigisFromFragments::endJob() { + if (_verbosityLevel >= 1){ + //Tells us what happened at the very end + std::cout << "\n========== STM JOB SUMMARY - (Binary Module) ==========\n"; + + std::cout << "Total events : " << _totalEvents << "\n"; + std::cout << "Total fragments : " << _totalFragments << "\n"; + std::cout << "Container frags : " << _totalContainers << "\n"; + std::cout << "Inner fragments : " << _totalInner << "\n"; + + std::cout << "\n--- Data types read ---\n"; + std::cout << "RAW : " << _totalRaw << "\n"; + std::cout << "ZS : " << _totalZS << "\n"; + std::cout << "PH : " << _totalPH << "\n"; + + std::cout << "\n--- Data types filtered ---\n"; + std::cout << "Zero RAW frags : " << _totalZeroRaw << "\n"; + std::cout << "Zero ZS frags : " << _totalZeroZS << "\n"; + std::cout << "Zero PH frags : " << _totalZeroPH << "\n"; + std::cout << "Empty Raw frags : " << _totalEmptyRaw << "\n"; + std::cout << "Empty ZS frags : " << _totalEmptyZS << "\n"; + std::cout << "Empty PH frags : " << _totalEmptyPH << "\n"; + + std::cout << "=================================\n"; + + } +} + +DEFINE_ART_MODULE(STMBinaryDigisFromFragments) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 356961f54b..7b3177a07d 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -37,7 +37,7 @@ #include #include #include -#include //temporary +#include namespace art { @@ -51,30 +51,19 @@ class art::STMDigisFromFragments : public EDProducer public: struct Config { fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("Input module")}; - fhicl::Atom rawFile {fhicl::Name("rawFile"), "raw.bin"}; - fhicl::Atom zsFile {fhicl::Name("zsFile"), "zs.bin"}; - fhicl::Atom phFile {fhicl::Name("phFile"), "ph.bin"}; - fhicl::Atom rawHeaderFile {fhicl::Name("rawHeaderFile"), "rawWithHeader.bin"}; - fhicl::Atom eventFile {fhicl::Name("eventFile"), "event.bin"}; + fhicl::Atom saveRawWithHeaderFile {fhicl::Name("saveRawWithHeaderFile"), false}; fhicl::OptionalAtom verbosityLevel{fhicl::Name("verbosityLevel"), fhicl::Comment("Verbosity level")}; }; explicit STMDigisFromFragments(const art::EDProducer::Table& config); // constructor created, config via fcl - virtual ~STMDigisFromFragments(); //declares destructor - virtual void produce(Event &) override; void endJob() override;//Final prinout summary private: art::InputTag _stmFragmentsTag; - std::ofstream _rawOut; //Files which can be acessesed throughout - std::ofstream _zsOut; - std::ofstream _phOut; - std::ofstream _rawHeaderOut; - std::ofstream _eventOut; - + //Metrics - size_t _totalEvents{0}; //Another way to initialize to zero + size_t _totalEvents{0}; size_t _totalFragments{0}; size_t _totalContainers{0}; size_t _totalInner{0}; @@ -92,6 +81,7 @@ class art::STMDigisFromFragments : public EDProducer //fhicl varibales int _verbosityLevel = 0; + bool _saveRawWithHeaderFile{false}; }; // STMDigisFromFragments // ====================================================================== @@ -100,42 +90,18 @@ class art::STMDigisFromFragments : public EDProducer STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table& config) : art::EDProducer{config} ,_stmFragmentsTag(config().stmTag()) + ,_saveRawWithHeaderFile(config().saveRawWithHeaderFile()) ,_verbosityLevel(config().verbosityLevel() ? *(config().verbosityLevel()) : 0) { // Set the size of the vector produces("raw");//Waveforms produces("zs"); - produces("rawWithHeader"); produces("ph"); // digi series - - //turns file into binary - _rawOut.open(config().rawFile(), std::ios::binary); - _zsOut.open(config().zsFile(), std::ios::binary); - _phOut.open(config().phFile(), std::ios::binary); - _rawHeaderOut.open(config().rawHeaderFile(), std::ios::binary); - _eventOut.open(config().eventFile(), std::ios::binary); - - //Check to make sure we are reading the file - if(!_rawOut || !_zsOut || !_phOut || !_rawHeaderOut || !_eventOut){ - throw cet::exception("FILEOPEN")<< "Failed to open one or more output files\n"; - } + if(_saveRawWithHeaderFile){ produces("rawWithHeader");} } -STMDigisFromFragments::~STMDigisFromFragments(){ - if ( _rawOut.is_open() ) - _rawOut.close(); - if ( _zsOut.is_open() ) - _zsOut.close(); - if ( _phOut.is_open() ) - _phOut.close(); - if( _rawHeaderOut.is_open() ) - _rawHeaderOut.close(); - if( _eventOut.is_open() ) - _eventOut.close(); -}//Closing files - // ---------------------------------------------------------------------- void STMDigisFromFragments::produce(Event& event) @@ -153,13 +119,6 @@ void STMDigisFromFragments::produce(Event& event) event.getByLabel(_stmFragmentsTag, STMFragmentsH); const auto STMFragments = STMFragmentsH.product(); - auto writePayload = [](std::ofstream& out, // [] is a capture list that only works with these parameters - const int16_t* data, - size_t words){ - out.write(reinterpret_cast(data),//Writing to file stream in binary - words * sizeof(int16_t)); - }; - //Event Metrics size_t localRaw_frags{0}; size_t localZS_frags{0}; @@ -171,12 +130,14 @@ void STMDigisFromFragments::produce(Event& event) size_t emptyZS_frags{0}; size_t emptyPH_frags{0}; uint16_t ZSfromRaw{0}; //Keep track of ZS length from raw header - bool readRawZSinfo{0}; + bool readRawZSinfo{false}; //loop over frags for (const auto& frag : *STMFragments) { ++_totalFragments; //Increment Total Frag counter + if (_verbosityLevel >= 3){std::cout << "\nFrag_id : " << frag.fragmentID() << "\n";} + //Check if this is a container fragment if (frag.type() == artdaq::Fragment::ContainerFragmentType){ @@ -184,7 +145,6 @@ void STMDigisFromFragments::produce(Event& event) ++_totalContainers; size_t blocks = cont_frag.block_count(); _totalInner += blocks; - //loop over container // i index corresponds to inner frag for (size_t i = 0; i < cont_frag.block_count(); ++i){ @@ -248,13 +208,12 @@ void STMDigisFromFragments::produce(Event& event) //Ideally only good frags get up to here //------full data (header + payload) - { + if (_saveRawWithHeaderFile){ //Waveform with data creation auto dataPtr = stm_frag.dataBegin();//Inner variable auto dataWords = stm_frag.dataWords(); stm_waveform.set_data(dataWords, dataPtr); raw_header_waveform_digis->emplace_back(stm_waveform); - writePayload( _rawHeaderOut , dataPtr, dataWords); } //----- payload-only @@ -263,7 +222,6 @@ void STMDigisFromFragments::produce(Event& event) //auto payloadWords = stm_frag.payloadWords(); stm_waveform.set_data(payloadWords, payloadPtr); raw_waveform_digis->emplace_back(stm_waveform); - writePayload(_rawOut, payloadPtr, payloadWords); } }//End of isRaw @@ -317,8 +275,6 @@ void STMDigisFromFragments::produce(Event& event) uint16_t lastZSindex = 0; //keeps track of last recorded index from header -> with respect to what? uint16_t lastLen = 0; //keeps track of last recoded length from header - writePayload(_zsOut, payloadPtr, payloadWords); - while (dataPtr + 2 <= dataEnd){ uint16_t current_zs_location = static_cast(dataPtr[0]); uint16_t current_zs_size = static_cast(dataPtr[1]); @@ -356,7 +312,7 @@ void STMDigisFromFragments::produce(Event& event) //Throw out if ZSLengthfromRaw != totalLen if (readRawZSinfo && ZSfromRaw != totalLen){ - throw cet::exception("Mismatch") + throw cet::exception("STM_UNPACKING") << "\n=== ZS Length mismatch ===\n" << "ZS length from Raw header " << ZSfromRaw << "\n" << "ZS length calculated from file : " << totalLen << "\n" @@ -401,56 +357,27 @@ void STMDigisFromFragments::produce(Event& event) size_t digiWords = stm_frag.payloadWords(); auto const* digiPtr = stm_frag.payloadBegin(); - writePayload(_phOut,digiPtr, digiWords); - for (size_t i_PH = 0; i_PH < digiWords ; ++i_PH){ int16_t PH = digiPtr[i_PH]; mu2e::STMPHDigi PH_digi(0, PH); ph_digis->emplace_back(PH_digi); } - }//End of isPH and is checks - - //---Combined stream write w. order preserved ---- - { - const int16_t* cptr = nullptr; - size_t cwords = 0; - - if (stm_frag.isRaw()){ - cptr = stm_frag.dataBegin(); - cwords = stm_frag.dataWords(); - } - else if (stm_frag.isZS()){ - cptr = stm_frag.payloadBegin(); - cwords = stm_frag.payloadWords(); - } - else if (stm_frag.isPH()){ - cptr = stm_frag.payloadBegin(); - cwords = stm_frag.payloadWords(); - } - - if (cptr != nullptr && cwords >0) { - _eventOut.write(reinterpret_cast(cptr), - cwords * sizeof(int16_t) ); - } - } - - }//End Container loop + }//End of isPH and is checks + } } else { //fallback (non-container case) mu2e::STMFragment stm_frag(frag); auto ptr = stm_frag.payloadBegin(); auto words = stm_frag.payloadWords(); - if (stm_frag.isRaw()) { - writePayload(_rawOut, ptr, words); - } + //if (stm_frag.isRaw()){} // writePayload(_rawOut, ptr, words); } } //End of frags loop---George suggestions if (_verbosityLevel >= 2 ){ //Event Summary -> tells us what happens per event - std::cout << "\n========== STM EVENT SUMMARY ==========\n"; + std::cout << "\n========== STM EVENT SUMMARY - (Unpacking Module) ==========\n"; std::cout << "Extracted Raw waveforms : "<< raw_waveform_digis->size() <<"\n"; std::cout << "Extracted ZS waveforms : "<< zs_waveform_digis->size() <<"\n"; std::cout << "Extracted PH digis : " << ph_digis->size() <<"\n"; @@ -476,7 +403,7 @@ void STMDigisFromFragments::produce(Event& event) event.put(std::move(raw_waveform_digis), "raw"); event.put(std::move(zs_waveform_digis), "zs"); event.put(std::move(ph_digis), "ph"); - event.put(std::move(raw_header_waveform_digis), "rawWithHeader"); + if (_saveRawWithHeaderFile){ event.put(std::move(raw_header_waveform_digis), "rawWithHeader"); } } // produce() @@ -486,7 +413,7 @@ void STMDigisFromFragments::produce(Event& event) void STMDigisFromFragments::endJob() { if (_verbosityLevel >= 1){ //Tells us what happened at the very end - std::cout << "\n========== STM JOB SUMMARY ==========\n"; + std::cout << "\n========== STM JOB SUMMARY - (Unpacking Module) ==========\n"; std::cout << "Total events : " << _totalEvents << "\n"; std::cout << "Total fragments : " << _totalFragments << "\n"; diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index dace008d8e..cf36e7420b 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -19,26 +19,40 @@ physics : { makeSTMDigis : { module_type : STMDigisFromFragments stmTag : "daq:ContainerSTM" - verbosityLevel : 6 - } + verbosityLevel : 1 + saveRawWithHeaderFile: false + } + + makeSTMBinary : { + module_type : STMBinaryDigisFromFragments + stmTag : "daq:ContainerSTM" + verbosityLevel : 1 + rawFile : "raw.bin" + zsFile : "zs.bin" + phFile : "ph.bin" + rawHeaderFile : "rawWithHeader.bin" + eventFile : "event.bin" + } } + analyzers : { # frag: - # { + +# { # module_type : FragmentWatcher # mode_bitmask : 7 # } - stmPrint : - { + + stmPrint : { module_type : STMPrintFragments stmTag : "daq:ContainerSTM" } } - t1 : [ makeSTMDigis ] + t1 : [ makeSTMDigis, makeSTMBinary ] e1 : [ stmOutput ] #e1 : [ ] #e1 : [ frag, stmOutput ] diff --git a/STMMC/fcl/HPGeReco.fcl b/STMMC/fcl/HPGeReco.fcl index 7a4563be45..4627443482 100644 --- a/STMMC/fcl/HPGeReco.fcl +++ b/STMMC/fcl/HPGeReco.fcl @@ -52,13 +52,13 @@ physics : { PHHPGe : { module_type : STMMovingWindowDeconvolution stmWaveformDigisTag : @local::STMMCAnalysis.PH.HPGe.stmWaveformDigisTag.concatenated - tau : @local::STMMCAnalysis.PH.HPGe.tau - M : @local::STMMCAnalysis.PH.HPGe.M - L : @local::STMMCAnalysis.PH.HPGe.L - nsigma_cut : @local::STMMCAnalysis.PH.HPGe.nsigma_cut - thresholdgrad : @local::STMMCAnalysis.PH.HPGe.thresholdgrad - defaultBaselineMean : @local::STMMCAnalysis.PH.HPGe.defaultBaselineMean.suppressed - defaultBaselineSD : @local::STMMCAnalysis.PH.HPGe.defaultBaselineSD.suppressed + tau : @local::STMMCAnalysis.MWD.HPGe.tau + M : @local::STMMCAnalysis.MWD.HPGe.M + L : @local::STMMCAnalysis.MWD.HPGe.L + nsigma_cut : @local::STMMCAnalysis.MWD.HPGe.nsigma_cut + thresholdgrad : @local::STMMCAnalysis.MWD.HPGe.thresholdgrad + defaultBaselineMean : @local::STMMCAnalysis.MWD.HPGe.defaultBaselineMean.suppressed + defaultBaselineSD : @local::STMMCAnalysis.MWD.HPGe.defaultBaselineSD.suppressed makeTTreePH: false makeTTreeEnergies: false TTreeEnergyCalib : @local::HPGeDigitization.EnergyPerADCBin From 39faa246a0ae182504e8849b4424c185bb6191ab Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Thu, 16 Apr 2026 14:07:13 -0500 Subject: [PATCH 24/29] CMake in prof/Offline with STMBinaryDigis --- DAQ/.#CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) create mode 120000 DAQ/.#CMakeLists.txt diff --git a/DAQ/.#CMakeLists.txt b/DAQ/.#CMakeLists.txt new file mode 120000 index 0000000000..d2c4fcb717 --- /dev/null +++ b/DAQ/.#CMakeLists.txt @@ -0,0 +1 @@ +bgonzale@mu2ebuild02.fnal.gov.882477:1776259548 \ No newline at end of file From 59f0ff8e18ddfd9e2b74ff278a35a7fbf4c79de4 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Wed, 22 Apr 2026 12:33:26 -0500 Subject: [PATCH 25/29] Unpacking with HPGe and LaBr - bryan --- DAQ/.#CMakeLists.txt | 1 - DAQ/src/STMDigisFromFragments_module.cc | 332 +++++++++++++++++------- DAQ/test/inspectSTMFile.fcl | 4 +- 3 files changed, 244 insertions(+), 93 deletions(-) delete mode 120000 DAQ/.#CMakeLists.txt diff --git a/DAQ/.#CMakeLists.txt b/DAQ/.#CMakeLists.txt deleted file mode 120000 index d2c4fcb717..0000000000 --- a/DAQ/.#CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -bgonzale@mu2ebuild02.fnal.gov.882477:1776259548 \ No newline at end of file diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 7b3177a07d..56ef27cd34 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -62,7 +62,7 @@ class art::STMDigisFromFragments : public EDProducer private: art::InputTag _stmFragmentsTag; - //Metrics + //Metrics-> Will change this soon size_t _totalEvents{0}; size_t _totalFragments{0}; size_t _totalContainers{0}; @@ -70,8 +70,6 @@ class art::STMDigisFromFragments : public EDProducer size_t _totalRaw{0}; size_t _totalZS{0}; size_t _totalPH{0}; - - //Additional metrics size_t _totalZeroRaw{0}; size_t _totalZeroZS{0}; size_t _totalZeroPH{0}; @@ -79,6 +77,31 @@ class art::STMDigisFromFragments : public EDProducer size_t _totalEmptyZS{0}; size_t _totalEmptyPH{0}; + size_t _unreadInnerFrags{0}; + + //Additional metrics + //HPGe + size_t _totalRawHPGe{0}; + size_t _totalZSHPGe{0}; + size_t _totalPHHPGe{0}; + size_t _totalZeroRawHPGe{0}; + size_t _totalZeroZSHPGe{0}; + size_t _totalZeroPHHPGe{0}; + size_t _totalEmptyRawHPGe{0}; + size_t _totalEmptyZSHPGe{0}; + size_t _totalEmptyPHHPGe{0}; + + //LaBr + size_t _totalRawLaBr{0}; + size_t _totalZSLaBr{0}; + size_t _totalPHLaBr{0}; + size_t _totalZeroRawLaBr{0}; + size_t _totalZeroZSLaBr{0}; + size_t _totalZeroPHLaBr{0}; + size_t _totalEmptyRawLaBr{0}; + size_t _totalEmptyZSLaBr{0}; + size_t _totalEmptyPHLaBr{0}; + //fhicl varibales int _verbosityLevel = 0; bool _saveRawWithHeaderFile{false}; @@ -94,12 +117,18 @@ STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table("raw");//Waveforms - produces("zs"); - produces("ph"); // digi series - if(_saveRawWithHeaderFile){ produces("rawWithHeader");} - + // Set the size of vectors for HPGe + produces("rawHPGe");//Waveforms + produces("zsHPGe"); + produces("phHPGe"); // digi series + if(_saveRawWithHeaderFile){ produces("rawWithHeaderHPGe");} + + //Set the size of vectors for LaBr + produces("rawLaBr"); + produces("zsLaBr"); + produces("phLaBr"); // digi series + if(_saveRawWithHeaderFile){ produces("rawWithHeaderLaBr");} + } // ---------------------------------------------------------------------- @@ -108,35 +137,67 @@ void STMDigisFromFragments::produce(Event& event) { ++_totalEvents; //Increment Total Event Counter - - std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); - std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); - std::unique_ptr ph_digis(new mu2e::STMPHDigiCollection); - std::unique_ptr raw_header_waveform_digis(new mu2e::STMWaveformDigiCollection); + + //HPGe + std::unique_ptr raw_HPGe_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr zs_HPGe_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr ph_HPGe_digis(new mu2e::STMPHDigiCollection); + std::unique_ptr raw_HPGe_header_waveform_digis(new mu2e::STMWaveformDigiCollection); //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original + //LaBr + std::unique_ptr raw_LaBr_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr zs_LaBr_waveform_digis(new mu2e::STMWaveformDigiCollection); + std::unique_ptr ph_LaBr_digis(new mu2e::STMPHDigiCollection); + std::unique_ptr raw_LaBr_header_waveform_digis(new mu2e::STMWaveformDigiCollection); + //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original + art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); const auto STMFragments = STMFragmentsH.product(); //Event Metrics - size_t localRaw_frags{0}; - size_t localZS_frags{0}; - size_t localPH_frags{0}; - size_t zeroRaw_frags{0}; - size_t zeroZS_frags{0}; - size_t zeroPH_frags{0}; - size_t emptyRaw_frags{0}; - size_t emptyZS_frags{0}; - size_t emptyPH_frags{0}; - uint16_t ZSfromRaw{0}; //Keep track of ZS length from raw header - bool readRawZSinfo{false}; + + //HPGe + size_t localRawHPGe_frags{0}; + size_t localZSHPGe_frags{0}; + size_t localPHHPGe_frags{0}; + size_t zeroRawHPGe_frags{0}; + size_t zeroZSHPGe_frags{0}; + size_t zeroPHHPGe_frags{0}; + size_t emptyRawHPGe_frags{0}; + size_t emptyZSHPGe_frags{0}; + size_t emptyPHHPGe_frags{0}; + + //LaBr + size_t localRawLaBr_frags{0}; + size_t localZSLaBr_frags{0}; + size_t localPHLaBr_frags{0}; + size_t zeroRawLaBr_frags{0}; + size_t zeroZSLaBr_frags{0}; + size_t zeroPHLaBr_frags{0}; + size_t emptyRawLaBr_frags{0}; + size_t emptyZSLaBr_frags{0}; + size_t emptyPHLaBr_frags{0}; + + //Additional + size_t unread_InnerFrags{0}; + uint16_t ContainerFragID{0}; //loop over frags for (const auto& frag : *STMFragments) { ++_totalFragments; //Increment Total Frag counter - - if (_verbosityLevel >= 3){std::cout << "\nFrag_id : " << frag.fragmentID() << "\n";} + bool isLaBr{false}; + bool isHPGe{false}; + + uint16_t ZSfromRaw{0}; + uint16_t expectedZSRegions{0}; + bool readRawZSinfo{false}; + + ContainerFragID = frag.fragmentID(); + if (_verbosityLevel >= 3){std::cout << "\nFrag_id : " << ContainerFragID << "\n";} + + if(ContainerFragID == 103) {isHPGe = true;} else if (ContainerFragID == 203){isLaBr = true ;} //Check if this is a container fragment if (frag.type() == artdaq::Fragment::ContainerFragmentType){ @@ -157,9 +218,12 @@ void STMDigisFromFragments::produce(Event& event) //auto words = stm_frag.payloadWords(); if (stm_frag.isRaw()) { - ++_totalRaw; //Increment job counter - ++localRaw_frags;//Increment event counter - + + //Job Counter + ++_totalRaw; + //Conitional Job and Event Counter + if(isHPGe){ ++_totalRawHPGe ; ++localRawHPGe_frags;} else if (isLaBr){++_totalRawLaBr ; ++localRawLaBr_frags;} + auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); bool allZeros = true;//Assume raw frag is zero filled @@ -168,8 +232,9 @@ void STMDigisFromFragments::produce(Event& event) if (payloadWords == 0) { if(_verbosityLevel >=3){std::cout<< "\nFound an empty frag, i = " << i <<" @Raw\n";} ++_totalEmptyRaw;//Job counter - ++emptyRaw_frags;//Event counter - continue;//stops this loop check and goes to next frag + //Eventcounter + if(isHPGe){ ++_totalEmptyRawHPGe; ++emptyRawHPGe_frags;}else if (isLaBr){ ++_totalEmptyRawLaBr; ++emptyRawLaBr_frags;} + continue;//stops this loop check and goes to next frag } //Check if any data points are not zero @@ -184,7 +249,8 @@ void STMDigisFromFragments::produce(Event& event) if (allZeros){ if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = " << i << " @Raw\n";} ++_totalZeroRaw;//Increment counters - ++zeroRaw_frags;//Increment Zero Raw Counter + //Eventcounter + if(isHPGe){++_totalZeroRawHPGe; ++zeroRawHPGe_frags;} else if (isLaBr){ ++_totalZeroRawLaBr; ++zeroRawLaBr_frags;} continue; } @@ -203,33 +269,45 @@ void STMDigisFromFragments::produce(Event& event) << " , i = " << i << " @Raw\n"; } } + expectedZSRegions = stm_frag.zsRegions(); ZSfromRaw = stm_frag.zsLength();//Stores ZS length on outside variable - readRawZSinfo = 1;//Shows we were able to read the Raw header information + readRawZSinfo = true;//Shows we were able to read the Raw header information //Ideally only good frags get up to here - //------full data (header + payload) - if (_saveRawWithHeaderFile){ - //Waveform with data creation - auto dataPtr = stm_frag.dataBegin();//Inner variable - auto dataWords = stm_frag.dataWords(); - stm_waveform.set_data(dataWords, dataPtr); - raw_header_waveform_digis->emplace_back(stm_waveform); - } + if (isHPGe){ + if (_saveRawWithHeaderFile){ + auto dataPtr = stm_frag.dataBegin(); + auto dataWords = stm_frag.dataWords(); + stm_waveform.set_data(dataWords, dataPtr); + raw_HPGe_header_waveform_digis->emplace_back(stm_waveform); + } - //----- payload-only - { - //auto payloadPtr = stm_frag.payloadBegin(); - //auto payloadWords = stm_frag.payloadWords(); - stm_waveform.set_data(payloadWords, payloadPtr); - raw_waveform_digis->emplace_back(stm_waveform); - } + { + stm_waveform.set_data(payloadWords, payloadPtr); + raw_HPGe_waveform_digis->emplace_back(stm_waveform); + } + + } else if (isLaBr){ + if (_saveRawWithHeaderFile){ + auto dataPtr = stm_frag.dataBegin(); + auto dataWords = stm_frag.dataWords(); + stm_waveform.set_data(dataWords, dataPtr); + raw_LaBr_header_waveform_digis->emplace_back(stm_waveform); + } + { + stm_waveform.set_data(payloadWords, payloadPtr); + raw_LaBr_waveform_digis->emplace_back(stm_waveform); + } + + }//End of if CFID=103,203 + }//End of isRaw else if (stm_frag.isZS()){ ++_totalZS; //Incremenet ZS counter - ++localZS_frags; - + if (isHPGe){ ++_totalZSHPGe; ++localZSHPGe_frags; } else if (isLaBr){ ++_totalZSLaBr; ++localZSLaBr_frags;} + auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); bool allZeros = true; //assumes all adcs are zero @@ -238,7 +316,7 @@ void STMDigisFromFragments::produce(Event& event) if (payloadWords == 0) { if (_verbosityLevel >=3){std::cout << "\nFound an empty frag, i = " << i << " @ZS\n";} ++_totalEmptyZS; - ++emptyZS_frags; //Increment empty ZS counter + if (isHPGe){ ++_totalEmptyZSHPGe; ++emptyZSHPGe_frags; } else if (isLaBr){ ++_totalEmptyZSLaBr; ++emptyZSLaBr_frags;} continue; } //Check if any adc are non-zero @@ -252,7 +330,7 @@ void STMDigisFromFragments::produce(Event& event) if (allZeros) { if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = "<< i << " @ZS\n";} ++_totalZeroZS; - ++zeroZS_frags; + if (isHPGe){ ++_totalZeroZSHPGe; ++zeroZSHPGe_frags; } else if (isLaBr){ ++_totalZeroZSLaBr; ++zeroZSLaBr_frags;} continue; } //Print first 20 payload adcs @@ -275,7 +353,12 @@ void STMDigisFromFragments::produce(Event& event) uint16_t lastZSindex = 0; //keeps track of last recorded index from header -> with respect to what? uint16_t lastLen = 0; //keeps track of last recoded length from header + if(_verbosityLevel >= 6){std::cout << "dataWords : " << dataWords + << " dataWords%4 : " << dataWords%4 + <<" @ZS" << "\n"; } + while (dataPtr + 2 <= dataEnd){ + if ( readRawZSinfo && seg >= expectedZSRegions ) break; uint16_t current_zs_location = static_cast(dataPtr[0]); uint16_t current_zs_size = static_cast(dataPtr[1]); auto adc = dataPtr + 2; @@ -285,7 +368,11 @@ void STMDigisFromFragments::produce(Event& event) uint32_t trigTimeOffset = current_zs_location; std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_Size - 1 mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use - zs_waveform_digis->emplace_back(stm_waveform); //emplace + + //emplacing + if (isHPGe){zs_HPGe_waveform_digis->emplace_back(stm_waveform); + } else if (isLaBr){zs_LaBr_waveform_digis->emplace_back(stm_waveform); + } if (_verbosityLevel >=6){ //A print check per segment @@ -314,17 +401,19 @@ void STMDigisFromFragments::produce(Event& event) if (readRawZSinfo && ZSfromRaw != totalLen){ throw cet::exception("STM_UNPACKING") << "\n=== ZS Length mismatch ===\n" - << "ZS length from Raw header " << ZSfromRaw << "\n" + << "ZS length from Raw header : " << ZSfromRaw << "\n" << "ZS length calculated from file : " << totalLen << "\n" - << "Found at inner frag i : " << i <<"\n"; - ; + << "Found at inner frag i : " << i <<"\n" + << "Encountered at event : " << _totalEvents <<"\n" ; } }//End of isZS else if (stm_frag.isPH()){ + ++_totalPH; - ++localPH_frags; + if (isHPGe){ ++_totalPHHPGe; ++localPHHPGe_frags; } else if (isLaBr){ ++_totalPHLaBr; ++localPHLaBr_frags; } + //Check if zero filled auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); @@ -333,7 +422,7 @@ void STMDigisFromFragments::produce(Event& event) if (payloadWords ==0){ if (_verbosityLevel >= 3){std::cout << "\nFound an empty frag, i = " << i<< " @PH\n";} ++_totalEmptyPH; - ++emptyPH_frags; + if (isHPGe){ ++_totalEmptyPHHPGe; ++emptyPHHPGe_frags; } else if (isLaBr){ ++_totalEmptyPHLaBr; ++emptyPHLaBr_frags; } continue; } @@ -348,7 +437,7 @@ void STMDigisFromFragments::produce(Event& event) if (allZeros){ if (_verbosityLevel >=3){ std::cout<< "\nFound a zero filled frag, i = " << i<< " @PH\n";} ++_totalZeroPH; - ++zeroPH_frags; + if (isHPGe){ ++_totalZeroPHHPGe; ++zeroPHHPGe_frags; } else if (isLaBr){ ++_totalZeroPHLaBr; ++zeroPHLaBr_frags; } continue; } @@ -360,10 +449,26 @@ void STMDigisFromFragments::produce(Event& event) for (size_t i_PH = 0; i_PH < digiWords ; ++i_PH){ int16_t PH = digiPtr[i_PH]; mu2e::STMPHDigi PH_digi(0, PH); - ph_digis->emplace_back(PH_digi); + + if(isHPGe){ ph_HPGe_digis->emplace_back(PH_digi); + } else if (isLaBr){ ph_LaBr_digis->emplace_back(PH_digi); + } + } }//End of isPH and is checks + else{ + if(_verbosityLevel >=3){ + //std::cout << "\n Inner frag i = " << i + // << "\nDid not read Raw/ZS/PH\n" + // << "Inner Frag_id : " << inner_frag->fragmentID() << "\n" ; + + ++ _unreadInnerFrags; //For Job summary + ++ unread_InnerFrags; //For event summary + + + } + } } } else { //fallback (non-container case) @@ -378,32 +483,61 @@ void STMDigisFromFragments::produce(Event& event) if (_verbosityLevel >= 2 ){ //Event Summary -> tells us what happens per event std::cout << "\n========== STM EVENT SUMMARY - (Unpacking Module) ==========\n"; - std::cout << "Extracted Raw waveforms : "<< raw_waveform_digis->size() <<"\n"; - std::cout << "Extracted ZS waveforms : "<< zs_waveform_digis->size() <<"\n"; - std::cout << "Extracted PH digis : " << ph_digis->size() <<"\n"; + std::cout << "Extracted Raw waveforms : " << raw_HPGe_waveform_digis->size() <<"\n"; + std::cout << "Extracted ZS waveforms : " << zs_HPGe_waveform_digis->size() <<"\n"; + std::cout << "Extracted PH digis : " << ph_HPGe_digis->size() <<"\n"; + std::cout << "Extracted Raw waveforms : " << raw_LaBr_waveform_digis->size() <<"\n"; + std::cout << "Extracted ZS waveforms : " << zs_LaBr_waveform_digis->size() <<"\n"; + std::cout << "Extracted PH digis : " << ph_LaBr_digis->size() <<"\n"; + + std::cout << "\n--- Frags Read ---\n"; - std::cout << "Raw frags : " << localRaw_frags << "\n"; - std::cout << "ZS frags : " << localZS_frags << "\n"; - std::cout << "PH frags : " << localPH_frags << "\n"; + std::cout << "Raw HPGE frags : " << localRawHPGe_frags << "\n"; + std::cout << "ZS HPGe frags : " << localZSHPGe_frags << "\n"; + std::cout << "PH HPGe frags : " << localPHHPGe_frags << "\n"; + + std::cout << "Raw LaBr frags : " << localRawLaBr_frags << "\n"; + std::cout << "ZS LaBr frags : " << localZSLaBr_frags << "\n"; + std::cout << "PH LaBr frags : " << localPHLaBr_frags << "\n"; + std::cout << "\n--- Filter results ---\n"; - std::cout << "Zero Raw frags : " << zeroRaw_frags << "\n"; - std::cout << "Zero ZS frags : " << zeroZS_frags << "\n"; - std::cout << "Zero PH frags : " << zeroPH_frags << "\n"; + std::cout << "Zero Raw HPGe frags : " << zeroRawHPGe_frags << "\n"; + std::cout << "Zero ZS HPGe frags : " << zeroZSHPGe_frags << "\n"; + std::cout << "Zero PH HPGe frags : " << zeroPHHPGe_frags << "\n"; + + std::cout << "Zero Raw LaBr frags : " << zeroRawLaBr_frags << "\n"; + std::cout << "Zero ZS LaBr frags : " << zeroZSLaBr_frags << "\n"; + std::cout << "Zero PH LaBr frags : " << zeroPHLaBr_frags << "\n"; + + + std::cout << "Empty Raw HPGe frags : " << emptyRawHPGe_frags <<"\n"; + std::cout << "Empty ZS HPGe frags : " << emptyZSHPGe_frags << "\n"; + std::cout << "Empty PH HPGe frags : " << emptyPHHPGe_frags << "\n"; - std::cout << "Empty Raw frags : " << emptyRaw_frags <<"\n"; - std::cout << "Empty ZS frags : " << emptyZS_frags << "\n"; - std::cout << "Empty PH frags : " << emptyPH_frags << "\n"; + std::cout << "Empty Raw LaBr frags : " << emptyRawLaBr_frags <<"\n"; + std::cout << "Empty ZS LaBr frags : " << emptyZSLaBr_frags << "\n"; + std::cout << "Empty PH LaBr frags : " << emptyPHLaBr_frags << "\n"; + + std::cout << "Unread frags : " << unread_InnerFrags << "\n"; std::cout << "=================================\n"; } //Final move - event.put(std::move(raw_waveform_digis), "raw"); - event.put(std::move(zs_waveform_digis), "zs"); - event.put(std::move(ph_digis), "ph"); - if (_saveRawWithHeaderFile){ event.put(std::move(raw_header_waveform_digis), "rawWithHeader"); } + //HPGe + event.put(std::move(raw_HPGe_waveform_digis), "rawHPGe"); + event.put(std::move(zs_HPGe_waveform_digis), "zsHPGe"); + event.put(std::move(ph_HPGe_digis), "phHPGe"); + if (_saveRawWithHeaderFile){ event.put(std::move(raw_HPGe_header_waveform_digis), "rawWithHeaderHPGe"); } + + + //LaBr + event.put(std::move(raw_LaBr_waveform_digis), "rawLaBr"); + event.put(std::move(zs_LaBr_waveform_digis), "zsLaBr"); + event.put(std::move(ph_LaBr_digis), "phLaBr"); + if (_saveRawWithHeaderFile){ event.put(std::move(raw_LaBr_header_waveform_digis), "rawWithHeaderLaBr"); } } // produce() @@ -415,25 +549,43 @@ void STMDigisFromFragments::endJob() { //Tells us what happened at the very end std::cout << "\n========== STM JOB SUMMARY - (Unpacking Module) ==========\n"; - std::cout << "Total events : " << _totalEvents << "\n"; - std::cout << "Total fragments : " << _totalFragments << "\n"; - std::cout << "Container frags : " << _totalContainers << "\n"; - std::cout << "Inner fragments : " << _totalInner << "\n"; + std::cout << "Total events : " << _totalEvents << "\n"; + std::cout << "Total frags : " << _totalFragments << "\n"; + std::cout << "Container frags : " << _totalContainers << "\n"; + std::cout << "Inner frags : " << _totalInner << "\n"; std::cout << "\n--- Data types read ---\n"; - std::cout << "RAW : " << _totalRaw << "\n"; - std::cout << "ZS : " << _totalZS << "\n"; - std::cout << "PH : " << _totalPH << "\n"; + std::cout << "RAW Total : " << _totalRaw << "\n"; + std::cout << "ZS Total : " << _totalZS << "\n"; + std::cout << "PH Total : " << _totalPH << "\n"; + + std::cout << "RAW LaBr : " << _totalRawLaBr << "\n"; + std::cout << "ZS LaBr : " << _totalZSLaBr << "\n"; + std::cout << "PH LaBr : " << _totalPHLaBr << "\n"; + + std::cout << "RAW HPGe : " << _totalRawHPGe << "\n"; + std::cout << "ZS HPGe : " << _totalZSHPGe << "\n"; + std::cout << "PH HPGe : " << _totalPHHPGe << "\n"; std::cout << "\n--- Data types filtered ---\n"; - std::cout << "Zero RAW frags : " << _totalZeroRaw << "\n"; - std::cout << "Zero ZS frags : " << _totalZeroZS << "\n"; - std::cout << "Zero PH frags : " << _totalZeroPH << "\n"; - std::cout << "Empty Raw frags : " << _totalEmptyRaw << "\n"; - std::cout << "Empty ZS frags : " << _totalEmptyZS << "\n"; - std::cout << "Empty PH frags : " << _totalEmptyPH << "\n"; + std::cout << "Zero RAW HPGe frags : " << _totalZeroRawHPGe << "\n"; + std::cout << "Zero ZS HPGe frags : " << _totalZeroZSHPGe << "\n"; + std::cout << "Zero PH HPGe frags : " << _totalZeroPHHPGe << "\n"; + std::cout << "Empty Raw HPGe frags : " << _totalEmptyRawHPGe << "\n"; + std::cout << "Empty ZS HPGe frags : " << _totalEmptyZSHPGe << "\n"; + std::cout << "Empty PH HPGe frags : " << _totalEmptyPHHPGe << "\n"; + + std::cout << "Zero RAW LaBr frags : " << _totalZeroRawLaBr << "\n"; + std::cout << "Zero ZS LaBr frags : " << _totalZeroZSLaBr << "\n"; + std::cout << "Zero PH LaBr frags : " << _totalZeroPHLaBr << "\n"; + std::cout << "Empty Raw LaBr frags : " << _totalEmptyRawLaBr << "\n"; + std::cout << "Empty ZS LaBr frags : " << _totalEmptyZSLaBr << "\n"; + std::cout << "Empty PH LaBr frags : " << _totalEmptyPHLaBr << "\n"; + + std::cout << "Unread frags : " << _unreadInnerFrags << "\n"; + std::cout << "=================================\n"; } diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index cf36e7420b..17fd790ced 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -19,7 +19,7 @@ physics : { makeSTMDigis : { module_type : STMDigisFromFragments stmTag : "daq:ContainerSTM" - verbosityLevel : 1 + verbosityLevel : 6 saveRawWithHeaderFile: false } @@ -52,7 +52,7 @@ physics : { } - t1 : [ makeSTMDigis, makeSTMBinary ] + t1 : [ makeSTMDigis ] e1 : [ stmOutput ] #e1 : [ ] #e1 : [ frag, stmOutput ] From f80da0cfb3accf949fb59e4ae269384dc08b3684 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Mon, 27 Apr 2026 11:44:37 -0500 Subject: [PATCH 26/29] Updates on unpacking based on comments --- DAQ/src/STMBinaryDigisFromFragments_module.cc | 74 +++----- DAQ/src/STMDigisFromFragments_module.cc | 164 ++++++++++-------- DAQ/src/STMPrintFragments_module.cc | 40 +---- DAQ/test/inspectSTMFile.fcl | 9 +- RecoDataProducts/inc/STMWaveformDigi.hh | 2 +- STMReco/fcl/plotSTMWaveformDigis.fcl | 37 +++- 6 files changed, 152 insertions(+), 174 deletions(-) diff --git a/DAQ/src/STMBinaryDigisFromFragments_module.cc b/DAQ/src/STMBinaryDigisFromFragments_module.cc index c4b7a79d36..d3c0bf4304 100644 --- a/DAQ/src/STMBinaryDigisFromFragments_module.cc +++ b/DAQ/src/STMBinaryDigisFromFragments_module.cc @@ -23,20 +23,7 @@ #include #include #include -#include -#include -#include #include - -// ROOT includes -#include -#include -#include -#include -#include -#include -#include -#include #include namespace art @@ -137,10 +124,10 @@ void STMBinaryDigisFromFragments::produce(Event& event) ++_totalEvents; //Increment Total Event Counter - std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); - std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); - std::unique_ptr ph_digis(new mu2e::STMPHDigiCollection); - std::unique_ptr raw_header_waveform_digis(new mu2e::STMWaveformDigiCollection); + //std::unique_ptr raw_waveform_digis(new mu2e::STMWaveformDigiCollection); + //std::unique_ptr zs_waveform_digis(new mu2e::STMWaveformDigiCollection); + //std::unique_ptr ph_digis(new mu2e::STMPHDigiCollection); + //std::unique_ptr raw_header_waveform_digis(new mu2e::STMWaveformDigiCollection); //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original art::Handle STMFragmentsH; @@ -164,6 +151,10 @@ void STMBinaryDigisFromFragments::produce(Event& event) size_t emptyRaw_frags{0}; size_t emptyZS_frags{0}; size_t emptyPH_frags{0}; + + size_t extractedRawWaveforms{0}; + size_t extractedZSWaveforms{0}; + size_t extractedPHDigis{0}; //uint16_t ZSfromRaw{0}; //Keep track of ZS length from raw header //bool readRawZSinfo{false}; @@ -239,26 +230,16 @@ void STMBinaryDigisFromFragments::produce(Event& event) << " , i = " << i << " @Raw\n"; } } - //ZSfromRaw = stm_frag.zsLength();//Stores ZS length on outside variable - // readRawZSinfo = 1;//Shows we were able to read the Raw header information - //Ideally only good frags get up to here //------full data (header + payload) - { - //Waveform with data creation - auto dataPtr = stm_frag.dataBegin();//Inner variable - auto dataWords = stm_frag.dataWords(); - writePayload( _rawHeaderOut , dataPtr, dataWords); - } - + //Waveform with data creation + auto dataPtr = stm_frag.dataBegin();//Inner variable + auto dataWords = stm_frag.dataWords(); + writePayload( _rawHeaderOut , dataPtr, dataWords); + //----- payload-only - { - //auto payloadPtr = stm_frag.payloadBegin(); - //auto payloadWords = stm_frag.payloadWords(); - stm_waveform.set_data(payloadWords, payloadPtr); - raw_waveform_digis->emplace_back(stm_waveform); - writePayload(_rawOut, payloadPtr, payloadWords); - } + writePayload(_rawOut, payloadPtr, payloadWords); + ++extractedRawWaveforms; }//End of isRaw @@ -317,18 +298,14 @@ void STMBinaryDigisFromFragments::produce(Event& event) uint16_t current_zs_location = static_cast(dataPtr[0]); uint16_t current_zs_size = static_cast(dataPtr[1]); auto adc = dataPtr + 2; - if (adc + current_zs_size > dataEnd) - break; - - uint32_t trigTimeOffset = current_zs_location; - std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_Size - 1 - mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use - zs_waveform_digis->emplace_back(stm_waveform); //emplace + if (adc + current_zs_size > dataEnd){ break;} + + ++extractedZSWaveforms; if (_verbosityLevel >=6){ //A print check per segment std::cout << "Region = " << seg << " , zs_index = " << current_zs_location << " , zs_size = " << current_zs_size - << " , trigTimeOffset = " << trigTimeOffset << "\n" ; + << "\n" ; } //Update variables @@ -395,12 +372,7 @@ void STMBinaryDigisFromFragments::produce(Event& event) auto const* digiPtr = stm_frag.payloadBegin(); writePayload(_phOut,digiPtr, digiWords); - - for (size_t i_PH = 0; i_PH < digiWords ; ++i_PH){ - int16_t PH = digiPtr[i_PH]; - mu2e::STMPHDigi PH_digi(0, PH); - ph_digis->emplace_back(PH_digi); - } + extractedPHDigis += digiWords; }//End of isPH and is checks @@ -443,9 +415,9 @@ void STMBinaryDigisFromFragments::produce(Event& event) if (_verbosityLevel >= 2 ){ //Event Summary -> tells us what happens per event std::cout << "\n========== STM EVENT SUMMARY - (Binary Module) ==========\n"; - std::cout << "Extracted Raw waveforms : "<< raw_waveform_digis->size() <<"\n"; - std::cout << "Extracted ZS waveforms : "<< zs_waveform_digis->size() <<"\n"; - std::cout << "Extracted PH digis : " << ph_digis->size() <<"\n"; + std::cout << "Extracted Raw waveforms : " << extractedRawWaveforms <<"\n"; + std::cout << "Extracted ZS waveforms : " << extractedZSWaveforms <<"\n"; + std::cout << "Extracted PH digis : " << extractedPHDigis <<"\n"; std::cout << "\n--- Frags Read ---\n"; std::cout << "Raw frags : " << localRaw_frags << "\n"; diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 56ef27cd34..2627256a59 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -23,20 +23,7 @@ #include #include #include -#include -#include -#include #include - -// ROOT includes -#include -#include -#include -#include -#include -#include -#include -#include #include namespace art @@ -51,8 +38,14 @@ class art::STMDigisFromFragments : public EDProducer public: struct Config { fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("Input module")}; - fhicl::Atom saveRawWithHeaderFile {fhicl::Name("saveRawWithHeaderFile"), false}; fhicl::OptionalAtom verbosityLevel{fhicl::Name("verbosityLevel"), fhicl::Comment("Verbosity level")}; + fhicl::Atom saveRawWithHeaderWaveform_HPGe {fhicl::Name("saveRawWithHeaderWaveform_HPGe"), false}; + fhicl::Atom saveRawWaveform_HPGe {fhicl::Name("saveRawWaveform_HPGe"), false}; + fhicl::Atom saveZSWaveform_HPGe{fhicl::Name("saveZSWaveform_HPGe"), false}; + fhicl::Atom saveRawWithHeaderWaveform_LaBr{fhicl::Name("saveRawWithHeaderWaveform_LaBr"), false}; + fhicl::Atom saveRawWaveform_LaBr{fhicl::Name("saveRawWaveform_LaBr"), false}; + fhicl::Atom saveZSWaveform_LaBr{fhicl::Name("saveZSWaveform_LaBr"), false}; + }; explicit STMDigisFromFragments(const art::EDProducer::Table& config); // constructor created, config via fcl @@ -62,10 +55,12 @@ class art::STMDigisFromFragments : public EDProducer private: art::InputTag _stmFragmentsTag; - //Metrics-> Will change this soon + //Metrics size_t _totalEvents{0}; size_t _totalFragments{0}; size_t _totalContainers{0}; + size_t _totalContainersHPGe{0}; + size_t _totalContainersLaBr{0}; size_t _totalInner{0}; size_t _totalRaw{0}; size_t _totalZS{0}; @@ -76,7 +71,6 @@ class art::STMDigisFromFragments : public EDProducer size_t _totalEmptyRaw{0}; size_t _totalEmptyZS{0}; size_t _totalEmptyPH{0}; - size_t _unreadInnerFrags{0}; //Additional metrics @@ -84,6 +78,9 @@ class art::STMDigisFromFragments : public EDProducer size_t _totalRawHPGe{0}; size_t _totalZSHPGe{0}; size_t _totalPHHPGe{0}; + size_t _totalGoodRawHPGe{0}; + size_t _totalGoodZSHPGe{0}; + size_t _totalGoodPHHPGe{0}; size_t _totalZeroRawHPGe{0}; size_t _totalZeroZSHPGe{0}; size_t _totalZeroPHHPGe{0}; @@ -94,7 +91,10 @@ class art::STMDigisFromFragments : public EDProducer //LaBr size_t _totalRawLaBr{0}; size_t _totalZSLaBr{0}; - size_t _totalPHLaBr{0}; + size_t _totalPHLaBr{0}; + size_t _totalGoodRawLaBr{0}; + size_t _totalGoodZSLaBr{0}; + size_t _totalGoodPHLaBr{0}; size_t _totalZeroRawLaBr{0}; size_t _totalZeroZSLaBr{0}; size_t _totalZeroPHLaBr{0}; @@ -104,7 +104,13 @@ class art::STMDigisFromFragments : public EDProducer //fhicl varibales int _verbosityLevel = 0; - bool _saveRawWithHeaderFile{false}; + bool _saveRawWithHeaderWaveform_HPGe{false}; + bool _saveRawWaveform_HPGe{false}; + bool _saveZSWaveform_HPGe{false}; + bool _saveRawWithHeaderWaveform_LaBr{false}; + bool _saveRawWaveform_LaBr{false}; + bool _saveZSWaveform_LaBr{false}; + }; // STMDigisFromFragments // ====================================================================== @@ -113,22 +119,28 @@ class art::STMDigisFromFragments : public EDProducer STMDigisFromFragments::STMDigisFromFragments(const art::EDProducer::Table& config) : art::EDProducer{config} ,_stmFragmentsTag(config().stmTag()) - ,_saveRawWithHeaderFile(config().saveRawWithHeaderFile()) + ,_saveRawWithHeaderWaveform_HPGe(config().saveRawWithHeaderWaveform_HPGe()) + ,_saveRawWaveform_HPGe(config().saveRawWaveform_HPGe()) + ,_saveZSWaveform_HPGe(config().saveZSWaveform_HPGe()) + ,_saveRawWithHeaderWaveform_LaBr(config().saveRawWithHeaderWaveform_LaBr()) + ,_saveRawWaveform_LaBr(config().saveRawWaveform_LaBr()) + ,_saveZSWaveform_LaBr(config().saveZSWaveform_LaBr()) ,_verbosityLevel(config().verbosityLevel() ? *(config().verbosityLevel()) : 0) { // Set the size of vectors for HPGe - produces("rawHPGe");//Waveforms - produces("zsHPGe"); + if (_saveRawWithHeaderWaveform_HPGe){produces("rawWithHeaderHPGe");} + if (_saveRawWaveform_HPGe){produces("rawHPGe");}//Waveforms + if (_saveZSWaveform_HPGe){produces("zsHPGe");} produces("phHPGe"); // digi series - if(_saveRawWithHeaderFile){ produces("rawWithHeaderHPGe");} + //Set the size of vectors for LaBr - produces("rawLaBr"); - produces("zsLaBr"); - produces("phLaBr"); // digi series - if(_saveRawWithHeaderFile){ produces("rawWithHeaderLaBr");} - + if (_saveRawWithHeaderWaveform_LaBr){produces("rawWithHeaderLaBr");} + if (_saveRawWaveform_LaBr){produces("rawLaBr");} + if (_saveZSWaveform_LaBr){produces("zsLaBr");} + produces("phLaBr"); // digi series + } // ---------------------------------------------------------------------- @@ -143,14 +155,12 @@ void STMDigisFromFragments::produce(Event& event) std::unique_ptr zs_HPGe_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr ph_HPGe_digis(new mu2e::STMPHDigiCollection); std::unique_ptr raw_HPGe_header_waveform_digis(new mu2e::STMWaveformDigiCollection); - //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original //LaBr std::unique_ptr raw_LaBr_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr zs_LaBr_waveform_digis(new mu2e::STMWaveformDigiCollection); std::unique_ptr ph_LaBr_digis(new mu2e::STMPHDigiCollection); std::unique_ptr raw_LaBr_header_waveform_digis(new mu2e::STMWaveformDigiCollection); - //std::unique_ptr ph_waveform_digis(new mu2e::STMWaveformDigiCollection);//Original art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); @@ -187,8 +197,6 @@ void STMDigisFromFragments::produce(Event& event) //loop over frags for (const auto& frag : *STMFragments) { ++_totalFragments; //Increment Total Frag counter - bool isLaBr{false}; - bool isHPGe{false}; uint16_t ZSfromRaw{0}; uint16_t expectedZSRegions{0}; @@ -196,8 +204,6 @@ void STMDigisFromFragments::produce(Event& event) ContainerFragID = frag.fragmentID(); if (_verbosityLevel >= 3){std::cout << "\nFrag_id : " << ContainerFragID << "\n";} - - if(ContainerFragID == 103) {isHPGe = true;} else if (ContainerFragID == 203){isLaBr = true ;} //Check if this is a container fragment if (frag.type() == artdaq::Fragment::ContainerFragmentType){ @@ -214,15 +220,12 @@ void STMDigisFromFragments::produce(Event& event) mu2e::STMFragment stm_frag(*inner_frag); mu2e::STMWaveformDigi stm_waveform; - //auto ptr = stm_frag.payloadBegin();//Outer variable - //auto words = stm_frag.payloadWords(); - - if (stm_frag.isRaw()) { + if ( stm_frag.isRaw() ) { //Job Counter ++_totalRaw; - //Conitional Job and Event Counter - if(isHPGe){ ++_totalRawHPGe ; ++localRawHPGe_frags;} else if (isLaBr){++_totalRawLaBr ; ++localRawLaBr_frags;} + //Conditional Job and Event Counter + if( stm_frag.isHPGe() ){ ++_totalRawHPGe ; ++localRawHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalRawLaBr ; ++localRawLaBr_frags; } auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); @@ -233,7 +236,7 @@ void STMDigisFromFragments::produce(Event& event) if(_verbosityLevel >=3){std::cout<< "\nFound an empty frag, i = " << i <<" @Raw\n";} ++_totalEmptyRaw;//Job counter //Eventcounter - if(isHPGe){ ++_totalEmptyRawHPGe; ++emptyRawHPGe_frags;}else if (isLaBr){ ++_totalEmptyRawLaBr; ++emptyRawLaBr_frags;} + if( stm_frag.isHPGe() ){ ++_totalEmptyRawHPGe; ++emptyRawHPGe_frags; } else if (stm_frag.isLaBr()){ ++_totalEmptyRawLaBr; ++emptyRawLaBr_frags; } continue;//stops this loop check and goes to next frag } @@ -250,7 +253,7 @@ void STMDigisFromFragments::produce(Event& event) if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = " << i << " @Raw\n";} ++_totalZeroRaw;//Increment counters //Eventcounter - if(isHPGe){++_totalZeroRawHPGe; ++zeroRawHPGe_frags;} else if (isLaBr){ ++_totalZeroRawLaBr; ++zeroRawLaBr_frags;} + if( stm_frag.isHPGe() ){++_totalZeroRawHPGe; ++zeroRawHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalZeroRawLaBr; ++zeroRawLaBr_frags; } continue; } @@ -274,39 +277,39 @@ void STMDigisFromFragments::produce(Event& event) readRawZSinfo = true;//Shows we were able to read the Raw header information //Ideally only good frags get up to here - if (isHPGe){ - if (_saveRawWithHeaderFile){ + if ( stm_frag.isHPGe() ){ + ++ _totalGoodRawHPGe; + if (_saveRawWithHeaderWaveform_HPGe){ auto dataPtr = stm_frag.dataBegin(); auto dataWords = stm_frag.dataWords(); stm_waveform.set_data(dataWords, dataPtr); raw_HPGe_header_waveform_digis->emplace_back(stm_waveform); } - - { + if(_saveRawWaveform_HPGe) { stm_waveform.set_data(payloadWords, payloadPtr); raw_HPGe_waveform_digis->emplace_back(stm_waveform); } - } else if (isLaBr){ - if (_saveRawWithHeaderFile){ + } else if ( stm_frag.isLaBr() ){ + ++ _totalGoodRawLaBr; + if (_saveRawWithHeaderWaveform_LaBr){ auto dataPtr = stm_frag.dataBegin(); auto dataWords = stm_frag.dataWords(); stm_waveform.set_data(dataWords, dataPtr); raw_LaBr_header_waveform_digis->emplace_back(stm_waveform); } - - { + if(_saveRawWaveform_LaBr){ stm_waveform.set_data(payloadWords, payloadPtr); raw_LaBr_waveform_digis->emplace_back(stm_waveform); } }//End of if CFID=103,203 - }//End of isRaw + else if (stm_frag.isZS()){ ++_totalZS; //Incremenet ZS counter - if (isHPGe){ ++_totalZSHPGe; ++localZSHPGe_frags; } else if (isLaBr){ ++_totalZSLaBr; ++localZSLaBr_frags;} + if ( stm_frag.isHPGe() ){ ++_totalZSHPGe; ++localZSHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalZSLaBr; ++localZSLaBr_frags; } auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); @@ -316,7 +319,7 @@ void STMDigisFromFragments::produce(Event& event) if (payloadWords == 0) { if (_verbosityLevel >=3){std::cout << "\nFound an empty frag, i = " << i << " @ZS\n";} ++_totalEmptyZS; - if (isHPGe){ ++_totalEmptyZSHPGe; ++emptyZSHPGe_frags; } else if (isLaBr){ ++_totalEmptyZSLaBr; ++emptyZSLaBr_frags;} + if ( stm_frag.isHPGe() ){ ++_totalEmptyZSHPGe; ++emptyZSHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalEmptyZSLaBr; ++emptyZSLaBr_frags; } continue; } //Check if any adc are non-zero @@ -330,7 +333,7 @@ void STMDigisFromFragments::produce(Event& event) if (allZeros) { if (_verbosityLevel >=3){std::cout << "\nFound a zero filled frag, i = "<< i << " @ZS\n";} ++_totalZeroZS; - if (isHPGe){ ++_totalZeroZSHPGe; ++zeroZSHPGe_frags; } else if (isLaBr){ ++_totalZeroZSLaBr; ++zeroZSLaBr_frags;} + if ( stm_frag.isHPGe() ){ ++_totalZeroZSHPGe; ++zeroZSHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalZeroZSLaBr; ++zeroZSLaBr_frags; } continue; } //Print first 20 payload adcs @@ -356,6 +359,7 @@ void STMDigisFromFragments::produce(Event& event) if(_verbosityLevel >= 6){std::cout << "dataWords : " << dataWords << " dataWords%4 : " << dataWords%4 <<" @ZS" << "\n"; } + if ( stm_frag.isHPGe()){ ++_totalGoodZSHPGe;} else if(stm_frag.isLaBr()){++ _totalGoodZSLaBr;} while (dataPtr + 2 <= dataEnd){ if ( readRawZSinfo && seg >= expectedZSRegions ) break; @@ -370,10 +374,12 @@ void STMDigisFromFragments::produce(Event& event) mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use //emplacing - if (isHPGe){zs_HPGe_waveform_digis->emplace_back(stm_waveform); - } else if (isLaBr){zs_LaBr_waveform_digis->emplace_back(stm_waveform); + if ( stm_frag.isHPGe() && _saveZSWaveform_HPGe){ + zs_HPGe_waveform_digis->emplace_back(stm_waveform); + } else if ( stm_frag.isLaBr() && _saveZSWaveform_LaBr){ + zs_LaBr_waveform_digis->emplace_back(stm_waveform); } - + if (_verbosityLevel >=6){ //A print check per segment std::cout << "Region = " << seg << " , zs_index = " << current_zs_location << " , zs_size = " << current_zs_size @@ -409,10 +415,10 @@ void STMDigisFromFragments::produce(Event& event) }//End of isZS - else if (stm_frag.isPH()){ + else if ( stm_frag.isPH() ){ ++_totalPH; - if (isHPGe){ ++_totalPHHPGe; ++localPHHPGe_frags; } else if (isLaBr){ ++_totalPHLaBr; ++localPHLaBr_frags; } + if ( stm_frag.isHPGe() ){ ++_totalPHHPGe; ++localPHHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalPHLaBr; ++localPHLaBr_frags; } //Check if zero filled auto payloadPtr = stm_frag.payloadBegin(); @@ -422,7 +428,7 @@ void STMDigisFromFragments::produce(Event& event) if (payloadWords ==0){ if (_verbosityLevel >= 3){std::cout << "\nFound an empty frag, i = " << i<< " @PH\n";} ++_totalEmptyPH; - if (isHPGe){ ++_totalEmptyPHHPGe; ++emptyPHHPGe_frags; } else if (isLaBr){ ++_totalEmptyPHLaBr; ++emptyPHLaBr_frags; } + if ( stm_frag.isHPGe() ){ ++_totalEmptyPHHPGe; ++emptyPHHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalEmptyPHLaBr; ++emptyPHLaBr_frags; } continue; } @@ -437,7 +443,7 @@ void STMDigisFromFragments::produce(Event& event) if (allZeros){ if (_verbosityLevel >=3){ std::cout<< "\nFound a zero filled frag, i = " << i<< " @PH\n";} ++_totalZeroPH; - if (isHPGe){ ++_totalZeroPHHPGe; ++zeroPHHPGe_frags; } else if (isLaBr){ ++_totalZeroPHLaBr; ++zeroPHLaBr_frags; } + if ( stm_frag.isHPGe() ){ ++_totalZeroPHHPGe; ++zeroPHHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalZeroPHLaBr; ++zeroPHLaBr_frags; } continue; } @@ -450,15 +456,18 @@ void STMDigisFromFragments::produce(Event& event) int16_t PH = digiPtr[i_PH]; mu2e::STMPHDigi PH_digi(0, PH); - if(isHPGe){ ph_HPGe_digis->emplace_back(PH_digi); - } else if (isLaBr){ ph_LaBr_digis->emplace_back(PH_digi); - } + if( stm_frag.isHPGe() ){ + ++ _totalGoodPHHPGe; + ph_HPGe_digis->emplace_back(PH_digi); } + else if ( stm_frag.isLaBr() ){ + ++ _totalGoodPHLaBr; + ph_LaBr_digis->emplace_back(PH_digi); } } }//End of isPH and is checks else{ - if(_verbosityLevel >=3){ + if(_verbosityLevel >=3){} //std::cout << "\n Inner frag i = " << i // << "\nDid not read Raw/ZS/PH\n" // << "Inner Frag_id : " << inner_frag->fragmentID() << "\n" ; @@ -467,7 +476,6 @@ void STMDigisFromFragments::produce(Event& event) ++ unread_InnerFrags; //For event summary - } } } } else { @@ -478,7 +486,7 @@ void STMDigisFromFragments::produce(Event& event) //if (stm_frag.isRaw()){} // writePayload(_rawOut, ptr, words); } - } //End of frags loop---George suggestions + } //End of frags loop if (_verbosityLevel >= 2 ){ //Event Summary -> tells us what happens per event @@ -527,17 +535,17 @@ void STMDigisFromFragments::produce(Event& event) //Final move //HPGe - event.put(std::move(raw_HPGe_waveform_digis), "rawHPGe"); - event.put(std::move(zs_HPGe_waveform_digis), "zsHPGe"); + if (_saveRawWithHeaderWaveform_HPGe){ event.put(std::move(raw_HPGe_header_waveform_digis), "rawWithHeaderHPGe"); } + if (_saveRawWaveform_HPGe){event.put(std::move(raw_HPGe_waveform_digis), "rawHPGe");} + if (_saveZSWaveform_HPGe){event.put(std::move(zs_HPGe_waveform_digis), "zsHPGe");} event.put(std::move(ph_HPGe_digis), "phHPGe"); - if (_saveRawWithHeaderFile){ event.put(std::move(raw_HPGe_header_waveform_digis), "rawWithHeaderHPGe"); } //LaBr - event.put(std::move(raw_LaBr_waveform_digis), "rawLaBr"); - event.put(std::move(zs_LaBr_waveform_digis), "zsLaBr"); + if (_saveRawWithHeaderWaveform_LaBr){ event.put(std::move(raw_LaBr_header_waveform_digis), "rawWithHeaderLaBr"); } + if (_saveRawWaveform_LaBr){event.put(std::move(raw_LaBr_waveform_digis), "rawLaBr");} + if (_saveZSWaveform_LaBr){event.put(std::move(zs_LaBr_waveform_digis), "zsLaBr");} event.put(std::move(ph_LaBr_digis), "phLaBr"); - if (_saveRawWithHeaderFile){ event.put(std::move(raw_LaBr_header_waveform_digis), "rawWithHeaderLaBr"); } } // produce() @@ -568,13 +576,21 @@ void STMDigisFromFragments::endJob() { std::cout << "PH HPGe : " << _totalPHHPGe << "\n"; std::cout << "\n--- Data types filtered ---\n"; + std::cout << "Good RAW HPGe frags : " << _totalGoodRawHPGe << "\n"; + std::cout << "Good ZS HPGe frags : " << _totalGoodZSHPGe << "\n"; + std::cout << "Good PH HPGe frags : " << _totalGoodPHHPGe << "\n"; std::cout << "Zero RAW HPGe frags : " << _totalZeroRawHPGe << "\n"; std::cout << "Zero ZS HPGe frags : " << _totalZeroZSHPGe << "\n"; std::cout << "Zero PH HPGe frags : " << _totalZeroPHHPGe << "\n"; std::cout << "Empty Raw HPGe frags : " << _totalEmptyRawHPGe << "\n"; std::cout << "Empty ZS HPGe frags : " << _totalEmptyZSHPGe << "\n"; std::cout << "Empty PH HPGe frags : " << _totalEmptyPHHPGe << "\n"; - + + std::cout << "\n"; + + std::cout << "Good RAW LaBr frags : " << _totalGoodRawHPGe << "\n"; + std::cout << "Good ZS LaBr frags : " << _totalGoodZSHPGe << "\n"; + std::cout << "Good PH LaBr frags : " << _totalGoodPHHPGe << "\n"; std::cout << "Zero RAW LaBr frags : " << _totalZeroRawLaBr << "\n"; std::cout << "Zero ZS LaBr frags : " << _totalZeroZSLaBr << "\n"; std::cout << "Zero PH LaBr frags : " << _totalZeroPHLaBr << "\n"; @@ -584,8 +600,6 @@ void STMDigisFromFragments::endJob() { std::cout << "Unread frags : " << _unreadInnerFrags << "\n"; - - std::cout << "=================================\n"; } diff --git a/DAQ/src/STMPrintFragments_module.cc b/DAQ/src/STMPrintFragments_module.cc index 3b66db933b..f881b66378 100644 --- a/DAQ/src/STMPrintFragments_module.cc +++ b/DAQ/src/STMPrintFragments_module.cc @@ -34,9 +34,6 @@ class art::STMPrintFragments : public EDAnalyzer struct Config { fhicl::Atom stmTag {fhicl::Name("stmTag"), fhicl::Comment("stmTag for new file")}; - // // fhicl::Atom diagLevel{fhicl::Name("diagLevel"), fhicl::Comment("diagnostic Level")}; - // // fhicl::Atom CRVDataDecodersTag{fhicl::Name("crvTag"), - // // fhicl::Comment("crv Fragments Tag")}; }; // --- C'tor/d'tor: @@ -48,13 +45,6 @@ class art::STMPrintFragments : public EDAnalyzer private: art::InputTag _stmFragmentsTag; - // int decompressCrvDigi(uint8_t adc); - // int16_t decompressCrvDigi(int16_t adc); - - // int _diagLevel; - // art::InputTag _CRVDataDecodersTag; - // mu2e::ProditionsHandle _channelMap_h; - }; // STMPrintFragments // ====================================================================== @@ -62,9 +52,7 @@ class art::STMPrintFragments : public EDAnalyzer STMPrintFragments::STMPrintFragments(const art::EDAnalyzer::Table& config) : art::EDAnalyzer{config} ,_stmFragmentsTag(config().stmTag()) -{ - // produces(); -} +{} // ---------------------------------------------------------------------- @@ -78,16 +66,6 @@ void STMPrintFragments::analyze(const Event& event) << ", event " << eventNumber << " has " << std::endl; std::cout << STMContainerFragments->size() << " STM fragments." << std::endl; - // std::vector>> fragmentHandles; - // fragmentHandles = event.getMany>(); - // std::cout << "AE: fragmentHandles.size() = " << fragmentHandles.size() << std::endl; - // for (auto const& hndl : fragmentHandles) { - // std::cout << "AE: hdnle = " << hndl << std::endl; - // for (auto const& fragment : *hndl) { - // int fragID = fragment.fragmentID(); - // std::cout << "AE: fragID = " << fragID << std::endl; - // } - // } int frag_counter = 0; for (auto& frag : *STMContainerFragments) { ++frag_counter; @@ -95,8 +73,7 @@ void STMPrintFragments::analyze(const Event& event) //New lines artdaq::ContainerFragment contf(frag); // interpret the fragment as a ContainerFragemnt (Will look inside here) std::cout<<"N Blocks in the container = " << std::endl; //Should be 3 for the 3 STM Fragments - // auto stm_frag = static_cast(frag); - + for (size_t ii = 0; ii< contf.block_count(); ++ii){ const auto dataBegin = frag.dataBegin(); const auto dataEnd = frag.dataEnd(); @@ -110,19 +87,6 @@ void STMPrintFragments::analyze(const Event& event) std::cout << "Frag #" << frag_counter << ": *(stmDataBegin+" << i - stmDataBegin << ") = " << *i << std::endl; } - // // std::cout << "Trigger Header Address: " << stm_frag.GetTHdr() << std::endl; - // std::cout << "Frag #" << frag_counter << ": EvNum: " << *(stm_frag.EvNum()) << std::endl; - // std::cout << "Frag #" << frag_counter << ": DataType: " << *(stm_frag.DataType()) << std::endl; - // std::cout << "Frag #" << frag_counter << ": EvLen: " << *(stm_frag.EvLen()) << std::endl; - - // unsigned int max_samples = (*(stm_frag.EvLen()))/100.; - // std::cout << "Frag #" << frag_counter << ": First " << max_samples << " int16s of data: "; - // for (size_t i = 0; i < max_samples; ++i) { - // std::cout << *(stm_frag.DataBegin()+i) << " "; - // } - // std::cout << std::endl; - // std::cout << "Trigger Header Channel: " << *(stm_frag.GetTHdr()) << std::endl; - // std::cout << "Trigger Header EvNum: " << *(stm_frag.GetTHdr()+8) << std::endl; } } }// produce() diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index 17fd790ced..21659d87ae 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -19,8 +19,13 @@ physics : { makeSTMDigis : { module_type : STMDigisFromFragments stmTag : "daq:ContainerSTM" - verbosityLevel : 6 - saveRawWithHeaderFile: false + verbosityLevel : 1 + saveRawWithHeaderWaveform_HPGe: false + saveRawWaveform_HPGe: true + saveZSWaveform_HPGe: true + saveRawWithHeaderWaveform_LaBr: false + saveRawWaveform_LaBr: true + saveZSWaveform_LaBr: true } makeSTMBinary : { diff --git a/RecoDataProducts/inc/STMWaveformDigi.hh b/RecoDataProducts/inc/STMWaveformDigi.hh index a506dbc682..2966faec63 100644 --- a/RecoDataProducts/inc/STMWaveformDigi.hh +++ b/RecoDataProducts/inc/STMWaveformDigi.hh @@ -35,7 +35,7 @@ namespace mu2e { double peak_fitTime2 () const { return _peak_fitTime2; } double peak_sep () const { return _peak_sep; } const std::vector& adcs () const { return _adcs; } - void set_data ( size_t n_data, int16_t const* data ) { _adcs.resize(n_data); std::copy(data, data+n_data, _adcs.begin()); } // TODO: remove this method + void set_data ( size_t n_data, int16_t const* data ) { _adcs.resize(n_data); std::copy(data, data+n_data, _adcs.begin()); } private: int16_t _DetID; diff --git a/STMReco/fcl/plotSTMWaveformDigis.fcl b/STMReco/fcl/plotSTMWaveformDigis.fcl index 1ab4371ad1..3ec6e51c74 100644 --- a/STMReco/fcl/plotSTMWaveformDigis.fcl +++ b/STMReco/fcl/plotSTMWaveformDigis.fcl @@ -21,32 +21,55 @@ physics: { producers : { } filters : { } analyzers : { - plotRawWaveformDigis : { + plotRawWaveformDigisHPGe : { module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "makeSTMDigis:raw" + stmWaveformDigisTag : "makeSTMDigis:rawHPGe" subtractPedestal : false verbosityLevel : 0 xAxis : "sample_number" } - plotZSWaveformDigis : { + plotZSWaveformDigisHPGe : { module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "makeSTMDigis:zs" + stmWaveformDigisTag : "makeSTMDigis:zsHPGe" subtractPedestal : false verbosityLevel : 0 xAxis : "sample_number" } - plotPHWaveformDigis : { + plotPHWaveformDigisHPGe : { module_type : PlotSTMWaveformDigis - stmWaveformDigisTag : "makeSTMDigis:ph" + stmWaveformDigisTag : "makeSTMDigis:phHPGe" subtractPedestal : false verbosityLevel : 0 xAxis : "sample_number" } + + plotRawWaveformDigisLaBr : { + module_type : PlotSTMWaveformDigis + stmWaveformDigisTag : "makeSTMDigis:rawLaBr" + subtractPedestal : false + verbosityLevel : 0 + xAxis : "sample_number" + } + plotZSWaveformDigisLaBr : { + module_type : PlotSTMWaveformDigis + stmWaveformDigisTag : "makeSTMDigis:zsLaBr" + subtractPedestal : false + verbosityLevel : 0 + xAxis : "sample_number" + } + + plotPHWaveformDigisLaBr : { + module_type : PlotSTMWaveformDigis + stmWaveformDigisTag : "makeSTMDigis:phLaBr" + subtractPedestal : false + verbosityLevel : 0 + xAxis : "sample_number" + } } # setup paths trigger_paths: [ ] - anaPath : [ plotRawWaveformDigis, plotZSWaveformDigis ] + anaPath : [ plotRawWaveformDigisHPGe, plotZSWaveformDigisHPGe, plotRawWaveformDigisLaBr, plotZSWaveformDigisLaBr ] end_paths: [anaPath] } From 6aaeef71207e7822247447ca13d8d85938f7a1e3 Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Tue, 28 Apr 2026 18:55:26 -0500 Subject: [PATCH 27/29] Changes to unpacking module, STMDigisTag, removed comments, fixed inner loop in STMPrint, STMMovingWindowDeconvolution_module now has verbosity in checks, enabled LaBr and HPGe where it was once off --- DAQ/src/STMDigisFromFragments_module.cc | 58 +++++++++++-------- DAQ/src/STMPrintFragments_module.cc | 15 ++--- DAQ/test/inspectSTMFile.fcl | 7 --- RecoDataProducts/inc/STMWaveformDigi.hh | 12 +--- STMReco/fcl/makeSTMHits.fcl | 6 +- STMReco/fcl/mwd.fcl | 8 +-- STMReco/fcl/plotSTMPHSpectrum.fcl | 2 +- STMReco/fcl/plotSTMWaveformDigis.fcl | 4 ++ STMReco/src/MakeSTMHits_module.cc | 5 +- STMReco/src/PlotSTMWaveformDigis_module.cc | 8 ++- .../STMMovingWindowDeconvolution_module.cc | 16 ++--- 11 files changed, 73 insertions(+), 68 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 2627256a59..d447ba3593 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -192,9 +192,9 @@ void STMDigisFromFragments::produce(Event& event) //Additional size_t unread_InnerFrags{0}; - uint16_t ContainerFragID{0}; + uint16_t outerFragID{0}; - //loop over frags + //loop over outer frags for (const auto& frag : *STMFragments) { ++_totalFragments; //Increment Total Frag counter @@ -202,18 +202,22 @@ void STMDigisFromFragments::produce(Event& event) uint16_t expectedZSRegions{0}; bool readRawZSinfo{false}; - ContainerFragID = frag.fragmentID(); - if (_verbosityLevel >= 3){std::cout << "\nFrag_id : " << ContainerFragID << "\n";} + outerFragID = frag.fragmentID(); + if (_verbosityLevel >= 3){std::cout << "\nFrag_id : " << outerFragID << "\n";} + //Check if this is a container fragment if (frag.type() == artdaq::Fragment::ContainerFragmentType){ + mu2e::STMFragment container_frag(frag); + if ( container_frag.isHPGeContainer()){ ++_totalContainersHPGe; } else if ( container_frag.isLaBrContainer() ) { ++_totalContainersLaBr;} + artdaq::ContainerFragment cont_frag(frag); ++_totalContainers; size_t blocks = cont_frag.block_count(); _totalInner += blocks; - //loop over container - // i index corresponds to inner frag + + //loop over container where i corresponds to inner frag for (size_t i = 0; i < cont_frag.block_count(); ++i){ auto inner_frag = cont_frag.at(i); @@ -448,6 +452,8 @@ void STMDigisFromFragments::produce(Event& event) } if (_verbosityLevel >= 3){std::cout << "\nFound a good frag, i = " << i <<" @PH\n";} + + if ( stm_frag.isHPGe() ){ ++ _totalGoodPHHPGe; } else if ( stm_frag.isLaBr() ) { ++ _totalGoodPHLaBr; } size_t digiWords = stm_frag.payloadWords(); auto const* digiPtr = stm_frag.payloadBegin(); @@ -457,12 +463,10 @@ void STMDigisFromFragments::produce(Event& event) mu2e::STMPHDigi PH_digi(0, PH); if( stm_frag.isHPGe() ){ - ++ _totalGoodPHHPGe; ph_HPGe_digis->emplace_back(PH_digi); } else if ( stm_frag.isLaBr() ){ - ++ _totalGoodPHLaBr; ph_LaBr_digis->emplace_back(PH_digi); } - + } }//End of isPH and is checks @@ -481,23 +485,26 @@ void STMDigisFromFragments::produce(Event& event) } else { //fallback (non-container case) mu2e::STMFragment stm_frag(frag); - auto ptr = stm_frag.payloadBegin(); - auto words = stm_frag.payloadWords(); + if (_verbosityLevel >=1) { + std::cout << "\nFound non-container STM Fragment " + <<"\n fragment ID : " << frag.fragmentID() + <<"\n event : " << _totalEvents << "\n"; + } + - //if (stm_frag.isRaw()){} // writePayload(_rawOut, ptr, words); } } //End of frags loop if (_verbosityLevel >= 2 ){ //Event Summary -> tells us what happens per event std::cout << "\n========== STM EVENT SUMMARY - (Unpacking Module) ==========\n"; - std::cout << "Extracted Raw waveforms : " << raw_HPGe_waveform_digis->size() <<"\n"; - std::cout << "Extracted ZS waveforms : " << zs_HPGe_waveform_digis->size() <<"\n"; - std::cout << "Extracted PH digis : " << ph_HPGe_digis->size() <<"\n"; - - std::cout << "Extracted Raw waveforms : " << raw_LaBr_waveform_digis->size() <<"\n"; - std::cout << "Extracted ZS waveforms : " << zs_LaBr_waveform_digis->size() <<"\n"; - std::cout << "Extracted PH digis : " << ph_LaBr_digis->size() <<"\n"; + std::cout << "Extracted Raw HPGe waveforms : " << raw_HPGe_waveform_digis->size() <<"\n"; + std::cout << "Extracted ZS HPGe waveforms : " << zs_HPGe_waveform_digis->size() <<"\n"; + std::cout << "Extracted PH HPGe digis : " << ph_HPGe_digis->size() <<"\n"; + + std::cout << "Extracted Raw LaBr waveforms : " << raw_LaBr_waveform_digis->size() <<"\n"; + std::cout << "Extracted ZS LaBr waveforms : " << zs_LaBr_waveform_digis->size() <<"\n"; + std::cout << "Extracted PH LaBr digis : " << ph_LaBr_digis->size() <<"\n"; std::cout << "\n--- Frags Read ---\n"; @@ -559,8 +566,11 @@ void STMDigisFromFragments::endJob() { std::cout << "Total events : " << _totalEvents << "\n"; std::cout << "Total frags : " << _totalFragments << "\n"; - std::cout << "Container frags : " << _totalContainers << "\n"; - std::cout << "Inner frags : " << _totalInner << "\n"; + std::cout << "Total Container frags : " << _totalContainers << "\n"; + std::cout << "Total HPGe Containers : " << _totalContainersHPGe << "\n"; + std::cout << "Total LaBr Containers : " << _totalContainersLaBr << "\n"; + std::cout << "Total Inner frags : " << _totalInner << "\n"; + std::cout << "\n--- Data types read ---\n"; std::cout << "RAW Total : " << _totalRaw << "\n"; @@ -588,9 +598,9 @@ void STMDigisFromFragments::endJob() { std::cout << "\n"; - std::cout << "Good RAW LaBr frags : " << _totalGoodRawHPGe << "\n"; - std::cout << "Good ZS LaBr frags : " << _totalGoodZSHPGe << "\n"; - std::cout << "Good PH LaBr frags : " << _totalGoodPHHPGe << "\n"; + std::cout << "Good RAW LaBr frags : " << _totalGoodRawLaBr << "\n"; + std::cout << "Good ZS LaBr frags : " << _totalGoodZSLaBr << "\n"; + std::cout << "Good PH LaBr frags : " << _totalGoodPHLaBr << "\n"; std::cout << "Zero RAW LaBr frags : " << _totalZeroRawLaBr << "\n"; std::cout << "Zero ZS LaBr frags : " << _totalZeroZSLaBr << "\n"; std::cout << "Zero PH LaBr frags : " << _totalZeroPHLaBr << "\n"; diff --git a/DAQ/src/STMPrintFragments_module.cc b/DAQ/src/STMPrintFragments_module.cc index f881b66378..6b833569a3 100644 --- a/DAQ/src/STMPrintFragments_module.cc +++ b/DAQ/src/STMPrintFragments_module.cc @@ -72,19 +72,20 @@ void STMPrintFragments::analyze(const Event& event) //New lines artdaq::ContainerFragment contf(frag); // interpret the fragment as a ContainerFragemnt (Will look inside here) - std::cout<<"N Blocks in the container = " << std::endl; //Should be 3 for the 3 STM Fragments + std::cout<<"N Blocks in the container = " << contf.block_count() << std::endl; //Should be 3 for the 3 STM Fragments for (size_t ii = 0; ii< contf.block_count(); ++ii){ - const auto dataBegin = frag.dataBegin(); - const auto dataEnd = frag.dataEnd(); + auto inner = contf.at(ii); + const auto dataBegin = inner->dataBegin(); + const auto dataEnd = inner->dataEnd(); + auto frag_id = inner->fragmentID(); const auto stmDataBegin = reinterpret_cast(dataBegin); const auto stmDataEnd = reinterpret_cast(dataEnd); - auto frag_id = frag.fragmentID(); - std::cout << "frag_id = " << frag_id << std::endl; - std::cout<< "container block_count = "<(config().stmPHDigisTag())) - ,_channel(STMChannel::LaBr) + ,_channel(STMUtils::getChannel(config().stmPHDigisTag())) ,_stmEnergyCalib_h() { produces(); } - + //Originally had _channel(STMChannel::LaBr) + void MakeSTMHits::produce(art::Event& event) { // create output unique_ptr outputSTMHits(new STMHitCollection); diff --git a/STMReco/src/PlotSTMWaveformDigis_module.cc b/STMReco/src/PlotSTMWaveformDigis_module.cc index cfd1d059e7..c1155e2392 100644 --- a/STMReco/src/PlotSTMWaveformDigis_module.cc +++ b/STMReco/src/PlotSTMWaveformDigis_module.cc @@ -65,7 +65,7 @@ namespace mu2e { _subtractPedestal(config().subtractPedestal()), _xAxis(config().xAxis()), _verbosityLevel(config().verbosityLevel()), - _channel(STMChannel::findByName("HPGe")) // FIXME: don't hardcode this probably don't want to do what we had before and try to infer it from the art::InputTag like this "STMUtils::getChannel(config().stmWaveformDigisTag()))" + _channel(STMUtils::getChannel(config().stmWaveformDigisTag())) { } @@ -97,7 +97,9 @@ namespace mu2e { const auto nsPerCt = stmEnergyCalib.nsPerCt(_channel); - std::cout<<"size = "<size()< 1){ + std::cout<<"size = "<size()<SetBinContent(i_adc+1,content); //Exact copy } - //For offset waveforms + //For offset waveforms -> Better organize this area auto zs_offset = waveform.trigTimeOffset(); //Grabs stored offset int n_bins = hWaveformOffset->GetNbinsX(); //Grabs already contained nbins from waveform double xmin = hWaveformOffset->GetXaxis()->GetXmin();// gets xmin from waveform diff --git a/STMReco/src/STMMovingWindowDeconvolution_module.cc b/STMReco/src/STMMovingWindowDeconvolution_module.cc index b52c343d42..73969557ae 100644 --- a/STMReco/src/STMMovingWindowDeconvolution_module.cc +++ b/STMReco/src/STMMovingWindowDeconvolution_module.cc @@ -158,10 +158,10 @@ namespace mu2e { if (M < L) throw cet::exception("Configuration", "L (" + std::to_string(L) + ") is greater than M (" + std::to_string(M) + "), reconfigure\n"); verbosityLevel = conf().verbosityLevel() ? *(conf().verbosityLevel()) : 0; - if (verbosityLevel > 10) - verbosityLevel = 10; - _xAxis = conf().xAxis() ? *(conf().xAxis()) : ""; - std::cout<<"BG"<<_xAxis<= 7){ + _xAxis = conf().xAxis() ? *(conf().xAxis()) : ""; + std::cout<<"BG"<<_xAxis<=3){} - //std::cout << "\n Inner frag i = " << i - // << "\nDid not read Raw/ZS/PH\n" - // << "Inner Frag_id : " << inner_frag->fragmentID() << "\n" ; - - ++ _unreadInnerFrags; //For Job summary - ++ unread_InnerFrags; //For event summary - - + ++ _unreadInnerFrags; //For Job summary + ++ unread_InnerFrags; //For event summary + if(_verbosityLevel >=3){ + std::cout << "Unread Inner fragment" << "\n" + << "Inner frag i : " << i << "\n" + << "Frag ID : " << inner_frag->fragmentID() << "\n" + << "Event : " <<_totalEvents << "\n"; + } } } + } else { //fallback (non-container case) - mu2e::STMFragment stm_frag(frag); if (_verbosityLevel >=1) { - std::cout << "\nFound non-container STM Fragment " - <<"\n fragment ID : " << frag.fragmentID() - <<"\n event : " << _totalEvents << "\n"; + std::cout << "Found non-container STM Fragment " <<"\n" + << "Fragment ID : " << frag.fragmentID() << "\n" + << "Event : " << _totalEvents << "\n"; } - - } } //End of frags loop + if (eventHasHPGe && eventHasLaBr){ ++_totalEventsWithHPGeLaBr; } + else if (eventHasHPGe){ ++_totalEventsWithOnlyHPGe; } + else if (eventHasLaBr){ ++_totalEventsWithOnlyLaBr; } + else { ++_totalEventsWithNone; } + if (_verbosityLevel >= 2 ){ //Event Summary -> tells us what happens per event std::cout << "\n========== STM EVENT SUMMARY - (Unpacking Module) ==========\n"; + std::cout << "\n--- Products extracted ---\n"; std::cout << "Extracted Raw HPGe waveforms : " << raw_HPGe_waveform_digis->size() <<"\n"; std::cout << "Extracted ZS HPGe waveforms : " << zs_HPGe_waveform_digis->size() <<"\n"; std::cout << "Extracted PH HPGe digis : " << ph_HPGe_digis->size() <<"\n"; - + std::cout << "\n"; std::cout << "Extracted Raw LaBr waveforms : " << raw_LaBr_waveform_digis->size() <<"\n"; std::cout << "Extracted ZS LaBr waveforms : " << zs_LaBr_waveform_digis->size() <<"\n"; std::cout << "Extracted PH LaBr digis : " << ph_LaBr_digis->size() <<"\n"; - - std::cout << "\n--- Frags Read ---\n"; - std::cout << "Raw HPGE frags : " << localRawHPGe_frags << "\n"; - std::cout << "ZS HPGe frags : " << localZSHPGe_frags << "\n"; - std::cout << "PH HPGe frags : " << localPHHPGe_frags << "\n"; - std::cout << "Raw LaBr frags : " << localRawLaBr_frags << "\n"; - std::cout << "ZS LaBr frags : " << localZSLaBr_frags << "\n"; - std::cout << "PH LaBr frags : " << localPHLaBr_frags << "\n"; + std::cout << "\n--- Frags Seen ---\n"; + std::cout << "Raw HPGE frags seen : " << localRawHPGe_frags << "\n"; + std::cout << "ZS HPGe frags seen : " << localZSHPGe_frags << "\n"; + std::cout << "PH HPGe frags seen : " << localPHHPGe_frags << "\n"; + std::cout << "\n"; + std::cout << "Raw LaBr frags seen : " << localRawLaBr_frags << "\n"; + std::cout << "ZS LaBr frags seen : " << localZSLaBr_frags << "\n"; + std::cout << "PH LaBr frags seen : " << localPHLaBr_frags << "\n"; + std::cout << "\nUnread frags : " << unread_InnerFrags << "\n"; std::cout << "\n--- Filter results ---\n"; std::cout << "Zero Raw HPGe frags : " << zeroRawHPGe_frags << "\n"; std::cout << "Zero ZS HPGe frags : " << zeroZSHPGe_frags << "\n"; std::cout << "Zero PH HPGe frags : " << zeroPHHPGe_frags << "\n"; - + std::cout << "\n"; std::cout << "Zero Raw LaBr frags : " << zeroRawLaBr_frags << "\n"; std::cout << "Zero ZS LaBr frags : " << zeroZSLaBr_frags << "\n"; std::cout << "Zero PH LaBr frags : " << zeroPHLaBr_frags << "\n"; - - + std::cout << "\n"; + std::cout << "Empty Raw HPGe frags : " << emptyRawHPGe_frags <<"\n"; std::cout << "Empty ZS HPGe frags : " << emptyZSHPGe_frags << "\n"; std::cout << "Empty PH HPGe frags : " << emptyPHHPGe_frags << "\n"; - + std::cout << "\n"; std::cout << "Empty Raw LaBr frags : " << emptyRawLaBr_frags <<"\n"; std::cout << "Empty ZS LaBr frags : " << emptyZSLaBr_frags << "\n"; std::cout << "Empty PH LaBr frags : " << emptyPHLaBr_frags << "\n"; - - std::cout << "Unread frags : " << unread_InnerFrags << "\n"; std::cout << "=================================\n"; } @@ -563,24 +585,28 @@ void STMDigisFromFragments::endJob() { if (_verbosityLevel >= 1){ //Tells us what happened at the very end std::cout << "\n========== STM JOB SUMMARY - (Unpacking Module) ==========\n"; - + std::cout << "Total events : " << _totalEvents << "\n"; + std::cout << "Total events w/HPGe&LaBr : " << _totalEventsWithHPGeLaBr << "\n"; + std::cout << "Total events w/only HPGe : " << _totalEventsWithOnlyHPGe << "\n"; + std::cout << "Total events w/only LaBr : " << _totalEventsWithOnlyLaBr << "\n"; + std::cout << "Total events w/Neither : " << _totalEventsWithNone << "\n"; std::cout << "Total frags : " << _totalFragments << "\n"; std::cout << "Total Container frags : " << _totalContainers << "\n"; std::cout << "Total HPGe Containers : " << _totalContainersHPGe << "\n"; std::cout << "Total LaBr Containers : " << _totalContainersLaBr << "\n"; std::cout << "Total Inner frags : " << _totalInner << "\n"; - + std::cout << "Unread frags : " << _unreadInnerFrags << "\n"; std::cout << "\n--- Data types read ---\n"; - std::cout << "RAW Total : " << _totalRaw << "\n"; - std::cout << "ZS Total : " << _totalZS << "\n"; - std::cout << "PH Total : " << _totalPH << "\n"; - + std::cout << "RAW seen : " << _totalRaw << "\n"; + std::cout << "ZS seen : " << _totalZS << "\n"; + std::cout << "PH seen : " << _totalPH << "\n"; + std::cout << "\n"; std::cout << "RAW LaBr : " << _totalRawLaBr << "\n"; std::cout << "ZS LaBr : " << _totalZSLaBr << "\n"; std::cout << "PH LaBr : " << _totalPHLaBr << "\n"; - + std::cout << "\n"; std::cout << "RAW HPGe : " << _totalRawHPGe << "\n"; std::cout << "ZS HPGe : " << _totalZSHPGe << "\n"; std::cout << "PH HPGe : " << _totalPHHPGe << "\n"; @@ -589,9 +615,11 @@ void STMDigisFromFragments::endJob() { std::cout << "Good RAW HPGe frags : " << _totalGoodRawHPGe << "\n"; std::cout << "Good ZS HPGe frags : " << _totalGoodZSHPGe << "\n"; std::cout << "Good PH HPGe frags : " << _totalGoodPHHPGe << "\n"; + std::cout << "\n"; std::cout << "Zero RAW HPGe frags : " << _totalZeroRawHPGe << "\n"; std::cout << "Zero ZS HPGe frags : " << _totalZeroZSHPGe << "\n"; std::cout << "Zero PH HPGe frags : " << _totalZeroPHHPGe << "\n"; + std::cout << "\n"; std::cout << "Empty Raw HPGe frags : " << _totalEmptyRawHPGe << "\n"; std::cout << "Empty ZS HPGe frags : " << _totalEmptyZSHPGe << "\n"; std::cout << "Empty PH HPGe frags : " << _totalEmptyPHHPGe << "\n"; @@ -601,15 +629,15 @@ void STMDigisFromFragments::endJob() { std::cout << "Good RAW LaBr frags : " << _totalGoodRawLaBr << "\n"; std::cout << "Good ZS LaBr frags : " << _totalGoodZSLaBr << "\n"; std::cout << "Good PH LaBr frags : " << _totalGoodPHLaBr << "\n"; + std::cout << "\n"; std::cout << "Zero RAW LaBr frags : " << _totalZeroRawLaBr << "\n"; std::cout << "Zero ZS LaBr frags : " << _totalZeroZSLaBr << "\n"; std::cout << "Zero PH LaBr frags : " << _totalZeroPHLaBr << "\n"; + std::cout << "\n"; std::cout << "Empty Raw LaBr frags : " << _totalEmptyRawLaBr << "\n"; std::cout << "Empty ZS LaBr frags : " << _totalEmptyZSLaBr << "\n"; std::cout << "Empty PH LaBr frags : " << _totalEmptyPHLaBr << "\n"; - std::cout << "Unread frags : " << _unreadInnerFrags << "\n"; - std::cout << "=================================\n"; } diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index 6eb50e9cec..eac7bc550d 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -19,7 +19,7 @@ physics : { makeSTMDigis : { module_type : STMDigisFromFragments stmTag : "daq:ContainerSTM" - verbosityLevel : 1 + verbosityLevel : 2 saveRawWithHeaderWaveform_HPGe: false saveRawWaveform_HPGe: true saveZSWaveform_HPGe: true @@ -50,7 +50,7 @@ physics : { } - t1 : [ makeSTMDigis ] + t1 : [ makeSTMDigis ] e1 : [ stmOutput ] #e1 : [ ] #e1 : [ frag, stmOutput ] @@ -67,8 +67,8 @@ services.TimeTracker.printSummary: true outputs : { stmOutput : { module_type : RootOutput - fileName : "dig.stm.art" - outputCommands : [ "keep *_*_*_*", "drop artdaq::*_*_*_*" ] + fileName : "dig.stm.art" + outputCommands : [ "keep *_*_*_*", "drop artdaq::*_*_*_*" ] # outputCommands : [ "drop *_*_*_*", "keep mu2e::STMWaveformDigis_*_*_*" ] } } diff --git a/RecoDataProducts/inc/STMWaveformDigi.hh b/RecoDataProducts/inc/STMWaveformDigi.hh index eacc0d67a4..a4d33845b9 100644 --- a/RecoDataProducts/inc/STMWaveformDigi.hh +++ b/RecoDataProducts/inc/STMWaveformDigi.hh @@ -14,33 +14,38 @@ #include "Offline/DataProducts/inc/STMChannel.hh" namespace mu2e { - class STMWaveformDigi { - public: - // Initialise all variables - STMWaveformDigi() : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(0), _adcs(std::vector()) {}; - // Constructor for timing plus trig offset - STMWaveformDigi(int16_t DetID, uint64_t EWT, uint64_t DTCtime, uint64_t ADCtime, uint32_t trigTimeOffset, std::vector &adcs) : _DetID(DetID), _EWT(EWT), _DTCtime(DTCtime), _ADCtime(ADCtime), _trigTimeOffset(trigTimeOffset), _adcs(adcs) {}; - // Basic constructor - STMWaveformDigi(uint32_t trigTimeOffset, std::vector &adcs) : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(trigTimeOffset), _adcs(adcs) {}; - - int16_t DetID () const { return _DetID; } - uint64_t EWT () const { return _EWT; } - uint64_t DTCtime() const { return _DTCtime; } - uint64_t ADCtime() const { return _ADCtime; } - uint32_t trigTimeOffset() const { return _trigTimeOffset; } - const std::vector& adcs () const { return _adcs; } - void set_data ( size_t n_data, int16_t const* data ) { _adcs.resize(n_data); std::copy(data, data+n_data, _adcs.begin()); } - private: - int16_t _DetID; - uint64_t _EWT; - uint64_t _DTCtime; - uint64_t _ADCtime; - uint32_t _trigTimeOffset; // time offset from EWT? to first ADC value [ct] - std::vector _adcs; // vector of ADC values for the waveform + public: // Initialise all variables + STMWaveformDigi() : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(0), _peak_fitTime1(0), _peak_fitTime2(0), _peak_sep(0), _adcs(std::vector()) {}; // Constructor for timing plus trig offset + STMWaveformDigi(int16_t DetID, uint64_t EWT, uint64_t DTCtime, uint64_t ADCtime, uint32_t trigTimeOffset, std::vector &adcs) : _DetID(DetID), _EWT(EWT), _DTCtime(DTCtime), _ADCtime(ADCtime), _trigTimeOffset(trigTimeOffset), _adcs(adcs) {}; // Constructor for peak fitting + STMWaveformDigi(int16_t DetID, uint64_t EWT, uint64_t DTCtime, uint64_t ADCtime, uint32_t trigTimeOffset, double peak_fitTime1, double peak_fitTime2, double peak_sep, std::vector &adcs) : _DetID(DetID), _EWT(EWT), _DTCtime(DTCtime), _ADCtime(ADCtime), _trigTimeOffset(trigTimeOffset), _peak_fitTime1(peak_fitTime1), _peak_fitTime2(peak_fitTime2), _peak_sep(peak_sep), _adcs(adcs) {}; // Basic constructor + STMWaveformDigi(uint32_t trigTimeOffset, std::vector &adcs) : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(trigTimeOffset), _peak_fitTime1(0), _peak_fitTime2(0), _peak_sep(0), _adcs(adcs) {}; + + int16_t DetID () const { return _DetID; } + uint64_t EWT () const { return _EWT; } + uint64_t DTCtime() const { return _DTCtime; } + uint64_t ADCtime() const { return _ADCtime; } + uint32_t trigTimeOffset() const { return _trigTimeOffset; } + double peak_fitTime1 () const { return _peak_fitTime1; } + double peak_fitTime2 () const { return _peak_fitTime2; } + double peak_sep () const { return _peak_sep; } + const std::vector& adcs () const { return _adcs; } + + void set_data ( size_t n_data, int16_t const* data ) { + _adcs.resize(n_data); + std::copy(data, data+n_data, _adcs.begin()); } + private: + int16_t _DetID; + uint64_t _EWT; + uint64_t _DTCtime; + uint64_t _ADCtime; + uint32_t _trigTimeOffset; // time offset from EWT? to first ADC value [ct] + double _peak_fitTime1; // fit time of first rising edge (ns) // TODO: remove this parameter + double _peak_fitTime2; // fit time of second rising edge (ns) // TODO: remove this parameter + double _peak_sep; // separation time (ns) // TODO: remove this parameter + std::vector _adcs; // vector of ADC values for the waveform }; }; - typedef std::vector STMWaveformDigiCollection; } #endif diff --git a/STMReco/src/PlotSTMWaveformDigis_module.cc b/STMReco/src/PlotSTMWaveformDigis_module.cc index c1155e2392..bb8505e4d9 100644 --- a/STMReco/src/PlotSTMWaveformDigis_module.cc +++ b/STMReco/src/PlotSTMWaveformDigis_module.cc @@ -15,6 +15,8 @@ #include #include #include +#include + // root #include "TH1F.h" #include "TF1.h" @@ -47,7 +49,7 @@ namespace mu2e { void analyze(const art::Event& e) override; TH1F* _hist; //Hist for WaveLength - int ZeroLengthCount = 0; + int _zeroLengthCount = 0; art::InputTag _stmWaveformDigisTag; art::ProductToken _stmWaveformDigisToken; @@ -65,26 +67,36 @@ namespace mu2e { _subtractPedestal(config().subtractPedestal()), _xAxis(config().xAxis()), _verbosityLevel(config().verbosityLevel()), - _channel(STMUtils::getChannel(config().stmWaveformDigisTag())) + _channel(STMChannel::findByName("HPGe")) + //_channel(STMUtils::getChannel(config().stmWaveformDigisTag())) { } void PlotSTMWaveformDigis::beginJob(){ art::ServiceHandle tfs; - std::string X = std::string(_stmWaveformDigisTag.instance()); - std::transform(X.begin(),X.end(),X.begin(), toupper); - std::string hWaveLength_title = "Waveform Lengths for " + X + " Pulses"; - _hist = tfs->make("hWaveLength", hWaveLength_title.c_str() ,1000,0,1000); + std::string X = std::string(_stmWaveformDigisTag.instance()); //Gets instance name fromf fcl + std::transform(X.begin(),X.end(),X.begin(), toupper); //Raises uppercase of DigiTag + std::string hWaveLength_title = "Waveform Lengths for " + X + " Pulses"; //Builds title + _hist = tfs->make("hWaveLength", hWaveLength_title.c_str() ,1000,0,1000); //makes the histogram hWaveLength } void PlotSTMWaveformDigis::endJob(){ - std::cout<< " Zero length Waveforms Count = "<< ZeroLengthCount < 1){ + std::cout << " Zero length Waveforms Count = " << _zeroLengthCount << std::endl; } + } void PlotSTMWaveformDigis::analyze(const art::Event& event) { + //Boolean for whether we get a match for zsHPGe or LaBr + const std::string instance = std::string(_stmWaveformDigisTag.instance()); + const bool plotZSOffsetWaveforms = (instance == "zsHPGe" || instance == "zsLaBr");// Don't need offset waveforms for raw waveformdigis + + if (!plotZSOffsetWaveforms){ + if (_verbosityLevel >1){ std::cout << "Instance : " << instance << " , not ZS ==> No Offset Waveform will be created" << std::endl;} } + art::ServiceHandle tfs; auto waveformsHandle = event.getValidHandle(_stmWaveformDigisToken); std::stringstream histname, histtitle; @@ -95,11 +107,9 @@ namespace mu2e { std::cout << _channel.name() << " Pedestal = " << pedestal << std::endl; } - const auto nsPerCt = stmEnergyCalib.nsPerCt(_channel); - if (_verbosityLevel > 1){ - std::cout<<"size = "<size()< 1){ std::cout<<"size = "<size()<Fill(waveform.adcs().size()); //_hist was created outside so there should be no problem here - - std::stringstream histname2;//New histogram to include the offset waveform from trigTimeOffset - histname2 << histname.str() << "_offset"; Binning binning = STMUtils::getBinning(waveform, _xAxis, nsPerCt); TH1F* hWaveform = tfs->make(histname.str().c_str(), histtitle.str().c_str(), binning.nbins(),binning.low(),binning.high()); - TH1F* hWaveformOffset = tfs->make(histname2.str().c_str(),histtitle.str().c_str(),binning.nbins(),binning.low(),binning.high());//Exact copy except for name - + TH1F* hWaveformOffset = nullptr; // Standby + hWaveform->GetYaxis()->SetTitle("ADCs"); hWaveform->GetXaxis()->SetTitle("Sample Number"); - hWaveformOffset->GetYaxis()->SetTitle("ADCs"); - hWaveformOffset->GetXaxis()->SetTitle("Sample Number"); + if (plotZSOffsetWaveforms){ + //For offset waveforms -> Better organize this area + const auto zs_offset = waveform.trigTimeOffset(); //Grabs stored offset + std::stringstream histname2;//New histogram to include the offset waveform from trigTimeOffset + std::stringstream histtitle2; + histname2 << histname.str() << "_offset" << zs_offset; + histtitle2 << histtitle2.str() << instance << " , offset : " << zs_offset; + + hWaveformOffset = tfs->make( histname2.str().c_str(), histtitle.str().c_str(), binning.nbins(), binning.low()+zs_offset, binning.high()+zs_offset );//Shifting bins using offset + hWaveformOffset->GetYaxis()->SetTitle("ADCs"); + hWaveformOffset->GetXaxis()->SetTitle("Sample Number (Includes + trigtimeOffset"); + // int n_bins = hWaveformOffset->GetNbinsX(); //Grabs already contained nbins from waveform + //double xmin = hWaveformOffset->GetXaxis()->GetXmin();// gets xmin from waveform + //double xmax = hWaveformOffset->GetXaxis()->GetXmax();//gets xman from waveform + //hWaveformOffset->SetBins(n_bins, xmin + zs_offset, xmax + zs_offset);// shifts the xmin and xmax by offset, keeps numbers of bins + }//PlotZSOffset - for(size_t i_adc = 0; i_adc < waveform.adcs().size();++i_adc){ + for (size_t i_adc = 0; i_adc < waveform.adcs().size(); ++i_adc){ const auto adc = waveform.adcs().at(i_adc); auto content = adc; if (_subtractPedestal) { content -= pedestal; - } - hWaveform->SetBinContent(i_adc+1,content); - hWaveformOffset->SetBinContent(i_adc+1,content); //Exact copy - } - - //For offset waveforms -> Better organize this area - auto zs_offset = waveform.trigTimeOffset(); //Grabs stored offset - int n_bins = hWaveformOffset->GetNbinsX(); //Grabs already contained nbins from waveform - double xmin = hWaveformOffset->GetXaxis()->GetXmin();// gets xmin from waveform - double xmax = hWaveformOffset->GetXaxis()->GetXmax();//gets xman from waveform - - hWaveformOffset->SetBins(n_bins, xmin + zs_offset, xmax + zs_offset);// shifts the xmin and xmax by offset, keeps numbers of bins + } + hWaveform->SetBinContent(i_adc+1,content); + if ( plotZSOffsetWaveforms) { hWaveformOffset->SetBinContent(i_adc+1,content);} } + }//else ++count; - } - - } + }//for + }//analyzer } - DEFINE_ART_MODULE(mu2e::PlotSTMWaveformDigis) From 9f9e1d769543695ee450ce7348994940e133101d Mon Sep 17 00:00:00 2001 From: Bryan Gonzalez Date: Wed, 6 May 2026 10:00:40 -0500 Subject: [PATCH 29/29] Some small changes in STMDigisFromFragment and STMWaveformDigi.hh --- DAQ/src/STMDigisFromFragments_module.cc | 97 +++++++++++++++------- DAQ/test/inspectSTMFile.fcl | 7 +- RecoDataProducts/inc/STMWaveformDigi.hh | 53 ++++++------ STMReco/src/PlotSTMWaveformDigis_module.cc | 4 +- 4 files changed, 97 insertions(+), 64 deletions(-) diff --git a/DAQ/src/STMDigisFromFragments_module.cc b/DAQ/src/STMDigisFromFragments_module.cc index 93e7852540..56be40896b 100644 --- a/DAQ/src/STMDigisFromFragments_module.cc +++ b/DAQ/src/STMDigisFromFragments_module.cc @@ -169,7 +169,7 @@ void STMDigisFromFragments::produce(Event& event) art::Handle STMFragmentsH; event.getByLabel(_stmFragmentsTag, STMFragmentsH); - const auto STMFragments = STMFragmentsH.product(); + const auto& STMFragments = STMFragmentsH.product(); //Event Metrics @@ -200,15 +200,21 @@ void STMDigisFromFragments::produce(Event& event) uint16_t outerFragID{0}; bool eventHasHPGe{false}; bool eventHasLaBr{false}; + + //HPGe + uint16_t expectedZSLengthHPGe{0}; + uint16_t expectedZSRegionsHPGe{0}; + bool readZSinfoFromRawHeaderHPGe{false}; + + //LaBr + uint16_t expectedZSLengthLaBr{0}; + uint16_t expectedZSRegionsLaBr{0}; + bool readZSinfoFromRawHeaderLaBr{false}; //loop over outer frags - for (const auto& frag : *STMFragments) { + for (const auto& frag : *STMFragments) { ++_totalFragments; //Increment Total Frag counter - uint16_t ZSfromRaw{0}; - uint16_t expectedZSRegions{0}; - bool readRawZSinfo{false}; - outerFragID = frag.fragmentID(); if (_verbosityLevel >= 3){std::cout << "\nFrag_id : " << outerFragID << "\n";} @@ -241,9 +247,17 @@ void STMDigisFromFragments::produce(Event& event) if ( stm_frag.isRaw() ) { //Job Counter - ++_totalRaw; + ++_totalRaw; + //Conditional Job and Event Counter - if( stm_frag.isHPGe() ){ ++_totalRawHPGe ; ++localRawHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalRawLaBr ; ++localRawLaBr_frags; } + if( stm_frag.isHPGe() ){ + ++_totalRawHPGe ; + ++localRawHPGe_frags; + + } else if ( stm_frag.isLaBr() ){ + ++_totalRawLaBr ; + ++localRawLaBr_frags; + } auto payloadPtr = stm_frag.payloadBegin(); auto payloadWords = stm_frag.payloadWords(); @@ -290,15 +304,17 @@ void STMDigisFromFragments::produce(Event& event) << " , i = " << i << " @Raw\n"; } } - expectedZSRegions = stm_frag.zsRegions(); - ZSfromRaw = stm_frag.zsLength();//Stores ZS length on outside variable - readRawZSinfo = true;//Shows we were able to read the Raw header information - //Ideally only good frags get up to here + //Ideally only good frags get up to here if ( stm_frag.isHPGe() ){ + expectedZSRegionsHPGe = stm_frag.zsRegions(); + expectedZSLengthHPGe = stm_frag.zsLength(); + readZSinfoFromRawHeaderHPGe = true; + ++ _totalGoodRawHPGe; + if (_saveRawWithHeaderWaveform_HPGe){ - auto dataPtr = stm_frag.dataBegin(); + auto dataPtr = stm_frag.dataBegin();//memory check for emplace_back auto dataWords = stm_frag.dataWords(); stm_waveform.set_data(dataWords, dataPtr); raw_HPGe_header_waveform_digis->emplace_back(stm_waveform); @@ -309,7 +325,12 @@ void STMDigisFromFragments::produce(Event& event) } } else if ( stm_frag.isLaBr() ){ + expectedZSRegionsLaBr = stm_frag.zsRegions(); + expectedZSLengthLaBr = stm_frag.zsLength(); + readZSinfoFromRawHeaderLaBr = true; + ++ _totalGoodRawLaBr; + if (_saveRawWithHeaderWaveform_LaBr){ auto dataPtr = stm_frag.dataBegin(); auto dataWords = stm_frag.dataWords(); @@ -321,7 +342,8 @@ void STMDigisFromFragments::produce(Event& event) raw_LaBr_waveform_digis->emplace_back(stm_waveform); } - }//End of if CFID=103,203 + } + }//End of isRaw @@ -334,7 +356,7 @@ void STMDigisFromFragments::produce(Event& event) bool allZeros = true; //assumes all adcs are zero //Check if payload is empty - if (payloadWords == 0) { + if ( payloadWords == 0) { if (_verbosityLevel >=3){std::cout << "\nFound an empty frag, i = " << i << " @ZS\n";} ++_totalEmptyZS; if ( stm_frag.isHPGe() ){ ++_totalEmptyZSHPGe; ++emptyZSHPGe_frags; } else if ( stm_frag.isLaBr() ){ ++_totalEmptyZSLaBr; ++emptyZSLaBr_frags; } @@ -374,13 +396,20 @@ void STMDigisFromFragments::produce(Event& event) uint16_t lastZSindex = 0; //keeps track of last recorded index from header -> with respect to what? uint16_t lastLen = 0; //keeps track of last recoded length from header + + //Try the ? and : + bool readZSinfoFromRawHeader = stm_frag.isHPGe() ? readZSinfoFromRawHeaderHPGe : readZSinfoFromRawHeaderLaBr; + uint16_t expectedZSRegions = stm_frag.isHPGe() ? expectedZSRegionsHPGe : expectedZSRegionsLaBr; + uint16_t expectedZSLength = stm_frag.isHPGe() ? expectedZSLengthHPGe : expectedZSLengthLaBr; + if(_verbosityLevel >= 6){std::cout << "dataWords : " << dataWords << " dataWords%4 : " << dataWords%4 <<" @ZS" << "\n"; } + if ( stm_frag.isHPGe()){ ++_totalGoodZSHPGe;} else if(stm_frag.isLaBr()){++ _totalGoodZSLaBr;} while (dataPtr + 2 <= dataEnd){ - if ( readRawZSinfo && seg >= expectedZSRegions ) break; + if ( readZSinfoFromRawHeader && seg >= expectedZSRegions ) break; uint16_t current_zs_location = static_cast(dataPtr[0]); uint16_t current_zs_size = static_cast(dataPtr[1]); auto adc = dataPtr + 2; @@ -390,15 +419,18 @@ void STMDigisFromFragments::produce(Event& event) uint32_t trigTimeOffset = current_zs_location; std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_Size - 1 mu2e::STMWaveformDigi stm_waveform(trigTimeOffset, segADCS); //New constructore use - //emplacing - if ( stm_frag.isHPGe() && _saveZSWaveform_HPGe){ - zs_HPGe_waveform_digis->emplace_back(stm_waveform); - } else if ( stm_frag.isLaBr() && _saveZSWaveform_LaBr){ - zs_LaBr_waveform_digis->emplace_back(stm_waveform); + if ( stm_frag.isHPGe() && _saveZSWaveform_HPGe){ + std::vector segADCS(adc, adc + current_zs_size); //1D array, contains adcs to this_zs_size - 1 + zs_HPGe_waveform_digis->emplace_back(trigTimeOffset,segADCS); + } + else if ( stm_frag.isLaBr() && _saveZSWaveform_LaBr){ + std::vector segADCS(adc, adc + current_zs_size); + zs_LaBr_waveform_digis->emplace_back(trigTimeOffset,segADCS); } if (_verbosityLevel >=6){ + //A print check per segment std::cout << "Region = " << seg << " , zs_index = " << current_zs_location << " , zs_size = " << current_zs_size << " , trigTimeOffset = " << trigTimeOffset << "\n" ; @@ -422,20 +454,26 @@ void STMDigisFromFragments::produce(Event& event) } //Throw out if ZSLengthfromRaw != totalLen - if (readRawZSinfo && ZSfromRaw != totalLen){ + if (readZSinfoFromRawHeader && expectedZSLength != totalLen){ throw cet::exception("STM_UNPACKING") << "\n=== ZS Length mismatch ===\n" - << "ZS length from Raw header : " << ZSfromRaw << "\n" + << "ZS length from Raw header : " << expectedZSLength << "\n" << "ZS length calculated from file : " << totalLen << "\n" - << "Found at inner frag i : " << i <<"\n" - << "Encountered at event : " << _totalEvents <<"\n" ; + << "Found at inner frag i : " << i << "\n" + << "Encountered at event : " << _totalEvents << "\n" ; } //reset variables after ZS - readRawZSinfo = false; - ZSfromRaw = 0; - expectedZSRegions = 0; - + if (stm_frag.isHPGe()){ + readZSinfoFromRawHeaderHPGe = false; + expectedZSLengthHPGe = 0; + expectedZSRegionsHPGe = 0; + + } else if (stm_frag.isLaBr()){ + readZSinfoFromRawHeaderLaBr = false; + expectedZSLengthLaBr = 0; + expectedZSRegionsLaBr = 0; + } }//End of isZS @@ -569,7 +607,6 @@ void STMDigisFromFragments::produce(Event& event) if (_saveZSWaveform_HPGe){event.put(std::move(zs_HPGe_waveform_digis), "zsHPGe");} event.put(std::move(ph_HPGe_digis), "phHPGe"); - //LaBr if (_saveRawWithHeaderWaveform_LaBr){ event.put(std::move(raw_LaBr_header_waveform_digis), "rawWithHeaderLaBr"); } if (_saveRawWaveform_LaBr){event.put(std::move(raw_LaBr_waveform_digis), "rawLaBr");} diff --git a/DAQ/test/inspectSTMFile.fcl b/DAQ/test/inspectSTMFile.fcl index eac7bc550d..57f2fa8585 100644 --- a/DAQ/test/inspectSTMFile.fcl +++ b/DAQ/test/inspectSTMFile.fcl @@ -19,12 +19,13 @@ physics : { makeSTMDigis : { module_type : STMDigisFromFragments stmTag : "daq:ContainerSTM" - verbosityLevel : 2 + verbosityLevel : 1 saveRawWithHeaderWaveform_HPGe: false - saveRawWaveform_HPGe: true + saveRawWaveform_HPGe: false saveZSWaveform_HPGe: true + saveRawWithHeaderWaveform_LaBr: false - saveRawWaveform_LaBr: true + saveRawWaveform_LaBr: false saveZSWaveform_LaBr: true } diff --git a/RecoDataProducts/inc/STMWaveformDigi.hh b/RecoDataProducts/inc/STMWaveformDigi.hh index a4d33845b9..3c5f3fa003 100644 --- a/RecoDataProducts/inc/STMWaveformDigi.hh +++ b/RecoDataProducts/inc/STMWaveformDigi.hh @@ -16,35 +16,30 @@ namespace mu2e { class STMWaveformDigi { - public: // Initialise all variables - STMWaveformDigi() : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(0), _peak_fitTime1(0), _peak_fitTime2(0), _peak_sep(0), _adcs(std::vector()) {}; // Constructor for timing plus trig offset - STMWaveformDigi(int16_t DetID, uint64_t EWT, uint64_t DTCtime, uint64_t ADCtime, uint32_t trigTimeOffset, std::vector &adcs) : _DetID(DetID), _EWT(EWT), _DTCtime(DTCtime), _ADCtime(ADCtime), _trigTimeOffset(trigTimeOffset), _adcs(adcs) {}; // Constructor for peak fitting - STMWaveformDigi(int16_t DetID, uint64_t EWT, uint64_t DTCtime, uint64_t ADCtime, uint32_t trigTimeOffset, double peak_fitTime1, double peak_fitTime2, double peak_sep, std::vector &adcs) : _DetID(DetID), _EWT(EWT), _DTCtime(DTCtime), _ADCtime(ADCtime), _trigTimeOffset(trigTimeOffset), _peak_fitTime1(peak_fitTime1), _peak_fitTime2(peak_fitTime2), _peak_sep(peak_sep), _adcs(adcs) {}; // Basic constructor - STMWaveformDigi(uint32_t trigTimeOffset, std::vector &adcs) : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(trigTimeOffset), _peak_fitTime1(0), _peak_fitTime2(0), _peak_sep(0), _adcs(adcs) {}; - - int16_t DetID () const { return _DetID; } - uint64_t EWT () const { return _EWT; } - uint64_t DTCtime() const { return _DTCtime; } - uint64_t ADCtime() const { return _ADCtime; } - uint32_t trigTimeOffset() const { return _trigTimeOffset; } - double peak_fitTime1 () const { return _peak_fitTime1; } - double peak_fitTime2 () const { return _peak_fitTime2; } - double peak_sep () const { return _peak_sep; } - const std::vector& adcs () const { return _adcs; } - - void set_data ( size_t n_data, int16_t const* data ) { - _adcs.resize(n_data); - std::copy(data, data+n_data, _adcs.begin()); } - private: - int16_t _DetID; - uint64_t _EWT; - uint64_t _DTCtime; - uint64_t _ADCtime; - uint32_t _trigTimeOffset; // time offset from EWT? to first ADC value [ct] - double _peak_fitTime1; // fit time of first rising edge (ns) // TODO: remove this parameter - double _peak_fitTime2; // fit time of second rising edge (ns) // TODO: remove this parameter - double _peak_sep; // separation time (ns) // TODO: remove this parameter - std::vector _adcs; // vector of ADC values for the waveform }; + public: + // Initialise all variables + STMWaveformDigi() : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(0), _adcs(std::vector()) {}; + // Constructor for timing plus trig offset + STMWaveformDigi(int16_t DetID, uint64_t EWT, uint64_t DTCtime, uint64_t ADCtime, uint32_t trigTimeOffset, std::vector &adcs) : _DetID(DetID), _EWT(EWT), _DTCtime(DTCtime), _ADCtime(ADCtime), \ +_trigTimeOffset(trigTimeOffset), _adcs(adcs) {}; + // Basic constructor + STMWaveformDigi(uint32_t trigTimeOffset, std::vector &adcs) : _DetID(0), _EWT(0), _DTCtime(0), _ADCtime(0), _trigTimeOffset(trigTimeOffset), _adcs(adcs) {}; + + int16_t DetID () const { return _DetID; } + uint64_t EWT () const { return _EWT; } + uint64_t DTCtime() const { return _DTCtime; } + uint64_t ADCtime() const { return _ADCtime; } + uint32_t trigTimeOffset() const { return _trigTimeOffset; } + const std::vector& adcs () const { return _adcs; } + void set_data ( size_t n_data, int16_t const* data ) { _adcs.resize(n_data); std::copy(data, data+n_data, _adcs.begin()); } + + private: + int16_t _DetID; + uint64_t _EWT; + uint64_t _DTCtime; + uint64_t _ADCtime; + uint32_t _trigTimeOffset; // time offset from EWT? to first ADC value [ct] + std::vector _adcs; // vector of ADC values for the waveform }; typedef std::vector STMWaveformDigiCollection; } diff --git a/STMReco/src/PlotSTMWaveformDigis_module.cc b/STMReco/src/PlotSTMWaveformDigis_module.cc index bb8505e4d9..84c1556bb2 100644 --- a/STMReco/src/PlotSTMWaveformDigis_module.cc +++ b/STMReco/src/PlotSTMWaveformDigis_module.cc @@ -67,8 +67,8 @@ namespace mu2e { _subtractPedestal(config().subtractPedestal()), _xAxis(config().xAxis()), _verbosityLevel(config().verbosityLevel()), - _channel(STMChannel::findByName("HPGe")) - //_channel(STMUtils::getChannel(config().stmWaveformDigisTag())) + //_channel(STMChannel::findByName("HPGe")) + _channel(STMUtils::getChannel(config().stmWaveformDigisTag())) { }