6 #include "json/json.hpp" 
   36 int main(
int argc, 
char* argv[]) {
 
   39   using namespace KM3NETDAQ;
 
   48   int       statPrintInterval_s;
 
   55   int       preTriggerThreshold;
 
   61     JParser<> zap(
"Example program to test receiving of objects from ControlHost server.");
 
   63     zap[
'H'] = 
make_field(controlhost, 
"CH server (input)")         = 
"localhost";
 
   64     zap[
'L'] = 
make_field(ligier, 
"Ligier server (output)")         = 
"";
 
   68     zap[
'C'] = 
make_field(selector)         = getROOTClassSelection<JDAQTimesliceTypes_t>();
 
   69     zap[
'Q'] = 
make_field(queueLength,  
"number of timeslices of trigger queue")          = 100;
 
   70     zap[
'W'] = 
make_field(windowLength, 
"number of timeslices of trigger sliding window") = 5;
 
   71     zap[
'T'] = 
make_field(TMax_ns, 
"coincidence time window [ns]") = 10;
 
   73     zap[
'S'] = 
make_field(preTriggerThreshold, 
"muon veto multiplicity threshold") = 4;
 
   74     zap[
'V'] = 
make_field(TVeto_ns, 
"muon veto time interval") = 1000;
 
   75     zap[
's'] = 
make_field(summaryFile, 
"summary output file");
 
   76     zap[
'P'] = 
make_field(statPrintInterval_s, 
"statistics & file print interval [s]") = 30;
 
   83   catch(
const exception &error) {
 
   84     FATAL(error.what() << endl);
 
   87   if (queueLength < windowLength) {
 
   88     FATAL(
"Length of the trigger window must be smaller than the queue.");
 
   94   using namespace JSUPERNOVA;
 
  113   const int detectorSize = 
detector.size();
 
  123   typedef priority_queue<trigger_type, vector<trigger_type>, greater<trigger_type> > queue_type;
 
  125   typedef deque<trigger_type> window_type; 
 
  134   window_type trgWindow;
 
  135   rates_type  moduleRates;
 
  136   npmt_type   activeChannels;
 
  140   long int counter_live_ts = 0;
 
  141   long int counter_lost_ts = 0;
 
  167     const string outputTag = 
"SNT";
 
  173     for (
int i = 0; i != numberOfTimeouts; ) {
 
  177         data_type* timeslice = in.
next();
 
  179         DEBUG(timeslice->getDAQHeader() << endl);
 
  181         int timesliceSize = timeslice->size();
 
  187         const int r = timeslice->getRunNumber();
 
  193             NOTICE(
"RUN CHANGE" << endl);
 
  195             while (trgQueue.size() > 0) { trgQueue.pop(); }
 
  201             activeChannels.clear();
 
  219           for (JDAQSummaryslice::const_iterator summary_frame = summary->begin(); summary_frame != summary->end(); ++summary_frame) {
 
  221             int DOMID = summary_frame->getModuleID();
 
  224               moduleRates[frame_index][DOMID] += summary_frame->getRate(ipmt, 1.0/1000);
 
  227             activeChannels[frame_index] += summary_frame->countActiveChannels();
 
  235         JDataSN preTrigger(TMax_ns, preTriggerThreshold);
 
  237         preTrigger(timeslice, moduleRouter);
 
  243         trgQueue.push(trigger);
 
  249         if (trgQueue.size() >= (unsigned) queueLength) {
 
  251           while (trgWindow.size() <= (unsigned) windowLength) {
 
  253             trigger_type pending = trgQueue.top();
 
  255             if ( trgWindow.size() == 0 || pending > trgWindow.back() ) {
 
  257               trgWindow.push_back( pending );
 
  277           for (
int its = 0; its < windowLength; its++) {
 
  279             set<int> current = trgWindow[its].getModules(F_M1);
 
  281             triggeredModules.insert(current.begin(), current.end());
 
  283             cTrigger += count_if(trgWindow[its].begin(), trgWindow[its].end(), F_M1);
 
  287           mTrigger = triggeredModules.size();
 
  291           int currentFrame             = trgWindow[0].frameIndex;
 
  294           trgWindow.pop_front();
 
  302           int    activeModules =  -1;
 
  303           double detectorRate  = 0.0;
 
  305           if (!moduleRates.empty()          &&
 
  306                 moduleRates.count(currentFrame)) {
 
  311                  p != moduleRates.at(currentFrame).end(); p++ ) {
 
  313               detectorRate  += p->second;
 
  315               activeModules += (p->second > 0);
 
  320             activeModules = timesliceSize;
 
  329           jd[
"active_doms"]   = activeModules;
 
  330           jd[
"detector_rate"] = int(detectorRate);
 
  331           jd[
"run_number"]    = 
RUN;
 
  332           jd[
"frame_index"]   = currentFrame;
 
  334           jd[
"trigger_level"] = cTrigger;
 
  335           jd[
"trigger_ndoms"] = mTrigger;
 
  336           jd[
"active_pmts"]   = activeChannels[currentFrame];
 
  338           string msg = jd.dump();
 
  350           if ( (counter_live_ts % ((
int)(statPrintInterval_s / frameTime_s)) == 0 ) ) {
 
  352             double livetime = counter_live_ts * frameTime_s;
 
  358             NOTICE(
"=> discarded out-of-order timeslices = " << counter_lost_ts << endl);          
 
  360             if (summaryFile != 
"") {
 
  361               ofstream of(summaryFile.c_str());
 
  369           NOTICE(
"Filling trigger queue: " << trgQueue.size() << 
"/" << queueLength << 
'\r'); 
 
  374         NOTICE(
"timeout " << setw(3) << i << endl);
 
Utility class to parse command line options. 
 
ROOT TTree parameter settings. 
 
int MyId(const std::string &nick_name)
Identify. 
 
virtual const pointer_type & next()
Get next element. 
 
Auxiliary class to select ROOT class based on class name. 
 
Router for direct addressing of module data in detector data structure. 
 
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
 
Data structure for UTC time. 
 
Data structure for detector geometry and calibration. 
 
int getFrameIndex() const 
Get frame index. 
 
string toSummaryFile()
put statistics into printable form outputs trigger level - rate - error 
 
Auxiliary class for time values. 
 
void setDAQLongprint(const bool option)
Set DAQ print option. 
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
string toString()
put statistics into printable form outputs trigger level - rate - error 
 
SN trigger statistics, the information is stored in the form of a count as a function of the trigger ...
 
double getFrameTime()
Get frame time duration. 
 
then rm i $OUTPUT_FILE fi let RUN
 
Auxiliary class to apply the supernova trigger to SN data. 
 
void load(const JString &file_name, JDetector &detector)
Load detector from input file. 
 
SN filter based on multiplicity selection optional suppression of multi-module coincidences WARNING: ...
 
Timeslice data structure for SN data. 
 
General purpose messaging. 
 
Object iteration through ControlHost. 
 
Auxiliary class to build the supernova trigger dataset. 
 
Normalisation of MUPAGE events. 
 
Utility class to parse command line options. 
 
std::string to_string(const T &value)
Convert value to string. 
 
virtual bool hasNext()
Check availability of next element. 
 
void setLiveTime(const double lt)
 
virtual const char * what() const 
Get error message. 
 
static const int NUMBER_OF_PMTS
Total number of PMTs in module. 
 
int PutFullString(const JTag &tag, const std::string &buffer)
Send string. 
 
#define DEBUG(A)
Message macros. 
 
int main(int argc, char *argv[])