CMS 3D CMS Logo

L1GTEvmDigiToRaw Class Reference

Description: generate raw data from digis. More...

#include <EventFilter/L1GlobalTriggerRawToDigi/interface/L1GTEvmDigiToRaw.h>

Inheritance diagram for L1GTEvmDigiToRaw:

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

List of all members.

Public Member Functions

 L1GTEvmDigiToRaw (const edm::ParameterSet &)
 constructor(s)
virtual ~L1GTEvmDigiToRaw ()
 destructor

Private Member Functions

virtual void beginJob (const edm::EventSetup &)
 beginning of job stuff
virtual void endJob ()
 end of job stuff
void packFDL (const edm::EventSetup &, unsigned char *, L1GtFdlWord &)
 pack FDL blocks for various bunch crosses
void packGTFE (const edm::EventSetup &, unsigned char *, L1GtfeExtWord &, boost::uint16_t activeBoardsGtValue)
 pack the GTFE block gives the number of bunch crosses in the event, as well as the active boards records for inactive boards are not written in the GT EVM record
void packHeader (unsigned char *, edm::Event &)
 block packers -------------
void packTCS (const edm::EventSetup &evSetup, unsigned char *ptrGt, L1TcsWord &tcsBlock)
 pack the TCS block
void packTrailer (unsigned char *, unsigned char *, int)
 pack trailer word
virtual void produce (edm::Event &, const edm::EventSetup &)
 loop over events

Private Attributes

boost::uint16_t m_activeBoardsMaskGt
 mask for active boards
int m_bstLengthBytes
 length of BST record (in bytes)
int m_evmGtFedId
 FED Id for GT EVM record default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc.
edm::InputTag m_evmGtInputTag
 input tag for GT EVM record
bool m_isDebugEnabled
int m_maxBxInEvent
 max Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept
int m_minBxInEvent
 min Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept
int m_totalBxInEvent
 total Bx's in the event, obtained from GTFE block
int m_verbosity
 verbosity level


Detailed Description

Description: generate raw data from digis.

Implementation: <TODO: enter implementation details>

Author:
: Vasile Mihai Ghete - HEPHY Vienna
$Date$ $Revision$

Definition at line 44 of file L1GTEvmDigiToRaw.h.


Constructor & Destructor Documentation

L1GTEvmDigiToRaw::L1GTEvmDigiToRaw ( const edm::ParameterSet pSet  )  [explicit]

constructor(s)

Definition at line 57 of file L1GTEvmDigiToRaw.cc.

References lat::endl(), LogDebug, m_activeBoardsMaskGt, m_evmGtFedId, and m_evmGtInputTag.

00057                                                               :
00058     m_evmGtFedId(pSet.getUntrackedParameter<int>("EvmGtFedId",
00059             FEDNumbering::getTriggerGTPFEDIds().first)),
00060     m_evmGtInputTag(pSet.getParameter<edm::InputTag>("EvmGtInputTag")),
00061     m_activeBoardsMaskGt(pSet.getParameter<unsigned int>("ActiveBoardsMask")),
00062     m_totalBxInEvent(0),
00063     m_minBxInEvent(0), m_maxBxInEvent(),
00064     m_verbosity(pSet.getUntrackedParameter<int> ("Verbosity", 0)),
00065     m_isDebugEnabled(edm::isDebugEnabled())
00066 
00067 
00068 
00069 {
00070 
00071     LogDebug("L1GTEvmDigiToRaw") << "\nMask for active boards (hex format): "
00072             << std::hex << std::setw(sizeof(m_activeBoardsMaskGt)*2)
00073             << std::setfill('0') << m_activeBoardsMaskGt << std::dec
00074             << std::setfill(' ') << "\nInput tag for EVM GT record: "
00075             << m_evmGtInputTag << "\nFED Id for EVM GT record: "
00076             << m_evmGtFedId << " \n" << std::endl;
00077 
00078     //
00079     produces<FEDRawDataCollection>();
00080 
00081 }

L1GTEvmDigiToRaw::~L1GTEvmDigiToRaw (  )  [virtual]

destructor

Definition at line 84 of file L1GTEvmDigiToRaw.cc.

00085 {
00086 
00087     // empty now
00088 
00089 }


Member Function Documentation

void L1GTEvmDigiToRaw::beginJob ( const edm::EventSetup evSetup  )  [private, virtual]

beginning of job stuff

Reimplemented from edm::EDProducer.

Definition at line 94 of file L1GTEvmDigiToRaw.cc.

00095 {
00096 
00097     // empty now
00098 
00099 }

void L1GTEvmDigiToRaw::endJob ( void   )  [private, virtual]

end of job stuff

Reimplemented from edm::EDProducer.

