CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch12/src/EventFilter/CSCRawToDigi/plugins/CSCDCCUnpacker.cc

Go to the documentation of this file.
00001 #include "EventFilter/CSCRawToDigi/interface/CSCDCCUnpacker.h"
00002 
00003 //Framework stuff
00004 #include "DataFormats/Common/interface/Handle.h"
00005 #include "FWCore/Framework/interface/Event.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007 #include "FWCore/Framework/interface/ESHandle.h"
00008 #include "FWCore/Framework/interface/EventSetup.h"
00009 //FEDRawData
00010 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00011 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00012 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00013 
00014 //Digi stuff
00015 #include "DataFormats/CSCDigi/interface/CSCStripDigi.h"
00016 #include "DataFormats/CSCDigi/interface/CSCCFEBStatusDigi.h"
00017 #include "DataFormats/CSCDigi/interface/CSCWireDigi.h"
00018 #include "DataFormats/CSCDigi/interface/CSCComparatorDigi.h"
00019 #include "DataFormats/CSCDigi/interface/CSCALCTDigi.h"
00020 #include "DataFormats/CSCDigi/interface/CSCCLCTDigi.h"
00021 #include "DataFormats/CSCDigi/interface/CSCRPCDigi.h"
00022 #include "DataFormats/CSCDigi/interface/CSCCorrelatedLCTDigi.h"
00023 
00024 #include "DataFormats/CSCDigi/interface/CSCStripDigiCollection.h"
00025 #include "DataFormats/CSCDigi/interface/CSCCFEBStatusDigiCollection.h"
00026 #include "DataFormats/CSCDigi/interface/CSCWireDigiCollection.h"
00027 #include "DataFormats/CSCDigi/interface/CSCComparatorDigiCollection.h"
00028 #include "DataFormats/CSCDigi/interface/CSCALCTDigiCollection.h"
00029 #include "DataFormats/CSCDigi/interface/CSCCLCTDigiCollection.h"
00030 #include "DataFormats/CSCDigi/interface/CSCRPCDigiCollection.h"
00031 #include "DataFormats/CSCDigi/interface/CSCCorrelatedLCTDigiCollection.h"
00032 #include "DataFormats/CSCDigi/interface/CSCDMBStatusDigi.h"
00033 #include "DataFormats/CSCDigi/interface/CSCDMBStatusDigiCollection.h"
00034 #include "DataFormats/CSCDigi/interface/CSCTMBStatusDigi.h"
00035 #include "DataFormats/CSCDigi/interface/CSCTMBStatusDigiCollection.h"
00036 #include "DataFormats/CSCDigi/interface/CSCDDUStatusDigi.h"
00037 #include "DataFormats/CSCDigi/interface/CSCDDUStatusDigiCollection.h"
00038 #include "DataFormats/CSCDigi/interface/CSCDCCStatusDigi.h"
00039 #include "DataFormats/CSCDigi/interface/CSCDCCStatusDigiCollection.h"
00040 #include "DataFormats/CSCDigi/interface/CSCALCTStatusDigi.h"
00041 #include "DataFormats/CSCDigi/interface/CSCALCTStatusDigiCollection.h"
00042 #include "DataFormats/CSCDigi/interface/CSCALCTStatusDigiCollection.h"
00043 #include "DataFormats/CSCDigi/interface/CSCDCCFormatStatusDigi.h"
00044 #include "DataFormats/CSCDigi/interface/CSCDCCFormatStatusDigiCollection.h"
00045 
00046 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
00047 
00048 #include "EventFilter/CSCRawToDigi/interface/CSCDCCEventData.h"
00049 #include "EventFilter/CSCRawToDigi/interface/CSCEventData.h"
00050 #include "EventFilter/CSCRawToDigi/interface/CSCCFEBData.h"
00051 #include "EventFilter/CSCRawToDigi/interface/CSCALCTHeader.h"
00052 #include "EventFilter/CSCRawToDigi/interface/CSCAnodeData.h"
00053 #include "EventFilter/CSCRawToDigi/interface/CSCCLCTData.h"
00054 #include "EventFilter/CSCRawToDigi/interface/CSCDDUEventData.h"
00055 #include "EventFilter/CSCRawToDigi/interface/CSCTMBData.h"
00056 #include "EventFilter/CSCRawToDigi/interface/CSCTMBHeader.h"
00057 #include "EventFilter/CSCRawToDigi/interface/CSCRPCData.h"
00058 #include "EventFilter/CSCRawToDigi/interface/CSCDCCExaminer.h"
00059 #include "CondFormats/CSCObjects/interface/CSCCrateMap.h"
00060 #include "CondFormats/DataRecord/interface/CSCCrateMapRcd.h"
00061 #include <EventFilter/CSCRawToDigi/interface/CSCMonitorInterface.h>
00062 #include "FWCore/ServiceRegistry/interface/Service.h"
00063 
00064 #include <iostream>
00065 #include <sstream>
00066 #include <string>
00067 #include <iomanip>
00068 #include <cstdio>
00069 
00070 CSCDCCUnpacker::CSCDCCUnpacker(const edm::ParameterSet & pset) :
00071   numOfEvents(0) {
00072 
00073   // Tracked
00074 
00075   inputObjectsTag       = pset.getParameter<edm::InputTag>("InputObjects");
00076   useExaminer           = pset.getParameter<bool>("UseExaminer");
00077   examinerMask          = pset.getParameter<unsigned int>("ExaminerMask");
00079   useSelectiveUnpacking = pset.getParameter<bool>("UseSelectiveUnpacking");
00080   errorMask             = pset.getParameter<unsigned int>("ErrorMask");
00081   unpackStatusDigis     = pset.getParameter<bool>("UnpackStatusDigis");
00083   useFormatStatus       = pset.getParameter<bool>("UseFormatStatus");
00084 
00085   // Untracked
00086 
00087   printEventNumber      = pset.getUntrackedParameter<bool>("PrintEventNumber", true);
00088   debug                 = pset.getUntrackedParameter<bool>("Debug", false);
00089   instantiateDQM        = pset.getUntrackedParameter<bool>("runDQM", false);
00090   
00092   visualFEDInspect      = pset.getUntrackedParameter<bool>("VisualFEDInspect", false);
00093   visualFEDShort        = pset.getUntrackedParameter<bool>("VisualFEDShort", false);
00094   formatedEventDump     = pset.getUntrackedParameter<bool>("FormatedEventDump", false);
00095 
00097   SuppressZeroLCT       = pset.getUntrackedParameter<bool>("SuppressZeroLCT", true);
00098     
00099 
00100 
00101   if(instantiateDQM)  {
00102     monitor = edm::Service<CSCMonitorInterface>().operator->();
00103   }
00104   
00105   produces<CSCWireDigiCollection>("MuonCSCWireDigi");
00106   produces<CSCStripDigiCollection>("MuonCSCStripDigi");
00107   produces<CSCComparatorDigiCollection>("MuonCSCComparatorDigi");
00108   produces<CSCALCTDigiCollection>("MuonCSCALCTDigi");
00109   produces<CSCCLCTDigiCollection>("MuonCSCCLCTDigi");
00110   produces<CSCRPCDigiCollection>("MuonCSCRPCDigi");
00111   produces<CSCCorrelatedLCTDigiCollection>("MuonCSCCorrelatedLCTDigi");
00112   
00113   if (unpackStatusDigis)  {
00114     produces<CSCCFEBStatusDigiCollection>("MuonCSCCFEBStatusDigi");
00115     produces<CSCTMBStatusDigiCollection>("MuonCSCTMBStatusDigi");
00116     produces<CSCDMBStatusDigiCollection>("MuonCSCDMBStatusDigi");
00117     produces<CSCALCTStatusDigiCollection>("MuonCSCALCTStatusDigi");
00118     produces<CSCDDUStatusDigiCollection>("MuonCSCDDUStatusDigi");
00119     produces<CSCDCCStatusDigiCollection>("MuonCSCDCCStatusDigi");
00120   }
00121 
00122   if (useFormatStatus) {
00123     produces<CSCDCCFormatStatusDigiCollection>("MuonCSCDCCFormatStatusDigi");
00124   }
00125   //CSCAnodeData::setDebug(debug);
00126   CSCALCTHeader::setDebug(debug);
00127   CSCCLCTData::setDebug(debug);
00128   CSCEventData::setDebug(debug);
00129   CSCTMBData::setDebug(debug);
00130   CSCDCCEventData::setDebug(debug);
00131   CSCDDUEventData::setDebug(debug);
00132   CSCTMBHeader::setDebug(debug);
00133   CSCRPCData::setDebug(debug);
00134   CSCDDUEventData::setErrorMask(errorMask);
00135   
00136 }
00137 
00138 CSCDCCUnpacker::~CSCDCCUnpacker(){ 
00139   //fill destructor here
00140 }
00141 
00142 
00143 void CSCDCCUnpacker::produce(edm::Event & e, const edm::EventSetup& c){
00144 
00146   // Do we really have to do this every event???
00147   // ... Yes, because framework is more efficient than you are at caching :)
00148   // (But if you want to actually DO something specific WHEN the mapping changes, check out ESWatcher)
00149   edm::ESHandle<CSCCrateMap> hcrate;
00150   c.get<CSCCrateMapRcd>().get(hcrate); 
00151   const CSCCrateMap* pcrate = hcrate.product();
00152 
00153 
00154   if (printEventNumber) ++numOfEvents;
00155 
00157   edm::Handle<FEDRawDataCollection> rawdata;
00158   e.getByLabel(inputObjectsTag, rawdata);
00159     
00161   std::auto_ptr<CSCWireDigiCollection> wireProduct(new CSCWireDigiCollection);
00162   std::auto_ptr<CSCStripDigiCollection> stripProduct(new CSCStripDigiCollection);
00163   std::auto_ptr<CSCALCTDigiCollection> alctProduct(new CSCALCTDigiCollection);
00164   std::auto_ptr<CSCCLCTDigiCollection> clctProduct(new CSCCLCTDigiCollection);
00165   std::auto_ptr<CSCComparatorDigiCollection> comparatorProduct(new CSCComparatorDigiCollection);
00166   std::auto_ptr<CSCRPCDigiCollection> rpcProduct(new CSCRPCDigiCollection);
00167   std::auto_ptr<CSCCorrelatedLCTDigiCollection> corrlctProduct(new CSCCorrelatedLCTDigiCollection);
00168   std::auto_ptr<CSCCFEBStatusDigiCollection> cfebStatusProduct(new CSCCFEBStatusDigiCollection);
00169   std::auto_ptr<CSCDMBStatusDigiCollection> dmbStatusProduct(new CSCDMBStatusDigiCollection);
00170   std::auto_ptr<CSCTMBStatusDigiCollection> tmbStatusProduct(new CSCTMBStatusDigiCollection);
00171   std::auto_ptr<CSCDDUStatusDigiCollection> dduStatusProduct(new CSCDDUStatusDigiCollection);
00172   std::auto_ptr<CSCDCCStatusDigiCollection> dccStatusProduct(new CSCDCCStatusDigiCollection);
00173   std::auto_ptr<CSCALCTStatusDigiCollection> alctStatusProduct(new CSCALCTStatusDigiCollection);
00174 
00175   std::auto_ptr<CSCDCCFormatStatusDigiCollection> formatStatusProduct(new CSCDCCFormatStatusDigiCollection);
00176  
00177 
00178   // If set selective unpacking mode 
00179   // hardcoded examiner mask below to check for DCC and DDU level errors will be used first
00180   // then examinerMask for CSC level errors will be used during unpacking of each CSC block
00181   unsigned long dccBinCheckMask = 0x06080016;
00182 
00183   for (int id=FEDNumbering::MINCSCFEDID;
00184        id<=FEDNumbering::MAXCSCFEDID; ++id) { // loop over DCCs
00187     
00189     const FEDRawData& fedData = rawdata->FEDData(id);
00190     unsigned long length =  fedData.size();
00191   
00192 
00193     if (length>=32){ 
00194       CSCDCCExaminer* examiner = NULL;
00195       std::stringstream examiner_out, examiner_err;
00196       goodEvent = true;
00197       if (useExaminer) {
00198         // CSCDCCExaminer examiner;
00199         examiner = new CSCDCCExaminer();
00200         examiner->output1().redirect(examiner_out);
00201         examiner->output2().redirect(examiner_err);
00202         if( examinerMask&0x40000 ) examiner->crcCFEB(1);
00203         if( examinerMask&0x8000  ) examiner->crcTMB (1);
00204         if( examinerMask&0x0400  ) examiner->crcALCT(1);
00205         examiner->output1().show();
00206         examiner->output2().show();
00207         examiner->setMask(examinerMask);
00208         const short unsigned int *data = (short unsigned int *)fedData.data();
00209 
00210 
00211         // Event data hex dump
00212         /*short unsigned * buf = (short unsigned int *)fedData.data();
00213           std::cout <<std::endl<<length/2<<" words of data:"<<std::endl;
00214           for (int i=0;i<length/2;i++) {
00215           printf("%04x %04x %04x %04x\n",buf[i+3],buf[i+2],buf[i+1],buf[i]);
00216           i+=3;
00217           }*/
00218 
00219 
00220         int res = examiner->check(data,long(fedData.size()/2));
00221         if( res < 0 )   {
00222           goodEvent=false;
00223         } 
00224         else {    
00225           if (useSelectiveUnpacking)  goodEvent=!(examiner->errors()&dccBinCheckMask);
00226           else goodEvent=!(examiner->errors()&examinerMask);
00227         }
00228 
00229         /*
00230          std::cout << "FED" << id << " " << fedData.size() << " " << goodEvent << " " 
00231         << std::hex << examiner->errors() << std::dec << " " << status << std::endl;
00232         */
00233 
00234         // Fill Format status digis per FED
00235         // Remove examiner->errors() != 0 check if we need to put status digis for every event
00236         if (useFormatStatus && (examiner->errors() !=0))
00237           // formatStatusProduct->insertDigi(CSCDetId(1,1,1,1,1), CSCDCCFormatStatusDigi(id,examiner,dccBinCheckMask));
00238           formatStatusProduct->insertDigi(CSCDetId(1,1,1,1,1), 
00239                 CSCDCCFormatStatusDigi(id,dccBinCheckMask,
00240                         examiner->getMask(), 
00241                         examiner->errors(),
00242                         examiner->errorsDetailedDDU(),
00243                         examiner->errorsDetailed(),
00244                         examiner->payloadDetailed(),
00245                         examiner->statusDetailed()));
00246         }       
00247      
00249       if(visualFEDInspect || formatedEventDump){
00250         if (!goodEvent || formatedEventDump){          
00251           short unsigned * buf = (short unsigned int *)fedData.data();
00252           visual_raw(length/2, id,(int)e.id().run(),(int)e.id().event(), 
00253                      visualFEDShort, formatedEventDump, buf);
00254         }
00255       }
00256                   
00257       if (goodEvent) {
00259 
00260 
00261         CSCDCCExaminer * ptrExaminer = examiner;
00262         if (!useSelectiveUnpacking) ptrExaminer = NULL;
00263                 
00264         CSCDCCEventData dccData((short unsigned int *) fedData.data(), ptrExaminer);
00265 
00266         //std::cout << " DCC Size [UNPK] " << dccData.sizeInWords() << std::endl;
00267         
00268         if(instantiateDQM) monitor->process(examiner, &dccData);
00269         
00271         const std::vector<CSCDDUEventData> & dduData = dccData.dduData();
00272         
00274         CSCDetId layer(1, 1, 1, 1, 1);
00275         
00276         if (unpackStatusDigis) {
00277 
00279           short unsigned * bufForDcc = (short unsigned int *)fedData.data();
00280           
00281           //std::cout << "FED Length: " << std::dec << length/2 << 
00282           //" Trailer 2: " << std::hex << bufForDcc[length/2-4] << std::endl;
00283           
00284           dccStatusProduct->insertDigi(layer, CSCDCCStatusDigi(dccData.dccHeader().data(),
00285                                                                dccData.dccTrailer().data(),
00286                                                                examiner->errors(),
00287                                                                bufForDcc[length/2-4]));
00288          
00289         }
00290 
00291         for (unsigned int iDDU=0; iDDU<dduData.size(); ++iDDU) {  // loop over DDUs
00294           if (dduData[iDDU].trailer().errorstat()&errorMask) {
00295             LogTrace("CSCDCCUnpacker|CSCRawToDigi") << "DDU# " << iDDU << " has serious error - no digis unpacked! " <<
00296               std::hex << dduData[iDDU].trailer().errorstat();
00297             continue; // to next iteration of DDU loop
00298           }
00299                 
00300           if (unpackStatusDigis) dduStatusProduct->
00301                                    insertDigi(layer, CSCDDUStatusDigi(dduData[iDDU].header().data(),
00302                                                                       dduData[iDDU].trailer().data(),
00304                                                                       dduData[iDDU].trailer0()));
00305           
00307           const std::vector<CSCEventData> & cscData = dduData[iDDU].cscData();
00308 
00309 
00310           for (unsigned int iCSC=0; iCSC<cscData.size(); ++iCSC) { // loop over CSCs
00311 
00313             int vmecrate = cscData[iCSC].dmbHeader()->crateID();
00314             int dmb = cscData[iCSC].dmbHeader()->dmbID();
00315 
00316             int icfeb = 0;  
00317             int ilayer = 0; 
00318 
00319             if (debug)
00320               LogTrace ("CSCDCCUnpacker|CSCRawToDigi") << "crate = " << vmecrate << "; dmb = " << dmb;
00321             
00322             if ((vmecrate>=1)&&(vmecrate<=60) && (dmb>=1)&&(dmb<=10)&&(dmb!=6)) {
00323               layer = pcrate->detId(vmecrate, dmb,icfeb,ilayer );
00324             } 
00325             else{
00326               LogTrace ("CSCDCCUnpacker|CSCRawToDigi") << " detID input out of range!!! ";
00327               LogTrace ("CSCDCCUnpacker|CSCRawToDigi")
00328                 << " skipping chamber vme= " << vmecrate << " dmb= " << dmb;
00329               continue; // to next iteration of iCSC loop
00330             }
00331 
00332 
00334             int nalct = cscData[iCSC].dmbHeader()->nalct();
00335             bool goodALCT=false;
00336             //if (nalct&&(cscData[iCSC].dataPresent>>6&0x1)==1) {
00337             if (nalct&&cscData[iCSC].alctHeader()) {  
00338               if (cscData[iCSC].alctHeader()->check()){
00339                 goodALCT=true;
00340               }
00341               else {
00342                 LogTrace ("CSCDCCUnpacker|CSCRawToDigi") <<
00343                   "not storing ALCT digis; alct is bad or not present";
00344               }
00345             } else {
00346               if (debug) LogTrace ("CSCDCCUnpacker|CSCRawToDigi") << "nALCT==0 !!!";
00347             }
00348 
00350             if (goodALCT){
00351               std::vector <CSCALCTDigi>  alctDigis =
00352                 cscData[iCSC].alctHeader()->ALCTDigis();
00353                 if(SuppressZeroLCT){
00354                 std::vector<CSCALCTDigi> alctDigis_0;
00355                   for (int unsigned i=0; i<alctDigis.size(); ++i){
00356                       if(alctDigis[i].isValid())
00357                       alctDigis_0.push_back(alctDigis[i]);
00358                   }
00359                 alctProduct->put(std::make_pair(alctDigis_0.begin(), alctDigis_0.end()),layer);
00360                 }
00361                 else
00362                 alctProduct->put(std::make_pair(alctDigis.begin(), alctDigis.end()),layer);
00363             }
00364                     
00365                   
00367             int nclct = cscData[iCSC].dmbHeader()->nclct();
00368             bool goodTMB=false;
00369             //      if (nclct&&(cscData[iCSC].dataPresent>>5&0x1)==1) {
00370             if (nclct&&cscData[iCSC].tmbData()) {
00371               if (cscData[iCSC].tmbHeader()->check()){
00372                 if (cscData[iCSC].clctData()->check()) goodTMB=true; 
00373               }
00374               else {
00375                 LogTrace ("CSCDCCUnpacker|CSCRawToDigi") <<
00376                   "one of TMB checks failed! not storing TMB digis ";
00377               }
00378             }
00379             else {
00380               if (debug) LogTrace ("CSCDCCUnpacker|CSCRawToDigi") << "nCLCT==0 !!!";
00381             }
00382                       
00384             if (goodTMB) { 
00385               std::vector <CSCCorrelatedLCTDigi>  correlatedlctDigis =
00386                 cscData[iCSC].tmbHeader()->CorrelatedLCTDigis(layer.rawId());
00387                 if(SuppressZeroLCT){
00388                   std::vector<CSCCorrelatedLCTDigi> correlatedlctDigis_0;
00389                     for (int unsigned i=0; i<correlatedlctDigis.size(); ++i){
00390                       if(correlatedlctDigis[i].isValid())
00391                     correlatedlctDigis_0.push_back(correlatedlctDigis[i]);
00392                   }
00393                 corrlctProduct->put(std::make_pair(correlatedlctDigis_0.begin(),
00394                                                  correlatedlctDigis_0.end()),layer);
00395                 }
00396                 else
00397                   corrlctProduct->put(std::make_pair(correlatedlctDigis.begin(),
00398                                                  correlatedlctDigis.end()),layer);
00399                       
00400               std::vector <CSCCLCTDigi>  clctDigis =
00401                 cscData[iCSC].tmbHeader()->CLCTDigis(layer.rawId());
00402                 if(SuppressZeroLCT){
00403                   std::vector<CSCCLCTDigi> clctDigis_0;
00404                   for (int unsigned i=0; i<clctDigis.size(); ++i){
00405                     if(clctDigis[i].isValid())
00406                   clctDigis_0.push_back(clctDigis[i]);
00407                   }
00408                 clctProduct->put(std::make_pair(clctDigis_0.begin(), clctDigis_0.end()),layer);
00409                 }
00410                 else
00411                 clctProduct->put(std::make_pair(clctDigis.begin(), clctDigis.end()),layer);
00412                 
00414               if (cscData[iCSC].tmbData()->checkSize()) {
00415                 if (cscData[iCSC].tmbData()->hasRPC()) {
00416                   std::vector <CSCRPCDigi>  rpcDigis =
00417                     cscData[iCSC].tmbData()->rpcData()->digis();
00418                   rpcProduct->put(std::make_pair(rpcDigis.begin(), rpcDigis.end()),layer);
00419                 }
00420               } 
00421               else LogTrace("CSCDCCUnpacker|CSCRawToDigi") <<" TMBData check size failed!";
00422             }
00423                     
00424                   
00426             if (unpackStatusDigis) {
00427               for ( icfeb = 0; icfeb < 5; ++icfeb ) {
00428                 if ( cscData[iCSC].cfebData(icfeb) != NULL )
00429                   cfebStatusProduct->
00430                     insertDigi(layer, cscData[iCSC].cfebData(icfeb)->statusDigi());
00431               }
00433               dmbStatusProduct->insertDigi(layer, CSCDMBStatusDigi(cscData[iCSC].dmbHeader()->data(),
00434                                                                    cscData[iCSC].dmbTrailer()->data()));
00435               if (goodTMB)  tmbStatusProduct->
00436                               insertDigi(layer, CSCTMBStatusDigi(cscData[iCSC].tmbHeader()->data(),
00437                                                                  cscData[iCSC].tmbData()->tmbTrailer()->data()));
00438               if (goodALCT) alctStatusProduct->
00439                               insertDigi(layer, CSCALCTStatusDigi(cscData[iCSC].alctHeader()->data(),
00440                                                                   cscData[iCSC].alctTrailer()->data()));
00441             }
00442                 
00443 
00445             for (int ilayer = 1; ilayer <= 6; ++ilayer) {
00447               // (You have to be kidding. Line 240 in whose universe?)
00448 
00449               // Allocate all ME1/1 wire digis to ring 1
00450               layer = pcrate->detId( vmecrate, dmb, 0, ilayer );
00451 
00452               std::vector <CSCWireDigi> wireDigis =  cscData[iCSC].wireDigis(ilayer);
00453               
00454               wireProduct->put(std::make_pair(wireDigis.begin(), wireDigis.end()),layer);
00455               
00456               for ( icfeb = 0; icfeb < 5; ++icfeb ) {
00457                 layer = pcrate->detId( vmecrate, dmb, icfeb,ilayer );
00458                 if (cscData[iCSC].cfebData(icfeb)) {
00459                   std::vector<CSCStripDigi> stripDigis;
00460                   cscData[iCSC].cfebData(icfeb)->digis(layer.rawId(),stripDigis);
00461                   stripProduct->put(std::make_pair(stripDigis.begin(), 
00462                                                    stripDigis.end()),layer);
00463                 }
00464                               
00465                 if (goodTMB){
00466                   std::vector <CSCComparatorDigi>  comparatorDigis =
00467                     cscData[iCSC].clctData()->comparatorDigis(layer.rawId(), icfeb);
00468                   // Set cfeb=0, so that ME1/a and ME1/b comparators go to
00469                   // ring 1.
00470                   layer = pcrate->detId( vmecrate, dmb, 0, ilayer );
00471                   comparatorProduct->put(std::make_pair(comparatorDigis.begin(), 
00472                                                         comparatorDigis.end()),layer);
00473                 }
00474               } // end of loop over cfebs
00475             } // end of loop over layers
00476           } // end of loop over chambers
00477         } // endof loop over DDUs
00478       } // end of good event
00479       else   {
00480         LogTrace("CSCDCCUnpacker|CSCRawToDigi") <<
00481           "ERROR! Examiner rejected FED #" << id;
00482         if (examiner) {
00483           for (int i=0; i<examiner->nERRORS; ++i) {
00484             if (((examinerMask&examiner->errors())>>i)&0x1)
00485               LogTrace("CSCDCCUnpacker|CSCRawToDigi")<<examiner->errName(i);
00486           }
00487           if (debug) {
00488             LogTrace("CSCDCCUnpacker|CSCRawToDigi")
00489               << " Examiner errors:0x" << std::hex << examiner->errors()
00490               << " & 0x" << examinerMask
00491               << " = " << (examiner->errors()&examinerMask);
00492             if (examinerMask&examiner->errors()) {
00493               LogTrace("CSCDCCUnpacker|CSCRawToDigi")
00494                 << "Examiner output: " << examiner_out.str();
00495               LogTrace("CSCDCCUnpacker|CSCRawToDigi")
00496                 << "Examiner errors: " << examiner_err.str();
00497             }
00498           }
00499         }
00500 
00501         // dccStatusProduct->insertDigi(CSCDetId(1,1,1,1,1), CSCDCCStatusDigi(examiner->errors()));
00502         // if(instantiateDQM)  monitor->process(examiner, NULL);
00503       }
00504       if (examiner!=NULL) delete examiner;
00505     } // end of if fed has data
00506   } // end of loop over DCCs
00507   // put into the event
00508   e.put(wireProduct,          "MuonCSCWireDigi");
00509   e.put(stripProduct,         "MuonCSCStripDigi");
00510   e.put(alctProduct,          "MuonCSCALCTDigi");
00511   e.put(clctProduct,          "MuonCSCCLCTDigi");
00512   e.put(comparatorProduct,    "MuonCSCComparatorDigi");
00513   e.put(rpcProduct,           "MuonCSCRPCDigi");
00514   e.put(corrlctProduct,       "MuonCSCCorrelatedLCTDigi");
00515 
00516   if (useFormatStatus)  e.put(formatStatusProduct,    "MuonCSCDCCFormatStatusDigi");
00517 
00518   if (unpackStatusDigis)
00519     {
00520       e.put(cfebStatusProduct,    "MuonCSCCFEBStatusDigi");
00521       e.put(dmbStatusProduct,     "MuonCSCDMBStatusDigi");
00522       e.put(tmbStatusProduct,     "MuonCSCTMBStatusDigi");
00523       e.put(dduStatusProduct,     "MuonCSCDDUStatusDigi");
00524       e.put(dccStatusProduct,     "MuonCSCDCCStatusDigi");
00525       e.put(alctStatusProduct,    "MuonCSCALCTStatusDigi");
00526     }
00527   if (printEventNumber) LogTrace("CSCDCCUnpacker|CSCRawToDigi") 
00528    <<"[CSCDCCUnpacker]: " << numOfEvents << " events processed ";
00529 }
00530 
00531 
00533 
00534 void CSCDCCUnpacker::visual_raw(int hl,int id, int run, int event,bool fedshort, 
00535                                  bool fDump, short unsigned int *buf) const {
00536 
00537         LogTrace("badData") << std::endl << std::endl;
00538         LogTrace("badData") << "Run: "<< run << " Event: " << event;
00539         LogTrace("badData") << std::endl;
00540         if(formatedEventDump)
00541            LogTrace("badData") << "FED-" << id << "  " << "(scroll down to see summary)";
00542         else
00543            LogTrace("badData") << "Problem seems in FED-" << id << "  " << "(scroll down to see summary)";
00544         LogTrace("badData") <<"********************************************************************************";
00545         LogTrace("badData") <<hl<<" words of data:";
00546         
00547         //================================================
00548         // FED codes in DCC
00549         std::vector<int> dcc_id;
00550         int dcc_h1_id=0;
00551         // Current codes
00552         for (int i=750;i<758;i++)
00553             dcc_id.push_back(i);
00554         // Codes for upgrade    
00555          for (int i=830;i<838;i++)
00556             dcc_id.push_back(i);
00557         
00558         char dcc_common[]="DCC-";    
00559 
00560         //================================================
00561         // DDU codes per FED
00562         std::vector<int> ddu_id;
00563         int ddu_h1_12_13=0;
00564         for (int i=1;i<37;i++)
00565             ddu_id.push_back(i);
00566         // For DDU Headers and tarailers
00567         char ddu_common[]="DDU-";
00568         char ddu_header1[]="Header 1";
00569         char ddu_header2[]="Header 2";
00570         char ddu_header3[]="Header 3";
00571         char ddu_trail1[]="Trailer 1", ddu_trail2[]="Trailer 2", ddu_trail3[]="Trailer 3";
00572         // For Header 2
00573         char ddu_trailer1_bit[]={'8','0','0','0','f','f','f','f','8','0','0','0','8','0','0','0'};
00574         char ddu_trailer3_bit[]={'a'};
00575         // Corrupted Trailers
00576         char ddu_tr1_err_common[]="Incomplet";
00577         //====================================================
00578         
00579         //DMB
00580         char dmb_common[]="DMB", dmb_header1[]="Header 1", dmb_header2[]="Header 2";
00581         char dmb_common_crate[]="crate:", dmb_common_slot[]="slot:"; 
00582         char dmb_common_l1a[]="L1A:";
00583         char dmb_header1_bit[]={'9','9','9','9'};
00584         char dmb_header2_bit[]={'a','a','a','a'};
00585         char dmb_tr1[]="Trailer 1", dmb_tr2[]="Trailer 2";
00586         char dmb_tr1_bit[]={'f','f','f','f'}, dmb_tr2_bit[]={'e','e','e','e'};
00587         
00588         
00589         //=====================================================
00590         
00591         // ALCT
00592         char alct_common[]="ALCT", alct_header1[]="Header 1", alct_header2[]="Header 2";
00593         char alct_common_bxn[]="BXN:";
00594         char alct_common_wcnt2[]="| Actual word count:"; 
00595         char alct_common_wcnt1[]="Expected word count:";
00596         char alct_header1_bit[]={'d','d','d','d','b','0','a'};
00597         char alct_header2_bit[]={'0','0','0','0'};
00598         char alct_tr1[]="Trailer 1"; 
00599         
00600         //======================================================
00601 
00602         //TMB
00603         char tmb_common[]="TMB", tmb_header1[]="Header", tmb_tr1[]="Trailer";
00604         char tmb_header1_bit[]={'d','d','d','d','b','0','c'};
00605         char tmb_tr1_bit[]={'d','d','d','d','e','0','f'};
00606         
00607         //======================================================
00608         
00609         //CFEB 
00610         char cfeb_common[]="CFEB", cfeb_tr1[]="Trailer", cfeb_b[]="B-word";
00611         char cfeb_common_sample[]="sample:";
00612         
00613         //======================================================        
00614         
00615         //Auxiliary variables 
00616         
00617         // Bufers
00618         int word_lines=hl/4;
00619         char tempbuf[80];
00620         char tempbuf1[80];
00621         char tempbuf_short[17];
00622         char sign1[]="  --->| ";
00623         
00624         // Counters
00625         int word_numbering=0;
00626         int ddu_inst_i=0, ddu_inst_n=0, ddu_inst_l1a=0;
00627         int ddu_inst_bxn=0;
00628         int dmb_inst_crate=0, dmb_inst_slot=0, dmb_inst_l1a=0;
00629         int cfeb_sample=0;
00630         int alct_inst_l1a=0;
00631         int alct_inst_bxn=0;
00632         int alct_inst_wcnt1=0;
00633         int alct_inst_wcnt2=0;
00634         int alct_start=0;
00635         int alct_stop=0;
00636         int tmb_inst_l1a=0;
00637         int tmb_inst_wcnt1=0;
00638         int tmb_inst_wcnt2=0;
00639         int tmb_start=0;
00640         int tmb_stop=0;
00641         int dcc_h1_check=0;
00642         
00643         //Flags
00644         int ddu_h2_found=0;  //DDU Header 2 found
00645         int w=0;
00646         
00647         //Logic variables
00648         const int sz1=5;
00649         bool dcc_check=false;
00650         bool ddu_h2_check[sz1]={false};
00651         bool ddu_h1_check=false;
00652         bool dmb_h1_check[sz1]={false};
00653         bool dmb_h2_check[sz1]={false};
00654         bool ddu_h2_h1=false;
00655         bool ddu_tr1_check[sz1]={false};
00656         bool alct_h1_check[sz1]={false};
00657         bool alct_h2_check[sz1]={false};
00658         bool alct_tr1_check[sz1]={false};
00659         bool dmb_tr1_check[sz1]={false};
00660         bool dmb_tr2_check[sz1]={false};
00661         bool tmb_h1_check[sz1]={false};
00662         bool tmb_tr1_check[sz1]={false};
00663         bool cfeb_tr1_check[sz1]={false};
00664         bool cfeb_b_check[sz1]={false};
00665         bool ddu_tr1_bad_check[sz1]={false};
00666         bool extraction=fedshort;
00667         
00668         //Summary vectors
00669         //DDU
00670         std::vector<int> ddu_h1_coll;
00671         std::vector<int> ddu_h1_n_coll;
00672         std::vector<int> ddu_h2_coll;
00673         std::vector<int> ddu_h3_coll;
00674         std::vector<int> ddu_t1_coll;
00675         std::vector<int> ddu_t2_coll;
00676         std::vector<int> ddu_t3_coll;
00677         std::vector<int> ddu_l1a_coll;
00678         std::vector<int> ddu_bxn_coll;
00679         //DMB
00680         std::vector<int> dmb_h1_coll;
00681         std::vector<int> dmb_h2_coll;
00682         std::vector<int> dmb_t1_coll;
00683         std::vector<int> dmb_t2_coll;
00684         std::vector<int> dmb_crate_coll;
00685         std::vector<int> dmb_slot_coll;
00686         std::vector<int> dmb_l1a_coll;
00687         //ALCT
00688         std::vector<int> alct_h1_coll;
00689         std::vector<int> alct_h2_coll;
00690         std::vector<int> alct_t1_coll;
00691         std::vector<int> alct_l1a_coll;
00692         std::vector<int> alct_bxn_coll;
00693         std::vector<int> alct_wcnt1_coll;
00694         std::vector<int> alct_wcnt2_coll;
00695         std::vector<int> alct_wcnt2_id_coll;
00696         //TMB
00697         std::vector<int> tmb_h1_coll;
00698         std::vector<int> tmb_t1_coll;
00699         std::vector<int> tmb_l1a_coll;
00700         std::vector<int> tmb_wcnt1_coll;
00701         std::vector<int> tmb_wcnt2_coll;
00702         //CFEB
00703         std::vector<int> cfeb_t1_coll;
00704         
00705         //========================================================
00706         
00707         // DCC Header and Ttrailer information
00708         char dcc_header1[]="DCC Header 1";
00709         char dcc_header2[]="DCC Header 2";
00710         char dcc_trail1[]="DCC Trailer 1", dcc_trail1_bit[]={'e'};
00711         char dcc_trail2[]="DCC Trailer 2", dcc_trail2_bit[]={'a'};
00712         //=========================================================
00713         
00714         for (int i=0;i<hl;i++) {
00715         // Auxiliary actions
00716         ++word_numbering;
00717           for(int j=-1; j<4; j++){
00718                sprintf(tempbuf_short,"%04x%04x%04x%04x",buf[i+4*(j-1)+3],buf[i+4*(j-1)+2],buf[i+4*(j-1)+1],buf[i+4*(j-1)]);
00719                 
00720                 ddu_h2_check[j]=((buf[i+4*(j-1)+1]==0x8000)&&
00721                                  (buf[i+4*(j-1)+2]==0x0001)&&(buf[i+4*(j-1)+3]==0x8000));
00722                  
00723                  ddu_tr1_check[j]=((tempbuf_short[0]==ddu_trailer1_bit[0])&&(tempbuf_short[1]==ddu_trailer1_bit[1])&&
00724                                   (tempbuf_short[2]==ddu_trailer1_bit[2])&&(tempbuf_short[3]==ddu_trailer1_bit[3])&&
00725                                   (tempbuf_short[4]==ddu_trailer1_bit[4])&&(tempbuf_short[5]==ddu_trailer1_bit[5])&&
00726                                   (tempbuf_short[6]==ddu_trailer1_bit[6])&&(tempbuf_short[7]==ddu_trailer1_bit[7])&&
00727                                   (tempbuf_short[8]==ddu_trailer1_bit[8])&&(tempbuf_short[9]==ddu_trailer1_bit[9])&&
00728                                   (tempbuf_short[10]==ddu_trailer1_bit[10])&&(tempbuf_short[11]==ddu_trailer1_bit[11])&&
00729                                   (tempbuf_short[12]==ddu_trailer1_bit[12])&&(tempbuf_short[13]==ddu_trailer1_bit[13])&&
00730                                   (tempbuf_short[14]==ddu_trailer1_bit[14])&&(tempbuf_short[15]==ddu_trailer1_bit[15]));
00731                  
00732                  dmb_h1_check[j]=((tempbuf_short[0]==dmb_header1_bit[0])&&(tempbuf_short[4]==dmb_header1_bit[1])&&
00733                                  (tempbuf_short[8]==dmb_header1_bit[2])&&(tempbuf_short[12]==dmb_header1_bit[3]));
00734                 
00735                  dmb_h2_check[j]=((tempbuf_short[0]==dmb_header2_bit[0])&&(tempbuf_short[4]==dmb_header2_bit[1])&&
00736                                  (tempbuf_short[8]==dmb_header2_bit[2])&&(tempbuf_short[12]==dmb_header2_bit[3]));
00737                  alct_h1_check[j]=((tempbuf_short[0]==alct_header1_bit[0])&&(tempbuf_short[4]==alct_header1_bit[1])&&
00738                                  (tempbuf_short[8]==alct_header1_bit[2])&&(tempbuf_short[12]==alct_header1_bit[3])&&
00739                                  (tempbuf_short[13]==alct_header1_bit[4])&&(tempbuf_short[14]==alct_header1_bit[5])&&
00740                                  (tempbuf_short[15]==alct_header1_bit[6]));              
00741                  alct_h2_check[j]=(((tempbuf_short[0]==alct_header2_bit[0])&&(tempbuf_short[1]==alct_header2_bit[1])&&
00742                                  (tempbuf_short[2]==alct_header2_bit[2])&&(tempbuf_short[3]==alct_header2_bit[3]))||
00743                                  ((tempbuf_short[4]==alct_header2_bit[0])&&(tempbuf_short[5]==alct_header2_bit[1])&&
00744                                  (tempbuf_short[6]==alct_header2_bit[2])&&(tempbuf_short[7]==alct_header2_bit[3]))||
00745                                  ((tempbuf_short[8]==alct_header2_bit[0])&&(tempbuf_short[9]==alct_header2_bit[1])&&
00746                                  (tempbuf_short[10]==alct_header2_bit[2])&&(tempbuf_short[11]==alct_header2_bit[3]))||
00747                                  ((tempbuf_short[12]==alct_header2_bit[0])&&(tempbuf_short[13]==alct_header2_bit[1])&&
00748                                  (tempbuf_short[14]==alct_header2_bit[2])&&(tempbuf_short[15]==alct_header2_bit[3]))
00749                                  //(tempbuf_short[4]==alct_header2_bit[4])&&(tempbuf_short[5]==alct_header2_bit[5])
00750                                  );
00751                                  // ALCT Trailers
00752                 alct_tr1_check[j]=(((buf[i+4*(j-1)]&0xFFFF)==0xDE0D)&&((buf[i+4*(j-1)+1]&0xF800)==0xD000)&&
00753                                  ((buf[i+4*(j-1)+2]&0xF800)==0xD000)&&((buf[i+4*(j-1)+3]&0xF000)==0xD000));
00754                                  // DMB Trailers
00755                  dmb_tr1_check[j]=((tempbuf_short[0]==dmb_tr1_bit[0])&&(tempbuf_short[4]==dmb_tr1_bit[1])&&
00756                                  (tempbuf_short[8]==dmb_tr1_bit[2])&&(tempbuf_short[12]==dmb_tr1_bit[3]));
00757                  dmb_tr2_check[j]=((tempbuf_short[0]==dmb_tr2_bit[0])&&(tempbuf_short[4]==dmb_tr2_bit[1])&&
00758                                  (tempbuf_short[8]==dmb_tr2_bit[2])&&(tempbuf_short[12]==dmb_tr2_bit[3]));
00759                                  // TMB
00760                  tmb_h1_check[j]=((tempbuf_short[0]==tmb_header1_bit[0])&&(tempbuf_short[4]==tmb_header1_bit[1])&&
00761                                  (tempbuf_short[8]==tmb_header1_bit[2])&&(tempbuf_short[12]==tmb_header1_bit[3])&&
00762                                  (tempbuf_short[13]==tmb_header1_bit[4])&&(tempbuf_short[14]==tmb_header1_bit[5])&&
00763                                  (tempbuf_short[15]==tmb_header1_bit[6]));
00764                  tmb_tr1_check[j]=((tempbuf_short[0]==tmb_tr1_bit[0])&&(tempbuf_short[4]==tmb_tr1_bit[1])&&
00765                                  (tempbuf_short[8]==tmb_tr1_bit[2])&&(tempbuf_short[12]==tmb_tr1_bit[3])&&
00766                                  (tempbuf_short[13]==tmb_tr1_bit[4])&&(tempbuf_short[14]==tmb_tr1_bit[5])&&
00767                                  (tempbuf_short[15]==tmb_tr1_bit[6]));
00768                                  // CFEB
00769                  cfeb_tr1_check[j]=(((buf[i+4*(j-1)+1]&0xF000)==0x7000) &&  
00770                      ((buf[i+4*(j-1)+2]&0xF000)==0x7000) && 
00771                      (( buf[i+4*(j-1)+1]!= 0x7FFF) || (buf[i+4*(j-1)+2] != 0x7FFF)) &&
00772                      ((buf[i+4*(j-1)+3] == 0x7FFF) ||   
00773                      ((buf[i+4*(j-1)+3]&buf[i+4*(j-1)]) == 0x0&&(buf[i+4*(j-1)+3] + buf[i+4*(j-1)] == 0x7FFF ))) );
00774                  cfeb_b_check[j]=(((buf[i+4*(j-1)+3]&0xF000)==0xB000)&&((buf[i+4*(j-1)+2]&0xF000)==0xB000) && 
00775                                  ((buf[i+4*(j-1)+1]&0xF000)==0xB000)&&((buf[i+4*(j-1)]=3&0xF000)==0xB000) );   
00776                                  // DDU Trailers with errors
00777                  ddu_tr1_bad_check[j]=((tempbuf_short[0]!=ddu_trailer1_bit[0])&&
00778                                  //(tempbuf_short[1]!=ddu_trailer1_bit[1])&&(tempbuf_short[2]!=ddu_trailer1_bit[2])&&
00779                                  //(tempbuf_short[3]==ddu_trailer1_bit[3])&&
00780                                  (tempbuf_short[4]!=ddu_trailer1_bit[4])&&
00781                                  //(tempbuf_short[5]==ddu_trailer1_bit[5])&&
00782                                  //(tempbuf_short[6]==ddu_trailer1_bit[6])&&(tempbuf_short[7]==ddu_trailer1_bit[7])&&
00783                                  (tempbuf_short[8]==ddu_trailer1_bit[8])&&(tempbuf_short[9]==ddu_trailer1_bit[9])&&
00784                                  (tempbuf_short[10]==ddu_trailer1_bit[10])&&(tempbuf_short[11]==ddu_trailer1_bit[11])&&
00785                                  (tempbuf_short[12]==ddu_trailer1_bit[12])&&(tempbuf_short[13]==ddu_trailer1_bit[13])&&
00786                                  (tempbuf_short[14]==ddu_trailer1_bit[14])&&(tempbuf_short[15]==ddu_trailer1_bit[15])); 
00787           }
00788           
00789           
00790           // DDU Header 2 next to Header 1
00791           ddu_h2_h1=ddu_h2_check[2];
00792           
00793           sprintf(tempbuf_short,"%04x%04x%04x%04x",buf[i+3],buf[i+2],buf[i+1],buf[i]);
00794           
00795           // Looking for DDU Header 1
00796           ddu_h1_12_13=(buf[i]>>8);
00797           for (int kk=0; kk<36; kk++){        
00798               if(((buf[i+3]&0xF000)==0x5000)&&(ddu_h1_12_13==ddu_id[kk])&&ddu_h2_h1){
00799                 ddu_h1_coll.push_back(word_numbering); ddu_h1_n_coll.push_back(ddu_id[kk]);
00800                 ddu_inst_l1a=((buf[i+2]&0xFFFF)+((buf[i+3]&0x00FF)<<16));
00801                 ddu_l1a_coll.push_back(ddu_inst_l1a);
00802                 ddu_inst_bxn=(buf[i+1]&0xFFF0)>>4;
00803                 ddu_bxn_coll.push_back(ddu_inst_bxn);
00804                 sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s%s %s %i %s %i",
00805                 word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00806                 sign1,ddu_common,ddu_id[kk],ddu_header1,sign1,dmb_common_l1a,ddu_inst_l1a,alct_common_bxn,ddu_inst_bxn);
00807                 LogTrace("badData") << tempbuf1; w=0; ddu_h1_check=true; ddu_inst_l1a=0; 
00808                 cfeb_sample=0;
00809               }
00810           }
00811          
00812          // Looking for DCC Header 1
00813          dcc_h1_id=(((buf[i+1]<<12)&0xF000)>>4)+(buf[i]>>8);
00814          for(int dcci=0;dcci<16;dcci++){
00815                  if((dcc_id[dcci]==dcc_h1_id)&&(((buf[i+3]&0xF000)==0x5000)&&(!ddu_h1_check))){
00816                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s",word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00817                  sign1,dcc_common,dcc_h1_id,dcc_header1); dcc_h1_check=word_numbering; w=0;
00818                  dcc_check=true; 
00819                  LogTrace("badData") << tempbuf1;
00820                  } 
00821              }      
00822                  
00823           // Looking for DCC Header 2 and trailers
00824           if(((word_numbering-1)==dcc_h1_check)&&((buf[i+3]&0xFF00)==0xD900)) {
00825              sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s",word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00826              sign1,dcc_header2);
00827              LogTrace("badData") << tempbuf1; w=0; 
00828              }
00829           else if((word_numbering==word_lines-1)&&(tempbuf_short[0]==dcc_trail1_bit[0])){
00830              sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s",word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00831              sign1,dcc_trail1);
00832              LogTrace("badData") << tempbuf1; w=0;
00833                }
00834           else if((word_numbering==word_lines)&&(tempbuf_short[0]==dcc_trail2_bit[0])){
00835              sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s",word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00836              sign1,dcc_trail2);
00837              LogTrace("badData") << tempbuf1; w=0;
00838                }
00839      
00840              // DDU Header 2
00841           else if(ddu_h2_check[1]){
00842                ddu_inst_i = ddu_h1_n_coll.size(); //ddu_inst_n=ddu_h1_n_coll[0];
00843                ddu_inst_n=ddu_h1_n_coll[ddu_inst_i-1];
00844                sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s",
00845                word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,ddu_common,
00846                ddu_inst_n, ddu_header2);
00847                ddu_h2_coll.push_back(word_numbering);
00848                LogTrace("badData") << tempbuf1; w=0;
00849                ddu_h2_found=1;
00850                }
00851                
00852              // DDU Header 3 (either between DDU Header 2 DMB Header or DDU Header 2 DDU Trailer1)  
00853           else if((ddu_h2_check[0]&&dmb_h1_check[2])||(ddu_h2_check[0]&&ddu_tr1_check[2])){
00854              ddu_inst_i = ddu_h1_n_coll.size(); ddu_inst_n=ddu_h1_n_coll[ddu_inst_i-1];
00855              sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s",word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00856              sign1,ddu_common,ddu_inst_n,ddu_header3);
00857              ddu_h3_coll.push_back(word_numbering);
00858              LogTrace("badData") << tempbuf1; w=0;
00859              ddu_h2_found=0;
00860              }
00861              
00862              // DMB Header 1,2
00863              
00864             else if(dmb_h1_check[1]){
00865                  dmb_inst_crate=0; dmb_inst_slot=0; dmb_inst_l1a=0;
00866                  dmb_inst_l1a=((buf[i]&0x0FFF)+((buf[i+1]&0xFFF)<<12));
00867                  dmb_l1a_coll.push_back(dmb_inst_l1a);
00868                if(dmb_h2_check[2]){
00869                  dmb_inst_crate=((buf[i+4+1]>>4)&0xFF); dmb_inst_slot=(buf[i+4+1]&0xF);
00870                  dmb_crate_coll.push_back(dmb_inst_crate); dmb_slot_coll.push_back(dmb_inst_slot);
00871                }
00872                sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s%s %i %s %i %s %i",
00873                word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00874                sign1,dmb_common,dmb_header1,sign1,dmb_common_crate,dmb_inst_crate,
00875                dmb_common_slot,dmb_inst_slot,dmb_common_l1a,dmb_inst_l1a);
00876                dmb_h1_coll.push_back(word_numbering);
00877                LogTrace("badData") << tempbuf1; w=0;
00878                ddu_h2_found=1;
00879                }
00880                
00881             else if(dmb_h2_check[1]){            
00882                dmb_inst_crate=((buf[i+1]>>4)&0xFF); dmb_inst_slot=(buf[i+1]&0xF);
00883                dmb_h2_coll.push_back(word_numbering);
00884                if(dmb_h1_check[0])
00885                   dmb_inst_l1a=((buf[i-4]&0x0FFF)+((buf[i-4+1]&0xFFF)<<12));
00886                sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s%s %i %s %i %s %i",
00887                word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00888                sign1,dmb_common,dmb_header2,sign1,dmb_common_crate,dmb_inst_crate,
00889                dmb_common_slot,dmb_inst_slot,dmb_common_l1a,dmb_inst_l1a);
00890                LogTrace("badData") << tempbuf1; w=0;
00891                ddu_h2_found=1;
00892                }
00893                
00894              //DDU Trailer 1
00895            else if(ddu_tr1_check[1]){
00896                  ddu_inst_i = ddu_h1_n_coll.size(); ddu_inst_n=ddu_h1_n_coll[ddu_inst_i-1];
00897                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s",
00898                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,ddu_common,ddu_inst_n,ddu_trail1);
00899                  ddu_t1_coll.push_back(word_numbering);
00900                  LogTrace("badData") << tempbuf1; w=0;
00901                  }
00902 
00903                  //ALCT Header 1,2              
00904           else if(alct_h1_check[1]){
00905                  alct_start=word_numbering;
00906                  alct_inst_l1a=(buf[i+2]&0x0FFF);
00907                  alct_l1a_coll.push_back(alct_inst_l1a);
00908                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s %s %i",
00909                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00910                  sign1,alct_common,alct_header1,sign1,dmb_common_l1a,alct_inst_l1a);
00911                  alct_h1_coll.push_back(word_numbering);
00912                  LogTrace("badData") << tempbuf1; w=0; alct_inst_l1a=0;
00913                  }
00914                  
00915           else if((alct_h1_check[0])&&(alct_h2_check[2])) {
00916                  alct_inst_bxn=(buf[i]&0x0FFF);
00917                  alct_bxn_coll.push_back(alct_inst_bxn);
00918                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s%s %i",
00919                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00920                  sign1,alct_common,alct_header2,sign1,alct_common_bxn,alct_inst_bxn);
00921                  alct_h2_coll.push_back(word_numbering);
00922                  LogTrace("badData") << tempbuf1; w=0; alct_inst_bxn=0;
00923                  } 
00924                  
00925                  //ALCT Trailer 1
00926           else if(alct_tr1_check[1]){
00927                  alct_stop=word_numbering;
00928                  if((alct_start!=0)&&(alct_stop!=0)&&(alct_stop>alct_start)) {
00929                         alct_inst_wcnt2=4*(alct_stop-alct_start+1);
00930                         alct_wcnt2_coll.push_back(alct_inst_wcnt2);
00931                         alct_wcnt2_id_coll.push_back(alct_start);
00932                         }
00933                  alct_inst_wcnt1=(buf[i+3]&0x7FF);
00934                  alct_wcnt1_coll.push_back(alct_inst_wcnt1);
00935                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s%s %i %s %i",
00936                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00937                  sign1,alct_common,alct_tr1,sign1,alct_common_wcnt1,alct_inst_wcnt1,
00938                  alct_common_wcnt2,alct_inst_wcnt2);
00939                  alct_t1_coll.push_back(word_numbering);
00940                  LogTrace("badData") << tempbuf1; w=0; alct_inst_wcnt1=0;
00941                  alct_inst_wcnt2=0;  
00942                  }
00943                  
00944                  //DDU Trailer 3
00945           else if((ddu_tr1_check[-1])&&(tempbuf_short[0]==ddu_trailer3_bit[0])){
00946           //&&(tempbuf_short[0]==ddu_trailer3_bit[0])){
00947                  ddu_inst_i = ddu_h1_n_coll.size(); ddu_inst_n=ddu_h1_n_coll[ddu_inst_i-1];         
00948                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s",
00949                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,ddu_common,ddu_inst_n,ddu_trail3);
00950                  ddu_t3_coll.push_back(word_numbering);
00951                  LogTrace("badData") << tempbuf1; w=0;
00952                  }
00953                  //DDU Trailer 2
00954           else if((ddu_tr1_check[0])&&(tempbuf_short[0]!=ddu_trailer3_bit[0])){
00955           //&&(tempbuf_short[0]==ddu_trailer3_bit[0])){
00956                  ddu_inst_i = ddu_h1_n_coll.size(); ddu_inst_n=ddu_h1_n_coll[ddu_inst_i-1];
00957                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s",
00958                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,ddu_common,ddu_inst_n,ddu_trail2);
00959                  ddu_t2_coll.push_back(word_numbering);
00960                  LogTrace("badData") << tempbuf1; w=0;
00961                  } 
00962                  //DMB Trailer 1,2
00963          else if(dmb_tr1_check[1]){
00964                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s",
00965                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,dmb_common,dmb_tr1);
00966                  dmb_t1_coll.push_back(word_numbering);
00967                  LogTrace("badData") << tempbuf1; w=0;
00968                  cfeb_sample=0;
00969                  }
00970                  
00971          else if(dmb_tr2_check[1]){
00972                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s",
00973                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,dmb_common,dmb_tr2);
00974                  dmb_t2_coll.push_back(word_numbering);
00975                  LogTrace("badData") << tempbuf1; w=0;
00976                  }       
00977          // TMB  
00978          else if(tmb_h1_check[1]){
00979                  tmb_start=word_numbering;
00980                  tmb_inst_l1a=(buf[i+2]&0x000F);
00981                  tmb_l1a_coll.push_back(tmb_inst_l1a);
00982                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s%s %i",
00983                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,tmb_common,tmb_header1,
00984                  sign1,dmb_common_l1a,tmb_inst_l1a);
00985                  tmb_h1_coll.push_back(word_numbering);
00986                  LogTrace("badData") << tempbuf1; w=0; tmb_inst_l1a=0; 
00987                  }
00988          else if(tmb_tr1_check[1]){
00989                  tmb_stop=word_numbering;
00990                  if((tmb_start!=0)&&(tmb_stop!=0)&&(tmb_stop>tmb_start)) {
00991                         tmb_inst_wcnt2=4*(tmb_stop-tmb_start+1);
00992                         tmb_wcnt2_coll.push_back(tmb_inst_wcnt2);
00993                         }
00994                  tmb_inst_wcnt1=(buf[i+3]&0x7FF);
00995                  tmb_wcnt1_coll.push_back(tmb_inst_wcnt1);
00996                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s%s %i %s %i",
00997                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
00998                  sign1,tmb_common,tmb_tr1,sign1,alct_common_wcnt1,tmb_inst_wcnt1,
00999                  alct_common_wcnt2,tmb_inst_wcnt2);
01000                  tmb_t1_coll.push_back(word_numbering);
01001                  LogTrace("badData") << tempbuf1; w=0;
01002                  tmb_inst_wcnt2=0;
01003                  }
01004          // CFEB
01005          else if(cfeb_tr1_check[1]){
01006                  ++cfeb_sample;
01007                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s%s %s %i",
01008                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],
01009                  sign1,cfeb_common,cfeb_tr1,sign1,cfeb_common_sample,cfeb_sample);
01010                  cfeb_t1_coll.push_back(word_numbering); w=0;
01011                  LogTrace("badData") << tempbuf1; w=0;
01012                  }
01013         else if(cfeb_b_check[1]){
01014                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s %s",
01015                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,cfeb_common,cfeb_b);
01016                  LogTrace("badData") << tempbuf1; w=0;
01017                  }                
01018         //ERRORS ddu_tr1_bad_check       
01019         else if(ddu_tr1_bad_check[1]){
01020                  ddu_inst_i = ddu_h1_n_coll.size(); ddu_inst_n=ddu_h1_n_coll[ddu_inst_i-1];
01021                  sprintf(tempbuf1,"%6i    %04x %04x %04x %04x%s%s%i %s %s",
01022                  word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i],sign1,ddu_common,ddu_inst_n,
01023                  ddu_trail1,ddu_tr1_err_common);
01024                  LogTrace("badData") << tempbuf1; w=0;
01025                  }        
01026         
01027          else if(extraction&&(!ddu_h1_check)&&(!dcc_check)){
01028               if(w<3){
01029               sprintf(tempbuf,"%6i    %04x %04x %04x %04x",
01030               word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i]);
01031               LogTrace("badData") << tempbuf; w++;}
01032               if(w==3){
01033               LogTrace("badData") << "..................................................."; w++;}
01034           }       
01035                   
01036           else if((!ddu_h1_check)&&(!dcc_check)){   
01037           sprintf(tempbuf,"%6i    %04x %04x %04x %04x",word_numbering,buf[i+3],buf[i+2],buf[i+1],buf[i]);
01038           LogTrace("badData") << tempbuf;
01039           }
01040           
01041           i+=3; ddu_h1_check=false; dcc_check=false; 
01042       }
01043         char sign[30]; 
01044         LogTrace("badData") <<"********************************************************************************" <<
01045          std::endl;
01046         if(fedshort)
01047         LogTrace("badData") << "For complete output turn off VisualFEDShort in muonCSCDigis configuration file.";
01048         LogTrace("badData") <<"********************************************************************************" <<
01049          std::endl;
01050         LogTrace("badData") << std::endl; 
01051         LogTrace("badData") <<"            Summary                ";
01052         LogTrace("badData") << std::endl;
01053         LogTrace("badData") << ddu_h1_coll.size() <<"  "<< ddu_common << "  "<<ddu_header1 << "  "<< "found";
01054         for(unsigned int k=0; k<ddu_h1_coll.size();++k){
01055            sprintf(sign,"%s%6i%5s %s%i %s %i %s %i","Line: ",
01056            ddu_h1_coll[k],sign1,ddu_common,ddu_h1_n_coll[k],dmb_common_l1a,ddu_l1a_coll[k],
01057            alct_common_bxn,ddu_bxn_coll[k]);
01058            LogTrace("badData") << sign;
01059         }                      
01060         LogTrace("badData") << std::endl;
01061         LogTrace("badData") << "||||||||||||||||||||";
01062         LogTrace("badData") << std::endl;
01063         LogTrace("badData") << ddu_h2_coll.size() <<"  "<< ddu_common << "  "<<ddu_header2 << "  "<< "found";
01064         for(unsigned int k=0; k<ddu_h2_coll.size();++k)
01065            LogTrace("badData") << "Line:  " << ddu_h2_coll[k];
01066         LogTrace("badData") << std::endl;
01067         LogTrace("badData") << "||||||||||||||||||||";
01068         LogTrace("badData") << std::endl;
01069         LogTrace("badData") << ddu_h3_coll.size() <<"  "<< ddu_common << "  "<<ddu_header3 << "  "<< "found";
01070         for(unsigned int k=0; k<ddu_h3_coll.size();++k)
01071            LogTrace("badData") << "Line:  " << ddu_h3_coll[k];
01072         LogTrace("badData") << std::endl;
01073         LogTrace("badData") << "||||||||||||||||||||";
01074         LogTrace("badData") << std::endl;
01075         LogTrace("badData") << ddu_t1_coll.size() <<"  "<< ddu_common << "  "<<ddu_trail1 << "  "<< "found";
01076         for(unsigned int k=0; k<ddu_t1_coll.size();++k)
01077            LogTrace("badData") << "Line:  " << ddu_t1_coll[k];
01078         LogTrace("badData") << std::endl;
01079         LogTrace("badData") << "||||||||||||||||||||";
01080         LogTrace("badData") << std::endl;
01081         LogTrace("badData") << ddu_t2_coll.size() <<"  "<< ddu_common << "  "<<ddu_trail2 << "  "<< "found";
01082         for(unsigned int k=0; k<ddu_t2_coll.size();++k)
01083            LogTrace("badData") << "Line:  " << ddu_t2_coll[k];
01084         LogTrace("badData") << std::endl;
01085         LogTrace("badData") << "||||||||||||||||||||";
01086         LogTrace("badData") << std::endl;
01087         LogTrace("badData") << ddu_t3_coll.size() <<"  "<< ddu_common << "  "<<ddu_trail3 << "  "<< "found";
01088         for(unsigned int k=0; k<ddu_t3_coll.size();++k)
01089            LogTrace("badData") << "Line:  " << ddu_t3_coll[k];
01090         LogTrace("badData") << std::endl;
01091         LogTrace("badData") << "||||||||||||||||||||";
01092         LogTrace("badData") << std::endl;
01093         LogTrace("badData") << dmb_h1_coll.size() <<"  "<< dmb_common << "  "<<dmb_header1 << "  "<< "found";
01094         for(unsigned int k=0; k<dmb_h1_coll.size();++k){
01095            sprintf(sign,"%s%6i%5s %s %s %i %s %i %s %i","Line: ",
01096            dmb_h1_coll[k],sign1,dmb_common,dmb_common_crate,dmb_crate_coll[k],dmb_common_slot,
01097            dmb_slot_coll[k],dmb_common_l1a,dmb_l1a_coll[k]);
01098            LogTrace("badData") << sign;
01099            }
01100         LogTrace("badData") << std::endl;
01101         LogTrace("badData") << "||||||||||||||||||||";
01102         LogTrace("badData") << std::endl;
01103         LogTrace("badData") << dmb_h2_coll.size() <<"  "<< dmb_common << "  "<<dmb_header2 << "  "<< "found";
01104         for(unsigned int k=0; k<dmb_h2_coll.size();++k)
01105            LogTrace("badData") << "Line:  " << dmb_h2_coll[k];
01106         LogTrace("badData") << std::endl;
01107         LogTrace("badData") << "||||||||||||||||||||";
01108         LogTrace("badData") << std::endl;
01109         LogTrace("badData") << dmb_t1_coll.size() <<"  "<< dmb_common << "  "<<dmb_tr1 << "  "<< "found";
01110         for(unsigned int k=0; k<dmb_t1_coll.size();++k)
01111            LogTrace("badData") << "Line:  " << dmb_t1_coll[k];
01112         LogTrace("badData") << std::endl;
01113         LogTrace("badData") << "||||||||||||||||||||";
01114         LogTrace("badData") << std::endl;
01115         LogTrace("badData") << dmb_t2_coll.size() <<"  "<< dmb_common << "  "<<dmb_tr2 << "  "<< "found";
01116         for(unsigned int k=0; k<dmb_t2_coll.size();++k)
01117            LogTrace("badData") << "Line:  " << dmb_t2_coll[k];
01118         LogTrace("badData") << std::endl;
01119         LogTrace("badData") << "||||||||||||||||||||";
01120         LogTrace("badData") << std::endl;
01121         LogTrace("badData") << alct_h1_coll.size() <<"  "<< alct_common << "  "<<alct_header1 << "  "<< "found";
01122         for(unsigned int k=0; k<alct_h1_coll.size();++k){
01123            sprintf(sign,"%s%6i%5s %s %s %i","Line: ",
01124            alct_h1_coll[k],sign1,alct_common,
01125            dmb_common_l1a,alct_l1a_coll[k]);
01126            LogTrace("badData") << sign;
01127            }
01128         LogTrace("badData") << std::endl;
01129         LogTrace("badData") << "||||||||||||||||||||";
01130         LogTrace("badData") << std::endl;
01131         LogTrace("badData") << alct_h2_coll.size() <<"  "<< alct_common << "  "<<alct_header2 << "  "<< "found";
01132         for(unsigned int k=0; k<alct_h2_coll.size();++k){
01133            sprintf(sign,"%s%6i%5s %s %s %i","Line: ",
01134            alct_h1_coll[k],sign1,alct_common,
01135            alct_common_bxn,alct_bxn_coll[k]);
01136            LogTrace("badData") << sign;
01137            }
01138         LogTrace("badData") << std::endl;
01139         LogTrace("badData") << "||||||||||||||||||||";
01140         LogTrace("badData") << std::endl;
01141         LogTrace("badData") << alct_t1_coll.size() <<"  "<< alct_common << "  "<<alct_tr1 << "  "<< "found";
01142         for(unsigned int k=0; k<alct_t1_coll.size();++k){
01143                 sprintf(sign,"%s%6i%5s %s %s %i %s %i","Line: ",
01144                 alct_t1_coll[k],sign1,alct_common,
01145                 alct_common_wcnt1,alct_wcnt1_coll[k],alct_common_wcnt2,alct_wcnt2_coll[k]);
01146                                 
01147            LogTrace("badData") << sign;
01148            }
01149            
01150         LogTrace("badData") << std::endl;
01151         LogTrace("badData") << "||||||||||||||||||||";
01152         LogTrace("badData") << std::endl;
01153         LogTrace("badData") << tmb_h1_coll.size() <<"  "<< tmb_common << "  "<<tmb_header1 << "  "<< "found";
01154         for(unsigned int k=0; k<tmb_h1_coll.size();++k){
01155            sprintf(sign,"%s%6i%5s %s %s %i","Line: ",
01156            tmb_h1_coll[k],sign1,tmb_common,
01157            dmb_common_l1a,tmb_l1a_coll[k]);
01158            LogTrace("badData") << sign;
01159         }   
01160         LogTrace("badData") << std::endl;
01161         LogTrace("badData") << "||||||||||||||||||||";
01162         LogTrace("badData") << std::endl;
01163         LogTrace("badData") << tmb_t1_coll.size() <<"  "<< tmb_common << "  "<<tmb_tr1 << "  "<< "found";
01164         for(unsigned int k=0; k<tmb_t1_coll.size();++k){
01165                 sprintf(sign,"%s%6i%5s %s %s %i %s %i","Line: ",
01166                 tmb_t1_coll[k],sign1,tmb_common,
01167                 alct_common_wcnt1,tmb_wcnt1_coll[k],alct_common_wcnt2,tmb_wcnt2_coll[k]);
01168                                 
01169            LogTrace("badData") << sign;
01170            }
01171         LogTrace("badData") << std::endl;
01172         LogTrace("badData") << "||||||||||||||||||||";
01173         LogTrace("badData") << std::endl;
01174         LogTrace("badData") << cfeb_t1_coll.size() <<"  "<< cfeb_common << "  "<<cfeb_tr1 << "  "<< "found";
01175         for(unsigned int k=0; k<cfeb_t1_coll.size();++k)
01176            LogTrace("badData") << "Line:  " << cfeb_t1_coll[k];
01177          LogTrace("badData") <<"********************************************************************************";
01178         
01179 }