CMS 3D CMS Logo

RPCPackingModule Class Reference

Driver class for digi to raw data conversions. More...

#include <EventFilter/RPCRawToDigi/interface/RPCPackingModule.h>

Inheritance diagram for RPCPackingModule:

edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

virtual void produce (edm::Event &, const edm::EventSetup &)
 get data, convert to raw event, attach again to Event
 RPCPackingModule (const edm::ParameterSet &)
 ctor
virtual ~RPCPackingModule ()
 dtor

Static Public Member Functions

static std::vector
< rpcrawtodigi::EventRecords
eventRecords (int fedId, int trigger_BX, const RPCDigiCollection *, const RPCRecordFormatter &)

Private Member Functions

FEDRawDatarawData (int fedId, unsigned int lvl1_ID, const RPCDigiCollection *, const RPCRecordFormatter &)

Private Attributes

unsigned long eventCounter_
const RPCReadOutMappingtheCabling


Detailed Description

Driver class for digi to raw data conversions.

Definition at line 22 of file RPCPackingModule.h.


Constructor & Destructor Documentation

RPCPackingModule::RPCPackingModule ( const edm::ParameterSet pset  )  [explicit]

ctor

Definition at line 34 of file RPCPackingModule.cc.

References theCabling.

00034                                                              :
00035   eventCounter_(0)
00036 {
00037 
00038   theCabling = new RPCReadOutMapping("");
00039   produces<FEDRawDataCollection>();
00040 
00041 }

RPCPackingModule::~RPCPackingModule (  )  [virtual]

dtor

Definition at line 43 of file RPCPackingModule.cc.

References theCabling.

00044 {
00045   delete theCabling;
00046 }


Member Function Documentation

vector< EventRecords > RPCPackingModule::eventRecords ( int  fedId,
int  trigger_BX,
const RPCDigiCollection digis,
const RPCRecordFormatter formatter 
) [static]

Definition at line 145 of file RPCPackingModule.cc.

References it, LogDebug, LogTrace, range, DetId::rawId(), and RPCRecordFormatter::recordPack().

Referenced by LinkDataXMLWriter::analyze(), and rawData().

00150 {
00151   typedef  DigiContainerIterator<RPCDetId, RPCDigi> DigiRangeIterator;
00152   vector<EventRecords> dataRecords;
00153 
00154 
00155   LogDebug("RPCRawDataPacker")<<"Packing Fed id="<<fedId;
00156   for (DigiRangeIterator it=digis->begin(); it != digis->end(); it++) {
00157     RPCDetId rpcDetId = (*it).first;
00158     uint32_t rawDetId = rpcDetId.rawId();
00159     RPCDigiCollection::Range range = digis->get(rpcDetId);
00160     for (vector<RPCDigi>::const_iterator  id = range.first; id != range.second; id++) {
00161       const RPCDigi & digi = (*id);
00162       vector<EventRecords>  rawFromDigi =  formatter.recordPack(rawDetId, digi, trigger_BX);
00163       dataRecords.insert(dataRecords.end(), rawFromDigi.begin(), rawFromDigi.end());
00164     }
00165   }
00166 
00167   //
00168   // merge data words
00169   //
00170   LogTrace("RPCRawDataPacker") <<" size of   data: " << dataRecords.size();
00171   vector<EventRecords> merged = EventRecords::mergeRecords(dataRecords);
00172   LogTrace("") <<" size of megred: " << merged.size();
00173 
00174   return merged;
00175 }

void RPCPackingModule::produce ( edm::Event ev,
const edm::EventSetup es 
) [virtual]

get data, convert to raw event, attach again to Event

Implements edm::EDProducer.

Definition at line 49 of file RPCPackingModule.cc.

References edm::ESWatcher< T >::check(), reco_application_tbsim_simpleTBanalysis_cfg::digiCollection, lat::endl(), edm::EventID::event(), eventCounter_, edm::EventSetup::get(), edm::Event::getByType(), edm::Event::id(), LogDebug, LogTrace, edm::Handle< T >::product(), edm::Event::put(), rawData(), theCabling, and RPCReadOutMapping::version().