Definition at line 736 of file L1GTEvmDigiToRaw.cc.

00737 {
00738 
00739     // empty now
00740 }

void L1GTEvmDigiToRaw::packFDL ( const edm::EventSetup evSetup,
unsigned char *  ptrGt,
L1GtFdlWord fdlBlock 
) [private]

pack FDL blocks for various bunch crosses

Definition at line 634 of file L1GTEvmDigiToRaw.cc.

References lat::endl(), L1GtFdlWord::getSize(), LogDebug, LogTrace, m_isDebugEnabled, m_verbosity, L1GtFdlWord::setBoardIdWord64(), L1GtFdlWord::setBxInEventWord64(), L1GtFdlWord::setBxNrWord64(), L1GtFdlWord::setEventNrWord64(), L1GtFdlWord::setFinalORWord64(), L1GtFdlWord::setGtDecisionWordAWord64(), L1GtFdlWord::setGtDecisionWordBWord64(), L1GtFdlWord::setGtDecisionWordExtendedWord64(), L1GtFdlWord::setGtPrescaleFactorIndexAlgoWord64(), L1GtFdlWord::setGtPrescaleFactorIndexTechWord64(), L1GtFdlWord::setGtTechnicalTriggerWordWord64(), L1GtFdlWord::setLocalBxNrWord64(), L1GtFdlWord::setLumiSegmentNrWord64(), L1GtFdlWord::setNoAlgoWord64(), L1GtFdlWord::setOrbitNrWord64(), L1GtFdlWord::setPhysicsDeclaredWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.

Referenced by produce().

00638 {
00639 
00640     if (m_verbosity && m_isDebugEnabled) {
00641         LogDebug("L1GTEvmDigiToRaw") << "\nPacking FDL \n" << std::endl;
00642     }
00643 
00644     int uLength = L1GlobalTriggerReadoutSetup::UnitLength;
00645 
00646     // initialize the required number of word64
00647     int nrWord64 = fdlBlock.getSize()/uLength;
00648     std::vector<boost::uint64_t> tmpWord64;
00649     tmpWord64.resize(nrWord64);
00650 
00651     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00652         tmpWord64[iWord] = 0x0000000000000000ULL;
00653     }
00654 
00655     // fill the values in the words
00656     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00657 
00658         fdlBlock.setBoardIdWord64(tmpWord64[iWord], iWord);
00659         fdlBlock.setBxInEventWord64(tmpWord64[iWord], iWord);
00660         fdlBlock.setBxNrWord64(tmpWord64[iWord], iWord);
00661         fdlBlock.setEventNrWord64(tmpWord64[iWord], iWord);
00662 
00663         fdlBlock.setGtTechnicalTriggerWordWord64(tmpWord64[iWord], iWord);
00664 
00665         fdlBlock.setGtDecisionWordAWord64(tmpWord64[iWord], iWord);
00666         fdlBlock.setGtDecisionWordBWord64(tmpWord64[iWord], iWord);
00667 
00668         fdlBlock.setGtDecisionWordExtendedWord64(tmpWord64[iWord], iWord);
00669 
00670         fdlBlock.setPhysicsDeclaredWord64(tmpWord64[iWord], iWord);
00671         fdlBlock.setGtPrescaleFactorIndexTechWord64(tmpWord64[iWord], iWord);
00672         fdlBlock.setGtPrescaleFactorIndexAlgoWord64(tmpWord64[iWord], iWord);
00673         fdlBlock.setNoAlgoWord64(tmpWord64[iWord], iWord);
00674         fdlBlock.setFinalORWord64(tmpWord64[iWord], iWord);
00675 
00676         fdlBlock.setOrbitNrWord64(tmpWord64[iWord], iWord);
00677         fdlBlock.setLumiSegmentNrWord64(tmpWord64[iWord], iWord);
00678         fdlBlock.setLocalBxNrWord64(tmpWord64[iWord], iWord);
00679 
00680     }
00681 
00682     // put the words in the FED record
00683 
00684     boost::uint64_t* pw =
00685         reinterpret_cast<boost::uint64_t*>(const_cast<unsigned char*>(ptrGt));
00686 
00687     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00688 
00689         *pw++ = tmpWord64[iWord];
00690 
00691         if (m_verbosity && m_isDebugEnabled) {
00692             LogTrace("L1GTEvmDigiToRaw")
00693             << std::setw(4) << iWord << "  "
00694             << std::hex << std::setfill('0')
00695             << std::setw(16) << tmpWord64[iWord]
00696             << std::dec << std::setfill(' ')
00697             << std::endl;
00698         }
00699     }
00700 
00701 }

