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
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
00069 unsigned int row = ((rackid & 0xf00) >> 8)-10;
00070 unsigned int rackno = (rackid & 0x0ff)-0x11;
00071
00072
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
00077 node_usage_->Fill(x,1.);
00078 l1_rb_delay_->Fill(deltams,1.);
00079 corre_->Fill(x,deltams,1.);
00080 }
00081 }