• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

roclib/src_nxyter/QuickDaqStats.cxx (r4864/r3802)

Go to the documentation of this file.
00001 //============================================================================
00005 //============================================================================
00006 
00007 #include "boost/format.hpp"
00008 
00009 #include "nxyter/QuickDaqStats.h"
00010 
00011 using boost::format;
00012 
00019 //----------------------------------------------------------------------------
00021 
00022 nxyter::QuickDaqStats::QuickDaqStats() :
00023   fStats(kDimDaqStat)                       // allocate vector
00024 {
00025 }
00026 
00027 //----------------------------------------------------------------------------
00029 
00030 nxyter::QuickDaqStats::QuickDaqStats(const QuickDaqStats& obj) :
00031   fStats(obj.fStats)                        // allocate and copy vector
00032 {
00033 }
00034 
00035 //----------------------------------------------------------------------------
00036 
00037 nxyter::QuickDaqStats::~QuickDaqStats()
00038 {
00039 }
00040 
00041 //----------------------------------------------------------------------------
00043 
00044 void nxyter::QuickDaqStats::clear()
00045 {
00046   for (int i=0; i<kDimDaqStat; i++) fStats[i] = 0.;
00047 }
00048 
00049 //----------------------------------------------------------------------------
00051 
00052 void nxyter::QuickDaqStats::increment(roc::Message& msg)
00053 {
00054   int synnum;
00055   int auxnum;
00056   int nxnum;
00057 
00058   inc(kNMessage);
00059 
00060   switch(msg.getMessageType()) {
00061 
00062     case roc::MSG_NOP:
00063       inc(kNNop);
00064       break;
00065 
00066     case roc::MSG_HIT:
00067       inc(kNHit);
00068       if (msg.getNxPileup())   inc(kNHitPileup);
00069       if (msg.getNxOverflow()) inc(kNHitOverflow);
00070       nxnum = msg.getNxNumber() & 0x3;
00071       inc(kNHitNx0 + nxnum);
00072       break;
00073 
00074     case roc::MSG_EPOCH:
00075       inc(kNEpoch);
00076       if (msg.getEpochMissed()) {
00077         inc(kNEpochWithMiss);
00078         fStats[kNMissedHit] += double(msg.getEpochMissed());
00079       }
00080       break;
00081 
00082     case roc::MSG_SYNC:
00083       synnum = msg.getSyncChNum() & 0x1; // FIXME: hack to map to 0:1
00084       inc(kNSync0 + synnum);
00085       break;
00086 
00087     case roc::MSG_AUX:
00088       auxnum = msg.getAuxChNum() & 0x3;  // FIXME: hack to map to 0:3
00089       inc(kNAux0 + auxnum);
00090       if (msg.getAuxOverflow()) inc(kNAuxOverflow);
00091       break;
00092       
00093     case roc::MSG_EPOCH2:   
00094       inc(kNEpoch2);
00095       break;
00096      
00097     case roc::MSG_GET4:
00098       inc(kNGet4Hit);
00099       break;
00100 
00101     case roc::MSG_SYS:
00102       switch(msg.getSysMesType()) {
00103         case roc::SYSMSG_NX_PARITY:
00104           nxnum = msg.getNxNumber() & 0x3;
00105           inc(kNSysMesNxParErr0 + nxnum);
00106           break;
00107         case roc::SYSMSG_SYNC_PARITY:
00108           nxnum = msg.getNxNumber() & 0x1;
00109           inc(kNSysMesSyncParErr0 + nxnum);
00110           break;
00111         case roc::SYSMSG_DAQ_RESUME:
00112           inc(kNSysMesDaqRes);
00113           break;
00114         case roc::SYSMSG_FIFO_RESET:
00115           inc(kNSysMesFifoReset);
00116           break;
00117         case roc::SYSMSG_GET4_EVENT:
00118           inc(kNGet4Event);
00119           break;
00120         default:
00121           inc(kNSysMesOther);
00122           break;
00123       }
00124       break;
00125 
00126     default:
00127       inc(kNOther);
00128       break;
00129   }
00130   
00131 }
00132 
00133 //----------------------------------------------------------------------------
00135 
00136 double nxyter::QuickDaqStats::errorCount() const
00137 {
00138   double ecnt = 0.;
00139   for (int i=kNSysMesNxParErr0; i<=kNSysMesSyncParErr1; i++) {
00140     ecnt += fStats[i];
00141   }
00142   return ecnt;
00143 }
00144 
00145 //----------------------------------------------------------------------------
00147 
00152 double nxyter::QuickDaqStats::operator[](int ind) const
00153 {
00154   return (ind>=0 && ind<kDimDaqStat) ? fStats[ind] : 0.;
00155 }
00156 
00157 //----------------------------------------------------------------------------
00159 
00160 nxyter::QuickDaqStats& nxyter::QuickDaqStats::operator=(const QuickDaqStats& rhs)
00161 {
00162   if (&rhs != this) fStats = rhs.fStats;
00163   return *this;
00164 }
00165 //----------------------------------------------------------------------------
00167 
00168 nxyter::QuickDaqStats& nxyter::QuickDaqStats::operator-(const QuickDaqStats& rhs)
00169 {
00170   for (int i=0; i<kDimDaqStat; i++) fStats[i] -= rhs.fStats[i];
00171   return *this;
00172 }
00173 
00174 //----------------------------------------------------------------------------
00176 
00177 nxyter::QuickDaqStats& nxyter::QuickDaqStats::operator*(double factor)
00178 {
00179   for (int i=0; i<kDimDaqStat; i++) fStats[i] *= factor;
00180   return *this;
00181 }
00182 
00183 //----------------------------------------------------------------------------
00185 
00230 void nxyter::QuickDaqStats::print(std::ostream& os, double dtime, int lvl) const
00231 {
00232   static format fmt_stat("Stat(%|2|) %|-24|: %16.0f");
00233   static format fmt_rate("%8.2f");
00234   for (int i=0; i<kDimDaqStat; i++){
00235     bool errorcounter = (i>=kNSysMesNxParErr0) && (i<=kNSysMesSyncParErr1);
00236     bool show(false);
00237     switch (lvl) {
00238       case kPrintAll:      
00239         show = true; 
00240         break;
00241       case kPrintNonZero:  
00242         show = (i==0 || fStats[i] != 0); 
00243         break;
00244       case kPrintError:    
00245         show = errorcounter && fStats[i] != 0;
00246         break;
00247     }
00248     
00249     if (show) {
00250       os << fmt_stat % i % counterName(i) % fStats[i];
00251       if (dtime>0.) {
00252         double rate = fStats[i] / dtime;
00253         const char* unit = " Hz";
00254         if (rate >= 1000.) {
00255           rate = rate / 1000.;
00256           unit = "kHz";
00257         }
00258         os << "  " << fmt_rate % rate;
00259         os << " " << unit;
00260       }
00261       if (errorcounter && fStats[i] != 0) {
00262         os << " <== ERRORS!!";
00263       }
00264       os << std::endl;
00265     }
00266   }
00267 }
00268 
00269 //----------------------------------------------------------------------------
00271 
00272 const char* nxyter::QuickDaqStats::counterName(int ind)
00273 {
00274   switch(ind) {
00275     case kNMessage:          return "messages received";
00276     case kNNop:              return "nop messages";
00277     case kNHit:              return "nXYTER hits received";
00278     case kNHitPileup:        return "hits with pileup";
00279     case kNHitOverflow:      return "hits with overflow";
00280     case kNHitNx0:           return "hits hits on nx:0";
00281     case kNHitNx1:           return "hits hits on nx:1";
00282     case kNHitNx2:           return "hits hits on nx:2";
00283     case kNHitNx3:           return "hits hits on nx:3";
00284     case kNEpoch:            return "epoch markers";
00285     case kNEpochWithMiss:    return "epochs with missed hits";
00286     case kNMissedHit:        return "missed hits (low bound)";
00287     case kNSync0:            return "sync0 messages";
00288     case kNSync1:            return "sync1 messages";
00289     case kNAux0:             return "aux0 messages";
00290     case kNaux1:             return "aux1 messages";
00291     case kNAux2:             return "aux2 messages";
00292     case kNAux3:             return "aux3 messages";
00293     case kNAuxOverflow:      return "aux with pileup";
00294     case kNSysMesNxParErr0:  return "nx:0 parity errors";
00295     case kNSysMesNxParErr1:  return "nx:1 parity errors";
00296     case kNSysMesNxParErr2:  return "nx:2 parity errors";
00297     case kNSysMesNxParErr3:  return "nx:3 parity errors";
00298     case kNSysMesSyncParErr0:return "sync0 parity errors";
00299     case kNSysMesSyncParErr1:return "sync1 parity errors";
00300     case kNSysMesDaqRes:     return "daq resume messages";
00301     case kNSysMesFifoReset:  return "fifo reset messages";
00302     case kNSysMesOther:      return "other system messages";
00303     case kNEpoch2:           return "epoch2 markers";
00304     case kNGet4Hit:          return "Get4 hits";
00305     case kNGet4Event:        return "Get4 events";
00306     case kNOther:            return "other message types";
00307   }
00308   return "";
00309 }
00310 
00311 

Generated on Tue Dec 10 2013 04:52:23 for ROCsoft by  doxygen 1.7.1