void L1GTEvmDigiToRaw::packGTFE ( const edm::EventSetup evSetup,
unsigned char *  ptrGt,
L1GtfeExtWord gtfeBlock,
boost::uint16_t  activeBoardsGtValue 
) [private]

pack the GTFE block gives the number of bunch crosses in the event, as well as the active boards records for inactive boards are not written in the GT EVM record

Definition at line 507 of file L1GTEvmDigiToRaw.cc.

References lat::endl(), L1GtfeExtWord::getSize(), LogDebug, LogTrace, m_bstLengthBytes, m_isDebugEnabled, m_verbosity, L1GtfeWord::setActiveBoardsWord64(), L1GtfeWord::setAltNrBxBoardWord64(), L1GtfeWord::setBoardIdWord64(), L1GtfeExtWord::setBstWord64(), L1GtfeWord::setBxNrWord64(), L1GtfeWord::setRecordLength1Word64(), L1GtfeWord::setRecordLengthWord64(), L1GtfeWord::setSetupVersionWord64(), L1GtfeWord::setTotalTriggerNrWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.

Referenced by produce().

00512 {
00513 
00514     if (m_verbosity && m_isDebugEnabled) {
00515         LogDebug("L1GTEvmDigiToRaw") << "\nPacking GTFE \n" << std::endl;
00516     }
00517 
00518     int uLength = L1GlobalTriggerReadoutSetup::UnitLength;
00519 
00520     // initialize the required number of word64
00521     int nrWord64 = gtfeBlock.getSize()/uLength;
00522     std::vector<boost::uint64_t> tmpWord64;
00523     tmpWord64.resize(nrWord64);
00524 
00525     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00526         tmpWord64[iWord] = 0x0000000000000000ULL;
00527     }
00528 
00529     // fill the values in the words
00530     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00531 
00532         gtfeBlock.setBoardIdWord64(tmpWord64[iWord], iWord);
00533         gtfeBlock.setRecordLength1Word64(tmpWord64[iWord], iWord);
00534         gtfeBlock.setRecordLengthWord64(tmpWord64[iWord], iWord);
00535         gtfeBlock.setBxNrWord64(tmpWord64[iWord], iWord);
00536         gtfeBlock.setSetupVersionWord64(tmpWord64[iWord], iWord);
00537         gtfeBlock.setActiveBoardsWord64(tmpWord64[iWord], iWord, activeBoardsGtValue);
00538         gtfeBlock.setAltNrBxBoardWord64(tmpWord64[iWord], iWord);
00539         gtfeBlock.setTotalTriggerNrWord64(tmpWord64[iWord], iWord);
00540 
00541         for (int iBst = 0; iBst < m_bstLengthBytes; ++iBst) {
00542             gtfeBlock.setBstWord64(tmpWord64[iWord], iBst, iWord);
00543         }
00544 
00545     }
00546 
00547     // put the words in the FED record
00548 
00549     boost::uint64_t* pw =
00550         reinterpret_cast<boost::uint64_t*>(const_cast<unsigned char*>(ptrGt));
00551 
00552     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00553 
00554         *pw++ = tmpWord64[iWord];
00555 
00556         if (m_verbosity && m_isDebugEnabled) {
00557             LogTrace("L1GTEvmDigiToRaw")
00558                     << std::setw(4) << iWord << "  "
00559                     << std::hex << std::setfill('0')
00560                     << std::setw(16) << tmpWord64[iWord]
00561                     << std::dec << std::setfill(' ')
00562                     << std::endl;
00563         }
00564     }
00565 
00566 
00567 }

void L1GTEvmDigiToRaw::packHeader ( unsigned char *  ptrGt,
edm::Event iEvent 
) [private]

block packers -------------

pack header

Definition at line 456 of file L1GTEvmDigiToRaw.cc.

References edm::Event::bunchCrossing(), lat::endl(), edm::Event::id(), LogDebug, m_evmGtFedId, m_isDebugEnabled, m_verbosity, and FEDHeader::set().

Referenced by produce().

