CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DQM/CSCMonitorModule/src/CSCDQM_EventProcessor_processDDU.cc

Go to the documentation of this file.
00001 /*
00002  * =====================================================================================
00003  *
00004  *       Filename:  EventProcessor.cc
00005  *
00006  *    Description:  EventProcessor Object
00007  *
00008  *        Version:  1.0
00009  *        Created:  10/03/2008 10:47:11 AM
00010  *       Revision:  none
00011  *       Compiler:  gcc
00012  *
00013  *         Author:  Valdas Rapsevicius (VR), Valdas.Rapsevicius@cern.ch
00014  *        Company:  CERN, CH
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; // Get status if Close L1As bit
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     // if (!fFirstEvent) {
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; // Only 15 inputs for DDU
00117     csc_warning_state    = dduTrailer.dmb_warn()  & 0x7FFF; // Only 15 inputs for DDU
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); // Any Input
00186       } else {
00187         mo->Fill(dduID, 0); // No errors
00188       }
00189     }
00190   
00191     if (getEMUHisto(h::EMU_ALL_DDUS_INPUTS_WARNINGS, mo)) {
00192       if (csc_warning_state > 0) {
00193         mo->Fill(dduID, 1); // Any Input
00194       } else { 
00195         mo->Fill(dduID, 0); // No errors
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; // Ignore No Good DMB CRC bit of no DMB is present
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); // Any Error
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); // No Errors
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     // fFirstEvent = false;
00260 
00262     fNotFirstEvent[dduID] = true;
00263   
00264   }
00265   
00266 }