From 654a6b1354dd51827bada86b5df9857a90123a5f Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 15:10:42 +0200 Subject: [PATCH 01/36] benchmark --- src/mclient/evbuilder.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index f4142bc..de650cc 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -911,6 +911,7 @@ int EventBuilder_Loop(EventBuilder* eb) { storage_manager.millisSinceEpochForSpeedCalculation = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } + /* storage_manager.event.id = storage_manager.event_tree->GetEntries(); prometheus_manager.SetNumberOfSignalsInEvent(storage_manager.event.size()); @@ -921,7 +922,7 @@ int EventBuilder_Loop(EventBuilder* eb) { storage_manager.Checkpoint(); prometheus_manager.UpdateOutputRootFileSize(); - +*/ storage_manager.Clear(); } } From 81d0a25476cbafccbd32fba91d6f3f3290963c33 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 15:18:52 +0200 Subject: [PATCH 02/36] read frame debug --- src/mclient/evbuilder.cpp | 50 +++------------------------------------ 1 file changed, 3 insertions(+), 47 deletions(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index de650cc..a427730 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -405,7 +405,6 @@ int EventBuilder_CheckBuffer(EventBuilder* eb, int src, void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { unsigned short* p; - int done = 0; unsigned short r0, r1, r2; unsigned short n0, n1; unsigned short cardNumber, chipNumber, daqChannel; @@ -415,13 +414,14 @@ void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { p = (unsigned short*) fr; - done = 0; + bool done = false; si = 0; unsigned int signal_id = 0; std::array signal_data = {}; while (!done) { + cout << "READ FRAME COUNTER: " << p << " / " << fr_sz << endl; // Is it a prefix for 14-bit content? if ((*p & PFX_14_BIT_CONTENT_MASK) == PFX_CARD_CHIP_CHAN_HIT_IX) { // if (sgnl.GetSignalID() >= 0 && sgnl.GetNumberOfPoints() >= fMinPoints) { fSignalEvent->AddSignal(sgnl); } @@ -491,38 +491,6 @@ void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { event.timestamp = milliseconds; } - // cout << " - Time: " << time << endl; - // Some times the end of the frame contains the header of the next event. - // Then, in the attempt to read the header of next event, we must avoid - // that it overwrites the already assigned id. In that case (id != 0), we - // do nothing, and we store the values at fLastXX variables, that we will - // use that for next event. - - /* - if (fSignalEvent->GetID() == 0) { - if (fLastEventId == 0) { - fSignalEvent->SetID(tmp); - fSignalEvent->SetTime(tStart + (2147483648 * r2 + 32768 * r1 + r0) * 2e-8); - } else { - fSignalEvent->SetID(fLastEventId); - fSignalEvent->SetTime(fLastTimeStamp); - } - } - - fLastEventId = tmp; - fLastTimeStamp = tStart + (2147483648 * r2 + 32768 * r1 + r0) * 2e-8; - - // If it is the first event we use it to define the run start time - if (fCounter == 0) { - fRunInfo->SetStartTimeStamp(fLastTimeStamp); - fCounter++; - } else { - // and we keep updating the end run time - fRunInfo->SetEndTimeStamp(fLastTimeStamp); - } - */ - // fSignalEvent->SetRunOrigin(fRunOrigin); - // fSignalEvent->SetSubRunOrigin(fSubRunOrigin); } else if ((*p & PFX_4_BIT_CONTENT_MASK) == PFX_END_OF_EVENT) { tmp = ((unsigned int) GET_EOE_SIZE(*p)) << 16; p++; @@ -541,7 +509,7 @@ void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { } p++; - done = 1; + done = true; } else if (*p == PFX_START_OF_BUILT_EVENT) { p++; } else if (*p == PFX_END_OF_BUILT_EVENT) { @@ -589,22 +557,10 @@ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { if (sharedBuffer) { SemaphoreRed(SemaphoreId); - // printf( "Event time BEFORE : %lf\n", - // ShMem_DaqInfo->timeStamp ); Frame_ToSharedMemory((void*) stdout, (void*) bu_s, (int) sz, 0x0, ShMem_DaqInfo, ShMem_Buffer, timeStart, tcm); - // cout << " -- frame to shared memory" << endl; - - // printf( "TIME START : %d\n", timeStart ); - // printf( "Event time : %lf\n", - // ShMem_DaqInfo->timeStamp ); - // ShMem_DaqInfo->timeStamp = (double) - // timeStart + ShMem_DaqInfo->timeStamp; printf( - // "Event time added : %lf\n", - // ShMem_DaqInfo->timeStamp ); printf( "-----\n"); - SemaphoreGreen(SemaphoreId); } From 085f5bd1baa8b07ce17776136e29e97a9e6f925e Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 15:24:46 +0200 Subject: [PATCH 03/36] debug --- src/mclient/evbuilder.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index a427730..04624f7 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -404,24 +404,24 @@ int EventBuilder_CheckBuffer(EventBuilder* eb, int src, } void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { - unsigned short* p; unsigned short r0, r1, r2; unsigned short n0, n1; unsigned short cardNumber, chipNumber, daqChannel; unsigned int tmp; int tmp_i[10]; - int si; + int si = 0; - p = (unsigned short*) fr; + auto* p = static_cast(fr); + + auto start = static_cast(fr); bool done = false; - si = 0; unsigned int signal_id = 0; std::array signal_data = {}; while (!done) { - cout << "READ FRAME COUNTER: " << p << " / " << fr_sz << endl; + cout << "READ FRAME COUNTER: " << (p - start) << " / " << fr_sz << endl; // Is it a prefix for 14-bit content? if ((*p & PFX_14_BIT_CONTENT_MASK) == PFX_CARD_CHIP_CHAN_HIT_IX) { // if (sgnl.GetSignalID() >= 0 && sgnl.GetNumberOfPoints() >= fMinPoints) { fSignalEvent->AddSignal(sgnl); } @@ -529,6 +529,7 @@ void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { p++; } } + cout << "READ FRAME DONE" << endl; } /******************************************************************************* From d773111f9387cfad5aa15dbae2ddee72fcdb352a Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 15:27:32 +0200 Subject: [PATCH 04/36] debug --- src/mclient/evbuilder.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index 04624f7..83acb76 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -595,14 +595,12 @@ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { } eb->byte_wr += sz; - // printf("EventBuilder_ProcessBuffer: wrote %d - // bytes to file\n", sz); } auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); if (storage_manager.IsInitialized()) { - ReadFrame((void*) bu_s, (int) sz, storage_manager.event); + // ReadFrame((void*) bu_s, (int) sz, storage_manager.event); } return (err); From 1d06ef432fdfbfee91ef20461abbd6f72a142982 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 15:32:52 +0200 Subject: [PATCH 05/36] debug --- src/mclient/evbuilder.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index 83acb76..5f40c41 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -420,6 +420,7 @@ void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { unsigned int signal_id = 0; std::array signal_data = {}; + cout << "READ FRAME START" << endl; while (!done) { cout << "READ FRAME COUNTER: " << (p - start) << " / " << fr_sz << endl; // Is it a prefix for 14-bit content? @@ -499,6 +500,7 @@ void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { // if (fElectronicsType == "SingleFeminos") endOfEvent = true; // cout << " - End of event" << endl; + cout << " - End of event" << endl; } // Is it a prefix for 0-bit content? @@ -600,7 +602,7 @@ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); if (storage_manager.IsInitialized()) { - // ReadFrame((void*) bu_s, (int) sz, storage_manager.event); + ReadFrame((void*) bu_s, (int) sz, storage_manager.event); } return (err); From d0098aed74f3414cf9ef3394313926fbf457709e Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 16:18:26 +0200 Subject: [PATCH 06/36] frame q --- src/mclient/evbuilder.cpp | 9 ++++++++- src/root/storage.cpp | 26 ++++++++++++++++++++++++++ src/root/storage.h | 8 ++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index 5f40c41..e386909 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -602,7 +602,14 @@ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); if (storage_manager.IsInitialized()) { - ReadFrame((void*) bu_s, (int) sz, storage_manager.event); + // ReadFrame((void*) bu_s, (int) sz, storage_manager.event); + + std::vector data; + data.reserve(sz); // Reserve space to avoid reallocations + std::copy(bu_s, bu_s + sz, std::back_inserter(data)); + + storage_manager.AddFrame(data); + cout << "Number of frames: " << storage_manager.GetNumberOfFrames() << endl; } return (err); diff --git a/src/root/storage.cpp b/src/root/storage.cpp index c54cb1a..8980d71 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -105,6 +105,32 @@ void StorageManager::SetOutputDirectory(const string& directory) { } } +void StorageManager::AddFrame(const vector& frame) { + lock_guard lock(frames_mutex); + frames.push(frame); + + // pop oldest frames if we have too many + while (frames.size() > 1000) { + cout << "Dropping frame" << endl; + frames.pop(); + } +} + +std::vector StorageManager::PopFrame() { + lock_guard lock(frames_mutex); + if (frames.empty()) { + return {}; + } + auto frame = frames.front(); + frames.pop(); + return frame; +} + +unsigned int StorageManager::GetNumberOfFrames() { + lock_guard lock(frames_mutex); + return frames.size(); +} + std::pair> Event::get_signal_id_data_pair(size_t index) const { unsigned short channel = signal_ids[index]; std::array data{}; diff --git a/src/root/storage.h b/src/root/storage.h index df855af..54204a4 100644 --- a/src/root/storage.h +++ b/src/root/storage.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -109,11 +110,18 @@ class StorageManager { return output_directory; } + void AddFrame(const std::vector& frame); + std::vector PopFrame(); + unsigned int GetNumberOfFrames(); + private: // make it a point in the past to force a checkpoint on the first event const std::chrono::duration checkpoint_interval = std::chrono::seconds(10); std::chrono::time_point checkpoint_last = std::chrono::system_clock::now() - checkpoint_interval; std::string output_directory; + + std::queue> frames; + std::mutex frames_mutex; }; } // namespace feminos_daq_storage From 3ee719b782b7ebd7df80bdf04dea756b22f293bd Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 16:21:33 +0200 Subject: [PATCH 07/36] avoid print --- src/mclient/evbuilder.cpp | 1 - src/root/storage.cpp | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index e386909..20fc945 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -609,7 +609,6 @@ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { std::copy(bu_s, bu_s + sz, std::back_inserter(data)); storage_manager.AddFrame(data); - cout << "Number of frames: " << storage_manager.GetNumberOfFrames() << endl; } return (err); diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 8980d71..3956dec 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -110,8 +110,7 @@ void StorageManager::AddFrame(const vector& frame) { frames.push(frame); // pop oldest frames if we have too many - while (frames.size() > 1000) { - cout << "Dropping frame" << endl; + while (frames.size() > 10000) { frames.pop(); } } From bfb72aa20728a842fe9bc08862eb664c8df3ef94 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 16:31:02 +0200 Subject: [PATCH 08/36] thread to process frames --- src/mclient/femarray.cpp | 9 ++++++--- src/root/storage.cpp | 22 ++++++++++++++++++++-- src/root/storage.h | 5 ++++- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index b6b5966..e13f3c2 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -320,14 +320,17 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << endl; - auto& manager = feminos_daq_prometheus::PrometheusManager::Instance(); + auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); - manager.SetDaqSpeedMB(daq_speed); - manager.SetDaqSpeedEvents(speed_events_per_second); + prometheusManager.SetDaqSpeedMB(daq_speed); + prometheusManager.SetDaqSpeedEvents(speed_events_per_second); // Update the new time and size of received data fa->daq_last_time = now; fa->daq_size_lst = daq_size_rcv; + + auto& storageManager = feminos_daq_storage::StorageManager::Instance(); + cout << "N Frames in Q: " << storageManager.GetNumberOfFramesInQueue() << " - In Total: " << storageManager.GetNumberOfFramesInserted() << endl; } return 0; diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 3956dec..8f85270 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -2,6 +2,7 @@ #include "storage.h" #include "prometheus.h" #include +#include using namespace std; using namespace feminos_daq_storage; @@ -76,6 +77,18 @@ void StorageManager::Initialize(const string& filename) { prometheus_manager.ExposeRootOutputFilename(filename); prometheus_manager.UpdateOutputRootFileSize(); + + // create a thread that pops frames + thread([this]() { + while (true) { + auto frame = PopFrame(); + + if (frame.empty()) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + continue; + } + } + }).detach(); } void StorageManager::SetOutputDirectory(const string& directory) { @@ -108,9 +121,10 @@ void StorageManager::SetOutputDirectory(const string& directory) { void StorageManager::AddFrame(const vector& frame) { lock_guard lock(frames_mutex); frames.push(frame); + frames_count++; // pop oldest frames if we have too many - while (frames.size() > 10000) { + while (frames.size() > 100000) { frames.pop(); } } @@ -125,7 +139,11 @@ std::vector StorageManager::PopFrame() { return frame; } -unsigned int StorageManager::GetNumberOfFrames() { +unsigned int StorageManager::GetNumberOfFramesInserted() const { + return frames_count; +} + +unsigned int StorageManager::GetNumberOfFramesInQueue() { lock_guard lock(frames_mutex); return frames.size(); } diff --git a/src/root/storage.h b/src/root/storage.h index 54204a4..e56c1cc 100644 --- a/src/root/storage.h +++ b/src/root/storage.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -112,7 +113,8 @@ class StorageManager { void AddFrame(const std::vector& frame); std::vector PopFrame(); - unsigned int GetNumberOfFrames(); + unsigned int GetNumberOfFramesInQueue(); + unsigned int GetNumberOfFramesInserted() const; private: // make it a point in the past to force a checkpoint on the first event @@ -121,6 +123,7 @@ class StorageManager { std::string output_directory; std::queue> frames; + std::atomic frames_count = 0; std::mutex frames_mutex; }; From eec7270ae1cf027e140035c4e45f1e34c956f1b8 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 16:42:45 +0200 Subject: [PATCH 09/36] process frames --- src/mclient/evbuilder.cpp | 3 +- src/root/storage.cpp | 128 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index 20fc945..b18b783 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -403,6 +403,7 @@ int EventBuilder_CheckBuffer(EventBuilder* eb, int src, return (err); } +/* void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { unsigned short r0, r1, r2; unsigned short n0, n1; @@ -533,7 +534,7 @@ void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { } cout << "READ FRAME DONE" << endl; } - +*/ /******************************************************************************* EventBuilder_ProcessBuffer *******************************************************************************/ diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 8f85270..1e6e8ec 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -1,5 +1,6 @@ #include "storage.h" +#include "frame.h" #include "prometheus.h" #include #include @@ -29,6 +30,130 @@ double StorageManager::GetSpeedEventsPerSecond() const { return 1000.0 * GetNumberOfEntries() / millis; } +void ReadFrame(const std::vector& frame_data, feminos_daq_storage::Event& event) { + unsigned short r0, r1, r2; + unsigned short n0, n1; + unsigned short cardNumber, chipNumber, daqChannel; + unsigned int tmp; + int tmp_i[10]; + int si = 0; + + auto p = const_cast(frame_data.data()); + + bool done = false; + + unsigned int signal_id = 0; + std::array signal_data = {}; + + while (!done) { + // Is it a prefix for 14-bit content? + if ((*p & PFX_14_BIT_CONTENT_MASK) == PFX_CARD_CHIP_CHAN_HIT_IX) { + // if (sgnl.GetSignalID() >= 0 && sgnl.GetNumberOfPoints() >= fMinPoints) { fSignalEvent->AddSignal(sgnl); } + + if (si > 0) { + event.add_signal(signal_id, signal_data); + } + + cardNumber = GET_CARD_IX(*p); + chipNumber = GET_CHIP_IX(*p); + daqChannel = GET_CHAN_IX(*p); + + if (daqChannel >= 0) { + daqChannel += cardNumber * 4 * 72 + chipNumber * 72; + } + + p++; + si = 0; + + signal_id = daqChannel; + } + // Is it a prefix for 12-bit content? + else if ((*p & PFX_12_BIT_CONTENT_MASK) == PFX_ADC_SAMPLE) { + r0 = GET_ADC_DATA(*p); + + signal_data[si] = r0; + + p++; + si++; + } + // Is it a prefix for 4-bit content? + else if ((*p & PFX_4_BIT_CONTENT_MASK) == PFX_START_OF_EVENT) { + // cout << " + Start of event" << endl; + r0 = GET_EVENT_TYPE(*p); + p++; + + // Time Stamp lower 16-bit + r0 = *p; + p++; + + // Time Stamp middle 16-bit + r1 = *p; + p++; + + // Time Stamp upper 16-bit + r2 = *p; + p++; + + // Set timestamp and event ID + + // Event Count lower 16-bit + n0 = *p; + p++; + + // Event Count upper 16-bit + n1 = *p; + p++; + + tmp = (((unsigned int) n1) << 16) | ((unsigned int) n0); + + // auto time = 0 + (2147483648 * r2 + 32768 * r1 + r0) * 2e-8; + + // milliseconds unix time + + if (event.timestamp == 0) { + auto milliseconds = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + event.timestamp = milliseconds; + } + + } else if ((*p & PFX_4_BIT_CONTENT_MASK) == PFX_END_OF_EVENT) { + tmp = ((unsigned int) GET_EOE_SIZE(*p)) << 16; + p++; + tmp = tmp + (unsigned int) *p; + p++; + + // if (fElectronicsType == "SingleFeminos") endOfEvent = true; + } + + // Is it a prefix for 0-bit content? + else if ((*p & PFX_0_BIT_CONTENT_MASK) == PFX_END_OF_FRAME) { + // if (sgnl.GetSignalID() >= 0 && sgnl.GetNumberOfPoints() >= fMinPoints) { fSignalEvent->AddSignal(sgnl); } + if (si > 0) { + event.add_signal(signal_id, signal_data); + } + + p++; + done = true; + } else if (*p == PFX_START_OF_BUILT_EVENT) { + p++; + } else if (*p == PFX_END_OF_BUILT_EVENT) { + p++; + } else if (*p == PFX_SOBE_SIZE) { + // Skip header + p++; + + // Built Event Size lower 16-bit + r0 = *p; + p++; + // Built Event Size upper 16-bit + r1 = *p; + p++; + tmp_i[0] = (int) ((r1 << 16) | (r0)); + } else { + p++; + } + } +} + void StorageManager::Initialize(const string& filename) { if (file != nullptr) { cerr << "StorageManager already initialized" << endl; @@ -87,6 +212,9 @@ void StorageManager::Initialize(const string& filename) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); continue; } + + ReadFrame(frame, event); + event.clear(); } }).detach(); } From e190529699c893d8418f1eb51eafc3652dbdc8e2 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:04:15 +0200 Subject: [PATCH 10/36] debug event --- src/root/storage.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 1e6e8ec..79ad4e1 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -30,7 +30,7 @@ double StorageManager::GetSpeedEventsPerSecond() const { return 1000.0 * GetNumberOfEntries() / millis; } -void ReadFrame(const std::vector& frame_data, feminos_daq_storage::Event& event) { +bool ReadFrame(const std::vector& frame_data, feminos_daq_storage::Event& event) { unsigned short r0, r1, r2; unsigned short n0, n1; unsigned short cardNumber, chipNumber, daqChannel; @@ -39,7 +39,9 @@ void ReadFrame(const std::vector& frame_data, feminos_daq_storag int si = 0; auto p = const_cast(frame_data.data()); + auto start = p; + bool end_of_event = false; bool done = false; unsigned int signal_id = 0; @@ -131,11 +133,20 @@ void ReadFrame(const std::vector& frame_data, feminos_daq_storag event.add_signal(signal_id, signal_data); } - p++; done = true; + + if (end_of_event) { + cout << "End of frame fount at " << p - start << endl; + } + + p++; + } else if (*p == PFX_START_OF_BUILT_EVENT) { + cout << "Start of built event fount at " << p - start << endl; p++; } else if (*p == PFX_END_OF_BUILT_EVENT) { + end_of_event = true; + cout << "End of event fount at " << p - start << endl; p++; } else if (*p == PFX_SOBE_SIZE) { // Skip header @@ -152,6 +163,7 @@ void ReadFrame(const std::vector& frame_data, feminos_daq_storag p++; } } + return end_of_event; } void StorageManager::Initialize(const string& filename) { @@ -203,11 +215,11 @@ void StorageManager::Initialize(const string& filename) { prometheus_manager.UpdateOutputRootFileSize(); - // create a thread that pops frames thread([this]() { while (true) { auto frame = PopFrame(); + // PopFrame should not block since it requires locking the mutex. If there are no frames in the queue, it should return an empty frame if (frame.empty()) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); continue; @@ -264,7 +276,7 @@ std::vector StorageManager::PopFrame() { } auto frame = frames.front(); frames.pop(); - return frame; + return std::move(frame); } unsigned int StorageManager::GetNumberOfFramesInserted() const { From fd739647e477c66a29e9f987f998e7b9a32cd3ba Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:18:15 +0200 Subject: [PATCH 11/36] end of built event --- src/mclient/evbuilder.cpp | 148 ++------------------------------------ src/root/storage.cpp | 24 +++++-- 2 files changed, 23 insertions(+), 149 deletions(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index b18b783..16edc03 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -403,141 +403,6 @@ int EventBuilder_CheckBuffer(EventBuilder* eb, int src, return (err); } -/* -void ReadFrame(void* fr, int fr_sz, feminos_daq_storage::Event& event) { - unsigned short r0, r1, r2; - unsigned short n0, n1; - unsigned short cardNumber, chipNumber, daqChannel; - unsigned int tmp; - int tmp_i[10]; - int si = 0; - - auto* p = static_cast(fr); - - auto start = static_cast(fr); - - bool done = false; - - unsigned int signal_id = 0; - std::array signal_data = {}; - - cout << "READ FRAME START" << endl; - while (!done) { - cout << "READ FRAME COUNTER: " << (p - start) << " / " << fr_sz << endl; - // Is it a prefix for 14-bit content? - if ((*p & PFX_14_BIT_CONTENT_MASK) == PFX_CARD_CHIP_CHAN_HIT_IX) { - // if (sgnl.GetSignalID() >= 0 && sgnl.GetNumberOfPoints() >= fMinPoints) { fSignalEvent->AddSignal(sgnl); } - - if (si > 0) { - event.add_signal(signal_id, signal_data); - } - - cardNumber = GET_CARD_IX(*p); - chipNumber = GET_CHIP_IX(*p); - daqChannel = GET_CHAN_IX(*p); - - if (daqChannel >= 0) { - daqChannel += cardNumber * 4 * 72 + chipNumber * 72; - } - - p++; - si = 0; - - signal_id = daqChannel; - } - // Is it a prefix for 12-bit content? - else if ((*p & PFX_12_BIT_CONTENT_MASK) == PFX_ADC_SAMPLE) { - r0 = GET_ADC_DATA(*p); - - signal_data[si] = r0; - - p++; - si++; - } - // Is it a prefix for 4-bit content? - else if ((*p & PFX_4_BIT_CONTENT_MASK) == PFX_START_OF_EVENT) { - // cout << " + Start of event" << endl; - r0 = GET_EVENT_TYPE(*p); - p++; - - // Time Stamp lower 16-bit - r0 = *p; - p++; - - // Time Stamp middle 16-bit - r1 = *p; - p++; - - // Time Stamp upper 16-bit - r2 = *p; - p++; - - // Set timestamp and event ID - - // Event Count lower 16-bit - n0 = *p; - p++; - - // Event Count upper 16-bit - n1 = *p; - p++; - - tmp = (((unsigned int) n1) << 16) | ((unsigned int) n0); - - // auto time = 0 + (2147483648 * r2 + 32768 * r1 + r0) * 2e-8; - - // milliseconds unix time - - if (event.timestamp == 0) { - auto milliseconds = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - event.timestamp = milliseconds; - } - - } else if ((*p & PFX_4_BIT_CONTENT_MASK) == PFX_END_OF_EVENT) { - tmp = ((unsigned int) GET_EOE_SIZE(*p)) << 16; - p++; - tmp = tmp + (unsigned int) *p; - p++; - - // if (fElectronicsType == "SingleFeminos") endOfEvent = true; - // cout << " - End of event" << endl; - cout << " - End of event" << endl; - } - - // Is it a prefix for 0-bit content? - else if ((*p & PFX_0_BIT_CONTENT_MASK) == PFX_END_OF_FRAME) { - // if (sgnl.GetSignalID() >= 0 && sgnl.GetNumberOfPoints() >= fMinPoints) { fSignalEvent->AddSignal(sgnl); } - if (si > 0) { - event.add_signal(signal_id, signal_data); - } - - p++; - done = true; - } else if (*p == PFX_START_OF_BUILT_EVENT) { - p++; - } else if (*p == PFX_END_OF_BUILT_EVENT) { - p++; - } else if (*p == PFX_SOBE_SIZE) { - // Skip header - p++; - - // Built Event Size lower 16-bit - r0 = *p; - p++; - // Built Event Size upper 16-bit - r1 = *p; - p++; - tmp_i[0] = (int) ((r1 << 16) | (r0)); - } else { - p++; - } - } - cout << "READ FRAME DONE" << endl; -} -*/ -/******************************************************************************* - EventBuilder_ProcessBuffer -*******************************************************************************/ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { int err = 0; unsigned short* bu_s; @@ -605,6 +470,7 @@ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { if (storage_manager.IsInitialized()) { // ReadFrame((void*) bu_s, (int) sz, storage_manager.event); + // Insert frame std::vector data; data.reserve(sz); // Reserve space to avoid reallocations std::copy(bu_s, bu_s + sz, std::back_inserter(data)); @@ -871,22 +737,18 @@ int EventBuilder_Loop(EventBuilder* eb) { if (storage_manager.IsInitialized()) { + // Send a special frame signaling the end of a built event + storage_manager.AddFrame({0}); + if (storage_manager.GetNumberOfEntries() == 0) { storage_manager.millisSinceEpochForSpeedCalculation = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } - /* - storage_manager.event.id = storage_manager.event_tree->GetEntries(); - prometheus_manager.SetNumberOfSignalsInEvent(storage_manager.event.size()); prometheus_manager.SetNumberOfEvents(storage_manager.event_tree->GetEntries()); - storage_manager.event_tree->Fill(); - - storage_manager.Checkpoint(); - prometheus_manager.UpdateOutputRootFileSize(); -*/ + storage_manager.Clear(); } } diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 79ad4e1..f2d3b31 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -217,16 +217,28 @@ void StorageManager::Initialize(const string& filename) { thread([this]() { while (true) { - auto frame = PopFrame(); + const auto frame = PopFrame(); - // PopFrame should not block since it requires locking the mutex. If there are no frames in the queue, it should return an empty frame if (frame.empty()) { + // PopFrame does not block since it requires locking the mutex. If there are no frames in the queue, it should return an empty frame std::this_thread::sleep_for(std::chrono::milliseconds(100)); - continue; - } + } else if (frame.size() == 1 && frame[0] == 0) { + // special frame signaling end of built event + auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); + + if (storage_manager.IsInitialized()) { + + storage_manager.event.id = storage_manager.event_tree->GetEntries(); + storage_manager.event_tree->Fill(); - ReadFrame(frame, event); - event.clear(); + storage_manager.Checkpoint(); + } + + storage_manager.Clear(); + } else { + // read frame data into event + ReadFrame(frame, event); + } } }).detach(); } From fbbc301839f4d5555e054a6a909615fab98d834f Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:25:28 +0200 Subject: [PATCH 12/36] do not overfill q --- src/mclient/evbuilder.cpp | 15 ++++++++------- src/root/storage.cpp | 6 ++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index 16edc03..c61af8b 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -37,6 +37,7 @@ and timestamps depending on event builder mode #include #include #include +#include #include "prometheus.h" #include "storage.h" @@ -732,7 +733,6 @@ int EventBuilder_Loop(EventBuilder* eb) { } else { eb->had_sobe = 0; - auto& prometheus_manager = feminos_daq_prometheus::PrometheusManager::Instance(); auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); if (storage_manager.IsInitialized()) { @@ -744,12 +744,13 @@ int EventBuilder_Loop(EventBuilder* eb) { storage_manager.millisSinceEpochForSpeedCalculation = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } - prometheus_manager.SetNumberOfSignalsInEvent(storage_manager.event.size()); - prometheus_manager.SetNumberOfEvents(storage_manager.event_tree->GetEntries()); - - prometheus_manager.UpdateOutputRootFileSize(); - - storage_manager.Clear(); + if (storage_manager.GetNumberOfFramesInQueue() > 10000) { + cout << "WARNING: Too many frames in processing queue, stopping main thread to catch up" << endl; + while (storage_manager.GetNumberOfFramesInQueue() > 1000) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + cout << "Resuming main thread" << endl; + } } } diff --git a/src/root/storage.cpp b/src/root/storage.cpp index f2d3b31..cce2baa 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -225,6 +225,7 @@ void StorageManager::Initialize(const string& filename) { } else if (frame.size() == 1 && frame[0] == 0) { // special frame signaling end of built event auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); + auto& prometheus_manager = feminos_daq_prometheus::PrometheusManager::Instance(); if (storage_manager.IsInitialized()) { @@ -232,6 +233,11 @@ void StorageManager::Initialize(const string& filename) { storage_manager.event_tree->Fill(); storage_manager.Checkpoint(); + + prometheus_manager.SetNumberOfSignalsInEvent(storage_manager.event.size()); + prometheus_manager.SetNumberOfEvents(storage_manager.event_tree->GetEntries()); + + prometheus_manager.UpdateOutputRootFileSize(); } storage_manager.Clear(); From 0a6ebe9de2e5cf9b9465efeaee2627edcdf2c196 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:35:07 +0200 Subject: [PATCH 13/36] do not allow too many frames in q --- src/mclient/evbuilder.cpp | 8 -------- src/root/storage.cpp | 7 ++++--- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index c61af8b..dc469d0 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -743,14 +743,6 @@ int EventBuilder_Loop(EventBuilder* eb) { if (storage_manager.GetNumberOfEntries() == 0) { storage_manager.millisSinceEpochForSpeedCalculation = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } - - if (storage_manager.GetNumberOfFramesInQueue() > 10000) { - cout << "WARNING: Too many frames in processing queue, stopping main thread to catch up" << endl; - while (storage_manager.GetNumberOfFramesInQueue() > 1000) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - } - cout << "Resuming main thread" << endl; - } } } diff --git a/src/root/storage.cpp b/src/root/storage.cpp index cce2baa..0d5e6a0 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -281,9 +281,10 @@ void StorageManager::AddFrame(const vector& frame) { frames.push(frame); frames_count++; - // pop oldest frames if we have too many - while (frames.size() > 100000) { - frames.pop(); + constexpr size_t max_frames = 100000; + + if (frames.size() >= max_frames) { + throw std::runtime_error("Too many frames in queue"); } } From cf9f57bcdafe89d04662537241c6931df1dc3195 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:37:36 +0200 Subject: [PATCH 14/36] less wait for frames --- src/root/storage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 0d5e6a0..585cf25 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -221,7 +221,7 @@ void StorageManager::Initialize(const string& filename) { if (frame.empty()) { // PopFrame does not block since it requires locking the mutex. If there are no frames in the queue, it should return an empty frame - std::this_thread::sleep_for(std::chrono::milliseconds(100)); + std::this_thread::sleep_for(std::chrono::milliseconds(10)); } else if (frame.size() == 1 && frame[0] == 0) { // special frame signaling end of built event auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); From da448b6b9612d7daea12ee997171afa477898cb9 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:46:10 +0200 Subject: [PATCH 15/36] frame queue usage --- src/root/storage.cpp | 6 ++++-- src/root/storage.h | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 585cf25..eb255f7 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -281,8 +281,6 @@ void StorageManager::AddFrame(const vector& frame) { frames.push(frame); frames_count++; - constexpr size_t max_frames = 100000; - if (frames.size() >= max_frames) { throw std::runtime_error("Too many frames in queue"); } @@ -307,6 +305,10 @@ unsigned int StorageManager::GetNumberOfFramesInQueue() { return frames.size(); } +double StorageManager::GetQueueUsage() { + return GetNumberOfFramesInQueue() / (double) max_frames; +} + std::pair> Event::get_signal_id_data_pair(size_t index) const { unsigned short channel = signal_ids[index]; std::array data{}; diff --git a/src/root/storage.h b/src/root/storage.h index e56c1cc..ab522e6 100644 --- a/src/root/storage.h +++ b/src/root/storage.h @@ -114,6 +114,7 @@ class StorageManager { void AddFrame(const std::vector& frame); std::vector PopFrame(); unsigned int GetNumberOfFramesInQueue(); + double GetQueueUsage(); unsigned int GetNumberOfFramesInserted() const; private: @@ -125,6 +126,7 @@ class StorageManager { std::queue> frames; std::atomic frames_count = 0; std::mutex frames_mutex; + const size_t max_frames = 500000; // this should be about 2GB when full (depends on frame size) }; } // namespace feminos_daq_storage From 3e1938be6cb8b470ebf6f2015466ee0a49010291 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:49:43 +0200 Subject: [PATCH 16/36] print queue usage --- src/mclient/femarray.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index e13f3c2..fe84db0 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -313,12 +313,15 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u const auto speed_events_per_second = feminos_daq_storage::StorageManager::Instance().GetSpeedEventsPerSecond(); const auto number_of_events = feminos_daq_storage::StorageManager::Instance().GetNumberOfEntries(); + auto& storageManager = feminos_daq_storage::StorageManager::Instance(); + const auto queueUsagePercent = storageManager.GetQueueUsage() * 100.0; + time_t now_time = time(nullptr); tm* now_tm = gmtime(&now_time); char time_str[80]; strftime(time_str, 80, "[%Y-%m-%dT%H:%M:%SZ]", now_tm); - cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << endl; + cout << std::scientific << std::setprecision(2) << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s) | Queue Usage: " << queueUsagePercent << "%" << endl; auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); @@ -328,9 +331,6 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u // Update the new time and size of received data fa->daq_last_time = now; fa->daq_size_lst = daq_size_rcv; - - auto& storageManager = feminos_daq_storage::StorageManager::Instance(); - cout << "N Frames in Q: " << storageManager.GetNumberOfFramesInQueue() << " - In Total: " << storageManager.GetNumberOfFramesInserted() << endl; } return 0; From 02601beb80b13daf7e83f9b5bba54a375fa0362b Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 17:54:08 +0200 Subject: [PATCH 17/36] cout --- src/mclient/femarray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index fe84db0..52d46ee 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -321,7 +321,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u char time_str[80]; strftime(time_str, 80, "[%Y-%m-%dT%H:%M:%SZ]", now_tm); - cout << std::scientific << std::setprecision(2) << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s) | Queue Usage: " << queueUsagePercent << "%" << endl; + cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " /s (" << daq_speed << " MB/s) | Q Fill: " << queueUsagePercent << "%" << endl; auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); From fea3cae1852f58c780158d76aaf43fc80b3b7b0b Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:02:04 +0200 Subject: [PATCH 18/36] cout --- src/mclient/femarray.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index 52d46ee..97315c7 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -321,7 +321,8 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u char time_str[80]; strftime(time_str, 80, "[%Y-%m-%dT%H:%M:%SZ]", now_tm); - cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " /s (" << daq_speed << " MB/s) | Q Fill: " << queueUsagePercent << "%" << endl; + auto q_fill_string = (queueUsagePercent > 1.0) ? " | Q Fill: " + std::to_string(queueUsagePercent) + "%" : ""; + cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " /s (" << daq_speed << " MB/s)" << q_fill_string << endl; auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); From 985b935f20d0e0854f09c64f0ea5ad81024d0c63 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:05:32 +0200 Subject: [PATCH 19/36] danger emoji --- src/mclient/femarray.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index 97315c7..2e8ef9c 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -321,8 +321,8 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u char time_str[80]; strftime(time_str, 80, "[%Y-%m-%dT%H:%M:%SZ]", now_tm); - auto q_fill_string = (queueUsagePercent > 1.0) ? " | Q Fill: " + std::to_string(queueUsagePercent) + "%" : ""; - cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " /s (" << daq_speed << " MB/s)" << q_fill_string << endl; + auto q_fill_string = (queueUsagePercent > 1.0) ? " | ⚠\uFE0F Q Fill: " + std::to_string(queueUsagePercent) + "%" : ""; + cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); From 862011ecc6331dc32edce2fa2cf0339341448c0b Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:15:54 +0200 Subject: [PATCH 20/36] flag for fast compression --- src/main.cpp | 8 +++----- src/root/storage.cpp | 8 +------- src/root/storage.h | 2 +- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e9cf209..43d3e75 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -126,8 +126,8 @@ int main(int argc, char** argv) { std::string output_file; int verbose_level = -1; std::string output_directory; - std::string root_compression_algorithm = "LZMA"; bool version_flag = false; + bool fast_compression = false; CLI::App app{"feminos-daq"}; @@ -155,9 +155,7 @@ int main(int argc, char** argv) { app.add_flag("--read-only", readOnly, "Read-only mode") ->group("General"); app.add_flag("--shared-buffer", sharedBuffer, "Store event data in a shared memory buffer")->group("General"); - app.add_option("--root-compression-algorithm", root_compression_algorithm, "Root compression algorithm. Use LZMA (default) for best compression or LZ4 for speed when the event rate very high") - ->group("File Options") - ->check(CLI::IsMember({"ZLIB", "LZMA", "LZ4"})); + app.add_flag("--fast-compression", fast_compression, "Disable maximum compression in output file to improve performance. This should only be enabled when the event rate is so high that the default compression cannot keep up. This will increase output file size")->group("File Options"); app.add_flag("--version", version_flag, "Print the version"); CLI11_PARSE(app, argc, argv); @@ -179,7 +177,7 @@ int main(int argc, char** argv) { auto& storage_manager = feminos_daq_storage::StorageManager::Instance(); storage_manager.SetOutputDirectory(output_directory); - storage_manager.compression_algorithm = root_compression_algorithm; + storage_manager.fast_compression = fast_compression; stringIpToArray(server_ip, femarray.rem_ip_beg); stringIpToArray(local_ip, femarray.loc_ip); diff --git a/src/root/storage.cpp b/src/root/storage.cpp index eb255f7..fa6530d 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -174,14 +174,8 @@ void StorageManager::Initialize(const string& filename) { file = std::make_unique(filename.c_str(), "RECREATE"); - if (compression_algorithm == "ZLIB") { - file->SetCompressionAlgorithm(ROOT::kZLIB); // good compression ratio and fast (old root default) - } else if (compression_algorithm == "LZ4") { - file->SetCompressionAlgorithm(ROOT::kLZ4); // good compression ratio and fast (new root default) - } else if (compression_algorithm == "LZMA") { + if (!fast_compression) { file->SetCompressionAlgorithm(ROOT::kLZMA); // biggest compression ratio but slowest - } else { - throw std::runtime_error("Unknown compression algorithm: " + compression_algorithm); } // file->SetCompressionLevel(9); // max compression level, but it's very slow, probably not worth it diff --git a/src/root/storage.h b/src/root/storage.h index ab522e6..e3d2a42 100644 --- a/src/root/storage.h +++ b/src/root/storage.h @@ -83,7 +83,7 @@ class StorageManager { std::unique_ptr run_tree; Event event; - std::string compression_algorithm; + bool fast_compression = false; unsigned long long run_number = 0; unsigned long long run_time_start = 0; From 4e67e8588f581b613fc8fd9f9c34429c990450e2 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:17:19 +0200 Subject: [PATCH 21/36] text --- src/mclient/femarray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index 2e8ef9c..1bebba9 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -321,7 +321,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u char time_str[80]; strftime(time_str, 80, "[%Y-%m-%dT%H:%M:%SZ]", now_tm); - auto q_fill_string = (queueUsagePercent > 1.0) ? " | ⚠\uFE0F Q Fill: " + std::to_string(queueUsagePercent) + "%" : ""; + auto q_fill_string = (queueUsagePercent > 1.0) ? " | ⚠\uFE0F Queue Fill: " + std::to_string(queueUsagePercent) + "%" : ""; cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); From 329f89e4c1271c45dd6994581d81070fb2410732 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:23:57 +0200 Subject: [PATCH 22/36] increase frame q size --- src/mclient/femarray.cpp | 10 ++++++++-- src/root/storage.h | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index 1bebba9..27bf997 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -21,7 +21,7 @@ the sequence number is also cleared at the other end - New scheme: on the first daq command, the sequence number becomes 0 after it is incremented, and the first daq command does not contain the sequence - number so that it gets cleared at the other end. Sub-sequend daq requests + number so that it gets cleared at the other end. Subsequent daq requests have a sequence number starting from 0x00 and incrementing by one unit until wrap around. The problem with the initial scheme is that after the last daq request is @@ -321,7 +321,13 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u char time_str[80]; strftime(time_str, 80, "[%Y-%m-%dT%H:%M:%SZ]", now_tm); - auto q_fill_string = (queueUsagePercent > 1.0) ? " | ⚠\uFE0F Queue Fill: " + std::to_string(queueUsagePercent) + "%" : ""; + string q_fill_string; + if (queueUsagePercent > 5.0) { + std::stringstream ss; + ss << std::fixed << std::setprecision(1) << queueUsagePercent; + q_fill_string = " | ⚠ Queue at " + ss.str() + "% ⚠"; + } + cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); diff --git a/src/root/storage.h b/src/root/storage.h index e3d2a42..05df5d0 100644 --- a/src/root/storage.h +++ b/src/root/storage.h @@ -126,7 +126,7 @@ class StorageManager { std::queue> frames; std::atomic frames_count = 0; std::mutex frames_mutex; - const size_t max_frames = 500000; // this should be about 2GB when full (depends on frame size) + const size_t max_frames = 1000000; // this should be about 2GB when full (depends on frame size) }; } // namespace feminos_daq_storage From 388747c3ae67554e9692c08311458fb172d86eab Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:37:47 +0200 Subject: [PATCH 23/36] set priority system call --- src/main.cpp | 3 +++ src/mclient/femarray.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 43d3e75..ee6f950 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -115,6 +116,8 @@ void CleanSharedMemory(int s) { } int main(int argc, char** argv) { + // Change process priority to get more out of the CPU + setpriority(PRIO_PROCESS, 0, 0); CmdFetcher_Init(&cmdfetcher); FemArray_Clear(&femarray); diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index 27bf997..9520c3e 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -325,7 +325,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u if (queueUsagePercent > 5.0) { std::stringstream ss; ss << std::fixed << std::setprecision(1) << queueUsagePercent; - q_fill_string = " | ⚠ Queue at " + ss.str() + "% ⚠"; + q_fill_string = " | ⚠ Queue at " + ss.str() + "% Capacity ⚠"; } cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; From 2a7439042d1fb4f8acec4583c478b69a6139d652 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:41:59 +0200 Subject: [PATCH 24/36] correct auto-update --- viewer/feminos-viewer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/viewer/feminos-viewer.py b/viewer/feminos-viewer.py index 0ff8162..e570ce1 100755 --- a/viewer/feminos-viewer.py +++ b/viewer/feminos-viewer.py @@ -1938,6 +1938,8 @@ def attach(self): self.plot_graph() self.auto_update_button.select() + # just selecting the button does not trigger the command! + self.on_auto_update() def load_file(self): if self.filepath is None: From 28dfc0abb988d25417c81d89713819f1b278e778 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:50:19 +0200 Subject: [PATCH 25/36] do not change process priority --- src/main.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ee6f950..bf5f98b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -116,9 +115,6 @@ void CleanSharedMemory(int s) { } int main(int argc, char** argv) { - // Change process priority to get more out of the CPU - setpriority(PRIO_PROCESS, 0, 0); - CmdFetcher_Init(&cmdfetcher); FemArray_Clear(&femarray); EventBuilder_Clear(&eventbuilder); From 9f2a1c9323ebe80b6ef0decfe557967e56da3e05 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:53:54 +0200 Subject: [PATCH 26/36] emoji --- src/mclient/femarray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index 9520c3e..c7d8f41 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -325,7 +325,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u if (queueUsagePercent > 5.0) { std::stringstream ss; ss << std::fixed << std::setprecision(1) << queueUsagePercent; - q_fill_string = " | ⚠ Queue at " + ss.str() + "% Capacity ⚠"; + q_fill_string = " | ⚠\uFE0F Queue at " + ss.str() + "% Capacity ⚠\uFE0F"; } cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; From 60a83ef779ba1d188936cbf1cb875d00a40aa9a4 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 18:56:41 +0200 Subject: [PATCH 27/36] error when opening file with less entry --- viewer/feminos-viewer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/viewer/feminos-viewer.py b/viewer/feminos-viewer.py index e570ce1..e8260d5 100755 --- a/viewer/feminos-viewer.py +++ b/viewer/feminos-viewer.py @@ -1951,7 +1951,7 @@ def load_file(self): try: self.event_tree = self.file["events"] except KeyError: - self.current_entry = 0 + self.update_entry(0) messagebox.showerror( "Error", @@ -1963,7 +1963,7 @@ def load_file(self): try: self.run_tree = self.file["run"] except KeyError: - self.current_entry = 0 + self.update_entry(0) messagebox.showerror( "Error", @@ -1984,7 +1984,7 @@ def load_file(self): ) if self.current_entry >= self.event_tree.num_entries: - self.current_entry = 0 + self.update_entry(0) def open_local_file(self): self.filepath = filedialog.askopenfilename(filetypes=[("ROOT files", "*.root")]) From 4545ba58bdf927f32c83033d40f296d38b0aa34c Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:01:38 +0200 Subject: [PATCH 28/36] space --- src/mclient/femarray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index c7d8f41..adaae6e 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -325,7 +325,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u if (queueUsagePercent > 5.0) { std::stringstream ss; ss << std::fixed << std::setprecision(1) << queueUsagePercent; - q_fill_string = " | ⚠\uFE0F Queue at " + ss.str() + "% Capacity ⚠\uFE0F"; + q_fill_string = " | ⚠\uFE0F Queue at " + ss.str() + "% Capacity ⚠\uFE0F"; } cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; From c5788da219eb83f3c386546febc1a751c88bf66b Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:04:33 +0200 Subject: [PATCH 29/36] remove space --- src/mclient/femarray.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index adaae6e..c7d8f41 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -325,7 +325,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u if (queueUsagePercent > 5.0) { std::stringstream ss; ss << std::fixed << std::setprecision(1) << queueUsagePercent; - q_fill_string = " | ⚠\uFE0F Queue at " + ss.str() + "% Capacity ⚠\uFE0F"; + q_fill_string = " | ⚠\uFE0F Queue at " + ss.str() + "% Capacity ⚠\uFE0F"; } cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; From 8b9a65b5e5411fff06b19431474dff55e0d41a41 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:22:29 +0200 Subject: [PATCH 30/36] attempt to disable aqs --- src/main.cpp | 8 +++++++- src/mclient/femarray.cpp | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bf5f98b..0a99d61 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -127,9 +127,11 @@ int main(int argc, char** argv) { std::string output_directory; bool version_flag = false; bool fast_compression = false; + bool disable_aqs = false; CLI::App app{"feminos-daq"}; + app.add_flag("--version", version_flag, "Print the version"); app.add_option("-s,--server", server_ip, "Base IP address of remote server(s) in dotted decimal") ->group("Connection Options") ->check(CLI::ValidIPV4); @@ -155,7 +157,7 @@ int main(int argc, char** argv) { ->group("General"); app.add_flag("--shared-buffer", sharedBuffer, "Store event data in a shared memory buffer")->group("General"); app.add_flag("--fast-compression", fast_compression, "Disable maximum compression in output file to improve performance. This should only be enabled when the event rate is so high that the default compression cannot keep up. This will increase output file size")->group("File Options"); - app.add_flag("--version", version_flag, "Print the version"); + app.add_flag("--disable-aqs", disable_aqs, "Do not store data in aqs format")->group("File Options"); CLI11_PARSE(app, argc, argv); @@ -271,6 +273,10 @@ int main(int argc, char** argv) { } // printf("femarray Thread_Create done\n" ); + if (disable_aqs) { + eventbuilder.savedata = 0; + } + // Create Event Builder thread eventbuilder.thread.routine = reinterpret_cast(EventBuilder_Loop); eventbuilder.thread.param = (void*) &eventbuilder; diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index c7d8f41..3d68952 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -328,7 +328,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u q_fill_string = " | ⚠\uFE0F Queue at " + ss.str() + "% Capacity ⚠\uFE0F"; } - cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entries/s (" << daq_speed << " MB/s)" << q_fill_string << endl; + cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entry/s (" << daq_speed << " MB/s)" << q_fill_string << endl; auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); From d997ca780a70f5b0f0e4f077ea12a5a64b25adc1 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:32:35 +0200 Subject: [PATCH 31/36] attempt to disable aqs --- src/main.cpp | 7 +------ src/mclient/evbuilder.cpp | 6 +++--- src/root/storage.h | 1 + 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0a99d61..ae4c603 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -179,6 +179,7 @@ int main(int argc, char** argv) { storage_manager.SetOutputDirectory(output_directory); storage_manager.fast_compression = fast_compression; + storage_manager.disable_aqs = disable_aqs; stringIpToArray(server_ip, femarray.rem_ip_beg); stringIpToArray(local_ip, femarray.loc_ip); @@ -271,11 +272,6 @@ int main(int argc, char** argv) { printf("Thread_Create failed %d\n", err); goto cleanup; } - // printf("femarray Thread_Create done\n" ); - - if (disable_aqs) { - eventbuilder.savedata = 0; - } // Create Event Builder thread eventbuilder.thread.routine = reinterpret_cast(EventBuilder_Loop); @@ -285,7 +281,6 @@ int main(int argc, char** argv) { printf("Thread_Create failed %d\n", err); goto cleanup; } - // printf("eventbuilder Thread_Create done\n" ); // Run the main loop of the command interpreter CmdFetcher_Main(&cmdfetcher); diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index dc469d0..3c6dae5 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -435,7 +435,7 @@ int EventBuilder_ProcessBuffer(EventBuilder* eb, void* bu) { } // Save data to file - if (!readOnly && eb->savedata) { + if (!readOnly && eb->savedata && !feminos_daq_storage::StorageManager::Instance().disable_aqs) { // Should we close the current file and open a new one? if ((eb->byte_wr + sz) > eb->file_max_size) { if ((err = EventBuilder_FileAction( @@ -914,7 +914,7 @@ int EventBuilder_GetBufferToRecycle(EventBuilder* eb, int EventBuilder_FileAction(EventBuilder* eb, EBFileActions action, int format) { - if (readOnly) return 0; + if (readOnly || feminos_daq_storage::StorageManager::Instance().disable_aqs) { return 0; } struct tm* now; char name[120]; @@ -974,7 +974,7 @@ int EventBuilder_FileAction(EventBuilder* eb, } // Close the current file else if (action == EBFA_CloseCurrentOpenNext) { - if (eb->fout == 0) { + if (eb->fout == nullptr) { } else { fflush(eb->fout); fclose(eb->fout); diff --git a/src/root/storage.h b/src/root/storage.h index 05df5d0..d6de90d 100644 --- a/src/root/storage.h +++ b/src/root/storage.h @@ -84,6 +84,7 @@ class StorageManager { Event event; bool fast_compression = false; + bool disable_aqs = false; unsigned long long run_number = 0; unsigned long long run_time_start = 0; From 636bde888e2f3f2d4895492f564c7848ffca9e76 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:34:38 +0200 Subject: [PATCH 32/36] attempt to disable aqs --- src/mclient/evbuilder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mclient/evbuilder.cpp b/src/mclient/evbuilder.cpp index 3c6dae5..c7d61c0 100644 --- a/src/mclient/evbuilder.cpp +++ b/src/mclient/evbuilder.cpp @@ -914,7 +914,7 @@ int EventBuilder_GetBufferToRecycle(EventBuilder* eb, int EventBuilder_FileAction(EventBuilder* eb, EBFileActions action, int format) { - if (readOnly || feminos_daq_storage::StorageManager::Instance().disable_aqs) { return 0; } + if (readOnly) { return 0; } struct tm* now; char name[120]; From d7d0c7df6bb2f2ba2600ee570c57766f3e638efa Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:42:00 +0200 Subject: [PATCH 33/36] disable aqs --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index ae4c603..e2c5a25 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -157,7 +157,7 @@ int main(int argc, char** argv) { ->group("General"); app.add_flag("--shared-buffer", sharedBuffer, "Store event data in a shared memory buffer")->group("General"); app.add_flag("--fast-compression", fast_compression, "Disable maximum compression in output file to improve performance. This should only be enabled when the event rate is so high that the default compression cannot keep up. This will increase output file size")->group("File Options"); - app.add_flag("--disable-aqs", disable_aqs, "Do not store data in aqs format")->group("File Options"); + app.add_flag("--disable-aqs", disable_aqs, "Do not store data in aqs format. NOTE: aqs files may be created anyways but they will not have data")->group("File Options"); CLI11_PARSE(app, argc, argv); From 1b237553e7695026dbe8f9b3be34d42cd96ed4a2 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:49:20 +0200 Subject: [PATCH 34/36] q level metric --- src/mclient/femarray.cpp | 13 +++++++------ src/prometheus/prometheus.cpp | 30 ++++++++++++++++++++++++++++++ src/prometheus/prometheus.h | 4 ++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/mclient/femarray.cpp b/src/mclient/femarray.cpp index 3d68952..63ea80b 100644 --- a/src/mclient/femarray.cpp +++ b/src/mclient/femarray.cpp @@ -314,7 +314,7 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u const auto number_of_events = feminos_daq_storage::StorageManager::Instance().GetNumberOfEntries(); auto& storageManager = feminos_daq_storage::StorageManager::Instance(); - const auto queueUsagePercent = storageManager.GetQueueUsage() * 100.0; + const auto queueUsage = storageManager.GetQueueUsage(); time_t now_time = time(nullptr); tm* now_tm = gmtime(&now_time); @@ -322,18 +322,19 @@ int FemArray_SendDaq(FemArray* fa, unsigned int fem_beg, unsigned int fem_end, u strftime(time_str, 80, "[%Y-%m-%dT%H:%M:%SZ]", now_tm); string q_fill_string; - if (queueUsagePercent > 5.0) { + if (queueUsage > 0.05) { std::stringstream ss; - ss << std::fixed << std::setprecision(1) << queueUsagePercent; + ss << std::fixed << std::setprecision(1) << queueUsage * 100.0; q_fill_string = " | ⚠\uFE0F Queue at " + ss.str() + "% Capacity ⚠\uFE0F"; } cout << time_str << " | # Entries: " << number_of_events << " | 🏃 Speed: " << speed_events_per_second << " entry/s (" << daq_speed << " MB/s)" << q_fill_string << endl; - auto& prometheusManager = feminos_daq_prometheus::PrometheusManager::Instance(); + auto& prometheus_manager = feminos_daq_prometheus::PrometheusManager::Instance(); - prometheusManager.SetDaqSpeedMB(daq_speed); - prometheusManager.SetDaqSpeedEvents(speed_events_per_second); + prometheus_manager.SetDaqSpeedMB(daq_speed); + prometheus_manager.SetDaqSpeedEvents(speed_events_per_second); + prometheus_manager.SetFrameQueueFillLevel(queueUsage); // Update the new time and size of received data fa->daq_last_time = now; diff --git a/src/prometheus/prometheus.cpp b/src/prometheus/prometheus.cpp index 1bcd760..29ec453 100644 --- a/src/prometheus/prometheus.cpp +++ b/src/prometheus/prometheus.cpp @@ -86,6 +86,26 @@ feminos_daq_prometheus::PrometheusManager::PrometheusManager() { {0.99, 0.02}, }); + frame_queue_fill_level_now = &BuildGauge() + .Name("frame_queue_fill_level_now") + .Help("Frame queue fill level (0 empty, 1 full)") + .Register(*registry) + .Add({}); + + frame_queue_fill_level = &BuildSummary() + .Name("frame_queue_fill_level_now") + .Help("Frame queue fill level (0 empty, 1 full)") + .Register(*registry) + .Add({}, Summary::Quantiles{ + {0.01, 0.02}, + {0.1, 0.02}, + {0.25, 0.02}, + {0.5, 0.02}, + {0.75, 0.02}, + {0.9, 0.02}, + {0.99, 0.02}, + }); + run_number = &BuildGauge() .Name("run_number") .Help("Run number") @@ -208,6 +228,16 @@ void feminos_daq_prometheus::PrometheusManager::UpdateOutputRootFileSize() { } } +void feminos_daq_prometheus::PrometheusManager::SetFrameQueueFillLevel(double fill_level) { + if (frame_queue_fill_level_now) { + daq_speed_events_per_s_now->Set(fill_level); + } + + if (frame_queue_fill_level) { + frame_queue_fill_level->Observe(fill_level); + } +} + double feminos_daq_prometheus::GetFreeDiskSpaceGigabytes(const std::string& path) { std::error_code ec; std::filesystem::space_info space = std::filesystem::space(path, ec); diff --git a/src/prometheus/prometheus.h b/src/prometheus/prometheus.h index 6afc0d5..3078d05 100644 --- a/src/prometheus/prometheus.h +++ b/src/prometheus/prometheus.h @@ -37,6 +37,8 @@ class PrometheusManager { PrometheusManager& operator=(const PrometheusManager&) = delete; + void SetFrameQueueFillLevel(double fill_level); + void SetDaqSpeedMB(double speed); void SetDaqSpeedEvents(double speed); @@ -66,11 +68,13 @@ class PrometheusManager { Gauge* number_of_events = nullptr; Gauge* daq_speed_mb_per_s_now = nullptr; Gauge* daq_speed_events_per_s_now = nullptr; + Gauge* frame_queue_fill_level_now = nullptr; Gauge* run_number = nullptr; Gauge* number_of_signals_in_last_event = nullptr; Summary* number_of_signals_in_event = nullptr; Summary* daq_speed_mb_per_s = nullptr; Summary* daq_speed_events_per_s = nullptr; + Summary* frame_queue_fill_level = nullptr; Gauge* output_root_file_size = nullptr; }; } // namespace feminos_daq_prometheus From e637b36e6267805d1251c6eb68791fcd4cf8c863 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:52:20 +0200 Subject: [PATCH 35/36] typo --- src/prometheus/prometheus.cpp | 2 +- src/prometheus/prometheus.h | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/prometheus/prometheus.cpp b/src/prometheus/prometheus.cpp index 29ec453..513bbc1 100644 --- a/src/prometheus/prometheus.cpp +++ b/src/prometheus/prometheus.cpp @@ -93,7 +93,7 @@ feminos_daq_prometheus::PrometheusManager::PrometheusManager() { .Add({}); frame_queue_fill_level = &BuildSummary() - .Name("frame_queue_fill_level_now") + .Name("frame_queue_fill_level") .Help("Frame queue fill level (0 empty, 1 full)") .Register(*registry) .Add({}, Summary::Quantiles{ diff --git a/src/prometheus/prometheus.h b/src/prometheus/prometheus.h index 3078d05..f9bb730 100644 --- a/src/prometheus/prometheus.h +++ b/src/prometheus/prometheus.h @@ -66,15 +66,20 @@ class PrometheusManager { Gauge* uptime_seconds = nullptr; Gauge* number_of_events = nullptr; + Gauge* run_number = nullptr; + Gauge* daq_speed_mb_per_s_now = nullptr; + Summary* daq_speed_mb_per_s = nullptr; + Gauge* daq_speed_events_per_s_now = nullptr; + Summary* daq_speed_events_per_s = nullptr; + Gauge* frame_queue_fill_level_now = nullptr; - Gauge* run_number = nullptr; + Summary* frame_queue_fill_level = nullptr; + Gauge* number_of_signals_in_last_event = nullptr; Summary* number_of_signals_in_event = nullptr; - Summary* daq_speed_mb_per_s = nullptr; - Summary* daq_speed_events_per_s = nullptr; - Summary* frame_queue_fill_level = nullptr; + Gauge* output_root_file_size = nullptr; }; } // namespace feminos_daq_prometheus From 7346668b627c76c095bd84eaef15c73085f006ca Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Thu, 29 Aug 2024 19:57:16 +0200 Subject: [PATCH 36/36] names --- src/prometheus/prometheus.cpp | 44 +++++++++++++++++------------------ src/prometheus/prometheus.h | 4 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/prometheus/prometheus.cpp b/src/prometheus/prometheus.cpp index 513bbc1..bc33a65 100644 --- a/src/prometheus/prometheus.cpp +++ b/src/prometheus/prometheus.cpp @@ -86,25 +86,25 @@ feminos_daq_prometheus::PrometheusManager::PrometheusManager() { {0.99, 0.02}, }); - frame_queue_fill_level_now = &BuildGauge() - .Name("frame_queue_fill_level_now") - .Help("Frame queue fill level (0 empty, 1 full)") - .Register(*registry) - .Add({}); + daq_frames_queue_fill_level_now = &BuildGauge() + .Name("daq_frames_queue_fill_level_now") + .Help("DAQ frames queue fill level (0 - empty - good, 1 - full - bad)") + .Register(*registry) + .Add({}); - frame_queue_fill_level = &BuildSummary() - .Name("frame_queue_fill_level") - .Help("Frame queue fill level (0 empty, 1 full)") - .Register(*registry) - .Add({}, Summary::Quantiles{ - {0.01, 0.02}, - {0.1, 0.02}, - {0.25, 0.02}, - {0.5, 0.02}, - {0.75, 0.02}, - {0.9, 0.02}, - {0.99, 0.02}, - }); + daq_frames_queue_fill_level = &BuildSummary() + .Name("daq_frames_queue_fill_level") + .Help("DAQ frames queue fill level (0 - empty - good, 1 - full - bad)") + .Register(*registry) + .Add({}, Summary::Quantiles{ + {0.01, 0.02}, + {0.1, 0.02}, + {0.25, 0.02}, + {0.5, 0.02}, + {0.75, 0.02}, + {0.9, 0.02}, + {0.99, 0.02}, + }); run_number = &BuildGauge() .Name("run_number") @@ -229,12 +229,12 @@ void feminos_daq_prometheus::PrometheusManager::UpdateOutputRootFileSize() { } void feminos_daq_prometheus::PrometheusManager::SetFrameQueueFillLevel(double fill_level) { - if (frame_queue_fill_level_now) { - daq_speed_events_per_s_now->Set(fill_level); + if (daq_frames_queue_fill_level_now) { + daq_frames_queue_fill_level_now->Set(fill_level); } - if (frame_queue_fill_level) { - frame_queue_fill_level->Observe(fill_level); + if (daq_frames_queue_fill_level) { + daq_frames_queue_fill_level->Observe(fill_level); } } diff --git a/src/prometheus/prometheus.h b/src/prometheus/prometheus.h index f9bb730..7dec5d4 100644 --- a/src/prometheus/prometheus.h +++ b/src/prometheus/prometheus.h @@ -74,8 +74,8 @@ class PrometheusManager { Gauge* daq_speed_events_per_s_now = nullptr; Summary* daq_speed_events_per_s = nullptr; - Gauge* frame_queue_fill_level_now = nullptr; - Summary* frame_queue_fill_level = nullptr; + Gauge* daq_frames_queue_fill_level_now = nullptr; + Summary* daq_frames_queue_fill_level = nullptr; Gauge* number_of_signals_in_last_event = nullptr; Summary* number_of_signals_in_event = nullptr;