00457 {
00458     // TODO FIXME where from to get all numbers?
00459 
00460     // Event Trigger type identifier
00461     int triggerTypeVal = 0;
00462 
00463     // Level-1 event number generated by the TTC system
00464     int lvl1IdVal = iEvent.id().event();
00465 
00466     // The bunch crossing number
00467     int bxCross = iEvent.bunchCrossing();
00468     boost::uint16_t bxCrossHw = 0;
00469     if ((bxCross & 0xFFF) == bxCross) {
00470         bxCrossHw = static_cast<boost::uint16_t> (bxCross);
00471     }
00472     else {
00473         bxCrossHw = 0; // Bx number too large, set to 0!
00474         if (m_verbosity && m_isDebugEnabled) {
00475             LogDebug("L1GTEvmDigiToRaw")
00476                     << "\nBunch cross number [hex] = "
00477                     << std::hex << bxCross
00478                     << "\n  larger than 12 bits. Set to 0! \n"
00479                     << std::dec
00480                     << std::endl;
00481         }
00482     }
00483     int bxIdVal = bxCrossHw;
00484 
00485     // Identifier of the FED
00486     int sourceIdVal = m_evmGtFedId;
00487 
00488     // Version identifier of the FED data format
00489     int versionVal = 0;
00490 
00491     // 0 -> the current header word is the last one.
00492     // 1-> other header words can follow
00493     // (always 1 for ECAL)
00494     bool moreHeadersVal = false;
00495 
00496 
00497     FEDHeader gtFEDHeader(ptrGt);
00498 
00499     gtFEDHeader.set(ptrGt,
00500                     triggerTypeVal, lvl1IdVal, bxIdVal, sourceIdVal, versionVal,
00501                     moreHeadersVal);
00502 
00503 
00504 }

void L1GTEvmDigiToRaw::packTCS ( const edm::EventSetup evSetup,
unsigned char *  ptrGt,
L1TcsWord tcsBlock 
) [private]

pack the TCS block

Definition at line 570 of file L1GTEvmDigiToRaw.cc.

References lat::endl(), L1TcsWord::getSize(), LogDebug, LogTrace, m_isDebugEnabled, m_verbosity, L1TcsWord::setAssignedPartitionsWord64(), L1TcsWord::setBoardIdWord64(), L1TcsWord::setBxNrWord64(), L1TcsWord::setDaqNrWord64(), L1TcsWord::setEventNrWord64(), L1TcsWord::setLuminositySegmentNrWord64(), L1TcsWord::setOrbitNrWord64(), L1TcsWord::setPartRunNrWord64(), L1TcsWord::setPartTrigNrWord64(), L1TcsWord::setStatusWord64(), L1TcsWord::setTriggerTypeWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.

Referenced by produce().

00574 {
00575 
00576     if (m_verbosity && m_isDebugEnabled) {
00577         LogDebug("L1GTEvmDigiToRaw") << "\nPacking TCS \n" << std::endl;
00578     }
00579 
00580     int uLength = L1GlobalTriggerReadoutSetup::UnitLength;
00581 
00582     // initialize the required number of word64
00583     int nrWord64 = tcsBlock.getSize()/uLength;
00584     std::vector<boost::uint64_t> tmpWord64;
00585     tmpWord64.resize(nrWord64);
00586 
00587     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00588         tmpWord64[iWord] = 0x0000000000000000ULL;
00589     }
00590 
00591     // fill the values in the words
00592     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00593 
00594         tcsBlock.setBoardIdWord64(tmpWord64[iWord], iWord);
00595         tcsBlock.setBxNrWord64(tmpWord64[iWord], iWord);
00596         tcsBlock.setDaqNrWord64(tmpWord64[iWord], iWord);
00597         tcsBlock.setTriggerTypeWord64(tmpWord64[iWord], iWord);
00598         tcsBlock.setStatusWord64(tmpWord64[iWord], iWord);
00599         tcsBlock.setLuminositySegmentNrWord64(tmpWord64[iWord], iWord);
00600 
00601         tcsBlock.setPartRunNrWord64(tmpWord64[iWord], iWord);
00602         tcsBlock.setAssignedPartitionsWord64(tmpWord64[iWord], iWord);
00603 
00604         tcsBlock.setPartTrigNrWord64(tmpWord64[iWord], iWord);
00605         tcsBlock.setEventNrWord64(tmpWord64[iWord], iWord);
00606 
00607         tcsBlock.setOrbitNrWord64(tmpWord64[iWord], iWord);
00608 
00609     }
00610 
00611     // put the words in the FED record
00612 
00613     boost::uint64_t* pw =
00614         reinterpret_cast<boost::uint64_t*>(const_cast<unsigned char*>(ptrGt));
00615 
00616     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00617 
00618         *pw++ = tmpWord64[iWord];
00619 
00620         if (m_verbosity && m_isDebugEnabled) {
00621             LogTrace("L1GTEvmDigiToRaw")
00622                     << std::setw(4) << iWord << "  "
00623                     << std::hex << std::setfill('0')
00624                     << std::setw(16) << tmpWord64[iWord]
00625                     << std::dec << std::setfill(' ')
00626                     << std::endl;
00627         }
00628     }
00629 
00630 
00631 }

void L1GTEvmDigiToRaw::packTrailer ( unsigned char *  ptrGt,
unsigned char *  ptrGtBegin,
int  dataSize 
) [private]

pack trailer word

