From 4a11312f04b5ad42b285ab3d0fd73e9493ffeb54 Mon Sep 17 00:00:00 2001
From: Chao1009 <pengc2010@gmail.com>
Date: Thu, 21 Nov 2019 18:06:10 -0500
Subject: [PATCH] Add progress report in OnlineMonitor

---
 src/OnlineMonitor.cxx | 23 ++++++++++++++++-------
 src/OnlineMonitor.h   |  4 +++-
 tools/monitor_hms.cpp | 22 ++++++++++++++++++----
 3 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/src/OnlineMonitor.cxx b/src/OnlineMonitor.cxx
index f75df22..e6973fd 100644
--- a/src/OnlineMonitor.cxx
+++ b/src/OnlineMonitor.cxx
@@ -1,12 +1,19 @@
 #include "OnlineMonitor.h"
 #include "PRadETChannel.h"
+#include <csignal>
+
 
 using namespace std::chrono;
+volatile std::sig_atomic_t gSignalStatus;
+
+void signal_handler(int signal) {
+    gSignalStatus = signal;
+}
 
 
 namespace hcana {
 
-Int_t OnlineMonitor::Monitor(PRadETChannel *ch, std::chrono::seconds interval)
+Int_t OnlineMonitor::Monitor(PRadETChannel *ch, std::chrono::seconds interval, int progress)
 {
     Int_t total = 0;
     fMonitor = true;
@@ -14,18 +21,20 @@ Int_t OnlineMonitor::Monitor(PRadETChannel *ch, std::chrono::seconds interval)
 
     fBench->Begin("Total");
 
-    void (*prev_handler)(int);
-    prev_handler = signal(SIGINT, handle_sig);
+    std::signal(SIGINT, signal_handler);
 
-    while (!fMonitor) {
+    while (fMonitor) {
         system_clock::time_point start(system_clock::now());
         system_clock::time_point next(start + interval);
-        std::cout << total << "events monitor" << std::endl;
+        if (total % progress == 0) {
+            std::cout << "Received " << total << " events...\r" << std::flush;
+        }
         total += ReadOnce(ch);
+        if (gSignalStatus == SIGINT)
+            break;
         std::this_thread::sleep_until(next);
     }
-
-    signal(SIGINT, prev_handler);
+    std::cout << "Received " << total << " events..." << std::endl;
 
     if (fDoBench)
         fBench->Begin("Output");
diff --git a/src/OnlineMonitor.h b/src/OnlineMonitor.h
index 7389547..afb35c9 100644
--- a/src/OnlineMonitor.h
+++ b/src/OnlineMonitor.h
@@ -17,7 +17,9 @@ namespace hcana {
         OnlineMonitor() : THcAnalyzer() {}
         virtual ~OnlineMonitor() {}
 
-        virtual Int_t Monitor(PRadETChannel *ch, std::chrono::seconds interval = std::chrono::seconds(10));
+        virtual Int_t Monitor(PRadETChannel *ch,
+                std::chrono::seconds interval = std::chrono::seconds(10),
+                int progress = 10);
         virtual Int_t ReadOnce(PRadETChannel *ch, size_t max_events = 10000);
         Int_t ReadBuffer(uint32_t *buf);
         Int_t ProcOneEvent();
diff --git a/tools/monitor_hms.cpp b/tools/monitor_hms.cpp
index 830263e..0d7c798 100644
--- a/tools/monitor_hms.cpp
+++ b/tools/monitor_hms.cpp
@@ -40,6 +40,8 @@ using namespace std;
 #include "ConfigOption.h"
 #include "PRadETChannel.h"
 
+#define DBASE "/u/home/cpeng/ANL/hallc_replay"
+
 
 int monitor(PRadETChannel *ch, int interval, const bool do_all = false, const bool do_coin = false);
 
@@ -124,18 +126,18 @@ int monitor(PRadETChannel *ch, int interval, const bool do_all, const bool do_co
   // Load global parameters
   gHcParms->Define("gen_run_number", "Run Number", RunNumber);
   gHcParms->AddString("g_ctp_database_filename",
-                      do_coin ? "DBASE/COIN/standard.database" : "DBASE/HMS/standard.database");
+                      do_coin ? DBASE"DBASE/COIN/standard.database" : DBASE"DBASE/HMS/standard.database");
   gHcParms->Load(gHcParms->GetString("g_ctp_database_filename"), RunNumber);
   gHcParms->Load(gHcParms->GetString("g_ctp_parm_filename"));
   gHcParms->Load(gHcParms->GetString("g_ctp_kinematics_filename"), RunNumber);
   // Load parameters for HMS trigger configuration
-  gHcParms->Load("PARAM/TRIG/thms.param");
+  gHcParms->Load(DBASE"PARAM/TRIG/thms.param");
   // Load fadc debug parameters
-  gHcParms->Load("PARAM/HMS/GEN/p_fadc_debug.param");
+  gHcParms->Load(DBASE"PARAM/HMS/GEN/p_fadc_debug.param");
 
   // Load the Hall C detector map
   gHcDetectorMap = new THcDetectorMap();
-  gHcDetectorMap->Load("MAPS/HMS/DETEC/STACK/hms_stack.map");
+  gHcDetectorMap->Load(DBASE"MAPS/HMS/DETEC/STACK/hms_stack.map");
 
   // ===========================================================================
   // Experimental apparatus
@@ -249,6 +251,18 @@ int monitor(PRadETChannel *ch, int interval, const bool do_all, const bool do_co
   analyzer->SetCountMode(2);  // 0 = counter is # of physics triggers
                               // 1 = counter is # of all decode reads
                               // 2 = counter is event number
+  // Define the run(s) that we want to analyze.
+  // We just set up one, but this could be many.
+  THcRun* run = new THcRun;
+
+  // Set to read in Hall C run database parameters
+  run->SetRunParamClass("THcRunParameters");
+
+  // Eventually need to learn to skip over, or properly analyze the pedestal events
+  run->SetEventRange(0, -1);    // Physics Event number, does not include scaler or control events.
+  run->SetNscan(1);
+  run->SetDataRequired(0x7);
+  run->Print();
 
   analyzer->SetEvent(event);
   // Set EPICS event type
-- 
GitLab