CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/EventFilter/Utilities/plugins/EvFRecordUnpacker.cc

Go to the documentation of this file.
00001 #include "EvFRecordUnpacker.h"
00002 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00003 #include "FWCore/Utilities/interface/Exception.h"
00004 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00005 #include "EventFilter/FEDInterface/interface/FED1023.h"
00006 #include "DataFormats/Provenance/interface/Timestamp.h" 
00007 
00008 #include <iostream>
00009 
00010 namespace evf{
00011 
00012   EvFRecordUnpacker::EvFRecordUnpacker( const edm::ParameterSet& pset)
00013     : label_(pset.getParameter<edm::InputTag>("inputTag"))
00014     , node_usage_(0)
00015     , l1_rb_delay_(0)
00016   {
00017     node_usage_ = new TH1F("nodes","node usage",1600,0.,1600.);
00018     l1_rb_delay_ = new TH1F("l1-rb","l1-rb delay in ms",1000,0.,10000.);
00019     corre_ = new TH2F("corre","Correlation",1600,0.,1600.,1000,0.,10000.); 
00020     for(unsigned int row = 0xa; row <=0xf; row++)
00021       for(unsigned int rack = 11; rack <= 18; rack++)
00022         for(unsigned int position_in_rack = 1; position_in_rack<=30;
00023             position_in_rack++)
00024           {
00025             unsigned int bin = (row-0xa)*9*30+(rack-11)*30+position_in_rack+1;
00026             std::ostringstream ost;
00027             ost << std::hex << row << "-" << std::dec << rack << "-" 
00028                 << std::setfill('0') <<  std::setw(2) << position_in_rack;
00029             node_usage_->GetXaxis()->SetBinLabel(bin,ost.str().c_str());
00030             corre_->GetXaxis()->SetBinLabel(bin,ost.str().c_str());
00031           }
00032  
00033     f_ = new TFile("histos.root","RECREATE");
00034   }
00035   EvFRecordUnpacker::~EvFRecordUnpacker()
00036   {
00037     f_->cd();
00038     node_usage_->Write();
00039     l1_rb_delay_->Write();
00040     corre_->Write();
00041     f_->Write();
00042     f_->Close();
00043     delete f_;
00044     delete corre_;
00045     if(node_usage_ !=0) delete node_usage_;
00046     if(l1_rb_delay_!=0) delete l1_rb_delay_;
00047   }
00048 
00049   void EvFRecordUnpacker::analyze(const edm::Event & e, const edm::EventSetup& c)
00050   {
00051     edm::Timestamp ts = e.eventAuxiliary().time();
00052 
00053     using namespace fedinterface;
00054     edm::Handle<FEDRawDataCollection> rawdata;
00055     e.getByLabel(label_,rawdata);
00056     unsigned int id = fedinterface::EVFFED_ID;
00057     const FEDRawData& data = rawdata->FEDData(id);
00058     //    size_t size=data.size();
00059     unsigned int rbident = *((unsigned int*)(data.data()+EVFFED_RBIDENT_OFFSET));
00060     uint64_t rbtime = *((uint64_t*)(data.data()+EVFFED_RBWCTIM_OFFSET));
00061     unsigned int s = (unsigned int)((rbtime >> 32)-(ts.value() >> 32));
00062     unsigned int us = (unsigned int)((rbtime & 0xffffffff) - (ts.value() & 0xffffffff));
00063     float deltams= s*1000.+((float)us)/1000.;
00064 
00065     unsigned int nodeid = (rbident >> EVFFED_RBPCIDE_SHIFT) & EVFFED_RBPCIDE_MASK;
00066     unsigned int rackid = (nodeid&0xfff00)>>8;
00067     unsigned int position_in_rack = nodeid&0x000ff;
00068     //    std::cout << std::hex << rbident << " node id " << nodeid << " rack " << rackid << " position " << position_in_rack << std::dec << std::endl;
00069     unsigned int row = ((rackid & 0xf00) >> 8)-10;
00070     unsigned int rackno = (rackid & 0x0ff)-0x11;
00071     //    std::cout << "row " << row << " rackno " << rackno << std::endl;
00072     //    std::cout << "BIN " <<  row*9*30+rackno*30+position_in_rack << std::endl;
00073     position_in_rack = position_in_rack%16 + position_in_rack/16*10;
00074 
00075     float x = (row*9*30+rackno*30+position_in_rack)-0.00001;
00076     //    std::cout << " X " << x << std::endl;
00077     node_usage_->Fill(x,1.);
00078     l1_rb_delay_->Fill(deltams,1.);
00079     corre_->Fill(x,deltams,1.);
00080   }
00081 }