Definition at line 705 of file L1GTEvmDigiToRaw.cc.

References evf::compute_crc(), and FEDTrailer::set().

Referenced by produce().

00707 {
00708 
00709     // TODO FIXME where from to get all numbers?
00710 
00711     // The length of the event fragment counted in 64-bit words including header and trailer
00712     int lengthVal = dataSize/8;
00713 
00714     // Cyclic Redundancy Code of the event fragment including header and trailer
00715     int crcVal = evf::compute_crc(ptrGtBegin, dataSize);
00716 
00717     // Event fragment status information
00718     int evtStatusVal = 0;
00719 
00720     // Current value of the Trigger Throttling System bits.
00721     int ttsBitsVal = 0;
00722 
00723     // 0 -> the current trailer word is the last one.
00724     // 1-> other trailer words can follow
00725     // (always 0 for ECAL)
00726     bool moreTrailersVal = false;
00727 
00728     FEDTrailer gtFEDTrailer(ptrGt);
00729     gtFEDTrailer.set(ptrGt,
00730                      lengthVal, crcVal, evtStatusVal, ttsBitsVal,
00731                      moreTrailersVal);
00732 
00733 }

void L1GTEvmDigiToRaw::produce ( edm::Event iEvent,
const edm::EventSetup evSetup 
) [private, virtual]

loop over events

Implements edm::EDProducer.

Definition at line 103 of file L1GTEvmDigiToRaw.cc.

References L1GtfeWord::activeBoards(), L1GtfeWord::altNrBxBoard(), L1GtfeExtWord::bstLengthBytes(), FEDRawData::data(), lat::endl(), FDL, edm::EventSetup::get(), edm::Event::getByLabel(), L1TcsWord::getSize(), L1GtfeExtWord::getSize(), L1GtFdlWord::getSize(), GTFE, edm::Handle< T >::isValid(), LogDebug, LogTrace, m_activeBoardsMaskGt, m_bstLengthBytes, m_evmGtFedId, m_evmGtInputTag, m_isDebugEnabled, m_maxBxInEvent, m_minBxInEvent, m_totalBxInEvent, m_verbosity, packFDL(), packGTFE(), packHeader(), packTCS(), packTrailer(), L1GtfeExtWord::print(), L1TcsWord::print(), L1GtFdlWord::print(), edm::Event::put(), L1GtfeWord::recordLength(), L1GtfeWord::recordLength1(), FEDRawData::resize(), FEDRawData::size(), TCS, and TIM.