00051 {
00052   eventCounter_++;
00053   LogInfo("RPCPackingModule") << "[RPCPackingModule::produce] " 
00054                               << "event counter: " << eventCounter_;
00055 
00056   Handle< RPCDigiCollection > digiCollection;
00057   ev.getByType(digiCollection);
00058   LogDebug("") << DebugDigisPrintout()(digiCollection.product());
00059 
00060   static edm::ESWatcher<RPCEMapRcd> recordWatcher; 
00061   if(recordWatcher.check(es)) {
00062     delete theCabling;
00063     LogTrace("") << "record has CHANGED!!, initialise readout map!";
00064     ESHandle<RPCEMap> readoutMapping;
00065     es.get<RPCEMapRcd>().get(readoutMapping);
00066     theCabling = readoutMapping->convert();
00067     LogTrace("") <<" READOUT MAP VERSION: " << theCabling->version() << endl; 
00068   }
00069 
00070   auto_ptr<FEDRawDataCollection> buffers( new FEDRawDataCollection );
00071 
00072 //  pair<int,int> rpcFEDS=FEDNumbering::getRPCFEDIds();
00073   pair<int,int> rpcFEDS(790,792);
00074   for (int id= rpcFEDS.first; id<=rpcFEDS.second; ++id){
00075 
00076     RPCRecordFormatter formatter(id, theCabling) ;
00077     unsigned int lvl1_ID = ev.id().event();
00078     FEDRawData* rawData =  RPCPackingModule::rawData(id, lvl1_ID, digiCollection.product(), formatter);
00079     FEDRawData& fedRawData = buffers->FEDData(id);
00080 
00081     fedRawData = *rawData;
00082     delete rawData;
00083   }
00084   ev.put( buffers );  
00085 }

FEDRawData * RPCPackingModule::rawData ( int  fedId,
unsigned int  lvl1_ID,
const RPCDigiCollection digis,
const RPCRecordFormatter formatter 
) [private]

Definition at line 88 of file RPCPackingModule.cc.

References FEDRawData::data(), rpcrawtodigi::DataRecord::data(), empty, eventRecords(), FEDTrailer::set(), FEDHeader::set(), FEDRawData::size(), and w.

Referenced by produce().

00089 {
00090   //
00091   // get merged records
00092   //
00093   int trigger_BX = 200;   // FIXME - set event by event but correct bx assigment in digi
00094   vector<EventRecords> merged = RPCPackingModule::eventRecords(fedId,trigger_BX,digis,formatter);
00095 
00096   //
00097   // create data words
00098   //
00099   vector<Word64> dataWords;
00100   EmptyWord empty;
00101   typedef vector<EventRecords>::const_iterator IR;
00102   for (IR ir = merged.begin(), irEnd =  merged.end() ; ir != irEnd; ++ir) {
00103     Word64 w = ( ( (Word64(ir->recordBX().data()) << 16) | ir->recordSLD().data() ) << 16
00104                     | ir->recordCD().data() ) << 16 | empty.data();
00105     dataWords.push_back(w);
00106   }
00107 
00108   //
00109   // create raw data
00110   //
00111   int nHeaders = 1;
00112   int nTrailers = 1;
00113   int dataSize = (nHeaders+nTrailers+dataWords.size()) * sizeof(Word64);
00114   FEDRawData * raw = new FEDRawData(dataSize);
00115 
00116   //
00117   // add header
00118   //
00119   unsigned char *pHeader  = raw->data();
00120   int evt_ty = 3;
00121   int source_ID = fedId;
00122   FEDHeader::set(pHeader, evt_ty, lvl1_ID, trigger_BX, source_ID);
00123 
00124   //
00125   // add datawords
00126   //
00127   for (unsigned int idata = 0; idata < dataWords.size(); idata ++) {
00128     Word64 * word = reinterpret_cast<Word64* >(pHeader+(idata+1)*sizeof(Word64));
00129     *word = dataWords[idata];
00130   }
00131 
00132   //
00133   // add trailer
00134   //
00135   unsigned char *pTrailer = pHeader + raw->size()-sizeof(Word64);
00136   int crc = 0;
00137   int evt_stat = 15;
00138   int tts = 0;
00139   int datasize =  raw->size()/sizeof(Word64);
00140   FEDTrailer::set(pTrailer, datasize, crc, evt_stat, tts);
00141 
00142   return raw;
00143 }


Member Data Documentation

unsigned long RPCPackingModule::eventCounter_ [private]

Definition at line 41 of file RPCPackingModule.h.

Referenced by produce().

const RPCReadOutMapping* RPCPackingModule::theCabling [private]

Definition at line 42 of file RPCPackingModule.h.

Referenced by produce(), RPCPackingModule(), and ~RPCPackingModule().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:31:03 2009 for CMSSW by  doxygen 1.5.4