00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "DQM/CSCMonitorModule/interface/CSCDQM_EventProcessor.h"
00020
00021 namespace cscdqm {
00022
00027 void EventProcessor::processDDU(const CSCDDUEventData& dduData, const CSCDCCExaminer& binChecker) {
00028
00029 CSCDDUHeader dduHeader = dduData.header();
00030 CSCDDUTrailer dduTrailer = dduData.trailer();
00031 if (!dduTrailer.check()) {
00033 return;
00034 }
00035
00037 int dduID = dduHeader.source_id() & 0xFF;
00038
00039 MonitorObject* mo = 0;
00040
00041 if (getEMUHisto(h::EMU_ALL_DDUS_IN_READOUT, mo)) {
00042 mo->Fill(dduID);
00043 }
00044
00045 std::string dduTag = DDUHistoDef::getPath(dduID);
00046
00047 if (getDDUHisto(h::DDU_BUFFER_SIZE, dduID, mo)) mo->Fill(dduData.size());
00048
00050 int trl_word_count = 0;
00051 trl_word_count = dduTrailer.wordcount();
00052 if (getDDUHisto(h::DDU_WORD_COUNT, dduID, mo)) mo->Fill(trl_word_count );
00053
00056 if (trl_word_count > 0) {
00057 if (getEMUHisto(h::EMU_ALL_DDUS_EVENT_SIZE, mo)) {
00058 mo->Fill(dduID, log10((double)trl_word_count));
00059 }
00060 }
00061 if (getEMUHisto(h::EMU_ALL_DDUS_AVERAGE_EVENT_SIZE, mo)) {
00062 mo->Fill(dduID, trl_word_count);
00063 }
00064
00065 fCloseL1As = dduTrailer.reserved() & 0x1;
00069 BXN = dduHeader.bxnum();
00071 if (getEMUHisto(h::EMU_DDU_BXN, mo)) mo->Fill(BXN);
00072 if (getDDUHisto(h::DDU_BXN, dduID, mo)) mo->Fill(BXN);
00073
00075 int L1ANumber_previous_event = L1ANumbers[dduID];
00076 L1ANumbers[dduID] = (int)(dduHeader.lvl1num());
00077 L1ANumber = L1ANumbers[dduID];
00079 int L1A_inc = L1ANumber - L1ANumber_previous_event;
00080
00082 if ( L1A_inc < 0 ) L1A_inc = 0xFFFFFF + L1A_inc;
00083
00084
00085 if (fNotFirstEvent[dduID]) {
00086 if (getDDUHisto(h::DDU_L1A_INCREMENT, dduID, mo)) mo->Fill(L1A_inc);
00087 if (getEMUHisto(h::EMU_ALL_DDUS_L1A_INCREMENT, mo)) {
00088 if (L1A_inc > 100000){ L1A_inc = 19;}
00089 else if (L1A_inc > 30000) { L1A_inc = 18;}
00090 else if (L1A_inc > 10000) { L1A_inc = 17;}
00091 else if (L1A_inc > 3000) { L1A_inc = 16;}
00092 else if (L1A_inc > 1000) { L1A_inc = 15;}
00093 else if (L1A_inc > 300) { L1A_inc = 14;}
00094 else if (L1A_inc > 100) { L1A_inc = 13;}
00095 else if (L1A_inc > 30) { L1A_inc = 12;}
00096 else if (L1A_inc > 10) { L1A_inc = 11;}
00097 mo->Fill(dduID, L1A_inc);
00098 }
00099 }
00100
00102 int dmb_dav_header = 0;
00103 int dmb_dav_header_cnt = 0;
00104
00105 int ddu_connected_inputs= 0;
00106 int ddu_connected_inputs_cnt = 0;
00107
00108 int csc_error_state = 0;
00109 int csc_warning_state = 0;
00110
00112 int dmb_active_header = 0;
00113
00114 dmb_dav_header = dduHeader.dmb_dav();
00115 dmb_active_header = (int)(dduHeader.ncsc() & 0xF);
00116 csc_error_state = dduTrailer.dmb_full() & 0x7FFF;
00117 csc_warning_state = dduTrailer.dmb_warn() & 0x7FFF;
00118 ddu_connected_inputs = dduHeader.live_cscs();
00119
00123 double freq = 0;
00124 for (int i = 0; i < 15; ++i) {
00125 if ((dmb_dav_header >> i) & 0x1) {
00126 dmb_dav_header_cnt++;
00127 if (getDDUHisto(h::DDU_DMB_DAV_HEADER_OCCUPANCY_RATE, dduID, mo)) {
00128 mo->Fill(i + 1);
00129 freq = (100.0 * mo->GetBinContent(i + 1)) / config->getNEvents();
00130 if (getDDUHisto(h::DDU_DMB_DAV_HEADER_OCCUPANCY, dduID, mo))
00131 mo->SetBinContent(i+1,freq);
00132 }
00133 if (getEMUHisto(h::EMU_ALL_DDUS_INPUTS_WITH_DATA, mo)) {
00134 mo->Fill(dduID, i);
00135 }
00136 }
00137
00138 if( (ddu_connected_inputs >> i) & 0x1 ){
00139 ddu_connected_inputs_cnt++;
00140 if (getDDUHisto(h::DDU_DMB_CONNECTED_INPUTS_RATE, dduID, mo)) {
00141 mo->Fill(i + 1);
00142 freq = (100.0 * mo->GetBinContent(i + 1)) / config->getNEvents();
00143 if (getDDUHisto(h::DDU_DMB_CONNECTED_INPUTS, dduID, mo))
00144 mo->SetBinContent(i + 1, freq);
00145 }
00146 if (getEMUHisto(h::EMU_ALL_DDUS_LIVE_INPUTS, mo)) {
00147 mo->Fill(dduID, i);
00148 }
00149 }
00150
00151 if( (csc_error_state >> i) & 0x1 ){
00152 if (getDDUHisto(h::DDU_CSC_ERRORS_RATE, dduID, mo)) {
00153 mo->Fill(i + 1);
00154 freq = (100.0 * mo->GetBinContent(i + 1)) / config->getNEvents();
00155 if (getDDUHisto(h::DDU_CSC_ERRORS, dduID, mo))
00156 mo->SetBinContent(i + 1, freq);
00157 }
00158 if (getEMUHisto(h::EMU_ALL_DDUS_INPUTS_ERRORS, mo)) {
00159 mo->Fill(dduID, i + 2);
00160 }
00161 }
00162
00163 if((csc_warning_state >> i) & 0x1 ){
00164 if (getDDUHisto(h::DDU_CSC_WARNINGS_RATE, dduID, mo)) {
00165 mo->Fill(i + 1);
00166 freq = (100.0 * mo->GetBinContent(i + 1)) / config->getNEvents();
00167 if (getDDUHisto(h::DDU_CSC_WARNINGS, dduID, mo)) mo->SetBinContent(i + 1, freq);
00168 }
00169 if (getEMUHisto(h::EMU_ALL_DDUS_INPUTS_WARNINGS, mo)) {
00170 mo->Fill(dduID, i + 2);
00171 }
00172 }
00173 }
00174
00175 if (getEMUHisto(h::EMU_ALL_DDUS_AVERAGE_LIVE_INPUTS, mo)) {
00176 mo->Fill(dduID, ddu_connected_inputs_cnt);
00177 }
00178
00179 if (getEMUHisto(h::EMU_ALL_DDUS_AVERAGE_INPUTS_WITH_DATA, mo)) {
00180 mo->Fill(dduID, dmb_dav_header_cnt);
00181 }
00182
00183 if (getEMUHisto(h::EMU_ALL_DDUS_INPUTS_ERRORS, mo)) {
00184 if (csc_error_state > 0) {
00185 mo->Fill(dduID, 1);
00186 } else {
00187 mo->Fill(dduID, 0);
00188 }
00189 }
00190
00191 if (getEMUHisto(h::EMU_ALL_DDUS_INPUTS_WARNINGS, mo)) {
00192 if (csc_warning_state > 0) {
00193 mo->Fill(dduID, 1);
00194 } else {
00195 mo->Fill(dduID, 0);
00196 }
00197 }
00198
00199 if (getDDUHisto(h::DDU_DMB_DAV_HEADER_OCCUPANCY, dduID, mo)) mo->SetEntries(config->getNEvents());
00200 if (getDDUHisto(h::DDU_DMB_CONNECTED_INPUTS, dduID, mo)) mo->SetEntries(config->getNEvents());
00201 if (getDDUHisto(h::DDU_CSC_ERRORS, dduID, mo)) mo->SetEntries(config->getNEvents());
00202 if (getDDUHisto(h::DDU_CSC_WARNINGS, dduID, mo)) mo->SetEntries(config->getNEvents());
00203 if (getDDUHisto(h::DDU_DMB_ACTIVE_HEADER_COUNT, dduID, mo)) mo->Fill(dmb_active_header);
00204 if (getDDUHisto(h::DDU_DMB_DAV_HEADER_COUNT_VS_DMB_ACTIVE_HEADER_COUNT, dduID, mo))
00205 mo->Fill(dmb_active_header, dmb_dav_header_cnt);
00206
00208 uint32_t trl_errorstat = dduTrailer.errorstat();
00209 if (dmb_dav_header_cnt == 0) trl_errorstat &= ~0x20000000;
00211 for (int i = 0; i < 32; i++) {
00212 if ((trl_errorstat >> i) & 0x1) {
00213 if (getDDUHisto(h::DDU_TRAILER_ERRORSTAT_RATE, dduID, mo)) {
00214 mo->Fill(i);
00215 double freq = (100.0 * mo->GetBinContent(i + 1)) / config->getNEvents();
00216 if (getDDUHisto(h::DDU_TRAILER_ERRORSTAT_FREQUENCY, dduID, mo))
00217 mo->SetBinContent(i+1, freq);
00218 }
00219 if (getDDUHisto(h::DDU_TRAILER_ERRORSTAT_TABLE, dduID, mo))
00220 mo->Fill(0.,i);
00221 }
00222 }
00223 if (getEMUHisto(h::EMU_ALL_DDUS_TRAILER_ERRORS, mo)) {
00224 if (trl_errorstat) {
00225 mo->Fill(dduID, 1);
00226 for (int i = 0; i < 32; i++) {
00227 if ((trl_errorstat >> i) & 0x1) {
00228 mo->Fill(dduID, i + 2);
00229 }
00230 }
00231 } else {
00232 mo->Fill(dduID, 0);
00233 }
00234 }
00235
00236 if (getDDUHisto(h::DDU_TRAILER_ERRORSTAT_TABLE, dduID, mo)) mo->SetEntries(config->getNEvents());
00237 if (getDDUHisto(h::DDU_TRAILER_ERRORSTAT_FREQUENCY, dduID, mo)) mo->SetEntries(config->getNEvents());
00238
00239
00240 uint32_t nCSCs = 0;
00241
00243 if (config->getPROCESS_CSC()) {
00244
00245 std::vector<CSCEventData> chamberDatas;
00246 chamberDatas.clear();
00247 chamberDatas = dduData.cscData();
00248
00249 nCSCs = chamberDatas.size();
00250
00251 for(uint32_t i = 0; i < nCSCs; i++) {
00252 processCSC(chamberDatas[i], dduID, binChecker);
00253 }
00254
00255 }
00256
00257 if (getDDUHisto(h::DDU_DMB_UNPACKED_VS_DAV, dduID, mo)) mo->Fill(dmb_active_header, nCSCs);
00258
00259
00260
00262 fNotFirstEvent[dduID] = true;
00263
00264 }
00265
00266 }