00104 {
00105 
00106     // define new FEDRawDataCollection
00107     // it contains ALL FEDs in an event
00108     std::auto_ptr<FEDRawDataCollection> allFedRawData(new FEDRawDataCollection);
00109 
00110     FEDRawData& gtRawData = allFedRawData->FEDData(m_evmGtFedId);
00111 
00112     // get records from EventSetup
00113 
00114     //  board maps
00115     edm::ESHandle< L1GtBoardMaps > l1GtBM;
00116     evSetup.get< L1GtBoardMapsRcd >().get( l1GtBM );
00117 
00118     const std::vector<L1GtBoard> boardMaps = l1GtBM->gtBoardMaps();
00119     int boardMapsSize = boardMaps.size();
00120 
00121     typedef std::vector<L1GtBoard>::const_iterator CItBoardMaps;
00122 
00123     // create an ordered vector for the GT EVM record
00124     // header (pos 0 in record) and trailer (last position in record)
00125     // not included, as they are not in board list
00126     std::vector<L1GtBoard> gtRecordMap;
00127     gtRecordMap.reserve(boardMapsSize);
00128 
00129     for (int iPos = 0; iPos < boardMapsSize; ++iPos) {
00130         for (CItBoardMaps itBoard = boardMaps.begin(); itBoard
00131                 != boardMaps.end(); ++itBoard) {
00132 
00133             if (itBoard->gtPositionEvmRecord() == iPos) {
00134                 gtRecordMap.push_back(*itBoard);
00135                 break;
00136             }
00137 
00138         }
00139     }
00140 
00141 
00142 
00143     // get L1GlobalTriggerEvmReadoutRecord
00144     edm::Handle<L1GlobalTriggerEvmReadoutRecord> gtReadoutRecord;
00145     iEvent.getByLabel(m_evmGtInputTag, gtReadoutRecord);
00146 
00147     if (!gtReadoutRecord.isValid()) {
00148         edm::LogWarning("L1GTEvmDigiToRaw")
00149                 << "\nWarning: L1GlobalTriggerEvmReadoutRecord with input tag " << m_evmGtInputTag
00150                 << "\nrequested in configuration, but not found in the event."
00151                 << "\nQuit packing this event" << std::endl;
00152 
00153         // put the raw data in the event
00154         iEvent.put(allFedRawData);
00155 
00156         return;
00157     }
00158 
00159     if (m_verbosity && m_isDebugEnabled) {
00160         std::ostringstream myCoutStream;
00161         gtReadoutRecord->print(myCoutStream);
00162         LogTrace("L1GTEvmDigiToRaw")
00163                 << "\n The following L1 GT EVM readout record will be packed.\n"
00164                 << " Some boards could be disabled before packing,"
00165                 << " see detailed board packing.\n"
00166                 << myCoutStream.str() << "\n"
00167                 << std::endl;
00168     }
00169 
00170     // get GTFE block
00171     L1GtfeExtWord gtfeBlock = gtReadoutRecord->gtfeWord();
00172 
00173     // get the number of Bx in the event for alternative 0 and alternative 1
00174     boost::uint16_t recordLength0 = gtfeBlock.recordLength();
00175     boost::uint16_t recordLength1 = gtfeBlock.recordLength1();
00176 
00177     // length of BST record (in bytes)
00178     m_bstLengthBytes= static_cast<int> (gtfeBlock.bstLengthBytes());
00179 
00180     // get list of active blocks from the GTFE block
00181     // and mask some blocks, if required
00182     // blocks not active are not written to the record
00183 
00184     boost::uint16_t activeBoardsGtInitial = gtfeBlock.activeBoards();
00185     boost::uint16_t altNrBxBoardInitial = gtfeBlock.altNrBxBoard();
00186 
00187     // mask some boards, if needed
00188 
00189     boost::uint16_t activeBoardsGt = activeBoardsGtInitial & m_activeBoardsMaskGt;
00190 
00191     if (m_verbosity && m_isDebugEnabled) {
00192         LogDebug("L1GTEvmDigiToRaw")
00193                 << "\nActive boards before masking(hex format): " << std::hex
00194                 << std::setw(sizeof ( activeBoardsGtInitial ) * 2) << std::setfill('0')
00195                 << activeBoardsGtInitial << std::dec << std::setfill(' ')
00196                 << "\nActive boards after masking(hex format):  " << std::hex
00197                 << std::setw(sizeof ( activeBoardsGt ) * 2) << std::setfill('0')
00198                 << activeBoardsGt << std::dec
00199                 << std::setfill(' ') << " \n"
00200                 << std::endl;
00201     }
00202 
00203     // get the size of the record
00204 
00205     unsigned int gtDataSize = 0;
00206 
00207     unsigned int headerSize = 8;
00208     gtDataSize += headerSize;
00209 
00210     for (CItBoardMaps
00211             itBoard = boardMaps.begin();
00212             itBoard != boardMaps.end(); ++itBoard) {
00213 
00214         if (itBoard->gtBoardType() == GTFE) {
00215             gtDataSize += gtfeBlock.getSize();
00216             continue;
00217         }
00218 
00219 
00220         int iActiveBit = itBoard->gtBitEvmActiveBoards();
00221         bool activeBoardToPack = false;
00222 
00223         int altNrBxBoardVal = -1;
00224 
00225         if (iActiveBit >= 0) {
00226             activeBoardToPack = activeBoardsGt & (1 << iActiveBit);
00227 
00228             altNrBxBoardVal = (altNrBxBoardInitial & ( 1 << iActiveBit )) >> iActiveBit;
00229 
00230             if (altNrBxBoardVal == 1) {
00231                 m_totalBxInEvent = recordLength1;
00232             } else if (altNrBxBoardVal == 0) {
00233                 m_totalBxInEvent = recordLength0;
00234             } else {
00235                 if (m_verbosity) {
00236                     edm::LogWarning("L1GTEvmDigiToRaw")
00237                     << "\n\nWARNING: Wrong value altNrBxBoardVal = " << altNrBxBoardVal
00238                     << " for board " << std::hex << ( itBoard->gtBoardId() ) << std::dec
00239                     << "\n  iActiveBit =            " << iActiveBit
00240                     << "\n  altNrBxBoardInitial = 0x" << std::hex << altNrBxBoardInitial <<  std::dec
00241                     << "\n  activeBoardsGt =      0x" << std::hex << activeBoardsGt <<  std::dec
00242                     << "\n  activeBoardToPack =   " << activeBoardToPack
00243                     << "\n Set altNrBxBoardVal tentatively to "
00244                     << recordLength0 << "\n Job may crash or produce wrong results!\n\n"
00245                     << std::endl;
00246                 }
00247 
00248                 m_totalBxInEvent = recordLength0;
00249             }
00250         } else {
00251             // board not in the ActiveBoards for the record
00252             continue;
00253         }
00254 
00255         if (activeBoardToPack) {
00256 
00257             switch (itBoard->gtBoardType()) {
00258                 case GTFE: {
00259                         // size already added;
00260                     }
00261 
00262                     break;
00263                 case FDL: {
00264                         L1GtFdlWord fdlBlock;
00265                         gtDataSize += m_totalBxInEvent*fdlBlock.getSize();
00266                     }
00267 
00268                     break;
00269                 case TCS: {
00270                         L1TcsWord tcsBlock;
00271                         gtDataSize += tcsBlock.getSize();
00272                     }
00273 
00274                     break;
00275                 case TIM: {
00276                         // not considered
00277                     }
00278 
00279                     break;
00280                 default: {
00281                         // do nothing, all blocks are given in GtBoardType enum
00282                     }
00283 
00284                     break;
00285             }
00286         }
00287 
00288     }
00289 
00290 
00291     unsigned int trailerSize = 8;
00292     gtDataSize += trailerSize;
00293 
00294     // resize, GT raw data record has variable length,
00295     // depending on active boards (read in GTFE)
00296     gtRawData.resize(gtDataSize);
00297 
00298     // ptrGt: pointer to the beginning of GT record in the raw data
00299 
00300     unsigned char* ptrGt = gtRawData.data();
00301     unsigned char* ptrGtBegin = gtRawData.data();
00302 
00303     if (m_verbosity && m_isDebugEnabled) {
00304         LogDebug("L1GTEvmDigiToRaw") << "\n Size of raw data: " << gtRawData.size() << "\n"
00305                 << std::endl;
00306     }
00307 
00308     // ------- pack boards -------
00309 
00310     // pack header
00311     packHeader(ptrGt, iEvent);
00312     ptrGt += headerSize; // advance with header size
00313 
00314     // loop over other blocks in the raw record, if they are active
00315 
00316     for (CItBoardMaps
00317             itBoard = gtRecordMap.begin();
00318             itBoard != gtRecordMap.end(); ++itBoard) {
00319 
00320         if (itBoard->gtBoardType() == GTFE) {
00321 
00322             packGTFE(evSetup, ptrGt, gtfeBlock, activeBoardsGt);
00323 
00324             if (m_verbosity && m_isDebugEnabled) {
00325 
00326                 std::ostringstream myCoutStream;
00327                 gtfeBlock.print(myCoutStream);
00328                 LogTrace("L1GTEvmDigiToRaw")
00329                         << myCoutStream.str() << "\n"
00330                         << std::endl;
00331             }
00332 
00333             ptrGt += gtfeBlock.getSize(); // advance with GTFE block size
00334 
00335             continue;
00336         }
00337 
00338 
00339         // pack modules other than GTFE if they are active
00340 
00341         int iActiveBit = itBoard->gtBitEvmActiveBoards();
00342         bool activeBoardToPack = false;
00343 
00344         int altNrBxBoardVal = -1;
00345 
00346         if (iActiveBit >= 0) {
00347             activeBoardToPack = activeBoardsGt & (1 << iActiveBit);
00348 
00349             altNrBxBoardVal = (altNrBxBoardInitial & ( 1 << iActiveBit )) >> iActiveBit;
00350 
00351             if (altNrBxBoardVal == 1) {
00352                 m_totalBxInEvent = recordLength1;
00353             } else if (altNrBxBoardVal == 0) {
00354                 m_totalBxInEvent = recordLength0;
00355             } else {
00356                 if (m_verbosity) {
00357                     edm::LogWarning("L1GTEvmDigiToRaw")
00358                     << "\n\nWARNING: Wrong value altNrBxBoardVal = " << altNrBxBoardVal
00359                     << " for board " << std::hex << ( itBoard->gtBoardId() ) << std::dec
00360                     << "\n  iActiveBit =            " << iActiveBit
00361                     << "\n  altNrBxBoardInitial = 0x" << std::hex << altNrBxBoardInitial <<  std::dec
00362                     << "\n  activeBoardsGt =      0x" << std::hex << activeBoardsGt <<  std::dec
00363                     << "\n  activeBoardToPack =   " << activeBoardToPack
00364                     << "\n Set altNrBxBoardVal tentatively to "
00365                     << recordLength0 << "\n Job may crash or produce wrong results!\n\n"
00366                     << std::endl;
00367                 }
00368 
00369                 m_totalBxInEvent = recordLength0;
00370             }
00371 
00372             m_minBxInEvent = (m_totalBxInEvent + 1)/2 - m_totalBxInEvent;
00373             m_maxBxInEvent = (m_totalBxInEvent + 1)/2 - 1;
00374 
00375         } else {
00376             // board not in the ActiveBoards for the record
00377             continue;
00378         }
00379 
00380         if (activeBoardToPack) {
00381 
00382             if (m_verbosity && m_isDebugEnabled) {
00383                 LogDebug("L1GTEvmDigiToRaw")
00384                         << "\nBoard " << std::hex << "0x" << ( itBoard->gtBoardId() ) << std::dec
00385                         << "\n  Number of bunch crosses in the record: " << m_totalBxInEvent
00386                         << " = " << "[" << m_minBxInEvent << ", " << m_maxBxInEvent
00387                         << "] BX\n"
00388                         << std::endl;
00389             }
00390 
00391             // active board, pack it
00392             switch (itBoard->gtBoardType()) {
00393 
00394                 case TCS: {
00395 
00396                         L1TcsWord tcsBlock = gtReadoutRecord->tcsWord();
00397                         packTCS(evSetup, ptrGt, tcsBlock);
00398 
00399                         if (m_verbosity && m_isDebugEnabled) {
00400 
00401                             std::ostringstream myCoutStream;
00402                             tcsBlock.print(myCoutStream);
00403                             LogTrace("L1GTEvmDigiToRaw")
00404                                     << myCoutStream.str() << "\n"
00405                                     << std::endl;
00406                         }
00407 
00408                         ptrGt += tcsBlock.getSize(); // advance with TCS block size
00409 
00410                     }
00411                     break;
00412                 case FDL: {
00413 
00414                         for (int iBxInEvent = m_minBxInEvent; iBxInEvent <= m_maxBxInEvent;
00415                                 ++iBxInEvent) {
00416 
00417                             L1GtFdlWord fdlBlock = gtReadoutRecord->gtFdlWord(iBxInEvent);
00418                             packFDL(evSetup, ptrGt, fdlBlock);
00419 
00420                             if (m_verbosity && m_isDebugEnabled) {
00421 
00422                                 std::ostringstream myCoutStream;
00423                                 fdlBlock.print(myCoutStream);
00424                                 LogTrace("L1GTEvmDigiToRaw")
00425                                         << myCoutStream.str() << "\n"
00426                                         << std::endl;
00427                             }
00428 
00429                             ptrGt += fdlBlock.getSize(); // advance with FDL block size
00430                         }
00431 
00432                     }
00433                     break;
00434                 default: {
00435 
00436                         // do nothing, all blocks are given in GtBoardType enum
00437                         break;
00438                     }
00439             }
00440 
00441         }
00442     }
00443 
00444     // pack trailer
00445     packTrailer(ptrGt, ptrGtBegin, gtDataSize);
00446 
00447     // put the raw data in the event
00448 
00449     iEvent.put(allFedRawData);
00450 
00451 
00452 }


