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