Member Data Documentation

boost::uint16_t L1GTEvmDigiToRaw::m_activeBoardsMaskGt [private]

mask for active boards

Definition at line 97 of file L1GTEvmDigiToRaw.h.

Referenced by L1GTEvmDigiToRaw(), and produce().

int L1GTEvmDigiToRaw::m_bstLengthBytes [private]

length of BST record (in bytes)

Definition at line 111 of file L1GTEvmDigiToRaw.h.

Referenced by packGTFE(), and produce().

int L1GTEvmDigiToRaw::m_evmGtFedId [private]

FED Id for GT EVM record default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc.

Definition at line 91 of file L1GTEvmDigiToRaw.h.

Referenced by L1GTEvmDigiToRaw(), packHeader(), and produce().

edm::InputTag L1GTEvmDigiToRaw::m_evmGtInputTag [private]

input tag for GT EVM record

Definition at line 94 of file L1GTEvmDigiToRaw.h.

Referenced by L1GTEvmDigiToRaw(), and produce().

bool L1GTEvmDigiToRaw::m_isDebugEnabled [private]

Definition at line 117 of file L1GTEvmDigiToRaw.h.

Referenced by packFDL(), packGTFE(), packHeader(), packTCS(), and produce().

int L1GTEvmDigiToRaw::m_maxBxInEvent [private]

max Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept

Definition at line 108 of file L1GTEvmDigiToRaw.h.

Referenced by produce().

int L1GTEvmDigiToRaw::m_minBxInEvent [private]

min Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept

Definition at line 104 of file L1GTEvmDigiToRaw.h.

Referenced by produce().

int L1GTEvmDigiToRaw::m_totalBxInEvent [private]

total Bx's in the event, obtained from GTFE block

Definition at line 100 of file L1GTEvmDigiToRaw.h.

Referenced by produce().

int L1GTEvmDigiToRaw::m_verbosity [private]

verbosity level

Definition at line 116 of file L1GTEvmDigiToRaw.h.

Referenced by packFDL(), packGTFE(), packHeader(), packTCS(), and produce().


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